[tryton-debian-vcs] tryton-modules-sale branch debian created. e0f881c7273018f655f561e9c28857448768af32

Mathias Behrle tryton-debian-vcs at alioth.debian.org
Wed Nov 27 17:08:40 UTC 2013


The following commit has been merged in the debian branch:
https://alioth.debian.org/plugins/scmgit/cgi-bin/gitweb.cgi/?p=tryton/tryton-modules-sale.git;a=commitdiff;h=e0f881c7273018f655f561e9c28857448768af32
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>
commit cfac5fe7c2818a6810488aff9cd8bdf64e4f05b0
Author: Mathias Behrle <mathiasb at m9s.biz>
Date:   Sun Oct 13 21:58:17 2013 +0200

    Releasing debian version 2.8.2-1.

diff --git a/debian/changelog b/debian/changelog
index 07e8442..1f469ca 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -1,3 +1,9 @@
+tryton-modules-sale (2.8.2-1) unstable; urgency=low
+
+  * Merging upstream version 2.8.2.
+
+ -- Mathias Behrle <mathiasb at m9s.biz>  Sun, 13 Oct 2013 20:21:22 +0200
+
 tryton-modules-sale (2.8.1-1) unstable; urgency=low
 
   * Adapting the rules file to work also with git-buildpackage.
commit 26112bc5a43f4b65a7a4318c18f9b8bca96cc524
Author: Mathias Behrle <mathiasb at m9s.biz>
Date:   Sun Oct 13 20:20:51 2013 +0200

    Merging upstream version 2.8.2.

diff --git a/CHANGELOG b/CHANGELOG
index 81a7433..7a91add 100644
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -1,3 +1,6 @@
+Version 2.8.2 - 2013-10-01
+* Bug fixes (see mercurial logs for details)
+
 Version 2.8.1 - 2013-07-22
 * Bug fixes (see mercurial logs for details)
 
diff --git a/PKG-INFO b/PKG-INFO
index b25efdc..dafd736 100644
--- a/PKG-INFO
+++ b/PKG-INFO
@@ -1,6 +1,6 @@
 Metadata-Version: 1.1
 Name: trytond_sale
-Version: 2.8.1
+Version: 2.8.2
 Summary: Tryton module for sale
 Home-page: http://www.tryton.org/
 Author: Tryton
diff --git a/sale.py b/sale.py
index 9a4c4d4..2ced8d9 100644
--- a/sale.py
+++ b/sale.py
@@ -1207,8 +1207,10 @@ class SaleLine(ModelSQL, ModelView):
         invoice_line.type = self.type
         invoice_line.description = self.description
         invoice_line.note = self.note
+        invoice_line.origin = self
         if self.type != 'line':
             if (self.sale.invoice_method == 'order'
+                    and not self.invoice_lines
                     and ((all(l.quantity >= 0 for l in self.sale.lines
                                 if l.type == 'line')
                             and invoice_type == 'out_invoice')
@@ -1265,7 +1267,6 @@ class SaleLine(ModelSQL, ModelView):
                 self.raise_user_error('missing_account_revenue_property', {
                         'sale': self.sale.rec_name,
                         })
-        invoice_line.origin = self
         return [invoice_line]
 
     @classmethod
diff --git a/tryton.cfg b/tryton.cfg
index 5d774c2..d35c499 100644
--- a/tryton.cfg
+++ b/tryton.cfg
@@ -1,5 +1,5 @@
 [tryton]
-version=2.8.1
+version=2.8.2
 depends:
     account
     account_invoice
diff --git a/trytond_sale.egg-info/PKG-INFO b/trytond_sale.egg-info/PKG-INFO
index 848f948..a5ed6e8 100644
--- a/trytond_sale.egg-info/PKG-INFO
+++ b/trytond_sale.egg-info/PKG-INFO
@@ -1,6 +1,6 @@
 Metadata-Version: 1.1
 Name: trytond-sale
-Version: 2.8.1
+Version: 2.8.2
 Summary: Tryton module for sale
 Home-page: http://www.tryton.org/
 Author: Tryton
commit 9178a2ef5f33309b7d654a35c1c5f66c1cf86320
Author: Mathias Behrle <mathiasb at m9s.biz>
Date:   Tue Aug 6 16:18:57 2013 +0200

    Releasing debian version 2.8.1-1.

diff --git a/debian/changelog b/debian/changelog
index efcde7b..07e8442 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -1,3 +1,10 @@
+tryton-modules-sale (2.8.1-1) unstable; urgency=low
+
+  * Adapting the rules file to work also with git-buildpackage.
+  * Merging upstream version 2.8.1.
+
+ -- Mathias Behrle <mathiasb at m9s.biz>  Mon, 05 Aug 2013 21:26:02 +0200
+
 tryton-modules-sale (2.8.0-2) unstable; urgency=low
 
   * Adding doc/ to docs file.
commit 32c4a1a9da5079ca3f09874c65dbf2094a41efcf
Author: Mathias Behrle <mathiasb at m9s.biz>
Date:   Mon Aug 5 18:47:28 2013 +0200

    Merging upstream version 2.8.1.

diff --git a/CHANGELOG b/CHANGELOG
index 99a8f14..81a7433 100644
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -1,3 +1,6 @@
+Version 2.8.1 - 2013-07-22
+* Bug fixes (see mercurial logs for details)
+
 Version 2.8.0 - 2013-04-22
 * Bug fixes (see mercurial logs for details)
 * Use origin Reference on Invoice Line and Stock Move
diff --git a/PKG-INFO b/PKG-INFO
index bc4917b..b25efdc 100644
--- a/PKG-INFO
+++ b/PKG-INFO
@@ -1,6 +1,6 @@
 Metadata-Version: 1.1
 Name: trytond_sale
-Version: 2.8.0
+Version: 2.8.1
 Summary: Tryton module for sale
 Home-page: http://www.tryton.org/
 Author: Tryton
diff --git a/sale.py b/sale.py
index 45902e9..9a4c4d4 100644
--- a/sale.py
+++ b/sale.py
@@ -1262,8 +1262,9 @@ class SaleLine(ModelSQL, ModelView):
                 if invoice_line.account:
                     break
             if not invoice_line.account:
-                self.raise_user_error('missing_account_revenue_property',
-                    (self.sale.rec_name,))
+                self.raise_user_error('missing_account_revenue_property', {
+                        'sale': self.sale.rec_name,
+                        })
         invoice_line.origin = self
         return [invoice_line]
 
diff --git a/tryton.cfg b/tryton.cfg
index 8d01b23..5d774c2 100644
--- a/tryton.cfg
+++ b/tryton.cfg
@@ -1,5 +1,5 @@
 [tryton]
-version=2.8.0
+version=2.8.1
 depends:
     account
     account_invoice
diff --git a/trytond_sale.egg-info/PKG-INFO b/trytond_sale.egg-info/PKG-INFO
index 0084037..848f948 100644
--- a/trytond_sale.egg-info/PKG-INFO
+++ b/trytond_sale.egg-info/PKG-INFO
@@ -1,6 +1,6 @@
 Metadata-Version: 1.1
 Name: trytond-sale
-Version: 2.8.0
+Version: 2.8.1
 Summary: Tryton module for sale
 Home-page: http://www.tryton.org/
 Author: Tryton
commit abdfc1dc45febee370031050e2dd71349817087f
Author: Mathias Behrle <mathiasb at m9s.biz>
Date:   Mon Aug 5 18:06:36 2013 +0200

    Adapting the rules file to work also with git-buildpackage.

diff --git a/debian/rules b/debian/rules
index a6a1fb8..30074ad 100755
--- a/debian/rules
+++ b/debian/rules
@@ -1,13 +1,24 @@
 #!/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
 
 override_dh_auto_clean:
 	dh_auto_clean
+
+override_dh_auto_build:
+	mv $(PACKAGE_NAME).egg-info $(PACKAGE_NAME).hen-info
+	mv PKG-INFO PKG-INFO.hen
+	dh_auto_build
+
+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
 
 override_dh_gencontrol:
 	dh_gencontrol -- -Vversion:major="$(MAJOR)"
commit 0509b938ff2c49baa8c163681899cbf5c0b29321
Author: Mathias Behrle <mathiasb at m9s.biz>
Date:   Fri May 31 19:57:34 2013 +0200

    Releasing debian version 2.8.0-2.

diff --git a/debian/changelog b/debian/changelog
index 46c8653..efcde7b 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -1,3 +1,11 @@
+tryton-modules-sale (2.8.0-2) unstable; urgency=low
+
+  * Adding doc/ to docs file.
+  * Simplifying package layout by renaming <pkg_name>.docs to docs.
+  * Removing needless empty line in rules.
+
+ -- Mathias Behrle <mathiasb at m9s.biz>  Fri, 31 May 2013 17:27:09 +0200
+
 tryton-modules-sale (2.8.0-1) experimental; urgency=low
 
   * Merging upstream version 2.8.0.
commit 2343cb777f77d12c4173e166f43251de5515aa87
Author: Mathias Behrle <mathiasb at m9s.biz>
Date:   Wed May 29 17:19:30 2013 +0200

    Removing needless empty line in rules.

diff --git a/debian/rules b/debian/rules
index 0f63ab4..a6a1fb8 100755
--- a/debian/rules
+++ b/debian/rules
@@ -7,7 +7,6 @@ MAJOR := $(shell python setup.py --version | awk -F "." '{print $$1 "." $$2}')
 
 override_dh_auto_clean:
 	dh_auto_clean
-
 	rm -rf *.egg-info
 
 override_dh_gencontrol:
commit c1ef0feaa52fb9140df8e69ad2e43c6186ee4b93
Author: Mathias Behrle <mathiasb at m9s.biz>
Date:   Wed May 29 17:01:48 2013 +0200

    Simplifying package layout by renaming <pkg_name>.docs to docs.
    
    Thanks to Andreas Tille for this proposal. Since tryton module packages
    will most probably stay simple binary packages this change simplifies the
    package layout.

diff --git a/debian/tryton-modules-sale.docs b/debian/docs
similarity index 100%
rename from debian/tryton-modules-sale.docs
rename to debian/docs
commit 4dbd88e87c48e78e44c572859becfbe3223fcdab
Author: Mathias Behrle <mathiasb at m9s.biz>
Date:   Tue May 14 18:54:41 2013 +0200

    Adding doc/ to docs file.

diff --git a/debian/tryton-modules-sale.docs b/debian/tryton-modules-sale.docs
index 1333ed7..3e30aa5 100644
--- a/debian/tryton-modules-sale.docs
+++ b/debian/tryton-modules-sale.docs
@@ -1 +1,2 @@
 TODO
+doc/
commit 829641de854e5aa4c3b6f3f3f53823c51f8def78
Author: Mathias Behrle <mathiasb at m9s.biz>
Date:   Thu May 2 17:27:11 2013 +0200

    Releasing debian version 2.8.0-1.

diff --git a/debian/changelog b/debian/changelog
index d2b5726..46c8653 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -1,3 +1,10 @@
+tryton-modules-sale (2.8.0-1) experimental; urgency=low
+
+  * Merging upstream version 2.8.0.
+  * Updating copyright.
+
+ -- Mathias Behrle <mathiasb at m9s.biz>  Thu, 02 May 2013 15:20:46 +0200
+
 tryton-modules-sale (2.6.1-3) experimental; urgency=low
 
   * Removing Daniel from Uploaders. Thanks for your work! (Closes: #704397).
commit d1c798015c53710304a2d692f7db90b15b8907e9
Author: Mathias Behrle <mathiasb at m9s.biz>
Date:   Thu May 2 14:13:11 2013 +0200

    Updating copyright.

diff --git a/debian/copyright b/debian/copyright
index 899bb6c..e096e63 100644
--- a/debian/copyright
+++ b/debian/copyright
@@ -1,9 +1,9 @@
 Format: http://www.debian.org/doc/packaging-manuals/copyright-format/1.0/
 
 Files: *
-Copyright: 2008-2012 Cédric Krier
-           2008-2012 Bertrand Chenal
-           2008-2012 B2CK SPRL
+Copyright: 2008-2013 Cédric Krier
+           2008-2013 Bertrand Chenal
+           2008-2013 B2CK SPRL
            2004-2008 Tiny SPRL
 License: GPL-3+
 
commit ecdcf7975a8123e8eae196591e875458a513cca4
Author: Mathias Behrle <mathiasb at m9s.biz>
Date:   Thu May 2 00:37:33 2013 +0200

    Merging upstream version 2.8.0.

diff --git a/CHANGELOG b/CHANGELOG
index 649851b..99a8f14 100644
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -1,5 +1,6 @@
-Version 2.6.1 - 2012-12-23
+Version 2.8.0 - 2013-04-22
 * Bug fixes (see mercurial logs for details)
+* Use origin Reference on Invoice Line and Stock Move
 
 Version 2.6.0 - 2012-10-22
 * Bug fixes (see mercurial logs for details)
diff --git a/COPYRIGHT b/COPYRIGHT
index ede3fac..5d422e0 100644
--- a/COPYRIGHT
+++ b/COPYRIGHT
@@ -1,6 +1,6 @@
-Copyright (C) 2008-2012 Cédric Krier.
-Copyright (C) 2008-2012 Bertrand Chenal.
-Copyright (C) 2008-2012 B2CK SPRL.
+Copyright (C) 2008-2013 Cédric Krier.
+Copyright (C) 2008-2013 Bertrand Chenal.
+Copyright (C) 2008-2013 B2CK SPRL.
 Copyright (C) 2004-2008 Tiny SPRL.
 
 This program is free software: you can redistribute it and/or modify
diff --git a/MANIFEST.in b/MANIFEST.in
index 478d5ff..fc0b03e 100644
--- a/MANIFEST.in
+++ b/MANIFEST.in
@@ -6,6 +6,7 @@ include CHANGELOG
 include LICENSE
 include tryton.cfg
 include *.xml
+include view/*.xml
 include *.odt
 include locale/*.po
 include doc/*
diff --git a/PKG-INFO b/PKG-INFO
index 7e060ee..bc4917b 100644
--- a/PKG-INFO
+++ b/PKG-INFO
@@ -1,12 +1,12 @@
 Metadata-Version: 1.1
 Name: trytond_sale
-Version: 2.6.1
+Version: 2.8.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.6/
+Download-URL: http://downloads.tryton.org/2.8/
 Description: trytond_sale
         ============
         
@@ -52,6 +52,7 @@ Classifier: Intended Audience :: Financial and Insurance Industry
 Classifier: Intended Audience :: Legal Industry
 Classifier: License :: OSI Approved :: GNU General Public License (GPL)
 Classifier: Natural Language :: Bulgarian
+Classifier: Natural Language :: Catalan
 Classifier: Natural Language :: Czech
 Classifier: Natural Language :: Dutch
 Classifier: Natural Language :: English
diff --git a/__init__.py b/__init__.py
index 8e71455..fdf41cb 100644
--- a/__init__.py
+++ b/__init__.py
@@ -9,20 +9,19 @@ from .invoice import *
 
 def register():
     Pool.register(
+        Move,
         Sale,
         SaleInvoice,
         SaleIgnoredInvoice,
         SaleRecreatedInvoice,
         SaleLine,
         SaleLineTax,
-        SaleLineInvoiceLine,
         SaleLineIgnoredMove,
         SaleLineRecreatedMove,
         Template,
         Product,
         ShipmentOut,
         ShipmentOutReturn,
-        Move,
         HandleShipmentExceptionAsk,
         HandleInvoiceExceptionAsk,
         Configuration,
diff --git a/configuration.xml b/configuration.xml
index 447f09e..0997726 100644
--- a/configuration.xml
+++ b/configuration.xml
@@ -14,19 +14,7 @@ this repository contains the full copyright notices and license terms. -->
         <record model="ir.ui.view" id="sale_configuration_view_form">
             <field name="model">sale.configuration</field>
             <field name="type">form</field>
-            <field name="arch" type="xml">
-                <![CDATA[
-                <form string="Sale Configuration">
-                    <label name="sale_sequence"/>
-                    <field name="sale_sequence"/>
-                    <newline />
-                    <label name="sale_invoice_method" />
-                    <field name="sale_invoice_method" />
-                    <label name="sale_shipment_method" />
-                    <field name="sale_shipment_method" />
-                </form>
-                ]]>
-            </field>
+            <field name="name">configuration_form</field>
         </record>
         <record model="ir.action.act_window" id="act_sale_configuration_form">
             <field name="name">Sales Configuration</field>
diff --git a/invoice.py b/invoice.py
index 901b67e..442c4d1 100644
--- a/invoice.py
+++ b/invoice.py
@@ -3,6 +3,7 @@
 from trytond.model import Workflow, fields
 from trytond.pool import Pool, PoolMeta
 from trytond.transaction import Transaction
+from trytond.backend import TableHandler
 
 __all__ = ['Invoice', 'InvoiceLine']
 __metaclass__ = PoolMeta
@@ -22,11 +23,11 @@ class Invoice:
     def __setup__(cls):
         super(Invoice, cls).__setup__()
         cls._error_messages.update({
-            'delete_sale_invoice': 'You can not delete invoices '
-                    'that come from a sale!',
-            'reset_invoice_sale': 'You cannot reset to draft '
-                    'an invoice generated by a sale.',
-            })
+                'delete_sale_invoice': ('You can not delete invoices '
+                    'that come from a sale.'),
+                'reset_invoice_sale': ('You cannot reset to draft '
+                    'an invoice generated by a sale.'),
+                })
 
     @classmethod
     def get_sale_exception_state(cls, invoices, name):
@@ -90,7 +91,7 @@ class Invoice:
             sales = Sale.search([
                     ('invoices', 'in', [i.id for i in invoices]),
                     ])
-        if sales:
+        if sales and any(i.state == 'cancel' for i in invoices):
             cls.raise_user_error('reset_invoice_sale')
 
         return super(Invoice, cls).draft(invoices)
@@ -98,13 +99,28 @@ class Invoice:
 
 class InvoiceLine:
     __name__ = 'account.invoice.line'
-    sale_lines = fields.Many2Many('sale.line-account.invoice.line',
-            'invoice_line', 'sale_line', 'Sale Lines', readonly=True)
 
     @classmethod
-    def copy(cls, lines, default=None):
-        if default is None:
-            default = {}
-        default = default.copy()
-        default.setdefault('sale_lines', None)
-        return super(InvoiceLine, cls).copy(lines, default=default)
+    def __register__(cls, module_name):
+        cursor = Transaction().cursor
+
+        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 + '"')
+            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))
+            TableHandler.drop_table(cursor,
+                'sale.line-account.invoice.line', rel_table)
+
+    @classmethod
+    def _get_origin(cls):
+        models = super(InvoiceLine, cls)._get_origin()
+        models.append('sale.line')
+        return models
diff --git a/locale/bg_BG.po b/locale/bg_BG.po
index 1bf3966..710ebc9 100644
--- a/locale/bg_BG.po
+++ b/locale/bg_BG.po
@@ -3,44 +3,46 @@ msgid ""
 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 "Не може да изтриете фактура която идва от продажба!"
+msgid "You can not delete invoices that come from a sale."
+msgstr ""
 
 msgctxt "error:account.invoice:"
 msgid "You cannot reset to draft an invoice generated by a sale."
 msgstr "Не може да прехвърляте в проект фактура генерирана при продажба."
 
 msgctxt "error:sale.line:"
-msgid "It misses an \"Account Revenue\" on product \"%s\"!"
-msgstr "Не е зададена \"Сметка за приходи\" за продукт \"%s\"!"
+msgid "Product \"%(product)s\" of sale %(sale)s misses a revenue account."
+msgstr ""
 
 msgctxt "error:sale.line:"
-msgid "It misses an \"account Revenue\" default property!"
-msgstr "Няма е зададено свойство по подразбиране \"Сметка за приходи\"!"
+msgid "Sale \"%(sale)s\" is missing the customer location in line \"%(line)s\"."
+msgstr ""
 
 msgctxt "error:sale.line:"
-msgid "The customer location is required!"
-msgstr "Местонахождението на клиента е задължително!"
+msgid "Sale \"%(sale)s\" misses an \"account revenue\" default property."
+msgstr ""
 
 msgctxt "error:sale.sale:"
-msgid "Invoice and Shipment addresses must be defined for the quotation."
-msgstr "Адрес за фактура и за доставка трябва да са зададени при запитване"
+msgid "Invalid combination of shipment and invoicing methods on sale \"%s\"."
+msgstr ""
 
 msgctxt "error:sale.sale:"
-msgid "It misses an \"Account Receivable\" on the party \"%s\"!"
-msgstr "Липсва \"Приходна сметка\" за партньор \"%s\"!"
+msgid ""
+"Invoice and Shipment addresses must be defined for the quotation of sale "
+"\"%s\"."
+msgstr ""
 
 msgctxt "error:sale.sale:"
-msgid "Sale \"%s\" must be cancelled before deletion!"
-msgstr "Преди да бъде изтрита продажбата \"%s\" трябва да бъде прекратена!"
+msgid "It misses an \"Account Receivable\" on the party \"%s\"."
+msgstr ""
 
 msgctxt "error:sale.sale:"
-msgid "Warehouse must be defined for the quotation."
-msgstr "При запитване е необходимо да се укаже склад"
+msgid "Sale \"%s\" must be cancelled before deletion."
+msgstr ""
 
 msgctxt "error:sale.sale:"
-msgid "Wrong combination of method!"
-msgstr "Грешна комбинация от методи!"
+msgid "Warehouse must be defined for the quotation of sale \"%s\"."
+msgstr ""
 
 msgctxt "error:stock.shipment.out.return:"
 msgid "You cannot reset to draft a move generated by a sale."
@@ -58,10 +60,6 @@ msgctxt "field:account.invoice,sales:"
 msgid "Sales"
 msgstr "Продажби"
 
-msgctxt "field:account.invoice.line,sale_lines:"
-msgid "Sale Lines"
-msgstr "Редове от продажба"
-
 msgctxt "field:product.template,delivery_time:"
 msgid "Delivery Time"
 msgstr "Време за доставка"
@@ -250,38 +248,6 @@ msgctxt "field:sale.line,write_uid:"
 msgid "Write User"
 msgstr "Променено от"
 
-msgctxt "field:sale.line-account.invoice.line,create_date:"
-msgid "Create Date"
-msgstr "Създадено на"
-
-msgctxt "field:sale.line-account.invoice.line,create_uid:"
-msgid "Create User"
-msgstr "Създадено от"
-
-msgctxt "field:sale.line-account.invoice.line,id:"
-msgid "ID"
-msgstr "ID"
-
-msgctxt "field:sale.line-account.invoice.line,invoice_line:"
-msgid "Invoice Line"
-msgstr "Ред от фактура"
-
-msgctxt "field:sale.line-account.invoice.line,rec_name:"
-msgid "Name"
-msgstr "Име"
-
-msgctxt "field:sale.line-account.invoice.line,sale_line:"
-msgid "Sale Line"
-msgstr "Ред от продажба"
-
-msgctxt "field:sale.line-account.invoice.line,write_date:"
-msgid "Write Date"
-msgstr "Променено на"
-
-msgctxt "field:sale.line-account.invoice.line,write_uid:"
-msgid "Write User"
-msgstr "Променено от"
-
 msgctxt "field:sale.line-account.tax,create_date:"
 msgid "Create Date"
 msgstr "Създадено на"
@@ -630,10 +596,6 @@ msgctxt "field:stock.move,sale_exception_state:"
 msgid "Exception State"
 msgstr "Състояние на грешка"
 
-msgctxt "field:stock.move,sale_line:"
-msgid "Sale Line"
-msgstr "Ред от продажба"
-
 msgctxt "help:product.template,delivery_time:"
 msgid "In number of days"
 msgstr "В брой дни"
@@ -668,22 +630,6 @@ msgctxt "model:ir.action,name:act_sale_form2"
 msgid "Sales"
 msgstr "Продажби"
 
-msgctxt "model:ir.action,name:act_sale_form_confirmed"
-msgid "Confirmed Sales"
-msgstr "Потвърдени продажби"
-
-msgctxt "model:ir.action,name:act_sale_form_draft"
-msgid "Draft Sales"
-msgstr "Проект на продажби"
-
-msgctxt "model:ir.action,name:act_sale_form_processing"
-msgid "Processing Sales"
-msgstr "Обработване на продажби"
-
-msgctxt "model:ir.action,name:act_sale_form_quotation"
-msgid "Quotation Sales"
-msgstr "Продажби (запитвания) "
-
 msgctxt "model:ir.action,name:act_shipment_form"
 msgid "Shipments"
 msgstr "Изпращания"
@@ -704,6 +650,33 @@ msgctxt "model:ir.action,name:wizard_shipment_handle_exception"
 msgid "Handle Shipment Exception"
 msgstr "Обработка на грешки при изпращане"
 
+msgctxt "model:ir.action.act_window.domain,name:act_sale_form_domain_all"
+msgid "All"
+msgstr ""
+
+#, fuzzy
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_sale_form_domain_confirmed"
+msgid "Confirmed"
+msgstr "Потвърден"
+
+#, fuzzy
+msgctxt "model:ir.action.act_window.domain,name:act_sale_form_domain_draft"
+msgid "Draft"
+msgstr "Проект"
+
+#, fuzzy
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_sale_form_domain_processing"
+msgid "Processing"
+msgstr "Обработване"
+
+#, fuzzy
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_sale_form_domain_quotation"
+msgid "Quotation"
+msgstr "Запитване"
+
 msgctxt "model:ir.sequence,name:sequence_sale"
 msgid "Sale"
 msgstr "Продажба"
@@ -732,22 +705,6 @@ msgctxt "model:ir.ui.menu,name:menu_sale_form"
 msgid "Sales"
 msgstr "Продажби"
 
-msgctxt "model:ir.ui.menu,name:menu_sale_form_confirmed"
-msgid "Confirmed Sales"
-msgstr "Потвърдени продажби"
-
-msgctxt "model:ir.ui.menu,name:menu_sale_form_draft"
-msgid "Draft Sales"
-msgstr "Проект на продажби"
-
-msgctxt "model:ir.ui.menu,name:menu_sale_form_processing"
-msgid "Processing Sales"
-msgstr "Обработване на прожадби"
-
-msgctxt "model:ir.ui.menu,name:menu_sale_form_quotation"
-msgid "Quotation Sales"
-msgstr "Продажби (запитвания) "
-
 msgctxt "model:res.group,name:group_sale"
 msgid "Sales"
 msgstr "Продажба"
@@ -772,10 +729,6 @@ msgctxt "model:sale.line,name:"
 msgid "Sale Line"
 msgstr "Ред от продажба"
 
-msgctxt "model:sale.line-account.invoice.line,name:"
-msgid "Sale Line - Invoice Line"
-msgstr "Ред от продажба - Ред от фактура"
-
 msgctxt "model:sale.line-account.tax,name:"
 msgid "Sale Line - Tax"
 msgstr "Ред от продажба - Данък"
@@ -1044,10 +997,6 @@ msgctxt "view:sale.handle.shipment.exception.ask:"
 msgid "Handle shipment Exception"
 msgstr "Обработване на грешка при изпращане"
 
-msgctxt "view:sale.handle.shipment.exception.ask:"
-msgid "Recreate Moves"
-msgstr "Наново създаване на движения"
-
 msgctxt "view:sale.line:"
 msgid "General"
 msgstr "Основен"
@@ -1057,10 +1006,6 @@ msgid "Notes"
 msgstr "Бележки"
 
 msgctxt "view:sale.line:"
-msgid "Products"
-msgstr "Продукти"
-
-msgctxt "view:sale.line:"
 msgid "Sale Line"
 msgstr "Ред от продажба"
 
@@ -1093,14 +1038,6 @@ msgid "Invoices"
 msgstr "Фактури"
 
 msgctxt "view:sale.sale:"
-msgid "Lines"
-msgstr "Редове"
-
-msgctxt "view:sale.sale:"
-msgid "Moves"
-msgstr "Движения"
-
-msgctxt "view:sale.sale:"
 msgid "Other Info"
 msgstr "Друга информация"
 
@@ -1109,10 +1046,6 @@ msgid "Process"
 msgstr "Обработване"
 
 msgctxt "view:sale.sale:"
-msgid "Quotation"
-msgstr "Запитване"
-
-msgctxt "view:sale.sale:"
 msgid "Quote"
 msgstr "Запитване"
 
diff --git a/locale/ca_ES.po b/locale/ca_ES.po
index 4ce4d3a..c03b8d0 100644
--- a/locale/ca_ES.po
+++ b/locale/ca_ES.po
@@ -3,54 +3,60 @@ msgid ""
 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 "No pot esborrar factures que provenen d'una venda."
+msgid "You can not delete invoices that come from a sale."
+msgstr "No podeu esborrar factures generades des de vendes."
 
 msgctxt "error:account.invoice:"
 msgid "You cannot reset to draft an invoice generated by a sale."
-msgstr "No pot restablir a esborrany una factura generada per una venda."
+msgstr "No podeu restaurar a esborrany una factura generada per una venda."
 
 msgctxt "error:sale.line:"
-msgid "It misses an \"Account Revenue\" on product \"%s\"!"
-msgstr "Falta un \"Compte d'ingressos\" en el producte \"%s\"."
+msgid "Product \"%(product)s\" of sale %(sale)s misses a revenue account."
+msgstr ""
+"Falta el compte a cobrar del producte \"%(product)s\" de la venda %(sale)s."
 
 msgctxt "error:sale.line:"
-msgid "It misses an \"account Revenue\" default property!"
-msgstr "Falta una propietat predeterminada de \"Compte d'ingressos\"."
+msgid "Sale \"%(sale)s\" is missing the customer location in line \"%(line)s\"."
+msgstr ""
+"No es troba la localizació del client a la línia \"%(line)s\" de la venda "
+"\"%(sale)\"."
 
 msgctxt "error:sale.line:"
-msgid "The customer location is required!"
-msgstr "Es necessita la ubicació del client."
+msgid "Sale \"%(sale)s\" misses an \"account revenue\" default property."
+msgstr "Falta la propietat \"Compte a cobrar\" per defecte de les vendes."
 
 msgctxt "error:sale.sale:"
-msgid "Invoice and Shipment addresses must be defined for the quotation."
+msgid "Invalid combination of shipment and invoicing methods on sale \"%s\"."
 msgstr ""
-"Les adreces de facturació i d'enviament han de ser definides en el "
-"pressupost."
+"Combinació de mètodes d'enviament i facturació a la venda \"%s\" incorrecta."
 
 msgctxt "error:sale.sale:"
-msgid "It misses an \"Account Receivable\" on the party \"%s\"!"
-msgstr "Falta un \"Compte d'ingressos\" en el tercer \"%s\"."
+msgid ""
+"Invoice and Shipment addresses must be defined for the quotation of sale "
+"\"%s\"."
+msgstr ""
+"L'adreça d'enviament i facturació s'han de definir per al pressupost de la "
+"venda \"%s\"."
 
 msgctxt "error:sale.sale:"
-msgid "Sale \"%s\" must be cancelled before deletion!"
-msgstr "La comanda \"%s\" ha de ser cancel·lada abans d'eliminar-la."
+msgid "It misses an \"Account Receivable\" on the party \"%s\"."
+msgstr "Falta un \"Compte a cobrar\" al tercer \"%s\"."
 
 msgctxt "error:sale.sale:"
-msgid "Warehouse must be defined for the quotation."
-msgstr "Cal definir un magatzem pel pressupost."
+msgid "Sale \"%s\" must be cancelled before deletion."
+msgstr "Heu de cancel·lar la venda \"%s\" abans de ser eliminat."
 
 msgctxt "error:sale.sale:"
-msgid "Wrong combination of method!"
-msgstr "Combinació invàlida dels mètodes."
+msgid "Warehouse must be defined for the quotation of sale \"%s\"."
+msgstr "S'ha de definir el magatzem per al pressupost de la venda \"%s\"."
 
 msgctxt "error:stock.shipment.out.return:"
 msgid "You cannot reset to draft a move generated by a sale."
-msgstr "No pot restablir a esborrany un moviment generat per una venda."
+msgstr "No podeu restaurar a esborrany un moviment generat per una venda."
 
 msgctxt "error:stock.shipment.out:"
 msgid "You cannot reset to draft a move generated by a sale."
-msgstr "No pot restablir a esborrany un moviment generat per una venda."
+msgstr "No podeu restaurar a esborrany un moviment generat per una venda."
 
 msgctxt "field:account.invoice,sale_exception_state:"
 msgid "Exception State"
@@ -60,10 +66,6 @@ msgctxt "field:account.invoice,sales:"
 msgid "Sales"
 msgstr "Vendes"
 
-msgctxt "field:account.invoice.line,sale_lines:"
-msgid "Sale Lines"
-msgstr "Línies de venda"
-
 msgctxt "field:product.template,delivery_time:"
 msgid "Delivery Time"
 msgstr "Temps d'enviament"
@@ -98,7 +100,7 @@ msgstr "Mètode de facturació"
 
 msgctxt "field:sale.configuration,sale_sequence:"
 msgid "Sale Reference Sequence"
-msgstr "Seqüència numeració vendes"
+msgstr "Seqüència de numeració vendes"
 
 msgctxt "field:sale.configuration,sale_shipment_method:"
 msgid "Sale Shipment Method"
@@ -252,38 +254,6 @@ msgctxt "field:sale.line,write_uid:"
 msgid "Write User"
 msgstr "Usuari modificació"
 
-msgctxt "field:sale.line-account.invoice.line,create_date:"
-msgid "Create Date"
-msgstr "Data creació"
-
-msgctxt "field:sale.line-account.invoice.line,create_uid:"
-msgid "Create User"
-msgstr "Usuari creació"
-
-msgctxt "field:sale.line-account.invoice.line,id:"
-msgid "ID"
-msgstr "ID"
-
-msgctxt "field:sale.line-account.invoice.line,invoice_line:"
-msgid "Invoice Line"
-msgstr "Línia de factura"
-
-msgctxt "field:sale.line-account.invoice.line,rec_name:"
-msgid "Name"
-msgstr "Nom"
-
-msgctxt "field:sale.line-account.invoice.line,sale_line:"
-msgid "Sale Line"
-msgstr "Línia de venta"
-
-msgctxt "field:sale.line-account.invoice.line,write_date:"
-msgid "Write Date"
-msgstr "Data modificació"
-
-msgctxt "field:sale.line-account.invoice.line,write_uid:"
-msgid "Write User"
-msgstr "Usuari modificació"
-
 msgctxt "field:sale.line-account.tax,create_date:"
 msgid "Create Date"
 msgstr "Data creació"
@@ -474,7 +444,7 @@ msgstr "Adreça enviament"
 
 msgctxt "field:sale.sale,shipment_method:"
 msgid "Shipment Method"
-msgstr "Mètode enviament"
+msgstr "Mètode d'enviament"
 
 msgctxt "field:sale.sale,shipment_returns:"
 msgid "Shipment Returns"
@@ -632,10 +602,6 @@ msgctxt "field:stock.move,sale_exception_state:"
 msgid "Exception State"
 msgstr "Estat excepció"
 
-msgctxt "field:stock.move,sale_line:"
-msgid "Sale Line"
-msgstr "Línia de venda"
-
 msgctxt "help:product.template,delivery_time:"
 msgid "In number of days"
 msgstr "En nombre de dies"
@@ -652,7 +618,7 @@ msgstr "Factures"
 
 msgctxt "model:ir.action,name:act_open_customer"
 msgid "Parties associated to Sales"
-msgstr "Tercers associats a vendes"
+msgstr "Tercers amb vendes"
 
 msgctxt "model:ir.action,name:act_return_form"
 msgid "Returns"
@@ -660,7 +626,7 @@ msgstr "Retorna"
 
 msgctxt "model:ir.action,name:act_sale_configuration_form"
 msgid "Sales Configuration"
-msgstr "Configuració vendes"
+msgstr "Configuració de les vendes"
 
 msgctxt "model:ir.action,name:act_sale_form"
 msgid "Sales"
@@ -670,22 +636,6 @@ msgctxt "model:ir.action,name:act_sale_form2"
 msgid "Sales"
 msgstr "Vendes"
 
-msgctxt "model:ir.action,name:act_sale_form_confirmed"
-msgid "Confirmed Sales"
-msgstr "Vendes confirmades"
-
-msgctxt "model:ir.action,name:act_sale_form_draft"
-msgid "Draft Sales"
-msgstr "Vendes borrador"
-
-msgctxt "model:ir.action,name:act_sale_form_processing"
-msgid "Processing Sales"
-msgstr "Vendes en procés"
-
-msgctxt "model:ir.action,name:act_sale_form_quotation"
-msgid "Quotation Sales"
-msgstr "Vendes pressupostades"
-
 msgctxt "model:ir.action,name:act_shipment_form"
 msgid "Shipments"
 msgstr "Albarans"
@@ -706,6 +656,29 @@ msgctxt "model:ir.action,name:wizard_shipment_handle_exception"
 msgid "Handle Shipment Exception"
 msgstr "Gestiona excepció d'enviament"
 
+msgctxt "model:ir.action.act_window.domain,name:act_sale_form_domain_all"
+msgid "All"
+msgstr "Tot"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_sale_form_domain_confirmed"
+msgid "Confirmed"
+msgstr "Confirmat"
+
+msgctxt "model:ir.action.act_window.domain,name:act_sale_form_domain_draft"
+msgid "Draft"
+msgstr "Esborrany"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_sale_form_domain_processing"
+msgid "Processing"
+msgstr "En procés"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_sale_form_domain_quotation"
+msgid "Quotation"
+msgstr "Pressupost"
+
 msgctxt "model:ir.sequence,name:sequence_sale"
 msgid "Sale"
 msgstr "Venda"
@@ -720,7 +693,7 @@ msgstr "Configuració"
 
 msgctxt "model:ir.ui.menu,name:menu_customer"
 msgid "Parties associated to Sales"
-msgstr "Tercers associats a vendes"
+msgstr "Tercers amb vendes"
 
 msgctxt "model:ir.ui.menu,name:menu_sale"
 msgid "Sales"
@@ -728,28 +701,12 @@ msgstr "Vendes"
 
 msgctxt "model:ir.ui.menu,name:menu_sale_configuration"
 msgid "Sales Configuration"
-msgstr "Configuració vendes"
+msgstr "Vendes"
 
 msgctxt "model:ir.ui.menu,name:menu_sale_form"
 msgid "Sales"
 msgstr "Vendes"
 
-msgctxt "model:ir.ui.menu,name:menu_sale_form_confirmed"
-msgid "Confirmed Sales"
-msgstr "Confirmades"
-
-msgctxt "model:ir.ui.menu,name:menu_sale_form_draft"
-msgid "Draft Sales"
-msgstr "Borrador"
-
-msgctxt "model:ir.ui.menu,name:menu_sale_form_processing"
-msgid "Processing Sales"
-msgstr "En procés"
-
-msgctxt "model:ir.ui.menu,name:menu_sale_form_quotation"
-msgid "Quotation Sales"
-msgstr "Pressupost"
-
 msgctxt "model:res.group,name:group_sale"
 msgid "Sales"
 msgstr "Vendes"
@@ -760,7 +717,7 @@ msgstr "Administració de vendes"
 
 msgctxt "model:sale.configuration,name:"
 msgid "Sale Configuration"
-msgstr "Configuració vendes"
+msgstr "Configuració de les vendes"
 
 msgctxt "model:sale.handle.invoice.exception.ask,name:"
 msgid "Handle Invoice Exception"
@@ -774,10 +731,6 @@ msgctxt "model:sale.line,name:"
 msgid "Sale Line"
 msgstr "Línia de venda"
 
-msgctxt "model:sale.line-account.invoice.line,name:"
-msgid "Sale Line - Invoice Line"
-msgstr "Línia de venda - Linia de factura"
-
 msgctxt "model:sale.line-account.tax,name:"
 msgid "Sale Line - Tax"
 msgstr "Línia de venda - Impost"
@@ -824,7 +777,7 @@ msgstr "Descripció:"
 
 msgctxt "odt:sale.sale:"
 msgid "Draft Sale Order"
-msgstr "Vendes borrador"
+msgstr "Comanda de Venda Esborrany"
 
 msgctxt "odt:sale.sale:"
 msgid "E-Mail:"
@@ -874,10 +827,9 @@ msgctxt "odt:sale.sale:"
 msgid "VAT:"
 msgstr "CIF/NIF:"
 
-#, fuzzy
 msgctxt "selection:account.invoice,sale_exception_state:"
 msgid ""
-msgstr "Recreat"
+msgstr " "
 
 msgctxt "selection:account.invoice,sale_exception_state:"
 msgid "Ignored"
@@ -1001,16 +953,15 @@ msgstr "Esborrany"
 
 msgctxt "selection:sale.sale,state:"
 msgid "Processing"
-msgstr "Processant"
+msgstr "En procés"
 
 msgctxt "selection:sale.sale,state:"
 msgid "Quotation"
 msgstr "Pressupost"
 
-#, fuzzy
 msgctxt "selection:stock.move,sale_exception_state:"
 msgid ""
-msgstr "Recreat"
+msgstr " "
 
 msgctxt "selection:stock.move,sale_exception_state:"
 msgid "Ignored"
@@ -1021,10 +972,6 @@ msgid "Recreated"
 msgstr "Recreat"
 
 msgctxt "view:product.product:"
-msgid "Customers"
-msgstr "Clients"
-
-msgctxt "view:product.product:"
 msgid "Products"
 msgstr "Productes"
 
@@ -1052,10 +999,6 @@ msgctxt "view:sale.handle.shipment.exception.ask:"
 msgid "Handle shipment Exception"
 msgstr "Gestiona excepció d'enviament"
 
-msgctxt "view:sale.handle.shipment.exception.ask:"
-msgid "Recreate Moves"
-msgstr "Recrea moviments"
-
 msgctxt "view:sale.line:"
 msgid "General"
 msgstr "General"
@@ -1065,10 +1008,6 @@ msgid "Notes"
 msgstr "Notes"
 
 msgctxt "view:sale.line:"
-msgid "Products"
-msgstr "Productes"
-
-msgctxt "view:sale.line:"
 msgid "Sale Line"
 msgstr "Línia de venda"
 
@@ -1097,22 +1036,10 @@ msgid "Handle Shipment Exception"
 msgstr "Gestiona excepció d'enviament"
 
 msgctxt "view:sale.sale:"
-msgid "Ignore Invoice Exception"
-msgstr "Ignora excepció de factura"
-
-msgctxt "view:sale.sale:"
 msgid "Invoices"
 msgstr "Factures"
 
 msgctxt "view:sale.sale:"
-msgid "Lines"
-msgstr "Línies"
-
-msgctxt "view:sale.sale:"
-msgid "Moves"
-msgstr "Moviments"
-
-msgctxt "view:sale.sale:"
 msgid "Other Info"
 msgstr "Informació addicional"
 
@@ -1121,10 +1048,6 @@ msgid "Process"
 msgstr "Processa"
 
 msgctxt "view:sale.sale:"
-msgid "Quotation"
-msgstr "Pressupost"
-
-msgctxt "view:sale.sale:"
 msgid "Quote"
 msgstr "Pressupost"
 
diff --git a/locale/cs_CZ.po b/locale/cs_CZ.po
index 48a5ca2..d2fc732 100644
--- a/locale/cs_CZ.po
+++ b/locale/cs_CZ.po
@@ -3,7 +3,7 @@ msgid ""
 msgstr "Content-Type: text/plain; charset=utf-8\n"
 
 msgctxt "error:account.invoice:"
-msgid "You can not delete invoices that come from a sale!"
+msgid "You can not delete invoices that come from a sale."
 msgstr ""
 
 msgctxt "error:account.invoice:"
@@ -11,35 +11,37 @@ msgid "You cannot reset to draft an invoice generated by a sale."
 msgstr ""
 
 msgctxt "error:sale.line:"
-msgid "It misses an \"Account Revenue\" on product \"%s\"!"
+msgid "Product \"%(product)s\" of sale %(sale)s misses a revenue account."
 msgstr ""
 
 msgctxt "error:sale.line:"
-msgid "It misses an \"account Revenue\" default property!"
+msgid "Sale \"%(sale)s\" is missing the customer location in line \"%(line)s\"."
 msgstr ""
 
 msgctxt "error:sale.line:"
-msgid "The customer location is required!"
+msgid "Sale \"%(sale)s\" misses an \"account revenue\" default property."
 msgstr ""
 
 msgctxt "error:sale.sale:"
-msgid "Invoice and Shipment addresses must be defined for the quotation."
+msgid "Invalid combination of shipment and invoicing methods on sale \"%s\"."
 msgstr ""
 
 msgctxt "error:sale.sale:"
-msgid "It misses an \"Account Receivable\" on the party \"%s\"!"
+msgid ""
+"Invoice and Shipment addresses must be defined for the quotation of sale "
+"\"%s\"."
 msgstr ""
 
 msgctxt "error:sale.sale:"
-msgid "Sale \"%s\" must be cancelled before deletion!"
+msgid "It misses an \"Account Receivable\" on the party \"%s\"."
 msgstr ""
 
 msgctxt "error:sale.sale:"
-msgid "Warehouse must be defined for the quotation."
+msgid "Sale \"%s\" must be cancelled before deletion."
 msgstr ""
 
 msgctxt "error:sale.sale:"
-msgid "Wrong combination of method!"
+msgid "Warehouse must be defined for the quotation of sale \"%s\"."
 msgstr ""
 
 msgctxt "error:stock.shipment.out.return:"
@@ -58,10 +60,6 @@ msgctxt "field:account.invoice,sales:"
 msgid "Sales"
 msgstr ""
 
-msgctxt "field:account.invoice.line,sale_lines:"
-msgid "Sale Lines"
-msgstr ""
-
 msgctxt "field:product.template,delivery_time:"
 msgid "Delivery Time"
 msgstr ""
@@ -250,38 +248,6 @@ msgctxt "field:sale.line,write_uid:"
 msgid "Write User"
 msgstr ""
 
-msgctxt "field:sale.line-account.invoice.line,create_date:"
-msgid "Create Date"
-msgstr ""
-
-msgctxt "field:sale.line-account.invoice.line,create_uid:"
-msgid "Create User"
-msgstr ""
-
-msgctxt "field:sale.line-account.invoice.line,id:"
-msgid "ID"
-msgstr ""
-
-msgctxt "field:sale.line-account.invoice.line,invoice_line:"
-msgid "Invoice Line"
-msgstr ""
-
-msgctxt "field:sale.line-account.invoice.line,rec_name:"
-msgid "Name"
-msgstr ""
-
-msgctxt "field:sale.line-account.invoice.line,sale_line:"
-msgid "Sale Line"
-msgstr ""
-
-msgctxt "field:sale.line-account.invoice.line,write_date:"
-msgid "Write Date"
-msgstr ""
-
-msgctxt "field:sale.line-account.invoice.line,write_uid:"
-msgid "Write User"
-msgstr ""
-
 msgctxt "field:sale.line-account.tax,create_date:"
 msgid "Create Date"
 msgstr ""
@@ -630,10 +596,6 @@ msgctxt "field:stock.move,sale_exception_state:"
 msgid "Exception State"
 msgstr ""
 
-msgctxt "field:stock.move,sale_line:"
-msgid "Sale Line"
-msgstr ""
-
 msgctxt "help:product.template,delivery_time:"
 msgid "In number of days"
 msgstr ""
@@ -667,22 +629,6 @@ msgctxt "model:ir.action,name:act_sale_form2"
 msgid "Sales"
 msgstr ""
 
-msgctxt "model:ir.action,name:act_sale_form_confirmed"
-msgid "Confirmed Sales"
-msgstr ""
-
-msgctxt "model:ir.action,name:act_sale_form_draft"
-msgid "Draft Sales"
-msgstr ""
-
-msgctxt "model:ir.action,name:act_sale_form_processing"
-msgid "Processing Sales"
-msgstr ""
-
-msgctxt "model:ir.action,name:act_sale_form_quotation"
-msgid "Quotation Sales"
-msgstr ""
-
 msgctxt "model:ir.action,name:act_shipment_form"
 msgid "Shipments"
 msgstr ""
@@ -703,6 +649,29 @@ msgctxt "model:ir.action,name:wizard_shipment_handle_exception"
 msgid "Handle Shipment Exception"
 msgstr ""
 
+msgctxt "model:ir.action.act_window.domain,name:act_sale_form_domain_all"
+msgid "All"
+msgstr ""
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_sale_form_domain_confirmed"
+msgid "Confirmed"
+msgstr ""
+
+msgctxt "model:ir.action.act_window.domain,name:act_sale_form_domain_draft"
+msgid "Draft"
+msgstr ""
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_sale_form_domain_processing"
+msgid "Processing"
+msgstr ""
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_sale_form_domain_quotation"
+msgid "Quotation"
+msgstr ""
+
 msgctxt "model:ir.sequence,name:sequence_sale"
 msgid "Sale"
 msgstr ""
@@ -731,22 +700,6 @@ msgctxt "model:ir.ui.menu,name:menu_sale_form"
 msgid "Sales"
 msgstr ""
 
-msgctxt "model:ir.ui.menu,name:menu_sale_form_confirmed"
-msgid "Confirmed Sales"
-msgstr ""
-
-msgctxt "model:ir.ui.menu,name:menu_sale_form_draft"
-msgid "Draft Sales"
-msgstr ""
-
-msgctxt "model:ir.ui.menu,name:menu_sale_form_processing"
-msgid "Processing Sales"
-msgstr ""
-
-msgctxt "model:ir.ui.menu,name:menu_sale_form_quotation"
-msgid "Quotation Sales"
-msgstr ""
-
 msgctxt "model:res.group,name:group_sale"
 msgid "Sales"
 msgstr ""
@@ -771,10 +724,6 @@ msgctxt "model:sale.line,name:"
 msgid "Sale Line"
 msgstr ""
 
-msgctxt "model:sale.line-account.invoice.line,name:"
-msgid "Sale Line - Invoice Line"
-msgstr ""
-
 msgctxt "model:sale.line-account.tax,name:"
 msgid "Sale Line - Tax"
 msgstr ""
@@ -1043,10 +992,6 @@ msgctxt "view:sale.handle.shipment.exception.ask:"
 msgid "Handle shipment Exception"
 msgstr ""
 
-msgctxt "view:sale.handle.shipment.exception.ask:"
-msgid "Recreate Moves"
-msgstr ""
-
 msgctxt "view:sale.line:"
 msgid "General"
 msgstr ""
@@ -1056,10 +1001,6 @@ msgid "Notes"
 msgstr ""
 
 msgctxt "view:sale.line:"
-msgid "Products"
-msgstr ""
-
-msgctxt "view:sale.line:"
 msgid "Sale Line"
 msgstr ""
 
@@ -1092,14 +1033,6 @@ msgid "Invoices"
 msgstr ""
 
 msgctxt "view:sale.sale:"
-msgid "Lines"
-msgstr ""
-
-msgctxt "view:sale.sale:"
-msgid "Moves"
-msgstr ""
-
-msgctxt "view:sale.sale:"
 msgid "Other Info"
 msgstr ""
 
@@ -1108,10 +1041,6 @@ msgid "Process"
 msgstr ""
 
 msgctxt "view:sale.sale:"
-msgid "Quotation"
-msgstr ""
-
-msgctxt "view:sale.sale:"
 msgid "Quote"
 msgstr ""
 
diff --git a/locale/de_DE.po b/locale/de_DE.po
index d5cf6e8..6049522 100644
--- a/locale/de_DE.po
+++ b/locale/de_DE.po
@@ -3,9 +3,8 @@ msgid ""
 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 ""
-"Durch einen Verkauf generierte Rechnungen können nicht gelöscht werden!"
+msgid "You can not delete invoices that come from a sale."
+msgstr "Aus einem Verkauf stammende Rechnungen können nicht gelöscht werden."
 
 msgctxt "error:account.invoice:"
 msgid "You cannot reset to draft an invoice generated by a sale."
@@ -14,36 +13,50 @@ msgstr ""
 "zurückgesetzt werden."
 
 msgctxt "error:sale.line:"
-msgid "It misses an \"Account Revenue\" on product \"%s\"!"
-msgstr "Es ist kein Ertragskonto für Artikel \"%s\" definiert!"
+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."
 
 msgctxt "error:sale.line:"
-msgid "It misses an \"account Revenue\" default property!"
-msgstr "Es ist keine Standardeigenschaft für das Ertragskonto definiert!"
+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."
 
 msgctxt "error:sale.line:"
-msgid "The customer location is required!"
-msgstr "Der Lagerort des Kunden muss eingegeben werden!"
+msgid "Sale \"%(sale)s\" misses an \"account revenue\" default property."
+msgstr ""
+"Für Verkauf \"%(sale)s\"  ist keine Standardeigenschaft für das Ertragskonto"
+" eingetragen."
 
 msgctxt "error:sale.sale:"
-msgid "Invoice and Shipment addresses must be defined for the quotation."
-msgstr "Rechnungs- und Lieferadresse müssen für das Angebot eingetragen sein!"
+msgid "Invalid combination of shipment and invoicing methods on sale \"%s\"."
+msgstr ""
+"Ungültige Kombination von Liefermethode und Rechnungsstellung in Verkauf "
+"\"%s\"."
 
 msgctxt "error:sale.sale:"
-msgid "It misses an \"Account Receivable\" on the party \"%s\"!"
-msgstr "Es ist kein Forderungskonto für Partei \"%s\" definiert!"
+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\"."
 
 msgctxt "error:sale.sale:"
-msgid "Sale \"%s\" must be cancelled before deletion!"
-msgstr "Verkauf \"%s\" muss annulliert werden, bevor er gelöscht werden kann."
+msgid "It misses an \"Account Receivable\" on the party \"%s\"."
+msgstr "Fehlendes \"Forderungskonto\" für Partei \"%s\"."
 
 msgctxt "error:sale.sale:"
-msgid "Warehouse must be defined for the quotation."
-msgstr "Warenlager muss für das Angebot angegeben werden"
+msgid "Sale \"%s\" must be cancelled before deletion."
+msgstr "Verkauf \"%s\" muss annulliert werden, bevor er gelöscht werden kann."
 
 msgctxt "error:sale.sale:"
-msgid "Wrong combination of method!"
-msgstr "Ungültige Kombination von Methoden!"
+msgid "Warehouse must be defined for the quotation of sale \"%s\"."
+msgstr ""
+"Warenlager muss angegeben werden für die Angebotserstellung von Verkauf "
+"\"%s\"."
 
 msgctxt "error:stock.shipment.out.return:"
 msgid "You cannot reset to draft a move generated by a sale."
@@ -65,10 +78,6 @@ msgctxt "field:account.invoice,sales:"
 msgid "Sales"
 msgstr "Verkäufe"
 
-msgctxt "field:account.invoice.line,sale_lines:"
-msgid "Sale Lines"
-msgstr "Positionen Verkauf"
-
 msgctxt "field:product.template,delivery_time:"
 msgid "Delivery Time"
 msgstr "Lieferfrist"
@@ -257,38 +266,6 @@ msgctxt "field:sale.line,write_uid:"
 msgid "Write User"
 msgstr "Letzte Änderung durch"
 
-msgctxt "field:sale.line-account.invoice.line,create_date:"
-msgid "Create Date"
-msgstr "Erstellungsdatum"
-
-msgctxt "field:sale.line-account.invoice.line,create_uid:"
-msgid "Create User"
-msgstr "Erstellt durch"
-
-msgctxt "field:sale.line-account.invoice.line,id:"
-msgid "ID"
-msgstr "ID"
-
-msgctxt "field:sale.line-account.invoice.line,invoice_line:"
-msgid "Invoice Line"
-msgstr "Rechnungsposition"
-
-msgctxt "field:sale.line-account.invoice.line,rec_name:"
-msgid "Name"
-msgstr "Name"
-
-msgctxt "field:sale.line-account.invoice.line,sale_line:"
-msgid "Sale Line"
-msgstr "Position Verkauf"
-
-msgctxt "field:sale.line-account.invoice.line,write_date:"
-msgid "Write Date"
-msgstr "Zuletzt geändert"
-
-msgctxt "field:sale.line-account.invoice.line,write_uid:"
-msgid "Write User"
-msgstr "Letzte Änderung durch"
-
 msgctxt "field:sale.line-account.tax,create_date:"
 msgid "Create Date"
 msgstr "Erstellungsdatum"
@@ -637,10 +614,6 @@ msgctxt "field:stock.move,sale_exception_state:"
 msgid "Exception State"
 msgstr "Status Vorbehalt"
 
-msgctxt "field:stock.move,sale_line:"
-msgid "Sale Line"
-msgstr "Verkauf Position"
-
 msgctxt "help:product.template,delivery_time:"
 msgid "In number of days"
 msgstr "In Anzahl von Tagen"
@@ -666,7 +639,7 @@ msgstr "Rücknahmen"
 
 msgctxt "model:ir.action,name:act_sale_configuration_form"
 msgid "Sales Configuration"
-msgstr "Einstellungen Verkauf"
+msgstr "Verkauf"
 
 msgctxt "model:ir.action,name:act_sale_form"
 msgid "Sales"
@@ -676,22 +649,6 @@ msgctxt "model:ir.action,name:act_sale_form2"
 msgid "Sales"
 msgstr "Verkäufe"
 
-msgctxt "model:ir.action,name:act_sale_form_confirmed"
-msgid "Confirmed Sales"
-msgstr "Aufträge Verkäufe"
-
-msgctxt "model:ir.action,name:act_sale_form_draft"
-msgid "Draft Sales"
-msgstr "Entwürfe Verkäufe"
-
-msgctxt "model:ir.action,name:act_sale_form_processing"
-msgid "Processing Sales"
-msgstr "Verkäufe durchführen"
-
-msgctxt "model:ir.action,name:act_sale_form_quotation"
-msgid "Quotation Sales"
-msgstr "Angebote Verkäufe"
-
 msgctxt "model:ir.action,name:act_shipment_form"
 msgid "Shipments"
 msgstr "Lieferposten"
@@ -710,7 +667,30 @@ msgstr "Rücknahme erstellen"
 
 msgctxt "model:ir.action,name:wizard_shipment_handle_exception"
 msgid "Handle Shipment Exception"
-msgstr "Liefervorbehalt bearbeiten"
+msgstr "Nachfrage Liefervorbehalt"
+
+msgctxt "model:ir.action.act_window.domain,name:act_sale_form_domain_all"
+msgid "All"
+msgstr "Alle"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_sale_form_domain_confirmed"
+msgid "Confirmed"
+msgstr "Bestätigt"
+
+msgctxt "model:ir.action.act_window.domain,name:act_sale_form_domain_draft"
+msgid "Draft"
+msgstr "Entwurf"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_sale_form_domain_processing"
+msgid "Processing"
+msgstr "In Ausführung"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_sale_form_domain_quotation"
+msgid "Quotation"
+msgstr "Angebot"
 
 msgctxt "model:ir.sequence,name:sequence_sale"
 msgid "Sale"
@@ -734,28 +714,12 @@ msgstr "Verkauf"
 
 msgctxt "model:ir.ui.menu,name:menu_sale_configuration"
 msgid "Sales Configuration"
-msgstr "Einstellungen Verkauf"
+msgstr "Verkauf"
 
 msgctxt "model:ir.ui.menu,name:menu_sale_form"
 msgid "Sales"
 msgstr "Verkäufe"
 
-msgctxt "model:ir.ui.menu,name:menu_sale_form_confirmed"
-msgid "Confirmed Sales"
-msgstr "Aufträge (Verkäufe)"
-
-msgctxt "model:ir.ui.menu,name:menu_sale_form_draft"
-msgid "Draft Sales"
-msgstr "Entwürfe (Verkäufe)"
-
-msgctxt "model:ir.ui.menu,name:menu_sale_form_processing"
-msgid "Processing Sales"
-msgstr "Verkäufe durchführen"
-
-msgctxt "model:ir.ui.menu,name:menu_sale_form_quotation"
-msgid "Quotation Sales"
-msgstr "Angebote (Verkäufe)"
-
 msgctxt "model:res.group,name:group_sale"
 msgid "Sales"
 msgstr "Verkauf"
@@ -780,10 +744,6 @@ msgctxt "model:sale.line,name:"
 msgid "Sale Line"
 msgstr "Verkauf Position"
 
-msgctxt "model:sale.line-account.invoice.line,name:"
-msgid "Sale Line - Invoice Line"
-msgstr "Verkauf Position - Rechnungsposition"
-
 msgctxt "model:sale.line-account.tax,name:"
 msgid "Sale Line - Tax"
 msgstr "Verkauf Position - Steuer"
@@ -898,7 +858,7 @@ msgstr "Manuell"
 
 msgctxt "selection:sale.configuration,sale_invoice_method:"
 msgid "On Order Processed"
-msgstr "Nach Durchführung Auftrag"
+msgstr "Nach Auftragsausführung"
 
 msgctxt "selection:sale.configuration,sale_invoice_method:"
 msgid "On Shipment Sent"
@@ -914,7 +874,7 @@ msgstr "Bei Bezahlung"
 
 msgctxt "selection:sale.configuration,sale_shipment_method:"
 msgid "On Order Processed"
-msgstr "Nach Durchführung Auftrag"
+msgstr "Nach Auftragsausführung"
 
 msgctxt "selection:sale.line,type:"
 msgid "Comment"
@@ -938,7 +898,7 @@ msgstr "Manuell"
 
 msgctxt "selection:sale.sale,invoice_method:"
 msgid "On Order Processed"
-msgstr "Nach Durchführung Auftrag"
+msgstr "Nach Auftragsausführung"
 
 msgctxt "selection:sale.sale,invoice_method:"
 msgid "On Shipment Sent"
@@ -970,7 +930,7 @@ msgstr "Bei Bezahlung"
 
 msgctxt "selection:sale.sale,shipment_method:"
 msgid "On Order Processed"
-msgstr "Nach Durchführung Auftrag"
+msgstr "Nach Auftragsausführung"
 
 msgctxt "selection:sale.sale,shipment_state:"
 msgid "Exception"
@@ -1006,7 +966,7 @@ msgstr "Entwurf"
 
 msgctxt "selection:sale.sale,state:"
 msgid "Processing"
-msgstr "Abschlussarbeiten"
+msgstr "In Ausführung"
 
 msgctxt "selection:sale.sale,state:"
 msgid "Quotation"
@@ -1025,10 +985,6 @@ msgid "Recreated"
 msgstr "Nachgebildet"
 
 msgctxt "view:product.product:"
-msgid "Customers"
-msgstr "Kunden"
-
-msgctxt "view:product.product:"
 msgid "Products"
 msgstr "Artikel"
 
@@ -1041,10 +997,6 @@ msgid "Sale Configuration"
 msgstr "Einstellungen Verkauf"
 
 msgctxt "view:sale.handle.invoice.exception.ask:"
-msgid "Choose invoices to duplicate"
-msgstr "Auswahl Rechnungen für Duplizierung"
-
-msgctxt "view:sale.handle.invoice.exception.ask:"
 msgid "Choose invoices to recreate"
 msgstr "Rechnungen zum Nachbilden auswählen"
 
@@ -1053,25 +1005,13 @@ msgid "Handle Invoice Exception"
 msgstr "Rechnungsvorbehalt bearbeiten"
 
 msgctxt "view:sale.handle.shipment.exception.ask:"
-msgid "Choose move to duplicate"
-msgstr "Auswahl Bewegungen für Duplizierung"
-
-msgctxt "view:sale.handle.shipment.exception.ask:"
 msgid "Choose move to recreate"
 msgstr "Bewegungen zum Nachbilden auswählen"
 
 msgctxt "view:sale.handle.shipment.exception.ask:"
-msgid "Duplicate Moves"
-msgstr "Bewegungen duplizieren"
-
-msgctxt "view:sale.handle.shipment.exception.ask:"
 msgid "Handle shipment Exception"
 msgstr "Liefervorbehalt bearbeiten"
 
-msgctxt "view:sale.handle.shipment.exception.ask:"
-msgid "Recreate Moves"
-msgstr "Bewegungen nachbilden"
-
 msgctxt "view:sale.line:"
 msgid "General"
 msgstr "Allgemein"
@@ -1081,10 +1021,6 @@ msgid "Notes"
 msgstr "Notizen"
 
 msgctxt "view:sale.line:"
-msgid "Products"
-msgstr "Artikel"
-
-msgctxt "view:sale.line:"
 msgid "Sale Line"
 msgstr "Position Verkauf"
 
@@ -1113,32 +1049,16 @@ msgid "Handle Shipment Exception"
 msgstr "Liefervorbehalt bearbeiten"
 
 msgctxt "view:sale.sale:"
-msgid "Ignore Invoice Exception"
-msgstr "Rechnungsvorbehalt ignorieren"
-
-msgctxt "view:sale.sale:"
 msgid "Invoices"
 msgstr "Rechnungen"
 
 msgctxt "view:sale.sale:"
-msgid "Lines"
-msgstr "Positionen"
-
-msgctxt "view:sale.sale:"
-msgid "Moves"
-msgstr "Bewegungen"
-
-msgctxt "view:sale.sale:"
 msgid "Other Info"
 msgstr "Sonstiges"
 
 msgctxt "view:sale.sale:"
 msgid "Process"
-msgstr "Durchführen"
-
-msgctxt "view:sale.sale:"
-msgid "Quotation"
-msgstr "Angebot"
+msgstr "Ausführen"
 
 msgctxt "view:sale.sale:"
 msgid "Quote"
diff --git a/locale/es_AR.po b/locale/es_AR.po
index 8700042..9a3d7d6 100644
--- a/locale/es_AR.po
+++ b/locale/es_AR.po
@@ -3,51 +3,56 @@ msgid ""
 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 "¡No puede borrar facturas que provienen de una venta!"
+msgid "You can not delete invoices that come from a sale."
+msgstr "No puede eliminar facturas generadas desde ventas."
 
 msgctxt "error:account.invoice:"
 msgid "You cannot reset to draft an invoice generated by a sale."
 msgstr "No puede restablecer a borrador una factura generada por una venta."
 
 msgctxt "error:sale.line:"
-msgid "It misses an \"Account Revenue\" on product \"%s\"!"
-msgstr "¡Falta una «cuenta de ingresos» en el producto «%s»!"
+msgid "Product \"%(product)s\" of sale %(sale)s misses a revenue account."
+msgstr ""
+"Falta la cuenta a cobrar del producto «%(product)s» de la venta %(sale)s."
 
 msgctxt "error:sale.line:"
-msgid "It misses an \"account Revenue\" default property!"
-msgstr "¡Falta una propiedad predeterminada de «cuenta de ingresos»!"
+msgid "Sale \"%(sale)s\" is missing the customer location in line \"%(line)s\"."
+msgstr ""
+"Falta la ubicación del cliente en la línea «%(line)s» de la venta «%(sale)»."
 
 msgctxt "error:sale.line:"
-msgid "The customer location is required!"
-msgstr "¡Se necesita la ubicación del cliente!"
+msgid "Sale \"%(sale)s\" misses an \"account revenue\" default property."
+msgstr "Falta la propiedad «Cuenta a cobrar» por defecto de las ventas."
 
 msgctxt "error:sale.sale:"
-msgid "Invoice and Shipment addresses must be defined for the quotation."
+msgid "Invalid combination of shipment and invoicing methods on sale \"%s\"."
 msgstr ""
-"Las direcciones de facturación y de envío debe ser definida para el "
-"presupuesto."
+"La combinación de métodos de envío y facturación en la venta «%s» no es "
+"correcta."
 
 msgctxt "error:sale.sale:"
-msgid "It misses an \"Account Receivable\" on the party \"%s\"!"
-msgstr "¡Falta una «cuenta de ingresos» en la entidad «%s»!"
+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»."
 
 msgctxt "error:sale.sale:"
-msgid "Sale \"%s\" must be cancelled before deletion!"
-msgstr "¡Venta «%s» debe ser cancelada antes de eliminar!"
+msgid "It misses an \"Account Receivable\" on the party \"%s\"."
+msgstr "Falta una «Cuenta a cobrar» en la entidad «%s»."
 
 msgctxt "error:sale.sale:"
-msgid "Warehouse must be defined for the quotation."
-msgstr "Almacén debe estar definido para el presupuesto."
+msgid "Sale \"%s\" must be cancelled before deletion."
+msgstr "Debe cancelar la venta «%s» antes de eliminar."
 
 msgctxt "error:sale.sale:"
-msgid "Wrong combination of method!"
-msgstr "¡Combinación inválida de métodos!"
+msgid "Warehouse must be defined for the quotation of sale \"%s\"."
+msgstr "Se debe definir el almacén para el presupuesto de la venta «%s»."
 
 msgctxt "error:stock.shipment.out.return:"
 msgid "You cannot reset to draft a move generated by a sale."
-msgstr ""
-"¡No puede restablecer a borrador un movimiento generado por una venta!"
+msgstr "No puede restablecer a borrador un movimiento generado por una venta."
 
 msgctxt "error:stock.shipment.out:"
 msgid "You cannot reset to draft a move generated by a sale."
@@ -55,16 +60,12 @@ msgstr "No puede restablecer a borrador un movimiento generado por una venta."
 
 msgctxt "field:account.invoice,sale_exception_state:"
 msgid "Exception State"
-msgstr "Estado de excepción"
+msgstr "Estado excepción"
 
 msgctxt "field:account.invoice,sales:"
 msgid "Sales"
 msgstr "Ventas"
 
-msgctxt "field:account.invoice.line,sale_lines:"
-msgid "Sale Lines"
-msgstr "Líneas de venta"
-
 msgctxt "field:product.template,delivery_time:"
 msgid "Delivery Time"
 msgstr "Tiempo de envío"
@@ -91,19 +92,19 @@ msgstr "ID"
 
 msgctxt "field:sale.configuration,rec_name:"
 msgid "Name"
-msgstr "Nombre del campo"
+msgstr "Nombre campo"
 
 msgctxt "field:sale.configuration,sale_invoice_method:"
 msgid "Sale Invoice Method"
-msgstr "Método de Facturación de Venta"
+msgstr "Método de facturación de venta"
 
 msgctxt "field:sale.configuration,sale_sequence:"
 msgid "Sale Reference Sequence"
-msgstr "Secuencia de Referencia de Venta"
+msgstr "Secuencia de referencia de venta"
 
 msgctxt "field:sale.configuration,sale_shipment_method:"
 msgid "Sale Shipment Method"
-msgstr "Método de Envío de Venta"
+msgstr "Método de envío de venta"
 
 msgctxt "field:sale.configuration,write_date:"
 msgid "Write Date"
@@ -123,7 +124,7 @@ msgstr "ID"
 
 msgctxt "field:sale.handle.invoice.exception.ask,recreate_invoices:"
 msgid "Recreate Invoices"
-msgstr "Rehacer facturas"
+msgstr "Recrear facturas"
 
 msgctxt "field:sale.handle.shipment.exception.ask,domain_moves:"
 msgid "Domain Moves"
@@ -135,11 +136,11 @@ msgstr "ID"
 
 msgctxt "field:sale.handle.shipment.exception.ask,recreate_moves:"
 msgid "Recreate Moves"
-msgstr "Rehacer movimientos"
+msgstr "Recrear movimientos"
 
 msgctxt "field:sale.line,amount:"
 msgid "Amount"
-msgstr "Cantidad"
+msgstr "Importe"
 
 msgctxt "field:sale.line,create_date:"
 msgid "Create Date"
@@ -151,7 +152,7 @@ msgstr "Usuario creación"
 
 msgctxt "field:sale.line,delivery_date:"
 msgid "Delivery Date"
-msgstr "Fecha de Entrega"
+msgstr "Fecha de entrega"
 
 msgctxt "field:sale.line,description:"
 msgid "Description"
@@ -159,7 +160,7 @@ msgstr "Descripción"
 
 msgctxt "field:sale.line,from_location:"
 msgid "From Location"
-msgstr "De ubicación"
+msgstr "Desde ubicación"
 
 msgctxt "field:sale.line,id:"
 msgid "ID"
@@ -171,11 +172,11 @@ msgstr "Líneas de factura"
 
 msgctxt "field:sale.line,move_done:"
 msgid "Moves Done"
-msgstr "Movimientos terminados"
+msgstr "Movimientos realizados"
 
 msgctxt "field:sale.line,move_exception:"
 msgid "Moves Exception"
-msgstr "Exepción de movimientos"
+msgstr "Excepción de movimientos"
 
 msgctxt "field:sale.line,moves:"
 msgid "Moves"
@@ -187,7 +188,7 @@ msgstr "Movimientos ignorados"
 
 msgctxt "field:sale.line,moves_recreated:"
 msgid "Recreated Moves"
-msgstr "Rehacer movimientos"
+msgstr "Movimientos recreados"
 
 msgctxt "field:sale.line,note:"
 msgid "Note"
@@ -235,7 +236,7 @@ msgstr "Unidad"
 
 msgctxt "field:sale.line,unit_digits:"
 msgid "Unit Digits"
-msgstr "Dígitos de la unidad"
+msgstr "Dígitos de unidad"
 
 msgctxt "field:sale.line,unit_price:"
 msgid "Unit Price"
@@ -253,38 +254,6 @@ msgctxt "field:sale.line,write_uid:"
 msgid "Write User"
 msgstr "Usuario modificación"
 
-msgctxt "field:sale.line-account.invoice.line,create_date:"
-msgid "Create Date"
-msgstr "Fecha creación"
-
-msgctxt "field:sale.line-account.invoice.line,create_uid:"
-msgid "Create User"
-msgstr "Usuario creación"
-
-msgctxt "field:sale.line-account.invoice.line,id:"
-msgid "ID"
-msgstr "ID"
-
-msgctxt "field:sale.line-account.invoice.line,invoice_line:"
-msgid "Invoice Line"
-msgstr "Línea de factura"
-
-msgctxt "field:sale.line-account.invoice.line,rec_name:"
-msgid "Name"
-msgstr "Nombre"
-
-msgctxt "field:sale.line-account.invoice.line,sale_line:"
-msgid "Sale Line"
-msgstr "Línea de venta"
-
-msgctxt "field:sale.line-account.invoice.line,write_date:"
-msgid "Write Date"
-msgstr "Fecha modificación"
-
-msgctxt "field:sale.line-account.invoice.line,write_uid:"
-msgid "Write User"
-msgstr "Usuario modificación"
-
 msgctxt "field:sale.line-account.tax,create_date:"
 msgid "Create Date"
 msgstr "Fecha creación"
@@ -403,7 +372,7 @@ msgstr "Divisa"
 
 msgctxt "field:sale.sale,currency_digits:"
 msgid "Currency Digits"
-msgstr "Dígitos de la divisa"
+msgstr "Dígitos de divisa"
 
 msgctxt "field:sale.sale,description:"
 msgid "Description"
@@ -435,7 +404,7 @@ msgstr "Facturas ignoradas"
 
 msgctxt "field:sale.sale,invoices_recreated:"
 msgid "Recreated Invoices"
-msgstr "Rehacer facturas"
+msgstr "Facturas recreadas"
 
 msgctxt "field:sale.sale,lines:"
 msgid "Lines"
@@ -479,7 +448,7 @@ msgstr "Método de envío"
 
 msgctxt "field:sale.sale,shipment_returns:"
 msgid "Shipment Returns"
-msgstr "Devolución de Envío"
+msgstr "Devolución de envío"
 
 msgctxt "field:sale.sale,shipment_state:"
 msgid "Shipment State"
@@ -499,7 +468,7 @@ msgstr "Impuesto"
 
 msgctxt "field:sale.sale,tax_amount_cache:"
 msgid "Tax Cache"
-msgstr "Caché de Impuestos"
+msgstr "Impuestos precalculado"
 
 msgctxt "field:sale.sale,total_amount:"
 msgid "Total"
@@ -507,15 +476,15 @@ msgstr "Total"
 
 msgctxt "field:sale.sale,total_amount_cache:"
 msgid "Total Tax"
-msgstr "Total de Impuestos"
+msgstr "Total impuestos"
 
 msgctxt "field:sale.sale,untaxed_amount:"
 msgid "Untaxed"
-msgstr "Sin impuesto"
+msgstr "Base imponible"
 
 msgctxt "field:sale.sale,untaxed_amount_cache:"
 msgid "Untaxed Cache"
-msgstr "Caché Libre de Impuestos"
+msgstr "Base imponible precalculado"
 
 msgctxt "field:sale.sale,warehouse:"
 msgid "Warehouse"
@@ -633,10 +602,6 @@ msgctxt "field:stock.move,sale_exception_state:"
 msgid "Exception State"
 msgstr "Estado excepción"
 
-msgctxt "field:stock.move,sale_line:"
-msgid "Sale Line"
-msgstr "Línea de venta"
-
 msgctxt "help:product.template,delivery_time:"
 msgid "In number of days"
 msgstr "En número de días"
@@ -661,7 +626,7 @@ msgstr "Devolución"
 
 msgctxt "model:ir.action,name:act_sale_configuration_form"
 msgid "Sales Configuration"
-msgstr "Configuración de Ventas"
+msgstr "Configuración de venta"
 
 msgctxt "model:ir.action,name:act_sale_form"
 msgid "Sales"
@@ -671,22 +636,6 @@ msgctxt "model:ir.action,name:act_sale_form2"
 msgid "Sales"
 msgstr "Ventas"
 
-msgctxt "model:ir.action,name:act_sale_form_confirmed"
-msgid "Confirmed Sales"
-msgstr "Ventas confirmadas"
-
-msgctxt "model:ir.action,name:act_sale_form_draft"
-msgid "Draft Sales"
-msgstr "Ventas en borrador"
-
-msgctxt "model:ir.action,name:act_sale_form_processing"
-msgid "Processing Sales"
-msgstr "Ventas en proceso"
-
-msgctxt "model:ir.action,name:act_sale_form_quotation"
-msgid "Quotation Sales"
-msgstr "Ventas presupuestadas"
-
 msgctxt "model:ir.action,name:act_shipment_form"
 msgid "Shipments"
 msgstr "Envíos"
@@ -701,11 +650,34 @@ msgstr "Gestionar excepción de factura"
 
 msgctxt "model:ir.action,name:wizard_return_sale"
 msgid "Create Return Sale"
-msgstr "Crear Devolución de Venta"
+msgstr "Crear devolución de venta"
 
 msgctxt "model:ir.action,name:wizard_shipment_handle_exception"
 msgid "Handle Shipment Exception"
-msgstr "Gestionar excepción de envio"
+msgstr "Gestionar excepción de envío"
+
+msgctxt "model:ir.action.act_window.domain,name:act_sale_form_domain_all"
+msgid "All"
+msgstr "Todo"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_sale_form_domain_confirmed"
+msgid "Confirmed"
+msgstr "Confirmado"
+
+msgctxt "model:ir.action.act_window.domain,name:act_sale_form_domain_draft"
+msgid "Draft"
+msgstr "Borrador"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_sale_form_domain_processing"
+msgid "Processing"
+msgstr "En proceso"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_sale_form_domain_quotation"
+msgid "Quotation"
+msgstr "Presupuesto"
 
 msgctxt "model:ir.sequence,name:sequence_sale"
 msgid "Sale"
@@ -725,60 +697,40 @@ msgstr "Entidades asociadas a ventas"
 
 msgctxt "model:ir.ui.menu,name:menu_sale"
 msgid "Sales"
-msgstr "Gestión de ventas"
+msgstr "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"
 msgstr "Ventas"
 
-msgctxt "model:ir.ui.menu,name:menu_sale_form_confirmed"
-msgid "Confirmed Sales"
-msgstr "Ventas confirmadas"
-
-msgctxt "model:ir.ui.menu,name:menu_sale_form_draft"
-msgid "Draft Sales"
-msgstr "Ventas en borrador"
-
-msgctxt "model:ir.ui.menu,name:menu_sale_form_processing"
-msgid "Processing Sales"
-msgstr "Ventas en proceso"
-
-msgctxt "model:ir.ui.menu,name:menu_sale_form_quotation"
-msgid "Quotation Sales"
-msgstr "Ventas presupuestadas"
-
 msgctxt "model:res.group,name:group_sale"
 msgid "Sales"
 msgstr "Venta"
 
 msgctxt "model:res.group,name:group_sale_admin"
 msgid "Sales Administrator"
-msgstr "Administrador de Ventas"
+msgstr "Administrador de ventas"
 
 msgctxt "model:sale.configuration,name:"
 msgid "Sale Configuration"
-msgstr "Configuración de Venta"
+msgstr "Configuración de venta"
 
 msgctxt "model:sale.handle.invoice.exception.ask,name:"
 msgid "Handle Invoice Exception"
-msgstr "Factura de excepción - Petición"
+msgstr "Gestionar excepción de factura"
 
 msgctxt "model:sale.handle.shipment.exception.ask,name:"
 msgid "Handle Shipment Exception"
-msgstr "Envio de excepción - Petición"
+msgstr "Gestionar excepción de envío"
 
 msgctxt "model:sale.line,name:"
 msgid "Sale Line"
 msgstr "Línea de venta"
 
-msgctxt "model:sale.line-account.invoice.line,name:"
-msgid "Sale Line - Invoice Line"
-msgstr "Línea de venta - Línea de factura"
-
 msgctxt "model:sale.line-account.tax,name:"
 msgid "Sale Line - Tax"
 msgstr "Línea de venta - Impuesto"
@@ -809,7 +761,7 @@ msgstr "Venta - Factura recreada"
 
 msgctxt "odt:sale.sale:"
 msgid "Amount"
-msgstr "Cantidad"
+msgstr "Importe"
 
 msgctxt "odt:sale.sale:"
 msgid "Date:"
@@ -825,7 +777,7 @@ msgstr "Descripción:"
 
 msgctxt "odt:sale.sale:"
 msgid "Draft Sale Order"
-msgstr "Orden de venta en borrador"
+msgstr "Ordenes de venta en borrador"
 
 msgctxt "odt:sale.sale:"
 msgid "E-Mail:"
@@ -885,7 +837,7 @@ msgstr "Ignorado"
 
 msgctxt "selection:account.invoice,sale_exception_state:"
 msgid "Recreated"
-msgstr "Rehecho"
+msgstr "Recreada"
 
 msgctxt "selection:sale.configuration,sale_invoice_method:"
 msgid "Manual"
@@ -897,7 +849,7 @@ msgstr "Al procesar la orden"
 
 msgctxt "selection:sale.configuration,sale_invoice_method:"
 msgid "On Shipment Sent"
-msgstr "Al Enviarlo"
+msgstr "Al enviarlo"
 
 msgctxt "selection:sale.configuration,sale_shipment_method:"
 msgid "Manual"
@@ -937,7 +889,7 @@ msgstr "Al procesar la orden"
 
 msgctxt "selection:sale.sale,invoice_method:"
 msgid "On Shipment Sent"
-msgstr "Al Enviarlo"
+msgstr "Al enviarlo"
 
 msgctxt "selection:sale.sale,invoice_state:"
 msgid "Exception"
@@ -993,7 +945,7 @@ msgstr "Confirmado"
 
 msgctxt "selection:sale.sale,state:"
 msgid "Done"
-msgstr "Terminada"
+msgstr "Realizado"
 
 msgctxt "selection:sale.sale,state:"
 msgid "Draft"
@@ -1001,7 +953,7 @@ msgstr "Borrador"
 
 msgctxt "selection:sale.sale,state:"
 msgid "Processing"
-msgstr "Procesamiento"
+msgstr "En proceso"
 
 msgctxt "selection:sale.sale,state:"
 msgid "Quotation"
@@ -1017,11 +969,7 @@ msgstr "Ignorado"
 
 msgctxt "selection:stock.move,sale_exception_state:"
 msgid "Recreated"
-msgstr "Rehacer"
-
-msgctxt "view:product.product:"
-msgid "Customers"
-msgstr "Clientes"
+msgstr "Recreado"
 
 msgctxt "view:product.product:"
 msgid "Products"
@@ -1033,27 +981,23 @@ msgstr "Clientes"
 
 msgctxt "view:sale.configuration:"
 msgid "Sale Configuration"
-msgstr "Configuración de Venta"
+msgstr "Configuración de venta"
 
 msgctxt "view:sale.handle.invoice.exception.ask:"
 msgid "Choose invoices to recreate"
-msgstr "Escoja una factura a rehacer"
+msgstr "Seleccione facturas a recrear"
 
 msgctxt "view:sale.handle.invoice.exception.ask:"
 msgid "Handle Invoice Exception"
-msgstr "Excepción de manejo de factura"
+msgstr "Gestionar excepción de factura"
 
 msgctxt "view:sale.handle.shipment.exception.ask:"
 msgid "Choose move to recreate"
-msgstr "Escoja un movimiento a rehacer"
+msgstr "Seleccione movimientos a recrear"
 
 msgctxt "view:sale.handle.shipment.exception.ask:"
 msgid "Handle shipment Exception"
-msgstr "Manejar excepción de envio"
-
-msgctxt "view:sale.handle.shipment.exception.ask:"
-msgid "Recreate Moves"
-msgstr "Recrear movimientos"
+msgstr "Gestionar excepción de envío"
 
 msgctxt "view:sale.line:"
 msgid "General"
@@ -1064,10 +1008,6 @@ msgid "Notes"
 msgstr "Notas"
 
 msgctxt "view:sale.line:"
-msgid "Products"
-msgstr "Productos"
-
-msgctxt "view:sale.line:"
 msgid "Sale Line"
 msgstr "Línea de venta"
 
@@ -1089,29 +1029,17 @@ msgstr "Borrador"
 
 msgctxt "view:sale.sale:"
 msgid "Handle Invoice Exception"
-msgstr "Manejar excepción de factura"
+msgstr "Gestionar excepción de factura"
 
 msgctxt "view:sale.sale:"
 msgid "Handle Shipment Exception"
-msgstr "Manejar excepción de envio"
-
-msgctxt "view:sale.sale:"
-msgid "Ignore Invoice Exception"
-msgstr "Ignorar excepción de factura"
+msgstr "Gestionar excepción de envío"
 
 msgctxt "view:sale.sale:"
 msgid "Invoices"
 msgstr "Facturas"
 
 msgctxt "view:sale.sale:"
-msgid "Lines"
-msgstr "Líneas"
-
-msgctxt "view:sale.sale:"
-msgid "Moves"
-msgstr "Movimientos"
-
-msgctxt "view:sale.sale:"
 msgid "Other Info"
 msgstr "Información adicional"
 
@@ -1120,10 +1048,6 @@ msgid "Process"
 msgstr "Procesar"
 
 msgctxt "view:sale.sale:"
-msgid "Quotation"
-msgstr "Presupuesto"
-
-msgctxt "view:sale.sale:"
 msgid "Quote"
 msgstr "Presupuestar"
 
diff --git a/locale/es_CO.po b/locale/es_CO.po
index 5326fdb..e4821ed 100644
--- a/locale/es_CO.po
+++ b/locale/es_CO.po
@@ -3,7 +3,7 @@ msgid ""
 msgstr "Content-Type: text/plain; charset=utf-8\n"
 
 msgctxt "error:account.invoice:"
-msgid "You can not delete invoices that come from a sale!"
+msgid "You can not delete invoices that come from a sale."
 msgstr "No puede eliminar facturas que provienen de una venta."
 
 msgctxt "error:account.invoice:"
@@ -11,36 +11,47 @@ msgid "You cannot reset to draft an invoice generated by a sale."
 msgstr "No puede restablecer un movimiento a borrador generado por una venta."
 
 msgctxt "error:sale.line:"
-msgid "It misses an \"Account Revenue\" on product \"%s\"!"
-msgstr "Al producto \"%s\" le falta una \"Cuenta de Ingresos\"."
+msgid "Product \"%(product)s\" of sale %(sale)s misses a revenue account."
+msgstr ""
+"Al producto \"%(product)s\" de la venta \"%(sale)s\" le falta definir una "
+"cuenta de ingresos."
 
 msgctxt "error:sale.line:"
-msgid "It misses an \"account Revenue\" default property!"
-msgstr "Falta una propiedad por defecto de \"Cuenta de Ingresos\"."
+msgid "Sale \"%(sale)s\" is missing the customer location in line \"%(line)s\"."
+msgstr ""
+"A la venta \"%(sale)s\" le falta la bodega del cliente en la línea "
+"\"%(line)s\"."
 
 msgctxt "error:sale.line:"
-msgid "The customer location is required!"
-msgstr "La locación de cliente es requerida!"
+msgid "Sale \"%(sale)s\" misses an \"account revenue\" default property."
+msgstr ""
+"A la venta \"%(sale)s\" le falta la propiedad por defecto \"Cuenta de "
+"Ingresos\"."
 
 msgctxt "error:sale.sale:"
-msgid "Invoice and Shipment addresses must be defined for the quotation."
-msgstr "La dirección de factura y envío debe ser definida en la cotización."
+msgid "Invalid combination of shipment and invoicing methods on sale \"%s\"."
+msgstr ""
+"Inválida combinación de métodos de envío y facturación en la venta \"%s\"."
 
 msgctxt "error:sale.sale:"
-msgid "It misses an \"Account Receivable\" on the party \"%s\"!"
-msgstr "Al tercero \"%s\" le falta una \"Cuenta por Cobrar\"."
+msgid ""
+"Invoice and Shipment addresses must be defined for the quotation of sale "
+"\"%s\"."
+msgstr ""
+"La dirección de facturación y envío debe ser definida en la cotización de la"
+" venta \"%s\"."
 
 msgctxt "error:sale.sale:"
-msgid "Sale \"%s\" must be cancelled before deletion!"
-msgstr "La venta \"%s\" debe ser cancelada antes de ser eliminada."
+msgid "It misses an \"Account Receivable\" on the party \"%s\"."
+msgstr "Falta definir la \"Cuenta por Cobrar\" del tercero \"%s\"."
 
 msgctxt "error:sale.sale:"
-msgid "Warehouse must be defined for the quotation."
-msgstr "Debe indicar un almacén en el presupuesto."
+msgid "Sale \"%s\" must be cancelled before deletion."
+msgstr "La venta \"%s\" debe ser cancelada antes de ser eliminada."
 
 msgctxt "error:sale.sale:"
-msgid "Wrong combination of method!"
-msgstr "Combinación no válida de métodos!"
+msgid "Warehouse must be defined for the quotation of sale \"%s\"."
+msgstr "El depósito debe ser definido en la cotización para la venta \"%s\"."
 
 msgctxt "error:stock.shipment.out.return:"
 msgid "You cannot reset to draft a move generated by a sale."
@@ -58,10 +69,6 @@ msgctxt "field:account.invoice,sales:"
 msgid "Sales"
 msgstr "Ventas"
 
-msgctxt "field:account.invoice.line,sale_lines:"
-msgid "Sale Lines"
-msgstr "Líneas de Venta"
-
 msgctxt "field:product.template,delivery_time:"
 msgid "Delivery Time"
 msgstr "Tiempo de Entrega"
@@ -76,11 +83,11 @@ msgstr "UdM de Venta"
 
 msgctxt "field:sale.configuration,create_date:"
 msgid "Create Date"
-msgstr "Fecha creación"
+msgstr "Fecha de Creación"
 
 msgctxt "field:sale.configuration,create_uid:"
 msgid "Create User"
-msgstr "Usuario creación"
+msgstr "Creado por Usuario"
 
 msgctxt "field:sale.configuration,id:"
 msgid "ID"
@@ -92,27 +99,27 @@ msgstr "Nombre"
 
 msgctxt "field:sale.configuration,sale_invoice_method:"
 msgid "Sale Invoice Method"
-msgstr "Método de facturación"
+msgstr "Método de Facturación"
 
 msgctxt "field:sale.configuration,sale_sequence:"
 msgid "Sale Reference Sequence"
-msgstr "Secuencia pedidos de venta"
+msgstr "Secuencia Pedidos de Venta"
 
 msgctxt "field:sale.configuration,sale_shipment_method:"
 msgid "Sale Shipment Method"
-msgstr "Método de envío"
+msgstr "Método de Envío"
 
 msgctxt "field:sale.configuration,write_date:"
 msgid "Write Date"
-msgstr "Fecha modificación"
+msgstr "Fecha de Modificación"
 
 msgctxt "field:sale.configuration,write_uid:"
 msgid "Write User"
-msgstr "Usuario modificación"
+msgstr "Modificado por Usuario"
 
 msgctxt "field:sale.handle.invoice.exception.ask,domain_invoices:"
 msgid "Domain Invoices"
-msgstr "Dominio de facturas"
+msgstr "Dominio de Facturas"
 
 msgctxt "field:sale.handle.invoice.exception.ask,id:"
 msgid "ID"
@@ -120,11 +127,11 @@ msgstr "ID"
 
 msgctxt "field:sale.handle.invoice.exception.ask,recreate_invoices:"
 msgid "Recreate Invoices"
-msgstr "Recrear facturas"
+msgstr "Recrear Facturas"
 
 msgctxt "field:sale.handle.shipment.exception.ask,domain_moves:"
 msgid "Domain Moves"
-msgstr "Dominio de movimientos"
+msgstr "Dominio de Movimientos"
 
 msgctxt "field:sale.handle.shipment.exception.ask,id:"
 msgid "ID"
@@ -132,7 +139,7 @@ msgstr "ID"
 
 msgctxt "field:sale.handle.shipment.exception.ask,recreate_moves:"
 msgid "Recreate Moves"
-msgstr "Recrear movimientos"
+msgstr "Recrear Movimientos"
 
 msgctxt "field:sale.line,amount:"
 msgid "Amount"
@@ -140,11 +147,11 @@ msgstr "Cantidad"
 
 msgctxt "field:sale.line,create_date:"
 msgid "Create Date"
-msgstr "Fecha creación"
+msgstr "Fecha de Creación"
 
 msgctxt "field:sale.line,create_uid:"
 msgid "Create User"
-msgstr "Usuario creación"
+msgstr "Creado por Usuario"
 
 msgctxt "field:sale.line,delivery_date:"
 msgid "Delivery Date"
@@ -156,7 +163,7 @@ msgstr "Descripción"
 
 msgctxt "field:sale.line,from_location:"
 msgid "From Location"
-msgstr "Desde locación"
+msgstr "Desde Bodega"
 
 msgctxt "field:sale.line,id:"
 msgid "ID"
@@ -164,15 +171,15 @@ msgstr "ID"
 
 msgctxt "field:sale.line,invoice_lines:"
 msgid "Invoice Lines"
-msgstr "Líneas de factura"
+msgstr "Líneas de Factura"
 
 msgctxt "field:sale.line,move_done:"
 msgid "Moves Done"
-msgstr "Movimientos realizados"
+msgstr "Movimientos Hechos"
 
 msgctxt "field:sale.line,move_exception:"
 msgid "Moves Exception"
-msgstr "Exepción de movimientos"
+msgstr "Excepción de Movimientos"
 
 msgctxt "field:sale.line,moves:"
 msgid "Moves"
@@ -180,11 +187,11 @@ msgstr "Movimientos"
 
 msgctxt "field:sale.line,moves_ignored:"
 msgid "Ignored Moves"
-msgstr "Movimientos ignorados"
+msgstr "Movimientos Ignorados"
 
 msgctxt "field:sale.line,moves_recreated:"
 msgid "Recreated Moves"
-msgstr "Movimientos recreados"
+msgstr "Movimientos Recreados"
 
 msgctxt "field:sale.line,note:"
 msgid "Note"
@@ -220,7 +227,7 @@ msgstr "Impuestos"
 
 msgctxt "field:sale.line,to_location:"
 msgid "To Location"
-msgstr "A locación"
+msgstr "A Bodega"
 
 msgctxt "field:sale.line,type:"
 msgid "Type"
@@ -240,55 +247,23 @@ msgstr "Precio Unitario"
 
 msgctxt "field:sale.line,warehouse:"
 msgid "Warehouse"
-msgstr "Almacén"
+msgstr "Depósito"
 
 msgctxt "field:sale.line,write_date:"
 msgid "Write Date"
-msgstr "Fecha modificación"
+msgstr "Fecha de Modificación"
 
 msgctxt "field:sale.line,write_uid:"
 msgid "Write User"
-msgstr "Usuario modificación"
-
-msgctxt "field:sale.line-account.invoice.line,create_date:"
-msgid "Create Date"
-msgstr "Fecha creación"
-
-msgctxt "field:sale.line-account.invoice.line,create_uid:"
-msgid "Create User"
-msgstr "Usuario creación"
-
-msgctxt "field:sale.line-account.invoice.line,id:"
-msgid "ID"
-msgstr "ID"
-
-msgctxt "field:sale.line-account.invoice.line,invoice_line:"
-msgid "Invoice Line"
-msgstr "Línea de factura"
-
-msgctxt "field:sale.line-account.invoice.line,rec_name:"
-msgid "Name"
-msgstr "Nombre"
-
-msgctxt "field:sale.line-account.invoice.line,sale_line:"
-msgid "Sale Line"
-msgstr "Línea de venta"
-
-msgctxt "field:sale.line-account.invoice.line,write_date:"
-msgid "Write Date"
-msgstr "Fecha modificación"
-
-msgctxt "field:sale.line-account.invoice.line,write_uid:"
-msgid "Write User"
-msgstr "Usuario modificación"
+msgstr "Modificado por Usuario"
 
 msgctxt "field:sale.line-account.tax,create_date:"
 msgid "Create Date"
-msgstr "Fecha creación"
+msgstr "Fecha de Creación"
 
 msgctxt "field:sale.line-account.tax,create_uid:"
 msgid "Create User"
-msgstr "Usuario creación"
+msgstr "Creado por Usuario"
 
 msgctxt "field:sale.line-account.tax,id:"
 msgid "ID"
@@ -308,19 +283,19 @@ msgstr "Impuesto"
 
 msgctxt "field:sale.line-account.tax,write_date:"
 msgid "Write Date"
-msgstr "Fecha modificación"
+msgstr "Fecha de Modificación"
 
 msgctxt "field:sale.line-account.tax,write_uid:"
 msgid "Write User"
-msgstr "Usuario modificación"
+msgstr "Modificado por Usuario"
 
 msgctxt "field:sale.line-ignored-stock.move,create_date:"
 msgid "Create Date"
-msgstr "Fecha creación"
+msgstr "Fecha de Creación"
 
 msgctxt "field:sale.line-ignored-stock.move,create_uid:"
 msgid "Create User"
-msgstr "Usuario creación"
+msgstr "Creado por Usuario"
 
 msgctxt "field:sale.line-ignored-stock.move,id:"
 msgid "ID"
@@ -336,23 +311,23 @@ msgstr "Nombre"
 
 msgctxt "field:sale.line-ignored-stock.move,sale_line:"
 msgid "Sale Line"
-msgstr "Línea de venta"
+msgstr "Línea de Venta"
 
 msgctxt "field:sale.line-ignored-stock.move,write_date:"
 msgid "Write Date"
-msgstr "Fecha modificación"
+msgstr "Fecha de Modificación"
 
 msgctxt "field:sale.line-ignored-stock.move,write_uid:"
 msgid "Write User"
-msgstr "Usuario modificación"
+msgstr "Modificado por Usuario"
 
 msgctxt "field:sale.line-recreated-stock.move,create_date:"
 msgid "Create Date"
-msgstr "Fecha creación"
+msgstr "Fecha de Creación"
 
 msgctxt "field:sale.line-recreated-stock.move,create_uid:"
 msgid "Create User"
-msgstr "Usuario creación"
+msgstr "Creado por Usuario"
 
 msgctxt "field:sale.line-recreated-stock.move,id:"
 msgid "ID"
@@ -368,15 +343,15 @@ msgstr "Nombre"
 
 msgctxt "field:sale.line-recreated-stock.move,sale_line:"
 msgid "Sale Line"
-msgstr "Línea de venta"
+msgstr "Línea de Venta"
 
 msgctxt "field:sale.line-recreated-stock.move,write_date:"
 msgid "Write Date"
-msgstr "Fecha modificación"
+msgstr "Fecha de Modificación"
 
 msgctxt "field:sale.line-recreated-stock.move,write_uid:"
 msgid "Write User"
-msgstr "Usuario modificación"
+msgstr "Modificado por Usuario"
 
 msgctxt "field:sale.sale,comment:"
 msgid "Comment"
@@ -388,11 +363,11 @@ msgstr "Compañia"
 
 msgctxt "field:sale.sale,create_date:"
 msgid "Create Date"
-msgstr "Fecha creación"
+msgstr "Fecha de Creación"
 
 msgctxt "field:sale.sale,create_uid:"
 msgid "Create User"
-msgstr "Usuario creación"
+msgstr "Creado por Usuario"
 
 msgctxt "field:sale.sale,currency:"
 msgid "Currency"
@@ -420,7 +395,7 @@ msgstr "Método de Facturación"
 
 msgctxt "field:sale.sale,invoice_state:"
 msgid "Invoice State"
-msgstr "Estado factura"
+msgstr "Estado Factura"
 
 msgctxt "field:sale.sale,invoices:"
 msgid "Invoices"
@@ -428,11 +403,11 @@ msgstr "Facturas"
 
 msgctxt "field:sale.sale,invoices_ignored:"
 msgid "Ignored Invoices"
-msgstr "Facturas ignoradas"
+msgstr "Facturas Ignoradas"
 
 msgctxt "field:sale.sale,invoices_recreated:"
 msgid "Recreated Invoices"
-msgstr "Facturas recreadas"
+msgstr "Facturas Recreadas"
 
 msgctxt "field:sale.sale,lines:"
 msgid "Lines"
@@ -452,7 +427,7 @@ msgstr "Idioma del Tercero"
 
 msgctxt "field:sale.sale,payment_term:"
 msgid "Payment Term"
-msgstr "Plazo de Pago"
+msgstr "Forma de Pago"
 
 msgctxt "field:sale.sale,rec_name:"
 msgid "Name"
@@ -464,15 +439,15 @@ msgstr "Referencia"
 
 msgctxt "field:sale.sale,sale_date:"
 msgid "Sale Date"
-msgstr "Fecha de venta"
+msgstr "Fecha de Venta"
 
 msgctxt "field:sale.sale,shipment_address:"
 msgid "Shipment Address"
-msgstr "Dirección de envío"
+msgstr "Dirección de Envío"
 
 msgctxt "field:sale.sale,shipment_method:"
 msgid "Shipment Method"
-msgstr "Método de envío"
+msgstr "Método de Envío"
 
 msgctxt "field:sale.sale,shipment_returns:"
 msgid "Shipment Returns"
@@ -516,23 +491,23 @@ msgstr "Base sin Impuesto Precalculada"
 
 msgctxt "field:sale.sale,warehouse:"
 msgid "Warehouse"
-msgstr "Almacén"
+msgstr "Depósito"
 
 msgctxt "field:sale.sale,write_date:"
 msgid "Write Date"
-msgstr "Fecha modificación"
+msgstr "Fecha de Modificación"
 
 msgctxt "field:sale.sale,write_uid:"
 msgid "Write User"
-msgstr "Usuario modificación"
+msgstr "Modificado por Usuario"
 
 msgctxt "field:sale.sale-account.invoice,create_date:"
 msgid "Create Date"
-msgstr "Fecha creación"
+msgstr "Fecha de Creación"
 
 msgctxt "field:sale.sale-account.invoice,create_uid:"
 msgid "Create User"
-msgstr "Usuario creación"
+msgstr "Creado por Usuario"
 
 msgctxt "field:sale.sale-account.invoice,id:"
 msgid "ID"
@@ -552,19 +527,19 @@ msgstr "Venta"
 
 msgctxt "field:sale.sale-account.invoice,write_date:"
 msgid "Write Date"
-msgstr "Fecha modificación"
+msgstr "Fecha de Modificación"
 
 msgctxt "field:sale.sale-account.invoice,write_uid:"
 msgid "Write User"
-msgstr "Usuario modificación"
+msgstr "Modificado por Usuario"
 
 msgctxt "field:sale.sale-ignored-account.invoice,create_date:"
 msgid "Create Date"
-msgstr "Fecha creación"
+msgstr "Fecha de Creación"
 
 msgctxt "field:sale.sale-ignored-account.invoice,create_uid:"
 msgid "Create User"
-msgstr "Usuario creación"
+msgstr "Creado por Usuario"
 
 msgctxt "field:sale.sale-ignored-account.invoice,id:"
 msgid "ID"
@@ -584,19 +559,19 @@ msgstr "Venta"
 
 msgctxt "field:sale.sale-ignored-account.invoice,write_date:"
 msgid "Write Date"
-msgstr "Fecha modificación"
+msgstr "Fecha de Modificación"
 
 msgctxt "field:sale.sale-ignored-account.invoice,write_uid:"
 msgid "Write User"
-msgstr "Usuario modificación"
+msgstr "Modificado por Usuario"
 
 msgctxt "field:sale.sale-recreated-account.invoice,create_date:"
 msgid "Create Date"
-msgstr "Fecha creación"
+msgstr "Fecha de Creación"
 
 msgctxt "field:sale.sale-recreated-account.invoice,create_uid:"
 msgid "Create User"
-msgstr "Usuario creación"
+msgstr "Creado por Usuario"
 
 msgctxt "field:sale.sale-recreated-account.invoice,id:"
 msgid "ID"
@@ -616,11 +591,11 @@ msgstr "Venta"
 
 msgctxt "field:sale.sale-recreated-account.invoice,write_date:"
 msgid "Write Date"
-msgstr "Fecha modificación"
+msgstr "Fecha de Modificación"
 
 msgctxt "field:sale.sale-recreated-account.invoice,write_uid:"
 msgid "Write User"
-msgstr "Usuario modificación"
+msgstr "Modificado por Usuario"
 
 msgctxt "field:stock.move,sale:"
 msgid "Sale"
@@ -628,11 +603,7 @@ msgstr "Venta"
 
 msgctxt "field:stock.move,sale_exception_state:"
 msgid "Exception State"
-msgstr "Estado excepción"
-
-msgctxt "field:stock.move,sale_line:"
-msgid "Sale Line"
-msgstr "Línea de Venta"
+msgstr "Estado Excepción"
 
 msgctxt "help:product.template,delivery_time:"
 msgid "In number of days"
@@ -650,7 +621,7 @@ msgstr "Facturas"
 
 msgctxt "model:ir.action,name:act_open_customer"
 msgid "Parties associated to Sales"
-msgstr "Terceros asociados a ventas"
+msgstr "Clientes"
 
 msgctxt "model:ir.action,name:act_return_form"
 msgid "Returns"
@@ -668,22 +639,6 @@ msgctxt "model:ir.action,name:act_sale_form2"
 msgid "Sales"
 msgstr "Ventas"
 
-msgctxt "model:ir.action,name:act_sale_form_confirmed"
-msgid "Confirmed Sales"
-msgstr "Ventas Confirmadas"
-
-msgctxt "model:ir.action,name:act_sale_form_draft"
-msgid "Draft Sales"
-msgstr "Ventas en Borrador"
-
-msgctxt "model:ir.action,name:act_sale_form_processing"
-msgid "Processing Sales"
-msgstr "Ventas en Proceso"
-
-msgctxt "model:ir.action,name:act_sale_form_quotation"
-msgid "Quotation Sales"
-msgstr "Ventas en Cotización"
-
 msgctxt "model:ir.action,name:act_shipment_form"
 msgid "Shipments"
 msgstr "Envios"
@@ -694,7 +649,7 @@ msgstr "Venta"
 
 msgctxt "model:ir.action,name:wizard_invoice_handle_exception"
 msgid "Handle Invoice Exception"
-msgstr "Gestionar excepción de factura"
+msgstr "Gestionar Excepción de Factura"
 
 msgctxt "model:ir.action,name:wizard_return_sale"
 msgid "Create Return Sale"
@@ -704,6 +659,29 @@ msgctxt "model:ir.action,name:wizard_shipment_handle_exception"
 msgid "Handle Shipment Exception"
 msgstr "Gestionar Excepción de Envío"
 
+msgctxt "model:ir.action.act_window.domain,name:act_sale_form_domain_all"
+msgid "All"
+msgstr "Todo"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_sale_form_domain_confirmed"
+msgid "Confirmed"
+msgstr "Confirmada"
+
+msgctxt "model:ir.action.act_window.domain,name:act_sale_form_domain_draft"
+msgid "Draft"
+msgstr "Borrador"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_sale_form_domain_processing"
+msgid "Processing"
+msgstr "En Proceso"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_sale_form_domain_quotation"
+msgid "Quotation"
+msgstr "Cotización"
+
 msgctxt "model:ir.sequence,name:sequence_sale"
 msgid "Sale"
 msgstr "Venta"
@@ -718,7 +696,7 @@ msgstr "Configuración"
 
 msgctxt "model:ir.ui.menu,name:menu_customer"
 msgid "Parties associated to Sales"
-msgstr "Terceros asociados a ventas"
+msgstr "Clientes"
 
 msgctxt "model:ir.ui.menu,name:menu_sale"
 msgid "Sales"
@@ -732,22 +710,6 @@ msgctxt "model:ir.ui.menu,name:menu_sale_form"
 msgid "Sales"
 msgstr "Ventas"
 
-msgctxt "model:ir.ui.menu,name:menu_sale_form_confirmed"
-msgid "Confirmed Sales"
-msgstr "Ventas Confirmadas"
-
-msgctxt "model:ir.ui.menu,name:menu_sale_form_draft"
-msgid "Draft Sales"
-msgstr "Ventas en Borrador"
-
-msgctxt "model:ir.ui.menu,name:menu_sale_form_processing"
-msgid "Processing Sales"
-msgstr "Ventas en Proceso"
-
-msgctxt "model:ir.ui.menu,name:menu_sale_form_quotation"
-msgid "Quotation Sales"
-msgstr "Ventas Cotizadas"
-
 msgctxt "model:res.group,name:group_sale"
 msgid "Sales"
 msgstr "Ventas"
@@ -762,31 +724,27 @@ msgstr "Configuración Ventas"
 
 msgctxt "model:sale.handle.invoice.exception.ask,name:"
 msgid "Handle Invoice Exception"
-msgstr "Gestionar excepción de factura"
+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 Envío"
 
 msgctxt "model:sale.line,name:"
 msgid "Sale Line"
-msgstr "Línea de venta"
-
-msgctxt "model:sale.line-account.invoice.line,name:"
-msgid "Sale Line - Invoice Line"
-msgstr "Línea de venta - Línea de factura"
+msgstr "Línea de Venta"
 
 msgctxt "model:sale.line-account.tax,name:"
 msgid "Sale Line - Tax"
-msgstr "Línea de venta - Impuesto"
+msgstr "Línea de Venta - Impuesto"
 
 msgctxt "model:sale.line-ignored-stock.move,name:"
 msgid "Sale Line - Ignored Move"
-msgstr "Línea de venta - Movimiento ignorado"
+msgstr "Línea de Venta - Movimiento Ignorado"
 
 msgctxt "model:sale.line-recreated-stock.move,name:"
 msgid "Sale Line - Recreated Move"
-msgstr "Línea de venta - Movimiento recreado"
+msgstr "Línea de Venta - Movimiento Recreado"
 
 msgctxt "model:sale.sale,name:"
 msgid "Sale"
@@ -798,11 +756,11 @@ msgstr "Venta - Factura"
 
 msgctxt "model:sale.sale-ignored-account.invoice,name:"
 msgid "Sale - Ignored Invoice"
-msgstr "Venta - Factura ignorada"
+msgstr "Venta - Factura Ignorada"
 
 msgctxt "model:sale.sale-recreated-account.invoice,name:"
 msgid "Sale - Recreated Invoice"
-msgstr "Venta - Factura recreada"
+msgstr "Venta - Factura Recreada"
 
 msgctxt "odt:sale.sale:"
 msgid "Amount"
@@ -822,7 +780,7 @@ msgstr "Descripción:"
 
 msgctxt "odt:sale.sale:"
 msgid "Draft Sale Order"
-msgstr "Pedido de Venta en Borrador"
+msgstr "Pedido en Borrador"
 
 msgctxt "odt:sale.sale:"
 msgid "E-Mail:"
@@ -842,7 +800,7 @@ msgstr "Cotización Nº:"
 
 msgctxt "odt:sale.sale:"
 msgid "Sale Order N°:"
-msgstr "Pedido de venta Nº:"
+msgstr "Pedido de Venta Nº:"
 
 msgctxt "odt:sale.sale:"
 msgid "Taxes"
@@ -862,7 +820,7 @@ msgstr "Total:"
 
 msgctxt "odt:sale.sale:"
 msgid "Unit Price"
-msgstr "Precio unidad"
+msgstr "Precio Unitario"
 
 msgctxt "odt:sale.sale:"
 msgid "VAT Number:"
@@ -875,7 +833,7 @@ msgstr "NIT:"
 #, fuzzy
 msgctxt "selection:account.invoice,sale_exception_state:"
 msgid ""
-msgstr "Cuenta de impuesto"
+msgstr "Punto de Orden"
 
 msgctxt "selection:account.invoice,sale_exception_state:"
 msgid "Ignored"
@@ -891,11 +849,11 @@ msgstr "Manual"
 
 msgctxt "selection:sale.configuration,sale_invoice_method:"
 msgid "On Order Processed"
-msgstr "Al procesar el pedido"
+msgstr "Al Procesar Pedido"
 
 msgctxt "selection:sale.configuration,sale_invoice_method:"
 msgid "On Shipment Sent"
-msgstr "Al enviar"
+msgstr "Al Enviar"
 
 msgctxt "selection:sale.configuration,sale_shipment_method:"
 msgid "Manual"
@@ -903,11 +861,11 @@ msgstr "Manual"
 
 msgctxt "selection:sale.configuration,sale_shipment_method:"
 msgid "On Invoice Paid"
-msgstr "Al pagar la factura"
+msgstr "Al Pagar Factura"
 
 msgctxt "selection:sale.configuration,sale_shipment_method:"
 msgid "On Order Processed"
-msgstr "Al procesar el pedido"
+msgstr "Al Procesar Pedido"
 
 msgctxt "selection:sale.line,type:"
 msgid "Comment"
@@ -931,11 +889,11 @@ msgstr "Manual"
 
 msgctxt "selection:sale.sale,invoice_method:"
 msgid "On Order Processed"
-msgstr "Al procesar el pedido"
+msgstr "Al Procesar Pedido"
 
 msgctxt "selection:sale.sale,invoice_method:"
 msgid "On Shipment Sent"
-msgstr "Al enviar"
+msgstr "Al Enviar"
 
 msgctxt "selection:sale.sale,invoice_state:"
 msgid "Exception"
@@ -959,11 +917,11 @@ msgstr "Manual"
 
 msgctxt "selection:sale.sale,shipment_method:"
 msgid "On Invoice Paid"
-msgstr "Al pagar la factura"
+msgstr "Al Pagar Factura"
 
 msgctxt "selection:sale.sale,shipment_method:"
 msgid "On Order Processed"
-msgstr "Al procesar el pedido"
+msgstr "Al Procesar Pedido"
 
 msgctxt "selection:sale.sale,shipment_state:"
 msgid "Exception"
@@ -1005,9 +963,10 @@ msgctxt "selection:sale.sale,state:"
 msgid "Quotation"
 msgstr "Cotización"
 
+#, fuzzy
 msgctxt "selection:stock.move,sale_exception_state:"
 msgid ""
-msgstr "Cuenta de impuesto"
+msgstr "Punto de Orden"
 
 msgctxt "selection:stock.move,sale_exception_state:"
 msgid "Ignored"
@@ -1018,10 +977,6 @@ msgid "Recreated"
 msgstr "Recreado"
 
 msgctxt "view:product.product:"
-msgid "Customers"
-msgstr "Clientes"
-
-msgctxt "view:product.product:"
 msgid "Products"
 msgstr "Productos"
 
@@ -1039,7 +994,7 @@ msgstr "Seleccione facturas a recrear"
 
 msgctxt "view:sale.handle.invoice.exception.ask:"
 msgid "Handle Invoice Exception"
-msgstr "Gestionar excepción de factura"
+msgstr "Gestionar Excepción de Factura"
 
 msgctxt "view:sale.handle.shipment.exception.ask:"
 msgid "Choose move to recreate"
@@ -1047,11 +1002,7 @@ msgstr "Seleccione movimientos a recrear"
 
 msgctxt "view:sale.handle.shipment.exception.ask:"
 msgid "Handle shipment Exception"
-msgstr "Gestionar excepción de envío"
-
-msgctxt "view:sale.handle.shipment.exception.ask:"
-msgid "Recreate Moves"
-msgstr "Recrear movimientos"
+msgstr "Gestionar Excepción de Envío"
 
 msgctxt "view:sale.line:"
 msgid "General"
@@ -1062,10 +1013,6 @@ msgid "Notes"
 msgstr "Notas"
 
 msgctxt "view:sale.line:"
-msgid "Products"
-msgstr "Productos"
-
-msgctxt "view:sale.line:"
 msgid "Sale Line"
 msgstr "Línea de Venta"
 
@@ -1087,43 +1034,27 @@ msgstr "Borrador"
 
 msgctxt "view:sale.sale:"
 msgid "Handle Invoice Exception"
-msgstr "Gestionar excepción de factura"
+msgstr "Gestionar Excepción de Factura"
 
 msgctxt "view:sale.sale:"
 msgid "Handle Shipment Exception"
-msgstr "Gestionar excepción de envío"
-
-msgctxt "view:sale.sale:"
-msgid "Ignore Invoice Exception"
-msgstr "Ignorar excepción de factura"
+msgstr "Gestionar Excepción de Envío"
 
 msgctxt "view:sale.sale:"
 msgid "Invoices"
 msgstr "Facturas"
 
 msgctxt "view:sale.sale:"
-msgid "Lines"
-msgstr "Líneas"
-
-msgctxt "view:sale.sale:"
-msgid "Moves"
-msgstr "Movimientos"
-
-msgctxt "view:sale.sale:"
 msgid "Other Info"
-msgstr "Info adicional"
+msgstr "Info Adicional"
 
 msgctxt "view:sale.sale:"
 msgid "Process"
 msgstr "Procesar"
 
 msgctxt "view:sale.sale:"
-msgid "Quotation"
-msgstr "Cotización"
-
-msgctxt "view:sale.sale:"
 msgid "Quote"
-msgstr "Presupuesto"
+msgstr "Cotizar"
 
 msgctxt "view:sale.sale:"
 msgid "Sale"
diff --git a/locale/es_ES.po b/locale/es_ES.po
index 9a1a2ef..da6eb2a 100644
--- a/locale/es_ES.po
+++ b/locale/es_ES.po
@@ -3,53 +3,61 @@ msgid ""
 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 "No puede eliminar facturas que provienen de una venta."
+msgid "You can not delete invoices that come from a sale."
+msgstr "No puede borrar facturas generadas desde ventas."
 
 msgctxt "error:account.invoice:"
 msgid "You cannot reset to draft an invoice generated by a sale."
-msgstr "No puede restablecer a borrador una factura generada por una venta."
+msgstr "No puede restaurar a borrador una factura generada por una venta."
 
 msgctxt "error:sale.line:"
-msgid "It misses an \"Account Revenue\" on product \"%s\"!"
-msgstr "Al producto \"%s\" le falta una \"Cuenta de ingresos\"."
+msgid "Product \"%(product)s\" of sale %(sale)s misses a revenue account."
+msgstr ""
+"Falta la cuenta a cobrar del producto \"%(product)s\" de la venta %(sale)s."
 
 msgctxt "error:sale.line:"
-msgid "It misses an \"account Revenue\" default property!"
-msgstr "Falta una propiedad por defecto de \"Cuenta de ingresos\"."
+msgid "Sale \"%(sale)s\" is missing the customer location in line \"%(line)s\"."
+msgstr ""
+"Falta la ubicación del cliente en la línea \"%(line)s\" de la venta "
+"\"%(sale)\"."
 
 msgctxt "error:sale.line:"
-msgid "The customer location is required!"
-msgstr "La ubicación de cliente es requerida."
+msgid "Sale \"%(sale)s\" misses an \"account revenue\" default property."
+msgstr "Falta la propiedad \"Cuenta a cobrar\" por defecto de las ventas."
 
 msgctxt "error:sale.sale:"
-msgid "Invoice and Shipment addresses must be defined for the quotation."
+msgid "Invalid combination of shipment and invoicing methods on sale \"%s\"."
 msgstr ""
-"Debe indicar las direcciones de facturación y de envío en el presupuesto."
+"Combinación de métodos de envío y facturación en la venta \"%s\" no es "
+"correcta."
 
 msgctxt "error:sale.sale:"
-msgid "It misses an \"Account Receivable\" on the party \"%s\"!"
-msgstr "Al tercero \"%s\" le falta una \"Cuenta a cobrar\"."
+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\"."
 
 msgctxt "error:sale.sale:"
-msgid "Sale \"%s\" must be cancelled before deletion!"
-msgstr "La venta \"%s\" debe ser cancelada antes de ser eliminada."
+msgid "It misses an \"Account Receivable\" on the party \"%s\"."
+msgstr "Falta una \"Cuenta a cobrar\" al tercero \"%s\"."
 
 msgctxt "error:sale.sale:"
-msgid "Warehouse must be defined for the quotation."
-msgstr "Debe indicar un almacén en el presupuesto."
+msgid "Sale \"%s\" must be cancelled before deletion."
+msgstr "Debe cancelar la venta \"%s\" antes de borrar."
 
 msgctxt "error:sale.sale:"
-msgid "Wrong combination of method!"
-msgstr "Combinación no válida de métodos."
+msgid "Warehouse must be defined for the quotation of sale \"%s\"."
+msgstr "Se debe definir el almacén para el presupuesto de la venta \"%s\"."
 
 msgctxt "error:stock.shipment.out.return:"
 msgid "You cannot reset to draft a move generated by a sale."
-msgstr "No puede restablecer a borrador un movimiento generado por una venta."
+msgstr "No puede restaurar a borrador un movimiento generado por una venta."
 
 msgctxt "error:stock.shipment.out:"
 msgid "You cannot reset to draft a move generated by a sale."
-msgstr "No puede restablecer a borrador un movimiento generado por una venta."
+msgstr "No puede restaurar a borrador un movimiento generado por una venta."
 
 msgctxt "field:account.invoice,sale_exception_state:"
 msgid "Exception State"
@@ -59,10 +67,6 @@ msgctxt "field:account.invoice,sales:"
 msgid "Sales"
 msgstr "Ventas"
 
-msgctxt "field:account.invoice.line,sale_lines:"
-msgid "Sale Lines"
-msgstr "Líneas de venta"
-
 msgctxt "field:product.template,delivery_time:"
 msgid "Delivery Time"
 msgstr "Tiempo de envío"
@@ -97,7 +101,7 @@ msgstr "Método de facturación"
 
 msgctxt "field:sale.configuration,sale_sequence:"
 msgid "Sale Reference Sequence"
-msgstr "Secuencia numeración venta"
+msgstr "Secuencia de pedidos de venta"
 
 msgctxt "field:sale.configuration,sale_shipment_method:"
 msgid "Sale Shipment Method"
@@ -251,38 +255,6 @@ msgctxt "field:sale.line,write_uid:"
 msgid "Write User"
 msgstr "Usuario modificación"
 
-msgctxt "field:sale.line-account.invoice.line,create_date:"
-msgid "Create Date"
-msgstr "Fecha creación"
-
-msgctxt "field:sale.line-account.invoice.line,create_uid:"
-msgid "Create User"
-msgstr "Usuario creación"
-
-msgctxt "field:sale.line-account.invoice.line,id:"
-msgid "ID"
-msgstr "ID"
-
-msgctxt "field:sale.line-account.invoice.line,invoice_line:"
-msgid "Invoice Line"
-msgstr "Línea de factura"
-
-msgctxt "field:sale.line-account.invoice.line,rec_name:"
-msgid "Name"
-msgstr "Nombre"
-
-msgctxt "field:sale.line-account.invoice.line,sale_line:"
-msgid "Sale Line"
-msgstr "Línea de venta"
-
-msgctxt "field:sale.line-account.invoice.line,write_date:"
-msgid "Write Date"
-msgstr "Fecha modificación"
-
-msgctxt "field:sale.line-account.invoice.line,write_uid:"
-msgid "Write User"
-msgstr "Usuario modificación"
-
 msgctxt "field:sale.line-account.tax,create_date:"
 msgid "Create Date"
 msgstr "Fecha creación"
@@ -631,10 +603,6 @@ msgctxt "field:stock.move,sale_exception_state:"
 msgid "Exception State"
 msgstr "Estado excepción"
 
-msgctxt "field:stock.move,sale_line:"
-msgid "Sale Line"
-msgstr "Línea de venta"
-
 msgctxt "help:product.template,delivery_time:"
 msgid "In number of days"
 msgstr "En número de días."
@@ -651,7 +619,7 @@ msgstr "Facturas"
 
 msgctxt "model:ir.action,name:act_open_customer"
 msgid "Parties associated to Sales"
-msgstr "Terceros asociados a ventas"
+msgstr "Terceros con ventas"
 
 msgctxt "model:ir.action,name:act_return_form"
 msgid "Returns"
@@ -659,7 +627,7 @@ msgstr "Devolver"
 
 msgctxt "model:ir.action,name:act_sale_configuration_form"
 msgid "Sales Configuration"
-msgstr "Configuración pedidos de venta"
+msgstr "Configuración de ventas"
 
 msgctxt "model:ir.action,name:act_sale_form"
 msgid "Sales"
@@ -669,22 +637,6 @@ msgctxt "model:ir.action,name:act_sale_form2"
 msgid "Sales"
 msgstr "Ventas"
 
-msgctxt "model:ir.action,name:act_sale_form_confirmed"
-msgid "Confirmed Sales"
-msgstr "Ventas confirmadas"
-
-msgctxt "model:ir.action,name:act_sale_form_draft"
-msgid "Draft Sales"
-msgstr "Ventas borrador"
-
-msgctxt "model:ir.action,name:act_sale_form_processing"
-msgid "Processing Sales"
-msgstr "Ventas en proceso"
-
-msgctxt "model:ir.action,name:act_sale_form_quotation"
-msgid "Quotation Sales"
-msgstr "Ventas presupuestadas"
-
 msgctxt "model:ir.action,name:act_shipment_form"
 msgid "Shipments"
 msgstr "Albaranes"
@@ -705,6 +657,29 @@ msgctxt "model:ir.action,name:wizard_shipment_handle_exception"
 msgid "Handle Shipment Exception"
 msgstr "Gestionar excepción de envío"
 
+msgctxt "model:ir.action.act_window.domain,name:act_sale_form_domain_all"
+msgid "All"
+msgstr "Todo"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_sale_form_domain_confirmed"
+msgid "Confirmed"
+msgstr "Confirmado"
+
+msgctxt "model:ir.action.act_window.domain,name:act_sale_form_domain_draft"
+msgid "Draft"
+msgstr "Borrador"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_sale_form_domain_processing"
+msgid "Processing"
+msgstr "En proceso"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_sale_form_domain_quotation"
+msgid "Quotation"
+msgstr "Presupuesto"
+
 msgctxt "model:ir.sequence,name:sequence_sale"
 msgid "Sale"
 msgstr "Venta"
@@ -719,7 +694,7 @@ msgstr "Configuración"
 
 msgctxt "model:ir.ui.menu,name:menu_customer"
 msgid "Parties associated to Sales"
-msgstr "Terceros asociados a ventas"
+msgstr "Terceros con ventas"
 
 msgctxt "model:ir.ui.menu,name:menu_sale"
 msgid "Sales"
@@ -727,28 +702,12 @@ msgstr "Ventas"
 
 msgctxt "model:ir.ui.menu,name:menu_sale_configuration"
 msgid "Sales Configuration"
-msgstr "Pedidos de venta"
+msgstr "Ventas"
 
 msgctxt "model:ir.ui.menu,name:menu_sale_form"
 msgid "Sales"
 msgstr "Ventas"
 
-msgctxt "model:ir.ui.menu,name:menu_sale_form_confirmed"
-msgid "Confirmed Sales"
-msgstr "Confirmadas"
-
-msgctxt "model:ir.ui.menu,name:menu_sale_form_draft"
-msgid "Draft Sales"
-msgstr "Borrador"
-
-msgctxt "model:ir.ui.menu,name:menu_sale_form_processing"
-msgid "Processing Sales"
-msgstr "Proceso"
-
-msgctxt "model:ir.ui.menu,name:menu_sale_form_quotation"
-msgid "Quotation Sales"
-msgstr "Presupuesto"
-
 msgctxt "model:res.group,name:group_sale"
 msgid "Sales"
 msgstr "Ventas"
@@ -773,10 +732,6 @@ msgctxt "model:sale.line,name:"
 msgid "Sale Line"
 msgstr "Línea de venta"
 
-msgctxt "model:sale.line-account.invoice.line,name:"
-msgid "Sale Line - Invoice Line"
-msgstr "Línea de venta - Línea de factura"
-
 msgctxt "model:sale.line-account.tax,name:"
 msgid "Sale Line - Tax"
 msgstr "Línea de venta - Impuesto"
@@ -1018,10 +973,6 @@ msgid "Recreated"
 msgstr "Recreado"
 
 msgctxt "view:product.product:"
-msgid "Customers"
-msgstr "Clientes"
-
-msgctxt "view:product.product:"
 msgid "Products"
 msgstr "Productos"
 
@@ -1031,7 +982,7 @@ msgstr "Clientes"
 
 msgctxt "view:sale.configuration:"
 msgid "Sale Configuration"
-msgstr "Configuración pedidos de venta"
+msgstr "Configuración de venta"
 
 msgctxt "view:sale.handle.invoice.exception.ask:"
 msgid "Choose invoices to recreate"
@@ -1049,10 +1000,6 @@ msgctxt "view:sale.handle.shipment.exception.ask:"
 msgid "Handle shipment Exception"
 msgstr "Gestionar excepción de envío"
 
-msgctxt "view:sale.handle.shipment.exception.ask:"
-msgid "Recreate Moves"
-msgstr "Recrear movimientos"
-
 msgctxt "view:sale.line:"
 msgid "General"
 msgstr "General"
@@ -1062,10 +1009,6 @@ msgid "Notes"
 msgstr "Notas"
 
 msgctxt "view:sale.line:"
-msgid "Products"
-msgstr "Productos"
-
-msgctxt "view:sale.line:"
 msgid "Sale Line"
 msgstr "Línea de venta"
 
@@ -1094,22 +1037,10 @@ msgid "Handle Shipment Exception"
 msgstr "Gestionar excepción de envío"
 
 msgctxt "view:sale.sale:"
-msgid "Ignore Invoice Exception"
-msgstr "Ignorar excepción de factura"
-
-msgctxt "view:sale.sale:"
 msgid "Invoices"
 msgstr "Facturas"
 
 msgctxt "view:sale.sale:"
-msgid "Lines"
-msgstr "Líneas"
-
-msgctxt "view:sale.sale:"
-msgid "Moves"
-msgstr "Movimientos"
-
-msgctxt "view:sale.sale:"
 msgid "Other Info"
 msgstr "Información adicional"
 
@@ -1118,10 +1049,6 @@ msgid "Process"
 msgstr "Procesar"
 
 msgctxt "view:sale.sale:"
-msgid "Quotation"
-msgstr "Presupuesto"
-
-msgctxt "view:sale.sale:"
 msgid "Quote"
 msgstr "Presupuesto"
 
diff --git a/locale/fr_FR.po b/locale/fr_FR.po
index 5c7c164..48f6613 100644
--- a/locale/fr_FR.po
+++ b/locale/fr_FR.po
@@ -3,12 +3,8 @@ msgid ""
 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 "Vous ne pouvez pas supprimer une facture qui provient d'une vente"
-
-msgctxt "error:account.invoice:"
-msgid "You can not delete invoices that come from a sale!"
-msgstr "Vous ne pouvez pas supprimer une facture qui provient d'une vente"
+msgid "You can not delete invoices that come from a sale."
+msgstr "Vous ne pouvez supprimer une facture qui provient d'une vente."
 
 msgctxt "error:account.invoice:"
 msgid "You cannot reset to draft an invoice generated by a sale."
@@ -19,62 +15,47 @@ 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 "It misses an \"Account Revenue\" on product \"%s\"!"
-msgstr "Il manque un compte de produits sur le produit \"%s\" !"
-
-msgctxt "error:sale.line:"
-msgid "It misses an \"Account Revenue\" on product \"%s\"!"
-msgstr "Il manque un compte de produits sur le produit \"%s\" !"
-
-msgctxt "error:sale.line:"
-msgid "It misses an \"account Revenue\" default property!"
-msgstr "il manque une propriété par défaut \"compte de produits\" !"
-
-msgctxt "error:sale.line:"
-msgid "It misses an \"account Revenue\" default property!"
-msgstr "il manque une propriété par défaut \"compte de produits\" !"
+msgid "Product \"%(product)s\" of sale %(sale)s misses a revenue account."
+msgstr ""
+"Le produit \"%(product)s\" de la vente %(sale)s n'a pas de compte de revenu."
 
 msgctxt "error:sale.line:"
-msgid "The customer location is required!"
-msgstr "L'emplacement client est requis !"
+msgid "Sale \"%(sale)s\" is missing the customer location in line \"%(line)s\"."
+msgstr ""
+"L'emplacement client est manquant sur la ligne \"%(line)s\" de la vente "
+"\"%(sale)s\"."
 
 msgctxt "error:sale.line:"
-msgid "The customer location is required!"
-msgstr "L'emplacement client est requis !"
-
-msgctxt "error:sale.sale:"
-msgid "Invoice and Shipment addresses must be defined for the quotation."
+msgid "Sale \"%(sale)s\" misses an \"account revenue\" default property."
 msgstr ""
-"Les adresses de facturation et d'expédition sont requises pour le devis."
+"La propriété par défaut \"Compte de produit\" est absente de la vente "
+"\"%(sale)s\""
 
 msgctxt "error:sale.sale:"
-msgid "Invoice and Shipment addresses must be defined for the quotation."
+msgid "Invalid combination of shipment and invoicing methods on sale \"%s\"."
 msgstr ""
-"Les adresses de facturation et d'expédition sont requises pour le devis."
+"Combinaison de méthodes de livraison et de facturation invalide sur la vente"
+" \"%s\"."
 
 msgctxt "error:sale.sale:"
-msgid "It misses an \"Account Receivable\" on the party \"%s\"!"
-msgstr "Il manque un compte à recevoir sur le tiers \"%s\" !"
-
-msgctxt "error:sale.sale:"
-msgid "It misses an \"Account Receivable\" on the party \"%s\"!"
-msgstr "Il manque un compte à recevoir sur le tiers \"%s\" !"
-
-msgctxt "error:sale.sale:"
-msgid "Sale \"%s\" must be cancelled before deletion!"
-msgstr "La vente \"%s\" doit être annulée avant suppression"
+msgid ""
+"Invoice and Shipment addresses must be defined for the quotation of sale "
+"\"%s\"."
+msgstr ""
+"Les adresses de facturation et de livraison doivent être définies pour le "
+"devis \"%s\"."
 
 msgctxt "error:sale.sale:"
-msgid "Warehouse must be defined for the quotation."
-msgstr "L'entrepôt doit être défini pour le devis"
+msgid "It misses an \"Account Receivable\" on the party \"%s\"."
+msgstr "Le compte à recevoir est manquant sur le tiers \"%s\"."
 
 msgctxt "error:sale.sale:"
-msgid "Wrong combination of method!"
-msgstr "Mauvaise combinaison de méthodes !"
+msgid "Sale \"%s\" must be cancelled before deletion."
+msgstr "La vente \"%s\" doit être annulée avant de pouvoir être supprimée."
 
 msgctxt "error:sale.sale:"
-msgid "Wrong combination of method!"
-msgstr "Mauvaise combinaison de méthodes !"
+msgid "Warehouse must be defined for the quotation of sale \"%s\"."
+msgstr "Un entrepôt doit être défini pour le devis de la vente \"%s\"."
 
 msgctxt "error:stock.shipment.out.return:"
 msgid "You cannot reset to draft a move generated by a sale."
@@ -96,10 +77,6 @@ msgctxt "field:account.invoice,sales:"
 msgid "Sales"
 msgstr "Ventes"
 
-msgctxt "field:account.invoice.line,sale_lines:"
-msgid "Sale Lines"
-msgstr "Lignes de vente"
-
 msgctxt "field:product.template,delivery_time:"
 msgid "Delivery Time"
 msgstr "Délai de livraison"
@@ -288,38 +265,6 @@ msgctxt "field:sale.line,write_uid:"
 msgid "Write User"
 msgstr "Mis à jour par"
 
-msgctxt "field:sale.line-account.invoice.line,create_date:"
-msgid "Create Date"
-msgstr "Date de création"
-
-msgctxt "field:sale.line-account.invoice.line,create_uid:"
-msgid "Create User"
-msgstr "Créé par"
-
-msgctxt "field:sale.line-account.invoice.line,id:"
-msgid "ID"
-msgstr "ID"
-
-msgctxt "field:sale.line-account.invoice.line,invoice_line:"
-msgid "Invoice Line"
-msgstr "Ligne de facture"
-
-msgctxt "field:sale.line-account.invoice.line,rec_name:"
-msgid "Name"
-msgstr "Nom"
-
-msgctxt "field:sale.line-account.invoice.line,sale_line:"
-msgid "Sale Line"
-msgstr "Ligne de vente"
-
-msgctxt "field:sale.line-account.invoice.line,write_date:"
-msgid "Write Date"
-msgstr "Date de mise à jour"
-
-msgctxt "field:sale.line-account.invoice.line,write_uid:"
-msgid "Write User"
-msgstr "Mis à jour par"
-
 msgctxt "field:sale.line-account.tax,create_date:"
 msgid "Create Date"
 msgstr "Date de création"
@@ -668,10 +613,6 @@ msgctxt "field:stock.move,sale_exception_state:"
 msgid "Exception State"
 msgstr "État d'exception"
 
-msgctxt "field:stock.move,sale_line:"
-msgid "Sale Line"
-msgstr "Ligne de vente"
-
 msgctxt "help:product.template,delivery_time:"
 msgid "In number of days"
 msgstr "En nombre de jours"
@@ -706,22 +647,6 @@ msgctxt "model:ir.action,name:act_sale_form2"
 msgid "Sales"
 msgstr "Ventes"
 
-msgctxt "model:ir.action,name:act_sale_form_confirmed"
-msgid "Confirmed Sales"
-msgstr "Ventes confirmées"
-
-msgctxt "model:ir.action,name:act_sale_form_draft"
-msgid "Draft Sales"
-msgstr "Ventes brouillon"
-
-msgctxt "model:ir.action,name:act_sale_form_processing"
-msgid "Processing Sales"
-msgstr "Ventes en cours de traitement"
-
-msgctxt "model:ir.action,name:act_sale_form_quotation"
-msgid "Quotation Sales"
-msgstr "Devis"
-
 msgctxt "model:ir.action,name:act_shipment_form"
 msgid "Shipments"
 msgstr "Expéditions"
@@ -742,6 +667,29 @@ msgctxt "model:ir.action,name:wizard_shipment_handle_exception"
 msgid "Handle Shipment Exception"
 msgstr "Gérer l'exception d'expédition"
 
+msgctxt "model:ir.action.act_window.domain,name:act_sale_form_domain_all"
+msgid "All"
+msgstr "Toutes"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_sale_form_domain_confirmed"
+msgid "Confirmed"
+msgstr "Confirmée"
+
+msgctxt "model:ir.action.act_window.domain,name:act_sale_form_domain_draft"
+msgid "Draft"
+msgstr "Brouillon"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_sale_form_domain_processing"
+msgid "Processing"
+msgstr "Traitement"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_sale_form_domain_quotation"
+msgid "Quotation"
+msgstr "Devis"
+
 msgctxt "model:ir.sequence,name:sequence_sale"
 msgid "Sale"
 msgstr "Vente"
@@ -770,22 +718,6 @@ msgctxt "model:ir.ui.menu,name:menu_sale_form"
 msgid "Sales"
 msgstr "Ventes"
 
-msgctxt "model:ir.ui.menu,name:menu_sale_form_confirmed"
-msgid "Confirmed Sales"
-msgstr "Ventes confirmées"
-
-msgctxt "model:ir.ui.menu,name:menu_sale_form_draft"
-msgid "Draft Sales"
-msgstr "Ventes brouillons"
-
-msgctxt "model:ir.ui.menu,name:menu_sale_form_processing"
-msgid "Processing Sales"
-msgstr "Ventes en cours de traitement"
-
-msgctxt "model:ir.ui.menu,name:menu_sale_form_quotation"
-msgid "Quotation Sales"
-msgstr "Devis"
-
 msgctxt "model:res.group,name:group_sale"
 msgid "Sales"
 msgstr "Vente"
@@ -810,10 +742,6 @@ msgctxt "model:sale.line,name:"
 msgid "Sale Line"
 msgstr "Ligne de vente"
 
-msgctxt "model:sale.line-account.invoice.line,name:"
-msgid "Sale Line - Invoice Line"
-msgstr "Ligne de vente - Ligne de facture"
-
 msgctxt "model:sale.line-account.tax,name:"
 msgid "Sale Line - Tax"
 msgstr "Ligne de vente - Taxe"
@@ -1247,10 +1175,6 @@ msgid "Recreated"
 msgstr "Recréé"
 
 msgctxt "view:product.product:"
-msgid "Customers"
-msgstr "Clients"
-
-msgctxt "view:product.product:"
 msgid "Products"
 msgstr "produits"
 
@@ -1302,10 +1226,6 @@ 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 "Recreate Moves"
-msgstr "Recréer les mouvements"
-
 msgctxt "view:sale.line:"
 msgid "General"
 msgstr "Général"
@@ -1323,10 +1243,6 @@ msgid "Notes"
 msgstr "Notes"
 
 msgctxt "view:sale.line:"
-msgid "Products"
-msgstr "produits"
-
-msgctxt "view:sale.line:"
 msgid "Sale Line"
 msgstr "Ligne de vente"
 
@@ -1383,14 +1299,6 @@ msgid "Handle Shipment Exception"
 msgstr "Gérer l'exception d'expédition"
 
 msgctxt "view:sale.sale:"
-msgid "Ignore Invoice Exception"
-msgstr "Ignorer l'exception de facturation "
-
-msgctxt "view:sale.sale:"
-msgid "Ignore Shipment Exception"
-msgstr "Ignorer l'exception de livraison"
-
-msgctxt "view:sale.sale:"
 msgid "Invoices"
 msgstr "Factures"
 
@@ -1399,14 +1307,6 @@ msgid "Invoices"
 msgstr "Factures"
 
 msgctxt "view:sale.sale:"
-msgid "Lines"
-msgstr "Lignes"
-
-msgctxt "view:sale.sale:"
-msgid "Moves"
-msgstr "Mouvements"
-
-msgctxt "view:sale.sale:"
 msgid "Other Info"
 msgstr "Autre information"
 
@@ -1419,10 +1319,6 @@ msgid "Process"
 msgstr "Traitement"
 
 msgctxt "view:sale.sale:"
-msgid "Quotation"
-msgstr "Devis"
-
-msgctxt "view:sale.sale:"
 msgid "Quote"
 msgstr "Devis"
 
diff --git a/locale/nl_NL.po b/locale/nl_NL.po
index a9a030d..690a6b9 100644
--- a/locale/nl_NL.po
+++ b/locale/nl_NL.po
@@ -3,8 +3,8 @@ msgid ""
 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 "U kunt geen facturen verwijderen die uit verkoop voortkomen!"
+msgid "You can not delete invoices that come from a sale."
+msgstr ""
 
 msgctxt "error:account.invoice:"
 msgid "You cannot reset to draft an invoice generated by a sale."
@@ -12,36 +12,38 @@ msgstr ""
 "U kunt een factuur die uit verkoop voortkomt niet terug zetten naar concept."
 
 msgctxt "error:sale.line:"
-msgid "It misses an \"Account Revenue\" on product \"%s\"!"
-msgstr "Grootboekrekening \"Opbrengst\" ontbreekt voor product \"%s\"!"
+msgid "Product \"%(product)s\" of sale %(sale)s misses a revenue account."
+msgstr ""
 
 msgctxt "error:sale.line:"
-msgid "It misses an \"account Revenue\" default property!"
-msgstr "De standaard grootboekrekening \"Opbrengst\" ontbreekt!"
+msgid "Sale \"%(sale)s\" is missing the customer location in line \"%(line)s\"."
+msgstr ""
 
 msgctxt "error:sale.line:"
-msgid "The customer location is required!"
-msgstr "De afleverlocatie is vereist!"
+msgid "Sale \"%(sale)s\" misses an \"account revenue\" default property."
+msgstr ""
 
 msgctxt "error:sale.sale:"
-msgid "Invoice and Shipment addresses must be defined for the quotation."
-msgstr "Factuur- en afleveradres moeten gedefinieerd zijn voor de offerte."
+msgid "Invalid combination of shipment and invoicing methods on sale \"%s\"."
+msgstr ""
 
 msgctxt "error:sale.sale:"
-msgid "It misses an \"Account Receivable\" on the party \"%s\"!"
-msgstr "Grootboekrekening \"Debiteuren\" ontbreekt voor relatie \"%s\"!"
+msgid ""
+"Invoice and Shipment addresses must be defined for the quotation of sale "
+"\"%s\"."
+msgstr ""
 
 msgctxt "error:sale.sale:"
-msgid "Sale \"%s\" must be cancelled before deletion!"
+msgid "It misses an \"Account Receivable\" on the party \"%s\"."
 msgstr ""
 
 msgctxt "error:sale.sale:"
-msgid "Warehouse must be defined for the quotation."
+msgid "Sale \"%s\" must be cancelled before deletion."
 msgstr ""
 
 msgctxt "error:sale.sale:"
-msgid "Wrong combination of method!"
-msgstr "Verkeerde combinatie van afhandeling!"
+msgid "Warehouse must be defined for the quotation of sale \"%s\"."
+msgstr ""
 
 #, fuzzy
 msgctxt "error:stock.shipment.out.return:"
@@ -63,11 +65,6 @@ msgctxt "field:account.invoice,sales:"
 msgid "Sales"
 msgstr "Verkoopbeheer"
 
-#, fuzzy
-msgctxt "field:account.invoice.line,sale_lines:"
-msgid "Sale Lines"
-msgstr "Offerteregels"
-
 msgctxt "field:product.template,delivery_time:"
 msgid "Delivery Time"
 msgstr ""
@@ -257,38 +254,6 @@ msgctxt "field:sale.line,write_uid:"
 msgid "Write User"
 msgstr ""
 
-msgctxt "field:sale.line-account.invoice.line,create_date:"
-msgid "Create Date"
-msgstr ""
-
-msgctxt "field:sale.line-account.invoice.line,create_uid:"
-msgid "Create User"
-msgstr ""
-
-msgctxt "field:sale.line-account.invoice.line,id:"
-msgid "ID"
-msgstr ""
-
-msgctxt "field:sale.line-account.invoice.line,invoice_line:"
-msgid "Invoice Line"
-msgstr "Factuurregel"
-
-msgctxt "field:sale.line-account.invoice.line,rec_name:"
-msgid "Name"
-msgstr "Naam"
-
-msgctxt "field:sale.line-account.invoice.line,sale_line:"
-msgid "Sale Line"
-msgstr "Offerteregel"
-
-msgctxt "field:sale.line-account.invoice.line,write_date:"
-msgid "Write Date"
-msgstr ""
-
-msgctxt "field:sale.line-account.invoice.line,write_uid:"
-msgid "Write User"
-msgstr ""
-
 msgctxt "field:sale.line-account.tax,create_date:"
 msgid "Create Date"
 msgstr ""
@@ -637,10 +602,6 @@ msgctxt "field:stock.move,sale_exception_state:"
 msgid "Exception State"
 msgstr "Uitzonderingstoestand"
 
-msgctxt "field:stock.move,sale_line:"
-msgid "Sale Line"
-msgstr "Offerteregel"
-
 msgctxt "help:product.template,delivery_time:"
 msgid "In number of days"
 msgstr ""
@@ -677,22 +638,6 @@ msgctxt "model:ir.action,name:act_sale_form2"
 msgid "Sales"
 msgstr "Verkoop"
 
-msgctxt "model:ir.action,name:act_sale_form_confirmed"
-msgid "Confirmed Sales"
-msgstr "Bevestigde offertes"
-
-msgctxt "model:ir.action,name:act_sale_form_draft"
-msgid "Draft Sales"
-msgstr "Concept offertes"
-
-msgctxt "model:ir.action,name:act_sale_form_processing"
-msgid "Processing Sales"
-msgstr ""
-
-msgctxt "model:ir.action,name:act_sale_form_quotation"
-msgid "Quotation Sales"
-msgstr "Uitstaande offertes"
-
 msgctxt "model:ir.action,name:act_shipment_form"
 msgid "Shipments"
 msgstr "Leveringen"
@@ -713,6 +658,33 @@ msgctxt "model:ir.action,name:wizard_shipment_handle_exception"
 msgid "Handle Shipment Exception"
 msgstr "Zendinguitzondering afhandelen"
 
+msgctxt "model:ir.action.act_window.domain,name:act_sale_form_domain_all"
+msgid "All"
+msgstr ""
+
+#, fuzzy
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_sale_form_domain_confirmed"
+msgid "Confirmed"
+msgstr "Bevestigd"
+
+#, fuzzy
+msgctxt "model:ir.action.act_window.domain,name:act_sale_form_domain_draft"
+msgid "Draft"
+msgstr "Concept"
+
+#, fuzzy
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_sale_form_domain_processing"
+msgid "Processing"
+msgstr "Verwerking"
+
+#, fuzzy
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_sale_form_domain_quotation"
+msgid "Quotation"
+msgstr "Offerte"
+
 msgctxt "model:ir.sequence,name:sequence_sale"
 msgid "Sale"
 msgstr "Verkoop"
@@ -743,22 +715,6 @@ msgctxt "model:ir.ui.menu,name:menu_sale_form"
 msgid "Sales"
 msgstr "Verkoop"
 
-msgctxt "model:ir.ui.menu,name:menu_sale_form_confirmed"
-msgid "Confirmed Sales"
-msgstr "Bevestigde offertes"
-
-msgctxt "model:ir.ui.menu,name:menu_sale_form_draft"
-msgid "Draft Sales"
-msgstr "Concept offertes"
-
-msgctxt "model:ir.ui.menu,name:menu_sale_form_processing"
-msgid "Processing Sales"
-msgstr ""
-
-msgctxt "model:ir.ui.menu,name:menu_sale_form_quotation"
-msgid "Quotation Sales"
-msgstr "Uitstaande offertes"
-
 #, fuzzy
 msgctxt "model:res.group,name:group_sale"
 msgid "Sales"
@@ -787,10 +743,6 @@ msgctxt "model:sale.line,name:"
 msgid "Sale Line"
 msgstr "Offerteregel"
 
-msgctxt "model:sale.line-account.invoice.line,name:"
-msgid "Sale Line - Invoice Line"
-msgstr "Offerteregel - factuurregel"
-
 msgctxt "model:sale.line-account.tax,name:"
 msgid "Sale Line - Tax"
 msgstr "Offerteregel - belasting"
@@ -1079,10 +1031,6 @@ msgctxt "view:sale.handle.shipment.exception.ask:"
 msgid "Handle shipment Exception"
 msgstr "Zendinguitzondering afhandelen"
 
-msgctxt "view:sale.handle.shipment.exception.ask:"
-msgid "Recreate Moves"
-msgstr "Boekingen opnieuw aanmaken"
-
 msgctxt "view:sale.line:"
 msgid "General"
 msgstr "Algemeen"
@@ -1092,10 +1040,6 @@ msgid "Notes"
 msgstr "Aantekeningen"
 
 msgctxt "view:sale.line:"
-msgid "Products"
-msgstr "Producten"
-
-msgctxt "view:sale.line:"
 msgid "Sale Line"
 msgstr "Offerteregel"
 
@@ -1128,14 +1072,6 @@ msgid "Invoices"
 msgstr "Facturen"
 
 msgctxt "view:sale.sale:"
-msgid "Lines"
-msgstr "Regels"
-
-msgctxt "view:sale.sale:"
-msgid "Moves"
-msgstr "Boekingen"
-
-msgctxt "view:sale.sale:"
 msgid "Other Info"
 msgstr "Aanvullende informatie"
 
@@ -1144,10 +1080,6 @@ msgid "Process"
 msgstr ""
 
 msgctxt "view:sale.sale:"
-msgid "Quotation"
-msgstr "Offerte"
-
-msgctxt "view:sale.sale:"
 msgid "Quote"
 msgstr ""
 
diff --git a/locale/ru_RU.po b/locale/ru_RU.po
index 2ad52a8..937b02a 100644
--- a/locale/ru_RU.po
+++ b/locale/ru_RU.po
@@ -3,914 +3,829 @@ msgid ""
 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 ""
+msgid "You can not delete invoices that come from a sale."
+msgstr "Вы не можете удалить инвойсы которые созданы от продажи."
 
 msgctxt "error:account.invoice:"
 msgid "You cannot reset to draft an invoice generated by a sale."
-msgstr ""
+msgstr "Нельзя отметить как черновой инвойс, который создан продажей."
 
 msgctxt "error:sale.line:"
-msgid "It misses an \"Account Revenue\" on product \"%s\"!"
-msgstr ""
+msgid "Product \"%(product)s\" of sale %(sale)s misses a revenue account."
+msgstr "У продукта \"%(product)s\" продажи \"%(sale)s\" отсутствует счет доходов."
 
 msgctxt "error:sale.line:"
-msgid "It misses an \"account Revenue\" default property!"
+msgid "Sale \"%(sale)s\" is missing the customer location in line \"%(line)s\"."
 msgstr ""
+"У продажи \"%(sale)s\" отсутствует местоположение заказчика в строке "
+"\"%(line)s\"."
 
 msgctxt "error:sale.line:"
-msgid "The customer location is required!"
-msgstr ""
+msgid "Sale \"%(sale)s\" misses an \"account revenue\" default property."
+msgstr "У продажи \"%(sale)s\" не заполнено поле \"Счет доходов\"."
 
 msgctxt "error:sale.sale:"
-msgid "Invoice and Shipment addresses must be defined for the quotation."
+msgid "Invalid combination of shipment and invoicing methods on sale \"%s\"."
 msgstr ""
+"Недопустимая комбинация доставки метода выставления инвойса на продаже "
+"\"%s\"."
 
 msgctxt "error:sale.sale:"
-msgid "It misses an \"Account Receivable\" on the party \"%s\"!"
+msgid ""
+"Invoice and Shipment addresses must be defined for the quotation of sale "
+"\"%s\"."
 msgstr ""
+"Для котировки продажи \"%s\" должны быть определены адреса инвойса и "
+"доставки."
 
 msgctxt "error:sale.sale:"
-msgid "Sale \"%s\" must be cancelled before deletion!"
-msgstr ""
+msgid "It misses an \"Account Receivable\" on the party \"%s\"."
+msgstr "Отсутствует \"Счет дебиторов\" у контрагента \"%s\"."
 
 msgctxt "error:sale.sale:"
-msgid "Warehouse must be defined for the quotation."
-msgstr ""
+msgid "Sale \"%s\" must be cancelled before deletion."
+msgstr "Продажа \"%s\" должна быть отменена перед удалением."
 
 msgctxt "error:sale.sale:"
-msgid "Wrong combination of method!"
-msgstr ""
+msgid "Warehouse must be defined for the quotation of sale \"%s\"."
+msgstr "Должен быть указан склад для котировки продажи \"%s\"."
 
 msgctxt "error:stock.shipment.out.return:"
 msgid "You cannot reset to draft a move generated by a sale."
-msgstr ""
+msgstr "Нельзя отметить как черновое перемещение, которое создано продажей."
 
 msgctxt "error:stock.shipment.out:"
 msgid "You cannot reset to draft a move generated by a sale."
-msgstr ""
+msgstr "Нельзя отметить как черновое перемещение, которое создано продажей."
 
 msgctxt "field:account.invoice,sale_exception_state:"
 msgid "Exception State"
-msgstr ""
+msgstr "Состояние ситуации"
 
 msgctxt "field:account.invoice,sales:"
 msgid "Sales"
-msgstr ""
-
-msgctxt "field:account.invoice.line,sale_lines:"
-msgid "Sale Lines"
-msgstr ""
+msgstr "Продажи"
 
 msgctxt "field:product.template,delivery_time:"
 msgid "Delivery Time"
-msgstr ""
+msgstr "Время доставки"
 
 msgctxt "field:product.template,salable:"
 msgid "Salable"
-msgstr ""
+msgstr "Для продажи"
 
 msgctxt "field:product.template,sale_uom:"
 msgid "Sale UOM"
-msgstr ""
+msgstr "Ед.измерения продажи"
 
 msgctxt "field:sale.configuration,create_date:"
 msgid "Create Date"
-msgstr ""
+msgstr "Дата создания"
 
 msgctxt "field:sale.configuration,create_uid:"
 msgid "Create User"
-msgstr ""
+msgstr "Создано пользователем"
 
 msgctxt "field:sale.configuration,id:"
 msgid "ID"
-msgstr ""
+msgstr "ID"
 
-#, fuzzy
 msgctxt "field:sale.configuration,rec_name:"
 msgid "Name"
 msgstr "Наименование"
 
 msgctxt "field:sale.configuration,sale_invoice_method:"
 msgid "Sale Invoice Method"
-msgstr ""
+msgstr "Метод инвойса продажи"
 
 msgctxt "field:sale.configuration,sale_sequence:"
 msgid "Sale Reference Sequence"
-msgstr ""
+msgstr "Ссылка на нумерация продаж"
 
 msgctxt "field:sale.configuration,sale_shipment_method:"
 msgid "Sale Shipment Method"
-msgstr ""
+msgstr "Способ доставки продажи"
 
 msgctxt "field:sale.configuration,write_date:"
 msgid "Write Date"
-msgstr ""
+msgstr "Дата изменения"
 
 msgctxt "field:sale.configuration,write_uid:"
 msgid "Write User"
-msgstr ""
+msgstr "Изменено пользователем"
 
 msgctxt "field:sale.handle.invoice.exception.ask,domain_invoices:"
 msgid "Domain Invoices"
-msgstr ""
+msgstr "Домен инвойсов"
 
 msgctxt "field:sale.handle.invoice.exception.ask,id:"
 msgid "ID"
-msgstr ""
+msgstr "ID"
 
 msgctxt "field:sale.handle.invoice.exception.ask,recreate_invoices:"
 msgid "Recreate Invoices"
-msgstr ""
+msgstr "Создать заново инвойсы"
 
 msgctxt "field:sale.handle.shipment.exception.ask,domain_moves:"
 msgid "Domain Moves"
-msgstr ""
+msgstr "Домен проводок"
 
 msgctxt "field:sale.handle.shipment.exception.ask,id:"
 msgid "ID"
-msgstr ""
+msgstr "ID"
 
 msgctxt "field:sale.handle.shipment.exception.ask,recreate_moves:"
 msgid "Recreate Moves"
-msgstr ""
+msgstr "Создать заново проводки"
 
 msgctxt "field:sale.line,amount:"
 msgid "Amount"
-msgstr ""
+msgstr "Сумма"
 
 msgctxt "field:sale.line,create_date:"
 msgid "Create Date"
-msgstr ""
+msgstr "Дата создания"
 
 msgctxt "field:sale.line,create_uid:"
 msgid "Create User"
-msgstr ""
+msgstr "Создано пользователем"
 
 msgctxt "field:sale.line,delivery_date:"
 msgid "Delivery Date"
-msgstr ""
+msgstr "Дата доставки"
 
-#, fuzzy
 msgctxt "field:sale.line,description:"
 msgid "Description"
 msgstr "Описание"
 
-#, fuzzy
 msgctxt "field:sale.line,from_location:"
 msgid "From Location"
-msgstr "Из места"
+msgstr "Из местоположения"
 
 msgctxt "field:sale.line,id:"
 msgid "ID"
-msgstr ""
+msgstr "ID"
 
 msgctxt "field:sale.line,invoice_lines:"
 msgid "Invoice Lines"
-msgstr ""
+msgstr "Строки инвойса"
 
 msgctxt "field:sale.line,move_done:"
 msgid "Moves Done"
-msgstr ""
+msgstr "Перемещения выполнены"
 
 msgctxt "field:sale.line,move_exception:"
 msgid "Moves Exception"
-msgstr ""
+msgstr "Особые ситуации перемещения"
 
-#, fuzzy
 msgctxt "field:sale.line,moves:"
 msgid "Moves"
 msgstr "Перемещения"
 
 msgctxt "field:sale.line,moves_ignored:"
 msgid "Ignored Moves"
-msgstr ""
+msgstr "Игнорированные проводки"
 
 msgctxt "field:sale.line,moves_recreated:"
 msgid "Recreated Moves"
-msgstr ""
+msgstr "Созданные заново проводки"
 
 msgctxt "field:sale.line,note:"
 msgid "Note"
-msgstr ""
+msgstr "Комментарий"
 
-#, fuzzy
 msgctxt "field:sale.line,product:"
 msgid "Product"
-msgstr "Товарно материальные ценности (ТМЦ)"
+msgstr "Продукт"
 
 msgctxt "field:sale.line,product_uom_category:"
 msgid "Product Uom Category"
-msgstr ""
+msgstr "Категория ед. измерения продукции"
 
-#, fuzzy
 msgctxt "field:sale.line,quantity:"
 msgid "Quantity"
 msgstr "Кол-во"
 
-#, fuzzy
 msgctxt "field:sale.line,rec_name:"
 msgid "Name"
 msgstr "Наименование"
 
 msgctxt "field:sale.line,sale:"
 msgid "Sale"
-msgstr ""
+msgstr "Продажа"
 
-#, fuzzy
 msgctxt "field:sale.line,sequence:"
 msgid "Sequence"
-msgstr "Последовательность"
+msgstr "Нумерация"
 
 msgctxt "field:sale.line,taxes:"
 msgid "Taxes"
-msgstr ""
+msgstr "Налоги"
 
-#, fuzzy
 msgctxt "field:sale.line,to_location:"
 msgid "To Location"
-msgstr "В место"
+msgstr "В местоположение"
 
-#, fuzzy
 msgctxt "field:sale.line,type:"
 msgid "Type"
 msgstr "Тип"
 
-#, fuzzy
 msgctxt "field:sale.line,unit:"
 msgid "Unit"
-msgstr "Штука"
+msgstr "Единица измерения"
 
-#, fuzzy
 msgctxt "field:sale.line,unit_digits:"
 msgid "Unit Digits"
-msgstr "Группа цифр"
+msgstr "Кол-во цифр после запятой"
 
-#, fuzzy
 msgctxt "field:sale.line,unit_price:"
 msgid "Unit Price"
 msgstr "Цена за единицу"
 
-#, fuzzy
 msgctxt "field:sale.line,warehouse:"
 msgid "Warehouse"
 msgstr "Товарный склад"
 
 msgctxt "field:sale.line,write_date:"
 msgid "Write Date"
-msgstr ""
+msgstr "Дата изменения"
 
 msgctxt "field:sale.line,write_uid:"
 msgid "Write User"
-msgstr ""
-
-msgctxt "field:sale.line-account.invoice.line,create_date:"
-msgid "Create Date"
-msgstr ""
-
-msgctxt "field:sale.line-account.invoice.line,create_uid:"
-msgid "Create User"
-msgstr ""
-
-msgctxt "field:sale.line-account.invoice.line,id:"
-msgid "ID"
-msgstr ""
-
-msgctxt "field:sale.line-account.invoice.line,invoice_line:"
-msgid "Invoice Line"
-msgstr ""
-
-#, fuzzy
-msgctxt "field:sale.line-account.invoice.line,rec_name:"
-msgid "Name"
-msgstr "Наименование"
-
-msgctxt "field:sale.line-account.invoice.line,sale_line:"
-msgid "Sale Line"
-msgstr ""
-
-msgctxt "field:sale.line-account.invoice.line,write_date:"
-msgid "Write Date"
-msgstr ""
-
-msgctxt "field:sale.line-account.invoice.line,write_uid:"
-msgid "Write User"
-msgstr ""
+msgstr "Изменено пользователем"
 
 msgctxt "field:sale.line-account.tax,create_date:"
 msgid "Create Date"
-msgstr ""
+msgstr "Дата создания"
 
 msgctxt "field:sale.line-account.tax,create_uid:"
 msgid "Create User"
-msgstr ""
+msgstr "Создано пользователем"
 
 msgctxt "field:sale.line-account.tax,id:"
 msgid "ID"
-msgstr ""
+msgstr "ID"
 
 msgctxt "field:sale.line-account.tax,line:"
 msgid "Sale Line"
-msgstr ""
+msgstr "Строка продажи"
 
-#, fuzzy
 msgctxt "field:sale.line-account.tax,rec_name:"
 msgid "Name"
 msgstr "Наименование"
 
 msgctxt "field:sale.line-account.tax,tax:"
 msgid "Tax"
-msgstr ""
+msgstr "Налог"
 
 msgctxt "field:sale.line-account.tax,write_date:"
 msgid "Write Date"
-msgstr ""
+msgstr "Дата изменения"
 
 msgctxt "field:sale.line-account.tax,write_uid:"
 msgid "Write User"
-msgstr ""
+msgstr "Изменено пользователем"
 
 msgctxt "field:sale.line-ignored-stock.move,create_date:"
 msgid "Create Date"
-msgstr ""
+msgstr "Дата создания"
 
 msgctxt "field:sale.line-ignored-stock.move,create_uid:"
 msgid "Create User"
-msgstr ""
+msgstr "Создано пользователем"
 
 msgctxt "field:sale.line-ignored-stock.move,id:"
 msgid "ID"
-msgstr ""
+msgstr "ID"
 
-#, fuzzy
 msgctxt "field:sale.line-ignored-stock.move,move:"
 msgid "Move"
 msgstr "Перемещение"
 
-#, fuzzy
 msgctxt "field:sale.line-ignored-stock.move,rec_name:"
 msgid "Name"
 msgstr "Наименование"
 
 msgctxt "field:sale.line-ignored-stock.move,sale_line:"
 msgid "Sale Line"
-msgstr ""
+msgstr "Строка продажи"
 
 msgctxt "field:sale.line-ignored-stock.move,write_date:"
 msgid "Write Date"
-msgstr ""
+msgstr "Дата изменения"
 
 msgctxt "field:sale.line-ignored-stock.move,write_uid:"
 msgid "Write User"
-msgstr ""
+msgstr "Изменено пользователем"
 
 msgctxt "field:sale.line-recreated-stock.move,create_date:"
 msgid "Create Date"
-msgstr ""
+msgstr "Дата создания"
 
 msgctxt "field:sale.line-recreated-stock.move,create_uid:"
 msgid "Create User"
-msgstr ""
+msgstr "Создано пользователем"
 
 msgctxt "field:sale.line-recreated-stock.move,id:"
 msgid "ID"
-msgstr ""
+msgstr "ID"
 
-#, fuzzy
 msgctxt "field:sale.line-recreated-stock.move,move:"
 msgid "Move"
 msgstr "Перемещение"
 
-#, fuzzy
 msgctxt "field:sale.line-recreated-stock.move,rec_name:"
 msgid "Name"
 msgstr "Наименование"
 
 msgctxt "field:sale.line-recreated-stock.move,sale_line:"
 msgid "Sale Line"
-msgstr ""
+msgstr "Строка продажи"
 
 msgctxt "field:sale.line-recreated-stock.move,write_date:"
 msgid "Write Date"
-msgstr ""
+msgstr "Дата изменения"
 
 msgctxt "field:sale.line-recreated-stock.move,write_uid:"
 msgid "Write User"
-msgstr ""
+msgstr "Изменено пользователем"
 
-#, fuzzy
 msgctxt "field:sale.sale,comment:"
 msgid "Comment"
 msgstr "Комментарии"
 
-#, fuzzy
 msgctxt "field:sale.sale,company:"
 msgid "Company"
-msgstr "Учет.орг."
+msgstr "Организация"
 
 msgctxt "field:sale.sale,create_date:"
 msgid "Create Date"
-msgstr ""
+msgstr "Дата создания"
 
 msgctxt "field:sale.sale,create_uid:"
 msgid "Create User"
-msgstr ""
+msgstr "Создано пользователем"
 
-#, fuzzy
 msgctxt "field:sale.sale,currency:"
 msgid "Currency"
-msgstr "Валюты"
+msgstr "Валюта"
 
 msgctxt "field:sale.sale,currency_digits:"
 msgid "Currency Digits"
-msgstr ""
+msgstr "Кол-во цифр валюты"
 
-#, fuzzy
 msgctxt "field:sale.sale,description:"
 msgid "Description"
 msgstr "Описание"
 
 msgctxt "field:sale.sale,id:"
 msgid "ID"
-msgstr ""
+msgstr "ID"
 
 msgctxt "field:sale.sale,invoice_address:"
 msgid "Invoice Address"
-msgstr ""
+msgstr "Адрес для инвойса"
 
 msgctxt "field:sale.sale,invoice_method:"
 msgid "Invoice Method"
-msgstr ""
+msgstr "Метод инвойса"
 
 msgctxt "field:sale.sale,invoice_state:"
 msgid "Invoice State"
-msgstr ""
+msgstr "Состояние инвойса"
 
 msgctxt "field:sale.sale,invoices:"
 msgid "Invoices"
-msgstr ""
+msgstr "Инвойсы"
 
 msgctxt "field:sale.sale,invoices_ignored:"
 msgid "Ignored Invoices"
-msgstr ""
+msgstr "Игнорированные инвойсы"
 
 msgctxt "field:sale.sale,invoices_recreated:"
 msgid "Recreated Invoices"
-msgstr ""
+msgstr "Созданные заново инвойсы"
 
-#, fuzzy
 msgctxt "field:sale.sale,lines:"
 msgid "Lines"
 msgstr "Строки"
 
-#, fuzzy
 msgctxt "field:sale.sale,moves:"
 msgid "Moves"
 msgstr "Перемещения"
 
-#, fuzzy
 msgctxt "field:sale.sale,party:"
 msgid "Party"
-msgstr "Организации"
+msgstr "Контрагент"
 
 msgctxt "field:sale.sale,party_lang:"
 msgid "Party Language"
-msgstr ""
+msgstr "Язык контрагента"
 
 msgctxt "field:sale.sale,payment_term:"
 msgid "Payment Term"
-msgstr ""
+msgstr "Правило оплаты"
 
-#, fuzzy
 msgctxt "field:sale.sale,rec_name:"
 msgid "Name"
 msgstr "Наименование"
 
-#, fuzzy
 msgctxt "field:sale.sale,reference:"
 msgid "Reference"
 msgstr "Ссылка"
 
 msgctxt "field:sale.sale,sale_date:"
 msgid "Sale Date"
-msgstr ""
+msgstr "Дата продажи"
 
 msgctxt "field:sale.sale,shipment_address:"
 msgid "Shipment Address"
-msgstr ""
+msgstr "Адрес доставки"
 
 msgctxt "field:sale.sale,shipment_method:"
 msgid "Shipment Method"
-msgstr ""
+msgstr "Метод доставки"
 
 msgctxt "field:sale.sale,shipment_returns:"
 msgid "Shipment Returns"
-msgstr ""
+msgstr "Возврат"
 
 msgctxt "field:sale.sale,shipment_state:"
 msgid "Shipment State"
-msgstr ""
+msgstr "Состояние доставки"
 
 msgctxt "field:sale.sale,shipments:"
 msgid "Shipments"
-msgstr ""
+msgstr "Доставка"
 
-#, fuzzy
 msgctxt "field:sale.sale,state:"
 msgid "State"
-msgstr "Статус"
+msgstr "Состояние"
 
 msgctxt "field:sale.sale,tax_amount:"
 msgid "Tax"
-msgstr ""
+msgstr "Налог"
 
 msgctxt "field:sale.sale,tax_amount_cache:"
 msgid "Tax Cache"
-msgstr ""
+msgstr "Облагаемые налогом"
 
 msgctxt "field:sale.sale,total_amount:"
 msgid "Total"
-msgstr ""
+msgstr "Итого"
 
 msgctxt "field:sale.sale,total_amount_cache:"
 msgid "Total Tax"
-msgstr ""
+msgstr "Итого налог:"
 
 msgctxt "field:sale.sale,untaxed_amount:"
 msgid "Untaxed"
-msgstr ""
+msgstr "Без налога"
 
 msgctxt "field:sale.sale,untaxed_amount_cache:"
 msgid "Untaxed Cache"
-msgstr ""
+msgstr "Необлагаемые налогом"
 
-#, fuzzy
 msgctxt "field:sale.sale,warehouse:"
 msgid "Warehouse"
 msgstr "Товарный склад"
 
 msgctxt "field:sale.sale,write_date:"
 msgid "Write Date"
-msgstr ""
+msgstr "Дата изменения"
 
 msgctxt "field:sale.sale,write_uid:"
 msgid "Write User"
-msgstr ""
+msgstr "Изменено пользователем"
 
 msgctxt "field:sale.sale-account.invoice,create_date:"
 msgid "Create Date"
-msgstr ""
+msgstr "Дата создания"
 
 msgctxt "field:sale.sale-account.invoice,create_uid:"
 msgid "Create User"
-msgstr ""
+msgstr "Создано пользователем"
 
 msgctxt "field:sale.sale-account.invoice,id:"
 msgid "ID"
-msgstr ""
+msgstr "ID"
 
 msgctxt "field:sale.sale-account.invoice,invoice:"
 msgid "Invoice"
-msgstr ""
+msgstr "Инвойс"
 
-#, fuzzy
 msgctxt "field:sale.sale-account.invoice,rec_name:"
 msgid "Name"
 msgstr "Наименование"
 
 msgctxt "field:sale.sale-account.invoice,sale:"
 msgid "Sale"
-msgstr ""
+msgstr "Продажа"
 
 msgctxt "field:sale.sale-account.invoice,write_date:"
 msgid "Write Date"
-msgstr ""
+msgstr "Дата изменения"
 
 msgctxt "field:sale.sale-account.invoice,write_uid:"
 msgid "Write User"
-msgstr ""
+msgstr "Изменено пользователем"
 
 msgctxt "field:sale.sale-ignored-account.invoice,create_date:"
 msgid "Create Date"
-msgstr ""
+msgstr "Дата создания"
 
 msgctxt "field:sale.sale-ignored-account.invoice,create_uid:"
 msgid "Create User"
-msgstr ""
+msgstr "Создано пользователем"
 
 msgctxt "field:sale.sale-ignored-account.invoice,id:"
 msgid "ID"
-msgstr ""
+msgstr "ID"
 
 msgctxt "field:sale.sale-ignored-account.invoice,invoice:"
 msgid "Invoice"
-msgstr ""
+msgstr "Инвойс"
 
-#, fuzzy
 msgctxt "field:sale.sale-ignored-account.invoice,rec_name:"
 msgid "Name"
 msgstr "Наименование"
 
 msgctxt "field:sale.sale-ignored-account.invoice,sale:"
 msgid "Sale"
-msgstr ""
+msgstr "Продажа"
 
 msgctxt "field:sale.sale-ignored-account.invoice,write_date:"
 msgid "Write Date"
-msgstr ""
+msgstr "Дата изменения"
 
 msgctxt "field:sale.sale-ignored-account.invoice,write_uid:"
 msgid "Write User"
-msgstr ""
+msgstr "Изменено пользователем"
 
 msgctxt "field:sale.sale-recreated-account.invoice,create_date:"
 msgid "Create Date"
-msgstr ""
+msgstr "Дата создания"
 
 msgctxt "field:sale.sale-recreated-account.invoice,create_uid:"
 msgid "Create User"
-msgstr ""
+msgstr "Создано пользователем"
 
 msgctxt "field:sale.sale-recreated-account.invoice,id:"
 msgid "ID"
-msgstr ""
+msgstr "ID"
 
 msgctxt "field:sale.sale-recreated-account.invoice,invoice:"
 msgid "Invoice"
-msgstr ""
+msgstr "Инвойс"
 
-#, fuzzy
 msgctxt "field:sale.sale-recreated-account.invoice,rec_name:"
 msgid "Name"
 msgstr "Наименование"
 
 msgctxt "field:sale.sale-recreated-account.invoice,sale:"
 msgid "Sale"
-msgstr ""
+msgstr "Продажа"
 
 msgctxt "field:sale.sale-recreated-account.invoice,write_date:"
 msgid "Write Date"
-msgstr ""
+msgstr "Дата изменения"
 
 msgctxt "field:sale.sale-recreated-account.invoice,write_uid:"
 msgid "Write User"
-msgstr ""
+msgstr "Изменено пользователем"
 
 msgctxt "field:stock.move,sale:"
 msgid "Sale"
-msgstr ""
+msgstr "Продажа"
 
 msgctxt "field:stock.move,sale_exception_state:"
 msgid "Exception State"
-msgstr ""
-
-msgctxt "field:stock.move,sale_line:"
-msgid "Sale Line"
-msgstr ""
+msgstr "Состояние ситуации"
 
 msgctxt "help:product.template,delivery_time:"
 msgid "In number of days"
-msgstr ""
+msgstr "После указанного количества дней"
 
 msgctxt "help:sale.handle.invoice.exception.ask,recreate_invoices:"
 msgid ""
 "The selected invoices will be recreated. The other ones will be ignored."
 msgstr ""
+"Выбранные инвойсы будут созданы заново. Остальные будут проигнорированы."
 
 msgctxt "model:ir.action,name:act_invoice_form"
 msgid "Invoices"
-msgstr ""
+msgstr "Инвойсы"
 
 msgctxt "model:ir.action,name:act_open_customer"
 msgid "Parties associated to Sales"
-msgstr ""
+msgstr "Контрагенты связанные с продажами"
 
 msgctxt "model:ir.action,name:act_return_form"
 msgid "Returns"
-msgstr ""
+msgstr "Возвраты"
 
 msgctxt "model:ir.action,name:act_sale_configuration_form"
 msgid "Sales Configuration"
-msgstr ""
+msgstr "Конфигурация продаж"
 
 msgctxt "model:ir.action,name:act_sale_form"
 msgid "Sales"
-msgstr ""
+msgstr "Продажи"
 
 msgctxt "model:ir.action,name:act_sale_form2"
 msgid "Sales"
-msgstr ""
-
-msgctxt "model:ir.action,name:act_sale_form_confirmed"
-msgid "Confirmed Sales"
-msgstr ""
-
-msgctxt "model:ir.action,name:act_sale_form_draft"
-msgid "Draft Sales"
-msgstr ""
-
-msgctxt "model:ir.action,name:act_sale_form_processing"
-msgid "Processing Sales"
-msgstr ""
-
-msgctxt "model:ir.action,name:act_sale_form_quotation"
-msgid "Quotation Sales"
-msgstr ""
+msgstr "Продажи"
 
 msgctxt "model:ir.action,name:act_shipment_form"
 msgid "Shipments"
-msgstr ""
+msgstr "Доставка"
 
 msgctxt "model:ir.action,name:report_sale"
 msgid "Sale"
-msgstr ""
+msgstr "Продажа"
 
 msgctxt "model:ir.action,name:wizard_invoice_handle_exception"
 msgid "Handle Invoice Exception"
-msgstr ""
+msgstr "Обработка особых ситуаций инвойса"
 
 msgctxt "model:ir.action,name:wizard_return_sale"
 msgid "Create Return Sale"
-msgstr ""
+msgstr "Создать возврат продажи"
 
 msgctxt "model:ir.action,name:wizard_shipment_handle_exception"
 msgid "Handle Shipment Exception"
-msgstr ""
+msgstr "Обработка особых ситуаций доставки"
+
+msgctxt "model:ir.action.act_window.domain,name:act_sale_form_domain_all"
+msgid "All"
+msgstr "Все"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_sale_form_domain_confirmed"
+msgid "Confirmed"
+msgstr "Подтвержденно"
+
+msgctxt "model:ir.action.act_window.domain,name:act_sale_form_domain_draft"
+msgid "Draft"
+msgstr "Черновик"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_sale_form_domain_processing"
+msgid "Processing"
+msgstr "Обработка"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_sale_form_domain_quotation"
+msgid "Quotation"
+msgstr "Котировка"
 
 msgctxt "model:ir.sequence,name:sequence_sale"
 msgid "Sale"
-msgstr ""
+msgstr "Продажа"
 
 msgctxt "model:ir.sequence.type,name:sequence_type_sale"
 msgid "Sale"
-msgstr ""
+msgstr "Продажа"
 
-#, fuzzy
 msgctxt "model:ir.ui.menu,name:menu_configuration"
 msgid "Configuration"
 msgstr "Конфигурация"
 
 msgctxt "model:ir.ui.menu,name:menu_customer"
 msgid "Parties associated to Sales"
-msgstr ""
+msgstr "Контрагенты связанные с продажами"
 
 msgctxt "model:ir.ui.menu,name:menu_sale"
 msgid "Sales"
-msgstr ""
+msgstr "Продажи"
 
 msgctxt "model:ir.ui.menu,name:menu_sale_configuration"
 msgid "Sales Configuration"
-msgstr ""
+msgstr "Конфигурация продаж"
 
 msgctxt "model:ir.ui.menu,name:menu_sale_form"
 msgid "Sales"
-msgstr ""
-
-msgctxt "model:ir.ui.menu,name:menu_sale_form_confirmed"
-msgid "Confirmed Sales"
-msgstr ""
-
-msgctxt "model:ir.ui.menu,name:menu_sale_form_draft"
-msgid "Draft Sales"
-msgstr ""
-
-msgctxt "model:ir.ui.menu,name:menu_sale_form_processing"
-msgid "Processing Sales"
-msgstr ""
-
-msgctxt "model:ir.ui.menu,name:menu_sale_form_quotation"
-msgid "Quotation Sales"
-msgstr ""
+msgstr "Продажи"
 
 msgctxt "model:res.group,name:group_sale"
 msgid "Sales"
-msgstr ""
+msgstr "Продажи"
 
 msgctxt "model:res.group,name:group_sale_admin"
 msgid "Sales Administrator"
-msgstr ""
+msgstr "Администрирование продаж"
 
 msgctxt "model:sale.configuration,name:"
 msgid "Sale Configuration"
-msgstr ""
+msgstr "Конфигурация продаж"
 
 msgctxt "model:sale.handle.invoice.exception.ask,name:"
 msgid "Handle Invoice Exception"
-msgstr ""
+msgstr "Обработка особых ситуаций инвойса"
 
 msgctxt "model:sale.handle.shipment.exception.ask,name:"
 msgid "Handle Shipment Exception"
-msgstr ""
+msgstr "Обработка особых ситуаций доставки"
 
 msgctxt "model:sale.line,name:"
 msgid "Sale Line"
-msgstr ""
-
-msgctxt "model:sale.line-account.invoice.line,name:"
-msgid "Sale Line - Invoice Line"
-msgstr ""
+msgstr "Строка продажи"
 
 msgctxt "model:sale.line-account.tax,name:"
 msgid "Sale Line - Tax"
-msgstr ""
+msgstr "Строка продажи - Налоги"
 
 msgctxt "model:sale.line-ignored-stock.move,name:"
 msgid "Sale Line - Ignored Move"
-msgstr ""
+msgstr "Строка продажи - Игнорированные перемещения"
 
 msgctxt "model:sale.line-recreated-stock.move,name:"
 msgid "Sale Line - Recreated Move"
-msgstr ""
+msgstr "Строка продажи - Созданные заново перемещения"
 
 msgctxt "model:sale.sale,name:"
 msgid "Sale"
-msgstr ""
+msgstr "Продажа"
 
 msgctxt "model:sale.sale-account.invoice,name:"
 msgid "Sale - Invoice"
-msgstr ""
+msgstr "Продажи - Инвойсы"
 
 msgctxt "model:sale.sale-ignored-account.invoice,name:"
 msgid "Sale - Ignored Invoice"
-msgstr ""
+msgstr "Продажи - Игнорируемые инвойсы"
 
 msgctxt "model:sale.sale-recreated-account.invoice,name:"
 msgid "Sale - Recreated Invoice"
-msgstr ""
+msgstr "Продажи - Созданные заново инвойсы"
 
 msgctxt "odt:sale.sale:"
 msgid "Amount"
-msgstr ""
+msgstr "Сумма"
 
-#, fuzzy
 msgctxt "odt:sale.sale:"
 msgid "Date:"
 msgstr "Дата:"
 
-#, fuzzy
 msgctxt "odt:sale.sale:"
 msgid "Description"
 msgstr "Описание"
 
 msgctxt "odt:sale.sale:"
 msgid "Description:"
-msgstr ""
+msgstr "Описание:"
 
 msgctxt "odt:sale.sale:"
 msgid "Draft Sale Order"
-msgstr ""
+msgstr "Черновой заказ на продажу"
 
-#, fuzzy
 msgctxt "odt:sale.sale:"
 msgid "E-Mail:"
-msgstr "E-Mail:"
+msgstr "Эл.почта:"
 
-#, fuzzy
 msgctxt "odt:sale.sale:"
 msgid "Phone:"
 msgstr "Телефон:"
 
-#, fuzzy
 msgctxt "odt:sale.sale:"
 msgid "Quantity"
 msgstr "Кол-во"
 
 msgctxt "odt:sale.sale:"
 msgid "Quotation N°:"
-msgstr ""
+msgstr "Котировка N°:"
 
 msgctxt "odt:sale.sale:"
 msgid "Sale Order N°:"
-msgstr ""
+msgstr "Заказ на продажу №:"
 
 msgctxt "odt:sale.sale:"
 msgid "Taxes"
-msgstr ""
+msgstr "Налоги"
 
 msgctxt "odt:sale.sale:"
 msgid "Taxes:"
-msgstr ""
+msgstr "Налоги:"
 
 msgctxt "odt:sale.sale:"
 msgid "Total (excl. taxes):"
-msgstr ""
+msgstr "Итого (без налогов):"
 
 msgctxt "odt:sale.sale:"
 msgid "Total:"
-msgstr ""
+msgstr "Итого:"
 
-#, fuzzy
 msgctxt "odt:sale.sale:"
 msgid "Unit Price"
 msgstr "Цена за единицу"
 
 msgctxt "odt:sale.sale:"
 msgid "VAT Number:"
-msgstr ""
+msgstr "ИНН:"
 
 msgctxt "odt:sale.sale:"
 msgid "VAT:"
-msgstr ""
+msgstr "ИНН:"
 
 msgctxt "selection:account.invoice,sale_exception_state:"
 msgid ""
@@ -918,140 +833,131 @@ msgstr ""
 
 msgctxt "selection:account.invoice,sale_exception_state:"
 msgid "Ignored"
-msgstr ""
+msgstr "Игнорируется"
 
 msgctxt "selection:account.invoice,sale_exception_state:"
 msgid "Recreated"
-msgstr ""
+msgstr "Создано заново"
 
 msgctxt "selection:sale.configuration,sale_invoice_method:"
 msgid "Manual"
-msgstr ""
+msgstr "Ручной"
 
 msgctxt "selection:sale.configuration,sale_invoice_method:"
 msgid "On Order Processed"
-msgstr ""
+msgstr "При обработке заказа"
 
 msgctxt "selection:sale.configuration,sale_invoice_method:"
 msgid "On Shipment Sent"
-msgstr ""
+msgstr "При отправке груза"
 
 msgctxt "selection:sale.configuration,sale_shipment_method:"
 msgid "Manual"
-msgstr ""
+msgstr "Ручной"
 
 msgctxt "selection:sale.configuration,sale_shipment_method:"
 msgid "On Invoice Paid"
-msgstr ""
+msgstr "При оплате инвойса"
 
 msgctxt "selection:sale.configuration,sale_shipment_method:"
 msgid "On Order Processed"
-msgstr ""
+msgstr "При обработке заказа"
 
-#, fuzzy
 msgctxt "selection:sale.line,type:"
 msgid "Comment"
 msgstr "Комментарии"
 
 msgctxt "selection:sale.line,type:"
 msgid "Line"
-msgstr ""
+msgstr "Строка"
 
 msgctxt "selection:sale.line,type:"
 msgid "Subtotal"
-msgstr ""
+msgstr "Подитог"
 
 msgctxt "selection:sale.line,type:"
 msgid "Title"
-msgstr ""
+msgstr "Заголовок"
 
 msgctxt "selection:sale.sale,invoice_method:"
 msgid "Manual"
-msgstr ""
+msgstr "Ручной"
 
 msgctxt "selection:sale.sale,invoice_method:"
 msgid "On Order Processed"
-msgstr ""
+msgstr "При обработке заказа"
 
 msgctxt "selection:sale.sale,invoice_method:"
 msgid "On Shipment Sent"
-msgstr ""
+msgstr "При отправке груза"
 
 msgctxt "selection:sale.sale,invoice_state:"
 msgid "Exception"
-msgstr ""
+msgstr "Особая ситуация"
 
-#, fuzzy
 msgctxt "selection:sale.sale,invoice_state:"
 msgid "None"
 msgstr "Отсутствует"
 
 msgctxt "selection:sale.sale,invoice_state:"
 msgid "Paid"
-msgstr ""
+msgstr "Оплачен"
 
-#, fuzzy
 msgctxt "selection:sale.sale,invoice_state:"
 msgid "Waiting"
 msgstr "Ожидание"
 
 msgctxt "selection:sale.sale,shipment_method:"
 msgid "Manual"
-msgstr ""
+msgstr "Ручной"
 
 msgctxt "selection:sale.sale,shipment_method:"
 msgid "On Invoice Paid"
-msgstr ""
+msgstr "При оплате инвойса"
 
 msgctxt "selection:sale.sale,shipment_method:"
 msgid "On Order Processed"
-msgstr ""
+msgstr "При обработке заказа"
 
 msgctxt "selection:sale.sale,shipment_state:"
 msgid "Exception"
-msgstr ""
+msgstr "Особая ситуация"
 
-#, fuzzy
 msgctxt "selection:sale.sale,shipment_state:"
 msgid "None"
 msgstr "Отсутствует"
 
 msgctxt "selection:sale.sale,shipment_state:"
 msgid "Sent"
-msgstr ""
+msgstr "Отправлен"
 
-#, fuzzy
 msgctxt "selection:sale.sale,shipment_state:"
 msgid "Waiting"
 msgstr "Ожидание"
 
-#, fuzzy
 msgctxt "selection:sale.sale,state:"
 msgid "Canceled"
 msgstr "Отменено"
 
-#, fuzzy
 msgctxt "selection:sale.sale,state:"
 msgid "Confirmed"
 msgstr "Подтвержденно"
 
-#, fuzzy
 msgctxt "selection:sale.sale,state:"
 msgid "Done"
 msgstr "Выполнено"
 
-#, fuzzy
 msgctxt "selection:sale.sale,state:"
 msgid "Draft"
 msgstr "Черновик"
 
 msgctxt "selection:sale.sale,state:"
 msgid "Processing"
-msgstr ""
+msgstr "Обработка"
 
 msgctxt "selection:sale.sale,state:"
 msgid "Quotation"
-msgstr ""
+msgstr "Котировка"
 
 msgctxt "selection:stock.move,sale_exception_state:"
 msgid ""
@@ -1059,154 +965,120 @@ msgstr ""
 
 msgctxt "selection:stock.move,sale_exception_state:"
 msgid "Ignored"
-msgstr ""
+msgstr "Игнорируется"
 
 msgctxt "selection:stock.move,sale_exception_state:"
 msgid "Recreated"
-msgstr ""
+msgstr "Создано заново"
 
-#, fuzzy
 msgctxt "view:product.product:"
 msgid "Products"
-msgstr "ТМЦ"
+msgstr "Продукция"
 
 msgctxt "view:product.template:"
 msgid "Customers"
-msgstr ""
+msgstr "Заказчики"
 
 msgctxt "view:sale.configuration:"
 msgid "Sale Configuration"
-msgstr ""
+msgstr "Конфигурация продаж"
 
 msgctxt "view:sale.handle.invoice.exception.ask:"
 msgid "Choose invoices to recreate"
-msgstr ""
+msgstr "Выберите инвойсы для пересоздания"
 
 msgctxt "view:sale.handle.invoice.exception.ask:"
 msgid "Handle Invoice Exception"
-msgstr ""
+msgstr "Обработка особых ситуаций инвойса"
 
 msgctxt "view:sale.handle.shipment.exception.ask:"
 msgid "Choose move to recreate"
-msgstr ""
+msgstr "Выберите проводки для пересоздания"
 
 msgctxt "view:sale.handle.shipment.exception.ask:"
 msgid "Handle shipment Exception"
-msgstr ""
+msgstr "Обработка особых ситуаций доставки"
 
-msgctxt "view:sale.handle.shipment.exception.ask:"
-msgid "Recreate Moves"
-msgstr ""
-
-#, fuzzy
 msgctxt "view:sale.line:"
 msgid "General"
 msgstr "Основной"
 
-#, fuzzy
 msgctxt "view:sale.line:"
 msgid "Notes"
 msgstr "Комментарии"
 
-#, fuzzy
-msgctxt "view:sale.line:"
-msgid "Products"
-msgstr "ТМЦ"
-
 msgctxt "view:sale.line:"
 msgid "Sale Line"
-msgstr ""
+msgstr "Строка продажи"
 
 msgctxt "view:sale.line:"
 msgid "Sale Lines"
-msgstr ""
+msgstr "Строки продажи"
 
-#, fuzzy
 msgctxt "view:sale.sale:"
 msgid "Cancel"
 msgstr "Отменить"
 
-#, fuzzy
 msgctxt "view:sale.sale:"
 msgid "Confirm"
-msgstr "Подтверждать"
+msgstr "Подтвердить"
 
-#, fuzzy
 msgctxt "view:sale.sale:"
 msgid "Draft"
 msgstr "Черновик"
 
 msgctxt "view:sale.sale:"
 msgid "Handle Invoice Exception"
-msgstr ""
+msgstr "Обработка особых ситуаций инвойса"
 
 msgctxt "view:sale.sale:"
 msgid "Handle Shipment Exception"
-msgstr ""
+msgstr "Обработка особых ситуаций доставки"
 
 msgctxt "view:sale.sale:"
 msgid "Invoices"
-msgstr ""
-
-#, fuzzy
-msgctxt "view:sale.sale:"
-msgid "Lines"
-msgstr "Строки"
-
-#, fuzzy
-msgctxt "view:sale.sale:"
-msgid "Moves"
-msgstr "Перемещения"
+msgstr "Инвойсы"
 
 msgctxt "view:sale.sale:"
 msgid "Other Info"
-msgstr ""
+msgstr "Другая информация"
 
 msgctxt "view:sale.sale:"
 msgid "Process"
-msgstr ""
-
-msgctxt "view:sale.sale:"
-msgid "Quotation"
-msgstr ""
+msgstr "Обработка"
 
 msgctxt "view:sale.sale:"
 msgid "Quote"
-msgstr ""
+msgstr "Котировать"
 
 msgctxt "view:sale.sale:"
 msgid "Sale"
-msgstr ""
+msgstr "Продажа"
 
 msgctxt "view:sale.sale:"
 msgid "Sales"
-msgstr ""
+msgstr "Продажи"
 
 msgctxt "view:sale.sale:"
 msgid "Shipments"
-msgstr ""
+msgstr "Доставка"
 
-#, fuzzy
 msgctxt "view:stock.move:"
 msgid "Moves"
 msgstr "Перемещения"
 
-#, fuzzy
 msgctxt "wizard_button:sale.handle.invoice.exception,ask,end:"
 msgid "Cancel"
 msgstr "Отменить"
 
-#, fuzzy
 msgctxt "wizard_button:sale.handle.invoice.exception,ask,handle:"
 msgid "Ok"
-msgstr "Да"
+msgstr "Ок"
 
-#, fuzzy
 msgctxt "wizard_button:sale.handle.shipment.exception,ask,end:"
 msgid "Cancel"
 msgstr "Отменить"
 
-#, fuzzy
 msgctxt "wizard_button:sale.handle.shipment.exception,ask,handle:"
 msgid "Ok"
-msgstr "Да"
+msgstr "Ок"
diff --git a/product.xml b/product.xml
index adff21d..ab85b70 100644
--- a/product.xml
+++ b/product.xml
@@ -7,20 +7,7 @@ this repository contains the full copyright notices and license terms. -->
             <field name="model">product.product</field>
             <field name="type">tree</field>
             <field name="priority" eval="20"/>
-            <field name="arch" type="xml">
-                <![CDATA[
-                <tree string="Products">
-                    <field name="name"/>
-                    <field name="code"/>
-                    <field name="list_price_uom"/>
-                    <field name="cost_price_uom"/>
-                    <field name="quantity"/>
-                    <field name="forecast_quantity"/>
-                    <field name="default_uom"/>
-                    <field name="active"/>
-                </tree>
-                ]]>
-            </field>
+            <field name="name">product_list_sale_line</field>
         </record>
     </data>
 </tryton>
diff --git a/sale.py b/sale.py
index 63bf9de..45902e9 100644
--- a/sale.py
+++ b/sale.py
@@ -2,7 +2,7 @@
 #this repository contains the full copyright notices and license terms.
 from decimal import Decimal
 import datetime
-from itertools import groupby
+from itertools import groupby, chain
 from functools import partial
 from trytond.model import Workflow, ModelView, ModelSQL, fields
 from trytond.modules.company import CompanyReport
@@ -12,10 +12,9 @@ from trytond.backend import TableHandler
 from trytond.pyson import If, Eval, Bool, PYSONEncoder, Id
 from trytond.transaction import Transaction
 from trytond.pool import Pool, PoolMeta
-from trytond.config import CONFIG
 
 __all__ = ['Sale', 'SaleInvoice', 'SaleIgnoredInvoice', 'SaleRecreatedInvoice',
-    'SaleLine', 'SaleLineTax', 'SaleLineInvoiceLine', 'SaleLineIgnoredMove',
+    'SaleLine', 'SaleLineTax', 'SaleLineIgnoredMove',
     'SaleLineRecreatedMove', 'SaleReport', 'Template', 'Product',
     'ShipmentOut', 'ShipmentOutReturn', 'Move', 'OpenCustomer',
     'HandleShipmentExceptionAsk', 'HandleShipmentException',
@@ -167,19 +166,17 @@ class Sale(Workflow, ModelSQL, ModelView):
         super(Sale, cls).__setup__()
         cls._order.insert(0, ('sale_date', 'DESC'))
         cls._order.insert(1, ('id', 'DESC'))
-        cls._constraints += [
-            ('check_method', 'wrong_method')
-            ]
         cls._error_messages.update({
-                'wrong_method': 'Wrong combination of method!',
-                'addresses_required': 'Invoice and Shipment addresses must be '
-                'defined for the quotation.',
-                'warehouse_required': 'Warehouse must be defined for the ' \
-                    'quotation.',
-                'missing_account_receivable': 'It misses '
-                'an "Account Receivable" on the party "%s"!',
-                'delete_cancel': 'Sale "%s" must be cancelled ' \
-                    'before deletion!',
+                'invalid_method': ('Invalid combination of shipment and '
+                    'invoicing methods on sale "%s".'),
+                '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".'),
+                'missing_account_receivable': ('It misses '
+                        'an "Account Receivable" on the party "%s".'),
+                'delete_cancel': ('Sale "%s" must be cancelled before '
+                    'deletion.'),
                 })
         cls._transitions |= set((
                 ('draft', 'quotation'),
@@ -230,7 +227,7 @@ class Sale(Workflow, ModelSQL, ModelView):
     def __register__(cls, module_name):
         pool = Pool()
         SaleLine = pool.get('sale.line')
-        SaleLine_InvoiceLine = pool.get('sale.line-account.invoice.line')
+        sale_line_invoice_line_table = 'sale_line_invoice_lines_rel'
         Move = pool.get('stock.move')
         cursor = Transaction().cursor
         # Migration from 1.2: packing renamed into shipment
@@ -263,7 +260,7 @@ class Sale(Workflow, ModelSQL, ModelView):
         # state confirmed splitted into confirmed and processing
         if (TableHandler.table_exist(cursor, SaleLine._table)
                 and TableHandler.table_exist(cursor,
-                    SaleLine_InvoiceLine._table)
+                    sale_line_invoice_line_table)
                 and TableHandler.table_exist(cursor, 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
@@ -277,12 +274,13 @@ class Sale(Workflow, ModelSQL, ModelView):
                         '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.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,
-                    SaleLine_InvoiceLine._table, Move._table))
+                    sale_line_invoice_line_table, Move._table,
+                    SaleLine.__name__))
 
         # Add index on create_date
         table = TableHandler(cursor, cls, module_name)
@@ -385,9 +383,10 @@ class Sale(Workflow, ModelSQL, ModelView):
         return res
 
     def on_change_with_party_lang(self, name=None):
+        Config = Pool().get('ir.configuration')
         if self.party and self.party.lang:
             return self.party.lang.code
-        return CONFIG['language']
+        return Config.get_language()
 
     def on_change_lines(self):
         pool = Pool()
@@ -495,21 +494,20 @@ class Sale(Workflow, ModelSQL, ModelView):
                     'invoice_state': state,
                     })
 
-    def get_shipments_returns(attribute):
+    def get_shipments_returns(model_name):
         "Computes the returns or shipments"
         def method(self, name):
-            shipments = []
+            Model = Pool().get(model_name)
+            shipments = set()
             for line in self.lines:
                 for move in line.moves:
-                    ship_or_return = getattr(move, attribute)
-                    if bool(ship_or_return):
-                        if ship_or_return.id not in shipments:
-                            shipments.append(ship_or_return.id)
-            return shipments
+                    if isinstance(move.shipment, Model):
+                        shipments.add(move.shipment.id)
+            return list(shipments)
         return method
 
-    get_shipments = get_shipments_returns('shipment_out')
-    get_shipment_returns = get_shipments_returns('shipment_out_return')
+    get_shipments = get_shipments_returns('stock.shipment.out')
+    get_shipment_returns = get_shipments_returns('stock.shipment.out.return')
 
     def get_moves(self, name):
         return [m.id for l in self.lines for m in l.moves]
@@ -537,17 +535,22 @@ class Sale(Workflow, ModelSQL, ModelView):
                     'shipment_state': state,
                     })
 
+    @classmethod
+    def validate(cls, sales):
+        super(Sale, cls).validate(sales)
+        for sale in sales:
+            sale.check_method()
+
     def check_method(self):
         '''
         Check the methods.
         '''
         if (self.invoice_method == 'shipment'
                 and self.shipment_method in ('invoice', 'manual')):
-            return False
+            self.raise_user_error('invalid_method', (self.rec_name,))
         if (self.shipment_method == 'invoice'
                 and self.invoice_method in ('shipment', 'manual')):
-            return False
-        return True
+            self.raise_user_error('invalid_method', (self.rec_name,))
 
     def get_rec_name(self, name):
         return (self.reference or str(self.id)
@@ -577,7 +580,7 @@ class Sale(Workflow, ModelSQL, ModelView):
 
     def check_for_quotation(self):
         if not self.invoice_address or not self.shipment_address:
-            self.raise_user_error('addresses_required')
+            self.raise_user_error('addresses_required', (self.rec_name,))
         for line in self.lines:
             if line.quantity >= 0:
                 location = line.from_location
@@ -586,7 +589,8 @@ class Sale(Workflow, ModelSQL, ModelView):
             if ((not location or not line.warehouse)
                     and line.product
                     and line.product.type in ('goods', 'assets')):
-                self.raise_user_error('warehouse_required')
+                self.raise_user_error('warehouse_required',
+                    (self.rec_name,))
 
     @classmethod
     def set_reference(cls, sales):
@@ -670,31 +674,21 @@ class Sale(Workflow, ModelSQL, ModelView):
         '''
         pool = Pool()
         Invoice = pool.get('account.invoice')
-        SaleLine = pool.get('sale.line')
         if self.invoice_method == 'manual':
             return
 
         if not self.party.account_receivable:
             self.raise_user_error('missing_account_receivable',
-                    error_args=(self.party.rec_name,))
+                (self.party.rec_name,))
 
         invoice_lines = self._get_invoice_line_sale_line(invoice_type)
         if not invoice_lines:
             return
 
         invoice = self._get_invoice_sale(invoice_type)
+        invoice.lines = list(chain.from_iterable(invoice_lines.itervalues()))
         invoice.save()
 
-        for line in self.lines:
-            if line.id not in invoice_lines:
-                continue
-            for invoice_line in invoice_lines[line.id]:
-                invoice_line.invoice = invoice.id
-                invoice_line.save()
-                SaleLine.write([line], {
-                        'invoice_lines': [('add', [invoice_line.id])],
-                        })
-
         with Transaction().set_user(0, set_context=True):
             Invoice.update_taxes([invoice])
 
@@ -737,7 +731,6 @@ class Sale(Workflow, ModelSQL, ModelView):
         Create and return shipments of type shipment_type
         '''
         pool = Pool()
-        SaleLine = pool.get('sale.line')
 
         if self.shipment_method == 'manual':
             return
@@ -747,11 +740,9 @@ class Sale(Workflow, ModelSQL, ModelView):
             return
         if shipment_type == 'out':
             keyfunc = partial(self._group_shipment_key, moves.values())
-            move_shipment_key = 'shipment_out'
             Shipment = pool.get('stock.shipment.out')
         elif shipment_type == 'return':
             keyfunc = partial(self._group_return_key, moves.values())
-            move_shipment_key = 'shipment_out_return'
             Shipment = pool.get('stock.shipment.out.return')
         moves = moves.items()
         moves = sorted(moves, key=keyfunc)
@@ -766,14 +757,10 @@ class Sale(Workflow, ModelSQL, ModelView):
                 }
             values.update(dict(key))
             with Transaction().set_user(0, set_context=True):
-                shipment = Shipment.create(values)
+                shipment = Shipment(**values)
+                shipment.moves = [x[1] for x in grouped_moves]
+                shipment.save()
                 shipments.append(shipment)
-                for line_id, move in grouped_moves:
-                    setattr(move, move_shipment_key, shipment.id)
-                    move.save()
-                    SaleLine.write([SaleLine(line_id)], {
-                            'moves': [('add', [move.id])],
-                            })
         if shipment_type == 'out':
             with Transaction().set_user(0, set_context=True):
                 Shipment.wait(shipments)
@@ -791,7 +778,7 @@ class Sale(Workflow, ModelSQL, ModelView):
         cls.cancel(sales)
         for sale in sales:
             if sale.state != 'cancel':
-                cls.raise_user_error('delete_cancel', sale.rec_name)
+                cls.raise_user_error('delete_cancel', (sale.rec_name,))
         super(Sale, cls).delete(sales)
 
     @classmethod
@@ -960,13 +947,16 @@ class SaleLine(ModelSQL, ModelView):
     description = fields.Text('Description', size=None, required=True)
     note = fields.Text('Note')
     taxes = fields.Many2Many('sale.line-account.tax', 'line', 'tax', 'Taxes',
-        domain=[('parent', '=', None)], states={
+        domain=[('parent', '=', None), ['OR',
+                ('group', '=', None),
+                ('group.kind', 'in', ['sale', 'both'])],
+            ],
+        states={
             'invisible': Eval('type') != 'line',
             }, depends=['type'])
-    invoice_lines = fields.Many2Many('sale.line-account.invoice.line',
-            'sale_line', 'invoice_line', 'Invoice Lines', readonly=True)
-    moves = fields.One2Many('stock.move', 'sale_line', 'Moves',
-            readonly=True)
+    invoice_lines = fields.One2Many('account.invoice.line', 'origin',
+        'Invoice Lines', readonly=True)
+    moves = fields.One2Many('stock.move', 'origin', 'Moves', readonly=True)
     moves_ignored = fields.Many2Many('sale.line-ignored-stock.move',
             'sale_line', 'move', 'Ignored Moves', readonly=True)
     moves_recreated = fields.Many2Many('sale.line-recreated-stock.move',
@@ -981,11 +971,13 @@ class SaleLine(ModelSQL, ModelView):
     to_location = fields.Function(fields.Many2One('stock.location',
             'To Location'), 'get_to_location')
     delivery_date = fields.Function(fields.Date('Delivery Date',
-            on_change_with=['product', '_parent_sale.sale_date'],
+            on_change_with=['product', 'quantity', '_parent_sale.sale_date'],
             states={
-                'invisible': Eval('type') != 'line',
+                'invisible': ((Eval('type') != 'line')
+                    | (If(Bool(Eval('quantity')), Eval('quantity', 0), 0)
+                        <= 0)),
                 },
-            depends=['type']),
+            depends=['type', 'quantity']),
         'on_change_with_delivery_date')
 
     @classmethod
@@ -993,12 +985,13 @@ class SaleLine(ModelSQL, ModelView):
         super(SaleLine, cls).__setup__()
         cls._order.insert(0, ('sequence', 'ASC'))
         cls._error_messages.update({
-            'customer_location_required': 'The customer location is required!',
-            'missing_account_revenue': 'It misses '
-                    'an "Account Revenue" on product "%s"!',
-            'missing_account_revenue_property': 'It misses '
-                    'an "account Revenue" default property!',
-            })
+                '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.'),
+                'missing_account_revenue_property': ('Sale "%(sale)s" '
+                    'misses an "account revenue" default property.'),
+                })
 
     @classmethod
     def __register__(cls, module_name):
@@ -1196,7 +1189,7 @@ class SaleLine(ModelSQL, ModelView):
                 return self.warehouse.input_location.id
 
     def on_change_with_delivery_date(self, name=None):
-        if self.product:
+        if self.product and self.quantity > 0:
             date = self.sale.sale_date if self.sale else None
             return self.product.compute_delivery_date(date=date)
 
@@ -1259,15 +1252,19 @@ class SaleLine(ModelSQL, ModelView):
         if self.product:
             invoice_line.account = self.product.account_revenue_used
             if not invoice_line.account:
-                self.raise_user_error('missing_account_revenue',
-                        error_args=(self.product.rec_name,))
+                self.raise_user_error('missing_account_revenue', {
+                        'sale': self.sale.rec_name,
+                        'product': self.product.rec_name,
+                        })
         else:
             for model in ('product.template', 'product.category'):
                 invoice_line.account = Property.get('account_revenue', model)
                 if invoice_line.account:
                     break
             if not invoice_line.account:
-                self.raise_user_error('missing_account_revenue_property')
+                self.raise_user_error('missing_account_revenue_property',
+                    (self.sale.rec_name,))
+        invoice_line.origin = self
         return [invoice_line]
 
     @classmethod
@@ -1303,7 +1300,7 @@ class SaleLine(ModelSQL, ModelView):
         else:
             quantity = 0.0
             for invoice_line in self.invoice_lines:
-                if invoice_line.invoice.state in ('open', 'paid'):
+                if invoice_line.invoice.state in ('posted', 'paid'):
                     quantity += Uom.compute_qty(invoice_line.unit,
                         invoice_line.quantity, self.unit)
 
@@ -1315,7 +1312,10 @@ class SaleLine(ModelSQL, ModelView):
         if quantity <= 0.0:
             return
         if not self.sale.party.customer_location:
-            self.raise_user_error('customer_location_required')
+            self.raise_user_error('customer_location_required', {
+                    'sale': self.sale.rec_name,
+                    'line': self.rec_name,
+                    })
         with Transaction().set_user(0, set_context=True):
             move = Move()
         move.quantity = quantity
@@ -1328,6 +1328,7 @@ class SaleLine(ModelSQL, ModelView):
         move.unit_price = self.unit_price
         move.currency = self.sale.currency
         move.planned_date = self.delivery_date
+        move.origin = self
         return move
 
 
@@ -1341,16 +1342,6 @@ class SaleLineTax(ModelSQL):
             select=True, required=True)
 
 
-class SaleLineInvoiceLine(ModelSQL):
-    'Sale Line - Invoice Line'
-    __name__ = 'sale.line-account.invoice.line'
-    _table = 'sale_line_invoice_lines_rel'
-    sale_line = fields.Many2One('sale.line', 'Sale Line', ondelete='CASCADE',
-            select=True, required=True)
-    invoice_line = fields.Many2One('account.invoice.line', 'Invoice Line',
-            ondelete='RESTRICT', select=True, required=True)
-
-
 class SaleLineIgnoredMove(ModelSQL):
     'Sale Line - Ignored Move'
     __name__ = 'sale.line-ignored-stock.move'
@@ -1511,25 +1502,23 @@ class ShipmentOut:
             for shipment in shipments:
                 move_ids.extend([x.id for x in shipment.outgoing_moves])
 
-            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)
-
             with Transaction().set_user(0, set_context=True):
-                sales = Sale.browse([s.id for s in sales])
-            Sale.process(sales)
+                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 move.sale_line:
+                if (move.state == 'cancel'
+                        and isinstance(move.origin, SaleLine)):
                     cls.raise_user_error('reset_move')
 
         return super(ShipmentOut, cls).draft(shipments)
@@ -1560,25 +1549,27 @@ class ShipmentOutReturn:
             for shipment in shipments:
                 move_ids.extend([x.id for x in shipment.incoming_moves])
 
-            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)
-
             with Transaction().set_user(0, set_context=True):
-                sales = Sale.browse([s.id for s in sales])
-            Sale.process(sales)
+                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 move.sale_line:
+                if (move.state == 'cancel'
+                        and isinstance(move.origin, SaleLine)):
                     cls.raise_user_error('reset_move')
 
         return super(ShipmentOutReturn, cls).draft(shipments)
@@ -1586,33 +1577,51 @@ class ShipmentOutReturn:
 
 class Move:
     __name__ = 'stock.move'
-    sale_line = fields.Many2One('sale.line', 'Sale Line', select=True,
-        states={
-            'readonly': Eval('state') != 'draft',
-            },
-        depends=['state'])
     sale = fields.Function(fields.Many2One('sale.sale', 'Sale', select=True),
-            'get_sale', searcher='search_sale')
+        '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):
-        if self.sale_line:
-            return self.sale_line.sale.id
+        SaleLine = Pool().get('sale.line')
+        if isinstance(self.origin, SaleLine):
+            return self.origin.sale.id
 
     @classmethod
     def search_sale(cls, name, clause):
-        return [('sale_line.' + name,) + clause[1:]]
+        return [('origin.' + name,) + tuple(clause[1:]) + ('sale.line',)]
 
     def get_sale_exception_state(self, name):
-        if not self.sale_line:
+        SaleLine = Pool().get('sale.line')
+        if not isinstance(self.origin, SaleLine):
             return ''
-        if self in self.sale_line.moves_recreated:
+        if self in self.origin.moves_recreated:
             return 'recreated'
-        if self in self.sale_line.moves_ignored:
+        if self in self.origin.moves_ignored:
             return 'ignored'
         return ''
 
@@ -1624,17 +1633,13 @@ class Move:
 
         super(Move, cls).write(moves, vals)
         if 'state' in vals and vals['state'] in ('cancel',):
-            sales = set()
-            sale_lines = SaleLine.search([
-                    ('moves', 'in', [m.id for m in moves]),
-                    ])
-            if sale_lines:
-                for sale_line in sale_lines:
-                    sales.add(sale_line.sale)
-            if sales:
-                with Transaction().set_user(0, set_context=True):
-                    sales = Sale.browse([s.id for s in sales])
-                Sale.process(sales)
+            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):
@@ -1642,20 +1647,17 @@ class Move:
         Sale = pool.get('sale.sale')
         SaleLine = pool.get('sale.line')
 
-        sales = set()
-        sale_lines = SaleLine.search([
-                ('moves', 'in', [m.id for m in moves]),
-                ])
+        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:
-            for sale_line in sale_lines:
-                sales.add(sale_line.sale)
-            if sales:
-                with Transaction().set_user(0, set_context=True):
-                    sales = Sale.browse([s.id for s in sales])
-                Sale.process(list(sales))
+            sales = list(set(l.sale for l in sale_lines))
+            with Transaction().set_user(0, set_context=True):
+                Sale.process(sales)
 
 
 class OpenCustomer(Wizard):
@@ -1677,7 +1679,6 @@ class OpenCustomer(Wizard):
         model_data, = ModelData.search([
                 ('fs_id', '=', 'act_open_customer'),
                 ('module', '=', 'sale'),
-                ('inherit', '=', None),
                 ], limit=1)
         wizard = Wizard(model_data.db_id)
 
diff --git a/sale.xml b/sale.xml
index 3aec278..5db5c14 100644
--- a/sale.xml
+++ b/sale.xml
@@ -48,149 +48,24 @@ this repository contains the full copyright notices and license terms. -->
         <record model="ir.ui.view" id="sale_view_form">
             <field name="model">sale.sale</field>
             <field name="type">form</field>
-            <field name="arch" type="xml">
-                <![CDATA[
-                <form string="Sale" col="6">
-                    <label name="party"/>
-                    <field name="party"/>
-                    <label name="invoice_address"/>
-                    <field name="invoice_address"/>
-                    <label name="shipment_address"/>
-                    <field name="shipment_address"/>
-                    <label name="description"/>
-                    <field name="description" colspan="3"/>
-                    <label name="reference"/>
-                    <field name="reference"/>
-                    <notebook colspan="6">
-                        <page string="Sale" id="sale">
-                            <label name="sale_date"/>
-                            <field name="sale_date"/>
-                            <label name="payment_term"/>
-                            <field name="payment_term"/>
-                            <label name="warehouse"/>
-                            <field name="warehouse"/>
-                            <label name="currency"/>
-                            <field name="currency"/>
-                            <field name="lines" colspan="4"
-                                view_ids="sale.sale_line_view_tree_sequence"/>
-                            <group col="2" colspan="2" id="states">
-                                <label name="invoice_state"/>
-                                <field name="invoice_state"/>
-                                <label name="shipment_state"/>
-                                <field name="shipment_state"/>
-                                <label name="state"/>
-                                <field name="state"/>
-                            </group>
-                            <group col="2" colspan="2" id="amount_buttons">
-                                <label name="untaxed_amount" xalign="1.0" xexpand="1"/>
-                                <field name="untaxed_amount" xalign="1.0" xexpand="0"/>
-                                <label name="tax_amount" xalign="1.0" xexpand="1"/>
-                                <field name="tax_amount" xalign="1.0" xexpand="0"/>
-                                <label name="total_amount" xalign="1.0" xexpand="1"/>
-                                <field name="total_amount" xalign="1.0" xexpand="0"/>
-                                <group col="7" colspan="2" id="buttons">
-                                    <button name="cancel" string="Cancel"
-                                        icon="tryton-cancel"/>
-                                    <button name="draft" string="Draft"/>
-                                    <button name="quote" string="Quote"
-                                        icon="tryton-go-next"/>
-                                    <button name="handle_invoice_exception"
-                                        string="Handle Invoice Exception"
-                                        icon="tryton-go-next"/>
-                                    <button name="handle_shipment_exception"
-                                        string="Handle Shipment Exception"
-                                        icon="tryton-go-next"/>
-                                    <button name="confirm" string="Confirm"
-                                        icon="tryton-go-next"/>
-                                    <button name="process" string="Process"
-                                        icon="tryton-go-next"/>
-                                </group>
-                            </group>
-                        </page>
-                        <page string="Other Info" id="other">
-                            <label name="company"/>
-                            <field name="company"/>
-                            <newline/>
-                            <label name="invoice_method"/>
-                            <field name="invoice_method"/>
-                            <label name="shipment_method"/>
-                            <field name="shipment_method"/>
-                            <separator name="comment" colspan="4"/>
-                            <field name="comment" colspan="4" spell="Eval('party_lang')"/>
-                        </page>
-                        <page string="Invoices" id="invoices">
-                            <field name="invoices" colspan="4"/>
-                        </page>
-                        <page string="Shipments" id="shipments">
-                            <field name="moves" colspan="4"
-                                view_ids="sale.move_view_list_shipment"/>
-                            <field name="shipments" colspan="4"/>
-                            <field name="shipment_returns" colspan="4"/>
-                        </page>
-                    </notebook>
-                    <field name="currency_digits" invisible="1" colspan="6"/>
-                    <field name="party_lang" invisible="1" colspan="6"/>
-                </form>
-                ]]>
-            </field>
+            <field name="name">sale_form</field>
         </record>
         <record model="ir.ui.view" id="sale_view_tree">
             <field name="model">sale.sale</field>
             <field name="type">tree</field>
-            <field name="arch" type="xml">
-                <![CDATA[
-                <tree string="Sales">
-                    <field name="reference"/>
-                    <field name="sale_date"/>
-                    <field name="party"/>
-                    <field name="warehouse"/>
-                    <field name="currency"/>
-                    <field name="untaxed_amount"/>
-                    <field name="total_amount"/>
-                    <field name="state"/>
-                    <field name="invoice_state"/>
-                    <field name="shipment_state"/>
-                    <field name="description"/>
-                    <field name="currency_digits" tree_invisible="1"/>
-                    <field name="create_date" tree_invisible="1"/>
-                </tree>
-                ]]>
-            </field>
+            <field name="name">sale_tree</field>
         </record>
 
         <record model="ir.ui.view" id="handle_shipment_exception_ask_view_form">
             <field name="model">sale.handle.shipment.exception.ask</field>
             <field name="type">form</field>
-            <field name="arch" type="xml">
-                <![CDATA[
-                <form string="Handle shipment Exception" col="2">
-                    <image name="tryton-dialog-information" xexpand="0"
-                        xfill="0"/>
-                    <label string="Choose move to recreate"
-                        id="choose"
-                        yalign="0.0" xalign="0.0" xexpand="1"/>
-                    <field name="recreate_moves" colspan="2"
-                        view_ids="stock.move_view_tree"/>
-                </form>
-                ]]>
-            </field>
+            <field name="name">handle_shipment_exception_ask_form</field>
         </record>
 
         <record model="ir.ui.view" id="handle_invoice_exception_ask_view_form">
             <field name="model">sale.handle.invoice.exception.ask</field>
             <field name="type">form</field>
-            <field name="arch" type="xml">
-                <![CDATA[
-                <form string="Handle Invoice Exception" col="2">
-                    <image name="tryton-dialog-information" xexpand="0"
-                        xfill="0"/>
-                    <label string="Choose invoices to recreate"
-                        id="choose"
-                        yalign="0.0" xalign="0.0" xexpand="1"/>
-                    <field name="recreate_invoices" colspan="2"/>
-                </form>
-                ]]>
-            </field>
+            <field name="name">handle_invoice_exception_ask_form</field>
         </record>
 
         <record model="ir.action.act_window" id="act_shipment_form">
@@ -229,7 +104,7 @@ this repository contains the full copyright notices and license terms. -->
         <record model="ir.action.act_window" id="act_sale_form">
             <field name="name">Sales</field>
             <field name="res_model">sale.sale</field>
-            <field name="search_value">[('create_date', '>=', DateTime(hour=0, minute=0, second=0, microsecond=0, delta_years=-1))]</field>
+            <field name="search_value"></field>
         </record>
         <record model="ir.action.act_window.view" id="act_sale_form_view1">
             <field name="sequence" eval="10"/>
@@ -241,84 +116,43 @@ this repository contains the full copyright notices and license terms. -->
             <field name="view" ref="sale_view_form"/>
             <field name="act_window" ref="act_sale_form"/>
         </record>
-        <menuitem parent="menu_sale" action="act_sale_form"
-            id="menu_sale_form" sequence="10"/>
-        <record model="ir.ui.menu-res.group" id="menu_sale_form_group_sale">
-            <field name="menu" ref="menu_sale_form"/>
-            <field name="group" ref="group_sale"/>
-        </record>
-
-        <record model="ir.action.act_window" id="act_sale_form_draft">
-            <field name="name">Draft Sales</field>
-            <field name="res_model">sale.sale</field>
-            <field name="domain">[('state', '=', 'draft')]</field>
-        </record>
-        <record model="ir.action.act_window.view" id="act_sale_form_draft_view1">
+        <record model="ir.action.act_window.domain" id="act_sale_form_domain_draft">
+            <field name="name">Draft</field>
             <field name="sequence" eval="10"/>
-            <field name="view" ref="sale_view_tree"/>
-            <field name="act_window" ref="act_sale_form_draft"/>
+            <field name="domain">[('state', '=', 'draft')]</field>
+            <field name="act_window" ref="act_sale_form"/>
         </record>
-        <record model="ir.action.act_window.view" id="act_sale_form_draft_view2">
+        <record model="ir.action.act_window.domain" id="act_sale_form_domain_quotation">
+            <field name="name">Quotation</field>
             <field name="sequence" eval="20"/>
-            <field name="view" ref="sale_view_form"/>
-            <field name="act_window" ref="act_sale_form_draft"/>
-        </record>
-        <menuitem parent="menu_sale_form" action="act_sale_form_draft"
-            id="menu_sale_form_draft" sequence="20"/>
-
-        <record model="ir.action.act_window" id="act_sale_form_quotation">
-            <field name="name">Quotation Sales</field>
-            <field name="res_model">sale.sale</field>
             <field name="domain">[('state', '=', 'quotation')]</field>
+            <field name="act_window" ref="act_sale_form"/>
         </record>
-        <record model="ir.action.act_window.view" id="act_sale_form_quotation_view1">
-            <field name="sequence" eval="10"/>
-            <field name="view" ref="sale_view_tree"/>
-            <field name="act_window" ref="act_sale_form_quotation"/>
-        </record>
-        <record model="ir.action.act_window.view" id="act_sale_form_quotation_view2">
-            <field name="sequence" eval="20"/>
-            <field name="view" ref="sale_view_form"/>
-            <field name="act_window" ref="act_sale_form_quotation"/>
-        </record>
-        <menuitem parent="menu_sale_form" action="act_sale_form_quotation"
-            id="menu_sale_form_quotation" sequence="30"/>
-
-        <record model="ir.action.act_window" id="act_sale_form_confirmed">
-            <field name="name">Confirmed Sales</field>
-            <field name="res_model">sale.sale</field>
+        <record model="ir.action.act_window.domain" id="act_sale_form_domain_confirmed">
+            <field name="name">Confirmed</field>
+            <field name="sequence" eval="30"/>
             <field name="domain">[('state', '=', 'confirmed')]</field>
+            <field name="act_window" ref="act_sale_form"/>
         </record>
-        <record model="ir.action.act_window.view" id="act_sale_form_confirmed_view1">
-            <field name="sequence" eval="10"/>
-            <field name="view" ref="sale_view_tree"/>
-            <field name="act_window" ref="act_sale_form_confirmed"/>
-        </record>
-        <record model="ir.action.act_window.view" id="act_sale_form_confirmed_view2">
-            <field name="sequence" eval="20"/>
-            <field name="view" ref="sale_view_form"/>
-            <field name="act_window" ref="act_sale_form_confirmed"/>
-        </record>
-        <menuitem parent="menu_sale_form" action="act_sale_form_confirmed"
-            id="menu_sale_form_confirmed" sequence="40"/>
-
-        <record model="ir.action.act_window" id="act_sale_form_processing">
-            <field name="name">Processing Sales</field>
-            <field name="res_model">sale.sale</field>
+        <record model="ir.action.act_window.domain" id="act_sale_form_domain_processing">
+            <field name="name">Processing</field>
+            <field name="sequence" eval="40"/>
             <field name="domain">[('state', '=', 'processing')]</field>
+            <field name="act_window" ref="act_sale_form"/>
         </record>
-        <record model="ir.action.act_window.view" id="act_sale_form_processing_view1">
-            <field name="sequence" eval="10"/>
-            <field name="view" ref="sale_view_tree"/>
-            <field name="act_window" ref="act_sale_form_processing"/>
+        <record model="ir.action.act_window.domain" id="act_sale_form_domain_all">
+            <field name="name">All</field>
+            <field name="sequence" eval="9999"/>
+            <field name="domain"></field>
+            <field name="act_window" ref="act_sale_form"/>
         </record>
-        <record model="ir.action.act_window.view" id="act_sale_form_processing_view2">
-            <field name="sequence" eval="20"/>
-            <field name="view" ref="sale_view_form"/>
-            <field name="act_window" ref="act_sale_form_processing"/>
+
+        <menuitem parent="menu_sale" action="act_sale_form"
+            id="menu_sale_form" sequence="10"/>
+        <record model="ir.ui.menu-res.group" id="menu_sale_form_group_sale">
+            <field name="menu" ref="menu_sale_form"/>
+            <field name="group" ref="group_sale"/>
         </record>
-        <menuitem parent="menu_sale_form" action="act_sale_form_processing"
-            id="menu_sale_form_processing" sequence="50"/>
 
         <record model="ir.model.access" id="access_sale">
             <field name="model" search="[('model', '=', 'sale.sale')]"/>
@@ -417,89 +251,21 @@ this repository contains the full copyright notices and license terms. -->
         <record model="ir.ui.view" id="sale_line_view_form">
             <field name="model">sale.line</field>
             <field name="type">form</field>
-            <field name="arch" type="xml">
-                <![CDATA[
-                <form string="Sale Line" cursor="product">
-                    <label name="sale"/>
-                    <field name="sale" colspan="3"/>
-                    <notebook colspan="4">
-                        <page string="General" id="general">
-                            <label name="type"/>
-                            <field name="type"/>
-                            <label name="sequence"/>
-                            <field name="sequence"/>
-                            <label name="product"/>
-                            <field name="product"
-                                view_ids="sale.product_view_list_sale_line"/>
-                            <newline/>
-                            <label name="description"/>
-                            <field name="description" colspan="3"
-                                spell="Get(Eval('_parent_sale', {}), 'party_lang')"/>
-                            <label name="quantity"/>
-                            <field name="quantity"/>
-                            <label name="unit"/>
-                            <field name="unit"/>
-                            <label name="unit_price"/>
-                            <field name="unit_price"/>
-                            <label name="amount"/>
-                            <field name="amount"/>
-                            <label name="delivery_date"/>
-                            <field name="delivery_date"/>
-                            <field name="taxes" colspan="4"/>
-                        </page>
-                        <page string="Notes" id="notes">
-                            <separator name="note" colspan="4"/>
-                            <field name="note" colspan="4"
-                                spell="Get(Eval('_parent_sale', {}), 'party_lang')"/>
-                        </page>
-                    </notebook>
-                    <field name="unit_digits" invisible="1" colspan="4"/>
-                </form>
-                ]]>
-            </field>
+            <field name="name">sale_line_form</field>
         </record>
 
         <record model="ir.ui.view" id="sale_line_view_tree">
             <field name="model">sale.line</field>
             <field name="type">tree</field>
             <field name="priority" eval="10"/>
-            <field name="arch" type="xml">
-                <![CDATA[
-                <tree string="Sale Lines">
-                    <field name="sale"/>
-                    <field name="type"/>
-                    <field name="product"/>
-                    <field name="description"/>
-                    <field name="quantity"/>
-                    <field name="unit"/>
-                    <field name="unit_price"/>
-                    <field name="taxes"/>
-                    <field name="amount"/>
-                    <field name="unit_digits" tree_invisible="1"/>
-                </tree>
-                ]]>
-            </field>
+            <field name="name">sale_line_tree</field>
         </record>
 
         <record model="ir.ui.view" id="sale_line_view_tree_sequence">
             <field name="model">sale.line</field>
             <field name="type">tree</field>
             <field name="priority" eval="20"/>
-            <field name="arch" type="xml">
-                <![CDATA[
-                <tree string="Sale Lines" sequence="sequence">
-                    <field name="type"/>
-                    <field name="product"/>
-                    <field name="description"/>
-                    <field name="quantity"/>
-                    <field name="unit"/>
-                    <field name="unit_price"/>
-                    <field name="taxes"/>
-                    <field name="amount" expand="1"/>
-                    <field name="unit_digits" tree_invisible="1"/>
-                </tree>
-                ]]>
-            </field>
+            <field name="name">sale_line_tree_sequence</field>
         </record>
 
         <record model="ir.model.access" id="access_sale_line">
@@ -521,44 +287,12 @@ this repository contains the full copyright notices and license terms. -->
         <record model="ir.ui.view" id="template_view_form">
             <field name="model">product.template</field>
             <field name="inherit" ref="product.template_view_form"/>
-            <field name="arch" type="xml">
-                <![CDATA[
-                <data>
-                    <xpath expr="/form/notebook/page[@id="general"]/field[@name="cost_price_method"]"
-                        position="after">
-                        <label name="salable"/>
-                        <field name="salable"/>
-                    </xpath>
-                    <xpath expr="/form/notebook/page[@id="general"]"
-                        position="after">
-                        <page string="Customers"
-                            states="{'invisible': Not(Bool(Eval('salable')))}"
-                            id="customers">
-                            <label name="salable"/>
-                            <field name="salable"/>
-                            <label name="sale_uom"/>
-                            <field name="sale_uom"/>
-                            <label name="delivery_time"/>
-                            <field name="delivery_time"/>
-                        </page>
-                    </xpath>
-                </data>
-                ]]>
-            </field>
+            <field name="name">template_form</field>
         </record>
         <record model="ir.ui.view" id="template_view_tree">
             <field name="model">product.template</field>
             <field name="inherit" ref="product.template_view_tree"/>
-            <field name="arch" type="xml">
-                <![CDATA[
-                <data>
-                    <xpath expr="/tree/field[@name="default_uom"]"
-                        position="after">
-                        <field name="salable"/>
-                    </xpath>
-                </data>
-                ]]>
-            </field>
+            <field name="name">template_tree</field>
         </record>
 
         <record model="ir.action.wizard" id="act_open_customer">
@@ -587,9 +321,7 @@ this repository contains the full copyright notices and license terms. -->
             <field name="global_p" eval="True"/>
         </record>
         <record model="ir.rule" id="rule_sale1">
-            <field name="field" search="[('name', '=', 'company'), ('model.model', '=', 'sale.sale')]"/>
-            <field name="operator">=</field>
-            <field name="operand">User/Current Company</field>
+            <field name="domain">[('company', '=', user.company.id if user.company else None)]</field>
             <field name="rule_group" ref="rule_group_sale"/>
         </record>
 
diff --git a/setup.py b/setup.py
index 3595673..4501651 100644
--- a/setup.py
+++ b/setup.py
@@ -25,10 +25,10 @@ requires = []
 for dep in info.get('depends', []):
     if not re.match(r'(ir|res|webdav)(\W|$)', dep):
         requires.append('trytond_%s >= %s.%s, < %s.%s' %
-                (dep, major_version, minor_version, major_version,
-                    minor_version + 1))
+            (dep, major_version, minor_version, major_version,
+                minor_version + 1))
 requires.append('trytond >= %s.%s, < %s.%s' %
-        (major_version, minor_version, major_version, minor_version + 1))
+    (major_version, minor_version, major_version, minor_version + 1))
 
 tests_require = ['proteus >= %s.%s, < %s.%s' %
     (major_version, minor_version, major_version, minor_version + 1)]
@@ -39,16 +39,17 @@ setup(name='trytond_sale',
     long_description=read('README'),
     author='Tryton',
     url='http://www.tryton.org/',
-    download_url="http://downloads.tryton.org/" + \
-        info.get('version', '0.0.1').rsplit('.', 1)[0] + '/',
+    download_url=("http://downloads.tryton.org/" +
+        info.get('version', '0.0.1').rsplit('.', 1)[0] + '/'),
     package_dir={'trytond.modules.sale': '.'},
     packages=[
         'trytond.modules.sale',
         'trytond.modules.sale.tests',
         ],
     package_data={
-        'trytond.modules.sale': info.get('xml', []) \
-            + ['tryton.cfg', 'locale/*.po', 'sale.odt', 'tests/*.rst'],
+        'trytond.modules.sale': (info.get('xml', [])
+            + ['tryton.cfg', 'view/*.xml', 'locale/*.po', 'sale.odt',
+                'tests/*.rst']),
         },
     classifiers=[
         'Development Status :: 5 - Production/Stable',
@@ -59,6 +60,7 @@ setup(name='trytond_sale',
         'Intended Audience :: Legal Industry',
         'License :: OSI Approved :: GNU General Public License (GPL)',
         'Natural Language :: Bulgarian',
+        'Natural Language :: Catalan',
         'Natural Language :: Czech',
         'Natural Language :: Dutch',
         'Natural Language :: English',
diff --git a/stock.xml b/stock.xml
index c9d079f..4c70caa 100644
--- a/stock.xml
+++ b/stock.xml
@@ -7,20 +7,7 @@ this repository contains the full copyright notices and license terms. -->
             <field name="model">stock.move</field>
             <field name="type">tree</field>
             <field name="priority" eval="20"/>
-            <field name="arch" type="xml">
-                <![CDATA[
-                <tree string="Moves">
-                    <field name="product"/>
-                    <field name="from_location"/>
-                    <field name="to_location"/>
-                    <field name="quantity"/>
-                    <field name="uom"/>
-                    <field name="state"/>
-                    <field name="sale_exception_state"/>
-                    <field name="unit_digits" tree_invisible="1"/>
-                </tree>
-                ]]>
-            </field>
+            <field name="name">move_list_shipment</field>
         </record>
     </data>
 </tryton>
diff --git a/tests/scenario_sale.rst b/tests/scenario_sale.rst
index 77a1330..10936c9 100644
--- a/tests/scenario_sale.rst
+++ b/tests/scenario_sale.rst
@@ -38,10 +38,13 @@ Create company::
     ... else:
     ...     currency, = currencies
     >>> Company = Model.get('company.company')
+    >>> Party = Model.get('party.party')
     >>> company_config = Wizard('company.company.config')
     >>> company_config.execute('company')
     >>> company = company_config.form
-    >>> company.name = 'B2CK'
+    >>> party = Party(name='B2CK')
+    >>> party.save()
+    >>> company.party = party
     >>> company.currency = currency
     >>> company_config.execute('add')
     >>> company, = Company.find([])
@@ -49,8 +52,39 @@ Create company::
 Reload the context::
 
     >>> User = Model.get('res.user')
+    >>> Group = Model.get('res.group')
     >>> config._context = User.get_preferences(True, config.context)
 
+Create sale user::
+
+    >>> sale_user = User()
+    >>> sale_user.name = 'Sale'
+    >>> sale_user.login = 'sale'
+    >>> sale_user.main_company = company
+    >>> sale_group, = Group.find([('name', '=', 'Sales')])
+    >>> sale_user.groups.append(sale_group)
+    >>> sale_user.save()
+
+Create stock user::
+
+    >>> stock_user = User()
+    >>> stock_user.name = 'Stock'
+    >>> stock_user.login = 'stock'
+    >>> stock_user.main_company = company
+    >>> stock_group, = Group.find([('name', '=', 'Stock')])
+    >>> stock_user.groups.append(stock_group)
+    >>> stock_user.save()
+
+Create account user::
+
+    >>> account_user = User()
+    >>> account_user.name = 'Account'
+    >>> account_user.login = 'account'
+    >>> account_user.main_company = company
+    >>> account_group, = Group.find([('name', '=', 'Account')])
+    >>> account_user.groups.append(account_group)
+    >>> account_user.save()
+
 Create fiscal year::
 
     >>> FiscalYear = Model.get('account.fiscalyear')
@@ -122,19 +156,23 @@ Create product::
 
     >>> ProductUom = Model.get('product.uom')
     >>> unit, = ProductUom.find([('name', '=', 'Unit')])
+    >>> ProductTemplate = Model.get('product.template')
     >>> Product = Model.get('product.product')
     >>> product = Product()
-    >>> product.name = 'product'
-    >>> product.category = category
-    >>> product.default_uom = unit
-    >>> product.type = 'goods'
-    >>> product.purchasable = True
-    >>> product.salable = True
-    >>> product.list_price = Decimal('10')
-    >>> product.cost_price = Decimal('5')
-    >>> product.cost_price_method = 'fixed'
-    >>> product.account_expense = expense
-    >>> product.account_revenue = revenue
+    >>> template = ProductTemplate()
+    >>> template.name = 'product'
+    >>> template.category = category
+    >>> template.default_uom = unit
+    >>> template.type = 'goods'
+    >>> template.purchasable = True
+    >>> template.salable = True
+    >>> template.list_price = Decimal('10')
+    >>> template.cost_price = Decimal('5')
+    >>> template.cost_price_method = 'fixed'
+    >>> template.account_expense = expense
+    >>> template.account_revenue = revenue
+    >>> template.save()
+    >>> product.template = template
     >>> product.save()
 
 Create payment term::
@@ -148,6 +186,7 @@ Create payment term::
 
 Create an Inventory::
 
+    >>> config.user = stock_user.id
     >>> Inventory = Model.get('stock.inventory')
     >>> InventoryLine = Model.get('stock.inventory.line')
     >>> Location = Model.get('stock.location')
@@ -168,6 +207,7 @@ Create an Inventory::
 
 Sale 5 products::
 
+    >>> config.user = sale_user.id
     >>> Sale = Model.get('sale.sale')
     >>> SaleLine = Model.get('sale.line')
     >>> sale = Sale()
@@ -198,6 +238,7 @@ Sale 5 products::
 
 Sale 5 products with an invoice method 'on shipment'::
 
+    >>> config.user = sale_user.id
     >>> Sale = Model.get('sale.sale')
     >>> SaleLine = Model.get('sale.line')
     >>> sale = Sale()
@@ -228,9 +269,9 @@ Sale 5 products with an invoice method 'on shipment'::
 
 Validate Shipments::
 
-    >>> sale.reload()
-    >>> ShipmentOut = Model.get('stock.shipment.out')
     >>> shipment, = sale.shipments
+    >>> config.user = stock_user.id
+    >>> ShipmentOut = Model.get('stock.shipment.out')
     >>> ShipmentOut.assign_try([shipment.id], config.context)
     True
     >>> ShipmentOut.pack([shipment.id], config.context)
@@ -238,17 +279,19 @@ Validate Shipments::
 
 Open customer invoice::
 
+    >>> config.user = sale_user.id
     >>> sale.reload()
     >>> Invoice = Model.get('account.invoice')
     >>> invoice, = sale.invoices
+    >>> config.user = account_user.id
     >>> invoice.type
     u'out_invoice'
     >>> len(invoice.lines)
     2
-    >>> Invoice.open([invoice.id], config.context)
+    >>> Invoice.post([invoice.id], config.context)
     >>> invoice.reload()
     >>> invoice.state
-    u'open'
+    u'posted'
     >>> receivable.reload()
     >>> (receivable.debit, receivable.credit) == \
     ... (Decimal('50.00'), Decimal('0.00'))
@@ -260,6 +303,7 @@ Open customer invoice::
 
 Create a Return::
 
+    >>> config.user = sale_user.id
     >>> return_ = Sale()
     >>> return_.party = customer
     >>> return_.payment_term = payment_term
@@ -285,28 +329,31 @@ Create a Return::
 
 Check Return Shipments::
 
-    >>> return_.reload()
-    >>> ShipmentReturn = Model.get('stock.shipment.out.return')
+    >>> config.user = sale_user.id
     >>> ship_return, = return_.shipment_returns
+    >>> config.user = stock_user.id
+    >>> ShipmentReturn = Model.get('stock.shipment.out.return')
     >>> ShipmentReturn.receive([ship_return.id], config.context)
     >>> move_return, = ship_return.incoming_moves
-    >>> move_return.product.name
+    >>> move_return.product.rec_name
     u'product'
     >>> move_return.quantity
     4.0
 
 Open customer credit note::
 
+    >>> config.user = sale_user.id
     >>> return_.reload()
     >>> credit_note, = return_.invoices
+    >>> config.user = account_user.id
     >>> credit_note.type
     u'out_credit_note'
     >>> len(credit_note.lines)
     1
-    >>> Invoice.open([credit_note.id], config.context)
+    >>> Invoice.post([credit_note.id], config.context)
     >>> credit_note.reload()
     >>> credit_note.state
-    u'open'
+    u'posted'
     >>> receivable.reload()
     >>> (receivable.debit, receivable.credit) == (Decimal(50), Decimal(40))
     True
@@ -316,6 +363,7 @@ Open customer credit note::
 
 Mixing return and sale::
 
+    >>> config.user = sale_user.id
     >>> mix = Sale()
     >>> mix.party = customer
     >>> mix.payment_term = payment_term
@@ -344,12 +392,13 @@ Mixing return and sale::
 
 Checking Shipments::
 
-    >>> mix.reload()
+    >>> config.user = sale_user.id
     >>> mix_returns, = mix.shipment_returns
     >>> mix_shipments, = mix.shipments
+    >>> config.user = stock_user.id
     >>> ShipmentReturn.receive([mix_returns.id], config.context)
     >>> move_return, = mix_returns.incoming_moves
-    >>> move_return.product.name
+    >>> move_return.product.rec_name
     u'product'
     >>> move_return.quantity
     2.0
@@ -358,28 +407,30 @@ Checking Shipments::
     >>> ShipmentOut.pack([mix_shipments.id], config.context)
     >>> ShipmentOut.done([mix_shipments.id], config.context)
     >>> move_shipment, = mix_shipments.outgoing_moves
-    >>> move_shipment.product.name
+    >>> move_shipment.product.rec_name
     u'product'
     >>> move_shipment.quantity
     7.0
 
 Checking the invoice::
 
+    >>> config.user = sale_user.id
     >>> mix.reload()
     >>> mix_invoice, mix_credit_note = sorted(mix.invoices,
     ...     key=attrgetter('type'), reverse=True)
+    >>> config.user = account_user.id
     >>> mix_invoice.type, mix_credit_note.type
     (u'out_invoice', u'out_credit_note')
     >>> len(mix_invoice.lines), len(mix_credit_note.lines)
     (1, 1)
-    >>> Invoice.open([mix_invoice.id], config.context)
+    >>> Invoice.post([mix_invoice.id], config.context)
     >>> mix_invoice.reload()
     >>> mix_invoice.state
-    u'open'
-    >>> Invoice.open([mix_credit_note.id], config.context)
+    u'posted'
+    >>> Invoice.post([mix_credit_note.id], config.context)
     >>> mix_credit_note.reload()
     >>> mix_credit_note.state
-    u'open'
+    u'posted'
     >>> receivable.reload()
     >>> (receivable.debit, receivable.credit) == (Decimal(120), Decimal(60))
     True
@@ -389,6 +440,7 @@ Checking the invoice::
 
 Mixing stuff with an invoice method 'on shipment'::
 
+    >>> config.user = sale_user.id
     >>> mix = Sale()
     >>> mix.party = customer
     >>> mix.payment_term = payment_term
@@ -417,12 +469,13 @@ Mixing stuff with an invoice method 'on shipment'::
 
 Checking Shipments::
 
-    >>> mix.reload()
+    >>> config.user = sale_user.id
     >>> mix_returns, = mix.shipment_returns
     >>> mix_shipments, = mix.shipments
+    >>> config.user = stock_user.id
     >>> ShipmentReturn.receive([mix_returns.id], config.context)
     >>> move_return, = mix_returns.incoming_moves
-    >>> move_return.product.name
+    >>> move_return.product.rec_name
     u'product'
     >>> move_return.quantity
     3.0
@@ -430,7 +483,7 @@ Checking Shipments::
     True
     >>> ShipmentOut.pack([mix_shipments.id], config.context)
     >>> move_shipment, = mix_shipments.outgoing_moves
-    >>> move_shipment.product.name
+    >>> move_shipment.product.rec_name
     u'product'
     >>> move_shipment.quantity
     6.0
diff --git a/tryton.cfg b/tryton.cfg
index b1dd302..8d01b23 100644
--- a/tryton.cfg
+++ b/tryton.cfg
@@ -1,5 +1,5 @@
 [tryton]
-version=2.6.1
+version=2.8.0
 depends:
     account
     account_invoice
diff --git a/trytond_sale.egg-info/PKG-INFO b/trytond_sale.egg-info/PKG-INFO
index 36a4cce..0084037 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.6.1
+Version: 2.8.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.6/
+Download-URL: http://downloads.tryton.org/2.8/
 Description: trytond_sale
         ============
         
@@ -52,6 +52,7 @@ Classifier: Intended Audience :: Financial and Insurance Industry
 Classifier: Intended Audience :: Legal Industry
 Classifier: License :: OSI Approved :: GNU General Public License (GPL)
 Classifier: Natural Language :: Bulgarian
+Classifier: Natural Language :: Catalan
 Classifier: Natural Language :: Czech
 Classifier: Natural Language :: Dutch
 Classifier: Natural Language :: English
diff --git a/trytond_sale.egg-info/SOURCES.txt b/trytond_sale.egg-info/SOURCES.txt
index 5c7d08e..8450b33 100644
--- a/trytond_sale.egg-info/SOURCES.txt
+++ b/trytond_sale.egg-info/SOURCES.txt
@@ -37,4 +37,16 @@ trytond_sale.egg-info/dependency_links.txt
 trytond_sale.egg-info/entry_points.txt
 trytond_sale.egg-info/not-zip-safe
 trytond_sale.egg-info/requires.txt
-trytond_sale.egg-info/top_level.txt
\ No newline at end of file
+trytond_sale.egg-info/top_level.txt
+view/configuration_form.xml
+view/handle_invoice_exception_ask_form.xml
+view/handle_shipment_exception_ask_form.xml
+view/move_list_shipment.xml
+view/product_list_sale_line.xml
+view/sale_form.xml
+view/sale_line_form.xml
+view/sale_line_tree.xml
+view/sale_line_tree_sequence.xml
+view/sale_tree.xml
+view/template_form.xml
+view/template_tree.xml
\ No newline at end of file
diff --git a/trytond_sale.egg-info/requires.txt b/trytond_sale.egg-info/requires.txt
index f0ae06a..54d6265 100644
--- a/trytond_sale.egg-info/requires.txt
+++ b/trytond_sale.egg-info/requires.txt
@@ -1,9 +1,9 @@
-trytond_account >= 2.6, < 2.7
-trytond_account_invoice >= 2.6, < 2.7
-trytond_account_product >= 2.6, < 2.7
-trytond_company >= 2.6, < 2.7
-trytond_currency >= 2.6, < 2.7
-trytond_party >= 2.6, < 2.7
-trytond_product >= 2.6, < 2.7
-trytond_stock >= 2.6, < 2.7
-trytond >= 2.6, < 2.7
\ No newline at end of file
+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
diff --git a/view/configuration_form.xml b/view/configuration_form.xml
new file mode 100644
index 0000000..1fa1a5e
--- /dev/null
+++ b/view/configuration_form.xml
@@ -0,0 +1,12 @@
+<?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="Sale Configuration">
+    <label name="sale_sequence"/>
+    <field name="sale_sequence"/>
+    <newline />
+    <label name="sale_invoice_method" />
+    <field name="sale_invoice_method" />
+    <label name="sale_shipment_method" />
+    <field name="sale_shipment_method" />
+</form>
diff --git a/view/handle_invoice_exception_ask_form.xml b/view/handle_invoice_exception_ask_form.xml
new file mode 100644
index 0000000..c104bc1
--- /dev/null
+++ b/view/handle_invoice_exception_ask_form.xml
@@ -0,0 +1,10 @@
+<?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="Handle Invoice Exception" col="2">
+    <image name="tryton-dialog-information" xexpand="0" xfill="0"/>
+    <label string="Choose invoices to recreate" id="choose"
+        yalign="0.0" xalign="0.0" xexpand="1"/>
+    <field name="recreate_invoices" colspan="2"/>
+</form>
+
diff --git a/view/handle_shipment_exception_ask_form.xml b/view/handle_shipment_exception_ask_form.xml
new file mode 100644
index 0000000..f2ec337
--- /dev/null
+++ b/view/handle_shipment_exception_ask_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. -->
+<form string="Handle shipment Exception" col="2">
+    <image name="tryton-dialog-information" xexpand="0" xfill="0"/>
+    <label string="Choose move to recreate" id="choose"
+        yalign="0.0" xalign="0.0" xexpand="1"/>
+    <field name="recreate_moves" colspan="2" view_ids="stock.move_view_tree"/>
+</form>
diff --git a/view/move_list_shipment.xml b/view/move_list_shipment.xml
new file mode 100644
index 0000000..ca3878e
--- /dev/null
+++ b/view/move_list_shipment.xml
@@ -0,0 +1,13 @@
+<?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. -->
+<tree string="Moves">
+    <field name="product"/>
+    <field name="from_location"/>
+    <field name="to_location"/>
+    <field name="quantity"/>
+    <field name="uom"/>
+    <field name="state"/>
+    <field name="sale_exception_state"/>
+    <field name="unit_digits" tree_invisible="1"/>
+</tree>
diff --git a/view/product_list_sale_line.xml b/view/product_list_sale_line.xml
new file mode 100644
index 0000000..5c638ca
--- /dev/null
+++ b/view/product_list_sale_line.xml
@@ -0,0 +1,13 @@
+<?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. -->
+<tree string="Products">
+    <field name="template"/>
+    <field name="code"/>
+    <field name="list_price_uom"/>
+    <field name="cost_price_uom"/>
+    <field name="quantity"/>
+    <field name="forecast_quantity"/>
+    <field name="default_uom"/>
+    <field name="active"/>
+</tree>
diff --git a/view/sale_form.xml b/view/sale_form.xml
new file mode 100644
index 0000000..2f8d2dd
--- /dev/null
+++ b/view/sale_form.xml
@@ -0,0 +1,84 @@
+<?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="Sale" col="6">
+    <label name="party"/>
+    <field name="party"/>
+    <label name="invoice_address"/>
+    <field name="invoice_address"/>
+    <label name="shipment_address"/>
+    <field name="shipment_address"/>
+    <label name="description"/>
+    <field name="description" colspan="3"/>
+    <label name="reference"/>
+    <field name="reference"/>
+    <notebook colspan="6">
+        <page string="Sale" id="sale">
+            <label name="sale_date"/>
+            <field name="sale_date"/>
+            <label name="payment_term"/>
+            <field name="payment_term"/>
+            <label name="warehouse"/>
+            <field name="warehouse"/>
+            <label name="currency"/>
+            <field name="currency"/>
+            <field name="lines" colspan="4"
+                view_ids="sale.sale_line_view_tree_sequence"/>
+            <group col="2" colspan="2" id="states">
+                <label name="invoice_state"/>
+                <field name="invoice_state"/>
+                <label name="shipment_state"/>
+                <field name="shipment_state"/>
+                <label name="state"/>
+                <field name="state"/>
+            </group>
+            <group col="2" colspan="2" id="amount_buttons">
+                <label name="untaxed_amount" xalign="1.0" xexpand="1"/>
+                <field name="untaxed_amount" xalign="1.0" xexpand="0"/>
+                <label name="tax_amount" xalign="1.0" xexpand="1"/>
+                <field name="tax_amount" xalign="1.0" xexpand="0"/>
+                <label name="total_amount" xalign="1.0" xexpand="1"/>
+                <field name="total_amount" xalign="1.0" xexpand="0"/>
+                <group col="7" colspan="2" id="buttons">
+                    <button name="cancel" string="Cancel"
+                        icon="tryton-cancel"/>
+                    <button name="draft" string="Draft"/>
+                    <button name="quote" string="Quote"
+                        icon="tryton-go-next"/>
+                    <button name="handle_invoice_exception"
+                        string="Handle Invoice Exception"
+                        icon="tryton-go-next"/>
+                    <button name="handle_shipment_exception"
+                        string="Handle Shipment Exception"
+                        icon="tryton-go-next"/>
+                    <button name="confirm" string="Confirm"
+                        icon="tryton-go-next"/>
+                    <button name="process" string="Process"
+                        icon="tryton-go-next"/>
+                </group>
+            </group>
+        </page>
+        <page string="Other Info" id="other">
+            <label name="company"/>
+            <field name="company"/>
+            <newline/>
+            <label name="invoice_method"/>
+            <field name="invoice_method"/>
+            <label name="shipment_method"/>
+            <field name="shipment_method"/>
+            <separator name="comment" colspan="4"/>
+            <field name="comment" colspan="4" spell="Eval('party_lang')"/>
+        </page>
+        <page string="Invoices" id="invoices">
+            <field name="invoices" colspan="4"/>
+        </page>
+        <page string="Shipments" id="shipments">
+            <field name="moves" colspan="4"
+                view_ids="sale.move_view_list_shipment"/>
+            <field name="shipments" colspan="4"/>
+            <field name="shipment_returns" colspan="4"/>
+        </page>
+    </notebook>
+    <field name="currency_digits" invisible="1" colspan="6"/>
+    <field name="party_lang" invisible="1" colspan="6"/>
+</form>
diff --git a/view/sale_line_form.xml b/view/sale_line_form.xml
new file mode 100644
index 0000000..f0f9a35
--- /dev/null
+++ b/view/sale_line_form.xml
@@ -0,0 +1,39 @@
+<?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="Sale Line" cursor="product">
+    <label name="sale"/>
+    <field name="sale" colspan="3"/>
+    <notebook colspan="4">
+        <page string="General" id="general">
+            <label name="type"/>
+            <field name="type"/>
+            <label name="sequence"/>
+            <field name="sequence"/>
+            <label name="product"/>
+            <field name="product"
+                view_ids="sale.product_view_list_sale_line"/>
+            <newline/>
+            <label name="description"/>
+            <field name="description" colspan="3"
+                spell="Get(Eval('_parent_sale', {}), 'party_lang')"/>
+            <label name="quantity"/>
+            <field name="quantity"/>
+            <label name="unit"/>
+            <field name="unit"/>
+            <label name="unit_price"/>
+            <field name="unit_price"/>
+            <label name="amount"/>
+            <field name="amount"/>
+            <label name="delivery_date"/>
+            <field name="delivery_date"/>
+            <field name="taxes" colspan="4"/>
+        </page>
+        <page string="Notes" id="notes">
+            <separator name="note" colspan="4"/>
+            <field name="note" colspan="4"
+                spell="Get(Eval('_parent_sale', {}), 'party_lang')"/>
+        </page>
+    </notebook>
+    <field name="unit_digits" invisible="1" colspan="4"/>
+</form>
diff --git a/view/sale_line_tree.xml b/view/sale_line_tree.xml
new file mode 100644
index 0000000..eb65c75
--- /dev/null
+++ b/view/sale_line_tree.xml
@@ -0,0 +1,15 @@
+<?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. -->
+<tree string="Sale Lines">
+    <field name="sale"/>
+    <field name="type"/>
+    <field name="product"/>
+    <field name="description"/>
+    <field name="quantity"/>
+    <field name="unit"/>
+    <field name="unit_price"/>
+    <field name="taxes"/>
+    <field name="amount"/>
+    <field name="unit_digits" tree_invisible="1"/>
+</tree>
diff --git a/view/sale_line_tree_sequence.xml b/view/sale_line_tree_sequence.xml
new file mode 100644
index 0000000..d711e1a
--- /dev/null
+++ b/view/sale_line_tree_sequence.xml
@@ -0,0 +1,14 @@
+<?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. -->
+<tree string="Sale Lines" sequence="sequence">
+    <field name="type"/>
+    <field name="product"/>
+    <field name="description"/>
+    <field name="quantity"/>
+    <field name="unit"/>
+    <field name="unit_price"/>
+    <field name="taxes"/>
+    <field name="amount" expand="1"/>
+    <field name="unit_digits" tree_invisible="1"/>
+</tree>
diff --git a/view/sale_tree.xml b/view/sale_tree.xml
new file mode 100644
index 0000000..8be9f5c
--- /dev/null
+++ b/view/sale_tree.xml
@@ -0,0 +1,18 @@
+<?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. -->
+<tree string="Sales">
+    <field name="reference"/>
+    <field name="sale_date"/>
+    <field name="party"/>
+    <field name="warehouse"/>
+    <field name="currency"/>
+    <field name="untaxed_amount"/>
+    <field name="total_amount"/>
+    <field name="state"/>
+    <field name="invoice_state"/>
+    <field name="shipment_state"/>
+    <field name="description"/>
+    <field name="currency_digits" tree_invisible="1"/>
+    <field name="create_date" tree_invisible="1"/>
+</tree>
diff --git a/view/template_form.xml b/view/template_form.xml
new file mode 100644
index 0000000..cd702ff
--- /dev/null
+++ b/view/template_form.xml
@@ -0,0 +1,23 @@
+<?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/page[@id='general']/field[@name='cost_price_method']"
+        position="after">
+        <label name="salable"/>
+        <field name="salable"/>
+    </xpath>
+    <xpath expr="/form/notebook/page[@id='general']" position="after">
+        <page string="Customers"
+            states="{'invisible': Not(Bool(Eval('salable')))}"
+            id="customers">
+            <label name="salable"/>
+            <field name="salable"/>
+            <label name="sale_uom"/>
+            <field name="sale_uom"/>
+            <label name="delivery_time"/>
+            <field name="delivery_time"/>
+        </page>
+    </xpath>
+</data>
+
diff --git a/view/template_tree.xml b/view/template_tree.xml
new file mode 100644
index 0000000..22e86f9
--- /dev/null
+++ b/view/template_tree.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. -->
+<data>
+    <xpath expr="/tree/field[@name='default_uom']" position="after">
+        <field name="salable"/>
+    </xpath>
+</data>
commit ce5315224a8bf05fa0f157903abe03d3848b9174
Author: Mathias Behrle <mathiasb at m9s.biz>
Date:   Sat Apr 27 18:44:54 2013 +0200

    Releasing debian version 2.6.1-3.

diff --git a/debian/changelog b/debian/changelog
index c8d8b11..d2b5726 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -1,3 +1,10 @@
+tryton-modules-sale (2.6.1-3) experimental; urgency=low
+
+  * Removing Daniel from Uploaders. Thanks for your work! (Closes: #704397).
+  * Improving update of major version in Depends.
+
+ -- Mathias Behrle <mathiasb at m9s.biz>  Sat, 27 Apr 2013 15:08:40 +0200
+
 tryton-modules-sale (2.6.1-2) experimental; urgency=low
 
   * Updating Vcs-Git to correct address.
commit 67f45620ae412c3d3bbe96f5857490eb36f6e194
Author: Mathias Behrle <mathiasb at m9s.biz>
Date:   Sat Apr 27 14:54:48 2013 +0200

    Improving update of major version in Depends.
    
    Pulling the major version for Depends directly from the package version.
    Thanks to Ilya Melnikov for pushing the idea.

diff --git a/debian/control b/debian/control
index c472034..822d097 100644
--- a/debian/control
+++ b/debian/control
@@ -13,12 +13,15 @@ X-Python-Version: >= 2.6
 Package: tryton-modules-sale
 Architecture: all
 Depends:
- ${misc:Depends}, ${python:Depends}, tryton-server (>= 2.6),
- tryton-modules-account (>= 2.6), tryton-modules-account-invoice (>= 2.6),
- tryton-modules-account-product (>= 2.6), tryton-modules-company (>= 2.6),
- tryton-modules-currency (>= 2.6), tryton-modules-party (>= 2.6),
- tryton-modules-product (>= 2.6), tryton-modules-stock (>= 2.6),
- python-pkg-resources
+ ${misc:Depends}, ${python:Depends}, tryton-server (>= ${version:major}),
+ tryton-modules-account (>= ${version:major}),
+ tryton-modules-account-invoice (>= ${version:major}),
+ tryton-modules-account-product (>= ${version:major}),
+ tryton-modules-company (>= ${version:major}),
+ tryton-modules-currency (>= ${version:major}),
+ tryton-modules-party (>= ${version:major}),
+ tryton-modules-product (>= ${version:major}),
+ tryton-modules-stock (>= ${version:major}), 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
diff --git a/debian/rules b/debian/rules
index 1ae0776..0f63ab4 100755
--- a/debian/rules
+++ b/debian/rules
@@ -1,5 +1,7 @@
 #!/usr/bin/make -f
 
+MAJOR := $(shell python setup.py --version | awk -F "." '{print $$1 "." $$2}')
+
 %:
 	dh ${@} --with python2
 
@@ -8,5 +10,8 @@ override_dh_auto_clean:
 
 	rm -rf *.egg-info
 
+override_dh_gencontrol:
+	dh_gencontrol -- -Vversion:major="$(MAJOR)"
+
 override_dh_builddeb:
 	dh_builddeb -- -Zxz -z9
commit e9b2442f62f91fa367b0aa696e423ec463a7fa80
Author: Mathias Behrle <mathiasb at m9s.biz>
Date:   Sun Apr 21 23:36:07 2013 +0200

    Removing Daniel from Uploaders. Thanks for your work! (Closes: #704397).

diff --git a/debian/control b/debian/control
index be7eeda..c472034 100644
--- a/debian/control
+++ b/debian/control
@@ -2,7 +2,7 @@ Source: tryton-modules-sale
 Section: python
 Priority: optional
 Maintainer: Debian Tryton Maintainers <maintainers at debian.tryton.org>
-Uploaders: Daniel Baumann <daniel at debian.org>, Mathias Behrle <mathiasb at m9s.biz>
+Uploaders: Mathias Behrle <mathiasb at m9s.biz>
 Build-Depends: debhelper (>= 9), python (>= 2.6.6-3~), python-setuptools
 Standards-Version: 3.9.4
 Homepage: http://www.tryton.org/
commit 6d741ed98b7b7e6b2ce8e2c06a195902b95b72e6
Author: Mathias Behrle <mathiasb at m9s.biz>
Date:   Sat Mar 23 15:04:13 2013 +0100

    Releasing debian version 2.6.1-2.

diff --git a/debian/changelog b/debian/changelog
index e301707..c8d8b11 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -1,3 +1,10 @@
+tryton-modules-sale (2.6.1-2) experimental; urgency=low
+
+  * Updating Vcs-Git to correct address.
+  * Adding watch file. Thanks to Bart Martens <bartm at debian.org>.
+
+ -- Mathias Behrle <mathiasb at m9s.biz>  Sat, 23 Mar 2013 14:01:11 +0100
+
 tryton-modules-sale (2.6.1-1) experimental; urgency=low
 
   * Removing obsolete Dm-Upload-Allowed
commit 09e81d2a294511c224a494a2dad1c4a864053dfd
Author: Mathias Behrle <mathiasb at m9s.biz>
Date:   Sat Mar 23 13:52:33 2013 +0100

    Adding watch file. Thanks to Bart Martens <bartm at debian.org>.

diff --git a/debian/watch b/debian/watch
new file mode 100644
index 0000000..91f75fb
--- /dev/null
+++ b/debian/watch
@@ -0,0 +1,2 @@
+version=3
+http://downloads.tryton.org/current/ .*trytond_sale-(\d.*)\.(?:tgz|tbz2|txz|tar\.(?:gz|bz2|xz))
commit 2eb3e705b012addb166ec5b28c978e87cb109249
Author: Mathias Behrle <mathiasb at m9s.biz>
Date:   Sat Feb 23 20:08:11 2013 +0100

    Updating Vcs-Git to correct address.

diff --git a/debian/control b/debian/control
index f95eb1f..be7eeda 100644
--- a/debian/control
+++ b/debian/control
@@ -7,7 +7,7 @@ Build-Depends: debhelper (>= 9), python (>= 2.6.6-3~), python-setuptools
 Standards-Version: 3.9.4
 Homepage: http://www.tryton.org/
 Vcs-Browser: http://debian.tryton.org/gitweb/?p=packages/tryton-modules-sale.git
-Vcs-Git: git://debian.tryton.org/git/packages/tryton-modules-sale.git
+Vcs-Git: git://debian.tryton.org/packages/tryton-modules-sale.git
 X-Python-Version: >= 2.6
 
 Package: tryton-modules-sale
commit e532a6c0e1337dc544335c5650313e960ff1ce70
Author: Mathias Behrle <mathiasb at m9s.biz>
Date:   Sun Feb 17 13:50:45 2013 +0100

    Releasing debian version 2.6.1-1.

diff --git a/debian/changelog b/debian/changelog
index 834285e..e301707 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -1,3 +1,12 @@
+tryton-modules-sale (2.6.1-1) experimental; urgency=low
+
+  * Removing obsolete Dm-Upload-Allowed
+  * Updating to Standards-Version: 3.9.4, no changes needed.
+  * Merging upstream version 2.6.1.
+  * Updating copyright.
+
+ -- Mathias Behrle <mathiasb at m9s.biz>  Sat, 16 Feb 2013 21:42:48 +0100
+
 tryton-modules-sale (2.6.0-1) experimental; urgency=low
 
   * Merging upstream version 2.6.0.
commit fee99947c945fc68520caa71b9d1b2a4d3fe282c
Author: Mathias Behrle <mathiasb at m9s.biz>
Date:   Sat Feb 16 21:29:20 2013 +0100

    Updating copyright.

diff --git a/debian/copyright b/debian/copyright
index 2013fc4..899bb6c 100644
--- a/debian/copyright
+++ b/debian/copyright
@@ -1,17 +1,16 @@
 Format: http://www.debian.org/doc/packaging-manuals/copyright-format/1.0/
 
 Files: *
-Copyright:
-           2004-2008 Tiny SPRL
-           2008-2012 Cedric Krier
+Copyright: 2008-2012 Cédric Krier
            2008-2012 Bertrand Chenal
            2008-2012 B2CK SPRL
+           2004-2008 Tiny SPRL
 License: GPL-3+
 
 Files: debian/*
 Copyright:
            2009-2012 Daniel Baumann <daniel at debian.org>
-           2012 Mathias Behrle <mathiasb at m9s.biz>
+           2012-2013 Mathias Behrle <mathiasb at m9s.biz>
 License: GPL-3+
 
 License: GPL-3+
commit dfda1dca12e0155de775bf70ae58eae3c3e906a1
Author: Mathias Behrle <mathiasb at m9s.biz>
Date:   Fri Feb 15 20:50:54 2013 +0100

    Merging upstream version 2.6.1.

diff --git a/CHANGELOG b/CHANGELOG
index 27d27c7..649851b 100644
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -1,3 +1,6 @@
+Version 2.6.1 - 2012-12-23
+* Bug fixes (see mercurial logs for details)
+
 Version 2.6.0 - 2012-10-22
 * Bug fixes (see mercurial logs for details)
 
diff --git a/PKG-INFO b/PKG-INFO
index 476ef0a..7e060ee 100644
--- a/PKG-INFO
+++ b/PKG-INFO
@@ -1,6 +1,6 @@
-Metadata-Version: 1.0
+Metadata-Version: 1.1
 Name: trytond_sale
-Version: 2.6.0
+Version: 2.6.1
 Summary: Tryton module for sale
 Home-page: http://www.tryton.org/
 Author: Tryton
diff --git a/invoice.py b/invoice.py
index 30d7886..901b67e 100644
--- a/invoice.py
+++ b/invoice.py
@@ -48,12 +48,13 @@ class Invoice:
                 states[invoice.id] = 'ignored'
         return states
 
-    def copy(self, ids, default=None):
+    @classmethod
+    def copy(cls, invoices, default=None):
         if default is None:
             default = {}
         default = default.copy()
         default.setdefault('sales', None)
-        return super(Invoice, self).copy(ids, default=default)
+        return super(Invoice, cls).copy(invoices, default=default)
 
     @classmethod
     def delete(cls, invoices):
diff --git a/tryton.cfg b/tryton.cfg
index 4f672fe..b1dd302 100644
--- a/tryton.cfg
+++ b/tryton.cfg
@@ -1,5 +1,5 @@
 [tryton]
-version=2.6.0
+version=2.6.1
 depends:
     account
     account_invoice
diff --git a/trytond_sale.egg-info/PKG-INFO b/trytond_sale.egg-info/PKG-INFO
index 0166c57..36a4cce 100644
--- a/trytond_sale.egg-info/PKG-INFO
+++ b/trytond_sale.egg-info/PKG-INFO
@@ -1,6 +1,6 @@
-Metadata-Version: 1.0
+Metadata-Version: 1.1
 Name: trytond-sale
-Version: 2.6.0
+Version: 2.6.1
 Summary: Tryton module for sale
 Home-page: http://www.tryton.org/
 Author: Tryton
commit 54bcad3ed40e8998e932e2ccdf5f7f710c6088ab
Author: Mathias Behrle <mathiasb at m9s.biz>
Date:   Fri Feb 15 19:28:36 2013 +0100

    Updating to Standards-Version: 3.9.4, no changes needed.

diff --git a/debian/control b/debian/control
index 5f8362b..f95eb1f 100644
--- a/debian/control
+++ b/debian/control
@@ -4,7 +4,7 @@ Priority: optional
 Maintainer: Debian Tryton Maintainers <maintainers at debian.tryton.org>
 Uploaders: Daniel Baumann <daniel at debian.org>, Mathias Behrle <mathiasb at m9s.biz>
 Build-Depends: debhelper (>= 9), python (>= 2.6.6-3~), python-setuptools
-Standards-Version: 3.9.3
+Standards-Version: 3.9.4
 Homepage: http://www.tryton.org/
 Vcs-Browser: http://debian.tryton.org/gitweb/?p=packages/tryton-modules-sale.git
 Vcs-Git: git://debian.tryton.org/git/packages/tryton-modules-sale.git
commit 816c651e1e7ea752d21da9648b41e8a86e113bd3
Author: Mathias Behrle <mathiasb at m9s.biz>
Date:   Wed Feb 13 21:37:13 2013 +0100

    Removing obsolete Dm-Upload-Allowed

diff --git a/debian/control b/debian/control
index 803440a..5f8362b 100644
--- a/debian/control
+++ b/debian/control
@@ -3,7 +3,6 @@ Section: python
 Priority: optional
 Maintainer: Debian Tryton Maintainers <maintainers at debian.tryton.org>
 Uploaders: Daniel Baumann <daniel at debian.org>, Mathias Behrle <mathiasb at m9s.biz>
-Dm-Upload-Allowed: yes
 Build-Depends: debhelper (>= 9), python (>= 2.6.6-3~), python-setuptools
 Standards-Version: 3.9.3
 Homepage: http://www.tryton.org/
commit 11de642ce3bab63341ae96b96b8d1f87d2954878
Author: Mathias Behrle <mathiasb at m9s.biz>
Date:   Wed Oct 24 22:02:11 2012 +0200

    Releasing debian version 2.6.0-1.

diff --git a/debian/changelog b/debian/changelog
index 1090fdb..834285e 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -1,3 +1,10 @@
+tryton-modules-sale (2.6.0-1) experimental; urgency=low
+
+  * Merging upstream version 2.6.0.
+  * Bumping versioned tryton depends to 2.6.
+
+ -- Mathias Behrle <mathiasb at m9s.biz>  Wed, 24 Oct 2012 14:25:02 +0200
+
 tryton-modules-sale (2.4.1-2) experimental; urgency=low
 
   [ Daniel Baumann ]
commit f02af8a25dbd87b43a8e8b71607746c9107aac7b
Author: Mathias Behrle <mathiasb at m9s.biz>
Date:   Tue Oct 23 19:59:46 2012 +0200

    Bumping versioned tryton depends to 2.6.

diff --git a/debian/control b/debian/control
index ad4a761..803440a 100644
--- a/debian/control
+++ b/debian/control
@@ -14,11 +14,11 @@ X-Python-Version: >= 2.6
 Package: tryton-modules-sale
 Architecture: all
 Depends:
- ${misc:Depends}, ${python:Depends}, tryton-server (>= 2.4),
- tryton-modules-account (>= 2.4), tryton-modules-account-invoice (>= 2.4),
- tryton-modules-account-product (>= 2.4), tryton-modules-company (>= 2.4),
- tryton-modules-currency (>= 2.4), tryton-modules-party (>= 2.4),
- tryton-modules-product (>= 2.4), tryton-modules-stock (>= 2.4),
+ ${misc:Depends}, ${python:Depends}, tryton-server (>= 2.6),
+ tryton-modules-account (>= 2.6), tryton-modules-account-invoice (>= 2.6),
+ tryton-modules-account-product (>= 2.6), tryton-modules-company (>= 2.6),
+ tryton-modules-currency (>= 2.6), tryton-modules-party (>= 2.6),
+ tryton-modules-product (>= 2.6), tryton-modules-stock (>= 2.6),
  python-pkg-resources
 Description: Tryton Application Platform (Sale Module)
  Tryton is a high-level general purpose application platform written in Python
commit c0caf5b151d44377c82383a4c71594a98a6d41ae
Author: Mathias Behrle <mathiasb at m9s.biz>
Date:   Tue Oct 23 19:53:44 2012 +0200

    Merging upstream version 2.6.0.

diff --git a/CHANGELOG b/CHANGELOG
index e4a20c2..27d27c7 100644
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -1,4 +1,4 @@
-Version 2.4.1 - 2012-09-02
+Version 2.6.0 - 2012-10-22
 * Bug fixes (see mercurial logs for details)
 
 Version 2.4.0 - 2012-04-24
diff --git a/MANIFEST.in b/MANIFEST.in
index 32879df..478d5ff 100644
--- a/MANIFEST.in
+++ b/MANIFEST.in
@@ -4,7 +4,9 @@ include TODO
 include COPYRIGHT
 include CHANGELOG
 include LICENSE
+include tryton.cfg
 include *.xml
 include *.odt
 include locale/*.po
 include doc/*
+include tests/*.rst
diff --git a/PKG-INFO b/PKG-INFO
index 5a0dfef..476ef0a 100644
--- a/PKG-INFO
+++ b/PKG-INFO
@@ -1,27 +1,48 @@
 Metadata-Version: 1.0
 Name: trytond_sale
-Version: 2.4.1
-Summary: Define sale order.
-Add to product sale informations.
-Define the sale price as the list price.
-
-With the possibilities:
-    - to follow invoice and shipment states from the sale order.
-    - to define invoice method:
-        - Manual
-        - On Order Processed
-        - On shipment Sent
-    - to define shipment method:
-        - Manual
-        - On Order Processed
-        - On Invoice Paid
-
+Version: 2.6.0
+Summary: Tryton module for sale
 Home-page: http://www.tryton.org/
-Author: B2CK
-Author-email: info at b2ck.com
+Author: Tryton
+Author-email: UNKNOWN
 License: GPL-3
-Download-URL: http://downloads.tryton.org/2.4/
-Description: UNKNOWN
+Download-URL: http://downloads.tryton.org/2.6/
+Description: trytond_sale
+        ============
+        
+        The sale module of the Tryton application platform.
+        
+        Installing
+        ----------
+        
+        See INSTALL
+        
+        Support
+        -------
+        
+        If you encounter any problems with Tryton, please don't hesitate to ask
+        questions on the Tryton bug tracker, mailing list, wiki or IRC channel:
+        
+          http://bugs.tryton.org/
+          http://groups.tryton.org/
+          http://wiki.tryton.org/
+          irc://irc.freenode.net/tryton
+        
+        License
+        -------
+        
+        See LICENSE
+        
+        Copyright
+        ---------
+        
+        See COPYRIGHT
+        
+        
+        For more information please visit the Tryton web site:
+        
+          http://www.tryton.org/
+        
 Platform: UNKNOWN
 Classifier: Development Status :: 5 - Production/Stable
 Classifier: Environment :: Plugins
diff --git a/README b/README
index bbe3ab1..5990538 100644
--- a/README
+++ b/README
@@ -2,7 +2,6 @@ trytond_sale
 ============
 
 The sale module of the Tryton application platform.
-See __tryton__.py
 
 Installing
 ----------
diff --git a/__init__.py b/__init__.py
index 8fcedeb..8e71455 100644
--- a/__init__.py
+++ b/__init__.py
@@ -1,6 +1,40 @@
 #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 trytond.pool import Pool
 from .sale import *
 from .configuration import *
 from .invoice import *
+
+
+def register():
+    Pool.register(
+        Sale,
+        SaleInvoice,
+        SaleIgnoredInvoice,
+        SaleRecreatedInvoice,
+        SaleLine,
+        SaleLineTax,
+        SaleLineInvoiceLine,
+        SaleLineIgnoredMove,
+        SaleLineRecreatedMove,
+        Template,
+        Product,
+        ShipmentOut,
+        ShipmentOutReturn,
+        Move,
+        HandleShipmentExceptionAsk,
+        HandleInvoiceExceptionAsk,
+        Configuration,
+        Invoice,
+        InvoiceLine,
+        module='sale', type_='model')
+    Pool.register(
+        OpenCustomer,
+        HandleShipmentException,
+        HandleInvoiceException,
+        ReturnSale,
+        module='sale', type_='wizard')
+    Pool.register(
+        SaleReport,
+        module='sale', type_='report')
diff --git a/__tryton__.py b/__tryton__.py
deleted file mode 100644
index 7286016..0000000
--- a/__tryton__.py
+++ /dev/null
@@ -1,183 +0,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.
-{
-    'name': 'Sale',
-    'name_bg_BG': 'Продажби',
-    'name_ca_ES': 'Vendes',
-    'name_de_DE': 'Verkauf',
-    'name_es_AR': 'Venta',
-    'name_es_CO': 'Ventas',
-    'name_es_ES': 'Ventas',
-    'name_fr_FR': 'Vente',
-    'name_nl_NL': 'Verkoop',
-    'version': '2.4.1',
-    'author': 'B2CK',
-    'email': 'info at b2ck.com',
-    'website': 'http://www.tryton.org/',
-    'description': '''Define sale order.
-Add to product sale informations.
-Define the sale price as the list price.
-
-With the possibilities:
-    - to follow invoice and shipment states from the sale order.
-    - to define invoice method:
-        - Manual
-        - On Order Processed
-        - On shipment Sent
-    - to define shipment method:
-        - Manual
-        - On Order Processed
-        - On Invoice Paid
-''',
-    'description_bg_BG': ''' Задаване на поръчка за продажба.
- - Добавяне на информация за продажба на продукт.
- - Задаване на продажна цена като ценова листа.
-
-Със следните възможности:
-    - проследяване на състоянията на фактура и доставка от поръчката за продажба
-    - задаване на начини на фактуриране:
-        - Ръчно
-        - При потвърждаване на поръчката
-        - При изпращане
-    - задаване на начина на доставка:
-        - Ръчно
-        - При потвърждаване на поръчката
-        - При плащане на фактурата
-''',
-   'description_ca_ES': '''- Defineix comandes de venda.
-- Afegeix informació de vendes als productes.
-- Defineix el preu de venda com el preu de la llista.
-
-Amb la possibilitat de:
-    - Seguir els estats de facturació i enviament des de la comanda de venda.
-    - Definir el mètode de facturació:
-        - Manual
-        - A la confirmació de la comanda
-        - A l'enviar-la
-    - Definir el mètode d'enviament:
-        - Manual
-        - A la confirmació de la comanda
-        - Al cobrar la factura
-''',
-    'description_de_DE': ''' - Dient der Erstellung von Verkaufsvorgängen (Entwurf, Angebot, Auftrag).
- - Fügt den Artikeln Einkaufsinformationen hinzu.
- - Erlaubt die Definition des Einkaufspreises als Listenpreis.
-
-Ermöglicht:
-    - die Verfolgung des Status von Rechnungsstellung und Versand für Verkäufe
-    - die Festlegung der Methode für die Rechnungsstellung:
-        - Manuell
-        - Nach Auftragsbestätigung
-        - Nach Versand
-    - die Festlegung der Methode für den Versand:
-        - Manuell
-        - Nach Auftragsbestätigung
-        - Nach Bezahlung
-''',
-    'description_es_AR': '''Define orden de venta.
- - Añade a los productos información de ventas.
- - Define el precio de venta como el precio de lista.
-
- - Con la posibilidad de:
-    - seguir los estados de facturación y envio desde la orden de venta.
-    - definir el método de facturación:
-        - Manual
-        - A la confirmación de la orden
-        - Al enviarlo
-    - definir el método de envio:
-        - Manual
-        - Al confirmar la orden
-        - Al pagar la factura
-''',
-    'description_es_CO': ''' - Define la orden de Ventas.
- - Se añade al producto la información de ventas.
- - Definición del precio de venta y el precio de lista.
-
- - Con las posibilidades de:
-    - seguir los estados de facturación y empaque desde la orden de venta.
-    - definir el método de facturación:
-        - Manual
-        - Al Confirmar la Orden
-        - Al Envío del Paquete
-    - definir el método de empaque:
-        - Manual
-        - Al Confirmar la Orden
-        - Contra el Pago de la Factura
-''',
-    'description_es_ES': '''- Define pedido de venta.
-- Añade información de venta a los productos.
-- Define el precio de venta como el precio de lista.
-
-Con la posibilidad de:
-    - Seguir los estados de facturación y envío desde el pedido de venta.
-    - Definir el método de facturación:
-        - Manual
-        - A la confirmación del pedido
-        - Al enviarlo
-    - Definir el método de envío:
-        - Manual
-        - Al confirmar el pedido
-        - Al pagar la factura
-''',
-    'description_fr_FR': '''Défini l'ordre de vente.
-Ajoute au produit les informations de vente.
-
-Avec la possibilité:
-    - de suivre l'état de la facture et du colisage depuis l'ordre de vente
-    - de choisir entre plusieurs méthodes de facturation:
-        - Manuelle
-        - Sur confirmation de la commande
-        - À la livraison
-    - de choisir entre plusieurs méthodes de colisage:
-        - Manuelle
-        - Sur confirmation de la commande
-        - Au paiement de la facture
-''',
-    'description_nl_NL': '''Verkoopmodule.
-Voegt verkoopinformatie toe aan producten.
-Zet de catalogusprijs als verkoopprijs.
-
-Biedt mogelijkheden tot:
-    - het volgen van de factuur en de aflevering vanuit de offerte.
-    - het instellen van de factuurafhandeling:
-        - Handmatig
-        - Bij opdrachtbevestiging
-        - Bij aflevering
-    - het instellen van de aflevering:
-        - Handmatig
-        - Bij opdrachtbevestiging
-        - Na betaling
-''',
-    'depends': [
-        'company',
-        'party',
-        'stock',
-        'account',
-        'product',
-        'account_invoice',
-        'res',
-        'ir',
-        'currency',
-        'account_product',
-    ],
-    'xml': [
-        'sale.xml',
-        'configuration.xml',
-        'party.xml',
-        'stock.xml',
-        'product.xml',
-    ],
-    'translation': [
-        'locale/bg_BG.po',
-        'locale/ca_ES.po',
-        'locale/cs_CZ.po',
-        'locale/de_DE.po',
-        'locale/es_AR.po',
-        'locale/es_CO.po',
-        'locale/es_ES.po',
-        'locale/fr_FR.po',
-        'locale/nl_NL.po',
-        'locale/fr_FR.po',
-        'locale/ru_RU.po',
-    ],
-}
diff --git a/configuration.py b/configuration.py
index f32b6f0..46de41d 100644
--- a/configuration.py
+++ b/configuration.py
@@ -3,12 +3,12 @@
 from trytond.model import ModelView, ModelSQL, ModelSingleton, fields
 from trytond.pyson import Eval, Bool
 
+__all__ = ['Configuration']
+
 
 class Configuration(ModelSingleton, ModelSQL, ModelView):
     'Sale Configuration'
-    _name = 'sale.configuration'
-    _description = __doc__
-
+    __name__ = 'sale.configuration'
     sale_sequence = fields.Property(fields.Many2One('ir.sequence',
             'Sale Reference Sequence', domain=[
                 ('company', 'in', [Eval('context', {}).get('company', 0),
@@ -29,5 +29,3 @@ class Configuration(ModelSingleton, ModelSQL, ModelView):
                 ], 'Sale Shipment Method', states={
                 'required': Bool(Eval('context', {}).get('company', 0)),
                 }))
-
-Configuration()
diff --git a/invoice.py b/invoice.py
index 5163f38..30d7886 100644
--- a/invoice.py
+++ b/invoice.py
@@ -1,14 +1,52 @@
 #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 trytond.model import Model, fields
-from trytond.pool import Pool
+from trytond.model import Workflow, fields
+from trytond.pool import Pool, PoolMeta
+from trytond.transaction import Transaction
 
+__all__ = ['Invoice', 'InvoiceLine']
+__metaclass__ = PoolMeta
 
-class Invoice(Model):
-    _name = 'account.invoice'
 
+class Invoice:
+    __name__ = 'account.invoice'
     sales = fields.Many2Many('sale.sale-account.invoice',
             'invoice', 'sale', 'Sales', readonly=True)
+    sale_exception_state = fields.Function(fields.Selection([
+        ('', ''),
+        ('ignored', 'Ignored'),
+        ('recreated', 'Recreated'),
+        ], 'Exception State'), 'get_sale_exception_state')
+
+    @classmethod
+    def __setup__(cls):
+        super(Invoice, cls).__setup__()
+        cls._error_messages.update({
+            'delete_sale_invoice': 'You can not delete invoices '
+                    'that come from a sale!',
+            'reset_invoice_sale': 'You cannot reset to draft '
+                    'an invoice generated by a sale.',
+            })
+
+    @classmethod
+    def get_sale_exception_state(cls, invoices, name):
+        Sale = Pool().get('sale.sale')
+        with Transaction().set_user(0, set_context=True):
+            sales = Sale.search([
+                    ('invoices', 'in', [i.id for i in invoices]),
+                    ])
+
+        recreated = tuple(i for p in sales for i in p.invoices_recreated)
+        ignored = tuple(i for p in sales for i in p.invoices_ignored)
+
+        states = {}
+        for invoice in invoices:
+            states[invoice.id] = ''
+            if invoice in recreated:
+                states[invoice.id] = 'recreated'
+            elif invoice.id in ignored:
+                states[invoice.id] = 'ignored'
+        return states
 
     def copy(self, ids, default=None):
         if default is None:
@@ -17,34 +55,55 @@ class Invoice(Model):
         default.setdefault('sales', None)
         return super(Invoice, self).copy(ids, default=default)
 
-    def paid(self, ids):
+    @classmethod
+    def delete(cls, invoices):
+        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():
+                cls.raise_user_error('delete_sale_invoice')
+        super(Invoice, cls).delete(invoices)
+
+    @classmethod
+    def paid(cls, invoices):
         pool = Pool()
-        sale_obj = pool.get('sale.sale')
-        super(Invoice, self).paid(ids)
-        invoices = self.browse(ids)
-        sale_obj.process([s.id for i in invoices for s in i.sales])
+        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])
 
-    def cancel(self, ids):
+    @classmethod
+    def cancel(cls, invoices):
         pool = Pool()
-        sale_obj = pool.get('sale.sale')
-        super(Invoice, self).cancel(ids)
-        invoices = self.browse(ids)
-        sale_obj.process([s.id for i in invoices for s in i.sales])
+        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])
 
-Invoice()
+    @classmethod
+    @Workflow.transition('draft')
+    def draft(cls, invoices):
+        Sale = Pool().get('sale.sale')
+        with Transaction().set_user(0, set_context=True):
+            sales = Sale.search([
+                    ('invoices', 'in', [i.id for i in invoices]),
+                    ])
+        if sales:
+            cls.raise_user_error('reset_invoice_sale')
 
+        return super(Invoice, cls).draft(invoices)
 
-class InvoiceLine(Model):
-    _name = 'account.invoice.line'
 
+class InvoiceLine:
+    __name__ = 'account.invoice.line'
     sale_lines = fields.Many2Many('sale.line-account.invoice.line',
             'invoice_line', 'sale_line', 'Sale Lines', readonly=True)
 
-    def copy(self, ids, default=None):
+    @classmethod
+    def copy(cls, lines, default=None):
         if default is None:
             default = {}
         default = default.copy()
         default.setdefault('sale_lines', None)
-        return super(InvoiceLine, self).copy(ids, default=default)
-
-InvoiceLine()
+        return super(InvoiceLine, cls).copy(lines, default=default)
diff --git a/locale/bg_BG.po b/locale/bg_BG.po
index c52847c..1bf3966 100644
--- a/locale/bg_BG.po
+++ b/locale/bg_BG.po
@@ -32,11 +32,11 @@ msgstr "Липсва \"Приходна сметка\" за партньор \"%
 
 msgctxt "error:sale.sale:"
 msgid "Sale \"%s\" must be cancelled before deletion!"
-msgstr ""
+msgstr "Преди да бъде изтрита продажбата \"%s\" трябва да бъде прекратена!"
 
 msgctxt "error:sale.sale:"
 msgid "Warehouse must be defined for the quotation."
-msgstr ""
+msgstr "При запитване е необходимо да се укаже склад"
 
 msgctxt "error:sale.sale:"
 msgid "Wrong combination of method!"
@@ -148,7 +148,7 @@ msgstr "Създадено от"
 
 msgctxt "field:sale.line,delivery_date:"
 msgid "Delivery Date"
-msgstr ""
+msgstr "Дата на доставка"
 
 msgctxt "field:sale.line,description:"
 msgid "Description"
@@ -196,7 +196,7 @@ msgstr "Продукт"
 
 msgctxt "field:sale.line,product_uom_category:"
 msgid "Product Uom Category"
-msgstr ""
+msgstr "Категория мер. ед. на продукт"
 
 msgctxt "field:sale.line,quantity:"
 msgid "Quantity"
@@ -476,7 +476,7 @@ msgstr "Начин на изпращане"
 
 msgctxt "field:sale.sale,shipment_returns:"
 msgid "Shipment Returns"
-msgstr ""
+msgstr "Върнати доставки"
 
 msgctxt "field:sale.sale,shipment_state:"
 msgid "Shipment State"
@@ -504,7 +504,7 @@ msgstr "Общо"
 
 msgctxt "field:sale.sale,total_amount_cache:"
 msgid "Total Tax"
-msgstr ""
+msgstr "Общо данъци"
 
 msgctxt "field:sale.sale,untaxed_amount:"
 msgid "Untaxed"
@@ -654,7 +654,7 @@ msgstr "Партньори свързани с продажби"
 
 msgctxt "model:ir.action,name:act_return_form"
 msgid "Returns"
-msgstr ""
+msgstr "Връщане"
 
 msgctxt "model:ir.action,name:act_sale_configuration_form"
 msgid "Sales Configuration"
@@ -678,7 +678,7 @@ msgstr "Проект на продажби"
 
 msgctxt "model:ir.action,name:act_sale_form_processing"
 msgid "Processing Sales"
-msgstr ""
+msgstr "Обработване на продажби"
 
 msgctxt "model:ir.action,name:act_sale_form_quotation"
 msgid "Quotation Sales"
@@ -698,7 +698,7 @@ msgstr "Обработка на грешка към фактура"
 
 msgctxt "model:ir.action,name:wizard_return_sale"
 msgid "Create Return Sale"
-msgstr ""
+msgstr "Създаване на меню Продажби"
 
 msgctxt "model:ir.action,name:wizard_shipment_handle_exception"
 msgid "Handle Shipment Exception"
@@ -742,7 +742,7 @@ msgstr "Проект на продажби"
 
 msgctxt "model:ir.ui.menu,name:menu_sale_form_processing"
 msgid "Processing Sales"
-msgstr ""
+msgstr "Обработване на прожадби"
 
 msgctxt "model:ir.ui.menu,name:menu_sale_form_quotation"
 msgid "Quotation Sales"
@@ -760,12 +760,10 @@ msgctxt "model:sale.configuration,name:"
 msgid "Sale Configuration"
 msgstr "Конфигурация на продажба"
 
-#, fuzzy
 msgctxt "model:sale.handle.invoice.exception.ask,name:"
 msgid "Handle Invoice Exception"
 msgstr "Обработване за грешка в фактура"
 
-#, fuzzy
 msgctxt "model:sale.handle.shipment.exception.ask,name:"
 msgid "Handle Shipment Exception"
 msgstr "Обработване на грешка при пратка"
@@ -1108,7 +1106,7 @@ msgstr "Друга информация"
 
 msgctxt "view:sale.sale:"
 msgid "Process"
-msgstr ""
+msgstr "Обработване"
 
 msgctxt "view:sale.sale:"
 msgid "Quotation"
@@ -1116,7 +1114,7 @@ msgstr "Запитване"
 
 msgctxt "view:sale.sale:"
 msgid "Quote"
-msgstr ""
+msgstr "Запитване"
 
 msgctxt "view:sale.sale:"
 msgid "Sale"
diff --git a/locale/ca_ES.po b/locale/ca_ES.po
index 9eed94f..4ce4d3a 100644
--- a/locale/ca_ES.po
+++ b/locale/ca_ES.po
@@ -4,7 +4,7 @@ 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 "No pot esborrar factures que provenen d'una venda"
+msgstr "No pot esborrar factures que provenen d'una venda."
 
 msgctxt "error:account.invoice:"
 msgid "You cannot reset to draft an invoice generated by a sale."
@@ -12,39 +12,38 @@ msgstr "No pot restablir a esborrany una factura generada per una venda."
 
 msgctxt "error:sale.line:"
 msgid "It misses an \"Account Revenue\" on product \"%s\"!"
-msgstr "Falta un «Compte d'ingressos» en el producte «%s»"
+msgstr "Falta un \"Compte d'ingressos\" en el producte \"%s\"."
 
 msgctxt "error:sale.line:"
 msgid "It misses an \"account Revenue\" default property!"
-msgstr "Falta una propietat predeterminada de «Compte d'ingressos»"
+msgstr "Falta una propietat predeterminada de \"Compte d'ingressos\"."
 
 msgctxt "error:sale.line:"
 msgid "The customer location is required!"
-msgstr "Es necessita la ubicació del client"
+msgstr "Es necessita la ubicació del client."
 
 msgctxt "error:sale.sale:"
 msgid "Invoice and Shipment addresses must be defined for the quotation."
 msgstr ""
-"Les adreces de facturació i d'enviament han de ser definides per al "
+"Les adreces de facturació i d'enviament han de ser definides en el "
 "pressupost."
 
 msgctxt "error:sale.sale:"
 msgid "It misses an \"Account Receivable\" on the party \"%s\"!"
-msgstr "Falta un «Compte d'ingressos» en el tercer «%s»"
+msgstr "Falta un \"Compte d'ingressos\" en el tercer \"%s\"."
 
 msgctxt "error:sale.sale:"
 msgid "Sale \"%s\" must be cancelled before deletion!"
-msgstr ""
+msgstr "La comanda \"%s\" ha de ser cancel·lada abans d'eliminar-la."
 
 msgctxt "error:sale.sale:"
 msgid "Warehouse must be defined for the quotation."
-msgstr ""
+msgstr "Cal definir un magatzem pel pressupost."
 
 msgctxt "error:sale.sale:"
 msgid "Wrong combination of method!"
-msgstr "Combinació invàlida de mètodes"
+msgstr "Combinació invàlida dels mètodes."
 
-#, fuzzy
 msgctxt "error:stock.shipment.out.return:"
 msgid "You cannot reset to draft a move generated by a sale."
 msgstr "No pot restablir a esborrany un moviment generat per una venda."
@@ -57,24 +56,21 @@ msgctxt "field:account.invoice,sale_exception_state:"
 msgid "Exception State"
 msgstr "Estat d'excepció"
 
-#, fuzzy
 msgctxt "field:account.invoice,sales:"
 msgid "Sales"
 msgstr "Vendes"
 
-#, fuzzy
 msgctxt "field:account.invoice.line,sale_lines:"
 msgid "Sale Lines"
 msgstr "Línies de venda"
 
-#, fuzzy
 msgctxt "field:product.template,delivery_time:"
 msgid "Delivery Time"
 msgstr "Temps d'enviament"
 
 msgctxt "field:product.template,salable:"
 msgid "Salable"
-msgstr "Vendible"
+msgstr "Pot ser venut"
 
 msgctxt "field:product.template,sale_uom:"
 msgid "Sale UOM"
@@ -82,95 +78,91 @@ msgstr "UdM de venda"
 
 msgctxt "field:sale.configuration,create_date:"
 msgid "Create Date"
-msgstr ""
+msgstr "Data creació"
 
-#, fuzzy
 msgctxt "field:sale.configuration,create_uid:"
 msgid "Create User"
-msgstr "Crear usuari"
+msgstr "Usuari creació"
 
 msgctxt "field:sale.configuration,id:"
 msgid "ID"
-msgstr ""
+msgstr "ID"
 
-#, fuzzy
 msgctxt "field:sale.configuration,rec_name:"
 msgid "Name"
-msgstr "Nom del camp"
+msgstr "Nom"
 
 msgctxt "field:sale.configuration,sale_invoice_method:"
 msgid "Sale Invoice Method"
-msgstr ""
+msgstr "Mètode de facturació"
 
 msgctxt "field:sale.configuration,sale_sequence:"
 msgid "Sale Reference Sequence"
-msgstr ""
+msgstr "Seqüència numeració vendes"
 
 msgctxt "field:sale.configuration,sale_shipment_method:"
 msgid "Sale Shipment Method"
-msgstr ""
+msgstr "Mètode d'enviament"
 
 msgctxt "field:sale.configuration,write_date:"
 msgid "Write Date"
-msgstr ""
+msgstr "Data modificació"
 
 msgctxt "field:sale.configuration,write_uid:"
 msgid "Write User"
-msgstr ""
+msgstr "Usuari modificació"
 
 msgctxt "field:sale.handle.invoice.exception.ask,domain_invoices:"
 msgid "Domain Invoices"
-msgstr "Factures del domini"
+msgstr "Domini factures"
 
 msgctxt "field:sale.handle.invoice.exception.ask,id:"
 msgid "ID"
-msgstr ""
+msgstr "ID"
 
 msgctxt "field:sale.handle.invoice.exception.ask,recreate_invoices:"
 msgid "Recreate Invoices"
-msgstr "Refer factures"
+msgstr "Recrea factures"
 
 msgctxt "field:sale.handle.shipment.exception.ask,domain_moves:"
 msgid "Domain Moves"
-msgstr "Moviments de domini"
+msgstr "Domini moviments"
 
 msgctxt "field:sale.handle.shipment.exception.ask,id:"
 msgid "ID"
-msgstr ""
+msgstr "ID"
 
 msgctxt "field:sale.handle.shipment.exception.ask,recreate_moves:"
 msgid "Recreate Moves"
-msgstr "Refer moviments"
+msgstr "Recrea moviments"
 
 msgctxt "field:sale.line,amount:"
 msgid "Amount"
-msgstr "Quantitat"
+msgstr "Import"
 
 msgctxt "field:sale.line,create_date:"
 msgid "Create Date"
-msgstr ""
+msgstr "Data creació"
 
-#, fuzzy
 msgctxt "field:sale.line,create_uid:"
 msgid "Create User"
-msgstr "Crear usuari"
+msgstr "Usuari creació"
 
 msgctxt "field:sale.line,delivery_date:"
 msgid "Delivery Date"
-msgstr ""
+msgstr "Data de lliurament"
 
 msgctxt "field:sale.line,description:"
 msgid "Description"
 msgstr "Descripció"
 
-#, fuzzy
 msgctxt "field:sale.line,from_location:"
 msgid "From Location"
 msgstr "Des de la ubicació"
 
 msgctxt "field:sale.line,id:"
 msgid "ID"
-msgstr ""
+msgstr "ID"
 
 msgctxt "field:sale.line,invoice_lines:"
 msgid "Invoice Lines"
@@ -178,7 +170,7 @@ msgstr "Línies de factura"
 
 msgctxt "field:sale.line,move_done:"
 msgid "Moves Done"
-msgstr "Moviments acabats"
+msgstr "Moviments finalitzats"
 
 msgctxt "field:sale.line,move_exception:"
 msgid "Moves Exception"
@@ -194,7 +186,7 @@ msgstr "Moviments ignorats"
 
 msgctxt "field:sale.line,moves_recreated:"
 msgid "Recreated Moves"
-msgstr "Refer moviments"
+msgstr "Moviments recreats"
 
 msgctxt "field:sale.line,note:"
 msgid "Note"
@@ -206,7 +198,7 @@ msgstr "Producte"
 
 msgctxt "field:sale.line,product_uom_category:"
 msgid "Product Uom Category"
-msgstr ""
+msgstr "Categoria UdM del producte"
 
 msgctxt "field:sale.line,quantity:"
 msgid "Quantity"
@@ -228,7 +220,6 @@ msgctxt "field:sale.line,taxes:"
 msgid "Taxes"
 msgstr "Impostos"
 
-#, fuzzy
 msgctxt "field:sale.line,to_location:"
 msgid "To Location"
 msgstr "A la ubicació"
@@ -243,37 +234,35 @@ msgstr "Unitat"
 
 msgctxt "field:sale.line,unit_digits:"
 msgid "Unit Digits"
-msgstr "Dígits de la unitat"
+msgstr "Decimals de la unitat"
 
 msgctxt "field:sale.line,unit_price:"
 msgid "Unit Price"
 msgstr "Preu unitari"
 
-#, fuzzy
 msgctxt "field:sale.line,warehouse:"
 msgid "Warehouse"
 msgstr "Magatzem"
 
 msgctxt "field:sale.line,write_date:"
 msgid "Write Date"
-msgstr ""
+msgstr "Data modificació"
 
 msgctxt "field:sale.line,write_uid:"
 msgid "Write User"
-msgstr ""
+msgstr "Usuari modificació"
 
 msgctxt "field:sale.line-account.invoice.line,create_date:"
 msgid "Create Date"
-msgstr ""
+msgstr "Data creació"
 
-#, fuzzy
 msgctxt "field:sale.line-account.invoice.line,create_uid:"
 msgid "Create User"
-msgstr "Crear usuari"
+msgstr "Usuari creació"
 
 msgctxt "field:sale.line-account.invoice.line,id:"
 msgid "ID"
-msgstr ""
+msgstr "ID"
 
 msgctxt "field:sale.line-account.invoice.line,invoice_line:"
 msgid "Invoice Line"
@@ -285,32 +274,31 @@ msgstr "Nom"
 
 msgctxt "field:sale.line-account.invoice.line,sale_line:"
 msgid "Sale Line"
-msgstr "Línia de venda"
+msgstr "Línia de venta"
 
 msgctxt "field:sale.line-account.invoice.line,write_date:"
 msgid "Write Date"
-msgstr ""
+msgstr "Data modificació"
 
 msgctxt "field:sale.line-account.invoice.line,write_uid:"
 msgid "Write User"
-msgstr ""
+msgstr "Usuari modificació"
 
 msgctxt "field:sale.line-account.tax,create_date:"
 msgid "Create Date"
-msgstr ""
+msgstr "Data creació"
 
-#, fuzzy
 msgctxt "field:sale.line-account.tax,create_uid:"
 msgid "Create User"
-msgstr "Crear usuari"
+msgstr "Usuari creació"
 
 msgctxt "field:sale.line-account.tax,id:"
 msgid "ID"
-msgstr ""
+msgstr "ID"
 
 msgctxt "field:sale.line-account.tax,line:"
 msgid "Sale Line"
-msgstr "Línia de venda"
+msgstr "Línia de venta"
 
 msgctxt "field:sale.line-account.tax,rec_name:"
 msgid "Name"
@@ -322,24 +310,23 @@ msgstr "Impost"
 
 msgctxt "field:sale.line-account.tax,write_date:"
 msgid "Write Date"
-msgstr ""
+msgstr "Data modificació"
 
 msgctxt "field:sale.line-account.tax,write_uid:"
 msgid "Write User"
-msgstr ""
+msgstr "Usuari modificació"
 
 msgctxt "field:sale.line-ignored-stock.move,create_date:"
 msgid "Create Date"
-msgstr ""
+msgstr "Data creació"
 
-#, fuzzy
 msgctxt "field:sale.line-ignored-stock.move,create_uid:"
 msgid "Create User"
-msgstr "Crear usuari"
+msgstr "Usuari creació"
 
 msgctxt "field:sale.line-ignored-stock.move,id:"
 msgid "ID"
-msgstr ""
+msgstr "ID"
 
 msgctxt "field:sale.line-ignored-stock.move,move:"
 msgid "Move"
@@ -355,24 +342,23 @@ msgstr "Línia de venda"
 
 msgctxt "field:sale.line-ignored-stock.move,write_date:"
 msgid "Write Date"
-msgstr ""
+msgstr "Data modificació"
 
 msgctxt "field:sale.line-ignored-stock.move,write_uid:"
 msgid "Write User"
-msgstr ""
+msgstr "Usuari modificació"
 
 msgctxt "field:sale.line-recreated-stock.move,create_date:"
 msgid "Create Date"
-msgstr ""
+msgstr "Data creació"
 
-#, fuzzy
 msgctxt "field:sale.line-recreated-stock.move,create_uid:"
 msgid "Create User"
-msgstr "Crear usuari"
+msgstr "Usuari creació"
 
 msgctxt "field:sale.line-recreated-stock.move,id:"
 msgid "ID"
-msgstr ""
+msgstr "ID"
 
 msgctxt "field:sale.line-recreated-stock.move,move:"
 msgid "Move"
@@ -384,15 +370,15 @@ msgstr "Nom"
 
 msgctxt "field:sale.line-recreated-stock.move,sale_line:"
 msgid "Sale Line"
-msgstr "Línia de venda"
+msgstr "Línia de venta"
 
 msgctxt "field:sale.line-recreated-stock.move,write_date:"
 msgid "Write Date"
-msgstr ""
+msgstr "Data modificació"
 
 msgctxt "field:sale.line-recreated-stock.move,write_uid:"
 msgid "Write User"
-msgstr ""
+msgstr "Usuari modificació"
 
 msgctxt "field:sale.sale,comment:"
 msgid "Comment"
@@ -404,20 +390,19 @@ msgstr "Empresa"
 
 msgctxt "field:sale.sale,create_date:"
 msgid "Create Date"
-msgstr ""
+msgstr "Data creació"
 
-#, fuzzy
 msgctxt "field:sale.sale,create_uid:"
 msgid "Create User"
-msgstr "Crear usuari"
+msgstr "Usuari creació"
 
 msgctxt "field:sale.sale,currency:"
 msgid "Currency"
-msgstr "Divisa"
+msgstr "Moneda"
 
 msgctxt "field:sale.sale,currency_digits:"
 msgid "Currency Digits"
-msgstr "Dígits de la divisa"
+msgstr "Decimals de la moneda"
 
 msgctxt "field:sale.sale,description:"
 msgid "Description"
@@ -425,7 +410,7 @@ msgstr "Descripció"
 
 msgctxt "field:sale.sale,id:"
 msgid "ID"
-msgstr ""
+msgstr "ID"
 
 msgctxt "field:sale.sale,invoice_address:"
 msgid "Invoice Address"
@@ -437,7 +422,7 @@ msgstr "Mètode de facturació"
 
 msgctxt "field:sale.sale,invoice_state:"
 msgid "Invoice State"
-msgstr "Estat de factura"
+msgstr "Estat factura"
 
 msgctxt "field:sale.sale,invoices:"
 msgid "Invoices"
@@ -449,7 +434,7 @@ msgstr "Factures ignorades"
 
 msgctxt "field:sale.sale,invoices_recreated:"
 msgid "Recreated Invoices"
-msgstr "Refer factures"
+msgstr "Factures recreades"
 
 msgctxt "field:sale.sale,lines:"
 msgid "Lines"
@@ -469,7 +454,7 @@ msgstr "Idioma del tercer"
 
 msgctxt "field:sale.sale,payment_term:"
 msgid "Payment Term"
-msgstr "Terme de pagament"
+msgstr "Termini de pagament"
 
 msgctxt "field:sale.sale,rec_name:"
 msgid "Name"
@@ -485,19 +470,19 @@ msgstr "Data de venda"
 
 msgctxt "field:sale.sale,shipment_address:"
 msgid "Shipment Address"
-msgstr "Adreça d'enviament"
+msgstr "Adreça enviament"
 
 msgctxt "field:sale.sale,shipment_method:"
 msgid "Shipment Method"
-msgstr "Mètode d'enviament"
+msgstr "Mètode enviament"
 
 msgctxt "field:sale.sale,shipment_returns:"
 msgid "Shipment Returns"
-msgstr ""
+msgstr "Albarans de devolució"
 
 msgctxt "field:sale.sale,shipment_state:"
 msgid "Shipment State"
-msgstr "Estat d'enviament"
+msgstr "Estat enviament"
 
 msgctxt "field:sale.sale,shipments:"
 msgid "Shipments"
@@ -513,7 +498,7 @@ msgstr "Impost"
 
 msgctxt "field:sale.sale,tax_amount_cache:"
 msgid "Tax Cache"
-msgstr ""
+msgstr "Impostos precalculats"
 
 msgctxt "field:sale.sale,total_amount:"
 msgid "Total"
@@ -521,15 +506,15 @@ msgstr "Total"
 
 msgctxt "field:sale.sale,total_amount_cache:"
 msgid "Total Tax"
-msgstr ""
+msgstr "Total impostos"
 
 msgctxt "field:sale.sale,untaxed_amount:"
 msgid "Untaxed"
-msgstr "Sense impost"
+msgstr "Base imposable"
 
 msgctxt "field:sale.sale,untaxed_amount_cache:"
 msgid "Untaxed Cache"
-msgstr ""
+msgstr "Base imposable precalculada"
 
 msgctxt "field:sale.sale,warehouse:"
 msgid "Warehouse"
@@ -537,24 +522,23 @@ msgstr "Magatzem"
 
 msgctxt "field:sale.sale,write_date:"
 msgid "Write Date"
-msgstr ""
+msgstr "Data modificació"
 
 msgctxt "field:sale.sale,write_uid:"
 msgid "Write User"
-msgstr ""
+msgstr "Usuari modificació"
 
 msgctxt "field:sale.sale-account.invoice,create_date:"
 msgid "Create Date"
-msgstr ""
+msgstr "Data creació"
 
-#, fuzzy
 msgctxt "field:sale.sale-account.invoice,create_uid:"
 msgid "Create User"
-msgstr "Crear usuari"
+msgstr "Usuari creació"
 
 msgctxt "field:sale.sale-account.invoice,id:"
 msgid "ID"
-msgstr ""
+msgstr "ID"
 
 msgctxt "field:sale.sale-account.invoice,invoice:"
 msgid "Invoice"
@@ -570,24 +554,23 @@ msgstr "Venda"
 
 msgctxt "field:sale.sale-account.invoice,write_date:"
 msgid "Write Date"
-msgstr ""
+msgstr "Data modificació"
 
 msgctxt "field:sale.sale-account.invoice,write_uid:"
 msgid "Write User"
-msgstr ""
+msgstr "Usuari modificació"
 
 msgctxt "field:sale.sale-ignored-account.invoice,create_date:"
 msgid "Create Date"
-msgstr ""
+msgstr "Data creació"
 
-#, fuzzy
 msgctxt "field:sale.sale-ignored-account.invoice,create_uid:"
 msgid "Create User"
-msgstr "Crear usuari"
+msgstr "Usuari creació"
 
 msgctxt "field:sale.sale-ignored-account.invoice,id:"
 msgid "ID"
-msgstr ""
+msgstr "ID"
 
 msgctxt "field:sale.sale-ignored-account.invoice,invoice:"
 msgid "Invoice"
@@ -603,24 +586,23 @@ msgstr "Venda"
 
 msgctxt "field:sale.sale-ignored-account.invoice,write_date:"
 msgid "Write Date"
-msgstr ""
+msgstr "Data modificació"
 
 msgctxt "field:sale.sale-ignored-account.invoice,write_uid:"
 msgid "Write User"
-msgstr ""
+msgstr "Usuari modificació"
 
 msgctxt "field:sale.sale-recreated-account.invoice,create_date:"
 msgid "Create Date"
-msgstr ""
+msgstr "Data creació"
 
-#, fuzzy
 msgctxt "field:sale.sale-recreated-account.invoice,create_uid:"
 msgid "Create User"
-msgstr "Crear usuari"
+msgstr "Usuari creació"
 
 msgctxt "field:sale.sale-recreated-account.invoice,id:"
 msgid "ID"
-msgstr ""
+msgstr "ID"
 
 msgctxt "field:sale.sale-recreated-account.invoice,invoice:"
 msgid "Invoice"
@@ -636,11 +618,11 @@ msgstr "Venda"
 
 msgctxt "field:sale.sale-recreated-account.invoice,write_date:"
 msgid "Write Date"
-msgstr ""
+msgstr "Data modificació"
 
 msgctxt "field:sale.sale-recreated-account.invoice,write_uid:"
 msgid "Write User"
-msgstr ""
+msgstr "Usuari modificació"
 
 msgctxt "field:stock.move,sale:"
 msgid "Sale"
@@ -650,12 +632,10 @@ msgctxt "field:stock.move,sale_exception_state:"
 msgid "Exception State"
 msgstr "Estat excepció"
 
-#, fuzzy
 msgctxt "field:stock.move,sale_line:"
 msgid "Sale Line"
 msgstr "Línia de venda"
 
-#, fuzzy
 msgctxt "help:product.template,delivery_time:"
 msgid "In number of days"
 msgstr "En nombre de dies"
@@ -676,11 +656,11 @@ msgstr "Tercers associats a vendes"
 
 msgctxt "model:ir.action,name:act_return_form"
 msgid "Returns"
-msgstr ""
+msgstr "Retorna"
 
 msgctxt "model:ir.action,name:act_sale_configuration_form"
 msgid "Sales Configuration"
-msgstr ""
+msgstr "Configuració vendes"
 
 msgctxt "model:ir.action,name:act_sale_form"
 msgid "Sales"
@@ -696,11 +676,11 @@ msgstr "Vendes confirmades"
 
 msgctxt "model:ir.action,name:act_sale_form_draft"
 msgid "Draft Sales"
-msgstr "Vendes en esborrany"
+msgstr "Vendes borrador"
 
 msgctxt "model:ir.action,name:act_sale_form_processing"
 msgid "Processing Sales"
-msgstr ""
+msgstr "Vendes en procés"
 
 msgctxt "model:ir.action,name:act_sale_form_quotation"
 msgid "Quotation Sales"
@@ -708,7 +688,7 @@ msgstr "Vendes pressupostades"
 
 msgctxt "model:ir.action,name:act_shipment_form"
 msgid "Shipments"
-msgstr "Enviaments"
+msgstr "Albarans"
 
 msgctxt "model:ir.action,name:report_sale"
 msgid "Sale"
@@ -716,15 +696,15 @@ msgstr "Venda"
 
 msgctxt "model:ir.action,name:wizard_invoice_handle_exception"
 msgid "Handle Invoice Exception"
-msgstr "Gestionar excepció de factura"
+msgstr "Gestiona excepció de factura"
 
 msgctxt "model:ir.action,name:wizard_return_sale"
 msgid "Create Return Sale"
-msgstr ""
+msgstr "Crea comanda d'abonament"
 
 msgctxt "model:ir.action,name:wizard_shipment_handle_exception"
 msgid "Handle Shipment Exception"
-msgstr "Gestionar excepció d'enviament"
+msgstr "Gestiona excepció d'enviament"
 
 msgctxt "model:ir.sequence,name:sequence_sale"
 msgid "Sale"
@@ -734,7 +714,6 @@ msgctxt "model:ir.sequence.type,name:sequence_type_sale"
 msgid "Sale"
 msgstr "Venda"
 
-#, fuzzy
 msgctxt "model:ir.ui.menu,name:menu_configuration"
 msgid "Configuration"
 msgstr "Configuració"
@@ -743,14 +722,13 @@ msgctxt "model:ir.ui.menu,name:menu_customer"
 msgid "Parties associated to Sales"
 msgstr "Tercers associats a vendes"
 
-#, fuzzy
 msgctxt "model:ir.ui.menu,name:menu_sale"
 msgid "Sales"
-msgstr "Gestió de vendes"
+msgstr "Vendes"
 
 msgctxt "model:ir.ui.menu,name:menu_sale_configuration"
 msgid "Sales Configuration"
-msgstr ""
+msgstr "Configuració vendes"
 
 msgctxt "model:ir.ui.menu,name:menu_sale_form"
 msgid "Sales"
@@ -758,42 +736,39 @@ msgstr "Vendes"
 
 msgctxt "model:ir.ui.menu,name:menu_sale_form_confirmed"
 msgid "Confirmed Sales"
-msgstr "Vendes confirmades"
+msgstr "Confirmades"
 
 msgctxt "model:ir.ui.menu,name:menu_sale_form_draft"
 msgid "Draft Sales"
-msgstr "Vendes en esborrany"
+msgstr "Borrador"
 
 msgctxt "model:ir.ui.menu,name:menu_sale_form_processing"
 msgid "Processing Sales"
-msgstr ""
+msgstr "En procés"
 
 msgctxt "model:ir.ui.menu,name:menu_sale_form_quotation"
 msgid "Quotation Sales"
-msgstr "Vendes pressupostades"
+msgstr "Pressupost"
 
-#, fuzzy
 msgctxt "model:res.group,name:group_sale"
 msgid "Sales"
-msgstr "Venda"
+msgstr "Vendes"
 
 msgctxt "model:res.group,name:group_sale_admin"
 msgid "Sales Administrator"
-msgstr ""
+msgstr "Administració de vendes"
 
 msgctxt "model:sale.configuration,name:"
 msgid "Sale Configuration"
-msgstr ""
+msgstr "Configuració vendes"
 
-#, fuzzy
 msgctxt "model:sale.handle.invoice.exception.ask,name:"
 msgid "Handle Invoice Exception"
-msgstr "Excepció de factura - Petició"
+msgstr "Gestiona excepció de factura"
 
-#, fuzzy
 msgctxt "model:sale.handle.shipment.exception.ask,name:"
 msgid "Handle Shipment Exception"
-msgstr "Excepció d'enviament - Petició"
+msgstr "Gestiona excepció d'enviament"
 
 msgctxt "model:sale.line,name:"
 msgid "Sale Line"
@@ -801,11 +776,11 @@ msgstr "Línia de venda"
 
 msgctxt "model:sale.line-account.invoice.line,name:"
 msgid "Sale Line - Invoice Line"
-msgstr "Línia de venda - Línia de factura"
+msgstr "Línia de venda - Linia de factura"
 
 msgctxt "model:sale.line-account.tax,name:"
 msgid "Sale Line - Tax"
-msgstr "Línia de venda - Imposat"
+msgstr "Línia de venda - Impost"
 
 msgctxt "model:sale.line-ignored-stock.move,name:"
 msgid "Sale Line - Ignored Move"
@@ -833,7 +808,7 @@ msgstr "Venda - Factura recreada"
 
 msgctxt "odt:sale.sale:"
 msgid "Amount"
-msgstr "Quantitat"
+msgstr "Import"
 
 msgctxt "odt:sale.sale:"
 msgid "Date:"
@@ -849,11 +824,11 @@ msgstr "Descripció:"
 
 msgctxt "odt:sale.sale:"
 msgid "Draft Sale Order"
-msgstr "Ordre de venda en esborrany"
+msgstr "Vendes borrador"
 
 msgctxt "odt:sale.sale:"
 msgid "E-Mail:"
-msgstr "Correu electrònic:"
+msgstr "Email:"
 
 msgctxt "odt:sale.sale:"
 msgid "Phone:"
@@ -865,11 +840,11 @@ msgstr "Quantitat"
 
 msgctxt "odt:sale.sale:"
 msgid "Quotation N°:"
-msgstr "Pressupost nº:"
+msgstr "Pressupost Nº:"
 
 msgctxt "odt:sale.sale:"
 msgid "Sale Order N°:"
-msgstr "Ordre de venda nº:"
+msgstr "Venta Nº:"
 
 msgctxt "odt:sale.sale:"
 msgid "Taxes"
@@ -881,7 +856,7 @@ msgstr "Impostos:"
 
 msgctxt "odt:sale.sale:"
 msgid "Total (excl. taxes):"
-msgstr "Total (sense impostos):"
+msgstr "Base imposable:"
 
 msgctxt "odt:sale.sale:"
 msgid "Total:"
@@ -893,15 +868,16 @@ msgstr "Preu unitari"
 
 msgctxt "odt:sale.sale:"
 msgid "VAT Number:"
-msgstr ""
+msgstr "CIF/NIF:"
 
 msgctxt "odt:sale.sale:"
 msgid "VAT:"
-msgstr "NIF:"
+msgstr "CIF/NIF:"
 
+#, fuzzy
 msgctxt "selection:account.invoice,sale_exception_state:"
 msgid ""
-msgstr ""
+msgstr "Recreat"
 
 msgctxt "selection:account.invoice,sale_exception_state:"
 msgid "Ignored"
@@ -909,35 +885,31 @@ msgstr "Ignorat"
 
 msgctxt "selection:account.invoice,sale_exception_state:"
 msgid "Recreated"
-msgstr "Refet"
+msgstr "Recreat"
 
-#, fuzzy
 msgctxt "selection:sale.configuration,sale_invoice_method:"
 msgid "Manual"
 msgstr "Manual"
 
 msgctxt "selection:sale.configuration,sale_invoice_method:"
 msgid "On Order Processed"
-msgstr ""
+msgstr "Al processar la comanda"
 
-#, fuzzy
 msgctxt "selection:sale.configuration,sale_invoice_method:"
 msgid "On Shipment Sent"
-msgstr "En Enviar-ho"
+msgstr "Al enviar-ho"
 
-#, fuzzy
 msgctxt "selection:sale.configuration,sale_shipment_method:"
 msgid "Manual"
 msgstr "Manual"
 
-#, fuzzy
 msgctxt "selection:sale.configuration,sale_shipment_method:"
 msgid "On Invoice Paid"
-msgstr "En pagar la factura"
+msgstr "Al pagar la factura"
 
 msgctxt "selection:sale.configuration,sale_shipment_method:"
 msgid "On Order Processed"
-msgstr ""
+msgstr "Al processar la comanda"
 
 msgctxt "selection:sale.line,type:"
 msgid "Comment"
@@ -961,11 +933,11 @@ msgstr "Manual"
 
 msgctxt "selection:sale.sale,invoice_method:"
 msgid "On Order Processed"
-msgstr ""
+msgstr "Al processar la comanda"
 
 msgctxt "selection:sale.sale,invoice_method:"
 msgid "On Shipment Sent"
-msgstr "En Enviar-ho"
+msgstr "Al enviar-ho"
 
 msgctxt "selection:sale.sale,invoice_state:"
 msgid "Exception"
@@ -989,11 +961,11 @@ msgstr "Manual"
 
 msgctxt "selection:sale.sale,shipment_method:"
 msgid "On Invoice Paid"
-msgstr "En pagar la factura"
+msgstr "Al pagar la factura"
 
 msgctxt "selection:sale.sale,shipment_method:"
 msgid "On Order Processed"
-msgstr ""
+msgstr "Al processar la comanda"
 
 msgctxt "selection:sale.sale,shipment_state:"
 msgid "Exception"
@@ -1021,24 +993,24 @@ msgstr "Confirmat"
 
 msgctxt "selection:sale.sale,state:"
 msgid "Done"
-msgstr "Acabada"
+msgstr "Finalitzat"
 
 msgctxt "selection:sale.sale,state:"
 msgid "Draft"
 msgstr "Esborrany"
 
-#, fuzzy
 msgctxt "selection:sale.sale,state:"
 msgid "Processing"
-msgstr "Processament"
+msgstr "Processant"
 
 msgctxt "selection:sale.sale,state:"
 msgid "Quotation"
 msgstr "Pressupost"
 
+#, fuzzy
 msgctxt "selection:stock.move,sale_exception_state:"
 msgid ""
-msgstr ""
+msgstr "Recreat"
 
 msgctxt "selection:stock.move,sale_exception_state:"
 msgid "Ignored"
@@ -1046,13 +1018,12 @@ msgstr "Ignorat"
 
 msgctxt "selection:stock.move,sale_exception_state:"
 msgid "Recreated"
-msgstr "Refer"
+msgstr "Recreat"
 
 msgctxt "view:product.product:"
 msgid "Customers"
 msgstr "Clients"
 
-#, fuzzy
 msgctxt "view:product.product:"
 msgid "Products"
 msgstr "Productes"
@@ -1063,27 +1034,27 @@ msgstr "Clients"
 
 msgctxt "view:sale.configuration:"
 msgid "Sale Configuration"
-msgstr ""
+msgstr "Configuració comades de venda"
 
 msgctxt "view:sale.handle.invoice.exception.ask:"
 msgid "Choose invoices to recreate"
-msgstr "Esculli una factura a refer"
+msgstr "Tria una factura a refer"
 
 msgctxt "view:sale.handle.invoice.exception.ask:"
 msgid "Handle Invoice Exception"
-msgstr "Excepció de maneig de factura"
+msgstr "Gestiona excepció de factura"
 
 msgctxt "view:sale.handle.shipment.exception.ask:"
 msgid "Choose move to recreate"
-msgstr "Esculli un moviment a refer"
+msgstr "Tria un moviment a refer"
 
 msgctxt "view:sale.handle.shipment.exception.ask:"
 msgid "Handle shipment Exception"
-msgstr "Manejar excepció d'enviament"
+msgstr "Gestiona excepció d'enviament"
 
 msgctxt "view:sale.handle.shipment.exception.ask:"
 msgid "Recreate Moves"
-msgstr "Recrear moviments"
+msgstr "Recrea moviments"
 
 msgctxt "view:sale.line:"
 msgid "General"
@@ -1107,11 +1078,11 @@ msgstr "Línies de venda"
 
 msgctxt "view:sale.sale:"
 msgid "Cancel"
-msgstr "Cancel·lar"
+msgstr "Cancel·la"
 
 msgctxt "view:sale.sale:"
 msgid "Confirm"
-msgstr "Confirmar"
+msgstr "Confirma"
 
 msgctxt "view:sale.sale:"
 msgid "Draft"
@@ -1119,15 +1090,15 @@ msgstr "Esborrany"
 
 msgctxt "view:sale.sale:"
 msgid "Handle Invoice Exception"
-msgstr "Gestionar l'excepció de factura"
+msgstr "Gestiona excepció de factura"
 
 msgctxt "view:sale.sale:"
 msgid "Handle Shipment Exception"
-msgstr "Gestionar excepció d'enviament"
+msgstr "Gestiona excepció d'enviament"
 
 msgctxt "view:sale.sale:"
 msgid "Ignore Invoice Exception"
-msgstr "Ignorar excepció de factura"
+msgstr "Ignora excepció de factura"
 
 msgctxt "view:sale.sale:"
 msgid "Invoices"
@@ -1147,7 +1118,7 @@ msgstr "Informació addicional"
 
 msgctxt "view:sale.sale:"
 msgid "Process"
-msgstr ""
+msgstr "Processa"
 
 msgctxt "view:sale.sale:"
 msgid "Quotation"
@@ -1155,7 +1126,7 @@ msgstr "Pressupost"
 
 msgctxt "view:sale.sale:"
 msgid "Quote"
-msgstr ""
+msgstr "Pressupost"
 
 msgctxt "view:sale.sale:"
 msgid "Sale"
@@ -1169,27 +1140,22 @@ msgctxt "view:sale.sale:"
 msgid "Shipments"
 msgstr "Enviaments"
 
-#, fuzzy
 msgctxt "view:stock.move:"
 msgid "Moves"
 msgstr "Moviments"
 
-#, fuzzy
 msgctxt "wizard_button:sale.handle.invoice.exception,ask,end:"
 msgid "Cancel"
-msgstr "Cancel·lar"
+msgstr "Cancel·la"
 
-#, fuzzy
 msgctxt "wizard_button:sale.handle.invoice.exception,ask,handle:"
 msgid "Ok"
-msgstr "Acceptar"
+msgstr "Accepta"
 
-#, fuzzy
 msgctxt "wizard_button:sale.handle.shipment.exception,ask,end:"
 msgid "Cancel"
-msgstr "Cancel·lar"
+msgstr "Cancel·la"
 
-#, fuzzy
 msgctxt "wizard_button:sale.handle.shipment.exception,ask,handle:"
 msgid "Ok"
-msgstr "Acceptar"
+msgstr "Accepta"
diff --git a/locale/es_AR.po b/locale/es_AR.po
index c83dd30..8700042 100644
--- a/locale/es_AR.po
+++ b/locale/es_AR.po
@@ -34,7 +34,7 @@ msgstr "¡Falta una «cuenta de ingresos» en la entidad «%s»!"
 
 msgctxt "error:sale.sale:"
 msgid "Sale \"%s\" must be cancelled before deletion!"
-msgstr "¡Venta \"%s\" debe ser cancelada antes de eliminar!"
+msgstr "¡Venta «%s» debe ser cancelada antes de eliminar!"
 
 msgctxt "error:sale.sale:"
 msgid "Warehouse must be defined for the quotation."
diff --git a/locale/es_CO.po b/locale/es_CO.po
index 86029cf..5326fdb 100644
--- a/locale/es_CO.po
+++ b/locale/es_CO.po
@@ -4,75 +4,71 @@ 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 "No puede borrar la factura proveniente de una venta!"
+msgstr "No puede eliminar facturas que provienen de una venta."
 
 msgctxt "error:account.invoice:"
 msgid "You cannot reset to draft an invoice generated by a sale."
-msgstr "No puede regresar a borrador una factura generada por una venta."
+msgstr "No puede restablecer un movimiento a borrador generado por una venta."
 
 msgctxt "error:sale.line:"
 msgid "It misses an \"Account Revenue\" on product \"%s\"!"
-msgstr "Falta un \"cuenta de ingresos\" para el producto \"%s\"!"
+msgstr "Al producto \"%s\" le falta una \"Cuenta de Ingresos\"."
 
 msgctxt "error:sale.line:"
 msgid "It misses an \"account Revenue\" default property!"
-msgstr "¡Hace falta una propiedad predeterminada de \"cuenta de ganancias\"!"
+msgstr "Falta una propiedad por defecto de \"Cuenta de Ingresos\"."
 
 msgctxt "error:sale.line:"
 msgid "The customer location is required!"
-msgstr "Es indispensable el lugar del cliente!"
+msgstr "La locación de cliente es requerida!"
 
 msgctxt "error:sale.sale:"
 msgid "Invoice and Shipment addresses must be defined for the quotation."
-msgstr "Factura y dirección de Envío debe ser definida por el presupuesto."
+msgstr "La dirección de factura y envío debe ser definida en la cotización."
 
 msgctxt "error:sale.sale:"
 msgid "It misses an \"Account Receivable\" on the party \"%s\"!"
-msgstr "Falta una \"cuenta de ingresos\" en la partida \"%s\"!"
+msgstr "Al tercero \"%s\" le falta una \"Cuenta por Cobrar\"."
 
 msgctxt "error:sale.sale:"
 msgid "Sale \"%s\" must be cancelled before deletion!"
-msgstr ""
+msgstr "La venta \"%s\" debe ser cancelada antes de ser eliminada."
 
 msgctxt "error:sale.sale:"
 msgid "Warehouse must be defined for the quotation."
-msgstr ""
+msgstr "Debe indicar un almacén en el presupuesto."
 
 msgctxt "error:sale.sale:"
 msgid "Wrong combination of method!"
-msgstr "Combinación o método erróneos!"
+msgstr "Combinación no válida de métodos!"
 
-#, fuzzy
 msgctxt "error:stock.shipment.out.return:"
 msgid "You cannot reset to draft a move generated by a sale."
-msgstr "No puede regresar a borrador un movimiento generado por una venta."
+msgstr "No puede restablecer un movimiento a borrador generado por una venta."
 
 msgctxt "error:stock.shipment.out:"
 msgid "You cannot reset to draft a move generated by a sale."
-msgstr "No puede regresar a borrador un movimiento generado por una venta."
+msgstr "No puede restablecer un movimiento a borrador generado por una venta."
 
 msgctxt "field:account.invoice,sale_exception_state:"
 msgid "Exception State"
-msgstr "Estado de Excepción"
+msgstr "Estado Excepción"
 
-#, fuzzy
 msgctxt "field:account.invoice,sales:"
 msgid "Sales"
 msgstr "Ventas"
 
-#, fuzzy
 msgctxt "field:account.invoice.line,sale_lines:"
 msgid "Sale Lines"
 msgstr "Líneas de Venta"
 
-#, fuzzy
 msgctxt "field:product.template,delivery_time:"
 msgid "Delivery Time"
-msgstr "Tiempo de Envío"
+msgstr "Tiempo de Entrega"
 
 msgctxt "field:product.template,salable:"
 msgid "Salable"
-msgstr "De fácil venta"
+msgstr "Vendible"
 
 msgctxt "field:product.template,sale_uom:"
 msgid "Sale UOM"
@@ -80,65 +76,63 @@ msgstr "UdM de Venta"
 
 msgctxt "field:sale.configuration,create_date:"
 msgid "Create Date"
-msgstr ""
+msgstr "Fecha creación"
 
-#, fuzzy
 msgctxt "field:sale.configuration,create_uid:"
 msgid "Create User"
-msgstr "Crear usuario"
+msgstr "Usuario creación"
 
 msgctxt "field:sale.configuration,id:"
 msgid "ID"
-msgstr ""
+msgstr "ID"
 
-#, fuzzy
 msgctxt "field:sale.configuration,rec_name:"
 msgid "Name"
-msgstr "Nombre de Contacto"
+msgstr "Nombre"
 
 msgctxt "field:sale.configuration,sale_invoice_method:"
 msgid "Sale Invoice Method"
-msgstr ""
+msgstr "Método de facturación"
 
 msgctxt "field:sale.configuration,sale_sequence:"
 msgid "Sale Reference Sequence"
-msgstr ""
+msgstr "Secuencia pedidos de venta"
 
 msgctxt "field:sale.configuration,sale_shipment_method:"
 msgid "Sale Shipment Method"
-msgstr ""
+msgstr "Método de envío"
 
 msgctxt "field:sale.configuration,write_date:"
 msgid "Write Date"
-msgstr ""
+msgstr "Fecha modificación"
 
 msgctxt "field:sale.configuration,write_uid:"
 msgid "Write User"
-msgstr ""
+msgstr "Usuario modificación"
 
 msgctxt "field:sale.handle.invoice.exception.ask,domain_invoices:"
 msgid "Domain Invoices"
-msgstr "Rango de facturas"
+msgstr "Dominio de facturas"
 
 msgctxt "field:sale.handle.invoice.exception.ask,id:"
 msgid "ID"
-msgstr ""
+msgstr "ID"
 
 msgctxt "field:sale.handle.invoice.exception.ask,recreate_invoices:"
 msgid "Recreate Invoices"
-msgstr "Rehacer factura"
+msgstr "Recrear facturas"
 
 msgctxt "field:sale.handle.shipment.exception.ask,domain_moves:"
 msgid "Domain Moves"
-msgstr "Rango de movimientos"
+msgstr "Dominio de movimientos"
 
 msgctxt "field:sale.handle.shipment.exception.ask,id:"
 msgid "ID"
-msgstr ""
+msgstr "ID"
 
 msgctxt "field:sale.handle.shipment.exception.ask,recreate_moves:"
 msgid "Recreate Moves"
-msgstr "Rehacer movimientos"
+msgstr "Recrear movimientos"
 
 msgctxt "field:sale.line,amount:"
 msgid "Amount"
@@ -146,41 +140,39 @@ msgstr "Cantidad"
 
 msgctxt "field:sale.line,create_date:"
 msgid "Create Date"
-msgstr ""
+msgstr "Fecha creación"
 
-#, fuzzy
 msgctxt "field:sale.line,create_uid:"
 msgid "Create User"
-msgstr "Crear usuario"
+msgstr "Usuario creación"
 
 msgctxt "field:sale.line,delivery_date:"
 msgid "Delivery Date"
-msgstr ""
+msgstr "Fecha de Entrega"
 
 msgctxt "field:sale.line,description:"
 msgid "Description"
 msgstr "Descripción"
 
-#, fuzzy
 msgctxt "field:sale.line,from_location:"
 msgid "From Location"
-msgstr "Lugar Inicial"
+msgstr "Desde locación"
 
 msgctxt "field:sale.line,id:"
 msgid "ID"
-msgstr ""
+msgstr "ID"
 
 msgctxt "field:sale.line,invoice_lines:"
 msgid "Invoice Lines"
-msgstr "Líneas de Factura"
+msgstr "Líneas de factura"
 
 msgctxt "field:sale.line,move_done:"
 msgid "Moves Done"
-msgstr "Movimientos Hechos"
+msgstr "Movimientos realizados"
 
 msgctxt "field:sale.line,move_exception:"
 msgid "Moves Exception"
-msgstr "Exepción de Movimientos"
+msgstr "Exepción de movimientos"
 
 msgctxt "field:sale.line,moves:"
 msgid "Moves"
@@ -188,11 +180,11 @@ msgstr "Movimientos"
 
 msgctxt "field:sale.line,moves_ignored:"
 msgid "Ignored Moves"
-msgstr "Movimientos Ignorados"
+msgstr "Movimientos ignorados"
 
 msgctxt "field:sale.line,moves_recreated:"
 msgid "Recreated Moves"
-msgstr "Rehacer Movimientos"
+msgstr "Movimientos recreados"
 
 msgctxt "field:sale.line,note:"
 msgid "Note"
@@ -204,7 +196,7 @@ msgstr "Producto"
 
 msgctxt "field:sale.line,product_uom_category:"
 msgid "Product Uom Category"
-msgstr ""
+msgstr "Categoría UdM de Producto"
 
 msgctxt "field:sale.line,quantity:"
 msgid "Quantity"
@@ -226,10 +218,9 @@ msgctxt "field:sale.line,taxes:"
 msgid "Taxes"
 msgstr "Impuestos"
 
-#, fuzzy
 msgctxt "field:sale.line,to_location:"
 msgid "To Location"
-msgstr "Al Lugar:"
+msgstr "A locación"
 
 msgctxt "field:sale.line,type:"
 msgid "Type"
@@ -241,41 +232,39 @@ msgstr "Unidad"
 
 msgctxt "field:sale.line,unit_digits:"
 msgid "Unit Digits"
-msgstr "Dígitos de Unidad"
+msgstr "Dígitos de la unidad"
 
 msgctxt "field:sale.line,unit_price:"
 msgid "Unit Price"
 msgstr "Precio Unitario"
 
-#, fuzzy
 msgctxt "field:sale.line,warehouse:"
 msgid "Warehouse"
-msgstr "Depósito"
+msgstr "Almacén"
 
 msgctxt "field:sale.line,write_date:"
 msgid "Write Date"
-msgstr ""
+msgstr "Fecha modificación"
 
 msgctxt "field:sale.line,write_uid:"
 msgid "Write User"
-msgstr ""
+msgstr "Usuario modificación"
 
 msgctxt "field:sale.line-account.invoice.line,create_date:"
 msgid "Create Date"
-msgstr ""
+msgstr "Fecha creación"
 
-#, fuzzy
 msgctxt "field:sale.line-account.invoice.line,create_uid:"
 msgid "Create User"
-msgstr "Crear usuario"
+msgstr "Usuario creación"
 
 msgctxt "field:sale.line-account.invoice.line,id:"
 msgid "ID"
-msgstr ""
+msgstr "ID"
 
 msgctxt "field:sale.line-account.invoice.line,invoice_line:"
 msgid "Invoice Line"
-msgstr "Línea de Factura"
+msgstr "Línea de factura"
 
 msgctxt "field:sale.line-account.invoice.line,rec_name:"
 msgid "Name"
@@ -283,28 +272,27 @@ msgstr "Nombre"
 
 msgctxt "field:sale.line-account.invoice.line,sale_line:"
 msgid "Sale Line"
-msgstr "Línea de Venta"
+msgstr "Línea de venta"
 
 msgctxt "field:sale.line-account.invoice.line,write_date:"
 msgid "Write Date"
-msgstr ""
+msgstr "Fecha modificación"
 
 msgctxt "field:sale.line-account.invoice.line,write_uid:"
 msgid "Write User"
-msgstr ""
+msgstr "Usuario modificación"
 
 msgctxt "field:sale.line-account.tax,create_date:"
 msgid "Create Date"
-msgstr ""
+msgstr "Fecha creación"
 
-#, fuzzy
 msgctxt "field:sale.line-account.tax,create_uid:"
 msgid "Create User"
-msgstr "Crear usuario"
+msgstr "Usuario creación"
 
 msgctxt "field:sale.line-account.tax,id:"
 msgid "ID"
-msgstr ""
+msgstr "ID"
 
 msgctxt "field:sale.line-account.tax,line:"
 msgid "Sale Line"
@@ -320,24 +308,23 @@ msgstr "Impuesto"
 
 msgctxt "field:sale.line-account.tax,write_date:"
 msgid "Write Date"
-msgstr ""
+msgstr "Fecha modificación"
 
 msgctxt "field:sale.line-account.tax,write_uid:"
 msgid "Write User"
-msgstr ""
+msgstr "Usuario modificación"
 
 msgctxt "field:sale.line-ignored-stock.move,create_date:"
 msgid "Create Date"
-msgstr ""
+msgstr "Fecha creación"
 
-#, fuzzy
 msgctxt "field:sale.line-ignored-stock.move,create_uid:"
 msgid "Create User"
-msgstr "Crear usuario"
+msgstr "Usuario creación"
 
 msgctxt "field:sale.line-ignored-stock.move,id:"
 msgid "ID"
-msgstr ""
+msgstr "ID"
 
 msgctxt "field:sale.line-ignored-stock.move,move:"
 msgid "Move"
@@ -349,28 +336,27 @@ msgstr "Nombre"
 
 msgctxt "field:sale.line-ignored-stock.move,sale_line:"
 msgid "Sale Line"
-msgstr "Línea de Venta"
+msgstr "Línea de venta"
 
 msgctxt "field:sale.line-ignored-stock.move,write_date:"
 msgid "Write Date"
-msgstr ""
+msgstr "Fecha modificación"
 
 msgctxt "field:sale.line-ignored-stock.move,write_uid:"
 msgid "Write User"
-msgstr ""
+msgstr "Usuario modificación"
 
 msgctxt "field:sale.line-recreated-stock.move,create_date:"
 msgid "Create Date"
-msgstr ""
+msgstr "Fecha creación"
 
-#, fuzzy
 msgctxt "field:sale.line-recreated-stock.move,create_uid:"
 msgid "Create User"
-msgstr "Crear usuario"
+msgstr "Usuario creación"
 
 msgctxt "field:sale.line-recreated-stock.move,id:"
 msgid "ID"
-msgstr ""
+msgstr "ID"
 
 msgctxt "field:sale.line-recreated-stock.move,move:"
 msgid "Move"
@@ -382,15 +368,15 @@ msgstr "Nombre"
 
 msgctxt "field:sale.line-recreated-stock.move,sale_line:"
 msgid "Sale Line"
-msgstr "Línea de Venta"
+msgstr "Línea de venta"
 
 msgctxt "field:sale.line-recreated-stock.move,write_date:"
 msgid "Write Date"
-msgstr ""
+msgstr "Fecha modificación"
 
 msgctxt "field:sale.line-recreated-stock.move,write_uid:"
 msgid "Write User"
-msgstr ""
+msgstr "Usuario modificación"
 
 msgctxt "field:sale.sale,comment:"
 msgid "Comment"
@@ -398,16 +384,15 @@ msgstr "Comentario"
 
 msgctxt "field:sale.sale,company:"
 msgid "Company"
-msgstr "Compañía"
+msgstr "Compañia"
 
 msgctxt "field:sale.sale,create_date:"
 msgid "Create Date"
-msgstr ""
+msgstr "Fecha creación"
 
-#, fuzzy
 msgctxt "field:sale.sale,create_uid:"
 msgid "Create User"
-msgstr "Crear usuario"
+msgstr "Usuario creación"
 
 msgctxt "field:sale.sale,currency:"
 msgid "Currency"
@@ -415,7 +400,7 @@ msgstr "Moneda"
 
 msgctxt "field:sale.sale,currency_digits:"
 msgid "Currency Digits"
-msgstr "Dígitos de Moneda"
+msgstr "Decimales de la Moneda"
 
 msgctxt "field:sale.sale,description:"
 msgid "Description"
@@ -423,7 +408,7 @@ msgstr "Descripción"
 
 msgctxt "field:sale.sale,id:"
 msgid "ID"
-msgstr ""
+msgstr "ID"
 
 msgctxt "field:sale.sale,invoice_address:"
 msgid "Invoice Address"
@@ -435,7 +420,7 @@ msgstr "Método de Facturación"
 
 msgctxt "field:sale.sale,invoice_state:"
 msgid "Invoice State"
-msgstr "Estado de Factura"
+msgstr "Estado factura"
 
 msgctxt "field:sale.sale,invoices:"
 msgid "Invoices"
@@ -443,11 +428,11 @@ msgstr "Facturas"
 
 msgctxt "field:sale.sale,invoices_ignored:"
 msgid "Ignored Invoices"
-msgstr "Facturas Ignoradas"
+msgstr "Facturas ignoradas"
 
 msgctxt "field:sale.sale,invoices_recreated:"
 msgid "Recreated Invoices"
-msgstr "Rehacer facturas"
+msgstr "Facturas recreadas"
 
 msgctxt "field:sale.sale,lines:"
 msgid "Lines"
@@ -467,7 +452,7 @@ msgstr "Idioma del Tercero"
 
 msgctxt "field:sale.sale,payment_term:"
 msgid "Payment Term"
-msgstr "Término de Pago"
+msgstr "Plazo de Pago"
 
 msgctxt "field:sale.sale,rec_name:"
 msgid "Name"
@@ -479,7 +464,7 @@ msgstr "Referencia"
 
 msgctxt "field:sale.sale,sale_date:"
 msgid "Sale Date"
-msgstr "Fecha de Venta"
+msgstr "Fecha de venta"
 
 msgctxt "field:sale.sale,shipment_address:"
 msgid "Shipment Address"
@@ -487,19 +472,19 @@ msgstr "Dirección de envío"
 
 msgctxt "field:sale.sale,shipment_method:"
 msgid "Shipment Method"
-msgstr "Método de Envío"
+msgstr "Método de envío"
 
 msgctxt "field:sale.sale,shipment_returns:"
 msgid "Shipment Returns"
-msgstr ""
+msgstr "Devolución"
 
 msgctxt "field:sale.sale,shipment_state:"
 msgid "Shipment State"
-msgstr "Estado de Envío"
+msgstr "Estado envío"
 
 msgctxt "field:sale.sale,shipments:"
 msgid "Shipments"
-msgstr "Envíos"
+msgstr "Envios"
 
 msgctxt "field:sale.sale,state:"
 msgid "State"
@@ -511,7 +496,7 @@ msgstr "Impuesto"
 
 msgctxt "field:sale.sale,tax_amount_cache:"
 msgid "Tax Cache"
-msgstr ""
+msgstr "Impuestos Precalculado"
 
 msgctxt "field:sale.sale,total_amount:"
 msgid "Total"
@@ -519,40 +504,39 @@ msgstr "Total"
 
 msgctxt "field:sale.sale,total_amount_cache:"
 msgid "Total Tax"
-msgstr ""
+msgstr "Total impuestos"
 
 msgctxt "field:sale.sale,untaxed_amount:"
 msgid "Untaxed"
-msgstr "Sin Impuesto"
+msgstr "Base sin Impuesto"
 
 msgctxt "field:sale.sale,untaxed_amount_cache:"
 msgid "Untaxed Cache"
-msgstr ""
+msgstr "Base sin Impuesto Precalculada"
 
 msgctxt "field:sale.sale,warehouse:"
 msgid "Warehouse"
-msgstr "Depósito"
+msgstr "Almacén"
 
 msgctxt "field:sale.sale,write_date:"
 msgid "Write Date"
-msgstr ""
+msgstr "Fecha modificación"
 
 msgctxt "field:sale.sale,write_uid:"
 msgid "Write User"
-msgstr ""
+msgstr "Usuario modificación"
 
 msgctxt "field:sale.sale-account.invoice,create_date:"
 msgid "Create Date"
-msgstr ""
+msgstr "Fecha creación"
 
-#, fuzzy
 msgctxt "field:sale.sale-account.invoice,create_uid:"
 msgid "Create User"
-msgstr "Crear usuario"
+msgstr "Usuario creación"
 
 msgctxt "field:sale.sale-account.invoice,id:"
 msgid "ID"
-msgstr ""
+msgstr "ID"
 
 msgctxt "field:sale.sale-account.invoice,invoice:"
 msgid "Invoice"
@@ -564,28 +548,27 @@ msgstr "Nombre"
 
 msgctxt "field:sale.sale-account.invoice,sale:"
 msgid "Sale"
-msgstr "Ventas"
+msgstr "Venta"
 
 msgctxt "field:sale.sale-account.invoice,write_date:"
 msgid "Write Date"
-msgstr ""
+msgstr "Fecha modificación"
 
 msgctxt "field:sale.sale-account.invoice,write_uid:"
 msgid "Write User"
-msgstr ""
+msgstr "Usuario modificación"
 
 msgctxt "field:sale.sale-ignored-account.invoice,create_date:"
 msgid "Create Date"
-msgstr ""
+msgstr "Fecha creación"
 
-#, fuzzy
 msgctxt "field:sale.sale-ignored-account.invoice,create_uid:"
 msgid "Create User"
-msgstr "Crear usuario"
+msgstr "Usuario creación"
 
 msgctxt "field:sale.sale-ignored-account.invoice,id:"
 msgid "ID"
-msgstr ""
+msgstr "ID"
 
 msgctxt "field:sale.sale-ignored-account.invoice,invoice:"
 msgid "Invoice"
@@ -597,28 +580,27 @@ msgstr "Nombre"
 
 msgctxt "field:sale.sale-ignored-account.invoice,sale:"
 msgid "Sale"
-msgstr "Ventas"
+msgstr "Venta"
 
 msgctxt "field:sale.sale-ignored-account.invoice,write_date:"
 msgid "Write Date"
-msgstr ""
+msgstr "Fecha modificación"
 
 msgctxt "field:sale.sale-ignored-account.invoice,write_uid:"
 msgid "Write User"
-msgstr ""
+msgstr "Usuario modificación"
 
 msgctxt "field:sale.sale-recreated-account.invoice,create_date:"
 msgid "Create Date"
-msgstr ""
+msgstr "Fecha creación"
 
-#, fuzzy
 msgctxt "field:sale.sale-recreated-account.invoice,create_uid:"
 msgid "Create User"
-msgstr "Crear usuario"
+msgstr "Usuario creación"
 
 msgctxt "field:sale.sale-recreated-account.invoice,id:"
 msgid "ID"
-msgstr ""
+msgstr "ID"
 
 msgctxt "field:sale.sale-recreated-account.invoice,invoice:"
 msgid "Invoice"
@@ -630,15 +612,15 @@ msgstr "Nombre"
 
 msgctxt "field:sale.sale-recreated-account.invoice,sale:"
 msgid "Sale"
-msgstr "Ventas"
+msgstr "Venta"
 
 msgctxt "field:sale.sale-recreated-account.invoice,write_date:"
 msgid "Write Date"
-msgstr ""
+msgstr "Fecha modificación"
 
 msgctxt "field:sale.sale-recreated-account.invoice,write_uid:"
 msgid "Write User"
-msgstr ""
+msgstr "Usuario modificación"
 
 msgctxt "field:stock.move,sale:"
 msgid "Sale"
@@ -646,22 +628,21 @@ msgstr "Venta"
 
 msgctxt "field:stock.move,sale_exception_state:"
 msgid "Exception State"
-msgstr "Estado Excepción"
+msgstr "Estado excepción"
 
-#, fuzzy
 msgctxt "field:stock.move,sale_line:"
 msgid "Sale Line"
 msgstr "Línea de Venta"
 
-#, fuzzy
 msgctxt "help:product.template,delivery_time:"
 msgid "In number of days"
-msgstr "En número de días"
+msgstr "En número de días."
 
 msgctxt "help:sale.handle.invoice.exception.ask,recreate_invoices:"
 msgid ""
 "The selected invoices will be recreated. The other ones will be ignored."
-msgstr "La factura seleccionada será recreada. Las otras serán ignoradas."
+msgstr ""
+"Las facturas seleccionadas serán recreadas. Las otras serán ignoradas."
 
 msgctxt "model:ir.action,name:act_invoice_form"
 msgid "Invoices"
@@ -669,15 +650,15 @@ msgstr "Facturas"
 
 msgctxt "model:ir.action,name:act_open_customer"
 msgid "Parties associated to Sales"
-msgstr "Terceros asociados a Ventas"
+msgstr "Terceros asociados a ventas"
 
 msgctxt "model:ir.action,name:act_return_form"
 msgid "Returns"
-msgstr ""
+msgstr "Devolución"
 
 msgctxt "model:ir.action,name:act_sale_configuration_form"
 msgid "Sales Configuration"
-msgstr ""
+msgstr "Configuración de Ventas"
 
 msgctxt "model:ir.action,name:act_sale_form"
 msgid "Sales"
@@ -697,15 +678,15 @@ msgstr "Ventas en Borrador"
 
 msgctxt "model:ir.action,name:act_sale_form_processing"
 msgid "Processing Sales"
-msgstr ""
+msgstr "Ventas en Proceso"
 
 msgctxt "model:ir.action,name:act_sale_form_quotation"
 msgid "Quotation Sales"
-msgstr "Ventas Cotizadas"
+msgstr "Ventas en Cotización"
 
 msgctxt "model:ir.action,name:act_shipment_form"
 msgid "Shipments"
-msgstr "Envíos"
+msgstr "Envios"
 
 msgctxt "model:ir.action,name:report_sale"
 msgid "Sale"
@@ -713,15 +694,15 @@ msgstr "Venta"
 
 msgctxt "model:ir.action,name:wizard_invoice_handle_exception"
 msgid "Handle Invoice Exception"
-msgstr "Tratar Excepción de factura"
+msgstr "Gestionar excepción de factura"
 
 msgctxt "model:ir.action,name:wizard_return_sale"
 msgid "Create Return Sale"
-msgstr ""
+msgstr "Crear Devolución de Venta"
 
 msgctxt "model:ir.action,name:wizard_shipment_handle_exception"
 msgid "Handle Shipment Exception"
-msgstr "Tratar Excepción de Envío"
+msgstr "Gestionar Excepción de Envío"
 
 msgctxt "model:ir.sequence,name:sequence_sale"
 msgid "Sale"
@@ -731,23 +712,21 @@ msgctxt "model:ir.sequence.type,name:sequence_type_sale"
 msgid "Sale"
 msgstr "Venta"
 
-#, fuzzy
 msgctxt "model:ir.ui.menu,name:menu_configuration"
 msgid "Configuration"
 msgstr "Configuración"
 
 msgctxt "model:ir.ui.menu,name:menu_customer"
 msgid "Parties associated to Sales"
-msgstr "Terceros asociados a Ventas"
+msgstr "Terceros asociados a ventas"
 
-#, fuzzy
 msgctxt "model:ir.ui.menu,name:menu_sale"
 msgid "Sales"
-msgstr "Gestión de Ventas"
+msgstr "Ventas"
 
 msgctxt "model:ir.ui.menu,name:menu_sale_configuration"
 msgid "Sales Configuration"
-msgstr ""
+msgstr "Configuración de Ventas"
 
 msgctxt "model:ir.ui.menu,name:menu_sale_form"
 msgid "Sales"
@@ -763,58 +742,55 @@ msgstr "Ventas en Borrador"
 
 msgctxt "model:ir.ui.menu,name:menu_sale_form_processing"
 msgid "Processing Sales"
-msgstr ""
+msgstr "Ventas en Proceso"
 
 msgctxt "model:ir.ui.menu,name:menu_sale_form_quotation"
 msgid "Quotation Sales"
 msgstr "Ventas Cotizadas"
 
-#, fuzzy
 msgctxt "model:res.group,name:group_sale"
 msgid "Sales"
-msgstr "Venta"
+msgstr "Ventas"
 
 msgctxt "model:res.group,name:group_sale_admin"
 msgid "Sales Administrator"
-msgstr ""
+msgstr "Administrador de Ventas"
 
 msgctxt "model:sale.configuration,name:"
 msgid "Sale Configuration"
-msgstr ""
+msgstr "Configuración Ventas"
 
-#, fuzzy
 msgctxt "model:sale.handle.invoice.exception.ask,name:"
 msgid "Handle Invoice Exception"
-msgstr "Pregunta de Excepción de Factura"
+msgstr "Gestionar excepción de factura"
 
-#, fuzzy
 msgctxt "model:sale.handle.shipment.exception.ask,name:"
 msgid "Handle Shipment Exception"
-msgstr "Pregunta de Excepción de Envío"
+msgstr "Gestionar excepción de envío"
 
 msgctxt "model:sale.line,name:"
 msgid "Sale Line"
-msgstr "Línea de Venta"
+msgstr "Línea de venta"
 
 msgctxt "model:sale.line-account.invoice.line,name:"
 msgid "Sale Line - Invoice Line"
-msgstr "Línea de Venta - Línea de Factura"
+msgstr "Línea de venta - Línea de factura"
 
 msgctxt "model:sale.line-account.tax,name:"
 msgid "Sale Line - Tax"
-msgstr "Línea de Venta - Impuesto"
+msgstr "Línea de venta - Impuesto"
 
 msgctxt "model:sale.line-ignored-stock.move,name:"
 msgid "Sale Line - Ignored Move"
-msgstr "Línea de Venta - Movimiento Ignorado"
+msgstr "Línea de venta - Movimiento ignorado"
 
 msgctxt "model:sale.line-recreated-stock.move,name:"
 msgid "Sale Line - Recreated Move"
-msgstr "Línea de Venta - Movimiento Recreado"
+msgstr "Línea de venta - Movimiento recreado"
 
 msgctxt "model:sale.sale,name:"
 msgid "Sale"
-msgstr "Ventas"
+msgstr "Venta"
 
 msgctxt "model:sale.sale-account.invoice,name:"
 msgid "Sale - Invoice"
@@ -822,11 +798,11 @@ msgstr "Venta - Factura"
 
 msgctxt "model:sale.sale-ignored-account.invoice,name:"
 msgid "Sale - Ignored Invoice"
-msgstr "Venta - Factura Ignorada"
+msgstr "Venta - Factura ignorada"
 
 msgctxt "model:sale.sale-recreated-account.invoice,name:"
 msgid "Sale - Recreated Invoice"
-msgstr "Venta - Factura Recreada"
+msgstr "Venta - Factura recreada"
 
 msgctxt "odt:sale.sale:"
 msgid "Amount"
@@ -846,7 +822,7 @@ msgstr "Descripción:"
 
 msgctxt "odt:sale.sale:"
 msgid "Draft Sale Order"
-msgstr "Orden de Venta en Borrador"
+msgstr "Pedido de Venta en Borrador"
 
 msgctxt "odt:sale.sale:"
 msgid "E-Mail:"
@@ -866,7 +842,7 @@ msgstr "Cotización Nº:"
 
 msgctxt "odt:sale.sale:"
 msgid "Sale Order N°:"
-msgstr "Orden de Venta Nº:"
+msgstr "Pedido de venta Nº:"
 
 msgctxt "odt:sale.sale:"
 msgid "Taxes"
@@ -878,7 +854,7 @@ msgstr "Impuestos:"
 
 msgctxt "odt:sale.sale:"
 msgid "Total (excl. taxes):"
-msgstr "Total (sin impuestos):"
+msgstr "Base sin impuesto:"
 
 msgctxt "odt:sale.sale:"
 msgid "Total:"
@@ -886,19 +862,20 @@ msgstr "Total:"
 
 msgctxt "odt:sale.sale:"
 msgid "Unit Price"
-msgstr "Precio Unitario"
+msgstr "Precio unidad"
 
 msgctxt "odt:sale.sale:"
 msgid "VAT Number:"
-msgstr ""
+msgstr "Número NIT:"
 
 msgctxt "odt:sale.sale:"
 msgid "VAT:"
 msgstr "NIT:"
 
+#, fuzzy
 msgctxt "selection:account.invoice,sale_exception_state:"
 msgid ""
-msgstr ""
+msgstr "Cuenta de impuesto"
 
 msgctxt "selection:account.invoice,sale_exception_state:"
 msgid "Ignored"
@@ -906,35 +883,31 @@ msgstr "Ignorado"
 
 msgctxt "selection:account.invoice,sale_exception_state:"
 msgid "Recreated"
-msgstr "Rehecho"
+msgstr "Recreada"
 
-#, fuzzy
 msgctxt "selection:sale.configuration,sale_invoice_method:"
 msgid "Manual"
 msgstr "Manual"
 
 msgctxt "selection:sale.configuration,sale_invoice_method:"
 msgid "On Order Processed"
-msgstr ""
+msgstr "Al procesar el pedido"
 
-#, fuzzy
 msgctxt "selection:sale.configuration,sale_invoice_method:"
 msgid "On Shipment Sent"
-msgstr "Enviado"
+msgstr "Al enviar"
 
-#, fuzzy
 msgctxt "selection:sale.configuration,sale_shipment_method:"
 msgid "Manual"
 msgstr "Manual"
 
-#, fuzzy
 msgctxt "selection:sale.configuration,sale_shipment_method:"
 msgid "On Invoice Paid"
-msgstr "Al Pagar"
+msgstr "Al pagar la factura"
 
 msgctxt "selection:sale.configuration,sale_shipment_method:"
 msgid "On Order Processed"
-msgstr ""
+msgstr "Al procesar el pedido"
 
 msgctxt "selection:sale.line,type:"
 msgid "Comment"
@@ -958,11 +931,11 @@ msgstr "Manual"
 
 msgctxt "selection:sale.sale,invoice_method:"
 msgid "On Order Processed"
-msgstr ""
+msgstr "Al procesar el pedido"
 
 msgctxt "selection:sale.sale,invoice_method:"
 msgid "On Shipment Sent"
-msgstr "Enviado"
+msgstr "Al enviar"
 
 msgctxt "selection:sale.sale,invoice_state:"
 msgid "Exception"
@@ -974,11 +947,11 @@ msgstr "Ninguno"
 
 msgctxt "selection:sale.sale,invoice_state:"
 msgid "Paid"
-msgstr "Pagado"
+msgstr "Pagada"
 
 msgctxt "selection:sale.sale,invoice_state:"
 msgid "Waiting"
-msgstr "En Espera"
+msgstr "En espera"
 
 msgctxt "selection:sale.sale,shipment_method:"
 msgid "Manual"
@@ -986,11 +959,11 @@ msgstr "Manual"
 
 msgctxt "selection:sale.sale,shipment_method:"
 msgid "On Invoice Paid"
-msgstr "Al Pagar"
+msgstr "Al pagar la factura"
 
 msgctxt "selection:sale.sale,shipment_method:"
 msgid "On Order Processed"
-msgstr ""
+msgstr "Al procesar el pedido"
 
 msgctxt "selection:sale.sale,shipment_state:"
 msgid "Exception"
@@ -1002,19 +975,19 @@ msgstr "Ninguno"
 
 msgctxt "selection:sale.sale,shipment_state:"
 msgid "Sent"
-msgstr "Enviado"
+msgstr "Enviada"
 
 msgctxt "selection:sale.sale,shipment_state:"
 msgid "Waiting"
-msgstr "En Espera"
+msgstr "En espera"
 
 msgctxt "selection:sale.sale,state:"
 msgid "Canceled"
-msgstr "Cancelado"
+msgstr "Cancelada"
 
 msgctxt "selection:sale.sale,state:"
 msgid "Confirmed"
-msgstr "Confirmado"
+msgstr "Confirmada"
 
 msgctxt "selection:sale.sale,state:"
 msgid "Done"
@@ -1024,10 +997,9 @@ msgctxt "selection:sale.sale,state:"
 msgid "Draft"
 msgstr "Borrador"
 
-#, fuzzy
 msgctxt "selection:sale.sale,state:"
 msgid "Processing"
-msgstr "Procesamiento"
+msgstr "En proceso"
 
 msgctxt "selection:sale.sale,state:"
 msgid "Quotation"
@@ -1035,21 +1007,20 @@ msgstr "Cotización"
 
 msgctxt "selection:stock.move,sale_exception_state:"
 msgid ""
-msgstr ""
+msgstr "Cuenta de impuesto"
 
 msgctxt "selection:stock.move,sale_exception_state:"
 msgid "Ignored"
-msgstr "Ignore"
+msgstr "Ignorado"
 
 msgctxt "selection:stock.move,sale_exception_state:"
 msgid "Recreated"
-msgstr "Rehacer"
+msgstr "Recreado"
 
 msgctxt "view:product.product:"
 msgid "Customers"
 msgstr "Clientes"
 
-#, fuzzy
 msgctxt "view:product.product:"
 msgid "Products"
 msgstr "Productos"
@@ -1060,23 +1031,23 @@ msgstr "Clientes"
 
 msgctxt "view:sale.configuration:"
 msgid "Sale Configuration"
-msgstr ""
+msgstr "Configuración Venta"
 
 msgctxt "view:sale.handle.invoice.exception.ask:"
 msgid "Choose invoices to recreate"
-msgstr "Escoja una factura a rehacer"
+msgstr "Seleccione facturas a recrear"
 
 msgctxt "view:sale.handle.invoice.exception.ask:"
 msgid "Handle Invoice Exception"
-msgstr "Tratar Excepción de factura"
+msgstr "Gestionar excepción de factura"
 
 msgctxt "view:sale.handle.shipment.exception.ask:"
 msgid "Choose move to recreate"
-msgstr "Escoja un movimiento a rehacer"
+msgstr "Seleccione movimientos a recrear"
 
 msgctxt "view:sale.handle.shipment.exception.ask:"
 msgid "Handle shipment Exception"
-msgstr "Maneje Excepciones de empaquetado"
+msgstr "Gestionar excepción de envío"
 
 msgctxt "view:sale.handle.shipment.exception.ask:"
 msgid "Recreate Moves"
@@ -1116,15 +1087,15 @@ msgstr "Borrador"
 
 msgctxt "view:sale.sale:"
 msgid "Handle Invoice Exception"
-msgstr "Excepción que maneja factura"
+msgstr "Gestionar excepción de factura"
 
 msgctxt "view:sale.sale:"
 msgid "Handle Shipment Exception"
-msgstr "Excepción que maneja envío"
+msgstr "Gestionar excepción de envío"
 
 msgctxt "view:sale.sale:"
 msgid "Ignore Invoice Exception"
-msgstr "Ignorar excepción en Factura"
+msgstr "Ignorar excepción de factura"
 
 msgctxt "view:sale.sale:"
 msgid "Invoices"
@@ -1140,11 +1111,11 @@ msgstr "Movimientos"
 
 msgctxt "view:sale.sale:"
 msgid "Other Info"
-msgstr "Información Adicional"
+msgstr "Info adicional"
 
 msgctxt "view:sale.sale:"
 msgid "Process"
-msgstr ""
+msgstr "Procesar"
 
 msgctxt "view:sale.sale:"
 msgid "Quotation"
@@ -1152,7 +1123,7 @@ msgstr "Cotización"
 
 msgctxt "view:sale.sale:"
 msgid "Quote"
-msgstr ""
+msgstr "Presupuesto"
 
 msgctxt "view:sale.sale:"
 msgid "Sale"
@@ -1164,29 +1135,24 @@ msgstr "Ventas"
 
 msgctxt "view:sale.sale:"
 msgid "Shipments"
-msgstr "Empaques"
+msgstr "Envios"
 
-#, fuzzy
 msgctxt "view:stock.move:"
 msgid "Moves"
 msgstr "Movimientos"
 
-#, fuzzy
 msgctxt "wizard_button:sale.handle.invoice.exception,ask,end:"
 msgid "Cancel"
 msgstr "Cancelar"
 
-#, fuzzy
 msgctxt "wizard_button:sale.handle.invoice.exception,ask,handle:"
 msgid "Ok"
 msgstr "Aceptar"
 
-#, fuzzy
 msgctxt "wizard_button:sale.handle.shipment.exception,ask,end:"
 msgid "Cancel"
 msgstr "Cancelar"
 
-#, fuzzy
 msgctxt "wizard_button:sale.handle.shipment.exception,ask,handle:"
 msgid "Ok"
 msgstr "Aceptar"
diff --git a/locale/es_ES.po b/locale/es_ES.po
index 49b2aa5..9a1a2ef 100644
--- a/locale/es_ES.po
+++ b/locale/es_ES.po
@@ -97,7 +97,7 @@ msgstr "Método de facturación"
 
 msgctxt "field:sale.configuration,sale_sequence:"
 msgid "Sale Reference Sequence"
-msgstr "Secuencia pedidos de venta"
+msgstr "Secuencia numeración venta"
 
 msgctxt "field:sale.configuration,sale_shipment_method:"
 msgid "Sale Shipment Method"
@@ -233,7 +233,7 @@ msgstr "Unidad"
 
 msgctxt "field:sale.line,unit_digits:"
 msgid "Unit Digits"
-msgstr "Dígitos de la unidad"
+msgstr "Decimales de la unidad"
 
 msgctxt "field:sale.line,unit_price:"
 msgid "Unit Price"
@@ -397,11 +397,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 "Decimales de la divisa"
+msgstr "Decimales de la moneda"
 
 msgctxt "field:sale.sale,description:"
 msgid "Description"
@@ -735,19 +735,19 @@ msgstr "Ventas"
 
 msgctxt "model:ir.ui.menu,name:menu_sale_form_confirmed"
 msgid "Confirmed Sales"
-msgstr "Ventas confirmadas"
+msgstr "Confirmadas"
 
 msgctxt "model:ir.ui.menu,name:menu_sale_form_draft"
 msgid "Draft Sales"
-msgstr "Ventas borrador"
+msgstr "Borrador"
 
 msgctxt "model:ir.ui.menu,name:menu_sale_form_processing"
 msgid "Processing Sales"
-msgstr "Ventas en proceso"
+msgstr "Proceso"
 
 msgctxt "model:ir.ui.menu,name:menu_sale_form_quotation"
 msgid "Quotation Sales"
-msgstr "Ventas presupuestadas"
+msgstr "Presupuesto"
 
 msgctxt "model:res.group,name:group_sale"
 msgid "Sales"
@@ -761,12 +761,10 @@ msgctxt "model:sale.configuration,name:"
 msgid "Sale Configuration"
 msgstr "Configuración ventas"
 
-#, fuzzy
 msgctxt "model:sale.handle.invoice.exception.ask,name:"
 msgid "Handle Invoice Exception"
 msgstr "Gestionar excepción de factura"
 
-#, fuzzy
 msgctxt "model:sale.handle.shipment.exception.ask,name:"
 msgid "Handle Shipment Exception"
 msgstr "Gestionar excepción de envío"
@@ -825,7 +823,7 @@ msgstr "Descripción:"
 
 msgctxt "odt:sale.sale:"
 msgid "Draft Sale Order"
-msgstr "Pedido de venta borrador"
+msgstr "Ventas borrador"
 
 msgctxt "odt:sale.sale:"
 msgid "E-Mail:"
@@ -845,7 +843,7 @@ msgstr "Presupuesto Nº:"
 
 msgctxt "odt:sale.sale:"
 msgid "Sale Order N°:"
-msgstr "Pedido de venta Nº:"
+msgstr "Venta Nº:"
 
 msgctxt "odt:sale.sale:"
 msgid "Taxes"
@@ -873,7 +871,7 @@ msgstr "Número CIF/NIF:"
 
 msgctxt "odt:sale.sale:"
 msgid "VAT:"
-msgstr "NIF:"
+msgstr "CIF/NIF:"
 
 msgctxt "selection:account.invoice,sale_exception_state:"
 msgid ""
@@ -993,7 +991,7 @@ msgstr "Confirmada"
 
 msgctxt "selection:sale.sale,state:"
 msgid "Done"
-msgstr "Realizada"
+msgstr "Realizado"
 
 msgctxt "selection:sale.sale,state:"
 msgid "Draft"
diff --git a/locale/fr_FR.po b/locale/fr_FR.po
index d99cfdb..5c7c164 100644
--- a/locale/fr_FR.po
+++ b/locale/fr_FR.po
@@ -514,7 +514,7 @@ msgstr "Méthode de livraison"
 
 msgctxt "field:sale.sale,shipment_returns:"
 msgid "Shipment Returns"
-msgstr "Retour d'expédition"
+msgstr "Retours d'expédition"
 
 msgctxt "field:sale.sale,shipment_state:"
 msgid "Shipment State"
@@ -530,7 +530,7 @@ msgstr "État"
 
 msgctxt "field:sale.sale,tax_amount:"
 msgid "Tax"
-msgstr "Taxe"
+msgstr "Taxes"
 
 msgctxt "field:sale.sale,tax_amount_cache:"
 msgid "Tax Cache"
diff --git a/sale.py b/sale.py
index 2f59e78..63bf9de 100644
--- a/sale.py
+++ b/sale.py
@@ -1,6 +1,5 @@
 #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 copy
 from decimal import Decimal
 import datetime
 from itertools import groupby
@@ -10,18 +9,25 @@ from trytond.modules.company import CompanyReport
 from trytond.wizard import Wizard, StateAction, StateView, StateTransition, \
     Button
 from trytond.backend import TableHandler
-from trytond.pyson import If, Eval, Bool, PYSONEncoder
+from trytond.pyson import If, Eval, Bool, PYSONEncoder, Id
 from trytond.transaction import Transaction
-from trytond.pool import Pool
+from trytond.pool import Pool, PoolMeta
 from trytond.config import CONFIG
 
+__all__ = ['Sale', 'SaleInvoice', 'SaleIgnoredInvoice', 'SaleRecreatedInvoice',
+    'SaleLine', 'SaleLineTax', 'SaleLineInvoiceLine', 'SaleLineIgnoredMove',
+    'SaleLineRecreatedMove', 'SaleReport', 'Template', 'Product',
+    'ShipmentOut', 'ShipmentOutReturn', 'Move', 'OpenCustomer',
+    'HandleShipmentExceptionAsk', 'HandleShipmentException',
+    'HandleInvoiceExceptionAsk', 'HandleInvoiceException',
+    'ReturnSale']
+__metaclass__ = PoolMeta
+
 
 class Sale(Workflow, ModelSQL, ModelView):
     'Sale'
-    _name = 'sale.sale'
+    __name__ = 'sale.sale'
     _rec_name = 'reference'
-    _description = __doc__
-
     company = fields.Many2One('company.company', 'Company', required=True,
         states={
             'readonly': (Eval('state') != 'draft') | Eval('lines', [0]),
@@ -62,7 +68,7 @@ class Sale(Workflow, ModelSQL, ModelView):
             }, on_change=['party', 'payment_term'],
         depends=['state'])
     party_lang = fields.Function(fields.Char('Party Language',
-        on_change_with=['party']), 'get_function_fields')
+            on_change_with=['party']), 'on_change_with_party_lang')
     invoice_address = fields.Many2One('party.address', 'Invoice Address',
         domain=[('party', '=', Eval('party'))], states={
             'readonly': Eval('state') != 'draft',
@@ -84,7 +90,7 @@ class Sale(Workflow, ModelSQL, ModelView):
             },
         depends=['state'])
     currency_digits = fields.Function(fields.Integer('Currency Digits',
-        on_change_with=['currency']), 'get_function_fields')
+            on_change_with=['currency']), 'on_change_with_currency_digits')
     lines = fields.One2Many('sale.line', 'sale', 'Lines', states={
             'readonly': Eval('state') != 'draft',
             }, on_change=['lines', 'currency', 'party'],
@@ -154,26 +160,28 @@ class Sale(Workflow, ModelSQL, ModelView):
         fields.One2Many('stock.shipment.out.return', None, 'Shipment Returns'),
         'get_shipment_returns')
     moves = fields.Function(fields.One2Many('stock.move', None, 'Moves'),
-            'get_function_fields')
-
-    def __init__(self):
-        super(Sale, self).__init__()
-        self._order.insert(0, ('sale_date', 'DESC'))
-        self._order.insert(1, ('id', 'DESC'))
-        self._constraints += [
+        'get_moves')
+
+    @classmethod
+    def __setup__(cls):
+        super(Sale, cls).__setup__()
+        cls._order.insert(0, ('sale_date', 'DESC'))
+        cls._order.insert(1, ('id', 'DESC'))
+        cls._constraints += [
             ('check_method', 'wrong_method')
-        ]
-        self._error_messages.update({
-            'wrong_method': 'Wrong combination of method!',
-            'addresses_required': 'Invoice and Shipment addresses must be '
-            'defined for the quotation.',
-            'warehouse_required': 'Warehouse must be defined for the ' \
-                'quotation.',
-            'missing_account_receivable': 'It misses '
-                    'an "Account Receivable" on the party "%s"!',
-            'delete_cancel': 'Sale "%s" must be cancelled before deletion!',
-        })
-        self._transitions |= set((
+            ]
+        cls._error_messages.update({
+                'wrong_method': 'Wrong combination of method!',
+                'addresses_required': 'Invoice and Shipment addresses must be '
+                'defined for the quotation.',
+                'warehouse_required': 'Warehouse must be defined for the ' \
+                    'quotation.',
+                'missing_account_receivable': 'It misses '
+                'an "Account Receivable" on the party "%s"!',
+                'delete_cancel': 'Sale "%s" must be cancelled ' \
+                    'before deletion!',
+                })
+        cls._transitions |= set((
                 ('draft', 'quotation'),
                 ('quotation', 'confirmed'),
                 ('confirmed', 'processing'),
@@ -181,13 +189,16 @@ class Sale(Workflow, ModelSQL, ModelView):
                 ('draft', 'cancel'),
                 ('quotation', 'cancel'),
                 ('quotation', 'draft'),
+                ('cancel', 'draft'),
                 ))
-        self._buttons.update({
+        cls._buttons.update({
                 'cancel': {
                     'invisible': ~Eval('state').in_(['draft', 'quotation']),
                     },
                 'draft': {
-                    'invisible': Eval('state') != 'quotation',
+                    'invisible': ~Eval('state').in_(['cancel', 'quotation']),
+                    'icon': If(Eval('state') == 'cancel', 'tryton-clear',
+                        'tryton-go-previous'),
                     },
                 'quote': {
                     'invisible': Eval('state') != 'draft',
@@ -199,15 +210,28 @@ class Sale(Workflow, ModelSQL, ModelView):
                 'process': {
                     'invisible': Eval('state') != 'confirmed',
                     },
+                'handle_invoice_exception': {
+                    'invisible': ((Eval('invoice_state') != 'exception')
+                        | (Eval('state') == 'cancel')),
+                    'readonly': ~Eval('groups', []).contains(
+                        Id('sale', 'group_sale')),
+                    },
+                'handle_shipment_exception': {
+                    'invisible': ((Eval('shipment_state') != 'exception')
+                        | (Eval('state') == 'cancel')),
+                    'readonly': ~Eval('groups', []).contains(
+                        Id('sale', 'group_sale')),
+                    },
                 })
         # The states where amounts are cached
-        self._states_cached = ['confirmed', 'processing', 'done', 'cancel']
+        cls._states_cached = ['confirmed', 'processing', 'done', 'cancel']
 
-    def init(self, module_name):
+    @classmethod
+    def __register__(cls, module_name):
         pool = Pool()
-        sale_line_obj = pool.get('sale.line')
-        sale_line_invoice_line_obj = pool.get('sale.line-account.invoice.line')
-        move_obj = pool.get('stock.move')
+        SaleLine = pool.get('sale.line')
+        SaleLine_InvoiceLine = pool.get('sale.line-account.invoice.line')
+        Move = pool.get('stock.move')
         cursor = Transaction().cursor
         # Migration from 1.2: packing renamed into shipment
         cursor.execute("UPDATE ir_model_data "
@@ -220,27 +244,27 @@ class Sale(Workflow, ModelSQL, ModelView):
                 "WHERE (relation like '%%packing%%' "
                     "OR name like '%%packing%%') AND module = %s",
                 (module_name,))
-        table = TableHandler(cursor, self, module_name)
+        table = TableHandler(cursor, cls, module_name)
         table.column_rename('packing_state', 'shipment_state')
         table.column_rename('packing_method', 'shipment_method')
         table.column_rename('packing_address', 'shipment_address')
 
-        super(Sale, self).init(module_name)
+        super(Sale, cls).__register__(module_name)
 
         # Migration from 1.2
-        cursor.execute("UPDATE " + self._table + " "
+        cursor.execute("UPDATE " + cls._table + " "
                 "SET invoice_method = 'shipment' "
                 "WHERE invoice_method = 'packing'")
 
-        table = TableHandler(cursor, self, module_name)
+        table = TableHandler(cursor, cls, module_name)
         # Migration from 2.2
         table.not_null_action('sale_date', 'remove')
 
         # state confirmed splitted into confirmed and processing
-        if (TableHandler.table_exist(cursor, sale_line_obj._table)
+        if (TableHandler.table_exist(cursor, SaleLine._table)
                 and TableHandler.table_exist(cursor,
-                    sale_line_invoice_line_obj._table)
-                and TableHandler.table_exist(cursor, move_obj._table)):
+                    SaleLine_InvoiceLine._table)
+                and TableHandler.table_exist(cursor, 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.
@@ -257,290 +281,201 @@ class Sale(Workflow, ModelSQL, ModelView):
                         "WHERE s.state = 'confirmed' "
                             'AND (li.id IS NOT NULL '
                                 'OR m.id IS NOT NULL)) AS foo)'
-                % (self._table, self._table, sale_line_obj._table,
-                    sale_line_invoice_line_obj._table, move_obj._table))
+                % (cls._table, cls._table, SaleLine._table,
+                    SaleLine_InvoiceLine._table, Move._table))
 
         # Add index on create_date
-        table = TableHandler(cursor, self, module_name)
+        table = TableHandler(cursor, cls, module_name)
         table.index_action('create_date', action='add')
 
-    def default_payment_term(self):
-        payment_term_obj = Pool().get('account.invoice.payment_term')
-        payment_term_ids = payment_term_obj.search(self.payment_term.domain)
-        if len(payment_term_ids) == 1:
-            return payment_term_ids[0]
-
-    def default_warehouse(self):
-        location_obj = Pool().get('stock.location')
-        location_ids = location_obj.search(self.warehouse.domain)
-        if len(location_ids) == 1:
-            return location_ids[0]
-
-    def default_company(self):
+    @classmethod
+    def default_payment_term(cls):
+        PaymentTerm = Pool().get('account.invoice.payment_term')
+        payment_terms = PaymentTerm.search(cls.payment_term.domain)
+        if len(payment_terms) == 1:
+            return payment_terms[0].id
+
+    @classmethod
+    def default_warehouse(cls):
+        Location = Pool().get('stock.location')
+        locations = Location.search(cls.warehouse.domain)
+        if len(locations) == 1:
+            return locations[0].id
+
+    @staticmethod
+    def default_company():
         return Transaction().context.get('company')
 
-    def default_state(self):
+    @staticmethod
+    def default_state():
         return 'draft'
 
-    def default_currency(self):
-        company_obj = Pool().get('company.company')
+    @staticmethod
+    def default_currency():
+        Company = Pool().get('company.company')
         company = Transaction().context.get('company')
         if company:
-            return company_obj.browse(company).currency.id
+            return Company(company).currency.id
 
-    def default_currency_digits(self):
-        company_obj = Pool().get('company.company')
+    @staticmethod
+    def default_currency_digits():
+        Company = Pool().get('company.company')
         company = Transaction().context.get('company')
         if company:
-            return company_obj.browse(company).currency.digits
+            return Company(company).currency.digits
         return 2
 
-    def default_invoice_method(self):
-        config_obj = Pool().get('sale.configuration')
-        config = config_obj.browse(1)
+    @staticmethod
+    def default_invoice_method():
+        Config = Pool().get('sale.configuration')
+        config = Config(1)
         return config.sale_invoice_method
 
-    def default_invoice_state(self):
+    @staticmethod
+    def default_invoice_state():
         return 'none'
 
-    def default_shipment_method(self):
-        config_obj = Pool().get('sale.configuration')
-        config = config_obj.browse(1)
+    @staticmethod
+    def default_shipment_method():
+        Config = Pool().get('sale.configuration')
+        config = Config(1)
         return config.sale_shipment_method
 
-    def default_shipment_state(self):
+    @staticmethod
+    def default_shipment_state():
         return 'none'
 
-    def on_change_party(self, vals):
-        pool = Pool()
-        party_obj = pool.get('party.party')
-        address_obj = pool.get('party.address')
-        payment_term_obj = pool.get('account.invoice.payment_term')
-        res = {
-            'invoice_address': None,
-            'shipment_address': None,
-            'payment_term': None,
-        }
-        if vals.get('party'):
-            party = party_obj.browse(vals['party'])
-            res['invoice_address'] = party_obj.address_get(party.id,
-                    type='invoice')
-            res['shipment_address'] = party_obj.address_get(party.id,
-                    type='delivery')
-            if party.customer_payment_term:
-                res['payment_term'] = party.customer_payment_term.id
-
-        if res['invoice_address']:
-            res['invoice_address.rec_name'] = address_obj.browse(
-                    res['invoice_address']).rec_name
-        if res['shipment_address']:
-            res['shipment_address.rec_name'] = address_obj.browse(
-                    res['shipment_address']).rec_name
-        if not res['payment_term']:
-            res['payment_term'] = self.default_payment_term()
-        if res['payment_term']:
-            res['payment_term.rec_name'] = payment_term_obj.browse(
-                    res['payment_term']).rec_name
-        return res
+    def on_change_party(self):
+        invoice_address = None
+        shipment_address = None
+        payment_term = None
+        if self.party:
+            invoice_address = self.party.address_get(type='invoice')
+            shipment_address = self.party.address_get(type='delivery')
+            if self.party.customer_payment_term:
+                payment_term = self.party.customer_payment_term
+
+        changes = {}
+        if invoice_address:
+            changes['invoice_address'] = invoice_address.id
+            changes['invoice_address.rec_name'] = invoice_address.rec_name
+        else:
+            changes['invoice_address'] = None
+        if shipment_address:
+            changes['shipment_address'] = shipment_address.id
+            changes['shipment_address.rec_name'] = shipment_address.rec_name
+        else:
+            changes['shipment_address'] = None
+        if payment_term:
+            changes['payment_term'] = payment_term.id
+            changes['payment_term.rec_name'] = payment_term.rec_name
+        else:
+            changes['payment_term'] = self.default_payment_term()
+        return changes
 
-    def on_change_with_currency_digits(self, vals):
-        currency_obj = Pool().get('currency.currency')
-        if vals.get('currency'):
-            currency = currency_obj.browse(vals['currency'])
-            return currency.digits
+    def on_change_with_currency_digits(self, name=None):
+        if self.currency:
+            return self.currency.digits
         return 2
 
-    def get_currency_digits(self, sales):
-        '''
-        Return the number of digits of the currency of each sales
-
-        :param sales: a BrowseRecordList of puchases
-        :return: a dictionary with sale id as key and
-            number of digits as value
-        '''
-        res = {}
-        for sale in sales:
-            res[sale.id] = sale.currency.digits
-        return res
-
-    def get_tax_context(self, sale):
-        party_obj = Pool().get('party.party')
+    def get_tax_context(self):
         res = {}
-        if isinstance(sale, dict):
-            if sale.get('party'):
-                party = party_obj.browse(sale['party'])
-                if party.lang:
-                    res['language'] = party.lang.code
-        else:
-            if sale.party.lang:
-                res['language'] = sale.party.lang.code
+        if self.party and self.party.lang:
+            res['language'] = self.party.lang.code
         return res
 
-    def on_change_with_party_lang(self, vals):
-        party_obj = Pool().get('party.party')
-        if vals.get('party'):
-            party = party_obj.browse(vals['party'])
-            if party.lang:
-                return party.lang.code
+    def on_change_with_party_lang(self, name=None):
+        if self.party and self.party.lang:
+            return self.party.lang.code
         return CONFIG['language']
 
-    def get_party_lang(self, sales):
-        '''
-        Return the code lang of the party for each sales
-
-        :param sales: a BrowseRecordList of sales
-        :return: a dictionary with sale id as key and
-            code lang as value
-        '''
-        res = {}
-        for sale in sales:
-            if sale.party.lang:
-                res[sale.id] = sale.party.lang.code
-            else:
-                res[sale.id] = CONFIG['language']
-        return res
-
-    def on_change_lines(self, vals):
+    def on_change_lines(self):
         pool = Pool()
-        currency_obj = pool.get('currency.currency')
-        tax_obj = pool.get('account.tax')
-        invoice_obj = pool.get('account.invoice')
+        Tax = pool.get('account.tax')
+        Invoice = pool.get('account.invoice')
 
         res = {
             'untaxed_amount': Decimal('0.0'),
             'tax_amount': Decimal('0.0'),
             'total_amount': Decimal('0.0'),
-        }
-
-        currency = None
-        if vals.get('currency'):
-            currency = currency_obj.browse(vals['currency'])
+            }
 
-        if vals.get('lines'):
+        if self.lines:
             taxes = {}
-            for line in vals['lines']:
-                if line.get('type', 'line') != 'line':
+            for line in self.lines:
+                if getattr(line, 'type', 'line') != 'line':
                     continue
-                res['untaxed_amount'] += line.get('amount') or Decimal(0)
+                res['untaxed_amount'] += line.amount or Decimal(0)
                 tax_list = ()
-                with Transaction().set_context(self.get_tax_context(vals)):
-                    tax_list = tax_obj.compute(line.get('taxes', []),
-                            line.get('unit_price') or Decimal('0.0'),
-                            line.get('quantity') or 0.0)
+                with Transaction().set_context(self.get_tax_context()):
+                    tax_list = Tax.compute(getattr(line, 'taxes', []),
+                        line.unit_price or Decimal('0.0'),
+                        line.quantity or 0.0)
                 for tax in tax_list:
-                    key, val = invoice_obj._compute_tax(tax, 'out_invoice')
+                    key, val = Invoice._compute_tax(tax, 'out_invoice')
                     if not key in taxes:
                         taxes[key] = val['amount']
                     else:
                         taxes[key] += val['amount']
-            if currency:
+            if self.currency:
                 for key in taxes:
-                    res['tax_amount'] += currency_obj.round(currency,
-                            taxes[key])
-        if currency:
-            res['untaxed_amount'] = currency_obj.round(currency,
-                    res['untaxed_amount'])
-            res['tax_amount'] = currency_obj.round(currency,
-                    res['tax_amount'])
+                    res['tax_amount'] += self.currency.round(taxes[key])
+        if self.currency:
+            res['untaxed_amount'] = self.currency.round(res['untaxed_amount'])
+            res['tax_amount'] = self.currency.round(res['tax_amount'])
         res['total_amount'] = res['untaxed_amount'] + res['tax_amount']
-        if currency:
-            res['total_amount'] = currency_obj.round(currency,
-                    res['total_amount'])
+        if self.currency:
+            res['total_amount'] = self.currency.round(res['total_amount'])
         return res
 
-    def get_function_fields(self, ids, names):
-        '''
-        Function to compute function fields for sale ids
+    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)
 
-        :param ids: the ids of the sales
-        :param names: the list of field name to compute
-        :return: a dictionary with all field names as key and
-            a dictionary as value with id as key
-        '''
-        res = {}
-        sales = self.browse(ids)
-        if 'currency_digits' in names:
-            res['currency_digits'] = self.get_currency_digits(sales)
-        if 'party_lang' in names:
-            res['party_lang'] = self.get_party_lang(sales)
-        if 'moves' in names:
-            res['moves'] = self.get_moves(sales)
-        return res
-
-    def get_untaxed_amount(self, ids, name):
-        '''
-        Compute the untaxed amount for each sales
-        '''
-        currency_obj = Pool().get('currency.currency')
-        amounts = {}
-        for sale in self.browse(ids):
-            if (sale.state in self._states_cached
-                    and sale.untaxed_amount_cache is not None):
-                amounts[sale.id] = sale.untaxed_amount_cache
-                continue
-            amount = sum((l.amount for l in sale.lines if l.type == 'line'),
-                Decimal(0))
-            amounts[sale.id] = currency_obj.round(sale.currency, amount)
-        return amounts
-
-    def get_tax_amount(self, ids, name):
-        '''
-        Compute tax amount for each sales
-        '''
+    def get_tax_amount(self, name):
         pool = Pool()
-        currency_obj = pool.get('currency.currency')
-        tax_obj = pool.get('account.tax')
-        invoice_obj = pool.get('account.invoice')
-
-        amounts = {}
-        for sale in self.browse(ids):
-            if (sale.state in self._states_cached
-                    and sale.tax_amount_cache is not None):
-                amounts[sale.id] = sale.tax_amount_cache
+        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:
+            if line.type != 'line':
                 continue
-            context = self.get_tax_context(sale)
-            taxes = {}
-            for line in sale.lines:
-                if line.type != 'line':
-                    continue
-                with Transaction().set_context(context):
-                    tax_list = tax_obj.compute(
-                            [t.id for t in line.taxes], line.unit_price,
-                            line.quantity)
-                # Don't round on each line to handle rounding error
-                for tax in tax_list:
-                    key, val = invoice_obj._compute_tax(tax, 'out_invoice')
-                    if not key in taxes:
-                        taxes[key] = val['amount']
-                    else:
-                        taxes[key] += val['amount']
-            amount = sum((currency_obj.round(sale.currency, taxes[key])
-                    for key in taxes), Decimal(0))
-            amounts[sale.id] = currency_obj.round(sale.currency, amount)
-        return amounts
-
-    def get_total_amount(self, ids, name):
-        '''
-        Return the total amount of each sales
-        '''
-        currency_obj = Pool().get('currency.currency')
-        amounts = {}
-        for sale in self.browse(ids):
-            if (sale.state in self._states_cached
-                    and sale.total_amount_cache is not None):
-                amounts[sale.id] = sale.total_amount_cache
-                continue
-            amounts[sale.id] = currency_obj.round(sale.currency,
-                sale.untaxed_amount + sale.tax_amount)
-        return amounts
-
-    def get_invoice_state(self, sale):
+            with Transaction().set_context(context):
+                tax_list = Tax.compute(line.taxes, line.unit_price,
+                    line.quantity)
+            # Don't round on each line to handle rounding error
+            for tax in tax_list:
+                key, val = Invoice._compute_tax(tax, 'out_invoice')
+                if not key in taxes:
+                    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)
+
+    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)
+
+    def get_invoice_state(self):
         '''
         Return the invoice state for the sale.
         '''
-        skip_ids = set(x.id for x in sale.invoices_ignored)
-        skip_ids.update(x.id for x in sale.invoices_recreated)
-        invoices = [i for i in sale.invoices if i.id not in skip_ids]
+        skip_ids = set(x.id for x in self.invoices_ignored)
+        skip_ids.update(x.id for x in self.invoices_recreated)
+        invoices = [i for i in self.invoices if i.id not in skip_ids]
         if invoices:
             if any(i.state == 'cancel' for i in invoices):
                 return 'exception'
@@ -550,102 +485,84 @@ class Sale(Workflow, ModelSQL, ModelView):
                 return 'waiting'
         return 'none'
 
-    def set_invoice_state(self, sale):
+    def set_invoice_state(self):
         '''
         Set the invoice state.
         '''
-        state = self.get_invoice_state(sale)
-        if sale.invoice_state != state:
-            self.write(sale.id, {
+        state = self.get_invoice_state()
+        if self.invoice_state != state:
+            self.write([self], {
                     'invoice_state': state,
                     })
 
     def get_shipments_returns(attribute):
         "Computes the returns or shipments"
-        def method(self, ids, name):
-            shipments = {}
-            for sale in self.browse(ids):
-                shipments[sale.id] = []
-                for line in sale.lines:
-                    for move in line.moves:
-                        ship_or_return = getattr(move, attribute)
-                        if bool(ship_or_return):
-                            if ship_or_return.id not in shipments[sale.id]:
-                                shipments[sale.id].append(ship_or_return.id)
+        def method(self, name):
+            shipments = []
+            for line in self.lines:
+                for move in line.moves:
+                    ship_or_return = getattr(move, attribute)
+                    if bool(ship_or_return):
+                        if ship_or_return.id not in shipments:
+                            shipments.append(ship_or_return.id)
             return shipments
         return method
 
     get_shipments = get_shipments_returns('shipment_out')
     get_shipment_returns = get_shipments_returns('shipment_out_return')
 
-    def get_moves(self, sales):
-        '''
-        Return move ids for each sales
+    def get_moves(self, name):
+        return [m.id for l in self.lines for m in l.moves]
 
-        :param sales: a BrowseRecordList of sales
-        :return: a dictionary with sale id as key and
-            a list of move ids as value
-        '''
-        res = {}
-        for sale in sales:
-            res[sale.id] = []
-            for line in sale.lines:
-                res[sale.id].extend([x.id for x in line.moves])
-        return res
-
-    def get_shipment_state(self, sale):
+    def get_shipment_state(self):
         '''
         Return the shipment state for the sale.
         '''
-        if sale.moves:
-            if any(l.move_exception for l in sale.lines):
+        if self.moves:
+            if any(l.move_exception for l in self.lines):
                 return 'exception'
-            elif all(l.move_done for l in sale.lines):
+            elif all(l.move_done for l in self.lines):
                 return 'sent'
             else:
                 return 'waiting'
         return 'none'
 
-    def set_shipment_state(self, sale):
+    def set_shipment_state(self):
         '''
         Set the shipment state.
         '''
-        state = self.get_shipment_state(sale)
-        if sale.shipment_state != state:
-            self.write(sale.id, {
+        state = self.get_shipment_state()
+        if self.shipment_state != state:
+            self.write([self], {
                     'shipment_state': state,
                     })
 
-    def check_method(self, ids):
+    def check_method(self):
         '''
         Check the methods.
         '''
-        for sale in self.browse(ids):
-            if sale.invoice_method == 'shipment' \
-                    and sale.shipment_method in ('invoice', 'manual'):
-                return False
-            if sale.shipment_method == 'invoice' \
-                    and sale.invoice_method in ('shipment', 'manual'):
-                return False
+        if (self.invoice_method == 'shipment'
+                and self.shipment_method in ('invoice', 'manual')):
+            return False
+        if (self.shipment_method == 'invoice'
+                and self.invoice_method in ('shipment', 'manual')):
+            return False
         return True
 
-    def get_rec_name(self, ids, name):
-        if not ids:
-            return []
-        res = {}
-        for sale in self.browse(ids):
-            res[sale.id] = sale.reference or str(sale.id) \
-                    + ' - ' + sale.party.rec_name
-        return res
+    def get_rec_name(self, name):
+        return (self.reference or str(self.id)
+            + ' - ' + self.party.rec_name)
 
-    def search_rec_name(self, name, clause):
+    @classmethod
+    def search_rec_name(cls, name, clause):
         names = clause[2].split(' - ', 1)
         res = [('reference', clause[1], names[0])]
         if len(names) != 1 and names[1]:
             res.append(('party', clause[1], names[1]))
         return res
 
-    def copy(self, ids, default=None):
+    @classmethod
+    def copy(cls, sales, default=None):
         if default is None:
             default = {}
         default = default.copy()
@@ -656,146 +573,143 @@ class Sale(Workflow, ModelSQL, ModelView):
         default['invoices_ignored'] = None
         default['shipment_state'] = 'none'
         default.setdefault('sale_date', None)
-        return super(Sale, self).copy(ids, default=default)
+        return super(Sale, cls).copy(sales, default=default)
 
-    def check_for_quotation(self, ids):
-        sales = self.browse(ids)
-        for sale in sales:
-            if not sale.invoice_address or not sale.shipment_address:
-                self.raise_user_error('addresses_required')
-            for line in sale.lines:
-                if line.quantity >= 0:
-                    location = line.from_location
-                else:
-                    location = line.to_location
-                if ((not location or not line.warehouse)
-                        and line.product
-                        and line.product.type in ('goods', 'assets')):
-                    self.raise_user_error('warehouse_required')
-
-    def set_reference(self, ids):
+    def check_for_quotation(self):
+        if not self.invoice_address or not self.shipment_address:
+            self.raise_user_error('addresses_required')
+        for line in self.lines:
+            if line.quantity >= 0:
+                location = line.from_location
+            else:
+                location = line.to_location
+            if ((not location or not line.warehouse)
+                    and line.product
+                    and line.product.type in ('goods', 'assets')):
+                self.raise_user_error('warehouse_required')
+
+    @classmethod
+    def set_reference(cls, sales):
         '''
         Fill the reference field with the sale sequence
         '''
-        sequence_obj = Pool().get('ir.sequence')
-        config_obj = Pool().get('sale.configuration')
+        pool = Pool()
+        Sequence = pool.get('ir.sequence')
+        Config = pool.get('sale.configuration')
 
-        config = config_obj.browse(1)
-        sales = self.browse(ids)
+        config = Config(1)
         for sale in sales:
             if sale.reference:
                 continue
-            reference = sequence_obj.get_id(config.sale_sequence.id)
-            self.write(sale.id, {
-                'reference': reference,
-                })
+            reference = Sequence.get_id(config.sale_sequence.id)
+            cls.write([sale], {
+                    'reference': reference,
+                    })
 
-    def set_sale_date(self, ids):
-        date_obj = Pool().get('ir.date')
-        for sale in self.browse(ids):
+    @classmethod
+    def set_sale_date(cls, sales):
+        Date = Pool().get('ir.date')
+        for sale in sales:
             if not sale.sale_date:
-                self.write(sale.id, {
-                        'sale_date': date_obj.today(),
+                cls.write([sale], {
+                        'sale_date': Date.today(),
                         })
 
-    def store_cache(self, ids):
-        for sale in self.browse(ids):
-            self.write(sale.id, {
+    @classmethod
+    def store_cache(cls, sales):
+        for sale in sales:
+            cls.write([sale], {
                     'untaxed_amount_cache': sale.untaxed_amount,
                     'tax_amount_cache': sale.tax_amount,
                     'total_amount_cache': sale.total_amount,
                     })
 
-    def _get_invoice_line_sale_line(self, sale, invoice_type):
+    def _get_invoice_line_sale_line(self, invoice_type):
         '''
-        Return invoice line values for each sale lines according to
-        invoice_type
+        Return invoice line for each sale lines according to invoice_type
         '''
-        line_obj = Pool().get('sale.line')
         res = {}
-        for line in sale.lines:
-            val = line_obj.get_invoice_line(line, invoice_type)
+        for line in self.lines:
+            val = line.get_invoice_line(invoice_type)
             if val:
                 res[line.id] = val
         return res
 
-    def _get_invoice_sale(self, sale, invoice_type):
+    def _get_invoice_sale(self, invoice_type):
         '''
-        Return invoice values of type invoice_type for sale
+        Return invoice of type invoice_type
         '''
-        journal_obj = Pool().get('account.journal')
-
-        journal_id = journal_obj.search([
-            ('type', '=', 'revenue'),
-            ], limit=1)
-        if journal_id:
-            journal_id = journal_id[0]
-
-        res = {
-            'company': sale.company.id,
-            'type': invoice_type,
-            'reference': sale.reference,
-            'journal': journal_id,
-            'party': sale.party.id,
-            'invoice_address': sale.invoice_address.id,
-            'currency': sale.currency.id,
-            'account': sale.party.account_receivable.id,
-            'payment_term': sale.payment_term.id,
-            }
-        return res
+        pool = Pool()
+        Invoice = pool.get('account.invoice')
+        Journal = pool.get('account.journal')
+
+        journals = Journal.search([
+                ('type', '=', 'revenue'),
+                ], limit=1)
+        if journals:
+            journal, = journals
+        else:
+            journal = None
 
-    def create_invoice(self, sale, invoice_type):
+        with Transaction().set_user(0, set_context=True):
+            return Invoice(
+                company=self.company,
+                type=invoice_type,
+                reference=self.reference,
+                journal=journal,
+                party=self.party,
+                invoice_address=self.invoice_address,
+                currency=self.currency,
+                account=self.party.account_receivable,
+                payment_term=self.payment_term,
+                )
+
+    def create_invoice(self, invoice_type):
         '''
-        Create an invoice of type invoice_type for the sale and return the id
+        Create and return an invoice of type invoice_type
         '''
         pool = Pool()
-        invoice_obj = pool.get('account.invoice')
-        invoice_line_obj = pool.get('account.invoice.line')
-        sale_line_obj = pool.get('sale.line')
-
-        if sale.invoice_method == 'manual':
+        Invoice = pool.get('account.invoice')
+        SaleLine = pool.get('sale.line')
+        if self.invoice_method == 'manual':
             return
 
-        if not sale.party.account_receivable:
+        if not self.party.account_receivable:
             self.raise_user_error('missing_account_receivable',
-                    error_args=(sale.party.rec_name,))
+                    error_args=(self.party.rec_name,))
 
-        invoice_lines = self._get_invoice_line_sale_line(sale, invoice_type)
+        invoice_lines = self._get_invoice_line_sale_line(invoice_type)
         if not invoice_lines:
             return
 
-        vals = self._get_invoice_sale(sale, invoice_type)
-        with Transaction().set_user(0, set_context=True):
-            invoice_id = invoice_obj.create(vals)
+        invoice = self._get_invoice_sale(invoice_type)
+        invoice.save()
 
-        for line in sale.lines:
+        for line in self.lines:
             if line.id not in invoice_lines:
                 continue
-            for vals in invoice_lines[line.id]:
-                vals['invoice'] = invoice_id
-                with Transaction().set_user(0, set_context=True):
-                    invoice_line_id = invoice_line_obj.create(vals)
-                sale_line_obj.write(line.id, {
-                    'invoice_lines': [('add', invoice_line_id)],
-                    })
+            for invoice_line in invoice_lines[line.id]:
+                invoice_line.invoice = invoice.id
+                invoice_line.save()
+                SaleLine.write([line], {
+                        'invoice_lines': [('add', [invoice_line.id])],
+                        })
 
         with Transaction().set_user(0, set_context=True):
-            invoice_obj.update_taxes([invoice_id])
+            Invoice.update_taxes([invoice])
 
-        self.write(sale.id, {
-            'invoices': [('add', invoice_id)],
-        })
-        return invoice_id
+        self.write([self], {
+                'invoices': [('add', [invoice.id])],
+                })
+        return invoice
 
-    def _get_move_sale_line(self, sale, shipment_type):
+    def _get_move_sale_line(self, shipment_type):
         '''
-        Return a dictionary of move values for each sale lines of the right
-        shipment_type
+        Return move for each sale lines of the right shipment_type
         '''
-        line_obj = Pool().get('sale.line')
         res = {}
-        for line in sale.lines:
-            val = line_obj.get_move(line, shipment_type)
+        for line in self.lines:
+            val = line.get_move(shipment_type)
             if val:
                 res[line.id] = val
         return res
@@ -804,16 +718,13 @@ class Sale(Workflow, ModelSQL, ModelView):
         '''
         The key to group moves by shipments
 
-        :param moves: a list of moves values
-        :param move: a tuple of line id and a dictionary of the move values
-
-        :return: a list of key-value as tuples of the shipment
+        move is a tuple of line id and a move
         '''
-        sale_line_obj = Pool().get('sale.line')
+        SaleLine = Pool().get('sale.line')
         line_id, move = move
-        line = sale_line_obj.browse(line_id)
+        line = SaleLine(line_id)
 
-        planned_date = max(m['planned_date'] for m in moves)
+        planned_date = max(m.planned_date for m in moves)
         return (
             ('planned_date', planned_date),
             ('warehouse', line.warehouse.id),
@@ -821,163 +732,166 @@ class Sale(Workflow, ModelSQL, ModelView):
 
     _group_return_key = _group_shipment_key
 
-    def create_shipment(self, sale, shipment_type):
+    def create_shipment(self, shipment_type):
         '''
-        Create a shipment of type shipment_type for the sale
-        and return the list of created shipment ids
+        Create and return shipments of type shipment_type
         '''
         pool = Pool()
-        move_obj = pool.get('stock.move')
-        sale_line_obj = pool.get('sale.line')
+        SaleLine = pool.get('sale.line')
 
-        if sale.shipment_method == 'manual':
+        if self.shipment_method == 'manual':
             return
 
-        moves = self._get_move_sale_line(sale, shipment_type)
+        moves = self._get_move_sale_line(shipment_type)
         if not moves:
             return
         if shipment_type == 'out':
             keyfunc = partial(self._group_shipment_key, moves.values())
             move_shipment_key = 'shipment_out'
-            shipment_obj = pool.get('stock.shipment.out')
+            Shipment = pool.get('stock.shipment.out')
         elif shipment_type == 'return':
             keyfunc = partial(self._group_return_key, moves.values())
             move_shipment_key = 'shipment_out_return'
-            shipment_obj = pool.get('stock.shipment.out.return')
+            Shipment = pool.get('stock.shipment.out.return')
         moves = moves.items()
         moves = sorted(moves, key=keyfunc)
 
         shipments = []
-        with Transaction().set_user(0, set_context=True):
-            for key, grouped_moves in groupby(moves, key=keyfunc):
-                values = {
-                    'customer': sale.party.id,
-                    'delivery_address': sale.shipment_address.id,
-                    'reference': sale.reference,
-                    'company': sale.company.id,
-                    }
-                values.update(dict(key))
-                shipment_id = shipment_obj.create(values)
-                shipments.append(shipment_id)
-                for line_id, values in grouped_moves:
-                    values[move_shipment_key] = shipment_id
-                    move_id = move_obj.create(values)
-                    sale_line_obj.write(line_id, {
-                        'moves': [('add', move_id)],
-                    })
-            if shipment_type == 'out':
-                shipment_obj.wait(shipments)
+        for key, grouped_moves in groupby(moves, key=keyfunc):
+            values = {
+                'customer': self.party.id,
+                'delivery_address': self.shipment_address.id,
+                'reference': self.reference,
+                'company': self.company.id,
+                }
+            values.update(dict(key))
+            with Transaction().set_user(0, set_context=True):
+                shipment = Shipment.create(values)
+                shipments.append(shipment)
+                for line_id, move in grouped_moves:
+                    setattr(move, move_shipment_key, shipment.id)
+                    move.save()
+                    SaleLine.write([SaleLine(line_id)], {
+                            'moves': [('add', [move.id])],
+                            })
+        if shipment_type == 'out':
+            with Transaction().set_user(0, set_context=True):
+                Shipment.wait(shipments)
         return shipments
 
-    def is_done(self, sale):
-        return ((sale.invoice_state == 'paid'
-                or sale.invoice_method == 'manual')
-            and (sale.shipment_state == 'sent'
-                or sale.shipment_method == 'manual'))
+    def is_done(self):
+        return ((self.invoice_state == 'paid'
+                or self.invoice_method == 'manual')
+            and (self.shipment_state == 'sent'
+                or self.shipment_method == 'manual'))
 
-    def delete(self, ids):
-        if isinstance(ids, (int, long)):
-            ids = [ids]
+    @classmethod
+    def delete(cls, sales):
         # Cancel before delete
-        self.cancel(ids)
-        for sale in self.browse(ids):
+        cls.cancel(sales)
+        for sale in sales:
             if sale.state != 'cancel':
-                self.raise_user_error('delete_cancel', sale.rec_name)
-        return super(Sale, self).delete(ids)
+                cls.raise_user_error('delete_cancel', sale.rec_name)
+        super(Sale, cls).delete(sales)
 
+    @classmethod
     @ModelView.button
     @Workflow.transition('cancel')
-    def cancel(self, ids):
-        self.store_cache(ids)
+    def cancel(cls, sales):
+        cls.store_cache(sales)
 
+    @classmethod
     @ModelView.button
     @Workflow.transition('draft')
-    def draft(self, ids):
+    def draft(cls, sales):
         pass
 
+    @classmethod
     @ModelView.button
     @Workflow.transition('quotation')
-    def quote(self, ids):
-        self.check_for_quotation(ids)
-        self.set_reference(ids)
+    def quote(cls, sales):
+        for sale in sales:
+            sale.check_for_quotation()
+        cls.set_reference(sales)
 
+    @classmethod
     @ModelView.button
     @Workflow.transition('confirmed')
-    def confirm(self, ids):
-        self.set_sale_date(ids)
-        self.store_cache(ids)
+    def confirm(cls, sales):
+        cls.set_sale_date(sales)
+        cls.store_cache(sales)
+
+    @classmethod
+    @ModelView.button_action('sale.wizard_invoice_handle_exception')
+    def handle_invoice_exception(cls, sales):
+        pass
 
+    @classmethod
+    @ModelView.button_action('sale.wizard_shipment_handle_exception')
+    def handle_shipment_exception(cls, sales):
+        pass
+
+    @classmethod
     @ModelView.button
     @Workflow.transition('processing')
-    def process(self, ids):
+    def process(cls, sales):
         done = []
-        for sale in self.browse(ids):
+        for sale in sales:
             if sale.state in ('done', 'cancel'):
                 continue
-            self.create_invoice(sale, 'out_invoice')
-            self.create_invoice(sale, 'out_credit_note')
-            self.set_invoice_state(sale)
-            self.create_shipment(sale, 'out')
-            self.create_shipment(sale, 'return')
-            self.set_shipment_state(sale)
-            if self.is_done(sale):
-                done.append(sale.id)
+            sale.create_invoice('out_invoice')
+            sale.create_invoice('out_credit_note')
+            sale.set_invoice_state()
+            sale.create_shipment('out')
+            sale.create_shipment('return')
+            sale.set_shipment_state()
+            if sale.is_done():
+                done.append(sale)
         if done:
-            self.write(done, {
+            cls.write(done, {
                     'state': 'done',
                     })
 
-Sale()
-
 
 class SaleInvoice(ModelSQL):
     'Sale - Invoice'
-    _name = 'sale.sale-account.invoice'
+    __name__ = 'sale.sale-account.invoice'
     _table = 'sale_invoices_rel'
-    _description = __doc__
     sale = fields.Many2One('sale.sale', 'Sale', ondelete='CASCADE',
         select=True, required=True)
     invoice = fields.Many2One('account.invoice', 'Invoice',
             ondelete='RESTRICT', select=True, required=True)
 
-SaleInvoice()
-
 
 class SaleIgnoredInvoice(ModelSQL):
     'Sale - Ignored Invoice'
-    _name = 'sale.sale-ignored-account.invoice'
+    __name__ = 'sale.sale-ignored-account.invoice'
     _table = 'sale_invoice_ignored_rel'
-    _description = __doc__
     sale = fields.Many2One('sale.sale', 'Sale', ondelete='CASCADE',
         select=True, required=True)
     invoice = fields.Many2One('account.invoice', 'Invoice',
             ondelete='RESTRICT', select=True, required=True)
 
-SaleIgnoredInvoice()
-
 
 class SaleRecreatedInvoice(ModelSQL):
     'Sale - Recreated Invoice'
-    _name = 'sale.sale-recreated-account.invoice'
+    __name__ = 'sale.sale-recreated-account.invoice'
     _table = 'sale_invoice_recreated_rel'
-    _description = __doc__
     sale = fields.Many2One('sale.sale', 'Sale', ondelete='CASCADE',
         select=True, required=True)
     invoice = fields.Many2One('account.invoice', 'Invoice',
             ondelete='RESTRICT', select=True, required=True)
 
-SaleRecreatedInvoice()
-
 
 class SaleLine(ModelSQL, ModelView):
     'Sale Line'
-    _name = 'sale.line'
+    __name__ = 'sale.line'
     _rec_name = 'description'
-    _description = __doc__
-
     sale = fields.Many2One('sale.sale', 'Sale', ondelete='CASCADE',
         select=True)
-    sequence = fields.Integer('Sequence', required=True)
+    sequence = fields.Integer('Sequence',
+        order_field='(%(table)s.sequence IS NULL) %(order)s, '
+        '%(table)s.sequence %(order)s')
     type = fields.Selection([
         ('line', 'Line'),
         ('subtotal', 'Subtotal'),
@@ -991,7 +905,8 @@ class SaleLine(ModelSQL, ModelView):
             'required': Eval('type') == 'line',
             'readonly': ~Eval('_parent_sale', {}),
             }, on_change=['product', 'quantity', 'unit',
-            '_parent_sale.currency', '_parent_sale.party'],
+            '_parent_sale.currency', '_parent_sale.party',
+            '_parent_sale.sale_date'],
         depends=['type', 'unit_digits'])
     unit = fields.Many2One('product.uom', 'Unit',
             states={
@@ -1008,7 +923,7 @@ class SaleLine(ModelSQL, ModelView):
             '_parent_sale.party'],
         depends=['product', 'type', 'product_uom_category'])
     unit_digits = fields.Function(fields.Integer('Unit Digits',
-        on_change_with=['unit']), 'get_unit_digits')
+        on_change_with=['unit']), 'on_change_with_unit_digits')
     product = fields.Many2One('product.product', 'Product',
         domain=[('salable', '=', True)],
         states={
@@ -1016,7 +931,8 @@ class SaleLine(ModelSQL, ModelView):
             'readonly': ~Eval('_parent_sale', {}),
             },
         on_change=['product', 'unit', 'quantity', 'description',
-            '_parent_sale.party', '_parent_sale.currency'],
+            '_parent_sale.party', '_parent_sale.currency',
+            '_parent_sale.sale_date'],
         context={
             'locations': If(Bool(Eval('_parent_sale', {}).get('warehouse')),
                 [Eval('_parent_sale', {}).get('warehouse', 0)], []),
@@ -1027,7 +943,7 @@ class SaleLine(ModelSQL, ModelView):
     product_uom_category = fields.Function(
         fields.Many2One('product.uom.category', 'Product Uom Category',
             on_change_with=['product']),
-        'get_product_uom_category')
+        'on_change_with_product_uom_category')
     unit_price = fields.Numeric('Unit Price', digits=(16, 4),
         states={
             'invisible': Eval('type') != 'line',
@@ -1070,12 +986,13 @@ class SaleLine(ModelSQL, ModelView):
                 'invisible': Eval('type') != 'line',
                 },
             depends=['type']),
-        'get_delivery_date')
+        'on_change_with_delivery_date')
 
-    def __init__(self):
-        super(SaleLine, self).__init__()
-        self._order.insert(0, ('sequence', 'ASC'))
-        self._error_messages.update({
+    @classmethod
+    def __setup__(cls):
+        super(SaleLine, cls).__setup__()
+        cls._order.insert(0, ('sequence', 'ASC'))
+        cls._error_messages.update({
             'customer_location_required': 'The customer location is required!',
             'missing_account_revenue': 'It misses '
                     'an "Account Revenue" on product "%s"!',
@@ -1083,357 +1000,278 @@ class SaleLine(ModelSQL, ModelView):
                     'an "account Revenue" default property!',
             })
 
-    def init(self, module_name):
-        super(SaleLine, self).init(module_name)
+    @classmethod
+    def __register__(cls, module_name):
+        super(SaleLine, cls).__register__(module_name)
         cursor = Transaction().cursor
-        table = TableHandler(cursor, self, module_name)
+        table = TableHandler(cursor, cls, module_name)
 
         # Migration from 1.0 comment change into note
         if table.column_exist('comment'):
-            cursor.execute('UPDATE "' + self._table + '" SET note = comment')
+            cursor.execute('UPDATE "' + cls._table + '" SET note = comment')
             table.drop_column('comment', exception=True)
 
-    def default_type(self):
+        # Migration from 2.4: drop required on sequence
+        table.not_null_action('sequence', action='remove')
+
+    @staticmethod
+    def default_type():
         return 'line'
 
-    def default_unit_digits(self):
+    @staticmethod
+    def default_unit_digits():
         return 2
 
-    def on_change_with_unit_digits(self, vals):
-        uom_obj = Pool().get('product.uom')
-        if vals.get('unit'):
-            uom = uom_obj.browse(vals['unit'])
-            return uom.digits
+    def on_change_with_unit_digits(self, name=None):
+        if self.unit:
+            return self.unit.digits
         return 2
 
-    def get_unit_digits(self, ids, name):
-        res = {}
-        for line in self.browse(ids):
-            if line.unit:
-                res[line.id] = line.unit.digits
-            else:
-                res[line.id] = 2
-        return res
-
-    def get_move_done(self, ids, name):
-        uom_obj = Pool().get('product.uom')
-        res = {}
-        for line in self.browse(ids):
-            val = True
-            if not line.product:
-                res[line.id] = True
-                continue
-            if line.product.type == 'service':
-                res[line.id] = True
-                continue
-            skip_ids = set(x.id for x in line.moves_ignored)
-            skip_ids.update(x.id for x in line.moves_recreated)
-            quantity = line.quantity
-            for move in line.moves:
-                if move.state != 'done' \
-                        and move.id not in skip_ids:
-                    val = False
-                    break
-                quantity -= uom_obj.compute_qty(move.uom, move.quantity,
-                        line.unit)
-            if val:
-                if quantity > 0.0:
-                    val = False
-            res[line.id] = val
-        return res
-
-    def get_move_exception(self, ids, name):
-        res = {}
-        for line in self.browse(ids):
-            val = False
-            skip_ids = set(x.id for x in line.moves_ignored)
-            skip_ids.update(x.id for x in line.moves_recreated)
-            for move in line.moves:
-                if move.state == 'cancel' \
-                        and move.id not in skip_ids:
-                    val = True
-                    break
-            res[line.id] = val
-        return res
-
-    def _get_tax_rule_pattern(self, party, vals):
+    def get_move_done(self, name):
+        Uom = Pool().get('product.uom')
+        done = True
+        if not self.product:
+            return True
+        if self.product.type == 'service':
+            return True
+        skip_ids = set(x.id for x in self.moves_ignored)
+        skip_ids.update(x.id for x in self.moves_recreated)
+        quantity = self.quantity
+        for move in self.moves:
+            if move.state != 'done' \
+                    and move.id not in skip_ids:
+                done = False
+                break
+            quantity -= Uom.compute_qty(move.uom, move.quantity, self.unit)
+        if done:
+            if quantity > 0.0:
+                done = False
+        return done
+
+    def get_move_exception(self, name):
+        skip_ids = set(x.id for x in self.moves_ignored)
+        skip_ids.update(x.id for x in self.moves_recreated)
+        for move in self.moves:
+            if move.state == 'cancel' \
+                    and move.id not in skip_ids:
+                return True
+        return False
+
+    def _get_tax_rule_pattern(self):
         '''
         Get tax rule pattern
-
-        :param party: the BrowseRecord of the party
-        :param vals: a dictionary with value from on_change
-        :return: a dictionary to use as pattern for tax rule
         '''
-        res = {}
-        return res
+        return {}
 
-    def _get_context_sale_price(self, product, vals):
+    def _get_context_sale_price(self):
         context = {}
-        if vals.get('_parent_sale.currency'):
-            context['currency'] = vals['_parent_sale.currency']
-        if vals.get('_parent_sale.party'):
-            context['customer'] = vals['_parent_sale.party']
-        if vals.get('_parent_sale.sale_date'):
-            context['sale_date'] = vals['_parent_sale.sale_date']
-        if vals.get('unit'):
-            context['uom'] = vals['unit']
+        if getattr(self, 'sale', None):
+            if getattr(self.sale, 'currency', None):
+                context['currency'] = self.sale.currency.id
+            if getattr(self.sale, 'party', None):
+                context['customer'] = self.sale.party.id
+            if getattr(self.sale, 'sale_date', None):
+                context['sale_date'] = self.sale.sale_date
+        if self.unit:
+            context['uom'] = self.unit.id
         else:
-            context['uom'] = product.sale_uom.id
+            context['uom'] = self.product.sale_uom.id
         return context
 
-    def on_change_product(self, vals):
-        pool = Pool()
-        party_obj = pool.get('party.party')
-        product_obj = pool.get('product.product')
-        tax_rule_obj = pool.get('account.tax.rule')
+    def on_change_product(self):
+        Product = Pool().get('product.product')
 
-        if not vals.get('product'):
+        if not self.product:
             return {}
         res = {}
 
         party = None
         party_context = {}
-        if vals.get('_parent_sale.party'):
-            party = party_obj.browse(vals['_parent_sale.party'])
+        if self.sale and self.sale.party:
+            party = self.sale.party
             if party.lang:
                 party_context['language'] = party.lang.code
 
-        product = product_obj.browse(vals['product'])
+        category = self.product.sale_uom.category
+        if not self.unit or self.unit not in category.uoms:
+            res['unit'] = self.product.sale_uom.id
+            self.unit = self.product.sale_uom
+            res['unit.rec_name'] = self.product.sale_uom.rec_name
+            res['unit_digits'] = self.product.sale_uom.digits
 
-        with Transaction().set_context(
-                self._get_context_sale_price(product, vals)):
-            res['unit_price'] = product_obj.get_sale_price([product.id],
-                    vals.get('quantity') or 0)[product.id]
+        with Transaction().set_context(self._get_context_sale_price()):
+            res['unit_price'] = Product.get_sale_price([self.product],
+                    self.quantity or 0)[self.product.id]
             if res['unit_price']:
                 res['unit_price'] = res['unit_price'].quantize(
-                    Decimal(1) / 10 ** self.unit_price.digits[1])
+                    Decimal(1) / 10 ** self.__class__.unit_price.digits[1])
         res['taxes'] = []
-        pattern = self._get_tax_rule_pattern(party, vals)
-        for tax in product.customer_taxes_used:
+        pattern = self._get_tax_rule_pattern()
+        for tax in self.product.customer_taxes_used:
             if party and party.customer_tax_rule:
-                tax_ids = tax_rule_obj.apply(party.customer_tax_rule, tax,
-                        pattern)
+                tax_ids = party.customer_tax_rule.apply(tax, pattern)
                 if tax_ids:
                     res['taxes'].extend(tax_ids)
                 continue
             res['taxes'].append(tax.id)
         if party and party.customer_tax_rule:
-            tax_ids = tax_rule_obj.apply(party.customer_tax_rule, None,
-                    pattern)
+            tax_ids = party.customer_tax_rule.apply(None, pattern)
             if tax_ids:
                 res['taxes'].extend(tax_ids)
 
-        if not vals.get('description'):
+        if not self.description:
             with Transaction().set_context(party_context):
-                res['description'] = product_obj.browse(product.id).rec_name
-
-        category = product.sale_uom.category
-        if not vals.get('unit') \
-                or vals.get('unit') not in [x.id for x in category.uoms]:
-            res['unit'] = product.sale_uom.id
-            res['unit.rec_name'] = product.sale_uom.rec_name
-            res['unit_digits'] = product.sale_uom.digits
-
-        vals = vals.copy()
-        vals['unit_price'] = res['unit_price']
-        vals['type'] = 'line'
-        res['amount'] = self.on_change_with_amount(vals)
+                res['description'] = Product(self.product.id).rec_name
+
+        self.unit_price = res['unit_price']
+        self.type = 'line'
+        res['amount'] = self.on_change_with_amount()
         return res
 
-    def on_change_with_product_uom_category(self, values):
-        pool = Pool()
-        product_obj = pool.get('product.product')
-        if values.get('product'):
-            product = product_obj.browse(values['product'])
-            return product.default_uom_category.id
-
-    def get_product_uom_category(self, ids, name):
-        categories = {}
-        for line in self.browse(ids):
-            if line.product:
-                categories[line.id] = line.product.default_uom_category.id
-            else:
-                categories[line.id] = None
-        return categories
+    def on_change_with_product_uom_category(self, name=None):
+        if self.product:
+            return self.product.default_uom_category.id
 
-    def on_change_quantity(self, vals):
-        product_obj = Pool().get('product.product')
+    def on_change_quantity(self):
+        Product = Pool().get('product.product')
 
-        if not vals.get('product'):
+        if not self.product:
             return {}
         res = {}
 
-        product = product_obj.browse(vals['product'])
-
         with Transaction().set_context(
-                self._get_context_sale_price(product, vals)):
-            res['unit_price'] = product_obj.get_sale_price([vals['product']],
-                    vals.get('quantity') or 0)[vals['product']]
+                self._get_context_sale_price()):
+            res['unit_price'] = Product.get_sale_price([self.product],
+                self.quantity or 0)[self.product.id]
             if res['unit_price']:
                 res['unit_price'] = res['unit_price'].quantize(
-                    Decimal(1) / 10 ** self.unit_price.digits[1])
+                    Decimal(1) / 10 ** self.__class__.unit_price.digits[1])
         return res
 
-    def on_change_unit(self, vals):
-        return self.on_change_quantity(vals)
-
-    def on_change_with_amount(self, vals):
-        currency_obj = Pool().get('currency.currency')
-        if vals.get('type') == 'line':
-            currency = vals.get('_parent_sale.currency')
-            if currency and isinstance(currency, (int, long)):
-                currency = currency_obj.browse(vals['_parent_sale.currency'])
-            amount = Decimal(str(vals.get('quantity') or '0.0')) * \
-                    (vals.get('unit_price') or Decimal('0.0'))
+    def on_change_unit(self):
+        return self.on_change_quantity()
+
+    def on_change_with_amount(self):
+        if self.type == 'line':
+            currency = self.sale.currency if self.sale else None
+            amount = Decimal(str(self.quantity or '0.0')) * \
+                (self.unit_price or Decimal('0.0'))
             if currency:
-                return currency_obj.round(currency, amount)
+                return currency.round(amount)
             return amount
         return Decimal('0.0')
 
-    def get_amount(self, ids, name):
-        currency_obj = Pool().get('currency.currency')
-        res = {}
-        for line in self.browse(ids):
-            if line.type == 'line':
-                res[line.id] = currency_obj.round(line.sale.currency,
-                        Decimal(str(line.quantity)) * line.unit_price)
-            elif line.type == 'subtotal':
-                res[line.id] = Decimal('0.0')
-                for line2 in line.sale.lines:
-                    if line2.type == 'line':
-                        res[line.id] += currency_obj.round(line2.sale.currency,
-                                Decimal(str(line2.quantity)) *
-                                        line2.unit_price)
-                    elif line2.type == 'subtotal':
-                        if line.id == line2.id:
-                            break
-                        res[line.id] = Decimal('0.0')
-            else:
-                res[line.id] = Decimal('0.0')
-        return res
-
-    def get_warehouse(self, ids, name):
-        result = {}
-        for line in self.browse(ids):
-            result[line.id] = line.sale.warehouse.id
-        return result
+    def get_amount(self, name):
+        if self.type == 'line':
+            return self.sale.currency.round(
+                Decimal(str(self.quantity)) * self.unit_price)
+        elif self.type == 'subtotal':
+            amount = Decimal('0.0')
+            for line2 in self.sale.lines:
+                if line2.type == 'line':
+                    amount += line2.sale.currency.round(
+                        Decimal(str(line2.quantity)) * line2.unit_price)
+                elif line2.type == 'subtotal':
+                    if self == line2:
+                        break
+                    amount = Decimal('0.0')
+            return amount
+        return Decimal('0.0')
 
-    def get_from_location(self, ids, name):
-        result = {}
-        for line in self.browse(ids):
-            if line.quantity >= 0:
-                if line.warehouse:
-                    result[line.id] = line.warehouse.output_location.id
-                else:
-                    result[line.id] = None
-            else:
-                result[line.id] = line.sale.party.customer_location.id
-        return result
+    def get_warehouse(self, name):
+        return self.sale.warehouse.id if self.sale.warehouse else None
 
-    def get_to_location(self, ids, name):
-        result = {}
-        for line in self.browse(ids):
-            if line.quantity >= 0:
-                result[line.id] = line.sale.party.customer_location.id
-            else:
-                if line.warehouse:
-                    result[line.id] = line.warehouse.input_location.id
-                else:
-                    result[line.id] = None
-        return result
+    def get_from_location(self, name):
+        if self.quantity >= 0:
+            if self.warehouse:
+                return self.warehouse.output_location.id
+        else:
+            return self.sale.party.customer_location.id
 
-    def _compute_delivery_date(self, product, date):
-        product_obj = Pool().get('product.product')
-        if product:
-            return product_obj.compute_delivery_date(product, date=date)
+    def get_to_location(self, name):
+        if self.quantity >= 0:
+            return self.sale.party.customer_location.id
         else:
-            return None
-
-    def on_change_with_delivery_date(self, values):
-        product_obj = Pool().get('product.product')
-        if values.get('product'):
-            product = product_obj.browse(values['product'])
-            return self._compute_delivery_date(product,
-                values.get('_parent_sale.sale_date'))
-        return None
-
-    def get_delivery_date(self, ids, name):
-        dates = {}
-        for line in self.browse(ids):
-            dates[line.id] = self._compute_delivery_date(line.product,
-                line.sale.sale_date)
-        return dates
-
-    def get_invoice_line(self, line, invoice_type):
+            if self.warehouse:
+                return self.warehouse.input_location.id
+
+    def on_change_with_delivery_date(self, name=None):
+        if self.product:
+            date = self.sale.sale_date if self.sale else None
+            return self.product.compute_delivery_date(date=date)
+
+    def get_invoice_line(self, invoice_type):
         '''
-        Return a list of invoice line values for sale line according to
-        invoice_type
+        Return a list of invoice lines for sale line according to invoice_type
         '''
-        uom_obj = Pool().get('product.uom')
-        property_obj = Pool().get('ir.property')
+        pool = Pool()
+        Uom = pool.get('product.uom')
+        Property = pool.get('ir.property')
+        InvoiceLine = pool.get('account.invoice.line')
 
-        res = {}
-        res['sequence'] = line.sequence
-        res['type'] = line.type
-        res['description'] = line.description
-        res['note'] = line.note
-        if line.type != 'line':
-            if (line.sale.invoice_method == 'order'
-                    and ((all(l.quantity >= 0 for l in line.sale.lines
+        with Transaction().set_user(0, set_context=True):
+            invoice_line = InvoiceLine()
+        invoice_line.type = self.type
+        invoice_line.description = self.description
+        invoice_line.note = self.note
+        if self.type != 'line':
+            if (self.sale.invoice_method == 'order'
+                    and ((all(l.quantity >= 0 for l in self.sale.lines
                                 if l.type == 'line')
                             and invoice_type == 'out_invoice')
-                        or (all(l.quantity <= 0 for l in line.sale.lines
+                        or (all(l.quantity <= 0 for l in self.sale.lines
                                 if l.type == 'line')
                             and invoice_type == 'out_credit_note'))):
-                return [res]
+                return [invoice_line]
             else:
                 return []
 
-        if (invoice_type == 'out_invoice') != (line.quantity >= 0):
+        if (invoice_type == 'out_invoice') != (self.quantity >= 0):
             return []
 
-        if (line.sale.invoice_method == 'order'
-                or not line.product
-                or line.product.type == 'service'):
-            quantity = abs(line.quantity)
+        if (self.sale.invoice_method == 'order'
+                or not self.product
+                or self.product.type == 'service'):
+            quantity = abs(self.quantity)
         else:
             quantity = 0.0
-            for move in line.moves:
+            for move in self.moves:
                 if move.state == 'done':
-                    quantity += uom_obj.compute_qty(move.uom, move.quantity,
-                            line.unit)
+                    quantity += Uom.compute_qty(move.uom, move.quantity,
+                        self.unit)
 
-        skip_ids = set(l.id for i in line.sale.invoices_recreated
+        skip_ids = set(l.id for i in self.sale.invoices_recreated
             for l in i.lines)
-        for invoice_line in line.invoice_lines:
-            if invoice_line.type != 'line':
+        for old_invoice_line in self.invoice_lines:
+            if old_invoice_line.type != 'line':
                 continue
-            if invoice_line.id not in skip_ids:
-                quantity -= uom_obj.compute_qty(invoice_line.unit,
-                        invoice_line.quantity, line.unit)
-        res['quantity'] = quantity
+            if old_invoice_line.id not in skip_ids:
+                quantity -= Uom.compute_qty(old_invoice_line.unit,
+                    old_invoice_line.quantity, self.unit)
+        invoice_line.quantity = quantity
 
-        if res['quantity'] <= 0.0:
+        if invoice_line.quantity <= 0.0:
             return []
-        res['unit'] = line.unit.id
-        res['product'] = line.product.id
-        res['unit_price'] = line.unit_price
-        res['taxes'] = [('set', [x.id for x in line.taxes])]
-        if line.product:
-            res['account'] = line.product.account_revenue_used.id
-            if not res['account']:
+        invoice_line.unit = self.unit
+        invoice_line.product = self.product
+        invoice_line.unit_price = self.unit_price
+        invoice_line.taxes = self.taxes
+        if self.product:
+            invoice_line.account = self.product.account_revenue_used
+            if not invoice_line.account:
                 self.raise_user_error('missing_account_revenue',
-                        error_args=(line.product.rec_name,))
+                        error_args=(self.product.rec_name,))
         else:
             for model in ('product.template', 'product.category'):
-                res['account'] = property_obj.get('account_revenue', model)
-                if res['account']:
+                invoice_line.account = Property.get('account_revenue', model)
+                if invoice_line.account:
                     break
-            if not res['account']:
+            if not invoice_line.account:
                 self.raise_user_error('missing_account_revenue_property')
-        return [res]
+        return [invoice_line]
 
-    def copy(self, ids, default=None):
+    @classmethod
+    def copy(cls, lines, default=None):
         if default is None:
             default = {}
         default = default.copy()
@@ -1441,118 +1279,104 @@ class SaleLine(ModelSQL, ModelView):
         default['moves_ignored'] = None
         default['moves_recreated'] = None
         default['invoice_lines'] = None
-        return super(SaleLine, self).copy(ids, default=default)
+        return super(SaleLine, cls).copy(lines, default=default)
 
-    def get_move(self, line, shipment_type):
+    def get_move(self, shipment_type):
         '''
-        Return move values for the sale line according ot shipment_type
+        Return moves for the sale line according ot shipment_type
         '''
-        uom_obj = Pool().get('product.uom')
+        pool = Pool()
+        Uom = pool.get('product.uom')
+        Move = pool.get('stock.move')
 
-        res = {}
-        if line.type != 'line':
+        if self.type != 'line':
             return
-        if not line.product:
+        if not self.product:
             return
-        if line.product.type == 'service':
+        if self.product.type == 'service':
             return
-        if (shipment_type == 'out') != (line.quantity >= 0):
+        if (shipment_type == 'out') != (self.quantity >= 0):
             return
 
-        if line.sale.shipment_method == 'order':
-            quantity = abs(line.quantity)
+        if self.sale.shipment_method == 'order':
+            quantity = abs(self.quantity)
         else:
             quantity = 0.0
-            for invoice_line in line.invoice_lines:
+            for invoice_line in self.invoice_lines:
                 if invoice_line.invoice.state in ('open', 'paid'):
-                    quantity += uom_obj.compute_qty(invoice_line.unit,
-                        invoice_line.quantity, line.unit)
+                    quantity += Uom.compute_qty(invoice_line.unit,
+                        invoice_line.quantity, self.unit)
 
-        skip_ids = set(x.id for x in line.moves_recreated)
-        for move in line.moves:
+        skip_ids = set(x.id for x in self.moves_recreated)
+        for move in self.moves:
             if move.id not in skip_ids:
-                quantity -= uom_obj.compute_qty(move.uom, move.quantity,
-                        line.unit)
+                quantity -= Uom.compute_qty(move.uom, move.quantity,
+                    self.unit)
         if quantity <= 0.0:
             return
-        if not line.sale.party.customer_location:
+        if not self.sale.party.customer_location:
             self.raise_user_error('customer_location_required')
-        res['quantity'] = quantity
-        res['uom'] = line.unit.id
-        res['product'] = line.product.id
-        res['from_location'] = line.from_location.id
-        res['to_location'] = line.to_location.id
-        res['state'] = 'draft'
-        res['company'] = line.sale.company.id
-        res['unit_price'] = line.unit_price
-        res['currency'] = line.sale.currency.id
-        res['planned_date'] = line.delivery_date
-        return res
-
-SaleLine()
+        with Transaction().set_user(0, set_context=True):
+            move = Move()
+        move.quantity = quantity
+        move.uom = self.unit
+        move.product = self.product
+        move.from_location = self.from_location
+        move.to_location = self.to_location
+        move.state = 'draft'
+        move.company = self.sale.company
+        move.unit_price = self.unit_price
+        move.currency = self.sale.currency
+        move.planned_date = self.delivery_date
+        return move
 
 
 class SaleLineTax(ModelSQL):
     'Sale Line - Tax'
-    _name = 'sale.line-account.tax'
+    __name__ = 'sale.line-account.tax'
     _table = 'sale_line_account_tax'
-    _description = __doc__
     line = fields.Many2One('sale.line', 'Sale Line', ondelete='CASCADE',
             select=True, required=True)
     tax = fields.Many2One('account.tax', 'Tax', ondelete='RESTRICT',
             select=True, required=True)
 
-SaleLineTax()
-
 
 class SaleLineInvoiceLine(ModelSQL):
     'Sale Line - Invoice Line'
-    _name = 'sale.line-account.invoice.line'
+    __name__ = 'sale.line-account.invoice.line'
     _table = 'sale_line_invoice_lines_rel'
-    _description = __doc__
     sale_line = fields.Many2One('sale.line', 'Sale Line', ondelete='CASCADE',
             select=True, required=True)
     invoice_line = fields.Many2One('account.invoice.line', 'Invoice Line',
             ondelete='RESTRICT', select=True, required=True)
 
-SaleLineInvoiceLine()
-
 
 class SaleLineIgnoredMove(ModelSQL):
     'Sale Line - Ignored Move'
-    _name = 'sale.line-ignored-stock.move'
+    __name__ = 'sale.line-ignored-stock.move'
     _table = 'sale_line_moves_ignored_rel'
-    _description = __doc__
     sale_line = fields.Many2One('sale.line', 'Sale Line', ondelete='CASCADE',
             select=True, required=True)
     move = fields.Many2One('stock.move', 'Move', ondelete='RESTRICT',
             select=True, required=True)
 
-SaleLineIgnoredMove()
-
 
 class SaleLineRecreatedMove(ModelSQL):
     'Sale Line - Recreated Move'
-    _name = 'sale.line-recreated-stock.move'
+    __name__ = 'sale.line-recreated-stock.move'
     _table = 'sale_line_moves_recreated_rel'
-    _description = __doc__
     sale_line = fields.Many2One('sale.line', 'Sale Line', ondelete='CASCADE',
             select=True, required=True)
     move = fields.Many2One('stock.move', 'Move', ondelete='RESTRICT',
             select=True, required=True)
 
-SaleLineRecreatedMove()
-
 
 class SaleReport(CompanyReport):
-    _name = 'sale.sale'
-
-SaleReport()
+    __name__ = 'sale.sale'
 
 
-class Template(ModelSQL, ModelView):
-    _name = 'product.template'
-
+class Template:
+    __name__ = 'product.template'
     salable = fields.Boolean('Salable', states={
             'readonly': ~Eval('active', True),
             }, depends=['active'])
@@ -1574,214 +1398,194 @@ class Template(ModelSQL, ModelView):
         depends=['active', 'salable'],
         help='In number of days')
 
-    def __init__(self):
-        super(Template, self).__init__()
-        self.account_revenue = copy.copy(self.account_revenue)
-        self.account_revenue.states = copy.copy(self.account_revenue.states)
+    @classmethod
+    def __setup__(cls):
+        super(Template, cls).__setup__()
         required = ~Eval('account_category', False) & Eval('salable', False)
-        if not self.account_revenue.states.get('required'):
-            self.account_revenue.states['required'] = required
+        if not cls.account_revenue.states.get('required'):
+            cls.account_revenue.states['required'] = required
         else:
-            self.account_revenue.states['required'] = (
-                    self.account_revenue.states['required'] | required)
-        if 'account_category' not in self.account_revenue.depends:
-            self.account_revenue = copy.copy(self.account_revenue)
-            self.account_revenue.depends = \
-                    copy.copy(self.account_revenue.depends)
-            self.account_revenue.depends.append('account_category')
-        if 'salable' not in self.account_revenue.depends:
-            self.account_revenue = copy.copy(self.account_revenue)
-            self.account_revenue.depends = \
-                    copy.copy(self.account_revenue.depends)
-            self.account_revenue.depends.append('salable')
-        self._reset_columns()
-
-    def default_salable(self):
+            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
 
-    def default_delivery_time(self):
+    @staticmethod
+    def default_delivery_time():
         return 0
 
-    def on_change_with_sale_uom(self, vals):
-        uom_obj = Pool().get('product.uom')
-        res = None
-
-        if vals.get('default_uom'):
-            default_uom = uom_obj.browse(vals['default_uom'])
-            if vals.get('sale_uom'):
-                sale_uom = uom_obj.browse(vals['sale_uom'])
-                if default_uom.category.id == sale_uom.category.id:
-                    res = sale_uom.id
+    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:
-                    res = default_uom.id
+                    return self.default_uom.id
             else:
-                res = default_uom.id
-        return res
-
-Template()
+                return self.default_uom.id
 
 
-class Product(ModelSQL, ModelView):
-    _name = 'product.product'
+class Product:
+    __name__ = 'product.product'
 
-    def get_sale_price(self, ids, quantity=0):
+    @staticmethod
+    def get_sale_price(products, quantity=0):
         '''
-        Return the sale price for product ids.
-
-        :param ids: the product ids
-        :param quantity: the quantity of the products
+        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
-        :return: a dictionary with for each product ids keys the computed price
         '''
         pool = Pool()
-        uom_obj = pool.get('product.uom')
-        user_obj = pool.get('res.user')
-        currency_obj = pool.get('currency.currency')
-        date_obj = pool.get('ir.date')
+        Uom = pool.get('product.uom')
+        User = pool.get('res.user')
+        Currency = pool.get('currency.currency')
+        Date = pool.get('ir.date')
 
-        today = date_obj.today()
-        res = {}
+        today = Date.today()
+        prices = {}
 
         uom = None
         if Transaction().context.get('uom'):
-            uom = uom_obj.browse(Transaction().context.get('uom'))
+            uom = Uom(Transaction().context.get('uom'))
 
         currency = None
         if Transaction().context.get('currency'):
-            currency = currency_obj.browse(
-                    Transaction().context.get('currency'))
+            currency = Currency(Transaction().context.get('currency'))
 
-        user2 = user_obj.browse(Transaction().user)
+        user = User(Transaction().user)
 
-        for product in self.browse(ids):
-            res[product.id] = product.list_price
+        for product in products:
+            prices[product.id] = product.list_price
             if uom:
-                res[product.id] = uom_obj.compute_price(
-                        product.default_uom, res[product.id], uom)
-            if currency and user2.company:
-                if user2.company.currency.id != currency.id:
+                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):
-                        res[product.id] = currency_obj.compute(
-                                user2.company.currency.id, res[product.id],
-                                currency.id, round=False)
-        return res
+                        prices[product.id] = Currency.compute(
+                            user.company.currency, prices[product.id],
+                            currency, round=False)
+        return prices
 
-    def compute_delivery_date(self, product, date=None):
+    def compute_delivery_date(self, date=None):
         '''
-        Compute the delivery date for the Product at a the given date
+        Compute the delivery date a the given date
         '''
-        date_obj = Pool().get('ir.date')
+        Date = Pool().get('ir.date')
 
         if not date:
-            date = date_obj.today()
-        return date + datetime.timedelta(product.delivery_time)
+            date = Date.today()
+        return date + datetime.timedelta(self.delivery_time)
 
-Product()
 
+class ShipmentOut:
+    __name__ = 'stock.shipment.out'
 
-class ShipmentOut(ModelSQL, ModelView):
-    _name = 'stock.shipment.out'
-
-    def __init__(self):
-        super(ShipmentOut, self).__init__()
-        self._error_messages.update({
+    @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.',
             })
 
-    def write(self, ids, vals):
-        sale_obj = Pool().get('sale.sale')
-        sale_line_obj = Pool().get('sale.line')
+    @classmethod
+    def write(cls, shipments, vals):
+        pool = Pool()
+        Sale = pool.get('sale.sale')
+        SaleLine = pool.get('sale.line')
 
-        res = super(ShipmentOut, self).write(ids, vals)
+        super(ShipmentOut, cls).write(shipments, vals)
 
         if 'state' in vals and vals['state'] in ('done', 'cancel'):
-            sale_ids = []
+            sales = []
             move_ids = []
-            if isinstance(ids, (int, long)):
-                ids = [ids]
-            for shipment in self.browse(ids):
+            for shipment in shipments:
                 move_ids.extend([x.id for x in shipment.outgoing_moves])
 
-            sale_line_ids = sale_line_obj.search([
-                ('moves', 'in', move_ids),
-                ])
-            if sale_line_ids:
-                for sale_line in sale_line_obj.browse(sale_line_ids):
-                    if sale_line.sale.id not in sale_ids:
-                        sale_ids.append(sale_line.sale.id)
+            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)
 
             with Transaction().set_user(0, set_context=True):
-                sale_obj.process(sale_ids)
-        return res
+                sales = Sale.browse([s.id for s in sales])
+            Sale.process(sales)
 
+    @classmethod
     @ModelView.button
     @Workflow.transition('draft')
-    def draft(self, ids):
-        for shipment in self.browse(ids):
+    def draft(cls, shipments):
+        for shipment in shipments:
             for move in shipment.outgoing_moves:
                 if move.state == 'cancel' and move.sale_line:
-                    self.raise_user_error('reset_move')
+                    cls.raise_user_error('reset_move')
 
-        return super(ShipmentOut, self).draft(ids)
+        return super(ShipmentOut, cls).draft(shipments)
 
-ShipmentOut()
 
+class ShipmentOutReturn:
+    __name__ = 'stock.shipment.out.return'
 
-class ShipmentOutReturn(ModelSQL, ModelView):
-    _name = 'stock.shipment.out.return'
-
-    def __init__(self):
-        super(ShipmentOutReturn, self).__init__()
-        self._error_messages.update({
+    @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.',
             })
 
-    def write(self, ids, vals):
-        sale_obj = Pool().get('sale.sale')
-        sale_line_obj = Pool().get('sale.line')
+    @classmethod
+    def write(cls, shipments, vals):
+        pool = Pool()
+        Sale = pool.get('sale.sale')
+        SaleLine = pool.get('sale.line')
 
-        res = super(ShipmentOutReturn, self).write(ids, vals)
+        super(ShipmentOutReturn, cls).write(shipments, vals)
 
         if 'state' in vals and vals['state'] == 'received':
-            sale_ids = []
+            sales = []
             move_ids = []
-            if isinstance(ids, (int, long)):
-                ids = [ids]
-            for shipment in self.browse(ids):
+            for shipment in shipments:
                 move_ids.extend([x.id for x in shipment.incoming_moves])
 
-            sale_line_ids = sale_line_obj.search([
-                ('moves', 'in', move_ids),
-                ])
-            if sale_line_ids:
-                for sale_line in sale_line_obj.browse(sale_line_ids):
-                    if sale_line.sale.id not in sale_ids:
-                        sale_ids.append(sale_line.sale.id)
+            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)
 
             with Transaction().set_user(0, set_context=True):
-                sale_obj.process(sale_ids)
-        return res
+                sales = Sale.browse([s.id for s in sales])
+            Sale.process(sales)
 
+    @classmethod
     @ModelView.button
     @Workflow.transition('draft')
-    def draft(self, ids):
-        for shipment in self.browse(ids):
+    def draft(cls, shipments):
+        for shipment in shipments:
             for move in shipment.incoming_moves:
                 if move.state == 'cancel' and move.sale_line:
-                    self.raise_user_error('reset_move')
+                    cls.raise_user_error('reset_move')
 
-        return super(ShipmentOutReturn, self).draft(ids)
+        return super(ShipmentOutReturn, cls).draft(shipments)
 
-ShipmentOutReturn()
-
-
-class Move(ModelSQL, ModelView):
-    _name = 'stock.move'
 
+class Move:
+    __name__ = 'stock.move'
     sale_line = fields.Many2One('sale.line', 'Sale Line', select=True,
         states={
             'readonly': Eval('state') != 'draft',
@@ -1795,197 +1599,118 @@ class Move(ModelSQL, ModelView):
         ('recreated', 'Recreated'),
         ], 'Exception State'), 'get_sale_exception_state')
 
-    def get_sale(self, ids, name):
-        res = {}
-        for move in self.browse(ids):
-            res[move.id] = None
-            if move.sale_line:
-                res[move.id] = move.sale_line.sale.id
-        return res
+    def get_sale(self, name):
+        if self.sale_line:
+            return self.sale_line.sale.id
 
-    def search_sale(self, name, clause):
+    @classmethod
+    def search_sale(cls, name, clause):
         return [('sale_line.' + name,) + clause[1:]]
 
-    def get_sale_exception_state(self, ids, name):
-        res = {}.fromkeys(ids, '')
-        for move in self.browse(ids):
-            if not move.sale_line:
-                continue
-            if move.id in (x.id for x in move.sale_line.moves_recreated):
-                res[move.id] = 'recreated'
-            if move.id in (x.id for x in move.sale_line.moves_ignored):
-                res[move.id] = 'ignored'
-        return res
-
-    def write(self, ids, vals):
-        sale_obj = Pool().get('sale.sale')
-        sale_line_obj = Pool().get('sale.line')
+    def get_sale_exception_state(self, name):
+        if not self.sale_line:
+            return ''
+        if self in self.sale_line.moves_recreated:
+            return 'recreated'
+        if self in self.sale_line.moves_ignored:
+            return 'ignored'
+        return ''
+
+    @classmethod
+    def write(cls, moves, vals):
+        pool = Pool()
+        Sale = pool.get('sale.sale')
+        SaleLine = pool.get('sale.line')
 
-        res = super(Move, self).write(ids, vals)
+        super(Move, cls).write(moves, vals)
         if 'state' in vals and vals['state'] in ('cancel',):
-            if isinstance(ids, (int, long)):
-                ids = [ids]
-            sale_ids = set()
-            sale_line_ids = sale_line_obj.search([
-                ('moves', 'in', ids),
-                ])
-            if sale_line_ids:
-                for sale_line in sale_line_obj.browse(sale_line_ids):
-                    sale_ids.add(sale_line.sale.id)
-            if sale_ids:
+            sales = set()
+            sale_lines = SaleLine.search([
+                    ('moves', 'in', [m.id for m in moves]),
+                    ])
+            if sale_lines:
+                for sale_line in sale_lines:
+                    sales.add(sale_line.sale)
+            if sales:
                 with Transaction().set_user(0, set_context=True):
-                    sale_obj.process(list(sale_ids))
-        return res
-
-    def delete(self, ids):
-        sale_obj = Pool().get('sale.sale')
-        sale_line_obj = Pool().get('sale.line')
+                    sales = Sale.browse([s.id for s in sales])
+                Sale.process(sales)
 
-        if isinstance(ids, (int, long)):
-            ids = [ids]
+    @classmethod
+    def delete(cls, moves):
+        pool = Pool()
+        Sale = pool.get('sale.sale')
+        SaleLine = pool.get('sale.line')
 
-        sale_ids = set()
-        sale_line_ids = sale_line_obj.search([
-            ('moves', 'in', ids),
-            ])
+        sales = set()
+        sale_lines = SaleLine.search([
+                ('moves', 'in', [m.id for m in moves]),
+                ])
 
-        res = super(Move, self).delete(ids)
+        super(Move, cls).delete(moves)
 
-        if sale_line_ids:
-            for sale_line in sale_line_obj.browse(sale_line_ids):
-                sale_ids.add(sale_line.sale.id)
-            if sale_ids:
+        if sale_lines:
+            for sale_line in sale_lines:
+                sales.add(sale_line.sale)
+            if sales:
                 with Transaction().set_user(0, set_context=True):
-                    sale_obj.process(list(sale_ids))
-        return res
-
-Move()
-
-
-class Invoice(ModelSQL, ModelView):
-    _name = 'account.invoice'
-
-    sale_exception_state = fields.Function(fields.Selection([
-        ('', ''),
-        ('ignored', 'Ignored'),
-        ('recreated', 'Recreated'),
-        ], 'Exception State'), 'get_sale_exception_state')
-
-    def __init__(self):
-        super(Invoice, self).__init__()
-        self._error_messages.update({
-            'delete_sale_invoice': 'You can not delete invoices '
-                    'that come from a sale!',
-            'reset_invoice_sale': 'You cannot reset to draft '
-                    'an invoice generated by a sale.',
-            })
-
-    @Workflow.transition('draft')
-    def draft(self, ids):
-        sale_obj = Pool().get('sale.sale')
-        sale_ids = sale_obj.search([
-            ('invoices', 'in', ids),
-            ])
-
-        if sale_ids:
-            self.raise_user_error('reset_invoice_sale')
-
-        return super(Invoice, self).draft(ids)
-
-    def get_sale_exception_state(self, ids, name):
-        sale_obj = Pool().get('sale.sale')
-        sale_ids = sale_obj.search([
-            ('invoices', 'in', ids),
-            ])
-
-        sales = sale_obj.browse(sale_ids)
-
-        recreated_ids = tuple(i.id for p in sales
-            for i in p.invoices_recreated)
-        ignored_ids = tuple(i.id for p in sales for i in p.invoices_ignored)
-
-        res = {}.fromkeys(ids, '')
-        for invoice in self.browse(ids):
-            if invoice.id in recreated_ids:
-                res[invoice.id] = 'recreated'
-            elif invoice.id in ignored_ids:
-                res[invoice.id] = 'ignored'
-
-        return res
-
-    def delete(self, ids):
-        if not ids:
-            return True
-        if isinstance(ids, (int, long)):
-            ids = [ids]
-        Transaction().cursor.execute('SELECT id FROM sale_invoices_rel '
-                'WHERE invoice IN (' + ','.join(('%s',) * len(ids)) + ')',
-                ids)
-        if Transaction().cursor.fetchone():
-            self.raise_user_error('delete_sale_invoice')
-        return super(Invoice, self).delete(ids)
-
-Invoice()
+                    sales = Sale.browse([s.id for s in sales])
+                Sale.process(list(sales))
 
 
 class OpenCustomer(Wizard):
     'Open Customers'
-    _name = 'sale.open_customer'
+    __name__ = 'sale.open_customer'
     start_state = 'open_'
     open_ = StateAction('party.act_party_form')
 
-    def do_open_(self, session, action):
+    def do_open_(self, action):
         pool = Pool()
-        model_data_obj = pool.get('ir.model.data')
-        wizard_obj = pool.get('ir.action.wizard')
-        Transaction().cursor.execute("SELECT DISTINCT(party) FROM sale_sale")
+        ModelData = pool.get('ir.model.data')
+        Wizard = pool.get('ir.action.wizard')
+        cursor = Transaction().cursor
+        cursor.execute("SELECT DISTINCT(party) FROM sale_sale")
         customer_ids = [line[0] for line in Transaction().cursor.fetchall()]
         action['pyson_domain'] = PYSONEncoder().encode(
             [('id', 'in', customer_ids)])
 
-        model_data_ids = model_data_obj.search([
-            ('fs_id', '=', 'act_open_customer'),
-            ('module', '=', 'sale'),
-            ('inherit', '=', None),
-            ], limit=1)
-        model_data = model_data_obj.browse(model_data_ids[0])
-        wizard = wizard_obj.browse(model_data.db_id)
+        model_data, = ModelData.search([
+                ('fs_id', '=', 'act_open_customer'),
+                ('module', '=', 'sale'),
+                ('inherit', '=', None),
+                ], limit=1)
+        wizard = Wizard(model_data.db_id)
 
         action['name'] = wizard.name
         return action, {}
 
-    def transition_open_(self, session):
+    def transition_open_(self):
         return 'end'
 
-OpenCustomer()
-
 
 class HandleShipmentExceptionAsk(ModelView):
     'Handle Shipment Exception'
-    _name = 'sale.handle.shipment.exception.ask'
-    _description = __doc__
-
+    __name__ = 'sale.handle.shipment.exception.ask'
     recreate_moves = fields.Many2Many(
         'stock.move', None, None, 'Recreate Moves',
         domain=[('id', 'in', Eval('domain_moves'))], depends=['domain_moves'])
     domain_moves = fields.Many2Many(
         'stock.move', None, None, 'Domain Moves')
 
-    def init(self, module_name):
+    @classmethod
+    def __register__(cls, module_name):
         cursor = Transaction().cursor
         # 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,))
-        super(HandleShipmentExceptionAsk, self).init(module_name)
-
-HandleShipmentExceptionAsk()
+        super(HandleShipmentExceptionAsk, cls).__register__(module_name)
 
 
 class HandleShipmentException(Wizard):
     'Handle Shipment Exception'
-    _name = 'sale.handle.shipment.exception'
+    __name__ = 'sale.handle.shipment.exception'
     start_state = 'ask'
     ask = StateView('sale.handle.shipment.exception.ask',
         'sale.handle_shipment_exception_ask_view_form', [
@@ -1994,59 +1719,53 @@ class HandleShipmentException(Wizard):
             ])
     handle = StateTransition()
 
-    def default_ask(self, session, fields):
-        sale_obj = Pool().get('sale.sale')
-        sale = sale_obj.browse(Transaction().context.get('active_id'))
+    def default_ask(self, fields):
+        Sale = Pool().get('sale.sale')
+        sale = Sale(Transaction().context.get('active_id'))
 
         moves = []
         for line in sale.lines:
-            skip_ids = set(x.id for x in line.moves_ignored)
-            skip_ids.update(x.id for x in line.moves_recreated)
+            skips = set(line.moves_ignored)
+            skips.update(line.moves_recreated)
             for move in line.moves:
-                if move.state == 'cancel' and move.id not in skip_ids:
+                if move.state == 'cancel' and move not in skips:
                     moves.append(move.id)
         return {
             'recreate_moves': moves,
             'domain_moves': moves,
             }
 
-    def transition_handle(self, session):
+    def transition_handle(self):
         pool = Pool()
-        sale_obj = pool.get('sale.sale')
-        sale_line_obj = pool.get('sale.line')
-        to_recreate = [x.id for x in session.ask.recreate_moves]
-        domain_moves = [x.id for x in session.ask.domain_moves]
+        Sale = pool.get('sale.sale')
+        SaleLine = pool.get('sale.line')
 
-        sale = sale_obj.browse(Transaction().context['active_id'])
+        sale = Sale(Transaction().context['active_id'])
 
         for line in sale.lines:
             moves_ignored = []
             moves_recreated = []
-            skip_ids = set(x.id for x in line.moves_ignored)
-            skip_ids.update(x.id for x in line.moves_recreated)
+            skips = set(line.moves_ignored)
+            skips.update(line.moves_recreated)
             for move in line.moves:
-                if move.id not in domain_moves or move.id in skip_ids:
+                if move not in self.ask.domain_moves or move in skips:
                     continue
-                if move.id in to_recreate:
+                if move in self.ask.recreate_moves:
                     moves_recreated.append(move.id)
                 else:
                     moves_ignored.append(move.id)
 
-            sale_line_obj.write(line.id, {
+            SaleLine.write([line], {
                     'moves_ignored': [('add', moves_ignored)],
                     'moves_recreated': [('add', moves_recreated)],
                     })
-        sale_obj.process([sale.id])
+        Sale.process([sale])
         return 'end'
 
-HandleShipmentException()
-
 
 class HandleInvoiceExceptionAsk(ModelView):
     'Handle Invoice Exception'
-    _name = 'sale.handle.invoice.exception.ask'
-    _description = __doc__
-
+    __name__ = 'sale.handle.invoice.exception.ask'
     recreate_invoices = fields.Many2Many(
         'account.invoice', None, None, 'Recreate Invoices',
         domain=[('id', 'in', Eval('domain_invoices'))],
@@ -2056,12 +1775,10 @@ class HandleInvoiceExceptionAsk(ModelView):
     domain_invoices = fields.Many2Many(
         'account.invoice', None, None, 'Domain Invoices')
 
-HandleInvoiceExceptionAsk()
-
 
 class HandleInvoiceException(Wizard):
     'Handle Invoice Exception'
-    _name = 'sale.handle.invoice.exception'
+    __name__ = 'sale.handle.invoice.exception'
     start_state = 'ask'
     ask = StateView('sale.handle.invoice.exception.ask',
         'sale.handle_invoice_exception_ask_view_form', [
@@ -2070,65 +1787,57 @@ class HandleInvoiceException(Wizard):
             ])
     handle = StateTransition()
 
-    def default_ask(self, session, fields):
-        sale_obj = Pool().get('sale.sale')
+    def default_ask(self, fields):
+        Sale = Pool().get('sale.sale')
 
-        sale = sale_obj.browse(Transaction().context['active_id'])
-        skip_ids = set(x.id for x in sale.invoices_ignored)
-        skip_ids.update(x.id for x in sale.invoices_recreated)
+        sale = Sale(Transaction().context['active_id'])
+        skips = set(sale.invoices_ignored)
+        skips.update(sale.invoices_recreated)
         invoices = []
         for invoice in sale.invoices:
-            if invoice.state == 'cancel' and invoice.id not in skip_ids:
+            if invoice.state == 'cancel' and invoice not in skips:
                 invoices.append(invoice.id)
         return {
-            'to_recreate': invoices,
+            'recreate_invoices': invoices,
             'domain_invoices': invoices,
             }
 
-    def transition_handle(self, session):
-        sale_obj = Pool().get('sale.sale')
-        to_recreate = [x.id for x in session.ask.recreate_invoices]
-        domain_invoices = [x.id for x in session.ask.domain_invoices]
+    def transition_handle(self):
+        Sale = Pool().get('sale.sale')
 
-        sale = sale_obj.browse(Transaction().context['active_id'])
+        sale = Sale(Transaction().context['active_id'])
 
-        skip_ids = set(x.id for x in sale.invoices_ignored)
-        skip_ids.update(x.id for x in sale.invoices_recreated)
+        skips = set(sale.invoices_ignored)
+        skips.update(sale.invoices_recreated)
         invoices_ignored = []
         invoices_recreated = []
         for invoice in sale.invoices:
-            if invoice.id not in domain_invoices or invoice.id in skip_ids:
+            if invoice not in self.ask.domain_invoices or invoice in skips:
                 continue
-            if invoice.id in to_recreate:
+            if invoice in self.ask.recreate_invoices:
                 invoices_recreated.append(invoice.id)
             else:
                 invoices_ignored.append(invoice.id)
 
-        sale_obj.write(sale.id, {
+        Sale.write([sale], {
                 'invoices_ignored': [('add', invoices_ignored)],
                 'invoices_recreated': [('add', invoices_recreated)],
                 })
-        sale_obj.process([sale.id])
+        Sale.process([sale])
         return 'end'
 
-HandleInvoiceException()
-
 
 class ReturnSale(Wizard):
-    _name = 'sale.return_sale'
+    __name__ = 'sale.return_sale'
     start_state = 'make_return'
     make_return = StateTransition()
 
-    def transition_make_return(self, session):
-        pool = Pool()
-        sale_obj = pool.get('sale.sale')
-        line_obj = pool.get('sale.line')
-
-        sale_id = Transaction().context['active_id']
-        new_sale_id = sale_obj.copy(sale_id)
-        new_line_ids = line_obj.search([('sale', '=', new_sale_id)])
-        for new_line in line_obj.browse(new_line_ids):
-            line_obj.write(new_line.id, {'quantity': -new_line.quantity})
-        return 'end'
+    def transition_make_return(self):
+        Sale = Pool().get('sale.sale')
 
-ReturnSale()
+        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'
diff --git a/sale.xml b/sale.xml
index 6267342..3aec278 100644
--- a/sale.xml
+++ b/sale.xml
@@ -89,25 +89,20 @@ this repository contains the full copyright notices and license terms. -->
                                 <label name="total_amount" xalign="1.0" xexpand="1"/>
                                 <field name="total_amount" xalign="1.0" xexpand="0"/>
                                 <group col="7" colspan="2" id="buttons">
-                                    <button name="cancel" type="object" string="Cancel"
+                                    <button name="cancel" string="Cancel"
                                         icon="tryton-cancel"/>
-                                    <button name="draft" type="object" string="Draft"
-                                        icon="tryton-go-previous"/>
-                                    <button name="quote" type="object" string="Quote"
+                                    <button name="draft" string="Draft"/>
+                                    <button name="quote" string="Quote"
                                         icon="tryton-go-next"/>
-                                    <button name="%(wizard_invoice_handle_exception)d"
-                                            string="Handle Invoice Exception"
-                                            type="action"
-                                            states="{'invisible': Or(Not(Equal(Eval('invoice_state'), 'exception')), Equal(Eval('state'), 'cancel')), 'readonly': Not(In(%(group_sale)d, Eval('groups', [])))}"
-                                            icon="tryton-go-next"/>
-                                    <button name="%(wizard_shipment_handle_exception)d"
-                                            type="action"
-                                            string="Handle Shipment Exception"
-                                            states="{'invisible': Or(Not(Equal(Eval('shipment_state'), 'exception')), Equal(Eval('state'), 'cancel')), 'readonly': Not(In(%(group_sale)d, Eval('groups', [])))}"
-                                            icon="tryton-go-next"/>
-                                    <button name="confirm" type="object" string="Confirm"
+                                    <button name="handle_invoice_exception"
+                                        string="Handle Invoice Exception"
                                         icon="tryton-go-next"/>
-                                    <button name="process" type="object" string="Process"
+                                    <button name="handle_shipment_exception"
+                                        string="Handle Shipment Exception"
+                                        icon="tryton-go-next"/>
+                                    <button name="confirm" string="Confirm"
+                                        icon="tryton-go-next"/>
+                                    <button name="process" string="Process"
                                         icon="tryton-go-next"/>
                                 </group>
                             </group>
@@ -634,5 +629,14 @@ this repository contains the full copyright notices and license terms. -->
             <field name="perm_delete" eval="False"/>
         </record>
 
+        <record model="ir.model.access" id="access_shipment_out_return_group_sale">
+            <field name="model" search="[('model', '=', 'stock.shipment.out.return')]"/>
+            <field name="group" ref="group_sale"/>
+            <field name="perm_read" eval="True"/>
+            <field name="perm_write" eval="False"/>
+            <field name="perm_create" eval="False"/>
+            <field name="perm_delete" eval="False"/>
+        </record>
+
     </data>
 </tryton>
diff --git a/setup.py b/setup.py
index 4466f62..3595673 100644
--- a/setup.py
+++ b/setup.py
@@ -4,8 +4,19 @@
 
 from setuptools import setup
 import re
+import os
+import ConfigParser
 
-info = eval(open('__tryton__.py').read())
+
+def read(fname):
+    return open(os.path.join(os.path.dirname(__file__), fname)).read()
+
+config = ConfigParser.ConfigParser()
+config.readfp(open('tryton.cfg'))
+info = dict(config.items('tryton'))
+for key in ('depends', 'extras_depend', 'xml'):
+    if key in info:
+        info[key] = info[key].strip().splitlines()
 major_version, minor_version, _ = info.get('version', '0.0.1').split('.', 2)
 major_version = int(major_version)
 minor_version = int(minor_version)
@@ -24,22 +35,21 @@ tests_require = ['proteus >= %s.%s, < %s.%s' %
 
 setup(name='trytond_sale',
     version=info.get('version', '0.0.1'),
-    description=info.get('description', ''),
-    author=info.get('author', ''),
-    author_email=info.get('email', ''),
-    url=info.get('website', ''),
+    description='Tryton module for sale',
+    long_description=read('README'),
+    author='Tryton',
+    url='http://www.tryton.org/',
     download_url="http://downloads.tryton.org/" + \
-            info.get('version', '0.0.1').rsplit('.', 1)[0] + '/',
+        info.get('version', '0.0.1').rsplit('.', 1)[0] + '/',
     package_dir={'trytond.modules.sale': '.'},
     packages=[
         'trytond.modules.sale',
         'trytond.modules.sale.tests',
-    ],
+        ],
     package_data={
         'trytond.modules.sale': info.get('xml', []) \
-                + info.get('translation', []) \
-                + ['sale.odt'],
-    },
+            + ['tryton.cfg', 'locale/*.po', 'sale.odt', 'tests/*.rst'],
+        },
     classifiers=[
         'Development Status :: 5 - Production/Stable',
         'Environment :: Plugins',
@@ -61,7 +71,7 @@ setup(name='trytond_sale',
         'Programming Language :: Python :: 2.7',
         'Topic :: Office/Business',
         'Topic :: Office/Business :: Financial :: Accounting',
-    ],
+        ],
     license='GPL-3',
     install_requires=requires,
     zip_safe=False,
@@ -71,5 +81,5 @@ setup(name='trytond_sale',
     """,
     test_suite='tests',
     test_loader='trytond.test_loader:Loader',
-    test_require=tests_require,
-)
+    tests_require=tests_require,
+    )
diff --git a/tests/scenario_sale.rst b/tests/scenario_sale.rst
new file mode 100644
index 0000000..77a1330
--- /dev/null
+++ b/tests/scenario_sale.rst
@@ -0,0 +1,436 @@
+=============
+Sale Scenario
+=============
+
+Imports::
+
+    >>> import datetime
+    >>> from dateutil.relativedelta import relativedelta
+    >>> from decimal import Decimal
+    >>> from operator import attrgetter
+    >>> from proteus import config, Model, Wizard
+    >>> today = datetime.date.today()
+
+Create database::
+
+    >>> config = config.set_trytond()
+    >>> config.pool.test = True
+
+Install sale::
+
+    >>> Module = Model.get('ir.module.module')
+    >>> sale_module, = Module.find([('name', '=', 'sale')])
+    >>> Module.install([sale_module.id], config.context)
+    >>> Wizard('ir.module.module.install_upgrade').execute('upgrade')
+
+Create company::
+
+    >>> Currency = Model.get('currency.currency')
+    >>> CurrencyRate = Model.get('currency.currency.rate')
+    >>> currencies = Currency.find([('code', '=', 'EUR')])
+    >>> if not currencies:
+    ...     currency = Currency(name='Euro', symbol=u'€', code='EUR',
+    ...         rounding=Decimal('0.01'), mon_grouping='[3, 3, 0]',
+    ...         mon_decimal_point=',')
+    ...     currency.save()
+    ...     CurrencyRate(date=today + relativedelta(month=1, day=1),
+    ...         rate=Decimal('1.0'), currency=currency).save()
+    ... else:
+    ...     currency, = currencies
+    >>> Company = Model.get('company.company')
+    >>> company_config = Wizard('company.company.config')
+    >>> company_config.execute('company')
+    >>> company = company_config.form
+    >>> company.name = 'B2CK'
+    >>> company.currency = currency
+    >>> company_config.execute('add')
+    >>> company, = Company.find([])
+
+Reload the context::
+
+    >>> User = Model.get('res.user')
+    >>> config._context = User.get_preferences(True, config.context)
+
+Create fiscal year::
+
+    >>> FiscalYear = Model.get('account.fiscalyear')
+    >>> Sequence = Model.get('ir.sequence')
+    >>> SequenceStrict = Model.get('ir.sequence.strict')
+    >>> fiscalyear = FiscalYear(name=str(today.year))
+    >>> fiscalyear.start_date = today + relativedelta(month=1, day=1)
+    >>> fiscalyear.end_date = today + relativedelta(month=12, day=31)
+    >>> fiscalyear.company = company
+    >>> post_move_seq = Sequence(name=str(today.year), code='account.move',
+    ...     company=company)
+    >>> post_move_seq.save()
+    >>> fiscalyear.post_move_sequence = post_move_seq
+    >>> invoice_seq = SequenceStrict(name=str(today.year),
+    ...     code='account.invoice', company=company)
+    >>> invoice_seq.save()
+    >>> fiscalyear.out_invoice_sequence = invoice_seq
+    >>> fiscalyear.in_invoice_sequence = invoice_seq
+    >>> fiscalyear.out_credit_note_sequence = invoice_seq
+    >>> fiscalyear.in_credit_note_sequence = invoice_seq
+    >>> fiscalyear.save()
+    >>> FiscalYear.create_period([fiscalyear.id], config.context)
+
+Create chart of accounts::
+
+    >>> AccountTemplate = Model.get('account.account.template')
+    >>> Account = Model.get('account.account')
+    >>> account_template, = AccountTemplate.find([('parent', '=', False)])
+    >>> create_chart = Wizard('account.create_chart')
+    >>> create_chart.execute('account')
+    >>> create_chart.form.account_template = account_template
+    >>> create_chart.form.company = company
+    >>> create_chart.execute('create_account')
+    >>> receivable, = Account.find([
+    ...         ('kind', '=', 'receivable'),
+    ...         ('company', '=', company.id),
+    ...         ])
+    >>> payable, = Account.find([
+    ...         ('kind', '=', 'payable'),
+    ...         ('company', '=', company.id),
+    ...         ])
+    >>> revenue, = Account.find([
+    ...         ('kind', '=', 'revenue'),
+    ...         ('company', '=', company.id),
+    ...         ])
+    >>> expense, = Account.find([
+    ...         ('kind', '=', 'expense'),
+    ...         ('company', '=', company.id),
+    ...         ])
+    >>> create_chart.form.account_receivable = receivable
+    >>> create_chart.form.account_payable = payable
+    >>> create_chart.execute('create_properties')
+
+Create parties::
+
+    >>> Party = Model.get('party.party')
+    >>> supplier = Party(name='Supplier')
+    >>> supplier.save()
+    >>> customer = Party(name='Customer')
+    >>> customer.save()
+
+Create category::
+
+    >>> ProductCategory = Model.get('product.category')
+    >>> category = ProductCategory(name='Category')
+    >>> category.save()
+
+Create product::
+
+    >>> ProductUom = Model.get('product.uom')
+    >>> unit, = ProductUom.find([('name', '=', 'Unit')])
+    >>> Product = Model.get('product.product')
+    >>> product = Product()
+    >>> product.name = 'product'
+    >>> product.category = category
+    >>> product.default_uom = unit
+    >>> product.type = 'goods'
+    >>> product.purchasable = True
+    >>> product.salable = True
+    >>> product.list_price = Decimal('10')
+    >>> product.cost_price = Decimal('5')
+    >>> product.cost_price_method = 'fixed'
+    >>> product.account_expense = expense
+    >>> product.account_revenue = revenue
+    >>> product.save()
+
+Create payment term::
+
+    >>> PaymentTerm = Model.get('account.invoice.payment_term')
+    >>> PaymentTermLine = Model.get('account.invoice.payment_term.line')
+    >>> payment_term = PaymentTerm(name='Direct')
+    >>> payment_term_line = PaymentTermLine(type='remainder', days=0)
+    >>> payment_term.lines.append(payment_term_line)
+    >>> payment_term.save()
+
+Create an Inventory::
+
+    >>> Inventory = Model.get('stock.inventory')
+    >>> InventoryLine = Model.get('stock.inventory.line')
+    >>> Location = Model.get('stock.location')
+    >>> storage, = Location.find([
+    ...         ('code', '=', 'STO'),
+    ...         ])
+    >>> inventory = Inventory()
+    >>> inventory.location = storage
+    >>> inventory.save()
+    >>> inventory_line = InventoryLine(product=product, inventory=inventory)
+    >>> inventory_line.quantity = 100.0
+    >>> inventory_line.expected_quantity = 0.0
+    >>> inventory.save()
+    >>> inventory_line.save()
+    >>> Inventory.confirm([inventory.id], config.context)
+    >>> inventory.state
+    u'done'
+
+Sale 5 products::
+
+    >>> Sale = Model.get('sale.sale')
+    >>> SaleLine = Model.get('sale.line')
+    >>> sale = Sale()
+    >>> sale.party = customer
+    >>> sale.payment_term = payment_term
+    >>> sale.invoice_method = 'order'
+    >>> sale_line = SaleLine()
+    >>> sale.lines.append(sale_line)
+    >>> sale_line.product = product
+    >>> sale_line.quantity = 2.0
+    >>> sale_line = SaleLine()
+    >>> sale.lines.append(sale_line)
+    >>> sale_line.type = 'comment'
+    >>> sale_line.description = 'Comment'
+    >>> sale_line = SaleLine()
+    >>> sale.lines.append(sale_line)
+    >>> sale_line.product = product
+    >>> sale_line.quantity = 3.0
+    >>> sale.save()
+    >>> Sale.quote([sale.id], config.context)
+    >>> Sale.confirm([sale.id], config.context)
+    >>> Sale.process([sale.id], config.context)
+    >>> sale.state
+    u'processing'
+    >>> sale.reload()
+    >>> len(sale.shipments), len(sale.shipment_returns), len(sale.invoices)
+    (1, 0, 1)
+
+Sale 5 products with an invoice method 'on shipment'::
+
+    >>> Sale = Model.get('sale.sale')
+    >>> SaleLine = Model.get('sale.line')
+    >>> sale = Sale()
+    >>> sale.party = customer
+    >>> sale.payment_term = payment_term
+    >>> sale.invoice_method = 'shipment'
+    >>> sale_line = SaleLine()
+    >>> sale.lines.append(sale_line)
+    >>> sale_line.product = product
+    >>> sale_line.quantity = 2.0
+    >>> sale_line = SaleLine()
+    >>> sale.lines.append(sale_line)
+    >>> sale_line.type = 'comment'
+    >>> sale_line.description = 'Comment'
+    >>> sale_line = SaleLine()
+    >>> sale.lines.append(sale_line)
+    >>> sale_line.product = product
+    >>> sale_line.quantity = 3.0
+    >>> sale.save()
+    >>> Sale.quote([sale.id], config.context)
+    >>> Sale.confirm([sale.id], config.context)
+    >>> Sale.process([sale.id], config.context)
+    >>> sale.state
+    u'processing'
+    >>> sale.reload()
+    >>> len(sale.shipments), len(sale.shipment_returns), len(sale.invoices)
+    (1, 0, 0)
+
+Validate Shipments::
+
+    >>> sale.reload()
+    >>> ShipmentOut = Model.get('stock.shipment.out')
+    >>> shipment, = sale.shipments
+    >>> ShipmentOut.assign_try([shipment.id], config.context)
+    True
+    >>> ShipmentOut.pack([shipment.id], config.context)
+    >>> ShipmentOut.done([shipment.id], config.context)
+
+Open customer invoice::
+
+    >>> sale.reload()
+    >>> Invoice = Model.get('account.invoice')
+    >>> invoice, = sale.invoices
+    >>> invoice.type
+    u'out_invoice'
+    >>> len(invoice.lines)
+    2
+    >>> Invoice.open([invoice.id], config.context)
+    >>> invoice.reload()
+    >>> invoice.state
+    u'open'
+    >>> 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
+
+Create a Return::
+
+    >>> return_ = Sale()
+    >>> return_.party = customer
+    >>> return_.payment_term = payment_term
+    >>> return_.invoice_method = 'shipment'
+    >>> return_line = SaleLine()
+    >>> return_.lines.append(return_line)
+    >>> return_line.product = product
+    >>> return_line.quantity = -4.
+    >>> return_line = SaleLine()
+    >>> return_.lines.append(return_line)
+    >>> return_line.type = 'comment'
+    >>> return_line.description = 'Comment'
+    >>> return_.save()
+    >>> Sale.quote([return_.id], config.context)
+    >>> Sale.confirm([return_.id], config.context)
+    >>> Sale.process([return_.id], config.context)
+    >>> return_.state
+    u'processing'
+    >>> return_.reload()
+    >>> (len(return_.shipments), len(return_.shipment_returns),
+    ...     len(return_.invoices))
+    (0, 1, 0)
+
+Check Return Shipments::
+
+    >>> return_.reload()
+    >>> ShipmentReturn = Model.get('stock.shipment.out.return')
+    >>> ship_return, = return_.shipment_returns
+    >>> ShipmentReturn.receive([ship_return.id], config.context)
+    >>> move_return, = ship_return.incoming_moves
+    >>> move_return.product.name
+    u'product'
+    >>> move_return.quantity
+    4.0
+
+Open customer credit note::
+
+    >>> return_.reload()
+    >>> credit_note, = return_.invoices
+    >>> credit_note.type
+    u'out_credit_note'
+    >>> len(credit_note.lines)
+    1
+    >>> Invoice.open([credit_note.id], config.context)
+    >>> credit_note.reload()
+    >>> credit_note.state
+    u'open'
+    >>> 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::
+
+    >>> mix = Sale()
+    >>> mix.party = customer
+    >>> mix.payment_term = payment_term
+    >>> mix.invoice_method = 'order'
+    >>> mixline = SaleLine()
+    >>> mix.lines.append(mixline)
+    >>> mixline.product = product
+    >>> mixline.quantity = 7.
+    >>> mixline_comment = SaleLine()
+    >>> mix.lines.append(mixline_comment)
+    >>> mixline_comment.type = 'comment'
+    >>> mixline_comment.description = 'Comment'
+    >>> mixline2 = SaleLine()
+    >>> mix.lines.append(mixline2)
+    >>> mixline2.product = product
+    >>> mixline2.quantity = -2.
+    >>> mix.save()
+    >>> Sale.quote([mix.id], config.context)
+    >>> Sale.confirm([mix.id], config.context)
+    >>> Sale.process([mix.id], config.context)
+    >>> mix.state
+    u'processing'
+    >>> mix.reload()
+    >>> len(mix.shipments), len(mix.shipment_returns), len(mix.invoices)
+    (1, 1, 2)
+
+Checking Shipments::
+
+    >>> mix.reload()
+    >>> mix_returns, = mix.shipment_returns
+    >>> mix_shipments, = mix.shipments
+    >>> ShipmentReturn.receive([mix_returns.id], config.context)
+    >>> move_return, = mix_returns.incoming_moves
+    >>> move_return.product.name
+    u'product'
+    >>> move_return.quantity
+    2.0
+    >>> ShipmentOut.assign_try([mix_shipments.id], config.context)
+    True
+    >>> ShipmentOut.pack([mix_shipments.id], config.context)
+    >>> ShipmentOut.done([mix_shipments.id], config.context)
+    >>> move_shipment, = mix_shipments.outgoing_moves
+    >>> move_shipment.product.name
+    u'product'
+    >>> move_shipment.quantity
+    7.0
+
+Checking the invoice::
+
+    >>> mix.reload()
+    >>> mix_invoice, mix_credit_note = sorted(mix.invoices,
+    ...     key=attrgetter('type'), reverse=True)
+    >>> mix_invoice.type, mix_credit_note.type
+    (u'out_invoice', u'out_credit_note')
+    >>> len(mix_invoice.lines), len(mix_credit_note.lines)
+    (1, 1)
+    >>> Invoice.open([mix_invoice.id], config.context)
+    >>> mix_invoice.reload()
+    >>> mix_invoice.state
+    u'open'
+    >>> Invoice.open([mix_credit_note.id], config.context)
+    >>> mix_credit_note.reload()
+    >>> mix_credit_note.state
+    u'open'
+    >>> 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'::
+
+    >>> mix = Sale()
+    >>> mix.party = customer
+    >>> mix.payment_term = payment_term
+    >>> mix.invoice_method = 'shipment'
+    >>> mixline = SaleLine()
+    >>> mix.lines.append(mixline)
+    >>> mixline.product = product
+    >>> mixline.quantity = 6.
+    >>> mixline_comment = SaleLine()
+    >>> mix.lines.append(mixline_comment)
+    >>> mixline_comment.type = 'comment'
+    >>> mixline_comment.description = 'Comment'
+    >>> mixline2 = SaleLine()
+    >>> mix.lines.append(mixline2)
+    >>> mixline2.product = product
+    >>> mixline2.quantity = -3.
+    >>> mix.save()
+    >>> Sale.quote([mix.id], config.context)
+    >>> Sale.confirm([mix.id], config.context)
+    >>> Sale.process([mix.id], config.context)
+    >>> mix.state
+    u'processing'
+    >>> mix.reload()
+    >>> len(mix.shipments), len(mix.shipment_returns), len(mix.invoices)
+    (1, 1, 0)
+
+Checking Shipments::
+
+    >>> mix.reload()
+    >>> mix_returns, = mix.shipment_returns
+    >>> mix_shipments, = mix.shipments
+    >>> ShipmentReturn.receive([mix_returns.id], config.context)
+    >>> move_return, = mix_returns.incoming_moves
+    >>> move_return.product.name
+    u'product'
+    >>> move_return.quantity
+    3.0
+    >>> ShipmentOut.assign_try([mix_shipments.id], config.context)
+    True
+    >>> ShipmentOut.pack([mix_shipments.id], config.context)
+    >>> move_shipment, = mix_shipments.outgoing_moves
+    >>> move_shipment.product.name
+    u'product'
+    >>> move_shipment.quantity
+    6.0
diff --git a/tryton.cfg b/tryton.cfg
new file mode 100644
index 0000000..4f672fe
--- /dev/null
+++ b/tryton.cfg
@@ -0,0 +1,19 @@
+[tryton]
+version=2.6.0
+depends:
+    account
+    account_invoice
+    account_product
+    company
+    currency
+    ir
+    party
+    product
+    res
+    stock
+xml:
+    sale.xml
+    configuration.xml
+    party.xml
+    stock.xml
+    product.xml
diff --git a/trytond_sale.egg-info/PKG-INFO b/trytond_sale.egg-info/PKG-INFO
index 8423189..0166c57 100644
--- a/trytond_sale.egg-info/PKG-INFO
+++ b/trytond_sale.egg-info/PKG-INFO
@@ -1,27 +1,48 @@
 Metadata-Version: 1.0
 Name: trytond-sale
-Version: 2.4.1
-Summary: Define sale order.
-Add to product sale informations.
-Define the sale price as the list price.
-
-With the possibilities:
-    - to follow invoice and shipment states from the sale order.
-    - to define invoice method:
-        - Manual
-        - On Order Processed
-        - On shipment Sent
-    - to define shipment method:
-        - Manual
-        - On Order Processed
-        - On Invoice Paid
-
+Version: 2.6.0
+Summary: Tryton module for sale
 Home-page: http://www.tryton.org/
-Author: B2CK
-Author-email: info at b2ck.com
+Author: Tryton
+Author-email: UNKNOWN
 License: GPL-3
-Download-URL: http://downloads.tryton.org/2.4/
-Description: UNKNOWN
+Download-URL: http://downloads.tryton.org/2.6/
+Description: trytond_sale
+        ============
+        
+        The sale module of the Tryton application platform.
+        
+        Installing
+        ----------
+        
+        See INSTALL
+        
+        Support
+        -------
+        
+        If you encounter any problems with Tryton, please don't hesitate to ask
+        questions on the Tryton bug tracker, mailing list, wiki or IRC channel:
+        
+          http://bugs.tryton.org/
+          http://groups.tryton.org/
+          http://wiki.tryton.org/
+          irc://irc.freenode.net/tryton
+        
+        License
+        -------
+        
+        See LICENSE
+        
+        Copyright
+        ---------
+        
+        See COPYRIGHT
+        
+        
+        For more information please visit the Tryton web site:
+        
+          http://www.tryton.org/
+        
 Platform: UNKNOWN
 Classifier: Development Status :: 5 - Production/Stable
 Classifier: Environment :: Plugins
diff --git a/trytond_sale.egg-info/SOURCES.txt b/trytond_sale.egg-info/SOURCES.txt
index 8a0843f..5c7d08e 100644
--- a/trytond_sale.egg-info/SOURCES.txt
+++ b/trytond_sale.egg-info/SOURCES.txt
@@ -12,8 +12,8 @@ sale.odt
 sale.xml
 setup.py
 stock.xml
+tryton.cfg
 ./__init__.py
-./__tryton__.py
 ./configuration.py
 ./invoice.py
 ./sale.py
@@ -30,6 +30,7 @@ locale/es_ES.po
 locale/fr_FR.po
 locale/nl_NL.po
 locale/ru_RU.po
+tests/scenario_sale.rst
 trytond_sale.egg-info/PKG-INFO
 trytond_sale.egg-info/SOURCES.txt
 trytond_sale.egg-info/dependency_links.txt
diff --git a/trytond_sale.egg-info/requires.txt b/trytond_sale.egg-info/requires.txt
index a073a56..f0ae06a 100644
--- a/trytond_sale.egg-info/requires.txt
+++ b/trytond_sale.egg-info/requires.txt
@@ -1,9 +1,9 @@
-trytond_company >= 2.4, < 2.5
-trytond_party >= 2.4, < 2.5
-trytond_stock >= 2.4, < 2.5
-trytond_account >= 2.4, < 2.5
-trytond_product >= 2.4, < 2.5
-trytond_account_invoice >= 2.4, < 2.5
-trytond_currency >= 2.4, < 2.5
-trytond_account_product >= 2.4, < 2.5
-trytond >= 2.4, < 2.5
\ No newline at end of file
+trytond_account >= 2.6, < 2.7
+trytond_account_invoice >= 2.6, < 2.7
+trytond_account_product >= 2.6, < 2.7
+trytond_company >= 2.6, < 2.7
+trytond_currency >= 2.6, < 2.7
+trytond_party >= 2.6, < 2.7
+trytond_product >= 2.6, < 2.7
+trytond_stock >= 2.6, < 2.7
+trytond >= 2.6, < 2.7
\ No newline at end of file
commit 0fedf26a74c02e44ca34e4b1110e7ed58b04562a
Author: Mathias Behrle <mathiasb at m9s.biz>
Date:   Tue Sep 18 16:07:24 2012 +0200

    Releasing debian version 2.4.1-2.

diff --git a/debian/changelog b/debian/changelog
index da0ec4d..1090fdb 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -1,3 +1,17 @@
+tryton-modules-sale (2.4.1-2) experimental; urgency=low
+
+  [ Daniel Baumann ]
+  * Updating maintainers field.
+  * Updating vcs fields.
+  * Correcting copyright file to match format version 1.0.
+  * Switching to xz compression.
+  * Updating to debhelper version 9.
+
+  [ Mathias Behrle ]
+  * Merging branch debian-wheezy-2.2 (Closes: #687757).
+
+ -- Mathias Behrle <mathiasb at m9s.biz>  Tue, 18 Sep 2012 13:43:00 +0200
+
 tryton-modules-sale (2.4.1-1) experimental; urgency=low
 
   * Merging upstream version 2.4.1.
commit 70ae7f465144a036fc21bb07bb7af7a1f7185d19
Author: Daniel Baumann <daniel at debian.org>
Date:   Sat Jun 30 18:02:29 2012 +0200

    Updating to debhelper version 9.

diff --git a/debian/compat b/debian/compat
index 45a4fb7..ec63514 100644
--- a/debian/compat
+++ b/debian/compat
@@ -1 +1 @@
-8
+9
diff --git a/debian/control b/debian/control
index 6ae409c..ad4a761 100644
--- a/debian/control
+++ b/debian/control
@@ -4,7 +4,7 @@ Priority: optional
 Maintainer: Debian Tryton Maintainers <maintainers at debian.tryton.org>
 Uploaders: Daniel Baumann <daniel at debian.org>, Mathias Behrle <mathiasb at m9s.biz>
 Dm-Upload-Allowed: yes
-Build-Depends: debhelper (>= 8), python (>= 2.6.6-3~), python-setuptools
+Build-Depends: debhelper (>= 9), python (>= 2.6.6-3~), python-setuptools
 Standards-Version: 3.9.3
 Homepage: http://www.tryton.org/
 Vcs-Browser: http://debian.tryton.org/gitweb/?p=packages/tryton-modules-sale.git
commit 203353643ec9ab895c08acd375d0df5b7e599bef
Author: Daniel Baumann <daniel at debian.org>
Date:   Sat Jun 30 17:54:37 2012 +0200

    Switching to xz compression.

diff --git a/debian/rules b/debian/rules
index e32b791..1ae0776 100755
--- a/debian/rules
+++ b/debian/rules
@@ -7,3 +7,6 @@ override_dh_auto_clean:
 	dh_auto_clean
 
 	rm -rf *.egg-info
+
+override_dh_builddeb:
+	dh_builddeb -- -Zxz -z9
diff --git a/debian/source/options b/debian/source/options
index d053b65..22a4de9 100644
--- a/debian/source/options
+++ b/debian/source/options
@@ -1,2 +1,2 @@
-compression = gzip
+compression = xz
 compression-level = 9
commit 990c515b8c808e847a60469476e7e440da8ac3bb
Author: Daniel Baumann <daniel at debian.org>
Date:   Sat Jun 30 17:50:24 2012 +0200

    Correcting copyright file to match format version 1.0.

diff --git a/debian/copyright b/debian/copyright
index 936d353..2013fc4 100644
--- a/debian/copyright
+++ b/debian/copyright
@@ -2,16 +2,16 @@ Format: http://www.debian.org/doc/packaging-manuals/copyright-format/1.0/
 
 Files: *
 Copyright:
- (C) 2004-2008 Tiny SPRL
- (C) 2008-2012 Cedric Krier
- (C) 2008-2012 Bertrand Chenal
- (C) 2008-2012 B2CK SPRL
+           2004-2008 Tiny SPRL
+           2008-2012 Cedric Krier
+           2008-2012 Bertrand Chenal
+           2008-2012 B2CK SPRL
 License: GPL-3+
 
 Files: debian/*
 Copyright:
- (C) 2009-2012 Daniel Baumann <daniel at debian.org>
- (C) 2012 Mathias Behrle <mathiasb at m9s.biz>
+           2009-2012 Daniel Baumann <daniel at debian.org>
+           2012 Mathias Behrle <mathiasb at m9s.biz>
 License: GPL-3+
 
 License: GPL-3+
commit c8db6ba4b4cfb1e5567b3f6da1c5aa42b467e4e7
Author: Daniel Baumann <daniel at 127011.net>
Date:   Sat Jun 30 16:55:04 2012 +0200

    Updating vcs fields.

diff --git a/debian/control b/debian/control
index b8698a5..6ae409c 100644
--- a/debian/control
+++ b/debian/control
@@ -7,8 +7,8 @@ Dm-Upload-Allowed: yes
 Build-Depends: debhelper (>= 8), python (>= 2.6.6-3~), python-setuptools
 Standards-Version: 3.9.3
 Homepage: http://www.tryton.org/
-Vcs-Browser: http://git.debian-maintainers.org/?p=tryton/tryton-modules-sale.git
-Vcs-Git: git://git.debian-maintainers.org/git/tryton/tryton-modules-sale.git
+Vcs-Browser: http://debian.tryton.org/gitweb/?p=packages/tryton-modules-sale.git
+Vcs-Git: git://debian.tryton.org/git/packages/tryton-modules-sale.git
 X-Python-Version: >= 2.6
 
 Package: tryton-modules-sale
commit b16614816509b91e830f895c8fef0e99cdfcc432
Author: Daniel Baumann <daniel at 127011.net>
Date:   Sat Jun 30 16:52:31 2012 +0200

    Updating maintainers field.

diff --git a/debian/control b/debian/control
index 92feaea..b8698a5 100644
--- a/debian/control
+++ b/debian/control
@@ -1,7 +1,7 @@
 Source: tryton-modules-sale
 Section: python
 Priority: optional
-Maintainer: Debian Tryton Maintainers <tryton at lists.debian-maintainers.org>
+Maintainer: Debian Tryton Maintainers <maintainers at debian.tryton.org>
 Uploaders: Daniel Baumann <daniel at debian.org>, Mathias Behrle <mathiasb at m9s.biz>
 Dm-Upload-Allowed: yes
 Build-Depends: debhelper (>= 8), python (>= 2.6.6-3~), python-setuptools
commit 3212004d65d319b2fe83793ad3075bfd3c70b895
Author: Mathias Behrle <mathiasb at m9s.biz>
Date:   Tue Sep 11 14:27:43 2012 +0200

    Releasing debian version 2.4.1-1.

diff --git a/debian/changelog b/debian/changelog
index 33a7117..da0ec4d 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -1,3 +1,9 @@
+tryton-modules-sale (2.4.1-1) experimental; urgency=low
+
+  * Merging upstream version 2.4.1.
+
+ -- Mathias Behrle <mathiasb at m9s.biz>  Tue, 11 Sep 2012 13:19:44 +0200
+
 tryton-modules-sale (2.4.0-1) experimental; urgency=low
 
   * Updating to Standards-Version: 3.9.3, no changes needed.
commit 06b6e3ac11b8755b41b2c5a70d672db116392590
Author: Mathias Behrle <mathiasb at m9s.biz>
Date:   Tue Sep 11 13:16:50 2012 +0200

    Merging upstream version 2.4.1.

diff --git a/CHANGELOG b/CHANGELOG
index a637465..e4a20c2 100644
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -1,3 +1,6 @@
+Version 2.4.1 - 2012-09-02
+* Bug fixes (see mercurial logs for details)
+
 Version 2.4.0 - 2012-04-24
 * Bug fixes (see mercurial logs for details)
 * Manage negative amounts in sale
diff --git a/PKG-INFO b/PKG-INFO
index f40bcdc..5a0dfef 100644
--- a/PKG-INFO
+++ b/PKG-INFO
@@ -1,6 +1,6 @@
 Metadata-Version: 1.0
 Name: trytond_sale
-Version: 2.4.0
+Version: 2.4.1
 Summary: Define sale order.
 Add to product sale informations.
 Define the sale price as the list price.
diff --git a/__tryton__.py b/__tryton__.py
index f922dea..7286016 100644
--- a/__tryton__.py
+++ b/__tryton__.py
@@ -10,7 +10,7 @@
     'name_es_ES': 'Ventas',
     'name_fr_FR': 'Vente',
     'name_nl_NL': 'Verkoop',
-    'version': '2.4.0',
+    'version': '2.4.1',
     'author': 'B2CK',
     'email': 'info at b2ck.com',
     'website': 'http://www.tryton.org/',
diff --git a/sale.py b/sale.py
index 91aa373..2f59e78 100644
--- a/sale.py
+++ b/sale.py
@@ -184,10 +184,7 @@ class Sale(Workflow, ModelSQL, ModelView):
                 ))
         self._buttons.update({
                 'cancel': {
-                    'invisible': ((Eval('state') == 'cancel')
-                        | (~Eval('state').in_(['draft', 'quotation'])
-                            & (Eval('invoice_state') != 'exception')
-                            & (Eval('shipment_state') != 'exception'))),
+                    'invisible': ~Eval('state').in_(['draft', 'quotation']),
                     },
                 'draft': {
                     'invisible': Eval('state') != 'quotation',
@@ -207,6 +204,10 @@ class Sale(Workflow, ModelSQL, ModelView):
         self._states_cached = ['confirmed', 'processing', 'done', 'cancel']
 
     def init(self, module_name):
+        pool = Pool()
+        sale_line_obj = pool.get('sale.line')
+        sale_line_invoice_line_obj = pool.get('sale.line-account.invoice.line')
+        move_obj = pool.get('stock.move')
         cursor = Transaction().cursor
         # Migration from 1.2: packing renamed into shipment
         cursor.execute("UPDATE ir_model_data "
@@ -236,14 +237,28 @@ class Sale(Workflow, ModelSQL, ModelView):
         table.not_null_action('sale_date', 'remove')
 
         # state confirmed splitted into confirmed and processing
-        confirmed2processing = []
-        for sale in self.browse(self.search([
-                        ('state', '=', 'confirmed'),
-                        ])):
-            if sale.invoices or sale.moves:
-                confirmed2processing.append(sale.id)
-        if confirmed2processing:
-            self.write(confirmed2processing, {'state': 'processing'})
+        if (TableHandler.table_exist(cursor, sale_line_obj._table)
+                and TableHandler.table_exist(cursor,
+                    sale_line_invoice_line_obj._table)
+                and TableHandler.table_exist(cursor, move_obj._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.sale_line = l.id '
+                        "WHERE s.state = 'confirmed' "
+                            'AND (li.id IS NOT NULL '
+                                'OR m.id IS NOT NULL)) AS foo)'
+                % (self._table, self._table, sale_line_obj._table,
+                    sale_line_invoice_line_obj._table, move_obj._table))
 
         # Add index on create_date
         table = TableHandler(cursor, self, module_name)
@@ -410,8 +425,8 @@ class Sale(Workflow, ModelSQL, ModelView):
                 tax_list = ()
                 with Transaction().set_context(self.get_tax_context(vals)):
                     tax_list = tax_obj.compute(line.get('taxes', []),
-                            line.get('unit_price', Decimal('0.0')),
-                            line.get('quantity', 0.0))
+                            line.get('unit_price') or Decimal('0.0'),
+                            line.get('quantity') or 0.0)
                 for tax in tax_list:
                     key, val = invoice_obj._compute_tax(tax, 'out_invoice')
                     if not key in taxes:
@@ -653,7 +668,7 @@ class Sale(Workflow, ModelSQL, ModelView):
                     location = line.from_location
                 else:
                     location = line.to_location
-                if (not location
+                if ((not location or not line.warehouse)
                         and line.product
                         and line.product.type in ('goods', 'assets')):
                     self.raise_user_error('warehouse_required')
@@ -738,6 +753,9 @@ class Sale(Workflow, ModelSQL, ModelView):
         invoice_line_obj = pool.get('account.invoice.line')
         sale_line_obj = pool.get('sale.line')
 
+        if sale.invoice_method == 'manual':
+            return
+
         if not sale.party.account_receivable:
             self.raise_user_error('missing_account_receivable',
                     error_args=(sale.party.rec_name,))
@@ -812,6 +830,9 @@ class Sale(Workflow, ModelSQL, ModelView):
         move_obj = pool.get('stock.move')
         sale_line_obj = pool.get('sale.line')
 
+        if sale.shipment_method == 'manual':
+            return
+
         moves = self._get_move_sale_line(sale, shipment_type)
         if not moves:
             return
@@ -849,7 +870,10 @@ class Sale(Workflow, ModelSQL, ModelView):
         return shipments
 
     def is_done(self, sale):
-        return sale.invoice_state == 'paid' and sale.shipment_state == 'sent'
+        return ((sale.invoice_state == 'paid'
+                or sale.invoice_method == 'manual')
+            and (sale.shipment_state == 'sent'
+                or sale.shipment_method == 'manual'))
 
     def delete(self, ids):
         if isinstance(ids, (int, long)):
@@ -1179,7 +1203,7 @@ class SaleLine(ModelSQL, ModelView):
         with Transaction().set_context(
                 self._get_context_sale_price(product, vals)):
             res['unit_price'] = product_obj.get_sale_price([product.id],
-                    vals.get('quantity', 0))[product.id]
+                    vals.get('quantity') or 0)[product.id]
             if res['unit_price']:
                 res['unit_price'] = res['unit_price'].quantize(
                     Decimal(1) / 10 ** self.unit_price.digits[1])
@@ -1244,7 +1268,7 @@ class SaleLine(ModelSQL, ModelView):
         with Transaction().set_context(
                 self._get_context_sale_price(product, vals)):
             res['unit_price'] = product_obj.get_sale_price([vals['product']],
-                    vals.get('quantity', 0))[vals['product']]
+                    vals.get('quantity') or 0)[vals['product']]
             if res['unit_price']:
                 res['unit_price'] = res['unit_price'].quantize(
                     Decimal(1) / 10 ** self.unit_price.digits[1])
@@ -1297,8 +1321,11 @@ class SaleLine(ModelSQL, ModelView):
     def get_from_location(self, ids, name):
         result = {}
         for line in self.browse(ids):
-            if line.quantity >= 0 and line.warehouse:
-                result[line.id] = line.warehouse.output_location.id
+            if line.quantity >= 0:
+                if line.warehouse:
+                    result[line.id] = line.warehouse.output_location.id
+                else:
+                    result[line.id] = None
             else:
                 result[line.id] = line.sale.party.customer_location.id
         return result
@@ -1352,10 +1379,12 @@ class SaleLine(ModelSQL, ModelView):
         res['note'] = line.note
         if line.type != 'line':
             if (line.sale.invoice_method == 'order'
-                    and (all(l.quantity >= 0 for l in line.sale.lines
-                            if l.type == 'line')
-                        or all(l.quantity <= 0 for l in line.sale.lines
-                            if l.type == 'line'))):
+                    and ((all(l.quantity >= 0 for l in line.sale.lines
+                                if l.type == 'line')
+                            and invoice_type == 'out_invoice')
+                        or (all(l.quantity <= 0 for l in line.sale.lines
+                                if l.type == 'line')
+                            and invoice_type == 'out_credit_note'))):
                 return [res]
             else:
                 return []
@@ -1374,14 +1403,12 @@ class SaleLine(ModelSQL, ModelView):
                     quantity += uom_obj.compute_qty(move.uom, move.quantity,
                             line.unit)
 
-        ignored_ids = set(
-            l.id for i in line.sale.invoices_ignored for l in i.lines)
+        skip_ids = set(l.id for i in line.sale.invoices_recreated
+            for l in i.lines)
         for invoice_line in line.invoice_lines:
             if invoice_line.type != 'line':
                 continue
-            if ((invoice_line.invoice and
-                    invoice_line.invoice.state != 'cancel') or
-                invoice_line.id in ignored_ids):
+            if invoice_line.id not in skip_ids:
                 quantity -= uom_obj.compute_qty(invoice_line.unit,
                         invoice_line.quantity, line.unit)
         res['quantity'] = quantity
@@ -1431,8 +1458,17 @@ class SaleLine(ModelSQL, ModelView):
             return
         if (shipment_type == 'out') != (line.quantity >= 0):
             return
+
+        if line.sale.shipment_method == 'order':
+            quantity = abs(line.quantity)
+        else:
+            quantity = 0.0
+            for invoice_line in line.invoice_lines:
+                if invoice_line.invoice.state in ('open', 'paid'):
+                    quantity += uom_obj.compute_qty(invoice_line.unit,
+                        invoice_line.quantity, line.unit)
+
         skip_ids = set(x.id for x in line.moves_recreated)
-        quantity = abs(line.quantity)
         for move in line.moves:
             if move.id not in skip_ids:
                 quantity -= uom_obj.compute_qty(move.uom, move.quantity,
diff --git a/trytond_sale.egg-info/PKG-INFO b/trytond_sale.egg-info/PKG-INFO
index 79d143d..8423189 100644
--- a/trytond_sale.egg-info/PKG-INFO
+++ b/trytond_sale.egg-info/PKG-INFO
@@ -1,6 +1,6 @@
 Metadata-Version: 1.0
 Name: trytond-sale
-Version: 2.4.0
+Version: 2.4.1
 Summary: Define sale order.
 Add to product sale informations.
 Define the sale price as the list price.
commit 2cc4d782a97b73380ecc12fb9975844841886c78
Author: Mathias Behrle <mathiasb at m9s.biz>
Date:   Sat Apr 28 12:44:10 2012 +0200

    Releasing debian version 2.4.0-1.

diff --git a/debian/changelog b/debian/changelog
index cb2d277..33a7117 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -1,3 +1,15 @@
+tryton-modules-sale (2.4.0-1) experimental; urgency=low
+
+  * Updating to Standards-Version: 3.9.3, no changes needed.
+  * Updating year in copyright.
+  * Adding myself to copyright.
+  * Adding Format header for DEP5.
+  * Merging upstream version 2.4.0.
+  * Updating Copyright.
+  * Bumping versioned tryton depends to 2.4.
+
+ -- Mathias Behrle <mathiasb at m9s.biz>  Thu, 26 Apr 2012 19:32:28 +0200
+
 tryton-modules-sale (2.2.1-1) unstable; urgency=low
 
   * Merging upstream version 2.2.1.
commit 93857f10352c343f5efa5e1b67f520fdd6a55c1b
Author: Mathias Behrle <mathiasb at m9s.biz>
Date:   Thu Apr 26 19:11:45 2012 +0200

    Bumping versioned tryton depends to 2.4.

diff --git a/debian/control b/debian/control
index df3f92d..92feaea 100644
--- a/debian/control
+++ b/debian/control
@@ -14,11 +14,11 @@ X-Python-Version: >= 2.6
 Package: tryton-modules-sale
 Architecture: all
 Depends:
- ${misc:Depends}, ${python:Depends}, tryton-server (>= 2.2),
- tryton-modules-account (>= 2.2), tryton-modules-account-invoice (>= 2.2),
- tryton-modules-account-product (>= 2.2), tryton-modules-company (>= 2.2),
- tryton-modules-currency (>= 2.2), tryton-modules-party (>= 2.2),
- tryton-modules-product (>= 2.2), tryton-modules-stock (>= 2.2),
+ ${misc:Depends}, ${python:Depends}, tryton-server (>= 2.4),
+ tryton-modules-account (>= 2.4), tryton-modules-account-invoice (>= 2.4),
+ tryton-modules-account-product (>= 2.4), tryton-modules-company (>= 2.4),
+ tryton-modules-currency (>= 2.4), tryton-modules-party (>= 2.4),
+ tryton-modules-product (>= 2.4), tryton-modules-stock (>= 2.4),
  python-pkg-resources
 Description: Tryton Application Platform (Sale Module)
  Tryton is a high-level general purpose application platform written in Python
commit 9a0883331d6a406f62cd67032fd00f39c4f00892
Author: Mathias Behrle <mathiasb at m9s.biz>
Date:   Wed Apr 25 20:08:13 2012 +0200

    Updating Copyright.

diff --git a/debian/copyright b/debian/copyright
index 21a85a7..936d353 100644
--- a/debian/copyright
+++ b/debian/copyright
@@ -3,9 +3,9 @@ Format: http://www.debian.org/doc/packaging-manuals/copyright-format/1.0/
 Files: *
 Copyright:
  (C) 2004-2008 Tiny SPRL
- (C) 2008-2011 Cedric Krier
- (C) 2008-2011 Bertrand Chenal
- (C) 2008-2011 B2CK SPRL
+ (C) 2008-2012 Cedric Krier
+ (C) 2008-2012 Bertrand Chenal
+ (C) 2008-2012 B2CK SPRL
 License: GPL-3+
 
 Files: debian/*
commit 7c8544aecf485463d67c2b1b6bae56091d6cb412
Author: Mathias Behrle <mathiasb at m9s.biz>
Date:   Tue Apr 24 19:31:03 2012 +0200

    Merging upstream version 2.4.0.

diff --git a/CHANGELOG b/CHANGELOG
index c07ac6e..a637465 100644
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -1,5 +1,11 @@
-Version 2.2.1 - 2011-12-26
+Version 2.4.0 - 2012-04-24
 * Bug fixes (see mercurial logs for details)
+* Manage negative amounts in sale
+* Add cache on amount fields in readonly states
+* Confirmed state split into Confirmed and Processing
+* Add a Function field delivery_date to sale line
+* Sale date is required only at confirmation
+* warehouse is not always required
 
 Version 2.2.0 - 2011-10-25
 * Bug fixes (see mercurial logs for details)
diff --git a/COPYRIGHT b/COPYRIGHT
index a9feb41..ede3fac 100644
--- a/COPYRIGHT
+++ b/COPYRIGHT
@@ -1,6 +1,6 @@
-Copyright (C) 2008-2011 Cédric Krier.
-Copyright (C) 2008-2011 Bertrand Chenal.
-Copyright (C) 2008-2011 B2CK SPRL.
+Copyright (C) 2008-2012 Cédric Krier.
+Copyright (C) 2008-2012 Bertrand Chenal.
+Copyright (C) 2008-2012 B2CK SPRL.
 Copyright (C) 2004-2008 Tiny SPRL.
 
 This program is free software: you can redistribute it and/or modify
diff --git a/INSTALL b/INSTALL
index a5b6fd2..aac074e 100644
--- a/INSTALL
+++ b/INSTALL
@@ -4,7 +4,7 @@ Installing trytond_sale
 Prerequisites
 -------------
 
- * Python 2.5 or later (http://www.python.org/)
+ * Python 2.6 or later (http://www.python.org/)
  * trytond (http://www.tryton.org/)
  * trytond_company (http://www.tryton.org/)
  * trytond_party (http://www.tryton.org/)
diff --git a/PKG-INFO b/PKG-INFO
index d2cf512..f40bcdc 100644
--- a/PKG-INFO
+++ b/PKG-INFO
@@ -1,6 +1,6 @@
-Metadata-Version: 1.1
+Metadata-Version: 1.0
 Name: trytond_sale
-Version: 2.2.1
+Version: 2.4.0
 Summary: Define sale order.
 Add to product sale informations.
 Define the sale price as the list price.
@@ -9,18 +9,18 @@ With the possibilities:
     - to follow invoice and shipment states from the sale order.
     - to define invoice method:
         - Manual
-        - On Order Confirmed
+        - On Order Processed
         - On shipment Sent
     - to define shipment method:
         - Manual
-        - On Order Confirmed
+        - On Order Processed
         - On Invoice Paid
 
 Home-page: http://www.tryton.org/
 Author: B2CK
 Author-email: info at b2ck.com
 License: GPL-3
-Download-URL: http://downloads.tryton.org/2.2/
+Download-URL: http://downloads.tryton.org/2.4/
 Description: UNKNOWN
 Platform: UNKNOWN
 Classifier: Development Status :: 5 - Production/Stable
diff --git a/__init__.py b/__init__.py
index 1c86637..8fcedeb 100644
--- a/__init__.py
+++ b/__init__.py
@@ -1,6 +1,6 @@
 #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 sale import *
-from configuration import *
-from invoice import *
+from .sale import *
+from .configuration import *
+from .invoice import *
diff --git a/__tryton__.py b/__tryton__.py
index f57b590..f922dea 100644
--- a/__tryton__.py
+++ b/__tryton__.py
@@ -3,12 +3,14 @@
 {
     'name': 'Sale',
     'name_bg_BG': 'Продажби',
+    'name_ca_ES': 'Vendes',
     'name_de_DE': 'Verkauf',
+    'name_es_AR': 'Venta',
     'name_es_CO': 'Ventas',
-    'name_es_ES': 'Venta',
+    'name_es_ES': 'Ventas',
     'name_fr_FR': 'Vente',
     'name_nl_NL': 'Verkoop',
-    'version': '2.2.1',
+    'version': '2.4.0',
     'author': 'B2CK',
     'email': 'info at b2ck.com',
     'website': 'http://www.tryton.org/',
@@ -20,11 +22,11 @@ With the possibilities:
     - to follow invoice and shipment states from the sale order.
     - to define invoice method:
         - Manual
-        - On Order Confirmed
+        - On Order Processed
         - On shipment Sent
     - to define shipment method:
         - Manual
-        - On Order Confirmed
+        - On Order Processed
         - On Invoice Paid
 ''',
     'description_bg_BG': ''' Задаване на поръчка за продажба.
@@ -42,6 +44,21 @@ With the possibilities:
         - При потвърждаване на поръчката
         - При плащане на фактурата
 ''',
+   'description_ca_ES': '''- Defineix comandes de venda.
+- Afegeix informació de vendes als productes.
+- Defineix el preu de venda com el preu de la llista.
+
+Amb la possibilitat de:
+    - Seguir els estats de facturació i enviament des de la comanda de venda.
+    - Definir el mètode de facturació:
+        - Manual
+        - A la confirmació de la comanda
+        - A l'enviar-la
+    - Definir el mètode d'enviament:
+        - Manual
+        - A la confirmació de la comanda
+        - Al cobrar la factura
+''',
     'description_de_DE': ''' - Dient der Erstellung von Verkaufsvorgängen (Entwurf, Angebot, Auftrag).
  - Fügt den Artikeln Einkaufsinformationen hinzu.
  - Erlaubt die Definition des Einkaufspreises als Listenpreis.
@@ -57,6 +74,21 @@ Ermöglicht:
         - Nach Auftragsbestätigung
         - Nach Bezahlung
 ''',
+    'description_es_AR': '''Define orden de venta.
+ - Añade a los productos información de ventas.
+ - Define el precio de venta como el precio de lista.
+
+ - Con la posibilidad de:
+    - seguir los estados de facturación y envio desde la orden de venta.
+    - definir el método de facturación:
+        - Manual
+        - A la confirmación de la orden
+        - Al enviarlo
+    - definir el método de envio:
+        - Manual
+        - Al confirmar la orden
+        - Al pagar la factura
+''',
     'description_es_CO': ''' - Define la orden de Ventas.
  - Se añade al producto la información de ventas.
  - Definición del precio de venta y el precio de lista.
@@ -72,19 +104,19 @@ Ermöglicht:
         - Al Confirmar la Orden
         - Contra el Pago de la Factura
 ''',
-    'description_es_ES': '''Define orden de venta.
- - Añade a los productos información de ventas.
- - Define el precio de venta como el precio de lista.
+    'description_es_ES': '''- Define pedido de venta.
+- Añade información de venta a los productos.
+- Define el precio de venta como el precio de lista.
 
- - Con la posibilidad de:
-    - seguir los estados de facturación y envio desde la orden de venta.
-    - definir el método de facturación:
+Con la posibilidad de:
+    - Seguir los estados de facturación y envío desde el pedido de venta.
+    - Definir el método de facturación:
         - Manual
-        - A la confirmación de la orden
+        - A la confirmación del pedido
         - Al enviarlo
-    - definir el método de envio:
+    - Definir el método de envío:
         - Manual
-        - Al confirmar la orden
+        - Al confirmar el pedido
         - Al pagar la factura
 ''',
     'description_fr_FR': '''Défini l'ordre de vente.
@@ -101,7 +133,7 @@ Avec la possibilité:
         - Sur confirmation de la commande
         - Au paiement de la facture
 ''',
-	'description_nl_NL': '''Verkoopmodule.
+    'description_nl_NL': '''Verkoopmodule.
 Voegt verkoopinformatie toe aan producten.
 Zet de catalogusprijs als verkoopprijs.
 
@@ -123,7 +155,6 @@ Biedt mogelijkheden tot:
         'account',
         'product',
         'account_invoice',
-        'workflow',
         'res',
         'ir',
         'currency',
@@ -133,11 +164,15 @@ Biedt mogelijkheden tot:
         'sale.xml',
         'configuration.xml',
         'party.xml',
+        'stock.xml',
+        'product.xml',
     ],
     'translation': [
         'locale/bg_BG.po',
+        'locale/ca_ES.po',
         'locale/cs_CZ.po',
         'locale/de_DE.po',
+        'locale/es_AR.po',
         'locale/es_CO.po',
         'locale/es_ES.po',
         'locale/fr_FR.po',
diff --git a/configuration.py b/configuration.py
index 5b246bc..f32b6f0 100644
--- a/configuration.py
+++ b/configuration.py
@@ -17,14 +17,14 @@ class Configuration(ModelSingleton, ModelSQL, ModelView):
                 ], required=True))
     sale_invoice_method = fields.Property(fields.Selection([
                 ('manual', 'Manual'),
-                ('order', 'On Order Confirmed'),
+                ('order', 'On Order Processed'),
                 ('shipment', 'On Shipment Sent')
                 ], 'Sale Invoice Method', states={
                 'required': Bool(Eval('context', {}).get('company', 0)),
                 }))
     sale_shipment_method = fields.Property(fields.Selection([
                 ('manual', 'Manual'),
-                ('order', 'On Order Confirmed'),
+                ('order', 'On Order Processed'),
                 ('invoice', 'On Invoice Paid'),
                 ], 'Sale Shipment Method', states={
                 'required': Bool(Eval('context', {}).get('company', 0)),
diff --git a/configuration.xml b/configuration.xml
index 98eab75..447f09e 100644
--- a/configuration.xml
+++ b/configuration.xml
@@ -43,19 +43,16 @@ this repository contains the full copyright notices and license terms. -->
             id="menu_sale_configuration" icon="tryton-list"/>
 
         <record model="ir.property" id="property_sale_sequence">
-            <field name="name">sale_sequence</field>
             <field name="field"
                 search="[('model.model', '=', 'sale.configuration'), ('name', '=', 'sale_sequence')]"/>
             <field name="value" eval="'ir.sequence,' + str(ref('sequence_sale'))"/>
         </record>
         <record model="ir.property" id="property_sale_invoice_method">
-            <field name="name">sale_invoice_method</field>
             <field name="field"
                 search="[('model.model', '=', 'sale.configuration'), ('name', '=', 'sale_invoice_method')]" />
             <field name="value">,order</field>
         </record>
         <record model="ir.property" id="property_sale_shipment_method">
-            <field name="name">sale_shipment_method</field>
             <field name="field"
                 search="[('model.model', '=', 'sale.configuration'), ('name', '=', 'sale_shipment_method')]" />
             <field name="value">,order</field>
diff --git a/doc/index.rst b/doc/index.rst
index 8e0f960..0435a06 100644
--- a/doc/index.rst
+++ b/doc/index.rst
@@ -49,12 +49,12 @@ optional or completed with sensible default values:
 - Tax: The tax amount.
 - Total: The total amount.
 - State: The state of the sale. May take one of the following
-  values: Draft, Quotation, Confirmed, Cancelled.
+  values: Draft, Quotation, Confirmed, Processing, Cancelled.
 - Company: The company which issue the sale order.
 - Invoice Method: May take one of the following values:
 
-  - On Order Confirmed: The invoice is created when the sale order is
-    confirmed.
+  - On Order Processed: The invoice is created when the sale order is
+    processed.
   - On Shipment Sent: The invoice is created when the shipment is sent
     and will contains the shipped quantities. If there are several
     shipments for the same sale, several invoices will be created.
@@ -62,8 +62,8 @@ optional or completed with sensible default values:
 
 - Shipment Method: May take one of the following values:
 
-  - On Order Confirmed: The customer shipment is created when the sale
-    order is confirmed.
+  - On Order Processed: The customer shipment is created when the sale
+    order is processed.
   - On Invoice Paid: The customer shipment is created when the invoice
     is paid.
   - Manual: Tryton doesn't create any shipment automatically.
@@ -76,6 +76,7 @@ optional or completed with sensible default values:
 - Invoices: The list of related invoices.
 - Moves: The list of related stock moves.
 - Shipments: The list of related shipments.
+- Return Shipments: The list of related shipments return.
 
 The *Sale* report allow to print the sale orders or to send
 them by mail.
diff --git a/invoice.py b/invoice.py
index 447bcd0..5163f38 100644
--- a/invoice.py
+++ b/invoice.py
@@ -1,21 +1,50 @@
 #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 trytond.model import ModelView, ModelSQL, fields
+from trytond.model import Model, fields
+from trytond.pool import Pool
 
 
-class Invoice(ModelSQL, ModelView):
+class Invoice(Model):
     _name = 'account.invoice'
 
     sales = fields.Many2Many('sale.sale-account.invoice',
             'invoice', 'sale', 'Sales', readonly=True)
 
+    def copy(self, ids, default=None):
+        if default is None:
+            default = {}
+        default = default.copy()
+        default.setdefault('sales', None)
+        return super(Invoice, self).copy(ids, default=default)
+
+    def paid(self, ids):
+        pool = Pool()
+        sale_obj = pool.get('sale.sale')
+        super(Invoice, self).paid(ids)
+        invoices = self.browse(ids)
+        sale_obj.process([s.id for i in invoices for s in i.sales])
+
+    def cancel(self, ids):
+        pool = Pool()
+        sale_obj = pool.get('sale.sale')
+        super(Invoice, self).cancel(ids)
+        invoices = self.browse(ids)
+        sale_obj.process([s.id for i in invoices for s in i.sales])
+
 Invoice()
 
 
-class InvoiceLine(ModelSQL, ModelView):
+class InvoiceLine(Model):
     _name = 'account.invoice.line'
 
     sale_lines = fields.Many2Many('sale.line-account.invoice.line',
             'invoice_line', 'sale_line', 'Sale Lines', readonly=True)
 
+    def copy(self, ids, default=None):
+        if default is None:
+            default = {}
+        default = default.copy()
+        default.setdefault('sale_lines', None)
+        return super(InvoiceLine, self).copy(ids, default=default)
+
 InvoiceLine()
diff --git a/locale/bg_BG.po b/locale/bg_BG.po
index 8011482..c52847c 100644
--- a/locale/bg_BG.po
+++ b/locale/bg_BG.po
@@ -2,405 +2,643 @@
 msgid ""
 msgstr "Content-Type: text/plain; charset=utf-8\n"
 
-msgctxt "error:account.invoice:0"
+msgctxt "error:account.invoice:"
 msgid "You can not delete invoices that come from a sale!"
 msgstr "Не може да изтриете фактура която идва от продажба!"
 
-msgctxt "error:account.invoice:0"
+msgctxt "error:account.invoice:"
 msgid "You cannot reset to draft an invoice generated by a sale."
 msgstr "Не може да прехвърляте в проект фактура генерирана при продажба."
 
-msgctxt "error:sale.line:0"
+msgctxt "error:sale.line:"
 msgid "It misses an \"Account Revenue\" on product \"%s\"!"
 msgstr "Не е зададена \"Сметка за приходи\" за продукт \"%s\"!"
 
-msgctxt "error:sale.line:0"
+msgctxt "error:sale.line:"
 msgid "It misses an \"account Revenue\" default property!"
 msgstr "Няма е зададено свойство по подразбиране \"Сметка за приходи\"!"
 
-msgctxt "error:sale.line:0"
+msgctxt "error:sale.line:"
 msgid "The customer location is required!"
 msgstr "Местонахождението на клиента е задължително!"
 
-msgctxt "error:sale.sale:0"
+msgctxt "error:sale.sale:"
 msgid "Invoice and Shipment addresses must be defined for the quotation."
 msgstr "Адрес за фактура и за доставка трябва да са зададени при запитване"
 
-msgctxt "error:sale.sale:0"
+msgctxt "error:sale.sale:"
 msgid "It misses an \"Account Receivable\" on the party \"%s\"!"
 msgstr "Липсва \"Приходна сметка\" за партньор \"%s\"!"
 
-msgctxt "error:sale.sale:0"
+msgctxt "error:sale.sale:"
+msgid "Sale \"%s\" must be cancelled before deletion!"
+msgstr ""
+
+msgctxt "error:sale.sale:"
+msgid "Warehouse must be defined for the quotation."
+msgstr ""
+
+msgctxt "error:sale.sale:"
 msgid "Wrong combination of method!"
 msgstr "Грешна комбинация от методи!"
 
-msgctxt "error:stock.shipment.out:0"
+msgctxt "error:stock.shipment.out.return:"
+msgid "You cannot reset to draft a move generated by a sale."
+msgstr "Не може да прехвърляте в проект движение генерирано при продажба."
+
+msgctxt "error:stock.shipment.out:"
 msgid "You cannot reset to draft a move generated by a sale."
 msgstr "Не може да прехвърляте в проект движение генерирано при продажба."
 
-msgctxt "field:account.invoice,sale_exception_state:0"
+msgctxt "field:account.invoice,sale_exception_state:"
 msgid "Exception State"
 msgstr "Състояние на грешка"
 
-msgctxt "field:account.invoice,sales:0"
+msgctxt "field:account.invoice,sales:"
 msgid "Sales"
 msgstr "Продажби"
 
-msgctxt "field:account.invoice.line,sale_lines:0"
+msgctxt "field:account.invoice.line,sale_lines:"
 msgid "Sale Lines"
 msgstr "Редове от продажба"
 
-#, fuzzy
-msgctxt "field:product.template,delivery_time:0"
+msgctxt "field:product.template,delivery_time:"
 msgid "Delivery Time"
 msgstr "Време за доставка"
 
-msgctxt "field:product.template,salable:0"
+msgctxt "field:product.template,salable:"
 msgid "Salable"
 msgstr "Продажен"
 
-msgctxt "field:product.template,sale_uom:0"
+msgctxt "field:product.template,sale_uom:"
 msgid "Sale UOM"
 msgstr "Мер. ед. на продажба"
 
-msgctxt "field:sale.configuration,rec_name:0"
+msgctxt "field:sale.configuration,create_date:"
+msgid "Create Date"
+msgstr "Създадено на"
+
+msgctxt "field:sale.configuration,create_uid:"
+msgid "Create User"
+msgstr "Създаден от"
+
+msgctxt "field:sale.configuration,id:"
+msgid "ID"
+msgstr "ID"
+
+msgctxt "field:sale.configuration,rec_name:"
 msgid "Name"
 msgstr "Име"
 
-msgctxt "field:sale.configuration,sale_invoice_method:0"
+msgctxt "field:sale.configuration,sale_invoice_method:"
 msgid "Sale Invoice Method"
 msgstr "Начин на фактурине на продажба"
 
-msgctxt "field:sale.configuration,sale_sequence:0"
+msgctxt "field:sale.configuration,sale_sequence:"
 msgid "Sale Reference Sequence"
 msgstr "Последователност за отпратка на продажба"
 
-msgctxt "field:sale.configuration,sale_shipment_method:0"
+msgctxt "field:sale.configuration,sale_shipment_method:"
 msgid "Sale Shipment Method"
 msgstr "Начин на фактуриране на продажба"
 
-msgctxt "field:sale.handle.invoice.exception.ask,domain_invoices:0"
+msgctxt "field:sale.configuration,write_date:"
+msgid "Write Date"
+msgstr "Променено на"
+
+msgctxt "field:sale.configuration,write_uid:"
+msgid "Write User"
+msgstr "Променено от"
+
+msgctxt "field:sale.handle.invoice.exception.ask,domain_invoices:"
 msgid "Domain Invoices"
 msgstr "Фактури на домейн"
 
-msgctxt "field:sale.handle.invoice.exception.ask,recreate_invoices:0"
+msgctxt "field:sale.handle.invoice.exception.ask,id:"
+msgid "ID"
+msgstr "ID"
+
+msgctxt "field:sale.handle.invoice.exception.ask,recreate_invoices:"
 msgid "Recreate Invoices"
 msgstr "Наново създаване на фактури"
 
-msgctxt "field:sale.handle.shipment.exception.ask,domain_moves:0"
+msgctxt "field:sale.handle.shipment.exception.ask,domain_moves:"
 msgid "Domain Moves"
 msgstr "Движение на домейн"
 
-msgctxt "field:sale.handle.shipment.exception.ask,recreate_moves:0"
+msgctxt "field:sale.handle.shipment.exception.ask,id:"
+msgid "ID"
+msgstr "ID"
+
+msgctxt "field:sale.handle.shipment.exception.ask,recreate_moves:"
 msgid "Recreate Moves"
 msgstr "Наново създаване на движения"
 
-msgctxt "field:sale.line,amount:0"
+msgctxt "field:sale.line,amount:"
 msgid "Amount"
 msgstr "Сума"
 
-msgctxt "field:sale.line,description:0"
+msgctxt "field:sale.line,create_date:"
+msgid "Create Date"
+msgstr "Създадено на"
+
+msgctxt "field:sale.line,create_uid:"
+msgid "Create User"
+msgstr "Създадено от"
+
+msgctxt "field:sale.line,delivery_date:"
+msgid "Delivery Date"
+msgstr ""
+
+msgctxt "field:sale.line,description:"
 msgid "Description"
 msgstr "Описание"
 
-msgctxt "field:sale.line,invoice_lines:0"
+msgctxt "field:sale.line,from_location:"
+msgid "From Location"
+msgstr "От местонахождение"
+
+msgctxt "field:sale.line,id:"
+msgid "ID"
+msgstr "ID"
+
+msgctxt "field:sale.line,invoice_lines:"
 msgid "Invoice Lines"
 msgstr "Редове от фактура"
 
-msgctxt "field:sale.line,move_done:0"
+msgctxt "field:sale.line,move_done:"
 msgid "Moves Done"
 msgstr "Направени движения"
 
-msgctxt "field:sale.line,move_exception:0"
+msgctxt "field:sale.line,move_exception:"
 msgid "Moves Exception"
 msgstr "Грешка при движение"
 
-msgctxt "field:sale.line,moves:0"
+msgctxt "field:sale.line,moves:"
 msgid "Moves"
 msgstr "Движения"
 
-msgctxt "field:sale.line,moves_ignored:0"
+msgctxt "field:sale.line,moves_ignored:"
 msgid "Ignored Moves"
 msgstr "Игнорирани движения"
 
-msgctxt "field:sale.line,moves_recreated:0"
+msgctxt "field:sale.line,moves_recreated:"
 msgid "Recreated Moves"
 msgstr "Наново създаване на движения"
 
-msgctxt "field:sale.line,note:0"
+msgctxt "field:sale.line,note:"
 msgid "Note"
 msgstr "Бележка"
 
-msgctxt "field:sale.line,product:0"
+msgctxt "field:sale.line,product:"
 msgid "Product"
 msgstr "Продукт"
 
-msgctxt "field:sale.line,quantity:0"
+msgctxt "field:sale.line,product_uom_category:"
+msgid "Product Uom Category"
+msgstr ""
+
+msgctxt "field:sale.line,quantity:"
 msgid "Quantity"
 msgstr "Количество"
 
-msgctxt "field:sale.line,rec_name:0"
+msgctxt "field:sale.line,rec_name:"
 msgid "Name"
 msgstr "Име"
 
-msgctxt "field:sale.line,sale:0"
+msgctxt "field:sale.line,sale:"
 msgid "Sale"
 msgstr "Продажба"
 
-msgctxt "field:sale.line,sequence:0"
+msgctxt "field:sale.line,sequence:"
 msgid "Sequence"
 msgstr "Последователност"
 
-msgctxt "field:sale.line,taxes:0"
+msgctxt "field:sale.line,taxes:"
 msgid "Taxes"
 msgstr "Данъци"
 
-msgctxt "field:sale.line,type:0"
+msgctxt "field:sale.line,to_location:"
+msgid "To Location"
+msgstr "Към местонахождение"
+
+msgctxt "field:sale.line,type:"
 msgid "Type"
 msgstr "Вид"
 
-msgctxt "field:sale.line,unit:0"
+msgctxt "field:sale.line,unit:"
 msgid "Unit"
 msgstr "Единица"
 
-msgctxt "field:sale.line,unit_digits:0"
+msgctxt "field:sale.line,unit_digits:"
 msgid "Unit Digits"
 msgstr "Десетични единици"
 
-msgctxt "field:sale.line,unit_price:0"
+msgctxt "field:sale.line,unit_price:"
 msgid "Unit Price"
 msgstr "Единична цена"
 
-msgctxt "field:sale.line-account.invoice.line,invoice_line:0"
+msgctxt "field:sale.line,warehouse:"
+msgid "Warehouse"
+msgstr "Склад"
+
+msgctxt "field:sale.line,write_date:"
+msgid "Write Date"
+msgstr "Променено на"
+
+msgctxt "field:sale.line,write_uid:"
+msgid "Write User"
+msgstr "Променено от"
+
+msgctxt "field:sale.line-account.invoice.line,create_date:"
+msgid "Create Date"
+msgstr "Създадено на"
+
+msgctxt "field:sale.line-account.invoice.line,create_uid:"
+msgid "Create User"
+msgstr "Създадено от"
+
+msgctxt "field:sale.line-account.invoice.line,id:"
+msgid "ID"
+msgstr "ID"
+
+msgctxt "field:sale.line-account.invoice.line,invoice_line:"
 msgid "Invoice Line"
 msgstr "Ред от фактура"
 
-msgctxt "field:sale.line-account.invoice.line,rec_name:0"
+msgctxt "field:sale.line-account.invoice.line,rec_name:"
 msgid "Name"
 msgstr "Име"
 
-msgctxt "field:sale.line-account.invoice.line,sale_line:0"
+msgctxt "field:sale.line-account.invoice.line,sale_line:"
 msgid "Sale Line"
 msgstr "Ред от продажба"
 
-msgctxt "field:sale.line-account.tax,line:0"
+msgctxt "field:sale.line-account.invoice.line,write_date:"
+msgid "Write Date"
+msgstr "Променено на"
+
+msgctxt "field:sale.line-account.invoice.line,write_uid:"
+msgid "Write User"
+msgstr "Променено от"
+
+msgctxt "field:sale.line-account.tax,create_date:"
+msgid "Create Date"
+msgstr "Създадено на"
+
+msgctxt "field:sale.line-account.tax,create_uid:"
+msgid "Create User"
+msgstr "Създадено от"
+
+msgctxt "field:sale.line-account.tax,id:"
+msgid "ID"
+msgstr "ID"
+
+msgctxt "field:sale.line-account.tax,line:"
 msgid "Sale Line"
 msgstr "Ред от продажба"
 
-msgctxt "field:sale.line-account.tax,rec_name:0"
+msgctxt "field:sale.line-account.tax,rec_name:"
 msgid "Name"
 msgstr "Име"
 
-msgctxt "field:sale.line-account.tax,tax:0"
+msgctxt "field:sale.line-account.tax,tax:"
 msgid "Tax"
 msgstr "Данък"
 
-msgctxt "field:sale.line-ignored-stock.move,move:0"
+msgctxt "field:sale.line-account.tax,write_date:"
+msgid "Write Date"
+msgstr "Променено на"
+
+msgctxt "field:sale.line-account.tax,write_uid:"
+msgid "Write User"
+msgstr "Променено от"
+
+msgctxt "field:sale.line-ignored-stock.move,create_date:"
+msgid "Create Date"
+msgstr "Създадено на"
+
+msgctxt "field:sale.line-ignored-stock.move,create_uid:"
+msgid "Create User"
+msgstr "Създадено от"
+
+msgctxt "field:sale.line-ignored-stock.move,id:"
+msgid "ID"
+msgstr "ID"
+
+msgctxt "field:sale.line-ignored-stock.move,move:"
 msgid "Move"
 msgstr "Движение"
 
-msgctxt "field:sale.line-ignored-stock.move,rec_name:0"
+msgctxt "field:sale.line-ignored-stock.move,rec_name:"
 msgid "Name"
 msgstr "Име"
 
-msgctxt "field:sale.line-ignored-stock.move,sale_line:0"
+msgctxt "field:sale.line-ignored-stock.move,sale_line:"
 msgid "Sale Line"
 msgstr "Ред от продажба"
 
-msgctxt "field:sale.line-recreated-stock.move,move:0"
+msgctxt "field:sale.line-ignored-stock.move,write_date:"
+msgid "Write Date"
+msgstr "Променено на"
+
+msgctxt "field:sale.line-ignored-stock.move,write_uid:"
+msgid "Write User"
+msgstr "Променено от"
+
+msgctxt "field:sale.line-recreated-stock.move,create_date:"
+msgid "Create Date"
+msgstr "Създадено на"
+
+msgctxt "field:sale.line-recreated-stock.move,create_uid:"
+msgid "Create User"
+msgstr "Създадено от"
+
+msgctxt "field:sale.line-recreated-stock.move,id:"
+msgid "ID"
+msgstr "ID"
+
+msgctxt "field:sale.line-recreated-stock.move,move:"
 msgid "Move"
 msgstr "Движение"
 
-msgctxt "field:sale.line-recreated-stock.move,rec_name:0"
+msgctxt "field:sale.line-recreated-stock.move,rec_name:"
 msgid "Name"
 msgstr "Име"
 
-msgctxt "field:sale.line-recreated-stock.move,sale_line:0"
+msgctxt "field:sale.line-recreated-stock.move,sale_line:"
 msgid "Sale Line"
 msgstr "Ред от продажба"
 
-msgctxt "field:sale.sale,comment:0"
+msgctxt "field:sale.line-recreated-stock.move,write_date:"
+msgid "Write Date"
+msgstr "Променено на"
+
+msgctxt "field:sale.line-recreated-stock.move,write_uid:"
+msgid "Write User"
+msgstr "Променено от"
+
+msgctxt "field:sale.sale,comment:"
 msgid "Comment"
 msgstr "Коментар"
 
-msgctxt "field:sale.sale,company:0"
+msgctxt "field:sale.sale,company:"
 msgid "Company"
 msgstr "Фирма"
 
-msgctxt "field:sale.sale,currency:0"
+msgctxt "field:sale.sale,create_date:"
+msgid "Create Date"
+msgstr "Създадено на"
+
+msgctxt "field:sale.sale,create_uid:"
+msgid "Create User"
+msgstr "Създадено от"
+
+msgctxt "field:sale.sale,currency:"
 msgid "Currency"
 msgstr "Валута"
 
-msgctxt "field:sale.sale,currency_digits:0"
+msgctxt "field:sale.sale,currency_digits:"
 msgid "Currency Digits"
 msgstr "Цифри за валута"
 
-msgctxt "field:sale.sale,description:0"
+msgctxt "field:sale.sale,description:"
 msgid "Description"
 msgstr "Описание"
 
-msgctxt "field:sale.sale,invoice_address:0"
+msgctxt "field:sale.sale,id:"
+msgid "ID"
+msgstr "ID"
+
+msgctxt "field:sale.sale,invoice_address:"
 msgid "Invoice Address"
 msgstr "Адрес за фактура"
 
-msgctxt "field:sale.sale,invoice_exception:0"
-msgid "Invoices Exception"
-msgstr "Грешка при фактури"
-
-msgctxt "field:sale.sale,invoice_method:0"
+msgctxt "field:sale.sale,invoice_method:"
 msgid "Invoice Method"
 msgstr "Начин на фактуриране"
 
-msgctxt "field:sale.sale,invoice_paid:0"
-msgid "Invoices Paid"
-msgstr "Платени фактури"
-
-msgctxt "field:sale.sale,invoice_state:0"
+msgctxt "field:sale.sale,invoice_state:"
 msgid "Invoice State"
 msgstr "Състояние на фактура"
 
-msgctxt "field:sale.sale,invoices:0"
+msgctxt "field:sale.sale,invoices:"
 msgid "Invoices"
 msgstr "Фактури"
 
-msgctxt "field:sale.sale,invoices_ignored:0"
+msgctxt "field:sale.sale,invoices_ignored:"
 msgid "Ignored Invoices"
 msgstr "Игнорирани фактури"
 
-msgctxt "field:sale.sale,invoices_recreated:0"
+msgctxt "field:sale.sale,invoices_recreated:"
 msgid "Recreated Invoices"
 msgstr "Наново създадени на фактури"
 
-msgctxt "field:sale.sale,lines:0"
+msgctxt "field:sale.sale,lines:"
 msgid "Lines"
 msgstr "Редове"
 
-msgctxt "field:sale.sale,moves:0"
+msgctxt "field:sale.sale,moves:"
 msgid "Moves"
 msgstr "Движения"
 
-msgctxt "field:sale.sale,party:0"
+msgctxt "field:sale.sale,party:"
 msgid "Party"
 msgstr "Партньор"
 
-msgctxt "field:sale.sale,party_lang:0"
+msgctxt "field:sale.sale,party_lang:"
 msgid "Party Language"
 msgstr "Език на партньор"
 
-msgctxt "field:sale.sale,payment_term:0"
+msgctxt "field:sale.sale,payment_term:"
 msgid "Payment Term"
 msgstr "Условие за плащане"
 
-msgctxt "field:sale.sale,rec_name:0"
+msgctxt "field:sale.sale,rec_name:"
 msgid "Name"
 msgstr "Име"
 
-msgctxt "field:sale.sale,reference:0"
+msgctxt "field:sale.sale,reference:"
 msgid "Reference"
 msgstr "Отпратка"
 
-msgctxt "field:sale.sale,sale_date:0"
+msgctxt "field:sale.sale,sale_date:"
 msgid "Sale Date"
 msgstr "Дата на продажба"
 
-msgctxt "field:sale.sale,shipment_address:0"
+msgctxt "field:sale.sale,shipment_address:"
 msgid "Shipment Address"
 msgstr "Адрес за доставка"
 
-msgctxt "field:sale.sale,shipment_done:0"
-msgid "Shipment Done"
-msgstr "Направена пратка"
-
-msgctxt "field:sale.sale,shipment_exception:0"
-msgid "Shipments Exception"
-msgstr "Грешки при пратка"
-
-msgctxt "field:sale.sale,shipment_method:0"
+msgctxt "field:sale.sale,shipment_method:"
 msgid "Shipment Method"
 msgstr "Начин на изпращане"
 
-msgctxt "field:sale.sale,shipment_state:0"
+msgctxt "field:sale.sale,shipment_returns:"
+msgid "Shipment Returns"
+msgstr ""
+
+msgctxt "field:sale.sale,shipment_state:"
 msgid "Shipment State"
 msgstr "Състояние на пратка"
 
-msgctxt "field:sale.sale,shipments:0"
+msgctxt "field:sale.sale,shipments:"
 msgid "Shipments"
 msgstr "Изпращания"
 
-msgctxt "field:sale.sale,state:0"
+msgctxt "field:sale.sale,state:"
 msgid "State"
 msgstr "Състояние"
 
-msgctxt "field:sale.sale,tax_amount:0"
+msgctxt "field:sale.sale,tax_amount:"
 msgid "Tax"
 msgstr "Данък"
 
-msgctxt "field:sale.sale,total_amount:0"
+msgctxt "field:sale.sale,tax_amount_cache:"
+msgid "Tax Cache"
+msgstr "Данък в брой"
+
+msgctxt "field:sale.sale,total_amount:"
 msgid "Total"
 msgstr "Общо"
 
-msgctxt "field:sale.sale,untaxed_amount:0"
+msgctxt "field:sale.sale,total_amount_cache:"
+msgid "Total Tax"
+msgstr ""
+
+msgctxt "field:sale.sale,untaxed_amount:"
 msgid "Untaxed"
 msgstr "Необложен с данък"
 
-msgctxt "field:sale.sale,warehouse:0"
+msgctxt "field:sale.sale,untaxed_amount_cache:"
+msgid "Untaxed Cache"
+msgstr "Наличност преди данъци"
+
+msgctxt "field:sale.sale,warehouse:"
 msgid "Warehouse"
 msgstr "Склад"
 
-msgctxt "field:sale.sale-account.invoice,invoice:0"
+msgctxt "field:sale.sale,write_date:"
+msgid "Write Date"
+msgstr "Променено на"
+
+msgctxt "field:sale.sale,write_uid:"
+msgid "Write User"
+msgstr "Променено от"
+
+msgctxt "field:sale.sale-account.invoice,create_date:"
+msgid "Create Date"
+msgstr "Създадено на"
+
+msgctxt "field:sale.sale-account.invoice,create_uid:"
+msgid "Create User"
+msgstr "Създадено от"
+
+msgctxt "field:sale.sale-account.invoice,id:"
+msgid "ID"
+msgstr "ID"
+
+msgctxt "field:sale.sale-account.invoice,invoice:"
 msgid "Invoice"
 msgstr "Фактура"
 
-msgctxt "field:sale.sale-account.invoice,rec_name:0"
+msgctxt "field:sale.sale-account.invoice,rec_name:"
 msgid "Name"
 msgstr "Име"
 
-msgctxt "field:sale.sale-account.invoice,sale:0"
+msgctxt "field:sale.sale-account.invoice,sale:"
 msgid "Sale"
 msgstr "Продажба"
 
-msgctxt "field:sale.sale-ignored-account.invoice,invoice:0"
+msgctxt "field:sale.sale-account.invoice,write_date:"
+msgid "Write Date"
+msgstr "Променено на"
+
+msgctxt "field:sale.sale-account.invoice,write_uid:"
+msgid "Write User"
+msgstr "Променено от"
+
+msgctxt "field:sale.sale-ignored-account.invoice,create_date:"
+msgid "Create Date"
+msgstr "Създадено на"
+
+msgctxt "field:sale.sale-ignored-account.invoice,create_uid:"
+msgid "Create User"
+msgstr "Създадено от"
+
+msgctxt "field:sale.sale-ignored-account.invoice,id:"
+msgid "ID"
+msgstr "ID"
+
+msgctxt "field:sale.sale-ignored-account.invoice,invoice:"
 msgid "Invoice"
 msgstr "Фактура"
 
-msgctxt "field:sale.sale-ignored-account.invoice,rec_name:0"
+msgctxt "field:sale.sale-ignored-account.invoice,rec_name:"
 msgid "Name"
 msgstr "Име"
 
-msgctxt "field:sale.sale-ignored-account.invoice,sale:0"
+msgctxt "field:sale.sale-ignored-account.invoice,sale:"
 msgid "Sale"
 msgstr "Продажба"
 
-msgctxt "field:sale.sale-recreated-account.invoice,invoice:0"
+msgctxt "field:sale.sale-ignored-account.invoice,write_date:"
+msgid "Write Date"
+msgstr "Променено на"
+
+msgctxt "field:sale.sale-ignored-account.invoice,write_uid:"
+msgid "Write User"
+msgstr "Променено от"
+
+msgctxt "field:sale.sale-recreated-account.invoice,create_date:"
+msgid "Create Date"
+msgstr "Създадено на"
+
+msgctxt "field:sale.sale-recreated-account.invoice,create_uid:"
+msgid "Create User"
+msgstr "Създадено от"
+
+msgctxt "field:sale.sale-recreated-account.invoice,id:"
+msgid "ID"
+msgstr "ID"
+
+msgctxt "field:sale.sale-recreated-account.invoice,invoice:"
 msgid "Invoice"
 msgstr "Фактура"
 
-msgctxt "field:sale.sale-recreated-account.invoice,rec_name:0"
+msgctxt "field:sale.sale-recreated-account.invoice,rec_name:"
 msgid "Name"
 msgstr "Име"
 
-msgctxt "field:sale.sale-recreated-account.invoice,sale:0"
+msgctxt "field:sale.sale-recreated-account.invoice,sale:"
 msgid "Sale"
 msgstr "Продажба"
 
-msgctxt "field:stock.move,sale:0"
+msgctxt "field:sale.sale-recreated-account.invoice,write_date:"
+msgid "Write Date"
+msgstr "Променено на"
+
+msgctxt "field:sale.sale-recreated-account.invoice,write_uid:"
+msgid "Write User"
+msgstr "Променено от"
+
+msgctxt "field:stock.move,sale:"
 msgid "Sale"
 msgstr "Продажба"
 
-msgctxt "field:stock.move,sale_exception_state:0"
+msgctxt "field:stock.move,sale_exception_state:"
 msgid "Exception State"
 msgstr "Състояние на грешка"
 
-msgctxt "field:stock.move,sale_line:0"
+msgctxt "field:stock.move,sale_line:"
 msgid "Sale Line"
 msgstr "Ред от продажба"
 
-#, fuzzy
-msgctxt "help:product.template,delivery_time:0"
+msgctxt "help:product.template,delivery_time:"
 msgid "In number of days"
 msgstr "В брой дни"
 
-msgctxt "help:sale.handle.invoice.exception.ask,recreate_invoices:0"
+msgctxt "help:sale.handle.invoice.exception.ask,recreate_invoices:"
 msgid ""
 "The selected invoices will be recreated. The other ones will be ignored."
 msgstr ""
@@ -414,7 +652,10 @@ msgctxt "model:ir.action,name:act_open_customer"
 msgid "Parties associated to Sales"
 msgstr "Партньори свързани с продажби"
 
-#, fuzzy
+msgctxt "model:ir.action,name:act_return_form"
+msgid "Returns"
+msgstr ""
+
 msgctxt "model:ir.action,name:act_sale_configuration_form"
 msgid "Sales Configuration"
 msgstr "Конфигурация на продажба"
@@ -435,6 +676,10 @@ msgctxt "model:ir.action,name:act_sale_form_draft"
 msgid "Draft Sales"
 msgstr "Проект на продажби"
 
+msgctxt "model:ir.action,name:act_sale_form_processing"
+msgid "Processing Sales"
+msgstr ""
+
 msgctxt "model:ir.action,name:act_sale_form_quotation"
 msgid "Quotation Sales"
 msgstr "Продажби (запитвания) "
@@ -451,6 +696,10 @@ msgctxt "model:ir.action,name:wizard_invoice_handle_exception"
 msgid "Handle Invoice Exception"
 msgstr "Обработка на грешка към фактура"
 
+msgctxt "model:ir.action,name:wizard_return_sale"
+msgid "Create Return Sale"
+msgstr ""
+
 msgctxt "model:ir.action,name:wizard_shipment_handle_exception"
 msgid "Handle Shipment Exception"
 msgstr "Обработка на грешки при изпращане"
@@ -471,12 +720,10 @@ msgctxt "model:ir.ui.menu,name:menu_customer"
 msgid "Parties associated to Sales"
 msgstr "Партньори свързани с продажби"
 
-#, fuzzy
 msgctxt "model:ir.ui.menu,name:menu_sale"
 msgid "Sales"
 msgstr "Управление на продажби"
 
-#, fuzzy
 msgctxt "model:ir.ui.menu,name:menu_sale_configuration"
 msgid "Sales Configuration"
 msgstr "Конфигурация на продажба"
@@ -493,504 +740,412 @@ msgctxt "model:ir.ui.menu,name:menu_sale_form_draft"
 msgid "Draft Sales"
 msgstr "Проект на продажби"
 
+msgctxt "model:ir.ui.menu,name:menu_sale_form_processing"
+msgid "Processing Sales"
+msgstr ""
+
 msgctxt "model:ir.ui.menu,name:menu_sale_form_quotation"
 msgid "Quotation Sales"
 msgstr "Продажби (запитвания) "
 
-#, fuzzy
 msgctxt "model:res.group,name:group_sale"
 msgid "Sales"
 msgstr "Продажба"
 
-#, fuzzy
 msgctxt "model:res.group,name:group_sale_admin"
 msgid "Sales Administrator"
 msgstr "Отговорник продажби"
 
-msgctxt "model:sale.configuration,name:0"
+msgctxt "model:sale.configuration,name:"
 msgid "Sale Configuration"
 msgstr "Конфигурация на продажба"
 
-msgctxt "model:sale.handle.invoice.exception.ask,name:0"
-msgid "Invoice Exception Ask"
-msgstr "Запитване за грешка в фактура"
+#, fuzzy
+msgctxt "model:sale.handle.invoice.exception.ask,name:"
+msgid "Handle Invoice Exception"
+msgstr "Обработване за грешка в фактура"
 
-msgctxt "model:sale.handle.shipment.exception.ask,name:0"
-msgid "Shipment Exception Ask"
-msgstr "Запитване за грешка при пратка"
+#, fuzzy
+msgctxt "model:sale.handle.shipment.exception.ask,name:"
+msgid "Handle Shipment Exception"
+msgstr "Обработване на грешка при пратка"
 
-msgctxt "model:sale.line,name:0"
+msgctxt "model:sale.line,name:"
 msgid "Sale Line"
 msgstr "Ред от продажба"
 
-msgctxt "model:sale.line-account.invoice.line,name:0"
+msgctxt "model:sale.line-account.invoice.line,name:"
 msgid "Sale Line - Invoice Line"
 msgstr "Ред от продажба - Ред от фактура"
 
-msgctxt "model:sale.line-account.tax,name:0"
+msgctxt "model:sale.line-account.tax,name:"
 msgid "Sale Line - Tax"
 msgstr "Ред от продажба - Данък"
 
-msgctxt "model:sale.line-ignored-stock.move,name:0"
+msgctxt "model:sale.line-ignored-stock.move,name:"
 msgid "Sale Line - Ignored Move"
 msgstr "Ред от продажба - Игнорирано движение"
 
-msgctxt "model:sale.line-recreated-stock.move,name:0"
+msgctxt "model:sale.line-recreated-stock.move,name:"
 msgid "Sale Line - Recreated Move"
 msgstr "Ред от продажба - Нановосъздадено движение"
 
-msgctxt "model:sale.sale,name:0"
+msgctxt "model:sale.sale,name:"
 msgid "Sale"
 msgstr "Продажба"
 
-msgctxt "model:sale.sale-account.invoice,name:0"
+msgctxt "model:sale.sale-account.invoice,name:"
 msgid "Sale - Invoice"
 msgstr "Продажба - фактура"
 
-msgctxt "model:sale.sale-ignored-account.invoice,name:0"
+msgctxt "model:sale.sale-ignored-account.invoice,name:"
 msgid "Sale - Ignored Invoice"
 msgstr "Продажба - Игнорирани фактури"
 
-msgctxt "model:sale.sale-recreated-account.invoice,name:0"
+msgctxt "model:sale.sale-recreated-account.invoice,name:"
 msgid "Sale - Recreated Invoice"
 msgstr "Продажба - Наново създадена фактура"
 
-msgctxt "model:workflow,name:sale_workflow"
-msgid "Sale workflow"
-msgstr "Работен процес на продажба"
-
-msgctxt "model:workflow.activity,name:sale_activity_cancel"
-msgid "Canceled"
-msgstr "Отказан"
-
-msgctxt "model:workflow.activity,name:sale_activity_confirmed"
-msgid "Confirmed"
-msgstr "Потвърден"
-
-msgctxt "model:workflow.activity,name:sale_activity_done"
-msgid "Done"
-msgstr "Приключен"
-
-msgctxt "model:workflow.activity,name:sale_activity_draft"
-msgid "Draft"
-msgstr "Проект"
-
-msgctxt "model:workflow.activity,name:sale_activity_invoice_method"
-msgid "Invoice Method"
-msgstr "Начин на фактуриране"
-
-msgctxt "model:workflow.activity,name:sale_activity_invoice_method_done"
-msgid "Invoice Method Done"
-msgstr "Направен начин на фактуриране"
-
-msgctxt "model:workflow.activity,name:sale_activity_invoice_sale_done"
-msgid "Invoice Done"
-msgstr "Направени фактури"
-
-msgctxt "model:workflow.activity,name:sale_activity_invoice_sale_exception"
-msgid "Invoice Exception"
-msgstr "Грешка при фактура"
-
-msgctxt "model:workflow.activity,name:sale_activity_invoice_shipment"
-msgid "Invoice Shipment"
-msgstr "Фактура за изпращане"
-
-msgctxt "model:workflow.activity,name:sale_activity_invoice_shipment_done"
-msgid "Invoice Shipment Done"
-msgstr "Направено фактуриране на пратка"
-
-msgctxt ""
-"model:workflow.activity,name:sale_activity_invoice_shipment_exception"
-msgid "Invoice Shipment Exception"
-msgstr "Грешка при фактуриране на пратка"
-
-msgctxt "model:workflow.activity,name:sale_activity_invoice_shipment_method"
-msgid "Invoice Shipment Method"
-msgstr "Начин на фактуриране на пратка"
-
-msgctxt ""
-"model:workflow.activity,name:sale_activity_invoice_shipment_method_done"
-msgid "Invoice Shipment Method Done"
-msgstr "Направено фактуриране на начина на изпращане"
-
-msgctxt "model:workflow.activity,name:sale_activity_quotation"
-msgid "Quotation"
-msgstr "Запитване"
-
-msgctxt "model:workflow.activity,name:sale_activity_shipment"
-msgid "Shipment"
-msgstr "Пратка"
-
-msgctxt "model:workflow.activity,name:sale_activity_shipment_exception"
-msgid "Shipment Exception"
-msgstr "Грешка при пратка"
-
-msgctxt "model:workflow.activity,name:sale_activity_shipment_invoice"
-msgid "Shipment Invoice"
-msgstr "Пратка с грешка"
-
-msgctxt "model:workflow.activity,name:sale_activity_shipment_invoice_done"
-msgid "Shipment Invoice Done"
-msgstr "Направено фактуриране на пратка"
-
-msgctxt ""
-"model:workflow.activity,name:sale_activity_shipment_invoice_exception"
-msgid "Shipment Invoice Exception"
-msgstr "Грешка при фактуриране на пратка"
-
-msgctxt "model:workflow.activity,name:sale_activity_shipment_invoice_method"
-msgid "Shipment Invoice Method"
-msgstr "Начин на фактуриране на пратка"
-
-msgctxt ""
-"model:workflow.activity,name:sale_activity_shipment_invoice_method_done"
-msgid "Shipment Invoice Method Done"
-msgstr "Направен начин на фактуриране на пратка"
-
-msgctxt "model:workflow.activity,name:sale_activity_shipment_method"
-msgid "Shipment Method"
-msgstr "Начин на изпращане"
-
-msgctxt "model:workflow.activity,name:sale_activity_shipment_method_done"
-msgid "Shipment Method Done"
-msgstr "Направен начин на изпращане"
-
-msgctxt "model:workflow.activity,name:sale_activity_waiting_invoice_sale"
-msgid "Waiting Invoice"
-msgstr "Очакващи фактура"
-
-msgctxt "model:workflow.activity,name:sale_activity_waiting_invoice_shipment"
-msgid "Waiting Invoice Shipment"
-msgstr "Изчакващи фактури за пратки"
-
-msgctxt "model:workflow.activity,name:sale_activity_waiting_shipment"
-msgid "Waiting Shipment"
-msgstr "Очаква изпращане"
-
-msgctxt "model:workflow.activity,name:sale_activity_waiting_shipment_invoice"
-msgid "Waiting Shipment Invoice"
-msgstr "Изчакващи фактури за пратки"
-
-msgctxt "odt:sale.sale:0"
+msgctxt "odt:sale.sale:"
 msgid "Amount"
 msgstr "Сума"
 
-msgctxt "odt:sale.sale:0"
+msgctxt "odt:sale.sale:"
 msgid "Date:"
 msgstr "Дата:"
 
-msgctxt "odt:sale.sale:0"
+msgctxt "odt:sale.sale:"
 msgid "Description"
 msgstr "Описание"
 
-msgctxt "odt:sale.sale:0"
+msgctxt "odt:sale.sale:"
 msgid "Description:"
 msgstr "Описание:"
 
-msgctxt "odt:sale.sale:0"
+msgctxt "odt:sale.sale:"
 msgid "Draft Sale Order"
 msgstr "Проект на поръчка за продажба"
 
-msgctxt "odt:sale.sale:0"
+msgctxt "odt:sale.sale:"
 msgid "E-Mail:"
 msgstr "E-Mail:"
 
-msgctxt "odt:sale.sale:0"
+msgctxt "odt:sale.sale:"
 msgid "Phone:"
 msgstr "Телефон:"
 
-msgctxt "odt:sale.sale:0"
+msgctxt "odt:sale.sale:"
 msgid "Quantity"
 msgstr "Количество"
 
-msgctxt "odt:sale.sale:0"
+msgctxt "odt:sale.sale:"
 msgid "Quotation N°:"
 msgstr "Запитване N°:"
 
-msgctxt "odt:sale.sale:0"
+msgctxt "odt:sale.sale:"
 msgid "Sale Order N°:"
 msgstr "Поръчка за продажба N°:"
 
-msgctxt "odt:sale.sale:0"
+msgctxt "odt:sale.sale:"
 msgid "Taxes"
 msgstr "Данъци"
 
-msgctxt "odt:sale.sale:0"
+msgctxt "odt:sale.sale:"
 msgid "Taxes:"
 msgstr "Данъци:"
 
-msgctxt "odt:sale.sale:0"
+msgctxt "odt:sale.sale:"
 msgid "Total (excl. taxes):"
 msgstr "Общо (без данъци):"
 
-msgctxt "odt:sale.sale:0"
+msgctxt "odt:sale.sale:"
 msgid "Total:"
 msgstr "Общо:"
 
-msgctxt "odt:sale.sale:0"
+msgctxt "odt:sale.sale:"
 msgid "Unit Price"
 msgstr "Единична цена"
 
-msgctxt "odt:sale.sale:0"
+msgctxt "odt:sale.sale:"
 msgid "VAT Number:"
-msgstr ""
+msgstr "ДДС номер:"
 
-msgctxt "odt:sale.sale:0"
+msgctxt "odt:sale.sale:"
 msgid "VAT:"
 msgstr "ДДС:"
 
-msgctxt "selection:account.invoice,sale_exception_state:0"
+msgctxt "selection:account.invoice,sale_exception_state:"
 msgid ""
 msgstr ""
 
-msgctxt "selection:account.invoice,sale_exception_state:0"
+msgctxt "selection:account.invoice,sale_exception_state:"
 msgid "Ignored"
 msgstr "Игнорирано"
 
-msgctxt "selection:account.invoice,sale_exception_state:0"
+msgctxt "selection:account.invoice,sale_exception_state:"
 msgid "Recreated"
 msgstr "Създаден наново"
 
-msgctxt "selection:sale.configuration,sale_invoice_method:0"
+msgctxt "selection:sale.configuration,sale_invoice_method:"
 msgid "Manual"
 msgstr "Ръчно"
 
-msgctxt "selection:sale.configuration,sale_invoice_method:0"
-msgid "On Order Confirmed"
-msgstr "При потвърждаване на поръчка"
+msgctxt "selection:sale.configuration,sale_invoice_method:"
+msgid "On Order Processed"
+msgstr "При обработена поръчка"
 
-msgctxt "selection:sale.configuration,sale_invoice_method:0"
+msgctxt "selection:sale.configuration,sale_invoice_method:"
 msgid "On Shipment Sent"
 msgstr "При изпращане на пратка"
 
-msgctxt "selection:sale.configuration,sale_shipment_method:0"
+msgctxt "selection:sale.configuration,sale_shipment_method:"
 msgid "Manual"
 msgstr "Ръчно"
 
-msgctxt "selection:sale.configuration,sale_shipment_method:0"
+msgctxt "selection:sale.configuration,sale_shipment_method:"
 msgid "On Invoice Paid"
 msgstr "При плащане на фактура"
 
-msgctxt "selection:sale.configuration,sale_shipment_method:0"
-msgid "On Order Confirmed"
-msgstr "При потвърждаване на поръчка"
+msgctxt "selection:sale.configuration,sale_shipment_method:"
+msgid "On Order Processed"
+msgstr "При обработена поръчка"
 
-msgctxt "selection:sale.line,type:0"
+msgctxt "selection:sale.line,type:"
 msgid "Comment"
 msgstr "Коментар"
 
-msgctxt "selection:sale.line,type:0"
+msgctxt "selection:sale.line,type:"
 msgid "Line"
 msgstr "Ред"
 
-msgctxt "selection:sale.line,type:0"
+msgctxt "selection:sale.line,type:"
 msgid "Subtotal"
 msgstr "Междинна сума"
 
-msgctxt "selection:sale.line,type:0"
+msgctxt "selection:sale.line,type:"
 msgid "Title"
 msgstr "Заглавие"
 
-msgctxt "selection:sale.sale,invoice_method:0"
+msgctxt "selection:sale.sale,invoice_method:"
 msgid "Manual"
 msgstr "Ръчно"
 
-msgctxt "selection:sale.sale,invoice_method:0"
-msgid "On Order Confirmed"
-msgstr "При потвърждаване на поръчка"
+msgctxt "selection:sale.sale,invoice_method:"
+msgid "On Order Processed"
+msgstr "При обработена поръчка"
 
-msgctxt "selection:sale.sale,invoice_method:0"
+msgctxt "selection:sale.sale,invoice_method:"
 msgid "On Shipment Sent"
 msgstr "При изпращане на пратка"
 
-msgctxt "selection:sale.sale,invoice_state:0"
+msgctxt "selection:sale.sale,invoice_state:"
 msgid "Exception"
 msgstr "Грешка"
 
-msgctxt "selection:sale.sale,invoice_state:0"
+msgctxt "selection:sale.sale,invoice_state:"
 msgid "None"
 msgstr "Няма"
 
-msgctxt "selection:sale.sale,invoice_state:0"
+msgctxt "selection:sale.sale,invoice_state:"
 msgid "Paid"
 msgstr "Платен"
 
-msgctxt "selection:sale.sale,invoice_state:0"
+msgctxt "selection:sale.sale,invoice_state:"
 msgid "Waiting"
 msgstr "Изчакващ"
 
-msgctxt "selection:sale.sale,shipment_method:0"
+msgctxt "selection:sale.sale,shipment_method:"
 msgid "Manual"
 msgstr "Ръчно"
 
-msgctxt "selection:sale.sale,shipment_method:0"
+msgctxt "selection:sale.sale,shipment_method:"
 msgid "On Invoice Paid"
 msgstr "При плащане на фактура"
 
-msgctxt "selection:sale.sale,shipment_method:0"
-msgid "On Order Confirmed"
-msgstr "При потвърждаване на поръчка"
+msgctxt "selection:sale.sale,shipment_method:"
+msgid "On Order Processed"
+msgstr "При обработена поръчка"
 
-msgctxt "selection:sale.sale,shipment_state:0"
+msgctxt "selection:sale.sale,shipment_state:"
 msgid "Exception"
 msgstr "Грешка"
 
-msgctxt "selection:sale.sale,shipment_state:0"
+msgctxt "selection:sale.sale,shipment_state:"
 msgid "None"
 msgstr "Няма"
 
-msgctxt "selection:sale.sale,shipment_state:0"
+msgctxt "selection:sale.sale,shipment_state:"
 msgid "Sent"
 msgstr "Изпратен"
 
-msgctxt "selection:sale.sale,shipment_state:0"
+msgctxt "selection:sale.sale,shipment_state:"
 msgid "Waiting"
 msgstr "Изчакващ"
 
-msgctxt "selection:sale.sale,state:0"
+msgctxt "selection:sale.sale,state:"
 msgid "Canceled"
 msgstr "Отказан"
 
-msgctxt "selection:sale.sale,state:0"
+msgctxt "selection:sale.sale,state:"
 msgid "Confirmed"
 msgstr "Потвърден"
 
-msgctxt "selection:sale.sale,state:0"
+msgctxt "selection:sale.sale,state:"
 msgid "Done"
 msgstr "Приключен"
 
-msgctxt "selection:sale.sale,state:0"
+msgctxt "selection:sale.sale,state:"
 msgid "Draft"
 msgstr "Проект"
 
-msgctxt "selection:sale.sale,state:0"
+msgctxt "selection:sale.sale,state:"
+msgid "Processing"
+msgstr "Обработване"
+
+msgctxt "selection:sale.sale,state:"
 msgid "Quotation"
 msgstr "Запитване"
 
-msgctxt "selection:stock.move,sale_exception_state:0"
+msgctxt "selection:stock.move,sale_exception_state:"
 msgid ""
 msgstr ""
 
-msgctxt "selection:stock.move,sale_exception_state:0"
+msgctxt "selection:stock.move,sale_exception_state:"
 msgid "Ignored"
 msgstr "Игнорирано"
 
-msgctxt "selection:stock.move,sale_exception_state:0"
+msgctxt "selection:stock.move,sale_exception_state:"
 msgid "Recreated"
 msgstr "Създаден наново"
 
-msgctxt "view:product.template:0"
+msgctxt "view:product.product:"
+msgid "Products"
+msgstr "Продукти"
+
+msgctxt "view:product.template:"
 msgid "Customers"
 msgstr "Клиенти"
 
-msgctxt "view:sale.configuration:0"
+msgctxt "view:sale.configuration:"
 msgid "Sale Configuration"
 msgstr "Конфигурация на продажба"
 
-msgctxt "view:sale.handle.invoice.exception.ask:0"
+msgctxt "view:sale.handle.invoice.exception.ask:"
 msgid "Choose invoices to recreate"
 msgstr "Избор на фактури за ново създаване"
 
-msgctxt "view:sale.handle.invoice.exception.ask:0"
+msgctxt "view:sale.handle.invoice.exception.ask:"
 msgid "Handle Invoice Exception"
 msgstr "Обработка на грешка към фактура"
 
-msgctxt "view:sale.handle.shipment.exception.ask:0"
+msgctxt "view:sale.handle.shipment.exception.ask:"
 msgid "Choose move to recreate"
 msgstr "Избор на движение за ново създаване"
 
-msgctxt "view:sale.handle.shipment.exception.ask:0"
+msgctxt "view:sale.handle.shipment.exception.ask:"
 msgid "Handle shipment Exception"
 msgstr "Обработване на грешка при изпращане"
 
-msgctxt "view:sale.handle.shipment.exception.ask:0"
+msgctxt "view:sale.handle.shipment.exception.ask:"
 msgid "Recreate Moves"
 msgstr "Наново създаване на движения"
 
-msgctxt "view:sale.line:0"
+msgctxt "view:sale.line:"
 msgid "General"
 msgstr "Основен"
 
-msgctxt "view:sale.line:0"
+msgctxt "view:sale.line:"
 msgid "Notes"
 msgstr "Бележки"
 
-msgctxt "view:sale.line:0"
+msgctxt "view:sale.line:"
 msgid "Products"
 msgstr "Продукти"
 
-msgctxt "view:sale.line:0"
+msgctxt "view:sale.line:"
 msgid "Sale Line"
 msgstr "Ред от продажба"
 
-msgctxt "view:sale.line:0"
+msgctxt "view:sale.line:"
 msgid "Sale Lines"
 msgstr "Редове от продажба"
 
-msgctxt "view:sale.sale:0"
+msgctxt "view:sale.sale:"
 msgid "Cancel"
 msgstr "Отказ"
 
-msgctxt "view:sale.sale:0"
+msgctxt "view:sale.sale:"
 msgid "Confirm"
 msgstr "Потвърждаване"
 
-msgctxt "view:sale.sale:0"
+msgctxt "view:sale.sale:"
 msgid "Draft"
 msgstr "Проект"
 
-msgctxt "view:sale.sale:0"
+msgctxt "view:sale.sale:"
 msgid "Handle Invoice Exception"
 msgstr "Обработка на грешка към фактура"
 
-msgctxt "view:sale.sale:0"
+msgctxt "view:sale.sale:"
 msgid "Handle Shipment Exception"
 msgstr "Обработване на грешка при изпращане"
 
-msgctxt "view:sale.sale:0"
+msgctxt "view:sale.sale:"
 msgid "Invoices"
 msgstr "Фактури"
 
-msgctxt "view:sale.sale:0"
+msgctxt "view:sale.sale:"
 msgid "Lines"
 msgstr "Редове"
 
-msgctxt "view:sale.sale:0"
+msgctxt "view:sale.sale:"
 msgid "Moves"
 msgstr "Движения"
 
-msgctxt "view:sale.sale:0"
+msgctxt "view:sale.sale:"
 msgid "Other Info"
 msgstr "Друга информация"
 
-msgctxt "view:sale.sale:0"
+msgctxt "view:sale.sale:"
+msgid "Process"
+msgstr ""
+
+msgctxt "view:sale.sale:"
 msgid "Quotation"
 msgstr "Запитване"
 
-msgctxt "view:sale.sale:0"
+msgctxt "view:sale.sale:"
+msgid "Quote"
+msgstr ""
+
+msgctxt "view:sale.sale:"
 msgid "Sale"
 msgstr "Продажба"
 
-msgctxt "view:sale.sale:0"
+msgctxt "view:sale.sale:"
 msgid "Sales"
 msgstr "Продажби"
 
-msgctxt "view:sale.sale:0"
+msgctxt "view:sale.sale:"
 msgid "Shipments"
 msgstr "Изпращания"
 
-msgctxt "wizard_button:sale.handle.invoice.exception,init,end:0"
+msgctxt "view:stock.move:"
+msgid "Moves"
+msgstr "Движения"
+
+msgctxt "wizard_button:sale.handle.invoice.exception,ask,end:"
 msgid "Cancel"
 msgstr "Отказ"
 
-msgctxt "wizard_button:sale.handle.invoice.exception,init,ok:0"
+msgctxt "wizard_button:sale.handle.invoice.exception,ask,handle:"
 msgid "Ok"
 msgstr "Добре"
 
-msgctxt "wizard_button:sale.handle.shipment.exception,init,end:0"
+msgctxt "wizard_button:sale.handle.shipment.exception,ask,end:"
 msgid "Cancel"
 msgstr "Отказ"
 
-msgctxt "wizard_button:sale.handle.shipment.exception,init,ok:0"
+msgctxt "wizard_button:sale.handle.shipment.exception,ask,handle:"
 msgid "Ok"
 msgstr "Добре"
diff --git a/locale/ca_ES.po b/locale/ca_ES.po
new file mode 100644
index 0000000..9eed94f
--- /dev/null
+++ b/locale/ca_ES.po
@@ -0,0 +1,1195 @@
+# 
+msgid ""
+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 "No pot esborrar factures que provenen d'una venda"
+
+msgctxt "error:account.invoice:"
+msgid "You cannot reset to draft an invoice generated by a sale."
+msgstr "No pot restablir a esborrany una factura generada per una venda."
+
+msgctxt "error:sale.line:"
+msgid "It misses an \"Account Revenue\" on product \"%s\"!"
+msgstr "Falta un «Compte d'ingressos» en el producte «%s»"
+
+msgctxt "error:sale.line:"
+msgid "It misses an \"account Revenue\" default property!"
+msgstr "Falta una propietat predeterminada de «Compte d'ingressos»"
+
+msgctxt "error:sale.line:"
+msgid "The customer location is required!"
+msgstr "Es necessita la ubicació del client"
+
+msgctxt "error:sale.sale:"
+msgid "Invoice and Shipment addresses must be defined for the quotation."
+msgstr ""
+"Les adreces de facturació i d'enviament han de ser definides per al "
+"pressupost."
+
+msgctxt "error:sale.sale:"
+msgid "It misses an \"Account Receivable\" on the party \"%s\"!"
+msgstr "Falta un «Compte d'ingressos» en el tercer «%s»"
+
+msgctxt "error:sale.sale:"
+msgid "Sale \"%s\" must be cancelled before deletion!"
+msgstr ""
+
+msgctxt "error:sale.sale:"
+msgid "Warehouse must be defined for the quotation."
+msgstr ""
+
+msgctxt "error:sale.sale:"
+msgid "Wrong combination of method!"
+msgstr "Combinació invàlida de mètodes"
+
+#, fuzzy
+msgctxt "error:stock.shipment.out.return:"
+msgid "You cannot reset to draft a move generated by a sale."
+msgstr "No pot restablir a esborrany un moviment generat per una venda."
+
+msgctxt "error:stock.shipment.out:"
+msgid "You cannot reset to draft a move generated by a sale."
+msgstr "No pot restablir a esborrany un moviment generat per una venda."
+
+msgctxt "field:account.invoice,sale_exception_state:"
+msgid "Exception State"
+msgstr "Estat d'excepció"
+
+#, fuzzy
+msgctxt "field:account.invoice,sales:"
+msgid "Sales"
+msgstr "Vendes"
+
+#, fuzzy
+msgctxt "field:account.invoice.line,sale_lines:"
+msgid "Sale Lines"
+msgstr "Línies de venda"
+
+#, fuzzy
+msgctxt "field:product.template,delivery_time:"
+msgid "Delivery Time"
+msgstr "Temps d'enviament"
+
+msgctxt "field:product.template,salable:"
+msgid "Salable"
+msgstr "Vendible"
+
+msgctxt "field:product.template,sale_uom:"
+msgid "Sale UOM"
+msgstr "UdM de venda"
+
+msgctxt "field:sale.configuration,create_date:"
+msgid "Create Date"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:sale.configuration,create_uid:"
+msgid "Create User"
+msgstr "Crear usuari"
+
+msgctxt "field:sale.configuration,id:"
+msgid "ID"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:sale.configuration,rec_name:"
+msgid "Name"
+msgstr "Nom del camp"
+
+msgctxt "field:sale.configuration,sale_invoice_method:"
+msgid "Sale Invoice Method"
+msgstr ""
+
+msgctxt "field:sale.configuration,sale_sequence:"
+msgid "Sale Reference Sequence"
+msgstr ""
+
+msgctxt "field:sale.configuration,sale_shipment_method:"
+msgid "Sale Shipment Method"
+msgstr ""
+
+msgctxt "field:sale.configuration,write_date:"
+msgid "Write Date"
+msgstr ""
+
+msgctxt "field:sale.configuration,write_uid:"
+msgid "Write User"
+msgstr ""
+
+msgctxt "field:sale.handle.invoice.exception.ask,domain_invoices:"
+msgid "Domain Invoices"
+msgstr "Factures del domini"
+
+msgctxt "field:sale.handle.invoice.exception.ask,id:"
+msgid "ID"
+msgstr ""
+
+msgctxt "field:sale.handle.invoice.exception.ask,recreate_invoices:"
+msgid "Recreate Invoices"
+msgstr "Refer factures"
+
+msgctxt "field:sale.handle.shipment.exception.ask,domain_moves:"
+msgid "Domain Moves"
+msgstr "Moviments de domini"
+
+msgctxt "field:sale.handle.shipment.exception.ask,id:"
+msgid "ID"
+msgstr ""
+
+msgctxt "field:sale.handle.shipment.exception.ask,recreate_moves:"
+msgid "Recreate Moves"
+msgstr "Refer moviments"
+
+msgctxt "field:sale.line,amount:"
+msgid "Amount"
+msgstr "Quantitat"
+
+msgctxt "field:sale.line,create_date:"
+msgid "Create Date"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:sale.line,create_uid:"
+msgid "Create User"
+msgstr "Crear usuari"
+
+msgctxt "field:sale.line,delivery_date:"
+msgid "Delivery Date"
+msgstr ""
+
+msgctxt "field:sale.line,description:"
+msgid "Description"
+msgstr "Descripció"
+
+#, fuzzy
+msgctxt "field:sale.line,from_location:"
+msgid "From Location"
+msgstr "Des de la ubicació"
+
+msgctxt "field:sale.line,id:"
+msgid "ID"
+msgstr ""
+
+msgctxt "field:sale.line,invoice_lines:"
+msgid "Invoice Lines"
+msgstr "Línies de factura"
+
+msgctxt "field:sale.line,move_done:"
+msgid "Moves Done"
+msgstr "Moviments acabats"
+
+msgctxt "field:sale.line,move_exception:"
+msgid "Moves Exception"
+msgstr "Excepció de moviments"
+
+msgctxt "field:sale.line,moves:"
+msgid "Moves"
+msgstr "Moviments"
+
+msgctxt "field:sale.line,moves_ignored:"
+msgid "Ignored Moves"
+msgstr "Moviments ignorats"
+
+msgctxt "field:sale.line,moves_recreated:"
+msgid "Recreated Moves"
+msgstr "Refer moviments"
+
+msgctxt "field:sale.line,note:"
+msgid "Note"
+msgstr "Nota"
+
+msgctxt "field:sale.line,product:"
+msgid "Product"
+msgstr "Producte"
+
+msgctxt "field:sale.line,product_uom_category:"
+msgid "Product Uom Category"
+msgstr ""
+
+msgctxt "field:sale.line,quantity:"
+msgid "Quantity"
+msgstr "Quantitat"
+
+msgctxt "field:sale.line,rec_name:"
+msgid "Name"
+msgstr "Nom"
+
+msgctxt "field:sale.line,sale:"
+msgid "Sale"
+msgstr "Venda"
+
+msgctxt "field:sale.line,sequence:"
+msgid "Sequence"
+msgstr "Seqüència"
+
+msgctxt "field:sale.line,taxes:"
+msgid "Taxes"
+msgstr "Impostos"
+
+#, fuzzy
+msgctxt "field:sale.line,to_location:"
+msgid "To Location"
+msgstr "A la ubicació"
+
+msgctxt "field:sale.line,type:"
+msgid "Type"
+msgstr "Tipus"
+
+msgctxt "field:sale.line,unit:"
+msgid "Unit"
+msgstr "Unitat"
+
+msgctxt "field:sale.line,unit_digits:"
+msgid "Unit Digits"
+msgstr "Dígits de la unitat"
+
+msgctxt "field:sale.line,unit_price:"
+msgid "Unit Price"
+msgstr "Preu unitari"
+
+#, fuzzy
+msgctxt "field:sale.line,warehouse:"
+msgid "Warehouse"
+msgstr "Magatzem"
+
+msgctxt "field:sale.line,write_date:"
+msgid "Write Date"
+msgstr ""
+
+msgctxt "field:sale.line,write_uid:"
+msgid "Write User"
+msgstr ""
+
+msgctxt "field:sale.line-account.invoice.line,create_date:"
+msgid "Create Date"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:sale.line-account.invoice.line,create_uid:"
+msgid "Create User"
+msgstr "Crear usuari"
+
+msgctxt "field:sale.line-account.invoice.line,id:"
+msgid "ID"
+msgstr ""
+
+msgctxt "field:sale.line-account.invoice.line,invoice_line:"
+msgid "Invoice Line"
+msgstr "Línia de factura"
+
+msgctxt "field:sale.line-account.invoice.line,rec_name:"
+msgid "Name"
+msgstr "Nom"
+
+msgctxt "field:sale.line-account.invoice.line,sale_line:"
+msgid "Sale Line"
+msgstr "Línia de venda"
+
+msgctxt "field:sale.line-account.invoice.line,write_date:"
+msgid "Write Date"
+msgstr ""
+
+msgctxt "field:sale.line-account.invoice.line,write_uid:"
+msgid "Write User"
+msgstr ""
+
+msgctxt "field:sale.line-account.tax,create_date:"
+msgid "Create Date"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:sale.line-account.tax,create_uid:"
+msgid "Create User"
+msgstr "Crear usuari"
+
+msgctxt "field:sale.line-account.tax,id:"
+msgid "ID"
+msgstr ""
+
+msgctxt "field:sale.line-account.tax,line:"
+msgid "Sale Line"
+msgstr "Línia de venda"
+
+msgctxt "field:sale.line-account.tax,rec_name:"
+msgid "Name"
+msgstr "Nom"
+
+msgctxt "field:sale.line-account.tax,tax:"
+msgid "Tax"
+msgstr "Impost"
+
+msgctxt "field:sale.line-account.tax,write_date:"
+msgid "Write Date"
+msgstr ""
+
+msgctxt "field:sale.line-account.tax,write_uid:"
+msgid "Write User"
+msgstr ""
+
+msgctxt "field:sale.line-ignored-stock.move,create_date:"
+msgid "Create Date"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:sale.line-ignored-stock.move,create_uid:"
+msgid "Create User"
+msgstr "Crear usuari"
+
+msgctxt "field:sale.line-ignored-stock.move,id:"
+msgid "ID"
+msgstr ""
+
+msgctxt "field:sale.line-ignored-stock.move,move:"
+msgid "Move"
+msgstr "Moviment"
+
+msgctxt "field:sale.line-ignored-stock.move,rec_name:"
+msgid "Name"
+msgstr "Nom"
+
+msgctxt "field:sale.line-ignored-stock.move,sale_line:"
+msgid "Sale Line"
+msgstr "Línia de venda"
+
+msgctxt "field:sale.line-ignored-stock.move,write_date:"
+msgid "Write Date"
+msgstr ""
+
+msgctxt "field:sale.line-ignored-stock.move,write_uid:"
+msgid "Write User"
+msgstr ""
+
+msgctxt "field:sale.line-recreated-stock.move,create_date:"
+msgid "Create Date"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:sale.line-recreated-stock.move,create_uid:"
+msgid "Create User"
+msgstr "Crear usuari"
+
+msgctxt "field:sale.line-recreated-stock.move,id:"
+msgid "ID"
+msgstr ""
+
+msgctxt "field:sale.line-recreated-stock.move,move:"
+msgid "Move"
+msgstr "Moviment"
+
+msgctxt "field:sale.line-recreated-stock.move,rec_name:"
+msgid "Name"
+msgstr "Nom"
+
+msgctxt "field:sale.line-recreated-stock.move,sale_line:"
+msgid "Sale Line"
+msgstr "Línia de venda"
+
+msgctxt "field:sale.line-recreated-stock.move,write_date:"
+msgid "Write Date"
+msgstr ""
+
+msgctxt "field:sale.line-recreated-stock.move,write_uid:"
+msgid "Write User"
+msgstr ""
+
+msgctxt "field:sale.sale,comment:"
+msgid "Comment"
+msgstr "Comentari"
+
+msgctxt "field:sale.sale,company:"
+msgid "Company"
+msgstr "Empresa"
+
+msgctxt "field:sale.sale,create_date:"
+msgid "Create Date"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:sale.sale,create_uid:"
+msgid "Create User"
+msgstr "Crear usuari"
+
+msgctxt "field:sale.sale,currency:"
+msgid "Currency"
+msgstr "Divisa"
+
+msgctxt "field:sale.sale,currency_digits:"
+msgid "Currency Digits"
+msgstr "Dígits de la divisa"
+
+msgctxt "field:sale.sale,description:"
+msgid "Description"
+msgstr "Descripció"
+
+msgctxt "field:sale.sale,id:"
+msgid "ID"
+msgstr ""
+
+msgctxt "field:sale.sale,invoice_address:"
+msgid "Invoice Address"
+msgstr "Adreça de facturació"
+
+msgctxt "field:sale.sale,invoice_method:"
+msgid "Invoice Method"
+msgstr "Mètode de facturació"
+
+msgctxt "field:sale.sale,invoice_state:"
+msgid "Invoice State"
+msgstr "Estat de factura"
+
+msgctxt "field:sale.sale,invoices:"
+msgid "Invoices"
+msgstr "Factures"
+
+msgctxt "field:sale.sale,invoices_ignored:"
+msgid "Ignored Invoices"
+msgstr "Factures ignorades"
+
+msgctxt "field:sale.sale,invoices_recreated:"
+msgid "Recreated Invoices"
+msgstr "Refer factures"
+
+msgctxt "field:sale.sale,lines:"
+msgid "Lines"
+msgstr "Línies"
+
+msgctxt "field:sale.sale,moves:"
+msgid "Moves"
+msgstr "Moviments"
+
+msgctxt "field:sale.sale,party:"
+msgid "Party"
+msgstr "Tercer"
+
+msgctxt "field:sale.sale,party_lang:"
+msgid "Party Language"
+msgstr "Idioma del tercer"
+
+msgctxt "field:sale.sale,payment_term:"
+msgid "Payment Term"
+msgstr "Terme de pagament"
+
+msgctxt "field:sale.sale,rec_name:"
+msgid "Name"
+msgstr "Nom"
+
+msgctxt "field:sale.sale,reference:"
+msgid "Reference"
+msgstr "Referència"
+
+msgctxt "field:sale.sale,sale_date:"
+msgid "Sale Date"
+msgstr "Data de venda"
+
+msgctxt "field:sale.sale,shipment_address:"
+msgid "Shipment Address"
+msgstr "Adreça d'enviament"
+
+msgctxt "field:sale.sale,shipment_method:"
+msgid "Shipment Method"
+msgstr "Mètode d'enviament"
+
+msgctxt "field:sale.sale,shipment_returns:"
+msgid "Shipment Returns"
+msgstr ""
+
+msgctxt "field:sale.sale,shipment_state:"
+msgid "Shipment State"
+msgstr "Estat d'enviament"
+
+msgctxt "field:sale.sale,shipments:"
+msgid "Shipments"
+msgstr "Enviaments"
+
+msgctxt "field:sale.sale,state:"
+msgid "State"
+msgstr "Estat"
+
+msgctxt "field:sale.sale,tax_amount:"
+msgid "Tax"
+msgstr "Impost"
+
+msgctxt "field:sale.sale,tax_amount_cache:"
+msgid "Tax Cache"
+msgstr ""
+
+msgctxt "field:sale.sale,total_amount:"
+msgid "Total"
+msgstr "Total"
+
+msgctxt "field:sale.sale,total_amount_cache:"
+msgid "Total Tax"
+msgstr ""
+
+msgctxt "field:sale.sale,untaxed_amount:"
+msgid "Untaxed"
+msgstr "Sense impost"
+
+msgctxt "field:sale.sale,untaxed_amount_cache:"
+msgid "Untaxed Cache"
+msgstr ""
+
+msgctxt "field:sale.sale,warehouse:"
+msgid "Warehouse"
+msgstr "Magatzem"
+
+msgctxt "field:sale.sale,write_date:"
+msgid "Write Date"
+msgstr ""
+
+msgctxt "field:sale.sale,write_uid:"
+msgid "Write User"
+msgstr ""
+
+msgctxt "field:sale.sale-account.invoice,create_date:"
+msgid "Create Date"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:sale.sale-account.invoice,create_uid:"
+msgid "Create User"
+msgstr "Crear usuari"
+
+msgctxt "field:sale.sale-account.invoice,id:"
+msgid "ID"
+msgstr ""
+
+msgctxt "field:sale.sale-account.invoice,invoice:"
+msgid "Invoice"
+msgstr "Factura"
+
+msgctxt "field:sale.sale-account.invoice,rec_name:"
+msgid "Name"
+msgstr "Nom"
+
+msgctxt "field:sale.sale-account.invoice,sale:"
+msgid "Sale"
+msgstr "Venda"
+
+msgctxt "field:sale.sale-account.invoice,write_date:"
+msgid "Write Date"
+msgstr ""
+
+msgctxt "field:sale.sale-account.invoice,write_uid:"
+msgid "Write User"
+msgstr ""
+
+msgctxt "field:sale.sale-ignored-account.invoice,create_date:"
+msgid "Create Date"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:sale.sale-ignored-account.invoice,create_uid:"
+msgid "Create User"
+msgstr "Crear usuari"
+
+msgctxt "field:sale.sale-ignored-account.invoice,id:"
+msgid "ID"
+msgstr ""
+
+msgctxt "field:sale.sale-ignored-account.invoice,invoice:"
+msgid "Invoice"
+msgstr "Factura"
+
+msgctxt "field:sale.sale-ignored-account.invoice,rec_name:"
+msgid "Name"
+msgstr "Nom"
+
+msgctxt "field:sale.sale-ignored-account.invoice,sale:"
+msgid "Sale"
+msgstr "Venda"
+
+msgctxt "field:sale.sale-ignored-account.invoice,write_date:"
+msgid "Write Date"
+msgstr ""
+
+msgctxt "field:sale.sale-ignored-account.invoice,write_uid:"
+msgid "Write User"
+msgstr ""
+
+msgctxt "field:sale.sale-recreated-account.invoice,create_date:"
+msgid "Create Date"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:sale.sale-recreated-account.invoice,create_uid:"
+msgid "Create User"
+msgstr "Crear usuari"
+
+msgctxt "field:sale.sale-recreated-account.invoice,id:"
+msgid "ID"
+msgstr ""
+
+msgctxt "field:sale.sale-recreated-account.invoice,invoice:"
+msgid "Invoice"
+msgstr "Factura"
+
+msgctxt "field:sale.sale-recreated-account.invoice,rec_name:"
+msgid "Name"
+msgstr "Nom"
+
+msgctxt "field:sale.sale-recreated-account.invoice,sale:"
+msgid "Sale"
+msgstr "Venda"
+
+msgctxt "field:sale.sale-recreated-account.invoice,write_date:"
+msgid "Write Date"
+msgstr ""
+
+msgctxt "field:sale.sale-recreated-account.invoice,write_uid:"
+msgid "Write User"
+msgstr ""
+
+msgctxt "field:stock.move,sale:"
+msgid "Sale"
+msgstr "Venda"
+
+msgctxt "field:stock.move,sale_exception_state:"
+msgid "Exception State"
+msgstr "Estat excepció"
+
+#, fuzzy
+msgctxt "field:stock.move,sale_line:"
+msgid "Sale Line"
+msgstr "Línia de venda"
+
+#, fuzzy
+msgctxt "help:product.template,delivery_time:"
+msgid "In number of days"
+msgstr "En nombre de dies"
+
+msgctxt "help:sale.handle.invoice.exception.ask,recreate_invoices:"
+msgid ""
+"The selected invoices will be recreated. The other ones will be ignored."
+msgstr ""
+"Les factures seleccionades seran recreades. Les altres seran ignorades."
+
+msgctxt "model:ir.action,name:act_invoice_form"
+msgid "Invoices"
+msgstr "Factures"
+
+msgctxt "model:ir.action,name:act_open_customer"
+msgid "Parties associated to Sales"
+msgstr "Tercers associats a vendes"
+
+msgctxt "model:ir.action,name:act_return_form"
+msgid "Returns"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_sale_configuration_form"
+msgid "Sales Configuration"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_sale_form"
+msgid "Sales"
+msgstr "Vendes"
+
+msgctxt "model:ir.action,name:act_sale_form2"
+msgid "Sales"
+msgstr "Vendes"
+
+msgctxt "model:ir.action,name:act_sale_form_confirmed"
+msgid "Confirmed Sales"
+msgstr "Vendes confirmades"
+
+msgctxt "model:ir.action,name:act_sale_form_draft"
+msgid "Draft Sales"
+msgstr "Vendes en esborrany"
+
+msgctxt "model:ir.action,name:act_sale_form_processing"
+msgid "Processing Sales"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_sale_form_quotation"
+msgid "Quotation Sales"
+msgstr "Vendes pressupostades"
+
+msgctxt "model:ir.action,name:act_shipment_form"
+msgid "Shipments"
+msgstr "Enviaments"
+
+msgctxt "model:ir.action,name:report_sale"
+msgid "Sale"
+msgstr "Venda"
+
+msgctxt "model:ir.action,name:wizard_invoice_handle_exception"
+msgid "Handle Invoice Exception"
+msgstr "Gestionar excepció de factura"
+
+msgctxt "model:ir.action,name:wizard_return_sale"
+msgid "Create Return Sale"
+msgstr ""
+
+msgctxt "model:ir.action,name:wizard_shipment_handle_exception"
+msgid "Handle Shipment Exception"
+msgstr "Gestionar excepció d'enviament"
+
+msgctxt "model:ir.sequence,name:sequence_sale"
+msgid "Sale"
+msgstr "Venda"
+
+msgctxt "model:ir.sequence.type,name:sequence_type_sale"
+msgid "Sale"
+msgstr "Venda"
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_configuration"
+msgid "Configuration"
+msgstr "Configuració"
+
+msgctxt "model:ir.ui.menu,name:menu_customer"
+msgid "Parties associated to Sales"
+msgstr "Tercers associats a vendes"
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_sale"
+msgid "Sales"
+msgstr "Gestió de vendes"
+
+msgctxt "model:ir.ui.menu,name:menu_sale_configuration"
+msgid "Sales Configuration"
+msgstr ""
+
+msgctxt "model:ir.ui.menu,name:menu_sale_form"
+msgid "Sales"
+msgstr "Vendes"
+
+msgctxt "model:ir.ui.menu,name:menu_sale_form_confirmed"
+msgid "Confirmed Sales"
+msgstr "Vendes confirmades"
+
+msgctxt "model:ir.ui.menu,name:menu_sale_form_draft"
+msgid "Draft Sales"
+msgstr "Vendes en esborrany"
+
+msgctxt "model:ir.ui.menu,name:menu_sale_form_processing"
+msgid "Processing Sales"
+msgstr ""
+
+msgctxt "model:ir.ui.menu,name:menu_sale_form_quotation"
+msgid "Quotation Sales"
+msgstr "Vendes pressupostades"
+
+#, fuzzy
+msgctxt "model:res.group,name:group_sale"
+msgid "Sales"
+msgstr "Venda"
+
+msgctxt "model:res.group,name:group_sale_admin"
+msgid "Sales Administrator"
+msgstr ""
+
+msgctxt "model:sale.configuration,name:"
+msgid "Sale Configuration"
+msgstr ""
+
+#, fuzzy
+msgctxt "model:sale.handle.invoice.exception.ask,name:"
+msgid "Handle Invoice Exception"
+msgstr "Excepció de factura - Petició"
+
+#, fuzzy
+msgctxt "model:sale.handle.shipment.exception.ask,name:"
+msgid "Handle Shipment Exception"
+msgstr "Excepció d'enviament - Petició"
+
+msgctxt "model:sale.line,name:"
+msgid "Sale Line"
+msgstr "Línia de venda"
+
+msgctxt "model:sale.line-account.invoice.line,name:"
+msgid "Sale Line - Invoice Line"
+msgstr "Línia de venda - Línia de factura"
+
+msgctxt "model:sale.line-account.tax,name:"
+msgid "Sale Line - Tax"
+msgstr "Línia de venda - Imposat"
+
+msgctxt "model:sale.line-ignored-stock.move,name:"
+msgid "Sale Line - Ignored Move"
+msgstr "Línia de venda - Moviment ignorat"
+
+msgctxt "model:sale.line-recreated-stock.move,name:"
+msgid "Sale Line - Recreated Move"
+msgstr "Línia de venda - Moviment recreat"
+
+msgctxt "model:sale.sale,name:"
+msgid "Sale"
+msgstr "Venda"
+
+msgctxt "model:sale.sale-account.invoice,name:"
+msgid "Sale - Invoice"
+msgstr "Venda - Factura"
+
+msgctxt "model:sale.sale-ignored-account.invoice,name:"
+msgid "Sale - Ignored Invoice"
+msgstr "Venda - Factura ignorada"
+
+msgctxt "model:sale.sale-recreated-account.invoice,name:"
+msgid "Sale - Recreated Invoice"
+msgstr "Venda - Factura recreada"
+
+msgctxt "odt:sale.sale:"
+msgid "Amount"
+msgstr "Quantitat"
+
+msgctxt "odt:sale.sale:"
+msgid "Date:"
+msgstr "Data:"
+
+msgctxt "odt:sale.sale:"
+msgid "Description"
+msgstr "Descripció"
+
+msgctxt "odt:sale.sale:"
+msgid "Description:"
+msgstr "Descripció:"
+
+msgctxt "odt:sale.sale:"
+msgid "Draft Sale Order"
+msgstr "Ordre de venda en esborrany"
+
+msgctxt "odt:sale.sale:"
+msgid "E-Mail:"
+msgstr "Correu electrònic:"
+
+msgctxt "odt:sale.sale:"
+msgid "Phone:"
+msgstr "Telèfon:"
+
+msgctxt "odt:sale.sale:"
+msgid "Quantity"
+msgstr "Quantitat"
+
+msgctxt "odt:sale.sale:"
+msgid "Quotation N°:"
+msgstr "Pressupost nº:"
+
+msgctxt "odt:sale.sale:"
+msgid "Sale Order N°:"
+msgstr "Ordre de venda nº:"
+
+msgctxt "odt:sale.sale:"
+msgid "Taxes"
+msgstr "Impostos"
+
+msgctxt "odt:sale.sale:"
+msgid "Taxes:"
+msgstr "Impostos:"
+
+msgctxt "odt:sale.sale:"
+msgid "Total (excl. taxes):"
+msgstr "Total (sense impostos):"
+
+msgctxt "odt:sale.sale:"
+msgid "Total:"
+msgstr "Total:"
+
+msgctxt "odt:sale.sale:"
+msgid "Unit Price"
+msgstr "Preu unitari"
+
+msgctxt "odt:sale.sale:"
+msgid "VAT Number:"
+msgstr ""
+
+msgctxt "odt:sale.sale:"
+msgid "VAT:"
+msgstr "NIF:"
+
+msgctxt "selection:account.invoice,sale_exception_state:"
+msgid ""
+msgstr ""
+
+msgctxt "selection:account.invoice,sale_exception_state:"
+msgid "Ignored"
+msgstr "Ignorat"
+
+msgctxt "selection:account.invoice,sale_exception_state:"
+msgid "Recreated"
+msgstr "Refet"
+
+#, fuzzy
+msgctxt "selection:sale.configuration,sale_invoice_method:"
+msgid "Manual"
+msgstr "Manual"
+
+msgctxt "selection:sale.configuration,sale_invoice_method:"
+msgid "On Order Processed"
+msgstr ""
+
+#, fuzzy
+msgctxt "selection:sale.configuration,sale_invoice_method:"
+msgid "On Shipment Sent"
+msgstr "En Enviar-ho"
+
+#, fuzzy
+msgctxt "selection:sale.configuration,sale_shipment_method:"
+msgid "Manual"
+msgstr "Manual"
+
+#, fuzzy
+msgctxt "selection:sale.configuration,sale_shipment_method:"
+msgid "On Invoice Paid"
+msgstr "En pagar la factura"
+
+msgctxt "selection:sale.configuration,sale_shipment_method:"
+msgid "On Order Processed"
+msgstr ""
+
+msgctxt "selection:sale.line,type:"
+msgid "Comment"
+msgstr "Comentari"
+
+msgctxt "selection:sale.line,type:"
+msgid "Line"
+msgstr "Línia"
+
+msgctxt "selection:sale.line,type:"
+msgid "Subtotal"
+msgstr "Subtotal"
+
+msgctxt "selection:sale.line,type:"
+msgid "Title"
+msgstr "Títol"
+
+msgctxt "selection:sale.sale,invoice_method:"
+msgid "Manual"
+msgstr "Manual"
+
+msgctxt "selection:sale.sale,invoice_method:"
+msgid "On Order Processed"
+msgstr ""
+
+msgctxt "selection:sale.sale,invoice_method:"
+msgid "On Shipment Sent"
+msgstr "En Enviar-ho"
+
+msgctxt "selection:sale.sale,invoice_state:"
+msgid "Exception"
+msgstr "Excepció"
+
+msgctxt "selection:sale.sale,invoice_state:"
+msgid "None"
+msgstr "Cap"
+
+msgctxt "selection:sale.sale,invoice_state:"
+msgid "Paid"
+msgstr "Pagat"
+
+msgctxt "selection:sale.sale,invoice_state:"
+msgid "Waiting"
+msgstr "En espera"
+
+msgctxt "selection:sale.sale,shipment_method:"
+msgid "Manual"
+msgstr "Manual"
+
+msgctxt "selection:sale.sale,shipment_method:"
+msgid "On Invoice Paid"
+msgstr "En pagar la factura"
+
+msgctxt "selection:sale.sale,shipment_method:"
+msgid "On Order Processed"
+msgstr ""
+
+msgctxt "selection:sale.sale,shipment_state:"
+msgid "Exception"
+msgstr "Excepció"
+
+msgctxt "selection:sale.sale,shipment_state:"
+msgid "None"
+msgstr "Cap"
+
+msgctxt "selection:sale.sale,shipment_state:"
+msgid "Sent"
+msgstr "Enviat"
+
+msgctxt "selection:sale.sale,shipment_state:"
+msgid "Waiting"
+msgstr "En espera"
+
+msgctxt "selection:sale.sale,state:"
+msgid "Canceled"
+msgstr "Cancel·lat"
+
+msgctxt "selection:sale.sale,state:"
+msgid "Confirmed"
+msgstr "Confirmat"
+
+msgctxt "selection:sale.sale,state:"
+msgid "Done"
+msgstr "Acabada"
+
+msgctxt "selection:sale.sale,state:"
+msgid "Draft"
+msgstr "Esborrany"
+
+#, fuzzy
+msgctxt "selection:sale.sale,state:"
+msgid "Processing"
+msgstr "Processament"
+
+msgctxt "selection:sale.sale,state:"
+msgid "Quotation"
+msgstr "Pressupost"
+
+msgctxt "selection:stock.move,sale_exception_state:"
+msgid ""
+msgstr ""
+
+msgctxt "selection:stock.move,sale_exception_state:"
+msgid "Ignored"
+msgstr "Ignorat"
+
+msgctxt "selection:stock.move,sale_exception_state:"
+msgid "Recreated"
+msgstr "Refer"
+
+msgctxt "view:product.product:"
+msgid "Customers"
+msgstr "Clients"
+
+#, fuzzy
+msgctxt "view:product.product:"
+msgid "Products"
+msgstr "Productes"
+
+msgctxt "view:product.template:"
+msgid "Customers"
+msgstr "Clients"
+
+msgctxt "view:sale.configuration:"
+msgid "Sale Configuration"
+msgstr ""
+
+msgctxt "view:sale.handle.invoice.exception.ask:"
+msgid "Choose invoices to recreate"
+msgstr "Esculli una factura a refer"
+
+msgctxt "view:sale.handle.invoice.exception.ask:"
+msgid "Handle Invoice Exception"
+msgstr "Excepció de maneig de factura"
+
+msgctxt "view:sale.handle.shipment.exception.ask:"
+msgid "Choose move to recreate"
+msgstr "Esculli un moviment a refer"
+
+msgctxt "view:sale.handle.shipment.exception.ask:"
+msgid "Handle shipment Exception"
+msgstr "Manejar excepció d'enviament"
+
+msgctxt "view:sale.handle.shipment.exception.ask:"
+msgid "Recreate Moves"
+msgstr "Recrear moviments"
+
+msgctxt "view:sale.line:"
+msgid "General"
+msgstr "General"
+
+msgctxt "view:sale.line:"
+msgid "Notes"
+msgstr "Notes"
+
+msgctxt "view:sale.line:"
+msgid "Products"
+msgstr "Productes"
+
+msgctxt "view:sale.line:"
+msgid "Sale Line"
+msgstr "Línia de venda"
+
+msgctxt "view:sale.line:"
+msgid "Sale Lines"
+msgstr "Línies de venda"
+
+msgctxt "view:sale.sale:"
+msgid "Cancel"
+msgstr "Cancel·lar"
+
+msgctxt "view:sale.sale:"
+msgid "Confirm"
+msgstr "Confirmar"
+
+msgctxt "view:sale.sale:"
+msgid "Draft"
+msgstr "Esborrany"
+
+msgctxt "view:sale.sale:"
+msgid "Handle Invoice Exception"
+msgstr "Gestionar l'excepció de factura"
+
+msgctxt "view:sale.sale:"
+msgid "Handle Shipment Exception"
+msgstr "Gestionar excepció d'enviament"
+
+msgctxt "view:sale.sale:"
+msgid "Ignore Invoice Exception"
+msgstr "Ignorar excepció de factura"
+
+msgctxt "view:sale.sale:"
+msgid "Invoices"
+msgstr "Factures"
+
+msgctxt "view:sale.sale:"
+msgid "Lines"
+msgstr "Línies"
+
+msgctxt "view:sale.sale:"
+msgid "Moves"
+msgstr "Moviments"
+
+msgctxt "view:sale.sale:"
+msgid "Other Info"
+msgstr "Informació addicional"
+
+msgctxt "view:sale.sale:"
+msgid "Process"
+msgstr ""
+
+msgctxt "view:sale.sale:"
+msgid "Quotation"
+msgstr "Pressupost"
+
+msgctxt "view:sale.sale:"
+msgid "Quote"
+msgstr ""
+
+msgctxt "view:sale.sale:"
+msgid "Sale"
+msgstr "Venda"
+
+msgctxt "view:sale.sale:"
+msgid "Sales"
+msgstr "Vendes"
+
+msgctxt "view:sale.sale:"
+msgid "Shipments"
+msgstr "Enviaments"
+
+#, fuzzy
+msgctxt "view:stock.move:"
+msgid "Moves"
+msgstr "Moviments"
+
+#, fuzzy
+msgctxt "wizard_button:sale.handle.invoice.exception,ask,end:"
+msgid "Cancel"
+msgstr "Cancel·lar"
+
+#, fuzzy
+msgctxt "wizard_button:sale.handle.invoice.exception,ask,handle:"
+msgid "Ok"
+msgstr "Acceptar"
+
+#, fuzzy
+msgctxt "wizard_button:sale.handle.shipment.exception,ask,end:"
+msgid "Cancel"
+msgstr "Cancel·lar"
+
+#, fuzzy
+msgctxt "wizard_button:sale.handle.shipment.exception,ask,handle:"
+msgid "Ok"
+msgstr "Acceptar"
diff --git a/locale/cs_CZ.po b/locale/cs_CZ.po
index ad771e2..48a5ca2 100644
--- a/locale/cs_CZ.po
+++ b/locale/cs_CZ.po
@@ -2,403 +2,643 @@
 msgid ""
 msgstr "Content-Type: text/plain; charset=utf-8\n"
 
-msgctxt "error:account.invoice:0"
+msgctxt "error:account.invoice:"
 msgid "You can not delete invoices that come from a sale!"
 msgstr ""
 
-msgctxt "error:account.invoice:0"
+msgctxt "error:account.invoice:"
 msgid "You cannot reset to draft an invoice generated by a sale."
 msgstr ""
 
-msgctxt "error:sale.line:0"
+msgctxt "error:sale.line:"
 msgid "It misses an \"Account Revenue\" on product \"%s\"!"
 msgstr ""
 
-msgctxt "error:sale.line:0"
+msgctxt "error:sale.line:"
 msgid "It misses an \"account Revenue\" default property!"
 msgstr ""
 
-msgctxt "error:sale.line:0"
+msgctxt "error:sale.line:"
 msgid "The customer location is required!"
 msgstr ""
 
-msgctxt "error:sale.sale:0"
+msgctxt "error:sale.sale:"
 msgid "Invoice and Shipment addresses must be defined for the quotation."
 msgstr ""
 
-msgctxt "error:sale.sale:0"
+msgctxt "error:sale.sale:"
 msgid "It misses an \"Account Receivable\" on the party \"%s\"!"
 msgstr ""
 
-msgctxt "error:sale.sale:0"
+msgctxt "error:sale.sale:"
+msgid "Sale \"%s\" must be cancelled before deletion!"
+msgstr ""
+
+msgctxt "error:sale.sale:"
+msgid "Warehouse must be defined for the quotation."
+msgstr ""
+
+msgctxt "error:sale.sale:"
 msgid "Wrong combination of method!"
 msgstr ""
 
-msgctxt "error:stock.shipment.out:0"
+msgctxt "error:stock.shipment.out.return:"
+msgid "You cannot reset to draft a move generated by a sale."
+msgstr ""
+
+msgctxt "error:stock.shipment.out:"
 msgid "You cannot reset to draft a move generated by a sale."
 msgstr ""
 
-msgctxt "field:account.invoice,sale_exception_state:0"
+msgctxt "field:account.invoice,sale_exception_state:"
 msgid "Exception State"
 msgstr ""
 
-msgctxt "field:account.invoice,sales:0"
+msgctxt "field:account.invoice,sales:"
 msgid "Sales"
 msgstr ""
 
-msgctxt "field:account.invoice.line,sale_lines:0"
+msgctxt "field:account.invoice.line,sale_lines:"
 msgid "Sale Lines"
 msgstr ""
 
-msgctxt "field:product.template,delivery_time:0"
+msgctxt "field:product.template,delivery_time:"
 msgid "Delivery Time"
 msgstr ""
 
-msgctxt "field:product.template,salable:0"
+msgctxt "field:product.template,salable:"
 msgid "Salable"
 msgstr ""
 
-msgctxt "field:product.template,sale_uom:0"
+msgctxt "field:product.template,sale_uom:"
 msgid "Sale UOM"
 msgstr ""
 
-msgctxt "field:sale.configuration,rec_name:0"
+msgctxt "field:sale.configuration,create_date:"
+msgid "Create Date"
+msgstr ""
+
+msgctxt "field:sale.configuration,create_uid:"
+msgid "Create User"
+msgstr ""
+
+msgctxt "field:sale.configuration,id:"
+msgid "ID"
+msgstr ""
+
+msgctxt "field:sale.configuration,rec_name:"
 msgid "Name"
 msgstr ""
 
-msgctxt "field:sale.configuration,sale_invoice_method:0"
+msgctxt "field:sale.configuration,sale_invoice_method:"
 msgid "Sale Invoice Method"
 msgstr ""
 
-msgctxt "field:sale.configuration,sale_sequence:0"
+msgctxt "field:sale.configuration,sale_sequence:"
 msgid "Sale Reference Sequence"
 msgstr ""
 
-msgctxt "field:sale.configuration,sale_shipment_method:0"
+msgctxt "field:sale.configuration,sale_shipment_method:"
 msgid "Sale Shipment Method"
 msgstr ""
 
-msgctxt "field:sale.handle.invoice.exception.ask,domain_invoices:0"
+msgctxt "field:sale.configuration,write_date:"
+msgid "Write Date"
+msgstr ""
+
+msgctxt "field:sale.configuration,write_uid:"
+msgid "Write User"
+msgstr ""
+
+msgctxt "field:sale.handle.invoice.exception.ask,domain_invoices:"
 msgid "Domain Invoices"
 msgstr ""
 
-msgctxt "field:sale.handle.invoice.exception.ask,recreate_invoices:0"
+msgctxt "field:sale.handle.invoice.exception.ask,id:"
+msgid "ID"
+msgstr ""
+
+msgctxt "field:sale.handle.invoice.exception.ask,recreate_invoices:"
 msgid "Recreate Invoices"
 msgstr ""
 
-msgctxt "field:sale.handle.shipment.exception.ask,domain_moves:0"
+msgctxt "field:sale.handle.shipment.exception.ask,domain_moves:"
 msgid "Domain Moves"
 msgstr ""
 
-msgctxt "field:sale.handle.shipment.exception.ask,recreate_moves:0"
+msgctxt "field:sale.handle.shipment.exception.ask,id:"
+msgid "ID"
+msgstr ""
+
+msgctxt "field:sale.handle.shipment.exception.ask,recreate_moves:"
 msgid "Recreate Moves"
 msgstr ""
 
-msgctxt "field:sale.line,amount:0"
+msgctxt "field:sale.line,amount:"
 msgid "Amount"
 msgstr ""
 
-msgctxt "field:sale.line,description:0"
+msgctxt "field:sale.line,create_date:"
+msgid "Create Date"
+msgstr ""
+
+msgctxt "field:sale.line,create_uid:"
+msgid "Create User"
+msgstr ""
+
+msgctxt "field:sale.line,delivery_date:"
+msgid "Delivery Date"
+msgstr ""
+
+msgctxt "field:sale.line,description:"
 msgid "Description"
 msgstr ""
 
-msgctxt "field:sale.line,invoice_lines:0"
+msgctxt "field:sale.line,from_location:"
+msgid "From Location"
+msgstr ""
+
+msgctxt "field:sale.line,id:"
+msgid "ID"
+msgstr ""
+
+msgctxt "field:sale.line,invoice_lines:"
 msgid "Invoice Lines"
 msgstr ""
 
-msgctxt "field:sale.line,move_done:0"
+msgctxt "field:sale.line,move_done:"
 msgid "Moves Done"
 msgstr ""
 
-msgctxt "field:sale.line,move_exception:0"
+msgctxt "field:sale.line,move_exception:"
 msgid "Moves Exception"
 msgstr ""
 
-msgctxt "field:sale.line,moves:0"
+msgctxt "field:sale.line,moves:"
 msgid "Moves"
 msgstr ""
 
-msgctxt "field:sale.line,moves_ignored:0"
+msgctxt "field:sale.line,moves_ignored:"
 msgid "Ignored Moves"
 msgstr ""
 
-msgctxt "field:sale.line,moves_recreated:0"
+msgctxt "field:sale.line,moves_recreated:"
 msgid "Recreated Moves"
 msgstr ""
 
-msgctxt "field:sale.line,note:0"
+msgctxt "field:sale.line,note:"
 msgid "Note"
 msgstr ""
 
-msgctxt "field:sale.line,product:0"
+msgctxt "field:sale.line,product:"
 msgid "Product"
 msgstr ""
 
-msgctxt "field:sale.line,quantity:0"
+msgctxt "field:sale.line,product_uom_category:"
+msgid "Product Uom Category"
+msgstr ""
+
+msgctxt "field:sale.line,quantity:"
 msgid "Quantity"
 msgstr ""
 
-msgctxt "field:sale.line,rec_name:0"
+msgctxt "field:sale.line,rec_name:"
 msgid "Name"
 msgstr ""
 
-msgctxt "field:sale.line,sale:0"
+msgctxt "field:sale.line,sale:"
 msgid "Sale"
 msgstr ""
 
-msgctxt "field:sale.line,sequence:0"
+msgctxt "field:sale.line,sequence:"
 msgid "Sequence"
 msgstr ""
 
-msgctxt "field:sale.line,taxes:0"
+msgctxt "field:sale.line,taxes:"
 msgid "Taxes"
 msgstr ""
 
-msgctxt "field:sale.line,type:0"
+msgctxt "field:sale.line,to_location:"
+msgid "To Location"
+msgstr ""
+
+msgctxt "field:sale.line,type:"
 msgid "Type"
 msgstr ""
 
-msgctxt "field:sale.line,unit:0"
+msgctxt "field:sale.line,unit:"
 msgid "Unit"
 msgstr ""
 
-msgctxt "field:sale.line,unit_digits:0"
+msgctxt "field:sale.line,unit_digits:"
 msgid "Unit Digits"
 msgstr ""
 
-msgctxt "field:sale.line,unit_price:0"
+msgctxt "field:sale.line,unit_price:"
 msgid "Unit Price"
 msgstr ""
 
-msgctxt "field:sale.line-account.invoice.line,invoice_line:0"
+msgctxt "field:sale.line,warehouse:"
+msgid "Warehouse"
+msgstr ""
+
+msgctxt "field:sale.line,write_date:"
+msgid "Write Date"
+msgstr ""
+
+msgctxt "field:sale.line,write_uid:"
+msgid "Write User"
+msgstr ""
+
+msgctxt "field:sale.line-account.invoice.line,create_date:"
+msgid "Create Date"
+msgstr ""
+
+msgctxt "field:sale.line-account.invoice.line,create_uid:"
+msgid "Create User"
+msgstr ""
+
+msgctxt "field:sale.line-account.invoice.line,id:"
+msgid "ID"
+msgstr ""
+
+msgctxt "field:sale.line-account.invoice.line,invoice_line:"
 msgid "Invoice Line"
 msgstr ""
 
-msgctxt "field:sale.line-account.invoice.line,rec_name:0"
+msgctxt "field:sale.line-account.invoice.line,rec_name:"
 msgid "Name"
 msgstr ""
 
-msgctxt "field:sale.line-account.invoice.line,sale_line:0"
+msgctxt "field:sale.line-account.invoice.line,sale_line:"
 msgid "Sale Line"
 msgstr ""
 
-msgctxt "field:sale.line-account.tax,line:0"
+msgctxt "field:sale.line-account.invoice.line,write_date:"
+msgid "Write Date"
+msgstr ""
+
+msgctxt "field:sale.line-account.invoice.line,write_uid:"
+msgid "Write User"
+msgstr ""
+
+msgctxt "field:sale.line-account.tax,create_date:"
+msgid "Create Date"
+msgstr ""
+
+msgctxt "field:sale.line-account.tax,create_uid:"
+msgid "Create User"
+msgstr ""
+
+msgctxt "field:sale.line-account.tax,id:"
+msgid "ID"
+msgstr ""
+
+msgctxt "field:sale.line-account.tax,line:"
 msgid "Sale Line"
 msgstr ""
 
-msgctxt "field:sale.line-account.tax,rec_name:0"
+msgctxt "field:sale.line-account.tax,rec_name:"
 msgid "Name"
 msgstr ""
 
-msgctxt "field:sale.line-account.tax,tax:0"
+msgctxt "field:sale.line-account.tax,tax:"
 msgid "Tax"
 msgstr ""
 
-msgctxt "field:sale.line-ignored-stock.move,move:0"
+msgctxt "field:sale.line-account.tax,write_date:"
+msgid "Write Date"
+msgstr ""
+
+msgctxt "field:sale.line-account.tax,write_uid:"
+msgid "Write User"
+msgstr ""
+
+msgctxt "field:sale.line-ignored-stock.move,create_date:"
+msgid "Create Date"
+msgstr ""
+
+msgctxt "field:sale.line-ignored-stock.move,create_uid:"
+msgid "Create User"
+msgstr ""
+
+msgctxt "field:sale.line-ignored-stock.move,id:"
+msgid "ID"
+msgstr ""
+
+msgctxt "field:sale.line-ignored-stock.move,move:"
 msgid "Move"
 msgstr ""
 
-msgctxt "field:sale.line-ignored-stock.move,rec_name:0"
+msgctxt "field:sale.line-ignored-stock.move,rec_name:"
 msgid "Name"
 msgstr ""
 
-msgctxt "field:sale.line-ignored-stock.move,sale_line:0"
+msgctxt "field:sale.line-ignored-stock.move,sale_line:"
 msgid "Sale Line"
 msgstr ""
 
-msgctxt "field:sale.line-recreated-stock.move,move:0"
+msgctxt "field:sale.line-ignored-stock.move,write_date:"
+msgid "Write Date"
+msgstr ""
+
+msgctxt "field:sale.line-ignored-stock.move,write_uid:"
+msgid "Write User"
+msgstr ""
+
+msgctxt "field:sale.line-recreated-stock.move,create_date:"
+msgid "Create Date"
+msgstr ""
+
+msgctxt "field:sale.line-recreated-stock.move,create_uid:"
+msgid "Create User"
+msgstr ""
+
+msgctxt "field:sale.line-recreated-stock.move,id:"
+msgid "ID"
+msgstr ""
+
+msgctxt "field:sale.line-recreated-stock.move,move:"
 msgid "Move"
 msgstr ""
 
-msgctxt "field:sale.line-recreated-stock.move,rec_name:0"
+msgctxt "field:sale.line-recreated-stock.move,rec_name:"
 msgid "Name"
 msgstr ""
 
-msgctxt "field:sale.line-recreated-stock.move,sale_line:0"
+msgctxt "field:sale.line-recreated-stock.move,sale_line:"
 msgid "Sale Line"
 msgstr ""
 
-msgctxt "field:sale.sale,comment:0"
+msgctxt "field:sale.line-recreated-stock.move,write_date:"
+msgid "Write Date"
+msgstr ""
+
+msgctxt "field:sale.line-recreated-stock.move,write_uid:"
+msgid "Write User"
+msgstr ""
+
+msgctxt "field:sale.sale,comment:"
 msgid "Comment"
 msgstr ""
 
-msgctxt "field:sale.sale,company:0"
+msgctxt "field:sale.sale,company:"
 msgid "Company"
 msgstr ""
 
-msgctxt "field:sale.sale,currency:0"
+msgctxt "field:sale.sale,create_date:"
+msgid "Create Date"
+msgstr ""
+
+msgctxt "field:sale.sale,create_uid:"
+msgid "Create User"
+msgstr ""
+
+msgctxt "field:sale.sale,currency:"
 msgid "Currency"
 msgstr ""
 
-msgctxt "field:sale.sale,currency_digits:0"
+msgctxt "field:sale.sale,currency_digits:"
 msgid "Currency Digits"
 msgstr ""
 
-msgctxt "field:sale.sale,description:0"
+msgctxt "field:sale.sale,description:"
 msgid "Description"
 msgstr ""
 
-msgctxt "field:sale.sale,invoice_address:0"
-msgid "Invoice Address"
+msgctxt "field:sale.sale,id:"
+msgid "ID"
 msgstr ""
 
-msgctxt "field:sale.sale,invoice_exception:0"
-msgid "Invoices Exception"
+msgctxt "field:sale.sale,invoice_address:"
+msgid "Invoice Address"
 msgstr ""
 
-msgctxt "field:sale.sale,invoice_method:0"
+msgctxt "field:sale.sale,invoice_method:"
 msgid "Invoice Method"
 msgstr ""
 
-msgctxt "field:sale.sale,invoice_paid:0"
-msgid "Invoices Paid"
-msgstr ""
-
-msgctxt "field:sale.sale,invoice_state:0"
+msgctxt "field:sale.sale,invoice_state:"
 msgid "Invoice State"
 msgstr ""
 
-msgctxt "field:sale.sale,invoices:0"
+msgctxt "field:sale.sale,invoices:"
 msgid "Invoices"
 msgstr ""
 
-msgctxt "field:sale.sale,invoices_ignored:0"
+msgctxt "field:sale.sale,invoices_ignored:"
 msgid "Ignored Invoices"
 msgstr ""
 
-msgctxt "field:sale.sale,invoices_recreated:0"
+msgctxt "field:sale.sale,invoices_recreated:"
 msgid "Recreated Invoices"
 msgstr ""
 
-msgctxt "field:sale.sale,lines:0"
+msgctxt "field:sale.sale,lines:"
 msgid "Lines"
 msgstr ""
 
-msgctxt "field:sale.sale,moves:0"
+msgctxt "field:sale.sale,moves:"
 msgid "Moves"
 msgstr ""
 
-msgctxt "field:sale.sale,party:0"
+msgctxt "field:sale.sale,party:"
 msgid "Party"
 msgstr ""
 
-msgctxt "field:sale.sale,party_lang:0"
+msgctxt "field:sale.sale,party_lang:"
 msgid "Party Language"
 msgstr ""
 
-msgctxt "field:sale.sale,payment_term:0"
+msgctxt "field:sale.sale,payment_term:"
 msgid "Payment Term"
 msgstr ""
 
-msgctxt "field:sale.sale,rec_name:0"
+msgctxt "field:sale.sale,rec_name:"
 msgid "Name"
 msgstr ""
 
-msgctxt "field:sale.sale,reference:0"
+msgctxt "field:sale.sale,reference:"
 msgid "Reference"
 msgstr ""
 
-msgctxt "field:sale.sale,sale_date:0"
+msgctxt "field:sale.sale,sale_date:"
 msgid "Sale Date"
 msgstr ""
 
-msgctxt "field:sale.sale,shipment_address:0"
+msgctxt "field:sale.sale,shipment_address:"
 msgid "Shipment Address"
 msgstr ""
 
-msgctxt "field:sale.sale,shipment_done:0"
-msgid "Shipment Done"
-msgstr ""
-
-msgctxt "field:sale.sale,shipment_exception:0"
-msgid "Shipments Exception"
+msgctxt "field:sale.sale,shipment_method:"
+msgid "Shipment Method"
 msgstr ""
 
-msgctxt "field:sale.sale,shipment_method:0"
-msgid "Shipment Method"
+msgctxt "field:sale.sale,shipment_returns:"
+msgid "Shipment Returns"
 msgstr ""
 
-msgctxt "field:sale.sale,shipment_state:0"
+msgctxt "field:sale.sale,shipment_state:"
 msgid "Shipment State"
 msgstr ""
 
-msgctxt "field:sale.sale,shipments:0"
+msgctxt "field:sale.sale,shipments:"
 msgid "Shipments"
 msgstr ""
 
-msgctxt "field:sale.sale,state:0"
+msgctxt "field:sale.sale,state:"
 msgid "State"
 msgstr ""
 
-msgctxt "field:sale.sale,tax_amount:0"
+msgctxt "field:sale.sale,tax_amount:"
 msgid "Tax"
 msgstr ""
 
-msgctxt "field:sale.sale,total_amount:0"
+msgctxt "field:sale.sale,tax_amount_cache:"
+msgid "Tax Cache"
+msgstr ""
+
+msgctxt "field:sale.sale,total_amount:"
 msgid "Total"
 msgstr ""
 
-msgctxt "field:sale.sale,untaxed_amount:0"
+msgctxt "field:sale.sale,total_amount_cache:"
+msgid "Total Tax"
+msgstr ""
+
+msgctxt "field:sale.sale,untaxed_amount:"
 msgid "Untaxed"
 msgstr ""
 
-msgctxt "field:sale.sale,warehouse:0"
+msgctxt "field:sale.sale,untaxed_amount_cache:"
+msgid "Untaxed Cache"
+msgstr ""
+
+msgctxt "field:sale.sale,warehouse:"
 msgid "Warehouse"
 msgstr ""
 
-msgctxt "field:sale.sale-account.invoice,invoice:0"
+msgctxt "field:sale.sale,write_date:"
+msgid "Write Date"
+msgstr ""
+
+msgctxt "field:sale.sale,write_uid:"
+msgid "Write User"
+msgstr ""
+
+msgctxt "field:sale.sale-account.invoice,create_date:"
+msgid "Create Date"
+msgstr ""
+
+msgctxt "field:sale.sale-account.invoice,create_uid:"
+msgid "Create User"
+msgstr ""
+
+msgctxt "field:sale.sale-account.invoice,id:"
+msgid "ID"
+msgstr ""
+
+msgctxt "field:sale.sale-account.invoice,invoice:"
 msgid "Invoice"
 msgstr ""
 
-msgctxt "field:sale.sale-account.invoice,rec_name:0"
+msgctxt "field:sale.sale-account.invoice,rec_name:"
 msgid "Name"
 msgstr ""
 
-msgctxt "field:sale.sale-account.invoice,sale:0"
+msgctxt "field:sale.sale-account.invoice,sale:"
 msgid "Sale"
 msgstr ""
 
-msgctxt "field:sale.sale-ignored-account.invoice,invoice:0"
+msgctxt "field:sale.sale-account.invoice,write_date:"
+msgid "Write Date"
+msgstr ""
+
+msgctxt "field:sale.sale-account.invoice,write_uid:"
+msgid "Write User"
+msgstr ""
+
+msgctxt "field:sale.sale-ignored-account.invoice,create_date:"
+msgid "Create Date"
+msgstr ""
+
+msgctxt "field:sale.sale-ignored-account.invoice,create_uid:"
+msgid "Create User"
+msgstr ""
+
+msgctxt "field:sale.sale-ignored-account.invoice,id:"
+msgid "ID"
+msgstr ""
+
+msgctxt "field:sale.sale-ignored-account.invoice,invoice:"
 msgid "Invoice"
 msgstr ""
 
-msgctxt "field:sale.sale-ignored-account.invoice,rec_name:0"
+msgctxt "field:sale.sale-ignored-account.invoice,rec_name:"
 msgid "Name"
 msgstr ""
 
-msgctxt "field:sale.sale-ignored-account.invoice,sale:0"
+msgctxt "field:sale.sale-ignored-account.invoice,sale:"
 msgid "Sale"
 msgstr ""
 
-msgctxt "field:sale.sale-recreated-account.invoice,invoice:0"
+msgctxt "field:sale.sale-ignored-account.invoice,write_date:"
+msgid "Write Date"
+msgstr ""
+
+msgctxt "field:sale.sale-ignored-account.invoice,write_uid:"
+msgid "Write User"
+msgstr ""
+
+msgctxt "field:sale.sale-recreated-account.invoice,create_date:"
+msgid "Create Date"
+msgstr ""
+
+msgctxt "field:sale.sale-recreated-account.invoice,create_uid:"
+msgid "Create User"
+msgstr ""
+
+msgctxt "field:sale.sale-recreated-account.invoice,id:"
+msgid "ID"
+msgstr ""
+
+msgctxt "field:sale.sale-recreated-account.invoice,invoice:"
 msgid "Invoice"
 msgstr ""
 
-msgctxt "field:sale.sale-recreated-account.invoice,rec_name:0"
+msgctxt "field:sale.sale-recreated-account.invoice,rec_name:"
 msgid "Name"
 msgstr ""
 
-msgctxt "field:sale.sale-recreated-account.invoice,sale:0"
+msgctxt "field:sale.sale-recreated-account.invoice,sale:"
 msgid "Sale"
 msgstr ""
 
-msgctxt "field:stock.move,sale:0"
+msgctxt "field:sale.sale-recreated-account.invoice,write_date:"
+msgid "Write Date"
+msgstr ""
+
+msgctxt "field:sale.sale-recreated-account.invoice,write_uid:"
+msgid "Write User"
+msgstr ""
+
+msgctxt "field:stock.move,sale:"
 msgid "Sale"
 msgstr ""
 
-msgctxt "field:stock.move,sale_exception_state:0"
+msgctxt "field:stock.move,sale_exception_state:"
 msgid "Exception State"
 msgstr ""
 
-msgctxt "field:stock.move,sale_line:0"
+msgctxt "field:stock.move,sale_line:"
 msgid "Sale Line"
 msgstr ""
 
-msgctxt "help:product.template,delivery_time:0"
+msgctxt "help:product.template,delivery_time:"
 msgid "In number of days"
 msgstr ""
 
-msgctxt "help:sale.handle.invoice.exception.ask,recreate_invoices:0"
+msgctxt "help:sale.handle.invoice.exception.ask,recreate_invoices:"
 msgid ""
 "The selected invoices will be recreated. The other ones will be ignored."
 msgstr ""
@@ -411,6 +651,10 @@ msgctxt "model:ir.action,name:act_open_customer"
 msgid "Parties associated to Sales"
 msgstr ""
 
+msgctxt "model:ir.action,name:act_return_form"
+msgid "Returns"
+msgstr ""
+
 msgctxt "model:ir.action,name:act_sale_configuration_form"
 msgid "Sales Configuration"
 msgstr ""
@@ -431,6 +675,10 @@ msgctxt "model:ir.action,name:act_sale_form_draft"
 msgid "Draft Sales"
 msgstr ""
 
+msgctxt "model:ir.action,name:act_sale_form_processing"
+msgid "Processing Sales"
+msgstr ""
+
 msgctxt "model:ir.action,name:act_sale_form_quotation"
 msgid "Quotation Sales"
 msgstr ""
@@ -447,6 +695,10 @@ msgctxt "model:ir.action,name:wizard_invoice_handle_exception"
 msgid "Handle Invoice Exception"
 msgstr ""
 
+msgctxt "model:ir.action,name:wizard_return_sale"
+msgid "Create Return Sale"
+msgstr ""
+
 msgctxt "model:ir.action,name:wizard_shipment_handle_exception"
 msgid "Handle Shipment Exception"
 msgstr ""
@@ -487,6 +739,10 @@ msgctxt "model:ir.ui.menu,name:menu_sale_form_draft"
 msgid "Draft Sales"
 msgstr ""
 
+msgctxt "model:ir.ui.menu,name:menu_sale_form_processing"
+msgid "Processing Sales"
+msgstr ""
+
 msgctxt "model:ir.ui.menu,name:menu_sale_form_quotation"
 msgid "Quotation Sales"
 msgstr ""
@@ -499,490 +755,394 @@ msgctxt "model:res.group,name:group_sale_admin"
 msgid "Sales Administrator"
 msgstr ""
 
-msgctxt "model:sale.configuration,name:0"
+msgctxt "model:sale.configuration,name:"
 msgid "Sale Configuration"
 msgstr ""
 
-msgctxt "model:sale.handle.invoice.exception.ask,name:0"
-msgid "Invoice Exception Ask"
+msgctxt "model:sale.handle.invoice.exception.ask,name:"
+msgid "Handle Invoice Exception"
 msgstr ""
 
-msgctxt "model:sale.handle.shipment.exception.ask,name:0"
-msgid "Shipment Exception Ask"
+msgctxt "model:sale.handle.shipment.exception.ask,name:"
+msgid "Handle Shipment Exception"
 msgstr ""
 
-msgctxt "model:sale.line,name:0"
+msgctxt "model:sale.line,name:"
 msgid "Sale Line"
 msgstr ""
 
-msgctxt "model:sale.line-account.invoice.line,name:0"
+msgctxt "model:sale.line-account.invoice.line,name:"
 msgid "Sale Line - Invoice Line"
 msgstr ""
 
-msgctxt "model:sale.line-account.tax,name:0"
+msgctxt "model:sale.line-account.tax,name:"
 msgid "Sale Line - Tax"
 msgstr ""
 
-msgctxt "model:sale.line-ignored-stock.move,name:0"
+msgctxt "model:sale.line-ignored-stock.move,name:"
 msgid "Sale Line - Ignored Move"
 msgstr ""
 
-msgctxt "model:sale.line-recreated-stock.move,name:0"
+msgctxt "model:sale.line-recreated-stock.move,name:"
 msgid "Sale Line - Recreated Move"
 msgstr ""
 
-msgctxt "model:sale.sale,name:0"
+msgctxt "model:sale.sale,name:"
 msgid "Sale"
 msgstr ""
 
-msgctxt "model:sale.sale-account.invoice,name:0"
+msgctxt "model:sale.sale-account.invoice,name:"
 msgid "Sale - Invoice"
 msgstr ""
 
-msgctxt "model:sale.sale-ignored-account.invoice,name:0"
+msgctxt "model:sale.sale-ignored-account.invoice,name:"
 msgid "Sale - Ignored Invoice"
 msgstr ""
 
-msgctxt "model:sale.sale-recreated-account.invoice,name:0"
+msgctxt "model:sale.sale-recreated-account.invoice,name:"
 msgid "Sale - Recreated Invoice"
 msgstr ""
 
-msgctxt "model:workflow,name:sale_workflow"
-msgid "Sale workflow"
-msgstr ""
-
-msgctxt "model:workflow.activity,name:sale_activity_cancel"
-msgid "Canceled"
-msgstr ""
-
-msgctxt "model:workflow.activity,name:sale_activity_confirmed"
-msgid "Confirmed"
-msgstr ""
-
-msgctxt "model:workflow.activity,name:sale_activity_done"
-msgid "Done"
-msgstr ""
-
-msgctxt "model:workflow.activity,name:sale_activity_draft"
-msgid "Draft"
-msgstr ""
-
-msgctxt "model:workflow.activity,name:sale_activity_invoice_method"
-msgid "Invoice Method"
-msgstr ""
-
-msgctxt "model:workflow.activity,name:sale_activity_invoice_method_done"
-msgid "Invoice Method Done"
-msgstr ""
-
-msgctxt "model:workflow.activity,name:sale_activity_invoice_sale_done"
-msgid "Invoice Done"
-msgstr ""
-
-msgctxt "model:workflow.activity,name:sale_activity_invoice_sale_exception"
-msgid "Invoice Exception"
-msgstr ""
-
-msgctxt "model:workflow.activity,name:sale_activity_invoice_shipment"
-msgid "Invoice Shipment"
-msgstr ""
-
-msgctxt "model:workflow.activity,name:sale_activity_invoice_shipment_done"
-msgid "Invoice Shipment Done"
-msgstr ""
-
-msgctxt ""
-"model:workflow.activity,name:sale_activity_invoice_shipment_exception"
-msgid "Invoice Shipment Exception"
-msgstr ""
-
-msgctxt "model:workflow.activity,name:sale_activity_invoice_shipment_method"
-msgid "Invoice Shipment Method"
-msgstr ""
-
-msgctxt ""
-"model:workflow.activity,name:sale_activity_invoice_shipment_method_done"
-msgid "Invoice Shipment Method Done"
-msgstr ""
-
-msgctxt "model:workflow.activity,name:sale_activity_quotation"
-msgid "Quotation"
-msgstr ""
-
-msgctxt "model:workflow.activity,name:sale_activity_shipment"
-msgid "Shipment"
-msgstr ""
-
-msgctxt "model:workflow.activity,name:sale_activity_shipment_exception"
-msgid "Shipment Exception"
-msgstr ""
-
-msgctxt "model:workflow.activity,name:sale_activity_shipment_invoice"
-msgid "Shipment Invoice"
-msgstr ""
-
-msgctxt "model:workflow.activity,name:sale_activity_shipment_invoice_done"
-msgid "Shipment Invoice Done"
-msgstr ""
-
-msgctxt ""
-"model:workflow.activity,name:sale_activity_shipment_invoice_exception"
-msgid "Shipment Invoice Exception"
-msgstr ""
-
-msgctxt "model:workflow.activity,name:sale_activity_shipment_invoice_method"
-msgid "Shipment Invoice Method"
-msgstr ""
-
-msgctxt ""
-"model:workflow.activity,name:sale_activity_shipment_invoice_method_done"
-msgid "Shipment Invoice Method Done"
-msgstr ""
-
-msgctxt "model:workflow.activity,name:sale_activity_shipment_method"
-msgid "Shipment Method"
-msgstr ""
-
-msgctxt "model:workflow.activity,name:sale_activity_shipment_method_done"
-msgid "Shipment Method Done"
-msgstr ""
-
-msgctxt "model:workflow.activity,name:sale_activity_waiting_invoice_sale"
-msgid "Waiting Invoice"
-msgstr ""
-
-msgctxt "model:workflow.activity,name:sale_activity_waiting_invoice_shipment"
-msgid "Waiting Invoice Shipment"
-msgstr ""
-
-msgctxt "model:workflow.activity,name:sale_activity_waiting_shipment"
-msgid "Waiting Shipment"
-msgstr ""
-
-msgctxt "model:workflow.activity,name:sale_activity_waiting_shipment_invoice"
-msgid "Waiting Shipment Invoice"
-msgstr ""
-
-msgctxt "odt:sale.sale:0"
+msgctxt "odt:sale.sale:"
 msgid "Amount"
 msgstr ""
 
-msgctxt "odt:sale.sale:0"
+msgctxt "odt:sale.sale:"
 msgid "Date:"
 msgstr ""
 
-msgctxt "odt:sale.sale:0"
+msgctxt "odt:sale.sale:"
 msgid "Description"
 msgstr ""
 
-msgctxt "odt:sale.sale:0"
+msgctxt "odt:sale.sale:"
 msgid "Description:"
 msgstr ""
 
-msgctxt "odt:sale.sale:0"
+msgctxt "odt:sale.sale:"
 msgid "Draft Sale Order"
 msgstr ""
 
-msgctxt "odt:sale.sale:0"
+msgctxt "odt:sale.sale:"
 msgid "E-Mail:"
 msgstr ""
 
-msgctxt "odt:sale.sale:0"
+msgctxt "odt:sale.sale:"
 msgid "Phone:"
 msgstr ""
 
-msgctxt "odt:sale.sale:0"
+msgctxt "odt:sale.sale:"
 msgid "Quantity"
 msgstr ""
 
-msgctxt "odt:sale.sale:0"
+msgctxt "odt:sale.sale:"
 msgid "Quotation N°:"
 msgstr ""
 
-msgctxt "odt:sale.sale:0"
+msgctxt "odt:sale.sale:"
 msgid "Sale Order N°:"
 msgstr ""
 
-msgctxt "odt:sale.sale:0"
+msgctxt "odt:sale.sale:"
 msgid "Taxes"
 msgstr ""
 
-msgctxt "odt:sale.sale:0"
+msgctxt "odt:sale.sale:"
 msgid "Taxes:"
 msgstr ""
 
-msgctxt "odt:sale.sale:0"
+msgctxt "odt:sale.sale:"
 msgid "Total (excl. taxes):"
 msgstr ""
 
-msgctxt "odt:sale.sale:0"
+msgctxt "odt:sale.sale:"
 msgid "Total:"
 msgstr ""
 
-msgctxt "odt:sale.sale:0"
+msgctxt "odt:sale.sale:"
 msgid "Unit Price"
 msgstr ""
 
-msgctxt "odt:sale.sale:0"
+msgctxt "odt:sale.sale:"
 msgid "VAT Number:"
 msgstr ""
 
-msgctxt "odt:sale.sale:0"
+msgctxt "odt:sale.sale:"
 msgid "VAT:"
 msgstr ""
 
-msgctxt "selection:account.invoice,sale_exception_state:0"
+msgctxt "selection:account.invoice,sale_exception_state:"
 msgid ""
 msgstr ""
 
-msgctxt "selection:account.invoice,sale_exception_state:0"
+msgctxt "selection:account.invoice,sale_exception_state:"
 msgid "Ignored"
 msgstr ""
 
-msgctxt "selection:account.invoice,sale_exception_state:0"
+msgctxt "selection:account.invoice,sale_exception_state:"
 msgid "Recreated"
 msgstr ""
 
-msgctxt "selection:sale.configuration,sale_invoice_method:0"
+msgctxt "selection:sale.configuration,sale_invoice_method:"
 msgid "Manual"
 msgstr ""
 
-msgctxt "selection:sale.configuration,sale_invoice_method:0"
-msgid "On Order Confirmed"
+msgctxt "selection:sale.configuration,sale_invoice_method:"
+msgid "On Order Processed"
 msgstr ""
 
-msgctxt "selection:sale.configuration,sale_invoice_method:0"
+msgctxt "selection:sale.configuration,sale_invoice_method:"
 msgid "On Shipment Sent"
 msgstr ""
 
-msgctxt "selection:sale.configuration,sale_shipment_method:0"
+msgctxt "selection:sale.configuration,sale_shipment_method:"
 msgid "Manual"
 msgstr ""
 
-msgctxt "selection:sale.configuration,sale_shipment_method:0"
+msgctxt "selection:sale.configuration,sale_shipment_method:"
 msgid "On Invoice Paid"
 msgstr ""
 
-msgctxt "selection:sale.configuration,sale_shipment_method:0"
-msgid "On Order Confirmed"
+msgctxt "selection:sale.configuration,sale_shipment_method:"
+msgid "On Order Processed"
 msgstr ""
 
-msgctxt "selection:sale.line,type:0"
+msgctxt "selection:sale.line,type:"
 msgid "Comment"
 msgstr ""
 
-msgctxt "selection:sale.line,type:0"
+msgctxt "selection:sale.line,type:"
 msgid "Line"
 msgstr ""
 
-msgctxt "selection:sale.line,type:0"
+msgctxt "selection:sale.line,type:"
 msgid "Subtotal"
 msgstr ""
 
-msgctxt "selection:sale.line,type:0"
+msgctxt "selection:sale.line,type:"
 msgid "Title"
 msgstr ""
 
-msgctxt "selection:sale.sale,invoice_method:0"
+msgctxt "selection:sale.sale,invoice_method:"
 msgid "Manual"
 msgstr ""
 
-msgctxt "selection:sale.sale,invoice_method:0"
-msgid "On Order Confirmed"
+msgctxt "selection:sale.sale,invoice_method:"
+msgid "On Order Processed"
 msgstr ""
 
-msgctxt "selection:sale.sale,invoice_method:0"
+msgctxt "selection:sale.sale,invoice_method:"
 msgid "On Shipment Sent"
 msgstr ""
 
-msgctxt "selection:sale.sale,invoice_state:0"
+msgctxt "selection:sale.sale,invoice_state:"
 msgid "Exception"
 msgstr ""
 
-msgctxt "selection:sale.sale,invoice_state:0"
+msgctxt "selection:sale.sale,invoice_state:"
 msgid "None"
 msgstr ""
 
-msgctxt "selection:sale.sale,invoice_state:0"
+msgctxt "selection:sale.sale,invoice_state:"
 msgid "Paid"
 msgstr ""
 
-msgctxt "selection:sale.sale,invoice_state:0"
+msgctxt "selection:sale.sale,invoice_state:"
 msgid "Waiting"
 msgstr ""
 
-msgctxt "selection:sale.sale,shipment_method:0"
+msgctxt "selection:sale.sale,shipment_method:"
 msgid "Manual"
 msgstr ""
 
-msgctxt "selection:sale.sale,shipment_method:0"
+msgctxt "selection:sale.sale,shipment_method:"
 msgid "On Invoice Paid"
 msgstr ""
 
-msgctxt "selection:sale.sale,shipment_method:0"
-msgid "On Order Confirmed"
+msgctxt "selection:sale.sale,shipment_method:"
+msgid "On Order Processed"
 msgstr ""
 
-msgctxt "selection:sale.sale,shipment_state:0"
+msgctxt "selection:sale.sale,shipment_state:"
 msgid "Exception"
 msgstr ""
 
-msgctxt "selection:sale.sale,shipment_state:0"
+msgctxt "selection:sale.sale,shipment_state:"
 msgid "None"
 msgstr ""
 
-msgctxt "selection:sale.sale,shipment_state:0"
+msgctxt "selection:sale.sale,shipment_state:"
 msgid "Sent"
 msgstr ""
 
-msgctxt "selection:sale.sale,shipment_state:0"
+msgctxt "selection:sale.sale,shipment_state:"
 msgid "Waiting"
 msgstr ""
 
-msgctxt "selection:sale.sale,state:0"
+msgctxt "selection:sale.sale,state:"
 msgid "Canceled"
 msgstr ""
 
-msgctxt "selection:sale.sale,state:0"
+msgctxt "selection:sale.sale,state:"
 msgid "Confirmed"
 msgstr ""
 
-msgctxt "selection:sale.sale,state:0"
+msgctxt "selection:sale.sale,state:"
 msgid "Done"
 msgstr ""
 
-msgctxt "selection:sale.sale,state:0"
+msgctxt "selection:sale.sale,state:"
 msgid "Draft"
 msgstr ""
 
-msgctxt "selection:sale.sale,state:0"
+msgctxt "selection:sale.sale,state:"
+msgid "Processing"
+msgstr ""
+
+msgctxt "selection:sale.sale,state:"
 msgid "Quotation"
 msgstr ""
 
-msgctxt "selection:stock.move,sale_exception_state:0"
+msgctxt "selection:stock.move,sale_exception_state:"
 msgid ""
 msgstr ""
 
-msgctxt "selection:stock.move,sale_exception_state:0"
+msgctxt "selection:stock.move,sale_exception_state:"
 msgid "Ignored"
 msgstr ""
 
-msgctxt "selection:stock.move,sale_exception_state:0"
+msgctxt "selection:stock.move,sale_exception_state:"
 msgid "Recreated"
 msgstr ""
 
-msgctxt "view:product.template:0"
+msgctxt "view:product.product:"
+msgid "Products"
+msgstr ""
+
+msgctxt "view:product.template:"
 msgid "Customers"
 msgstr ""
 
-msgctxt "view:sale.configuration:0"
+msgctxt "view:sale.configuration:"
 msgid "Sale Configuration"
 msgstr ""
 
-msgctxt "view:sale.handle.invoice.exception.ask:0"
+msgctxt "view:sale.handle.invoice.exception.ask:"
 msgid "Choose invoices to recreate"
 msgstr ""
 
-msgctxt "view:sale.handle.invoice.exception.ask:0"
+msgctxt "view:sale.handle.invoice.exception.ask:"
 msgid "Handle Invoice Exception"
 msgstr ""
 
-msgctxt "view:sale.handle.shipment.exception.ask:0"
+msgctxt "view:sale.handle.shipment.exception.ask:"
 msgid "Choose move to recreate"
 msgstr ""
 
-msgctxt "view:sale.handle.shipment.exception.ask:0"
+msgctxt "view:sale.handle.shipment.exception.ask:"
 msgid "Handle shipment Exception"
 msgstr ""
 
-msgctxt "view:sale.handle.shipment.exception.ask:0"
+msgctxt "view:sale.handle.shipment.exception.ask:"
 msgid "Recreate Moves"
 msgstr ""
 
-msgctxt "view:sale.line:0"
+msgctxt "view:sale.line:"
 msgid "General"
 msgstr ""
 
-msgctxt "view:sale.line:0"
+msgctxt "view:sale.line:"
 msgid "Notes"
 msgstr ""
 
-msgctxt "view:sale.line:0"
+msgctxt "view:sale.line:"
 msgid "Products"
 msgstr ""
 
-msgctxt "view:sale.line:0"
+msgctxt "view:sale.line:"
 msgid "Sale Line"
 msgstr ""
 
-msgctxt "view:sale.line:0"
+msgctxt "view:sale.line:"
 msgid "Sale Lines"
 msgstr ""
 
-msgctxt "view:sale.sale:0"
+msgctxt "view:sale.sale:"
 msgid "Cancel"
 msgstr ""
 
-msgctxt "view:sale.sale:0"
+msgctxt "view:sale.sale:"
 msgid "Confirm"
 msgstr ""
 
-msgctxt "view:sale.sale:0"
+msgctxt "view:sale.sale:"
 msgid "Draft"
 msgstr ""
 
-msgctxt "view:sale.sale:0"
+msgctxt "view:sale.sale:"
 msgid "Handle Invoice Exception"
 msgstr ""
 
-msgctxt "view:sale.sale:0"
+msgctxt "view:sale.sale:"
 msgid "Handle Shipment Exception"
 msgstr ""
 
-msgctxt "view:sale.sale:0"
+msgctxt "view:sale.sale:"
 msgid "Invoices"
 msgstr ""
 
-msgctxt "view:sale.sale:0"
+msgctxt "view:sale.sale:"
 msgid "Lines"
 msgstr ""
 
-msgctxt "view:sale.sale:0"
+msgctxt "view:sale.sale:"
 msgid "Moves"
 msgstr ""
 
-msgctxt "view:sale.sale:0"
+msgctxt "view:sale.sale:"
 msgid "Other Info"
 msgstr ""
 
-msgctxt "view:sale.sale:0"
+msgctxt "view:sale.sale:"
+msgid "Process"
+msgstr ""
+
+msgctxt "view:sale.sale:"
 msgid "Quotation"
 msgstr ""
 
-msgctxt "view:sale.sale:0"
+msgctxt "view:sale.sale:"
+msgid "Quote"
+msgstr ""
+
+msgctxt "view:sale.sale:"
 msgid "Sale"
 msgstr ""
 
-msgctxt "view:sale.sale:0"
+msgctxt "view:sale.sale:"
 msgid "Sales"
 msgstr ""
 
-msgctxt "view:sale.sale:0"
+msgctxt "view:sale.sale:"
 msgid "Shipments"
 msgstr ""
 
-msgctxt "wizard_button:sale.handle.invoice.exception,init,end:0"
+msgctxt "view:stock.move:"
+msgid "Moves"
+msgstr ""
+
+msgctxt "wizard_button:sale.handle.invoice.exception,ask,end:"
 msgid "Cancel"
 msgstr ""
 
-msgctxt "wizard_button:sale.handle.invoice.exception,init,ok:0"
+msgctxt "wizard_button:sale.handle.invoice.exception,ask,handle:"
 msgid "Ok"
 msgstr ""
 
-msgctxt "wizard_button:sale.handle.shipment.exception,init,end:0"
+msgctxt "wizard_button:sale.handle.shipment.exception,ask,end:"
 msgid "Cancel"
 msgstr ""
 
-msgctxt "wizard_button:sale.handle.shipment.exception,init,ok:0"
+msgctxt "wizard_button:sale.handle.shipment.exception,ask,handle:"
 msgid "Ok"
 msgstr ""
diff --git a/locale/de_DE.po b/locale/de_DE.po
index d748bc1..d5cf6e8 100644
--- a/locale/de_DE.po
+++ b/locale/de_DE.po
@@ -2,408 +2,650 @@
 msgid ""
 msgstr "Content-Type: text/plain; charset=utf-8\n"
 
-msgctxt "error:account.invoice:0"
+msgctxt "error:account.invoice:"
 msgid "You can not delete invoices that come from a sale!"
 msgstr ""
 "Durch einen Verkauf generierte Rechnungen können nicht gelöscht werden!"
 
-msgctxt "error:account.invoice:0"
+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."
 
-msgctxt "error:sale.line:0"
+msgctxt "error:sale.line:"
 msgid "It misses an \"Account Revenue\" on product \"%s\"!"
 msgstr "Es ist kein Ertragskonto für Artikel \"%s\" definiert!"
 
-msgctxt "error:sale.line:0"
+msgctxt "error:sale.line:"
 msgid "It misses an \"account Revenue\" default property!"
 msgstr "Es ist keine Standardeigenschaft für das Ertragskonto definiert!"
 
-msgctxt "error:sale.line:0"
+msgctxt "error:sale.line:"
 msgid "The customer location is required!"
 msgstr "Der Lagerort des Kunden muss eingegeben werden!"
 
-msgctxt "error:sale.sale:0"
+msgctxt "error:sale.sale:"
 msgid "Invoice and Shipment addresses must be defined for the quotation."
 msgstr "Rechnungs- und Lieferadresse müssen für das Angebot eingetragen sein!"
 
-msgctxt "error:sale.sale:0"
+msgctxt "error:sale.sale:"
 msgid "It misses an \"Account Receivable\" on the party \"%s\"!"
 msgstr "Es ist kein Forderungskonto für Partei \"%s\" definiert!"
 
-msgctxt "error:sale.sale:0"
+msgctxt "error:sale.sale:"
+msgid "Sale \"%s\" must be cancelled before deletion!"
+msgstr "Verkauf \"%s\" muss annulliert werden, bevor er gelöscht werden kann."
+
+msgctxt "error:sale.sale:"
+msgid "Warehouse must be defined for the quotation."
+msgstr "Warenlager muss für das Angebot angegeben werden"
+
+msgctxt "error:sale.sale:"
 msgid "Wrong combination of method!"
 msgstr "Ungültige Kombination von Methoden!"
 
-msgctxt "error:stock.shipment.out:0"
+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."
+
+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."
 
-msgctxt "field:account.invoice,sale_exception_state:0"
+msgctxt "field:account.invoice,sale_exception_state:"
 msgid "Exception State"
 msgstr "Vorbehalt Status"
 
-msgctxt "field:account.invoice,sales:0"
+msgctxt "field:account.invoice,sales:"
 msgid "Sales"
 msgstr "Verkäufe"
 
-msgctxt "field:account.invoice.line,sale_lines:0"
+msgctxt "field:account.invoice.line,sale_lines:"
 msgid "Sale Lines"
 msgstr "Positionen Verkauf"
 
-msgctxt "field:product.template,delivery_time:0"
+msgctxt "field:product.template,delivery_time:"
 msgid "Delivery Time"
 msgstr "Lieferfrist"
 
-msgctxt "field:product.template,salable:0"
+msgctxt "field:product.template,salable:"
 msgid "Salable"
 msgstr "Verkäuflich"
 
-msgctxt "field:product.template,sale_uom:0"
+msgctxt "field:product.template,sale_uom:"
 msgid "Sale UOM"
 msgstr "Einheit Verkauf"
 
-msgctxt "field:sale.configuration,rec_name:0"
+msgctxt "field:sale.configuration,create_date:"
+msgid "Create Date"
+msgstr "Erstellungsdatum"
+
+msgctxt "field:sale.configuration,create_uid:"
+msgid "Create User"
+msgstr "Erstellt durch"
+
+msgctxt "field:sale.configuration,id:"
+msgid "ID"
+msgstr "ID"
+
+msgctxt "field:sale.configuration,rec_name:"
 msgid "Name"
 msgstr "Name"
 
-msgctxt "field:sale.configuration,sale_invoice_method:0"
+msgctxt "field:sale.configuration,sale_invoice_method:"
 msgid "Sale Invoice Method"
 msgstr "Rechnungsstellung Verkauf"
 
-msgctxt "field:sale.configuration,sale_sequence:0"
+msgctxt "field:sale.configuration,sale_sequence:"
 msgid "Sale Reference Sequence"
 msgstr "Nummernkreis Verkauf"
 
-msgctxt "field:sale.configuration,sale_shipment_method:0"
+msgctxt "field:sale.configuration,sale_shipment_method:"
 msgid "Sale Shipment Method"
 msgstr "Liefermethode Verkauf"
 
-msgctxt "field:sale.handle.invoice.exception.ask,domain_invoices:0"
+msgctxt "field:sale.configuration,write_date:"
+msgid "Write Date"
+msgstr "Zuletzt geändert"
+
+msgctxt "field:sale.configuration,write_uid:"
+msgid "Write User"
+msgstr "Letzte Änderung durch"
+
+msgctxt "field:sale.handle.invoice.exception.ask,domain_invoices:"
 msgid "Domain Invoices"
 msgstr "Wertebereich Rechnungen (Domain)"
 
-msgctxt "field:sale.handle.invoice.exception.ask,recreate_invoices:0"
+msgctxt "field:sale.handle.invoice.exception.ask,id:"
+msgid "ID"
+msgstr "ID"
+
+msgctxt "field:sale.handle.invoice.exception.ask,recreate_invoices:"
 msgid "Recreate Invoices"
 msgstr "Rechnungen nachbilden"
 
-msgctxt "field:sale.handle.shipment.exception.ask,domain_moves:0"
+msgctxt "field:sale.handle.shipment.exception.ask,domain_moves:"
 msgid "Domain Moves"
 msgstr "Wertebereich Bewegungen (Domain)"
 
-msgctxt "field:sale.handle.shipment.exception.ask,recreate_moves:0"
+msgctxt "field:sale.handle.shipment.exception.ask,id:"
+msgid "ID"
+msgstr "ID"
+
+msgctxt "field:sale.handle.shipment.exception.ask,recreate_moves:"
 msgid "Recreate Moves"
 msgstr "Bewegungen nachbilden"
 
-msgctxt "field:sale.line,amount:0"
+msgctxt "field:sale.line,amount:"
 msgid "Amount"
 msgstr "Betrag"
 
-msgctxt "field:sale.line,description:0"
+msgctxt "field:sale.line,create_date:"
+msgid "Create Date"
+msgstr "Erstellungsdatum"
+
+msgctxt "field:sale.line,create_uid:"
+msgid "Create User"
+msgstr "Erstellt durch"
+
+msgctxt "field:sale.line,delivery_date:"
+msgid "Delivery Date"
+msgstr "Lieferdatum"
+
+msgctxt "field:sale.line,description:"
 msgid "Description"
 msgstr "Bezeichnung"
 
-msgctxt "field:sale.line,invoice_lines:0"
+msgctxt "field:sale.line,from_location:"
+msgid "From Location"
+msgstr "Von Lagerort"
+
+msgctxt "field:sale.line,id:"
+msgid "ID"
+msgstr "ID"
+
+msgctxt "field:sale.line,invoice_lines:"
 msgid "Invoice Lines"
 msgstr "Rechnungspositionen"
 
-msgctxt "field:sale.line,move_done:0"
+msgctxt "field:sale.line,move_done:"
 msgid "Moves Done"
 msgstr "Bewegungen erledigt"
 
-msgctxt "field:sale.line,move_exception:0"
+msgctxt "field:sale.line,move_exception:"
 msgid "Moves Exception"
 msgstr "Bewegungsvorbehalt"
 
-msgctxt "field:sale.line,moves:0"
+msgctxt "field:sale.line,moves:"
 msgid "Moves"
 msgstr "Bewegungen"
 
-msgctxt "field:sale.line,moves_ignored:0"
+msgctxt "field:sale.line,moves_ignored:"
 msgid "Ignored Moves"
 msgstr "Ignorierte Bewegungen"
 
-msgctxt "field:sale.line,moves_recreated:0"
+msgctxt "field:sale.line,moves_recreated:"
 msgid "Recreated Moves"
 msgstr "Nachgebildete Bewegungen"
 
-msgctxt "field:sale.line,note:0"
+msgctxt "field:sale.line,note:"
 msgid "Note"
 msgstr "Notiz"
 
-msgctxt "field:sale.line,product:0"
+msgctxt "field:sale.line,product:"
 msgid "Product"
 msgstr "Artikel"
 
-msgctxt "field:sale.line,quantity:0"
+msgctxt "field:sale.line,product_uom_category:"
+msgid "Product Uom Category"
+msgstr "Artikel Maßeinheit Kategorie"
+
+msgctxt "field:sale.line,quantity:"
 msgid "Quantity"
 msgstr "Anzahl"
 
-msgctxt "field:sale.line,rec_name:0"
+msgctxt "field:sale.line,rec_name:"
 msgid "Name"
 msgstr "Name"
 
-msgctxt "field:sale.line,sale:0"
+msgctxt "field:sale.line,sale:"
 msgid "Sale"
 msgstr "Verkauf"
 
-msgctxt "field:sale.line,sequence:0"
+msgctxt "field:sale.line,sequence:"
 msgid "Sequence"
 msgstr "Reihenfolge"
 
-msgctxt "field:sale.line,taxes:0"
+msgctxt "field:sale.line,taxes:"
 msgid "Taxes"
 msgstr "Steuern"
 
-msgctxt "field:sale.line,type:0"
+msgctxt "field:sale.line,to_location:"
+msgid "To Location"
+msgstr "Zu Lagerort"
+
+msgctxt "field:sale.line,type:"
 msgid "Type"
 msgstr "Typ"
 
-msgctxt "field:sale.line,unit:0"
+msgctxt "field:sale.line,unit:"
 msgid "Unit"
 msgstr "Einheit"
 
-msgctxt "field:sale.line,unit_digits:0"
+msgctxt "field:sale.line,unit_digits:"
 msgid "Unit Digits"
 msgstr "Anzahl Stellen"
 
-msgctxt "field:sale.line,unit_price:0"
+msgctxt "field:sale.line,unit_price:"
 msgid "Unit Price"
 msgstr "Einzelpreis"
 
-msgctxt "field:sale.line-account.invoice.line,invoice_line:0"
+msgctxt "field:sale.line,warehouse:"
+msgid "Warehouse"
+msgstr "Warenlager"
+
+msgctxt "field:sale.line,write_date:"
+msgid "Write Date"
+msgstr "Zuletzt geändert"
+
+msgctxt "field:sale.line,write_uid:"
+msgid "Write User"
+msgstr "Letzte Änderung durch"
+
+msgctxt "field:sale.line-account.invoice.line,create_date:"
+msgid "Create Date"
+msgstr "Erstellungsdatum"
+
+msgctxt "field:sale.line-account.invoice.line,create_uid:"
+msgid "Create User"
+msgstr "Erstellt durch"
+
+msgctxt "field:sale.line-account.invoice.line,id:"
+msgid "ID"
+msgstr "ID"
+
+msgctxt "field:sale.line-account.invoice.line,invoice_line:"
 msgid "Invoice Line"
 msgstr "Rechnungsposition"
 
-msgctxt "field:sale.line-account.invoice.line,rec_name:0"
+msgctxt "field:sale.line-account.invoice.line,rec_name:"
 msgid "Name"
 msgstr "Name"
 
-msgctxt "field:sale.line-account.invoice.line,sale_line:0"
+msgctxt "field:sale.line-account.invoice.line,sale_line:"
 msgid "Sale Line"
 msgstr "Position Verkauf"
 
-msgctxt "field:sale.line-account.tax,line:0"
+msgctxt "field:sale.line-account.invoice.line,write_date:"
+msgid "Write Date"
+msgstr "Zuletzt geändert"
+
+msgctxt "field:sale.line-account.invoice.line,write_uid:"
+msgid "Write User"
+msgstr "Letzte Änderung durch"
+
+msgctxt "field:sale.line-account.tax,create_date:"
+msgid "Create Date"
+msgstr "Erstellungsdatum"
+
+msgctxt "field:sale.line-account.tax,create_uid:"
+msgid "Create User"
+msgstr "Erstellt durch"
+
+msgctxt "field:sale.line-account.tax,id:"
+msgid "ID"
+msgstr "ID"
+
+msgctxt "field:sale.line-account.tax,line:"
 msgid "Sale Line"
 msgstr "Position Verkauf"
 
-msgctxt "field:sale.line-account.tax,rec_name:0"
+msgctxt "field:sale.line-account.tax,rec_name:"
 msgid "Name"
 msgstr "Name"
 
-msgctxt "field:sale.line-account.tax,tax:0"
+msgctxt "field:sale.line-account.tax,tax:"
 msgid "Tax"
 msgstr "Steuer"
 
-msgctxt "field:sale.line-ignored-stock.move,move:0"
+msgctxt "field:sale.line-account.tax,write_date:"
+msgid "Write Date"
+msgstr "Zuletzt geändert"
+
+msgctxt "field:sale.line-account.tax,write_uid:"
+msgid "Write User"
+msgstr "Letzte Änderung durch"
+
+msgctxt "field:sale.line-ignored-stock.move,create_date:"
+msgid "Create Date"
+msgstr "Erstellungsdatum"
+
+msgctxt "field:sale.line-ignored-stock.move,create_uid:"
+msgid "Create User"
+msgstr "Erstellt durch"
+
+msgctxt "field:sale.line-ignored-stock.move,id:"
+msgid "ID"
+msgstr "ID"
+
+msgctxt "field:sale.line-ignored-stock.move,move:"
 msgid "Move"
 msgstr "Bewegung"
 
-msgctxt "field:sale.line-ignored-stock.move,rec_name:0"
+msgctxt "field:sale.line-ignored-stock.move,rec_name:"
 msgid "Name"
 msgstr "Name"
 
-msgctxt "field:sale.line-ignored-stock.move,sale_line:0"
+msgctxt "field:sale.line-ignored-stock.move,sale_line:"
 msgid "Sale Line"
 msgstr "Position Verkauf"
 
-msgctxt "field:sale.line-recreated-stock.move,move:0"
+msgctxt "field:sale.line-ignored-stock.move,write_date:"
+msgid "Write Date"
+msgstr "Zuletzt geändert"
+
+msgctxt "field:sale.line-ignored-stock.move,write_uid:"
+msgid "Write User"
+msgstr "Letzte Änderung durch"
+
+msgctxt "field:sale.line-recreated-stock.move,create_date:"
+msgid "Create Date"
+msgstr "Erstellungsdatum"
+
+msgctxt "field:sale.line-recreated-stock.move,create_uid:"
+msgid "Create User"
+msgstr "Erstellt durch"
+
+msgctxt "field:sale.line-recreated-stock.move,id:"
+msgid "ID"
+msgstr "ID"
+
+msgctxt "field:sale.line-recreated-stock.move,move:"
 msgid "Move"
 msgstr "Bewegung"
 
-msgctxt "field:sale.line-recreated-stock.move,rec_name:0"
+msgctxt "field:sale.line-recreated-stock.move,rec_name:"
 msgid "Name"
 msgstr "Name"
 
-msgctxt "field:sale.line-recreated-stock.move,sale_line:0"
+msgctxt "field:sale.line-recreated-stock.move,sale_line:"
 msgid "Sale Line"
 msgstr "Position Verkauf"
 
-msgctxt "field:sale.sale,comment:0"
+msgctxt "field:sale.line-recreated-stock.move,write_date:"
+msgid "Write Date"
+msgstr "Zuletzt geändert"
+
+msgctxt "field:sale.line-recreated-stock.move,write_uid:"
+msgid "Write User"
+msgstr "Letzte Änderung durch"
+
+msgctxt "field:sale.sale,comment:"
 msgid "Comment"
 msgstr "Kommentar"
 
-msgctxt "field:sale.sale,company:0"
+msgctxt "field:sale.sale,company:"
 msgid "Company"
 msgstr "Unternehmen"
 
-msgctxt "field:sale.sale,currency:0"
+msgctxt "field:sale.sale,create_date:"
+msgid "Create Date"
+msgstr "Erstellungsdatum"
+
+msgctxt "field:sale.sale,create_uid:"
+msgid "Create User"
+msgstr "Erstellt durch"
+
+msgctxt "field:sale.sale,currency:"
 msgid "Currency"
 msgstr "Währung"
 
-msgctxt "field:sale.sale,currency_digits:0"
+msgctxt "field:sale.sale,currency_digits:"
 msgid "Currency Digits"
 msgstr "Währung (signifikante Stellen)"
 
-msgctxt "field:sale.sale,description:0"
+msgctxt "field:sale.sale,description:"
 msgid "Description"
 msgstr "Beschreibung"
 
-msgctxt "field:sale.sale,invoice_address:0"
+msgctxt "field:sale.sale,id:"
+msgid "ID"
+msgstr "ID"
+
+msgctxt "field:sale.sale,invoice_address:"
 msgid "Invoice Address"
 msgstr "Rechnungsadresse"
 
-msgctxt "field:sale.sale,invoice_exception:0"
-msgid "Invoices Exception"
-msgstr "Rechnungsvorbehalt"
-
-msgctxt "field:sale.sale,invoice_method:0"
+msgctxt "field:sale.sale,invoice_method:"
 msgid "Invoice Method"
 msgstr "Rechnungsstellung"
 
-msgctxt "field:sale.sale,invoice_paid:0"
-msgid "Invoices Paid"
-msgstr "Bezahlte Rechnungen"
-
-msgctxt "field:sale.sale,invoice_state:0"
+msgctxt "field:sale.sale,invoice_state:"
 msgid "Invoice State"
 msgstr "Rechnungsstatus"
 
-msgctxt "field:sale.sale,invoices:0"
+msgctxt "field:sale.sale,invoices:"
 msgid "Invoices"
 msgstr "Rechnungen"
 
-msgctxt "field:sale.sale,invoices_ignored:0"
+msgctxt "field:sale.sale,invoices_ignored:"
 msgid "Ignored Invoices"
 msgstr "Ignorierte Rechnungen"
 
-msgctxt "field:sale.sale,invoices_recreated:0"
+msgctxt "field:sale.sale,invoices_recreated:"
 msgid "Recreated Invoices"
 msgstr "Nachgebildete Rechnungen"
 
-msgctxt "field:sale.sale,lines:0"
+msgctxt "field:sale.sale,lines:"
 msgid "Lines"
 msgstr "Positionen"
 
-msgctxt "field:sale.sale,moves:0"
+msgctxt "field:sale.sale,moves:"
 msgid "Moves"
 msgstr "Bewegungen"
 
-msgctxt "field:sale.sale,party:0"
+msgctxt "field:sale.sale,party:"
 msgid "Party"
 msgstr "Partei"
 
-msgctxt "field:sale.sale,party_lang:0"
+msgctxt "field:sale.sale,party_lang:"
 msgid "Party Language"
 msgstr "Sprache Partei"
 
-msgctxt "field:sale.sale,payment_term:0"
+msgctxt "field:sale.sale,payment_term:"
 msgid "Payment Term"
 msgstr "Zahlungsbedingung"
 
-msgctxt "field:sale.sale,rec_name:0"
+msgctxt "field:sale.sale,rec_name:"
 msgid "Name"
 msgstr "Name"
 
-msgctxt "field:sale.sale,reference:0"
+msgctxt "field:sale.sale,reference:"
 msgid "Reference"
 msgstr "Beleg-Nr."
 
-msgctxt "field:sale.sale,sale_date:0"
+msgctxt "field:sale.sale,sale_date:"
 msgid "Sale Date"
 msgstr "Verkaufsdatum"
 
-msgctxt "field:sale.sale,shipment_address:0"
+msgctxt "field:sale.sale,shipment_address:"
 msgid "Shipment Address"
 msgstr "Lieferadresse"
 
-msgctxt "field:sale.sale,shipment_done:0"
-msgid "Shipment Done"
-msgstr "Gepackt"
-
-msgctxt "field:sale.sale,shipment_exception:0"
-msgid "Shipments Exception"
-msgstr "Lieferungsvorbehalt"
-
-msgctxt "field:sale.sale,shipment_method:0"
+msgctxt "field:sale.sale,shipment_method:"
 msgid "Shipment Method"
 msgstr "Liefermethode"
 
-msgctxt "field:sale.sale,shipment_state:0"
+msgctxt "field:sale.sale,shipment_returns:"
+msgid "Shipment Returns"
+msgstr "Lieferposten Rücknahmen"
+
+msgctxt "field:sale.sale,shipment_state:"
 msgid "Shipment State"
 msgstr "Lieferstatus"
 
-msgctxt "field:sale.sale,shipments:0"
+msgctxt "field:sale.sale,shipments:"
 msgid "Shipments"
 msgstr "Lieferposten"
 
-msgctxt "field:sale.sale,state:0"
+msgctxt "field:sale.sale,state:"
 msgid "State"
 msgstr "Status"
 
-msgctxt "field:sale.sale,tax_amount:0"
+msgctxt "field:sale.sale,tax_amount:"
 msgid "Tax"
 msgstr "Steuer"
 
-msgctxt "field:sale.sale,total_amount:0"
+msgctxt "field:sale.sale,tax_amount_cache:"
+msgid "Tax Cache"
+msgstr "Steuer Cache"
+
+msgctxt "field:sale.sale,total_amount:"
 msgid "Total"
 msgstr "Gesamt"
 
-msgctxt "field:sale.sale,untaxed_amount:0"
+msgctxt "field:sale.sale,total_amount_cache:"
+msgid "Total Tax"
+msgstr "Gesamt Steuer"
+
+msgctxt "field:sale.sale,untaxed_amount:"
 msgid "Untaxed"
 msgstr "Netto"
 
-msgctxt "field:sale.sale,warehouse:0"
+msgctxt "field:sale.sale,untaxed_amount_cache:"
+msgid "Untaxed Cache"
+msgstr "Netto Cache"
+
+msgctxt "field:sale.sale,warehouse:"
 msgid "Warehouse"
 msgstr "Warenlager"
 
-msgctxt "field:sale.sale-account.invoice,invoice:0"
+msgctxt "field:sale.sale,write_date:"
+msgid "Write Date"
+msgstr "Zuletzt geändert"
+
+msgctxt "field:sale.sale,write_uid:"
+msgid "Write User"
+msgstr "Letzte Änderung durch"
+
+msgctxt "field:sale.sale-account.invoice,create_date:"
+msgid "Create Date"
+msgstr "Erstellungsdatum"
+
+msgctxt "field:sale.sale-account.invoice,create_uid:"
+msgid "Create User"
+msgstr "Erstellt durch"
+
+msgctxt "field:sale.sale-account.invoice,id:"
+msgid "ID"
+msgstr "ID"
+
+msgctxt "field:sale.sale-account.invoice,invoice:"
 msgid "Invoice"
 msgstr "Rechnung"
 
-msgctxt "field:sale.sale-account.invoice,rec_name:0"
+msgctxt "field:sale.sale-account.invoice,rec_name:"
 msgid "Name"
 msgstr "Name"
 
-msgctxt "field:sale.sale-account.invoice,sale:0"
+msgctxt "field:sale.sale-account.invoice,sale:"
 msgid "Sale"
 msgstr "Verkauf"
 
-msgctxt "field:sale.sale-ignored-account.invoice,invoice:0"
+msgctxt "field:sale.sale-account.invoice,write_date:"
+msgid "Write Date"
+msgstr "Zuletzt geändert"
+
+msgctxt "field:sale.sale-account.invoice,write_uid:"
+msgid "Write User"
+msgstr "Letzte Änderung durch"
+
+msgctxt "field:sale.sale-ignored-account.invoice,create_date:"
+msgid "Create Date"
+msgstr "Erstellungsdatum"
+
+msgctxt "field:sale.sale-ignored-account.invoice,create_uid:"
+msgid "Create User"
+msgstr "Erstellt durch"
+
+msgctxt "field:sale.sale-ignored-account.invoice,id:"
+msgid "ID"
+msgstr "ID"
+
+msgctxt "field:sale.sale-ignored-account.invoice,invoice:"
 msgid "Invoice"
 msgstr "Rechnung"
 
-msgctxt "field:sale.sale-ignored-account.invoice,rec_name:0"
+msgctxt "field:sale.sale-ignored-account.invoice,rec_name:"
 msgid "Name"
 msgstr "Name"
 
-msgctxt "field:sale.sale-ignored-account.invoice,sale:0"
+msgctxt "field:sale.sale-ignored-account.invoice,sale:"
 msgid "Sale"
 msgstr "Verkauf"
 
-msgctxt "field:sale.sale-recreated-account.invoice,invoice:0"
+msgctxt "field:sale.sale-ignored-account.invoice,write_date:"
+msgid "Write Date"
+msgstr "Zuletzt geändert"
+
+msgctxt "field:sale.sale-ignored-account.invoice,write_uid:"
+msgid "Write User"
+msgstr "Letzte Änderung durch"
+
+msgctxt "field:sale.sale-recreated-account.invoice,create_date:"
+msgid "Create Date"
+msgstr "Erstellungsdatum"
+
+msgctxt "field:sale.sale-recreated-account.invoice,create_uid:"
+msgid "Create User"
+msgstr "Erstellt durch"
+
+msgctxt "field:sale.sale-recreated-account.invoice,id:"
+msgid "ID"
+msgstr "ID"
+
+msgctxt "field:sale.sale-recreated-account.invoice,invoice:"
 msgid "Invoice"
 msgstr "Rechnung"
 
-msgctxt "field:sale.sale-recreated-account.invoice,rec_name:0"
+msgctxt "field:sale.sale-recreated-account.invoice,rec_name:"
 msgid "Name"
 msgstr "Name"
 
-msgctxt "field:sale.sale-recreated-account.invoice,sale:0"
+msgctxt "field:sale.sale-recreated-account.invoice,sale:"
 msgid "Sale"
 msgstr "Verkauf"
 
-msgctxt "field:stock.move,sale:0"
+msgctxt "field:sale.sale-recreated-account.invoice,write_date:"
+msgid "Write Date"
+msgstr "Zuletzt geändert"
+
+msgctxt "field:sale.sale-recreated-account.invoice,write_uid:"
+msgid "Write User"
+msgstr "Letzte Änderung durch"
+
+msgctxt "field:stock.move,sale:"
 msgid "Sale"
 msgstr "Verkauf"
 
-msgctxt "field:stock.move,sale_exception_state:0"
+msgctxt "field:stock.move,sale_exception_state:"
 msgid "Exception State"
 msgstr "Status Vorbehalt"
 
-msgctxt "field:stock.move,sale_line:0"
+msgctxt "field:stock.move,sale_line:"
 msgid "Sale Line"
 msgstr "Verkauf Position"
 
-msgctxt "help:product.template,delivery_time:0"
+msgctxt "help:product.template,delivery_time:"
 msgid "In number of days"
 msgstr "In Anzahl von Tagen"
 
-msgctxt "help:sale.handle.invoice.exception.ask,recreate_invoices:0"
+msgctxt "help:sale.handle.invoice.exception.ask,recreate_invoices:"
 msgid ""
 "The selected invoices will be recreated. The other ones will be ignored."
 msgstr ""
@@ -418,6 +660,10 @@ msgctxt "model:ir.action,name:act_open_customer"
 msgid "Parties associated to Sales"
 msgstr "Parteien: Verkäufen zugeordnet"
 
+msgctxt "model:ir.action,name:act_return_form"
+msgid "Returns"
+msgstr "Rücknahmen"
+
 msgctxt "model:ir.action,name:act_sale_configuration_form"
 msgid "Sales Configuration"
 msgstr "Einstellungen Verkauf"
@@ -438,6 +684,10 @@ msgctxt "model:ir.action,name:act_sale_form_draft"
 msgid "Draft Sales"
 msgstr "Entwürfe Verkäufe"
 
+msgctxt "model:ir.action,name:act_sale_form_processing"
+msgid "Processing Sales"
+msgstr "Verkäufe durchführen"
+
 msgctxt "model:ir.action,name:act_sale_form_quotation"
 msgid "Quotation Sales"
 msgstr "Angebote Verkäufe"
@@ -454,6 +704,10 @@ msgctxt "model:ir.action,name:wizard_invoice_handle_exception"
 msgid "Handle Invoice Exception"
 msgstr "Rechnungsvorbehalt bearbeiten"
 
+msgctxt "model:ir.action,name:wizard_return_sale"
+msgid "Create Return Sale"
+msgstr "Rücknahme erstellen"
+
 msgctxt "model:ir.action,name:wizard_shipment_handle_exception"
 msgid "Handle Shipment Exception"
 msgstr "Liefervorbehalt bearbeiten"
@@ -494,6 +748,10 @@ msgctxt "model:ir.ui.menu,name:menu_sale_form_draft"
 msgid "Draft Sales"
 msgstr "Entwürfe (Verkäufe)"
 
+msgctxt "model:ir.ui.menu,name:menu_sale_form_processing"
+msgid "Processing Sales"
+msgstr "Verkäufe durchführen"
+
 msgctxt "model:ir.ui.menu,name:menu_sale_form_quotation"
 msgid "Quotation Sales"
 msgstr "Angebote (Verkäufe)"
@@ -506,510 +764,414 @@ msgctxt "model:res.group,name:group_sale_admin"
 msgid "Sales Administrator"
 msgstr "Verkauf Administration"
 
-msgctxt "model:sale.configuration,name:0"
+msgctxt "model:sale.configuration,name:"
 msgid "Sale Configuration"
 msgstr "Einstellungen Verkauf"
 
-msgctxt "model:sale.handle.invoice.exception.ask,name:0"
-msgid "Invoice Exception Ask"
+msgctxt "model:sale.handle.invoice.exception.ask,name:"
+msgid "Handle Invoice Exception"
 msgstr "Rechnungsvorbehalt Nachfrage"
 
-msgctxt "model:sale.handle.shipment.exception.ask,name:0"
-msgid "Shipment Exception Ask"
+msgctxt "model:sale.handle.shipment.exception.ask,name:"
+msgid "Handle Shipment Exception"
 msgstr "Nachfrage Liefervorbehalt"
 
-msgctxt "model:sale.line,name:0"
+msgctxt "model:sale.line,name:"
 msgid "Sale Line"
 msgstr "Verkauf Position"
 
-msgctxt "model:sale.line-account.invoice.line,name:0"
+msgctxt "model:sale.line-account.invoice.line,name:"
 msgid "Sale Line - Invoice Line"
 msgstr "Verkauf Position - Rechnungsposition"
 
-msgctxt "model:sale.line-account.tax,name:0"
+msgctxt "model:sale.line-account.tax,name:"
 msgid "Sale Line - Tax"
 msgstr "Verkauf Position - Steuer"
 
-msgctxt "model:sale.line-ignored-stock.move,name:0"
+msgctxt "model:sale.line-ignored-stock.move,name:"
 msgid "Sale Line - Ignored Move"
 msgstr "Verkauf Position - Bewegung Ignoriert"
 
-msgctxt "model:sale.line-recreated-stock.move,name:0"
+msgctxt "model:sale.line-recreated-stock.move,name:"
 msgid "Sale Line - Recreated Move"
 msgstr "Verkauf Position - Bewegung Nachgebildet"
 
-msgctxt "model:sale.sale,name:0"
+msgctxt "model:sale.sale,name:"
 msgid "Sale"
 msgstr "Verkauf"
 
-msgctxt "model:sale.sale-account.invoice,name:0"
+msgctxt "model:sale.sale-account.invoice,name:"
 msgid "Sale - Invoice"
 msgstr "Verkauf - Rechnung"
 
-msgctxt "model:sale.sale-ignored-account.invoice,name:0"
+msgctxt "model:sale.sale-ignored-account.invoice,name:"
 msgid "Sale - Ignored Invoice"
 msgstr "Verkauf - Rechnung Ignoriert"
 
-msgctxt "model:sale.sale-recreated-account.invoice,name:0"
+msgctxt "model:sale.sale-recreated-account.invoice,name:"
 msgid "Sale - Recreated Invoice"
 msgstr "Verkauf - Rechnung Nachgebildet"
 
-msgctxt "model:workflow,name:sale_workflow"
-msgid "Sale workflow"
-msgstr "Workflow Verkauf"
-
-msgctxt "model:workflow.activity,name:sale_activity_cancel"
-msgid "Canceled"
-msgstr "Annulliert"
-
-msgctxt "model:workflow.activity,name:sale_activity_confirmed"
-msgid "Confirmed"
-msgstr "Beauftragt"
-
-msgctxt "model:workflow.activity,name:sale_activity_done"
-msgid "Done"
-msgstr "Erledigt"
-
-msgctxt "model:workflow.activity,name:sale_activity_draft"
-msgid "Draft"
-msgstr "Entwurf"
-
-msgctxt "model:workflow.activity,name:sale_activity_invoice_method"
-msgid "Invoice Method"
-msgstr "Rechnungsstellung"
-
-msgctxt "model:workflow.activity,name:sale_activity_invoice_method_done"
-msgid "Invoice Method Done"
-msgstr "Rechnungsstellung erledigt"
-
-msgctxt "model:workflow.activity,name:sale_activity_invoice_sale_done"
-msgid "Invoice Done"
-msgstr "Rechnung erledigt"
-
-msgctxt "model:workflow.activity,name:sale_activity_invoice_sale_exception"
-msgid "Invoice Exception"
-msgstr "Rechnungsvorbehalt"
-
-msgctxt "model:workflow.activity,name:sale_activity_invoice_shipment"
-msgid "Invoice Shipment"
-msgstr "Rechnung Lieferposten"
-
-msgctxt "model:workflow.activity,name:sale_activity_invoice_shipment_done"
-msgid "Invoice Shipment Done"
-msgstr "Rechnung Lieferposten erledigt"
-
-msgctxt ""
-"model:workflow.activity,name:sale_activity_invoice_shipment_exception"
-msgid "Invoice Shipment Exception"
-msgstr "Rechnung Lieferposten Vorbehalt"
-
-msgctxt "model:workflow.activity,name:sale_activity_invoice_shipment_method"
-msgid "Invoice Shipment Method"
-msgstr "Rechnung Liefermethode"
-
-msgctxt ""
-"model:workflow.activity,name:sale_activity_invoice_shipment_method_done"
-msgid "Invoice Shipment Method Done"
-msgstr "Rechnung Liefermethode erledigt"
-
-msgctxt "model:workflow.activity,name:sale_activity_quotation"
-msgid "Quotation"
-msgstr "Angebot"
-
-msgctxt "model:workflow.activity,name:sale_activity_shipment"
-msgid "Shipment"
-msgstr "Lieferposten"
-
-msgctxt "model:workflow.activity,name:sale_activity_shipment_exception"
-msgid "Shipment Exception"
-msgstr "Lieferposten Vorbehalt"
-
-msgctxt "model:workflow.activity,name:sale_activity_shipment_invoice"
-msgid "Shipment Invoice"
-msgstr "Lieferposten Rechnung"
-
-msgctxt "model:workflow.activity,name:sale_activity_shipment_invoice_done"
-msgid "Shipment Invoice Done"
-msgstr "Lieferposten Rechnung erledigt"
-
-msgctxt ""
-"model:workflow.activity,name:sale_activity_shipment_invoice_exception"
-msgid "Shipment Invoice Exception"
-msgstr "Lieferposten Rechnung Vorbehalt"
-
-msgctxt "model:workflow.activity,name:sale_activity_shipment_invoice_method"
-msgid "Shipment Invoice Method"
-msgstr "Lieferposten Rechnungsmethode"
-
-msgctxt ""
-"model:workflow.activity,name:sale_activity_shipment_invoice_method_done"
-msgid "Shipment Invoice Method Done"
-msgstr "Lieferposten Rechnungsmethode erledigt"
-
-msgctxt "model:workflow.activity,name:sale_activity_shipment_method"
-msgid "Shipment Method"
-msgstr "Liefermethode"
-
-msgctxt "model:workflow.activity,name:sale_activity_shipment_method_done"
-msgid "Shipment Method Done"
-msgstr "Liefermethode erledigt"
-
-msgctxt "model:workflow.activity,name:sale_activity_waiting_invoice_sale"
-msgid "Waiting Invoice"
-msgstr "Rechnung Wartend"
-
-msgctxt "model:workflow.activity,name:sale_activity_waiting_invoice_shipment"
-msgid "Waiting Invoice Shipment"
-msgstr "Rechnung Lieferposten Wartend"
-
-msgctxt "model:workflow.activity,name:sale_activity_waiting_shipment"
-msgid "Waiting Shipment"
-msgstr "Lieferposten Wartend"
-
-msgctxt "model:workflow.activity,name:sale_activity_waiting_shipment_invoice"
-msgid "Waiting Shipment Invoice"
-msgstr "Lieferposten Rechnung Wartend"
-
-msgctxt "odt:sale.sale:0"
+msgctxt "odt:sale.sale:"
 msgid "Amount"
 msgstr "Betrag"
 
-msgctxt "odt:sale.sale:0"
+msgctxt "odt:sale.sale:"
 msgid "Date:"
 msgstr "Datum:"
 
-msgctxt "odt:sale.sale:0"
+msgctxt "odt:sale.sale:"
 msgid "Description"
 msgstr "Bezeichnung"
 
-msgctxt "odt:sale.sale:0"
+msgctxt "odt:sale.sale:"
 msgid "Description:"
 msgstr "Bezeichnung:"
 
-msgctxt "odt:sale.sale:0"
+msgctxt "odt:sale.sale:"
 msgid "Draft Sale Order"
 msgstr "Auftrag (Entwurf)"
 
-msgctxt "odt:sale.sale:0"
+msgctxt "odt:sale.sale:"
 msgid "E-Mail:"
 msgstr "E-Mail:"
 
-msgctxt "odt:sale.sale:0"
+msgctxt "odt:sale.sale:"
 msgid "Phone:"
 msgstr "Telefon:"
 
-msgctxt "odt:sale.sale:0"
+msgctxt "odt:sale.sale:"
 msgid "Quantity"
 msgstr "Anzahl"
 
-msgctxt "odt:sale.sale:0"
+msgctxt "odt:sale.sale:"
 msgid "Quotation N°:"
 msgstr "Angebot Nr.:"
 
-msgctxt "odt:sale.sale:0"
+msgctxt "odt:sale.sale:"
 msgid "Sale Order N°:"
 msgstr "Auftrag Nr.:"
 
-msgctxt "odt:sale.sale:0"
+msgctxt "odt:sale.sale:"
 msgid "Taxes"
 msgstr "Steuern"
 
-msgctxt "odt:sale.sale:0"
+msgctxt "odt:sale.sale:"
 msgid "Taxes:"
 msgstr "Steuern:"
 
-msgctxt "odt:sale.sale:0"
+msgctxt "odt:sale.sale:"
 msgid "Total (excl. taxes):"
 msgstr "Netto:"
 
-msgctxt "odt:sale.sale:0"
+msgctxt "odt:sale.sale:"
 msgid "Total:"
 msgstr "Gesamt:"
 
-msgctxt "odt:sale.sale:0"
+msgctxt "odt:sale.sale:"
 msgid "Unit Price"
 msgstr "Einzelpreis"
 
-msgctxt "odt:sale.sale:0"
+msgctxt "odt:sale.sale:"
 msgid "VAT Number:"
 msgstr "USt-ID-Nr.:"
 
-msgctxt "odt:sale.sale:0"
+msgctxt "odt:sale.sale:"
 msgid "VAT:"
 msgstr "USt:"
 
-msgctxt "selection:account.invoice,sale_exception_state:0"
+msgctxt "selection:account.invoice,sale_exception_state:"
 msgid ""
 msgstr ""
 
-msgctxt "selection:account.invoice,sale_exception_state:0"
+msgctxt "selection:account.invoice,sale_exception_state:"
 msgid "Ignored"
 msgstr "Ignoriert"
 
-msgctxt "selection:account.invoice,sale_exception_state:0"
+msgctxt "selection:account.invoice,sale_exception_state:"
 msgid "Recreated"
 msgstr "Nachgebildet"
 
-msgctxt "selection:sale.configuration,sale_invoice_method:0"
+msgctxt "selection:sale.configuration,sale_invoice_method:"
 msgid "Manual"
 msgstr "Manuell"
 
-msgctxt "selection:sale.configuration,sale_invoice_method:0"
-msgid "On Order Confirmed"
-msgstr "Bei Beauftragung"
+msgctxt "selection:sale.configuration,sale_invoice_method:"
+msgid "On Order Processed"
+msgstr "Nach Durchführung Auftrag"
 
-msgctxt "selection:sale.configuration,sale_invoice_method:0"
+msgctxt "selection:sale.configuration,sale_invoice_method:"
 msgid "On Shipment Sent"
 msgstr "Bei Versand"
 
-msgctxt "selection:sale.configuration,sale_shipment_method:0"
+msgctxt "selection:sale.configuration,sale_shipment_method:"
 msgid "Manual"
 msgstr "Manuell"
 
-msgctxt "selection:sale.configuration,sale_shipment_method:0"
+msgctxt "selection:sale.configuration,sale_shipment_method:"
 msgid "On Invoice Paid"
 msgstr "Bei Bezahlung"
 
-msgctxt "selection:sale.configuration,sale_shipment_method:0"
-msgid "On Order Confirmed"
-msgstr "Bei Beauftragung"
+msgctxt "selection:sale.configuration,sale_shipment_method:"
+msgid "On Order Processed"
+msgstr "Nach Durchführung Auftrag"
 
-msgctxt "selection:sale.line,type:0"
+msgctxt "selection:sale.line,type:"
 msgid "Comment"
 msgstr "Kommentar"
 
-msgctxt "selection:sale.line,type:0"
+msgctxt "selection:sale.line,type:"
 msgid "Line"
 msgstr "Position"
 
-msgctxt "selection:sale.line,type:0"
+msgctxt "selection:sale.line,type:"
 msgid "Subtotal"
 msgstr "Zwischensumme"
 
-msgctxt "selection:sale.line,type:0"
+msgctxt "selection:sale.line,type:"
 msgid "Title"
 msgstr "Überschrift"
 
-msgctxt "selection:sale.sale,invoice_method:0"
+msgctxt "selection:sale.sale,invoice_method:"
 msgid "Manual"
 msgstr "Manuell"
 
-msgctxt "selection:sale.sale,invoice_method:0"
-msgid "On Order Confirmed"
-msgstr "Bei Beauftragung"
+msgctxt "selection:sale.sale,invoice_method:"
+msgid "On Order Processed"
+msgstr "Nach Durchführung Auftrag"
 
-msgctxt "selection:sale.sale,invoice_method:0"
+msgctxt "selection:sale.sale,invoice_method:"
 msgid "On Shipment Sent"
 msgstr "Bei Versand"
 
-msgctxt "selection:sale.sale,invoice_state:0"
+msgctxt "selection:sale.sale,invoice_state:"
 msgid "Exception"
 msgstr "Vorbehalt"
 
-msgctxt "selection:sale.sale,invoice_state:0"
+msgctxt "selection:sale.sale,invoice_state:"
 msgid "None"
 msgstr "Kein"
 
-msgctxt "selection:sale.sale,invoice_state:0"
+msgctxt "selection:sale.sale,invoice_state:"
 msgid "Paid"
 msgstr "Bezahlt"
 
-msgctxt "selection:sale.sale,invoice_state:0"
+msgctxt "selection:sale.sale,invoice_state:"
 msgid "Waiting"
 msgstr "Wartend"
 
-msgctxt "selection:sale.sale,shipment_method:0"
+msgctxt "selection:sale.sale,shipment_method:"
 msgid "Manual"
 msgstr "Manuell"
 
-msgctxt "selection:sale.sale,shipment_method:0"
+msgctxt "selection:sale.sale,shipment_method:"
 msgid "On Invoice Paid"
 msgstr "Bei Bezahlung"
 
-msgctxt "selection:sale.sale,shipment_method:0"
-msgid "On Order Confirmed"
-msgstr "Bei Beauftragung"
+msgctxt "selection:sale.sale,shipment_method:"
+msgid "On Order Processed"
+msgstr "Nach Durchführung Auftrag"
 
-msgctxt "selection:sale.sale,shipment_state:0"
+msgctxt "selection:sale.sale,shipment_state:"
 msgid "Exception"
 msgstr "Vorbehalt"
 
-msgctxt "selection:sale.sale,shipment_state:0"
+msgctxt "selection:sale.sale,shipment_state:"
 msgid "None"
 msgstr "Kein"
 
-msgctxt "selection:sale.sale,shipment_state:0"
+msgctxt "selection:sale.sale,shipment_state:"
 msgid "Sent"
 msgstr "Gesendet"
 
-msgctxt "selection:sale.sale,shipment_state:0"
+msgctxt "selection:sale.sale,shipment_state:"
 msgid "Waiting"
 msgstr "Wartend"
 
-msgctxt "selection:sale.sale,state:0"
+msgctxt "selection:sale.sale,state:"
 msgid "Canceled"
 msgstr "Annulliert"
 
-msgctxt "selection:sale.sale,state:0"
+msgctxt "selection:sale.sale,state:"
 msgid "Confirmed"
 msgstr "Beauftragt"
 
-msgctxt "selection:sale.sale,state:0"
+msgctxt "selection:sale.sale,state:"
 msgid "Done"
 msgstr "Erledigt"
 
-msgctxt "selection:sale.sale,state:0"
+msgctxt "selection:sale.sale,state:"
 msgid "Draft"
 msgstr "Entwurf"
 
-msgctxt "selection:sale.sale,state:0"
+msgctxt "selection:sale.sale,state:"
+msgid "Processing"
+msgstr "Abschlussarbeiten"
+
+msgctxt "selection:sale.sale,state:"
 msgid "Quotation"
 msgstr "Angebot"
 
-msgctxt "selection:stock.move,sale_exception_state:0"
+msgctxt "selection:stock.move,sale_exception_state:"
 msgid ""
 msgstr ""
 
-msgctxt "selection:stock.move,sale_exception_state:0"
+msgctxt "selection:stock.move,sale_exception_state:"
 msgid "Ignored"
 msgstr "Ignoriert"
 
-msgctxt "selection:stock.move,sale_exception_state:0"
+msgctxt "selection:stock.move,sale_exception_state:"
 msgid "Recreated"
 msgstr "Nachgebildet"
 
-msgctxt "view:product.product:0"
+msgctxt "view:product.product:"
 msgid "Customers"
 msgstr "Kunden"
 
-msgctxt "view:product.template:0"
+msgctxt "view:product.product:"
+msgid "Products"
+msgstr "Artikel"
+
+msgctxt "view:product.template:"
 msgid "Customers"
 msgstr "Kunden"
 
-msgctxt "view:sale.configuration:0"
+msgctxt "view:sale.configuration:"
 msgid "Sale Configuration"
 msgstr "Einstellungen Verkauf"
 
-msgctxt "view:sale.handle.invoice.exception.ask:0"
+msgctxt "view:sale.handle.invoice.exception.ask:"
 msgid "Choose invoices to duplicate"
 msgstr "Auswahl Rechnungen für Duplizierung"
 
-msgctxt "view:sale.handle.invoice.exception.ask:0"
+msgctxt "view:sale.handle.invoice.exception.ask:"
 msgid "Choose invoices to recreate"
 msgstr "Rechnungen zum Nachbilden auswählen"
 
-msgctxt "view:sale.handle.invoice.exception.ask:0"
+msgctxt "view:sale.handle.invoice.exception.ask:"
 msgid "Handle Invoice Exception"
 msgstr "Rechnungsvorbehalt bearbeiten"
 
-msgctxt "view:sale.handle.shipment.exception.ask:0"
+msgctxt "view:sale.handle.shipment.exception.ask:"
 msgid "Choose move to duplicate"
 msgstr "Auswahl Bewegungen für Duplizierung"
 
-msgctxt "view:sale.handle.shipment.exception.ask:0"
+msgctxt "view:sale.handle.shipment.exception.ask:"
 msgid "Choose move to recreate"
 msgstr "Bewegungen zum Nachbilden auswählen"
 
-msgctxt "view:sale.handle.shipment.exception.ask:0"
+msgctxt "view:sale.handle.shipment.exception.ask:"
 msgid "Duplicate Moves"
 msgstr "Bewegungen duplizieren"
 
-msgctxt "view:sale.handle.shipment.exception.ask:0"
+msgctxt "view:sale.handle.shipment.exception.ask:"
 msgid "Handle shipment Exception"
 msgstr "Liefervorbehalt bearbeiten"
 
-msgctxt "view:sale.handle.shipment.exception.ask:0"
+msgctxt "view:sale.handle.shipment.exception.ask:"
 msgid "Recreate Moves"
 msgstr "Bewegungen nachbilden"
 
-msgctxt "view:sale.line:0"
+msgctxt "view:sale.line:"
 msgid "General"
 msgstr "Allgemein"
 
-msgctxt "view:sale.line:0"
+msgctxt "view:sale.line:"
 msgid "Notes"
 msgstr "Notizen"
 
-msgctxt "view:sale.line:0"
+msgctxt "view:sale.line:"
 msgid "Products"
 msgstr "Artikel"
 
-msgctxt "view:sale.line:0"
+msgctxt "view:sale.line:"
 msgid "Sale Line"
 msgstr "Position Verkauf"
 
-msgctxt "view:sale.line:0"
+msgctxt "view:sale.line:"
 msgid "Sale Lines"
 msgstr "Positionen Verkauf"
 
-msgctxt "view:sale.sale:0"
+msgctxt "view:sale.sale:"
 msgid "Cancel"
 msgstr "Annullieren"
 
-msgctxt "view:sale.sale:0"
+msgctxt "view:sale.sale:"
 msgid "Confirm"
 msgstr "Bestätigen"
 
-msgctxt "view:sale.sale:0"
+msgctxt "view:sale.sale:"
 msgid "Draft"
 msgstr "Entwurf"
 
-msgctxt "view:sale.sale:0"
+msgctxt "view:sale.sale:"
 msgid "Handle Invoice Exception"
 msgstr "Rechnungsvorbehalt bearbeiten"
 
-msgctxt "view:sale.sale:0"
+msgctxt "view:sale.sale:"
 msgid "Handle Shipment Exception"
 msgstr "Liefervorbehalt bearbeiten"
 
-msgctxt "view:sale.sale:0"
+msgctxt "view:sale.sale:"
 msgid "Ignore Invoice Exception"
 msgstr "Rechnungsvorbehalt ignorieren"
 
-msgctxt "view:sale.sale:0"
+msgctxt "view:sale.sale:"
 msgid "Invoices"
 msgstr "Rechnungen"
 
-msgctxt "view:sale.sale:0"
+msgctxt "view:sale.sale:"
 msgid "Lines"
 msgstr "Positionen"
 
-msgctxt "view:sale.sale:0"
+msgctxt "view:sale.sale:"
 msgid "Moves"
 msgstr "Bewegungen"
 
-msgctxt "view:sale.sale:0"
+msgctxt "view:sale.sale:"
 msgid "Other Info"
 msgstr "Sonstiges"
 
-msgctxt "view:sale.sale:0"
+msgctxt "view:sale.sale:"
+msgid "Process"
+msgstr "Durchführen"
+
+msgctxt "view:sale.sale:"
 msgid "Quotation"
 msgstr "Angebot"
 
-msgctxt "view:sale.sale:0"
+msgctxt "view:sale.sale:"
+msgid "Quote"
+msgstr "Angebot"
+
+msgctxt "view:sale.sale:"
 msgid "Sale"
 msgstr "Verkauf"
 
-msgctxt "view:sale.sale:0"
+msgctxt "view:sale.sale:"
 msgid "Sales"
 msgstr "Verkäufe"
 
-msgctxt "view:sale.sale:0"
+msgctxt "view:sale.sale:"
 msgid "Shipments"
 msgstr "Lieferposten"
 
-msgctxt "wizard_button:sale.handle.invoice.exception,init,end:0"
+msgctxt "view:stock.move:"
+msgid "Moves"
+msgstr "Lagerbewegungen"
+
+msgctxt "wizard_button:sale.handle.invoice.exception,ask,end:"
 msgid "Cancel"
 msgstr "Abbrechen"
 
-msgctxt "wizard_button:sale.handle.invoice.exception,init,ok:0"
+msgctxt "wizard_button:sale.handle.invoice.exception,ask,handle:"
 msgid "Ok"
 msgstr "OK"
 
-msgctxt "wizard_button:sale.handle.shipment.exception,init,end:0"
+msgctxt "wizard_button:sale.handle.shipment.exception,ask,end:"
 msgid "Cancel"
 msgstr "Abbrechen"
 
-msgctxt "wizard_button:sale.handle.shipment.exception,init,ok:0"
+msgctxt "wizard_button:sale.handle.shipment.exception,ask,handle:"
 msgid "Ok"
 msgstr "OK"
diff --git a/locale/es_AR.po b/locale/es_AR.po
new file mode 100644
index 0000000..c83dd30
--- /dev/null
+++ b/locale/es_AR.po
@@ -0,0 +1,1160 @@
+# 
+msgid ""
+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 "¡No puede borrar facturas que provienen de una venta!"
+
+msgctxt "error:account.invoice:"
+msgid "You cannot reset to draft an invoice generated by a sale."
+msgstr "No puede restablecer a borrador una factura generada por una venta."
+
+msgctxt "error:sale.line:"
+msgid "It misses an \"Account Revenue\" on product \"%s\"!"
+msgstr "¡Falta una «cuenta de ingresos» en el producto «%s»!"
+
+msgctxt "error:sale.line:"
+msgid "It misses an \"account Revenue\" default property!"
+msgstr "¡Falta una propiedad predeterminada de «cuenta de ingresos»!"
+
+msgctxt "error:sale.line:"
+msgid "The customer location is required!"
+msgstr "¡Se necesita la ubicación del cliente!"
+
+msgctxt "error:sale.sale:"
+msgid "Invoice and Shipment addresses must be defined for the quotation."
+msgstr ""
+"Las direcciones de facturación y de envío debe ser definida para el "
+"presupuesto."
+
+msgctxt "error:sale.sale:"
+msgid "It misses an \"Account Receivable\" on the party \"%s\"!"
+msgstr "¡Falta una «cuenta de ingresos» en la entidad «%s»!"
+
+msgctxt "error:sale.sale:"
+msgid "Sale \"%s\" must be cancelled before deletion!"
+msgstr "¡Venta \"%s\" debe ser cancelada antes de eliminar!"
+
+msgctxt "error:sale.sale:"
+msgid "Warehouse must be defined for the quotation."
+msgstr "Almacén debe estar definido para el presupuesto."
+
+msgctxt "error:sale.sale:"
+msgid "Wrong combination of method!"
+msgstr "¡Combinación inválida de métodos!"
+
+msgctxt "error:stock.shipment.out.return:"
+msgid "You cannot reset to draft a move generated by a sale."
+msgstr ""
+"¡No puede restablecer a borrador un movimiento generado por una venta!"
+
+msgctxt "error:stock.shipment.out:"
+msgid "You cannot reset to draft a move generated by a sale."
+msgstr "No puede restablecer a borrador un movimiento generado por una venta."
+
+msgctxt "field:account.invoice,sale_exception_state:"
+msgid "Exception State"
+msgstr "Estado de excepción"
+
+msgctxt "field:account.invoice,sales:"
+msgid "Sales"
+msgstr "Ventas"
+
+msgctxt "field:account.invoice.line,sale_lines:"
+msgid "Sale Lines"
+msgstr "Líneas de venta"
+
+msgctxt "field:product.template,delivery_time:"
+msgid "Delivery Time"
+msgstr "Tiempo de envío"
+
+msgctxt "field:product.template,salable:"
+msgid "Salable"
+msgstr "Vendible"
+
+msgctxt "field:product.template,sale_uom:"
+msgid "Sale UOM"
+msgstr "UdM de venta"
+
+msgctxt "field:sale.configuration,create_date:"
+msgid "Create Date"
+msgstr "Fecha creación"
+
+msgctxt "field:sale.configuration,create_uid:"
+msgid "Create User"
+msgstr "Usuario creación"
+
+msgctxt "field:sale.configuration,id:"
+msgid "ID"
+msgstr "ID"
+
+msgctxt "field:sale.configuration,rec_name:"
+msgid "Name"
+msgstr "Nombre del campo"
+
+msgctxt "field:sale.configuration,sale_invoice_method:"
+msgid "Sale Invoice Method"
+msgstr "Método de Facturación de Venta"
+
+msgctxt "field:sale.configuration,sale_sequence:"
+msgid "Sale Reference Sequence"
+msgstr "Secuencia de Referencia de Venta"
+
+msgctxt "field:sale.configuration,sale_shipment_method:"
+msgid "Sale Shipment Method"
+msgstr "Método de Envío de Venta"
+
+msgctxt "field:sale.configuration,write_date:"
+msgid "Write Date"
+msgstr "Fecha modificación"
+
+msgctxt "field:sale.configuration,write_uid:"
+msgid "Write User"
+msgstr "Usuario modificación"
+
+msgctxt "field:sale.handle.invoice.exception.ask,domain_invoices:"
+msgid "Domain Invoices"
+msgstr "Facturas del dominio"
+
+msgctxt "field:sale.handle.invoice.exception.ask,id:"
+msgid "ID"
+msgstr "ID"
+
+msgctxt "field:sale.handle.invoice.exception.ask,recreate_invoices:"
+msgid "Recreate Invoices"
+msgstr "Rehacer facturas"
+
+msgctxt "field:sale.handle.shipment.exception.ask,domain_moves:"
+msgid "Domain Moves"
+msgstr "Movimientos de dominio"
+
+msgctxt "field:sale.handle.shipment.exception.ask,id:"
+msgid "ID"
+msgstr "ID"
+
+msgctxt "field:sale.handle.shipment.exception.ask,recreate_moves:"
+msgid "Recreate Moves"
+msgstr "Rehacer movimientos"
+
+msgctxt "field:sale.line,amount:"
+msgid "Amount"
+msgstr "Cantidad"
+
+msgctxt "field:sale.line,create_date:"
+msgid "Create Date"
+msgstr "Fecha creación"
+
+msgctxt "field:sale.line,create_uid:"
+msgid "Create User"
+msgstr "Usuario creación"
+
+msgctxt "field:sale.line,delivery_date:"
+msgid "Delivery Date"
+msgstr "Fecha de Entrega"
+
+msgctxt "field:sale.line,description:"
+msgid "Description"
+msgstr "Descripción"
+
+msgctxt "field:sale.line,from_location:"
+msgid "From Location"
+msgstr "De ubicación"
+
+msgctxt "field:sale.line,id:"
+msgid "ID"
+msgstr "ID"
+
+msgctxt "field:sale.line,invoice_lines:"
+msgid "Invoice Lines"
+msgstr "Líneas de factura"
+
+msgctxt "field:sale.line,move_done:"
+msgid "Moves Done"
+msgstr "Movimientos terminados"
+
+msgctxt "field:sale.line,move_exception:"
+msgid "Moves Exception"
+msgstr "Exepción de movimientos"
+
+msgctxt "field:sale.line,moves:"
+msgid "Moves"
+msgstr "Movimientos"
+
+msgctxt "field:sale.line,moves_ignored:"
+msgid "Ignored Moves"
+msgstr "Movimientos ignorados"
+
+msgctxt "field:sale.line,moves_recreated:"
+msgid "Recreated Moves"
+msgstr "Rehacer movimientos"
+
+msgctxt "field:sale.line,note:"
+msgid "Note"
+msgstr "Nota"
+
+msgctxt "field:sale.line,product:"
+msgid "Product"
+msgstr "Producto"
+
+msgctxt "field:sale.line,product_uom_category:"
+msgid "Product Uom Category"
+msgstr "Categoría UdM del producto"
+
+msgctxt "field:sale.line,quantity:"
+msgid "Quantity"
+msgstr "Cantidad"
+
+msgctxt "field:sale.line,rec_name:"
+msgid "Name"
+msgstr "Nombre"
+
+msgctxt "field:sale.line,sale:"
+msgid "Sale"
+msgstr "Venta"
+
+msgctxt "field:sale.line,sequence:"
+msgid "Sequence"
+msgstr "Secuencia"
+
+msgctxt "field:sale.line,taxes:"
+msgid "Taxes"
+msgstr "Impuestos"
+
+msgctxt "field:sale.line,to_location:"
+msgid "To Location"
+msgstr "A ubicación"
+
+msgctxt "field:sale.line,type:"
+msgid "Type"
+msgstr "Tipo"
+
+msgctxt "field:sale.line,unit:"
+msgid "Unit"
+msgstr "Unidad"
+
+msgctxt "field:sale.line,unit_digits:"
+msgid "Unit Digits"
+msgstr "Dígitos de la unidad"
+
+msgctxt "field:sale.line,unit_price:"
+msgid "Unit Price"
+msgstr "Precio unitario"
+
+msgctxt "field:sale.line,warehouse:"
+msgid "Warehouse"
+msgstr "Depósito"
+
+msgctxt "field:sale.line,write_date:"
+msgid "Write Date"
+msgstr "Fecha modificación"
+
+msgctxt "field:sale.line,write_uid:"
+msgid "Write User"
+msgstr "Usuario modificación"
+
+msgctxt "field:sale.line-account.invoice.line,create_date:"
+msgid "Create Date"
+msgstr "Fecha creación"
+
+msgctxt "field:sale.line-account.invoice.line,create_uid:"
+msgid "Create User"
+msgstr "Usuario creación"
+
+msgctxt "field:sale.line-account.invoice.line,id:"
+msgid "ID"
+msgstr "ID"
+
+msgctxt "field:sale.line-account.invoice.line,invoice_line:"
+msgid "Invoice Line"
+msgstr "Línea de factura"
+
+msgctxt "field:sale.line-account.invoice.line,rec_name:"
+msgid "Name"
+msgstr "Nombre"
+
+msgctxt "field:sale.line-account.invoice.line,sale_line:"
+msgid "Sale Line"
+msgstr "Línea de venta"
+
+msgctxt "field:sale.line-account.invoice.line,write_date:"
+msgid "Write Date"
+msgstr "Fecha modificación"
+
+msgctxt "field:sale.line-account.invoice.line,write_uid:"
+msgid "Write User"
+msgstr "Usuario modificación"
+
+msgctxt "field:sale.line-account.tax,create_date:"
+msgid "Create Date"
+msgstr "Fecha creación"
+
+msgctxt "field:sale.line-account.tax,create_uid:"
+msgid "Create User"
+msgstr "Usuario creación"
+
+msgctxt "field:sale.line-account.tax,id:"
+msgid "ID"
+msgstr "ID"
+
+msgctxt "field:sale.line-account.tax,line:"
+msgid "Sale Line"
+msgstr "Línea de venta"
+
+msgctxt "field:sale.line-account.tax,rec_name:"
+msgid "Name"
+msgstr "Nombre"
+
+msgctxt "field:sale.line-account.tax,tax:"
+msgid "Tax"
+msgstr "Impuesto"
+
+msgctxt "field:sale.line-account.tax,write_date:"
+msgid "Write Date"
+msgstr "Fecha modificación"
+
+msgctxt "field:sale.line-account.tax,write_uid:"
+msgid "Write User"
+msgstr "Usuario modificación"
+
+msgctxt "field:sale.line-ignored-stock.move,create_date:"
+msgid "Create Date"
+msgstr "Fecha creación"
+
+msgctxt "field:sale.line-ignored-stock.move,create_uid:"
+msgid "Create User"
+msgstr "Usuario creación"
+
+msgctxt "field:sale.line-ignored-stock.move,id:"
+msgid "ID"
+msgstr "ID"
+
+msgctxt "field:sale.line-ignored-stock.move,move:"
+msgid "Move"
+msgstr "Movimiento"
+
+msgctxt "field:sale.line-ignored-stock.move,rec_name:"
+msgid "Name"
+msgstr "Nombre"
+
+msgctxt "field:sale.line-ignored-stock.move,sale_line:"
+msgid "Sale Line"
+msgstr "Línea de venta"
+
+msgctxt "field:sale.line-ignored-stock.move,write_date:"
+msgid "Write Date"
+msgstr "Fecha modificación"
+
+msgctxt "field:sale.line-ignored-stock.move,write_uid:"
+msgid "Write User"
+msgstr "Usuario modificación"
+
+msgctxt "field:sale.line-recreated-stock.move,create_date:"
+msgid "Create Date"
+msgstr "Fecha creación"
+
+msgctxt "field:sale.line-recreated-stock.move,create_uid:"
+msgid "Create User"
+msgstr "Usuario creación"
+
+msgctxt "field:sale.line-recreated-stock.move,id:"
+msgid "ID"
+msgstr "ID"
+
+msgctxt "field:sale.line-recreated-stock.move,move:"
+msgid "Move"
+msgstr "Movimiento"
+
+msgctxt "field:sale.line-recreated-stock.move,rec_name:"
+msgid "Name"
+msgstr "Nombre"
+
+msgctxt "field:sale.line-recreated-stock.move,sale_line:"
+msgid "Sale Line"
+msgstr "Línea de venta"
+
+msgctxt "field:sale.line-recreated-stock.move,write_date:"
+msgid "Write Date"
+msgstr "Fecha modificación"
+
+msgctxt "field:sale.line-recreated-stock.move,write_uid:"
+msgid "Write User"
+msgstr "Usuario modificación"
+
+msgctxt "field:sale.sale,comment:"
+msgid "Comment"
+msgstr "Comentario"
+
+msgctxt "field:sale.sale,company:"
+msgid "Company"
+msgstr "Empresa"
+
+msgctxt "field:sale.sale,create_date:"
+msgid "Create Date"
+msgstr "Fecha creación"
+
+msgctxt "field:sale.sale,create_uid:"
+msgid "Create User"
+msgstr "Usuario creación"
+
+msgctxt "field:sale.sale,currency:"
+msgid "Currency"
+msgstr "Divisa"
+
+msgctxt "field:sale.sale,currency_digits:"
+msgid "Currency Digits"
+msgstr "Dígitos de la divisa"
+
+msgctxt "field:sale.sale,description:"
+msgid "Description"
+msgstr "Descripción"
+
+msgctxt "field:sale.sale,id:"
+msgid "ID"
+msgstr "ID"
+
+msgctxt "field:sale.sale,invoice_address:"
+msgid "Invoice Address"
+msgstr "Dirección de facturación"
+
+msgctxt "field:sale.sale,invoice_method:"
+msgid "Invoice Method"
+msgstr "Método de facturación"
+
+msgctxt "field:sale.sale,invoice_state:"
+msgid "Invoice State"
+msgstr "Estado de factura"
+
+msgctxt "field:sale.sale,invoices:"
+msgid "Invoices"
+msgstr "Facturas"
+
+msgctxt "field:sale.sale,invoices_ignored:"
+msgid "Ignored Invoices"
+msgstr "Facturas ignoradas"
+
+msgctxt "field:sale.sale,invoices_recreated:"
+msgid "Recreated Invoices"
+msgstr "Rehacer facturas"
+
+msgctxt "field:sale.sale,lines:"
+msgid "Lines"
+msgstr "Líneas"
+
+msgctxt "field:sale.sale,moves:"
+msgid "Moves"
+msgstr "Movimientos"
+
+msgctxt "field:sale.sale,party:"
+msgid "Party"
+msgstr "Entidad"
+
+msgctxt "field:sale.sale,party_lang:"
+msgid "Party Language"
+msgstr "Idioma de la entidad"
+
+msgctxt "field:sale.sale,payment_term:"
+msgid "Payment Term"
+msgstr "Término de pago"
+
+msgctxt "field:sale.sale,rec_name:"
+msgid "Name"
+msgstr "Nombre"
+
+msgctxt "field:sale.sale,reference:"
+msgid "Reference"
+msgstr "Referencia"
+
+msgctxt "field:sale.sale,sale_date:"
+msgid "Sale Date"
+msgstr "Fecha de venta"
+
+msgctxt "field:sale.sale,shipment_address:"
+msgid "Shipment Address"
+msgstr "Dirección de envío"
+
+msgctxt "field:sale.sale,shipment_method:"
+msgid "Shipment Method"
+msgstr "Método de envío"
+
+msgctxt "field:sale.sale,shipment_returns:"
+msgid "Shipment Returns"
+msgstr "Devolución de Envío"
+
+msgctxt "field:sale.sale,shipment_state:"
+msgid "Shipment State"
+msgstr "Estado de envío"
+
+msgctxt "field:sale.sale,shipments:"
+msgid "Shipments"
+msgstr "Envíos"
+
+msgctxt "field:sale.sale,state:"
+msgid "State"
+msgstr "Estado"
+
+msgctxt "field:sale.sale,tax_amount:"
+msgid "Tax"
+msgstr "Impuesto"
+
+msgctxt "field:sale.sale,tax_amount_cache:"
+msgid "Tax Cache"
+msgstr "Caché de Impuestos"
+
+msgctxt "field:sale.sale,total_amount:"
+msgid "Total"
+msgstr "Total"
+
+msgctxt "field:sale.sale,total_amount_cache:"
+msgid "Total Tax"
+msgstr "Total de Impuestos"
+
+msgctxt "field:sale.sale,untaxed_amount:"
+msgid "Untaxed"
+msgstr "Sin impuesto"
+
+msgctxt "field:sale.sale,untaxed_amount_cache:"
+msgid "Untaxed Cache"
+msgstr "Caché Libre de Impuestos"
+
+msgctxt "field:sale.sale,warehouse:"
+msgid "Warehouse"
+msgstr "Almacén"
+
+msgctxt "field:sale.sale,write_date:"
+msgid "Write Date"
+msgstr "Fecha modificación"
+
+msgctxt "field:sale.sale,write_uid:"
+msgid "Write User"
+msgstr "Usuario modificación"
+
+msgctxt "field:sale.sale-account.invoice,create_date:"
+msgid "Create Date"
+msgstr "Fecha creación"
+
+msgctxt "field:sale.sale-account.invoice,create_uid:"
+msgid "Create User"
+msgstr "Usuario creación"
+
+msgctxt "field:sale.sale-account.invoice,id:"
+msgid "ID"
+msgstr "ID"
+
+msgctxt "field:sale.sale-account.invoice,invoice:"
+msgid "Invoice"
+msgstr "Factura"
+
+msgctxt "field:sale.sale-account.invoice,rec_name:"
+msgid "Name"
+msgstr "Nombre"
+
+msgctxt "field:sale.sale-account.invoice,sale:"
+msgid "Sale"
+msgstr "Venta"
+
+msgctxt "field:sale.sale-account.invoice,write_date:"
+msgid "Write Date"
+msgstr "Fecha modificación"
+
+msgctxt "field:sale.sale-account.invoice,write_uid:"
+msgid "Write User"
+msgstr "Usuario modificación"
+
+msgctxt "field:sale.sale-ignored-account.invoice,create_date:"
+msgid "Create Date"
+msgstr "Fecha creación"
+
+msgctxt "field:sale.sale-ignored-account.invoice,create_uid:"
+msgid "Create User"
+msgstr "Usuario creación"
+
+msgctxt "field:sale.sale-ignored-account.invoice,id:"
+msgid "ID"
+msgstr "ID"
+
+msgctxt "field:sale.sale-ignored-account.invoice,invoice:"
+msgid "Invoice"
+msgstr "Factura"
+
+msgctxt "field:sale.sale-ignored-account.invoice,rec_name:"
+msgid "Name"
+msgstr "Nombre"
+
+msgctxt "field:sale.sale-ignored-account.invoice,sale:"
+msgid "Sale"
+msgstr "Venta"
+
+msgctxt "field:sale.sale-ignored-account.invoice,write_date:"
+msgid "Write Date"
+msgstr "Fecha modificación"
+
+msgctxt "field:sale.sale-ignored-account.invoice,write_uid:"
+msgid "Write User"
+msgstr "Usuario modificación"
+
+msgctxt "field:sale.sale-recreated-account.invoice,create_date:"
+msgid "Create Date"
+msgstr "Fecha creación"
+
+msgctxt "field:sale.sale-recreated-account.invoice,create_uid:"
+msgid "Create User"
+msgstr "Usuario creación"
+
+msgctxt "field:sale.sale-recreated-account.invoice,id:"
+msgid "ID"
+msgstr "ID"
+
+msgctxt "field:sale.sale-recreated-account.invoice,invoice:"
+msgid "Invoice"
+msgstr "Factura"
+
+msgctxt "field:sale.sale-recreated-account.invoice,rec_name:"
+msgid "Name"
+msgstr "Nombre"
+
+msgctxt "field:sale.sale-recreated-account.invoice,sale:"
+msgid "Sale"
+msgstr "Venta"
+
+msgctxt "field:sale.sale-recreated-account.invoice,write_date:"
+msgid "Write Date"
+msgstr "Fecha modificación"
+
+msgctxt "field:sale.sale-recreated-account.invoice,write_uid:"
+msgid "Write User"
+msgstr "Usuario modificación"
+
+msgctxt "field:stock.move,sale:"
+msgid "Sale"
+msgstr "Venta"
+
+msgctxt "field:stock.move,sale_exception_state:"
+msgid "Exception State"
+msgstr "Estado excepción"
+
+msgctxt "field:stock.move,sale_line:"
+msgid "Sale Line"
+msgstr "Línea de venta"
+
+msgctxt "help:product.template,delivery_time:"
+msgid "In number of days"
+msgstr "En número de días"
+
+msgctxt "help:sale.handle.invoice.exception.ask,recreate_invoices:"
+msgid ""
+"The selected invoices will be recreated. The other ones will be ignored."
+msgstr ""
+"Las facturas seleccionadas seran recreadas. Las otras serán ignoradas."
+
+msgctxt "model:ir.action,name:act_invoice_form"
+msgid "Invoices"
+msgstr "Facturas"
+
+msgctxt "model:ir.action,name:act_open_customer"
+msgid "Parties associated to Sales"
+msgstr "Entidades asociadas a ventas"
+
+msgctxt "model:ir.action,name:act_return_form"
+msgid "Returns"
+msgstr "Devolución"
+
+msgctxt "model:ir.action,name:act_sale_configuration_form"
+msgid "Sales Configuration"
+msgstr "Configuración de Ventas"
+
+msgctxt "model:ir.action,name:act_sale_form"
+msgid "Sales"
+msgstr "Ventas"
+
+msgctxt "model:ir.action,name:act_sale_form2"
+msgid "Sales"
+msgstr "Ventas"
+
+msgctxt "model:ir.action,name:act_sale_form_confirmed"
+msgid "Confirmed Sales"
+msgstr "Ventas confirmadas"
+
+msgctxt "model:ir.action,name:act_sale_form_draft"
+msgid "Draft Sales"
+msgstr "Ventas en borrador"
+
+msgctxt "model:ir.action,name:act_sale_form_processing"
+msgid "Processing Sales"
+msgstr "Ventas en proceso"
+
+msgctxt "model:ir.action,name:act_sale_form_quotation"
+msgid "Quotation Sales"
+msgstr "Ventas presupuestadas"
+
+msgctxt "model:ir.action,name:act_shipment_form"
+msgid "Shipments"
+msgstr "Envíos"
+
+msgctxt "model:ir.action,name:report_sale"
+msgid "Sale"
+msgstr "Venta"
+
+msgctxt "model:ir.action,name:wizard_invoice_handle_exception"
+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"
+
+msgctxt "model:ir.action,name:wizard_shipment_handle_exception"
+msgid "Handle Shipment Exception"
+msgstr "Gestionar excepción de envio"
+
+msgctxt "model:ir.sequence,name:sequence_sale"
+msgid "Sale"
+msgstr "Venta"
+
+msgctxt "model:ir.sequence.type,name:sequence_type_sale"
+msgid "Sale"
+msgstr "Venta"
+
+msgctxt "model:ir.ui.menu,name:menu_configuration"
+msgid "Configuration"
+msgstr "Configuración"
+
+msgctxt "model:ir.ui.menu,name:menu_customer"
+msgid "Parties associated to Sales"
+msgstr "Entidades asociadas a ventas"
+
+msgctxt "model:ir.ui.menu,name:menu_sale"
+msgid "Sales"
+msgstr "Gestión de ventas"
+
+msgctxt "model:ir.ui.menu,name:menu_sale_configuration"
+msgid "Sales Configuration"
+msgstr "Configuración de Ventas"
+
+msgctxt "model:ir.ui.menu,name:menu_sale_form"
+msgid "Sales"
+msgstr "Ventas"
+
+msgctxt "model:ir.ui.menu,name:menu_sale_form_confirmed"
+msgid "Confirmed Sales"
+msgstr "Ventas confirmadas"
+
+msgctxt "model:ir.ui.menu,name:menu_sale_form_draft"
+msgid "Draft Sales"
+msgstr "Ventas en borrador"
+
+msgctxt "model:ir.ui.menu,name:menu_sale_form_processing"
+msgid "Processing Sales"
+msgstr "Ventas en proceso"
+
+msgctxt "model:ir.ui.menu,name:menu_sale_form_quotation"
+msgid "Quotation Sales"
+msgstr "Ventas presupuestadas"
+
+msgctxt "model:res.group,name:group_sale"
+msgid "Sales"
+msgstr "Venta"
+
+msgctxt "model:res.group,name:group_sale_admin"
+msgid "Sales Administrator"
+msgstr "Administrador de Ventas"
+
+msgctxt "model:sale.configuration,name:"
+msgid "Sale Configuration"
+msgstr "Configuración de Venta"
+
+msgctxt "model:sale.handle.invoice.exception.ask,name:"
+msgid "Handle Invoice Exception"
+msgstr "Factura de excepción - Petición"
+
+msgctxt "model:sale.handle.shipment.exception.ask,name:"
+msgid "Handle Shipment Exception"
+msgstr "Envio de excepción - Petición"
+
+msgctxt "model:sale.line,name:"
+msgid "Sale Line"
+msgstr "Línea de venta"
+
+msgctxt "model:sale.line-account.invoice.line,name:"
+msgid "Sale Line - Invoice Line"
+msgstr "Línea de venta - Línea de factura"
+
+msgctxt "model:sale.line-account.tax,name:"
+msgid "Sale Line - Tax"
+msgstr "Línea de venta - Impuesto"
+
+msgctxt "model:sale.line-ignored-stock.move,name:"
+msgid "Sale Line - Ignored Move"
+msgstr "Línea de venta - Movimiento ignorado"
+
+msgctxt "model:sale.line-recreated-stock.move,name:"
+msgid "Sale Line - Recreated Move"
+msgstr "Línea de venta - Movimiento recreado"
+
+msgctxt "model:sale.sale,name:"
+msgid "Sale"
+msgstr "Venta"
+
+msgctxt "model:sale.sale-account.invoice,name:"
+msgid "Sale - Invoice"
+msgstr "Venta - Factura"
+
+msgctxt "model:sale.sale-ignored-account.invoice,name:"
+msgid "Sale - Ignored Invoice"
+msgstr "Venta - Factura ignorada"
+
+msgctxt "model:sale.sale-recreated-account.invoice,name:"
+msgid "Sale - Recreated Invoice"
+msgstr "Venta - Factura recreada"
+
+msgctxt "odt:sale.sale:"
+msgid "Amount"
+msgstr "Cantidad"
+
+msgctxt "odt:sale.sale:"
+msgid "Date:"
+msgstr "Fecha:"
+
+msgctxt "odt:sale.sale:"
+msgid "Description"
+msgstr "Descripción"
+
+msgctxt "odt:sale.sale:"
+msgid "Description:"
+msgstr "Descripción:"
+
+msgctxt "odt:sale.sale:"
+msgid "Draft Sale Order"
+msgstr "Orden de venta en borrador"
+
+msgctxt "odt:sale.sale:"
+msgid "E-Mail:"
+msgstr "Correo electrónico:"
+
+msgctxt "odt:sale.sale:"
+msgid "Phone:"
+msgstr "Teléfono:"
+
+msgctxt "odt:sale.sale:"
+msgid "Quantity"
+msgstr "Cantidad"
+
+msgctxt "odt:sale.sale:"
+msgid "Quotation N°:"
+msgstr "Presupuesto Nº:"
+
+msgctxt "odt:sale.sale:"
+msgid "Sale Order N°:"
+msgstr "Orden de venta Nº:"
+
+msgctxt "odt:sale.sale:"
+msgid "Taxes"
+msgstr "Impuestos"
+
+msgctxt "odt:sale.sale:"
+msgid "Taxes:"
+msgstr "Impuestos:"
+
+msgctxt "odt:sale.sale:"
+msgid "Total (excl. taxes):"
+msgstr "Total (sin impuestos):"
+
+msgctxt "odt:sale.sale:"
+msgid "Total:"
+msgstr "Total:"
+
+msgctxt "odt:sale.sale:"
+msgid "Unit Price"
+msgstr "Precio unitario"
+
+msgctxt "odt:sale.sale:"
+msgid "VAT Number:"
+msgstr "CUIT:"
+
+msgctxt "odt:sale.sale:"
+msgid "VAT:"
+msgstr "CUIT:"
+
+msgctxt "selection:account.invoice,sale_exception_state:"
+msgid ""
+msgstr ""
+
+msgctxt "selection:account.invoice,sale_exception_state:"
+msgid "Ignored"
+msgstr "Ignorado"
+
+msgctxt "selection:account.invoice,sale_exception_state:"
+msgid "Recreated"
+msgstr "Rehecho"
+
+msgctxt "selection:sale.configuration,sale_invoice_method:"
+msgid "Manual"
+msgstr "Manual"
+
+msgctxt "selection:sale.configuration,sale_invoice_method:"
+msgid "On Order Processed"
+msgstr "Al procesar la orden"
+
+msgctxt "selection:sale.configuration,sale_invoice_method:"
+msgid "On Shipment Sent"
+msgstr "Al Enviarlo"
+
+msgctxt "selection:sale.configuration,sale_shipment_method:"
+msgid "Manual"
+msgstr "Manual"
+
+msgctxt "selection:sale.configuration,sale_shipment_method:"
+msgid "On Invoice Paid"
+msgstr "Al pagar la factura"
+
+msgctxt "selection:sale.configuration,sale_shipment_method:"
+msgid "On Order Processed"
+msgstr "Al procesar la orden"
+
+msgctxt "selection:sale.line,type:"
+msgid "Comment"
+msgstr "Comentario"
+
+msgctxt "selection:sale.line,type:"
+msgid "Line"
+msgstr "Línea"
+
+msgctxt "selection:sale.line,type:"
+msgid "Subtotal"
+msgstr "Subtotal"
+
+msgctxt "selection:sale.line,type:"
+msgid "Title"
+msgstr "Título"
+
+msgctxt "selection:sale.sale,invoice_method:"
+msgid "Manual"
+msgstr "Manual"
+
+msgctxt "selection:sale.sale,invoice_method:"
+msgid "On Order Processed"
+msgstr "Al procesar la orden"
+
+msgctxt "selection:sale.sale,invoice_method:"
+msgid "On Shipment Sent"
+msgstr "Al Enviarlo"
+
+msgctxt "selection:sale.sale,invoice_state:"
+msgid "Exception"
+msgstr "Excepción"
+
+msgctxt "selection:sale.sale,invoice_state:"
+msgid "None"
+msgstr "Ninguno"
+
+msgctxt "selection:sale.sale,invoice_state:"
+msgid "Paid"
+msgstr "Pagado"
+
+msgctxt "selection:sale.sale,invoice_state:"
+msgid "Waiting"
+msgstr "En espera"
+
+msgctxt "selection:sale.sale,shipment_method:"
+msgid "Manual"
+msgstr "Manual"
+
+msgctxt "selection:sale.sale,shipment_method:"
+msgid "On Invoice Paid"
+msgstr "Al pagar la factura"
+
+msgctxt "selection:sale.sale,shipment_method:"
+msgid "On Order Processed"
+msgstr "Al procesar la orden"
+
+msgctxt "selection:sale.sale,shipment_state:"
+msgid "Exception"
+msgstr "Excepción"
+
+msgctxt "selection:sale.sale,shipment_state:"
+msgid "None"
+msgstr "Ninguno"
+
+msgctxt "selection:sale.sale,shipment_state:"
+msgid "Sent"
+msgstr "Enviado"
+
+msgctxt "selection:sale.sale,shipment_state:"
+msgid "Waiting"
+msgstr "En espera"
+
+msgctxt "selection:sale.sale,state:"
+msgid "Canceled"
+msgstr "Cancelado"
+
+msgctxt "selection:sale.sale,state:"
+msgid "Confirmed"
+msgstr "Confirmado"
+
+msgctxt "selection:sale.sale,state:"
+msgid "Done"
+msgstr "Terminada"
+
+msgctxt "selection:sale.sale,state:"
+msgid "Draft"
+msgstr "Borrador"
+
+msgctxt "selection:sale.sale,state:"
+msgid "Processing"
+msgstr "Procesamiento"
+
+msgctxt "selection:sale.sale,state:"
+msgid "Quotation"
+msgstr "Presupuesto"
+
+msgctxt "selection:stock.move,sale_exception_state:"
+msgid ""
+msgstr ""
+
+msgctxt "selection:stock.move,sale_exception_state:"
+msgid "Ignored"
+msgstr "Ignorado"
+
+msgctxt "selection:stock.move,sale_exception_state:"
+msgid "Recreated"
+msgstr "Rehacer"
+
+msgctxt "view:product.product:"
+msgid "Customers"
+msgstr "Clientes"
+
+msgctxt "view:product.product:"
+msgid "Products"
+msgstr "Productos"
+
+msgctxt "view:product.template:"
+msgid "Customers"
+msgstr "Clientes"
+
+msgctxt "view:sale.configuration:"
+msgid "Sale Configuration"
+msgstr "Configuración de Venta"
+
+msgctxt "view:sale.handle.invoice.exception.ask:"
+msgid "Choose invoices to recreate"
+msgstr "Escoja una factura a rehacer"
+
+msgctxt "view:sale.handle.invoice.exception.ask:"
+msgid "Handle Invoice Exception"
+msgstr "Excepción de manejo de factura"
+
+msgctxt "view:sale.handle.shipment.exception.ask:"
+msgid "Choose move to recreate"
+msgstr "Escoja un movimiento a rehacer"
+
+msgctxt "view:sale.handle.shipment.exception.ask:"
+msgid "Handle shipment Exception"
+msgstr "Manejar excepción de envio"
+
+msgctxt "view:sale.handle.shipment.exception.ask:"
+msgid "Recreate Moves"
+msgstr "Recrear movimientos"
+
+msgctxt "view:sale.line:"
+msgid "General"
+msgstr "General"
+
+msgctxt "view:sale.line:"
+msgid "Notes"
+msgstr "Notas"
+
+msgctxt "view:sale.line:"
+msgid "Products"
+msgstr "Productos"
+
+msgctxt "view:sale.line:"
+msgid "Sale Line"
+msgstr "Línea de venta"
+
+msgctxt "view:sale.line:"
+msgid "Sale Lines"
+msgstr "Líneas de venta"
+
+msgctxt "view:sale.sale:"
+msgid "Cancel"
+msgstr "Cancelar"
+
+msgctxt "view:sale.sale:"
+msgid "Confirm"
+msgstr "Confirmar"
+
+msgctxt "view:sale.sale:"
+msgid "Draft"
+msgstr "Borrador"
+
+msgctxt "view:sale.sale:"
+msgid "Handle Invoice Exception"
+msgstr "Manejar excepción de factura"
+
+msgctxt "view:sale.sale:"
+msgid "Handle Shipment Exception"
+msgstr "Manejar excepción de envio"
+
+msgctxt "view:sale.sale:"
+msgid "Ignore Invoice Exception"
+msgstr "Ignorar excepción de factura"
+
+msgctxt "view:sale.sale:"
+msgid "Invoices"
+msgstr "Facturas"
+
+msgctxt "view:sale.sale:"
+msgid "Lines"
+msgstr "Líneas"
+
+msgctxt "view:sale.sale:"
+msgid "Moves"
+msgstr "Movimientos"
+
+msgctxt "view:sale.sale:"
+msgid "Other Info"
+msgstr "Información adicional"
+
+msgctxt "view:sale.sale:"
+msgid "Process"
+msgstr "Procesar"
+
+msgctxt "view:sale.sale:"
+msgid "Quotation"
+msgstr "Presupuesto"
+
+msgctxt "view:sale.sale:"
+msgid "Quote"
+msgstr "Presupuestar"
+
+msgctxt "view:sale.sale:"
+msgid "Sale"
+msgstr "Venta"
+
+msgctxt "view:sale.sale:"
+msgid "Sales"
+msgstr "Ventas"
+
+msgctxt "view:sale.sale:"
+msgid "Shipments"
+msgstr "Envios"
+
+msgctxt "view:stock.move:"
+msgid "Moves"
+msgstr "Movimientos"
+
+msgctxt "wizard_button:sale.handle.invoice.exception,ask,end:"
+msgid "Cancel"
+msgstr "Cancelar"
+
+msgctxt "wizard_button:sale.handle.invoice.exception,ask,handle:"
+msgid "Ok"
+msgstr "Aceptar"
+
+msgctxt "wizard_button:sale.handle.shipment.exception,ask,end:"
+msgid "Cancel"
+msgstr "Cancelar"
+
+msgctxt "wizard_button:sale.handle.shipment.exception,ask,handle:"
+msgid "Ok"
+msgstr "Aceptar"
diff --git a/locale/es_CO.po b/locale/es_CO.po
index d040bc3..86029cf 100644
--- a/locale/es_CO.po
+++ b/locale/es_CO.po
@@ -2,409 +2,663 @@
 msgid ""
 msgstr "Content-Type: text/plain; charset=utf-8\n"
 
-msgctxt "error:account.invoice:0"
+msgctxt "error:account.invoice:"
 msgid "You can not delete invoices that come from a sale!"
 msgstr "No puede borrar la factura proveniente de una venta!"
 
-msgctxt "error:account.invoice:0"
+msgctxt "error:account.invoice:"
 msgid "You cannot reset to draft an invoice generated by a sale."
 msgstr "No puede regresar a borrador una factura generada por una venta."
 
-msgctxt "error:sale.line:0"
+msgctxt "error:sale.line:"
 msgid "It misses an \"Account Revenue\" on product \"%s\"!"
 msgstr "Falta un \"cuenta de ingresos\" para el producto \"%s\"!"
 
-msgctxt "error:sale.line:0"
+msgctxt "error:sale.line:"
 msgid "It misses an \"account Revenue\" default property!"
 msgstr "¡Hace falta una propiedad predeterminada de \"cuenta de ganancias\"!"
 
-msgctxt "error:sale.line:0"
+msgctxt "error:sale.line:"
 msgid "The customer location is required!"
 msgstr "Es indispensable el lugar del cliente!"
 
-msgctxt "error:sale.sale:0"
+msgctxt "error:sale.sale:"
 msgid "Invoice and Shipment addresses must be defined for the quotation."
 msgstr "Factura y dirección de Envío debe ser definida por el presupuesto."
 
-msgctxt "error:sale.sale:0"
+msgctxt "error:sale.sale:"
 msgid "It misses an \"Account Receivable\" on the party \"%s\"!"
 msgstr "Falta una \"cuenta de ingresos\" en la partida \"%s\"!"
 
-msgctxt "error:sale.sale:0"
+msgctxt "error:sale.sale:"
+msgid "Sale \"%s\" must be cancelled before deletion!"
+msgstr ""
+
+msgctxt "error:sale.sale:"
+msgid "Warehouse must be defined for the quotation."
+msgstr ""
+
+msgctxt "error:sale.sale:"
 msgid "Wrong combination of method!"
 msgstr "Combinación o método erróneos!"
 
-msgctxt "error:stock.shipment.out:0"
+#, fuzzy
+msgctxt "error:stock.shipment.out.return:"
+msgid "You cannot reset to draft a move generated by a sale."
+msgstr "No puede regresar a borrador un movimiento generado por una venta."
+
+msgctxt "error:stock.shipment.out:"
 msgid "You cannot reset to draft a move generated by a sale."
 msgstr "No puede regresar a borrador un movimiento generado por una venta."
 
-msgctxt "field:account.invoice,sale_exception_state:0"
+msgctxt "field:account.invoice,sale_exception_state:"
 msgid "Exception State"
 msgstr "Estado de Excepción"
 
 #, fuzzy
-msgctxt "field:account.invoice,sales:0"
+msgctxt "field:account.invoice,sales:"
 msgid "Sales"
 msgstr "Ventas"
 
 #, fuzzy
-msgctxt "field:account.invoice.line,sale_lines:0"
+msgctxt "field:account.invoice.line,sale_lines:"
 msgid "Sale Lines"
 msgstr "Líneas de Venta"
 
 #, fuzzy
-msgctxt "field:product.template,delivery_time:0"
+msgctxt "field:product.template,delivery_time:"
 msgid "Delivery Time"
 msgstr "Tiempo de Envío"
 
-msgctxt "field:product.template,salable:0"
+msgctxt "field:product.template,salable:"
 msgid "Salable"
 msgstr "De fácil venta"
 
-msgctxt "field:product.template,sale_uom:0"
+msgctxt "field:product.template,sale_uom:"
 msgid "Sale UOM"
 msgstr "UdM de Venta"
 
+msgctxt "field:sale.configuration,create_date:"
+msgid "Create Date"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:sale.configuration,create_uid:"
+msgid "Create User"
+msgstr "Crear usuario"
+
+msgctxt "field:sale.configuration,id:"
+msgid "ID"
+msgstr ""
+
 #, fuzzy
-msgctxt "field:sale.configuration,rec_name:0"
+msgctxt "field:sale.configuration,rec_name:"
 msgid "Name"
 msgstr "Nombre de Contacto"
 
-msgctxt "field:sale.configuration,sale_invoice_method:0"
+msgctxt "field:sale.configuration,sale_invoice_method:"
 msgid "Sale Invoice Method"
 msgstr ""
 
-msgctxt "field:sale.configuration,sale_sequence:0"
+msgctxt "field:sale.configuration,sale_sequence:"
 msgid "Sale Reference Sequence"
 msgstr ""
 
-msgctxt "field:sale.configuration,sale_shipment_method:0"
+msgctxt "field:sale.configuration,sale_shipment_method:"
 msgid "Sale Shipment Method"
 msgstr ""
 
-msgctxt "field:sale.handle.invoice.exception.ask,domain_invoices:0"
+msgctxt "field:sale.configuration,write_date:"
+msgid "Write Date"
+msgstr ""
+
+msgctxt "field:sale.configuration,write_uid:"
+msgid "Write User"
+msgstr ""
+
+msgctxt "field:sale.handle.invoice.exception.ask,domain_invoices:"
 msgid "Domain Invoices"
 msgstr "Rango de facturas"
 
-msgctxt "field:sale.handle.invoice.exception.ask,recreate_invoices:0"
+msgctxt "field:sale.handle.invoice.exception.ask,id:"
+msgid "ID"
+msgstr ""
+
+msgctxt "field:sale.handle.invoice.exception.ask,recreate_invoices:"
 msgid "Recreate Invoices"
 msgstr "Rehacer factura"
 
-msgctxt "field:sale.handle.shipment.exception.ask,domain_moves:0"
+msgctxt "field:sale.handle.shipment.exception.ask,domain_moves:"
 msgid "Domain Moves"
 msgstr "Rango de movimientos"
 
-msgctxt "field:sale.handle.shipment.exception.ask,recreate_moves:0"
+msgctxt "field:sale.handle.shipment.exception.ask,id:"
+msgid "ID"
+msgstr ""
+
+msgctxt "field:sale.handle.shipment.exception.ask,recreate_moves:"
 msgid "Recreate Moves"
 msgstr "Rehacer movimientos"
 
-msgctxt "field:sale.line,amount:0"
+msgctxt "field:sale.line,amount:"
 msgid "Amount"
 msgstr "Cantidad"
 
-msgctxt "field:sale.line,description:0"
+msgctxt "field:sale.line,create_date:"
+msgid "Create Date"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:sale.line,create_uid:"
+msgid "Create User"
+msgstr "Crear usuario"
+
+msgctxt "field:sale.line,delivery_date:"
+msgid "Delivery Date"
+msgstr ""
+
+msgctxt "field:sale.line,description:"
 msgid "Description"
 msgstr "Descripción"
 
-msgctxt "field:sale.line,invoice_lines:0"
+#, fuzzy
+msgctxt "field:sale.line,from_location:"
+msgid "From Location"
+msgstr "Lugar Inicial"
+
+msgctxt "field:sale.line,id:"
+msgid "ID"
+msgstr ""
+
+msgctxt "field:sale.line,invoice_lines:"
 msgid "Invoice Lines"
 msgstr "Líneas de Factura"
 
-msgctxt "field:sale.line,move_done:0"
+msgctxt "field:sale.line,move_done:"
 msgid "Moves Done"
 msgstr "Movimientos Hechos"
 
-msgctxt "field:sale.line,move_exception:0"
+msgctxt "field:sale.line,move_exception:"
 msgid "Moves Exception"
 msgstr "Exepción de Movimientos"
 
-msgctxt "field:sale.line,moves:0"
+msgctxt "field:sale.line,moves:"
 msgid "Moves"
 msgstr "Movimientos"
 
-msgctxt "field:sale.line,moves_ignored:0"
+msgctxt "field:sale.line,moves_ignored:"
 msgid "Ignored Moves"
 msgstr "Movimientos Ignorados"
 
-msgctxt "field:sale.line,moves_recreated:0"
+msgctxt "field:sale.line,moves_recreated:"
 msgid "Recreated Moves"
 msgstr "Rehacer Movimientos"
 
-msgctxt "field:sale.line,note:0"
+msgctxt "field:sale.line,note:"
 msgid "Note"
 msgstr "Nota"
 
-msgctxt "field:sale.line,product:0"
+msgctxt "field:sale.line,product:"
 msgid "Product"
 msgstr "Producto"
 
-msgctxt "field:sale.line,quantity:0"
+msgctxt "field:sale.line,product_uom_category:"
+msgid "Product Uom Category"
+msgstr ""
+
+msgctxt "field:sale.line,quantity:"
 msgid "Quantity"
 msgstr "Cantidad"
 
-msgctxt "field:sale.line,rec_name:0"
+msgctxt "field:sale.line,rec_name:"
 msgid "Name"
 msgstr "Nombre"
 
-msgctxt "field:sale.line,sale:0"
+msgctxt "field:sale.line,sale:"
 msgid "Sale"
 msgstr "Venta"
 
-msgctxt "field:sale.line,sequence:0"
+msgctxt "field:sale.line,sequence:"
 msgid "Sequence"
 msgstr "Secuencia"
 
-msgctxt "field:sale.line,taxes:0"
+msgctxt "field:sale.line,taxes:"
 msgid "Taxes"
 msgstr "Impuestos"
 
-msgctxt "field:sale.line,type:0"
+#, fuzzy
+msgctxt "field:sale.line,to_location:"
+msgid "To Location"
+msgstr "Al Lugar:"
+
+msgctxt "field:sale.line,type:"
 msgid "Type"
 msgstr "Tipo"
 
-msgctxt "field:sale.line,unit:0"
+msgctxt "field:sale.line,unit:"
 msgid "Unit"
 msgstr "Unidad"
 
-msgctxt "field:sale.line,unit_digits:0"
+msgctxt "field:sale.line,unit_digits:"
 msgid "Unit Digits"
 msgstr "Dígitos de Unidad"
 
-msgctxt "field:sale.line,unit_price:0"
+msgctxt "field:sale.line,unit_price:"
 msgid "Unit Price"
 msgstr "Precio Unitario"
 
-msgctxt "field:sale.line-account.invoice.line,invoice_line:0"
+#, fuzzy
+msgctxt "field:sale.line,warehouse:"
+msgid "Warehouse"
+msgstr "Depósito"
+
+msgctxt "field:sale.line,write_date:"
+msgid "Write Date"
+msgstr ""
+
+msgctxt "field:sale.line,write_uid:"
+msgid "Write User"
+msgstr ""
+
+msgctxt "field:sale.line-account.invoice.line,create_date:"
+msgid "Create Date"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:sale.line-account.invoice.line,create_uid:"
+msgid "Create User"
+msgstr "Crear usuario"
+
+msgctxt "field:sale.line-account.invoice.line,id:"
+msgid "ID"
+msgstr ""
+
+msgctxt "field:sale.line-account.invoice.line,invoice_line:"
 msgid "Invoice Line"
 msgstr "Línea de Factura"
 
-msgctxt "field:sale.line-account.invoice.line,rec_name:0"
+msgctxt "field:sale.line-account.invoice.line,rec_name:"
 msgid "Name"
 msgstr "Nombre"
 
-msgctxt "field:sale.line-account.invoice.line,sale_line:0"
+msgctxt "field:sale.line-account.invoice.line,sale_line:"
 msgid "Sale Line"
 msgstr "Línea de Venta"
 
-msgctxt "field:sale.line-account.tax,line:0"
+msgctxt "field:sale.line-account.invoice.line,write_date:"
+msgid "Write Date"
+msgstr ""
+
+msgctxt "field:sale.line-account.invoice.line,write_uid:"
+msgid "Write User"
+msgstr ""
+
+msgctxt "field:sale.line-account.tax,create_date:"
+msgid "Create Date"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:sale.line-account.tax,create_uid:"
+msgid "Create User"
+msgstr "Crear usuario"
+
+msgctxt "field:sale.line-account.tax,id:"
+msgid "ID"
+msgstr ""
+
+msgctxt "field:sale.line-account.tax,line:"
 msgid "Sale Line"
 msgstr "Línea de Venta"
 
-msgctxt "field:sale.line-account.tax,rec_name:0"
+msgctxt "field:sale.line-account.tax,rec_name:"
 msgid "Name"
 msgstr "Nombre"
 
-msgctxt "field:sale.line-account.tax,tax:0"
+msgctxt "field:sale.line-account.tax,tax:"
 msgid "Tax"
 msgstr "Impuesto"
 
-msgctxt "field:sale.line-ignored-stock.move,move:0"
+msgctxt "field:sale.line-account.tax,write_date:"
+msgid "Write Date"
+msgstr ""
+
+msgctxt "field:sale.line-account.tax,write_uid:"
+msgid "Write User"
+msgstr ""
+
+msgctxt "field:sale.line-ignored-stock.move,create_date:"
+msgid "Create Date"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:sale.line-ignored-stock.move,create_uid:"
+msgid "Create User"
+msgstr "Crear usuario"
+
+msgctxt "field:sale.line-ignored-stock.move,id:"
+msgid "ID"
+msgstr ""
+
+msgctxt "field:sale.line-ignored-stock.move,move:"
 msgid "Move"
 msgstr "Movimiento"
 
-msgctxt "field:sale.line-ignored-stock.move,rec_name:0"
+msgctxt "field:sale.line-ignored-stock.move,rec_name:"
 msgid "Name"
 msgstr "Nombre"
 
-msgctxt "field:sale.line-ignored-stock.move,sale_line:0"
+msgctxt "field:sale.line-ignored-stock.move,sale_line:"
 msgid "Sale Line"
 msgstr "Línea de Venta"
 
-msgctxt "field:sale.line-recreated-stock.move,move:0"
+msgctxt "field:sale.line-ignored-stock.move,write_date:"
+msgid "Write Date"
+msgstr ""
+
+msgctxt "field:sale.line-ignored-stock.move,write_uid:"
+msgid "Write User"
+msgstr ""
+
+msgctxt "field:sale.line-recreated-stock.move,create_date:"
+msgid "Create Date"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:sale.line-recreated-stock.move,create_uid:"
+msgid "Create User"
+msgstr "Crear usuario"
+
+msgctxt "field:sale.line-recreated-stock.move,id:"
+msgid "ID"
+msgstr ""
+
+msgctxt "field:sale.line-recreated-stock.move,move:"
 msgid "Move"
 msgstr "Movimiento"
 
-msgctxt "field:sale.line-recreated-stock.move,rec_name:0"
+msgctxt "field:sale.line-recreated-stock.move,rec_name:"
 msgid "Name"
 msgstr "Nombre"
 
-msgctxt "field:sale.line-recreated-stock.move,sale_line:0"
+msgctxt "field:sale.line-recreated-stock.move,sale_line:"
 msgid "Sale Line"
 msgstr "Línea de Venta"
 
-msgctxt "field:sale.sale,comment:0"
+msgctxt "field:sale.line-recreated-stock.move,write_date:"
+msgid "Write Date"
+msgstr ""
+
+msgctxt "field:sale.line-recreated-stock.move,write_uid:"
+msgid "Write User"
+msgstr ""
+
+msgctxt "field:sale.sale,comment:"
 msgid "Comment"
 msgstr "Comentario"
 
-msgctxt "field:sale.sale,company:0"
+msgctxt "field:sale.sale,company:"
 msgid "Company"
 msgstr "Compañía"
 
-msgctxt "field:sale.sale,currency:0"
+msgctxt "field:sale.sale,create_date:"
+msgid "Create Date"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:sale.sale,create_uid:"
+msgid "Create User"
+msgstr "Crear usuario"
+
+msgctxt "field:sale.sale,currency:"
 msgid "Currency"
 msgstr "Moneda"
 
-msgctxt "field:sale.sale,currency_digits:0"
+msgctxt "field:sale.sale,currency_digits:"
 msgid "Currency Digits"
 msgstr "Dígitos de Moneda"
 
-msgctxt "field:sale.sale,description:0"
+msgctxt "field:sale.sale,description:"
 msgid "Description"
 msgstr "Descripción"
 
-msgctxt "field:sale.sale,invoice_address:0"
+msgctxt "field:sale.sale,id:"
+msgid "ID"
+msgstr ""
+
+msgctxt "field:sale.sale,invoice_address:"
 msgid "Invoice Address"
 msgstr "Dirección de Facturación"
 
-msgctxt "field:sale.sale,invoice_exception:0"
-msgid "Invoices Exception"
-msgstr "Excepción de Facturación"
-
-msgctxt "field:sale.sale,invoice_method:0"
+msgctxt "field:sale.sale,invoice_method:"
 msgid "Invoice Method"
 msgstr "Método de Facturación"
 
-msgctxt "field:sale.sale,invoice_paid:0"
-msgid "Invoices Paid"
-msgstr "Facturas Pagadas"
-
-msgctxt "field:sale.sale,invoice_state:0"
+msgctxt "field:sale.sale,invoice_state:"
 msgid "Invoice State"
 msgstr "Estado de Factura"
 
-msgctxt "field:sale.sale,invoices:0"
+msgctxt "field:sale.sale,invoices:"
 msgid "Invoices"
 msgstr "Facturas"
 
-msgctxt "field:sale.sale,invoices_ignored:0"
+msgctxt "field:sale.sale,invoices_ignored:"
 msgid "Ignored Invoices"
 msgstr "Facturas Ignoradas"
 
-msgctxt "field:sale.sale,invoices_recreated:0"
+msgctxt "field:sale.sale,invoices_recreated:"
 msgid "Recreated Invoices"
 msgstr "Rehacer facturas"
 
-msgctxt "field:sale.sale,lines:0"
+msgctxt "field:sale.sale,lines:"
 msgid "Lines"
 msgstr "Líneas"
 
-msgctxt "field:sale.sale,moves:0"
+msgctxt "field:sale.sale,moves:"
 msgid "Moves"
 msgstr "Movimientos"
 
-msgctxt "field:sale.sale,party:0"
+msgctxt "field:sale.sale,party:"
 msgid "Party"
 msgstr "Tercero"
 
-msgctxt "field:sale.sale,party_lang:0"
+msgctxt "field:sale.sale,party_lang:"
 msgid "Party Language"
 msgstr "Idioma del Tercero"
 
-msgctxt "field:sale.sale,payment_term:0"
+msgctxt "field:sale.sale,payment_term:"
 msgid "Payment Term"
 msgstr "Término de Pago"
 
-msgctxt "field:sale.sale,rec_name:0"
+msgctxt "field:sale.sale,rec_name:"
 msgid "Name"
 msgstr "Nombre"
 
-msgctxt "field:sale.sale,reference:0"
+msgctxt "field:sale.sale,reference:"
 msgid "Reference"
 msgstr "Referencia"
 
-msgctxt "field:sale.sale,sale_date:0"
+msgctxt "field:sale.sale,sale_date:"
 msgid "Sale Date"
 msgstr "Fecha de Venta"
 
-msgctxt "field:sale.sale,shipment_address:0"
+msgctxt "field:sale.sale,shipment_address:"
 msgid "Shipment Address"
 msgstr "Dirección de envío"
 
-msgctxt "field:sale.sale,shipment_done:0"
-msgid "Shipment Done"
-msgstr "Envío Finalizado"
-
-msgctxt "field:sale.sale,shipment_exception:0"
-msgid "Shipments Exception"
-msgstr "Excepción de Envíos"
-
-msgctxt "field:sale.sale,shipment_method:0"
+msgctxt "field:sale.sale,shipment_method:"
 msgid "Shipment Method"
 msgstr "Método de Envío"
 
-msgctxt "field:sale.sale,shipment_state:0"
+msgctxt "field:sale.sale,shipment_returns:"
+msgid "Shipment Returns"
+msgstr ""
+
+msgctxt "field:sale.sale,shipment_state:"
 msgid "Shipment State"
 msgstr "Estado de Envío"
 
-msgctxt "field:sale.sale,shipments:0"
+msgctxt "field:sale.sale,shipments:"
 msgid "Shipments"
 msgstr "Envíos"
 
-msgctxt "field:sale.sale,state:0"
+msgctxt "field:sale.sale,state:"
 msgid "State"
 msgstr "Estado"
 
-msgctxt "field:sale.sale,tax_amount:0"
+msgctxt "field:sale.sale,tax_amount:"
 msgid "Tax"
 msgstr "Impuesto"
 
-msgctxt "field:sale.sale,total_amount:0"
+msgctxt "field:sale.sale,tax_amount_cache:"
+msgid "Tax Cache"
+msgstr ""
+
+msgctxt "field:sale.sale,total_amount:"
 msgid "Total"
 msgstr "Total"
 
-msgctxt "field:sale.sale,untaxed_amount:0"
+msgctxt "field:sale.sale,total_amount_cache:"
+msgid "Total Tax"
+msgstr ""
+
+msgctxt "field:sale.sale,untaxed_amount:"
 msgid "Untaxed"
 msgstr "Sin Impuesto"
 
-msgctxt "field:sale.sale,warehouse:0"
+msgctxt "field:sale.sale,untaxed_amount_cache:"
+msgid "Untaxed Cache"
+msgstr ""
+
+msgctxt "field:sale.sale,warehouse:"
 msgid "Warehouse"
 msgstr "Depósito"
 
-msgctxt "field:sale.sale-account.invoice,invoice:0"
+msgctxt "field:sale.sale,write_date:"
+msgid "Write Date"
+msgstr ""
+
+msgctxt "field:sale.sale,write_uid:"
+msgid "Write User"
+msgstr ""
+
+msgctxt "field:sale.sale-account.invoice,create_date:"
+msgid "Create Date"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:sale.sale-account.invoice,create_uid:"
+msgid "Create User"
+msgstr "Crear usuario"
+
+msgctxt "field:sale.sale-account.invoice,id:"
+msgid "ID"
+msgstr ""
+
+msgctxt "field:sale.sale-account.invoice,invoice:"
 msgid "Invoice"
 msgstr "Factura"
 
-msgctxt "field:sale.sale-account.invoice,rec_name:0"
+msgctxt "field:sale.sale-account.invoice,rec_name:"
 msgid "Name"
 msgstr "Nombre"
 
-msgctxt "field:sale.sale-account.invoice,sale:0"
+msgctxt "field:sale.sale-account.invoice,sale:"
 msgid "Sale"
 msgstr "Ventas"
 
-msgctxt "field:sale.sale-ignored-account.invoice,invoice:0"
+msgctxt "field:sale.sale-account.invoice,write_date:"
+msgid "Write Date"
+msgstr ""
+
+msgctxt "field:sale.sale-account.invoice,write_uid:"
+msgid "Write User"
+msgstr ""
+
+msgctxt "field:sale.sale-ignored-account.invoice,create_date:"
+msgid "Create Date"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:sale.sale-ignored-account.invoice,create_uid:"
+msgid "Create User"
+msgstr "Crear usuario"
+
+msgctxt "field:sale.sale-ignored-account.invoice,id:"
+msgid "ID"
+msgstr ""
+
+msgctxt "field:sale.sale-ignored-account.invoice,invoice:"
 msgid "Invoice"
 msgstr "Factura"
 
-msgctxt "field:sale.sale-ignored-account.invoice,rec_name:0"
+msgctxt "field:sale.sale-ignored-account.invoice,rec_name:"
 msgid "Name"
 msgstr "Nombre"
 
-msgctxt "field:sale.sale-ignored-account.invoice,sale:0"
+msgctxt "field:sale.sale-ignored-account.invoice,sale:"
 msgid "Sale"
 msgstr "Ventas"
 
-msgctxt "field:sale.sale-recreated-account.invoice,invoice:0"
+msgctxt "field:sale.sale-ignored-account.invoice,write_date:"
+msgid "Write Date"
+msgstr ""
+
+msgctxt "field:sale.sale-ignored-account.invoice,write_uid:"
+msgid "Write User"
+msgstr ""
+
+msgctxt "field:sale.sale-recreated-account.invoice,create_date:"
+msgid "Create Date"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:sale.sale-recreated-account.invoice,create_uid:"
+msgid "Create User"
+msgstr "Crear usuario"
+
+msgctxt "field:sale.sale-recreated-account.invoice,id:"
+msgid "ID"
+msgstr ""
+
+msgctxt "field:sale.sale-recreated-account.invoice,invoice:"
 msgid "Invoice"
 msgstr "Factura"
 
-msgctxt "field:sale.sale-recreated-account.invoice,rec_name:0"
+msgctxt "field:sale.sale-recreated-account.invoice,rec_name:"
 msgid "Name"
 msgstr "Nombre"
 
-msgctxt "field:sale.sale-recreated-account.invoice,sale:0"
+msgctxt "field:sale.sale-recreated-account.invoice,sale:"
 msgid "Sale"
 msgstr "Ventas"
 
-msgctxt "field:stock.move,sale:0"
+msgctxt "field:sale.sale-recreated-account.invoice,write_date:"
+msgid "Write Date"
+msgstr ""
+
+msgctxt "field:sale.sale-recreated-account.invoice,write_uid:"
+msgid "Write User"
+msgstr ""
+
+msgctxt "field:stock.move,sale:"
 msgid "Sale"
 msgstr "Venta"
 
-msgctxt "field:stock.move,sale_exception_state:0"
+msgctxt "field:stock.move,sale_exception_state:"
 msgid "Exception State"
 msgstr "Estado Excepción"
 
 #, fuzzy
-msgctxt "field:stock.move,sale_line:0"
+msgctxt "field:stock.move,sale_line:"
 msgid "Sale Line"
 msgstr "Línea de Venta"
 
 #, fuzzy
-msgctxt "help:product.template,delivery_time:0"
+msgctxt "help:product.template,delivery_time:"
 msgid "In number of days"
 msgstr "En número de días"
 
-msgctxt "help:sale.handle.invoice.exception.ask,recreate_invoices:0"
+msgctxt "help:sale.handle.invoice.exception.ask,recreate_invoices:"
 msgid ""
 "The selected invoices will be recreated. The other ones will be ignored."
 msgstr "La factura seleccionada será recreada. Las otras serán ignoradas."
@@ -417,6 +671,10 @@ msgctxt "model:ir.action,name:act_open_customer"
 msgid "Parties associated to Sales"
 msgstr "Terceros asociados a Ventas"
 
+msgctxt "model:ir.action,name:act_return_form"
+msgid "Returns"
+msgstr ""
+
 msgctxt "model:ir.action,name:act_sale_configuration_form"
 msgid "Sales Configuration"
 msgstr ""
@@ -437,6 +695,10 @@ msgctxt "model:ir.action,name:act_sale_form_draft"
 msgid "Draft Sales"
 msgstr "Ventas en Borrador"
 
+msgctxt "model:ir.action,name:act_sale_form_processing"
+msgid "Processing Sales"
+msgstr ""
+
 msgctxt "model:ir.action,name:act_sale_form_quotation"
 msgid "Quotation Sales"
 msgstr "Ventas Cotizadas"
@@ -453,6 +715,10 @@ msgctxt "model:ir.action,name:wizard_invoice_handle_exception"
 msgid "Handle Invoice Exception"
 msgstr "Tratar Excepción de factura"
 
+msgctxt "model:ir.action,name:wizard_return_sale"
+msgid "Create Return Sale"
+msgstr ""
+
 msgctxt "model:ir.action,name:wizard_shipment_handle_exception"
 msgid "Handle Shipment Exception"
 msgstr "Tratar Excepción de Envío"
@@ -495,6 +761,10 @@ msgctxt "model:ir.ui.menu,name:menu_sale_form_draft"
 msgid "Draft Sales"
 msgstr "Ventas en Borrador"
 
+msgctxt "model:ir.ui.menu,name:menu_sale_form_processing"
+msgid "Processing Sales"
+msgstr ""
+
 msgctxt "model:ir.ui.menu,name:menu_sale_form_quotation"
 msgid "Quotation Sales"
 msgstr "Ventas Cotizadas"
@@ -508,504 +778,415 @@ msgctxt "model:res.group,name:group_sale_admin"
 msgid "Sales Administrator"
 msgstr ""
 
-msgctxt "model:sale.configuration,name:0"
+msgctxt "model:sale.configuration,name:"
 msgid "Sale Configuration"
 msgstr ""
 
-msgctxt "model:sale.handle.invoice.exception.ask,name:0"
-msgid "Invoice Exception Ask"
+#, fuzzy
+msgctxt "model:sale.handle.invoice.exception.ask,name:"
+msgid "Handle Invoice Exception"
 msgstr "Pregunta de Excepción de Factura"
 
-msgctxt "model:sale.handle.shipment.exception.ask,name:0"
-msgid "Shipment Exception Ask"
+#, fuzzy
+msgctxt "model:sale.handle.shipment.exception.ask,name:"
+msgid "Handle Shipment Exception"
 msgstr "Pregunta de Excepción de Envío"
 
-msgctxt "model:sale.line,name:0"
+msgctxt "model:sale.line,name:"
 msgid "Sale Line"
 msgstr "Línea de Venta"
 
-msgctxt "model:sale.line-account.invoice.line,name:0"
+msgctxt "model:sale.line-account.invoice.line,name:"
 msgid "Sale Line - Invoice Line"
 msgstr "Línea de Venta - Línea de Factura"
 
-msgctxt "model:sale.line-account.tax,name:0"
+msgctxt "model:sale.line-account.tax,name:"
 msgid "Sale Line - Tax"
 msgstr "Línea de Venta - Impuesto"
 
-msgctxt "model:sale.line-ignored-stock.move,name:0"
+msgctxt "model:sale.line-ignored-stock.move,name:"
 msgid "Sale Line - Ignored Move"
 msgstr "Línea de Venta - Movimiento Ignorado"
 
-msgctxt "model:sale.line-recreated-stock.move,name:0"
+msgctxt "model:sale.line-recreated-stock.move,name:"
 msgid "Sale Line - Recreated Move"
 msgstr "Línea de Venta - Movimiento Recreado"
 
-msgctxt "model:sale.sale,name:0"
+msgctxt "model:sale.sale,name:"
 msgid "Sale"
 msgstr "Ventas"
 
-msgctxt "model:sale.sale-account.invoice,name:0"
+msgctxt "model:sale.sale-account.invoice,name:"
 msgid "Sale - Invoice"
 msgstr "Venta - Factura"
 
-msgctxt "model:sale.sale-ignored-account.invoice,name:0"
+msgctxt "model:sale.sale-ignored-account.invoice,name:"
 msgid "Sale - Ignored Invoice"
 msgstr "Venta - Factura Ignorada"
 
-msgctxt "model:sale.sale-recreated-account.invoice,name:0"
+msgctxt "model:sale.sale-recreated-account.invoice,name:"
 msgid "Sale - Recreated Invoice"
 msgstr "Venta - Factura Recreada"
 
-msgctxt "model:workflow,name:sale_workflow"
-msgid "Sale workflow"
-msgstr "Flujo de Trabajo de Ventas"
-
-msgctxt "model:workflow.activity,name:sale_activity_cancel"
-msgid "Canceled"
-msgstr "Cancelado"
-
-msgctxt "model:workflow.activity,name:sale_activity_confirmed"
-msgid "Confirmed"
-msgstr "Confirmado"
-
-msgctxt "model:workflow.activity,name:sale_activity_done"
-msgid "Done"
-msgstr "Hecho"
-
-msgctxt "model:workflow.activity,name:sale_activity_draft"
-msgid "Draft"
-msgstr "Borrador"
-
-msgctxt "model:workflow.activity,name:sale_activity_invoice_method"
-msgid "Invoice Method"
-msgstr "Método de Facturación"
-
-msgctxt "model:workflow.activity,name:sale_activity_invoice_method_done"
-msgid "Invoice Method Done"
-msgstr "Método de Factura Concluido"
-
-msgctxt "model:workflow.activity,name:sale_activity_invoice_sale_done"
-msgid "Invoice Done"
-msgstr "Factura Hecha"
-
-msgctxt "model:workflow.activity,name:sale_activity_invoice_sale_exception"
-msgid "Invoice Exception"
-msgstr "Excepción de Factura"
-
-msgctxt "model:workflow.activity,name:sale_activity_invoice_shipment"
-msgid "Invoice Shipment"
-msgstr "Envío de Factura"
-
-msgctxt "model:workflow.activity,name:sale_activity_invoice_shipment_done"
-msgid "Invoice Shipment Done"
-msgstr "Envío de Factura Concluido"
-
-msgctxt ""
-"model:workflow.activity,name:sale_activity_invoice_shipment_exception"
-msgid "Invoice Shipment Exception"
-msgstr "Excepción de Envío de Factura"
-
-msgctxt "model:workflow.activity,name:sale_activity_invoice_shipment_method"
-msgid "Invoice Shipment Method"
-msgstr "Método de Envío de Factura"
-
-msgctxt ""
-"model:workflow.activity,name:sale_activity_invoice_shipment_method_done"
-msgid "Invoice Shipment Method Done"
-msgstr "Método de Envío de Factura Concluido"
-
-msgctxt "model:workflow.activity,name:sale_activity_quotation"
-msgid "Quotation"
-msgstr "Cotización"
-
-msgctxt "model:workflow.activity,name:sale_activity_shipment"
-msgid "Shipment"
-msgstr "Envío"
-
-msgctxt "model:workflow.activity,name:sale_activity_shipment_exception"
-msgid "Shipment Exception"
-msgstr "Excepción de Envío"
-
-msgctxt "model:workflow.activity,name:sale_activity_shipment_invoice"
-msgid "Shipment Invoice"
-msgstr "Envío de Factura"
-
-msgctxt "model:workflow.activity,name:sale_activity_shipment_invoice_done"
-msgid "Shipment Invoice Done"
-msgstr "Envío de Factura Concluido"
-
-msgctxt ""
-"model:workflow.activity,name:sale_activity_shipment_invoice_exception"
-msgid "Shipment Invoice Exception"
-msgstr "Excepción de Envío de Factura"
-
-msgctxt "model:workflow.activity,name:sale_activity_shipment_invoice_method"
-msgid "Shipment Invoice Method"
-msgstr "Método Envío de Factura"
-
-msgctxt ""
-"model:workflow.activity,name:sale_activity_shipment_invoice_method_done"
-msgid "Shipment Invoice Method Done"
-msgstr "Método de Envío de Factura Concluido"
-
-msgctxt "model:workflow.activity,name:sale_activity_shipment_method"
-msgid "Shipment Method"
-msgstr "Método de Envío"
-
-msgctxt "model:workflow.activity,name:sale_activity_shipment_method_done"
-msgid "Shipment Method Done"
-msgstr "Método de Envío Concluido"
-
-msgctxt "model:workflow.activity,name:sale_activity_waiting_invoice_sale"
-msgid "Waiting Invoice"
-msgstr "Esperando Factura"
-
-msgctxt "model:workflow.activity,name:sale_activity_waiting_invoice_shipment"
-msgid "Waiting Invoice Shipment"
-msgstr "Esperando Envío de Factura"
-
-msgctxt "model:workflow.activity,name:sale_activity_waiting_shipment"
-msgid "Waiting Shipment"
-msgstr "Esperando Envío"
-
-msgctxt "model:workflow.activity,name:sale_activity_waiting_shipment_invoice"
-msgid "Waiting Shipment Invoice"
-msgstr "Esperando Envío de Factura"
-
-msgctxt "odt:sale.sale:0"
+msgctxt "odt:sale.sale:"
 msgid "Amount"
 msgstr "Cantidad"
 
-msgctxt "odt:sale.sale:0"
+msgctxt "odt:sale.sale:"
 msgid "Date:"
 msgstr "Fecha:"
 
-msgctxt "odt:sale.sale:0"
+msgctxt "odt:sale.sale:"
 msgid "Description"
 msgstr "Descripción"
 
-msgctxt "odt:sale.sale:0"
+msgctxt "odt:sale.sale:"
 msgid "Description:"
 msgstr "Descripción:"
 
-msgctxt "odt:sale.sale:0"
+msgctxt "odt:sale.sale:"
 msgid "Draft Sale Order"
 msgstr "Orden de Venta en Borrador"
 
-msgctxt "odt:sale.sale:0"
+msgctxt "odt:sale.sale:"
 msgid "E-Mail:"
 msgstr "Correo electrónico:"
 
-msgctxt "odt:sale.sale:0"
+msgctxt "odt:sale.sale:"
 msgid "Phone:"
 msgstr "Teléfono:"
 
-msgctxt "odt:sale.sale:0"
+msgctxt "odt:sale.sale:"
 msgid "Quantity"
 msgstr "Cantidad"
 
-msgctxt "odt:sale.sale:0"
+msgctxt "odt:sale.sale:"
 msgid "Quotation N°:"
 msgstr "Cotización Nº:"
 
-msgctxt "odt:sale.sale:0"
+msgctxt "odt:sale.sale:"
 msgid "Sale Order N°:"
 msgstr "Orden de Venta Nº:"
 
-msgctxt "odt:sale.sale:0"
+msgctxt "odt:sale.sale:"
 msgid "Taxes"
 msgstr "Impuestos"
 
-msgctxt "odt:sale.sale:0"
+msgctxt "odt:sale.sale:"
 msgid "Taxes:"
 msgstr "Impuestos:"
 
-msgctxt "odt:sale.sale:0"
+msgctxt "odt:sale.sale:"
 msgid "Total (excl. taxes):"
 msgstr "Total (sin impuestos):"
 
-msgctxt "odt:sale.sale:0"
+msgctxt "odt:sale.sale:"
 msgid "Total:"
 msgstr "Total:"
 
-msgctxt "odt:sale.sale:0"
+msgctxt "odt:sale.sale:"
 msgid "Unit Price"
 msgstr "Precio Unitario"
 
-msgctxt "odt:sale.sale:0"
+msgctxt "odt:sale.sale:"
 msgid "VAT Number:"
 msgstr ""
 
-msgctxt "odt:sale.sale:0"
+msgctxt "odt:sale.sale:"
 msgid "VAT:"
 msgstr "NIT:"
 
-msgctxt "selection:account.invoice,sale_exception_state:0"
+msgctxt "selection:account.invoice,sale_exception_state:"
 msgid ""
 msgstr ""
 
-msgctxt "selection:account.invoice,sale_exception_state:0"
+msgctxt "selection:account.invoice,sale_exception_state:"
 msgid "Ignored"
 msgstr "Ignorado"
 
-msgctxt "selection:account.invoice,sale_exception_state:0"
+msgctxt "selection:account.invoice,sale_exception_state:"
 msgid "Recreated"
 msgstr "Rehecho"
 
 #, fuzzy
-msgctxt "selection:sale.configuration,sale_invoice_method:0"
+msgctxt "selection:sale.configuration,sale_invoice_method:"
 msgid "Manual"
 msgstr "Manual"
 
-#, fuzzy
-msgctxt "selection:sale.configuration,sale_invoice_method:0"
-msgid "On Order Confirmed"
-msgstr "Al Confirmar la Orden"
+msgctxt "selection:sale.configuration,sale_invoice_method:"
+msgid "On Order Processed"
+msgstr ""
 
 #, fuzzy
-msgctxt "selection:sale.configuration,sale_invoice_method:0"
+msgctxt "selection:sale.configuration,sale_invoice_method:"
 msgid "On Shipment Sent"
 msgstr "Enviado"
 
 #, fuzzy
-msgctxt "selection:sale.configuration,sale_shipment_method:0"
+msgctxt "selection:sale.configuration,sale_shipment_method:"
 msgid "Manual"
 msgstr "Manual"
 
 #, fuzzy
-msgctxt "selection:sale.configuration,sale_shipment_method:0"
+msgctxt "selection:sale.configuration,sale_shipment_method:"
 msgid "On Invoice Paid"
 msgstr "Al Pagar"
 
-#, fuzzy
-msgctxt "selection:sale.configuration,sale_shipment_method:0"
-msgid "On Order Confirmed"
-msgstr "Al Confirmar la Orden"
+msgctxt "selection:sale.configuration,sale_shipment_method:"
+msgid "On Order Processed"
+msgstr ""
 
-msgctxt "selection:sale.line,type:0"
+msgctxt "selection:sale.line,type:"
 msgid "Comment"
 msgstr "Comentario"
 
-msgctxt "selection:sale.line,type:0"
+msgctxt "selection:sale.line,type:"
 msgid "Line"
 msgstr "Línea"
 
-msgctxt "selection:sale.line,type:0"
+msgctxt "selection:sale.line,type:"
 msgid "Subtotal"
 msgstr "Subtotal"
 
-msgctxt "selection:sale.line,type:0"
+msgctxt "selection:sale.line,type:"
 msgid "Title"
 msgstr "Título"
 
-msgctxt "selection:sale.sale,invoice_method:0"
+msgctxt "selection:sale.sale,invoice_method:"
 msgid "Manual"
 msgstr "Manual"
 
-msgctxt "selection:sale.sale,invoice_method:0"
-msgid "On Order Confirmed"
-msgstr "Al Confirmar la Orden"
+msgctxt "selection:sale.sale,invoice_method:"
+msgid "On Order Processed"
+msgstr ""
 
-msgctxt "selection:sale.sale,invoice_method:0"
+msgctxt "selection:sale.sale,invoice_method:"
 msgid "On Shipment Sent"
 msgstr "Enviado"
 
-msgctxt "selection:sale.sale,invoice_state:0"
+msgctxt "selection:sale.sale,invoice_state:"
 msgid "Exception"
 msgstr "Excepción"
 
-msgctxt "selection:sale.sale,invoice_state:0"
+msgctxt "selection:sale.sale,invoice_state:"
 msgid "None"
 msgstr "Ninguno"
 
-msgctxt "selection:sale.sale,invoice_state:0"
+msgctxt "selection:sale.sale,invoice_state:"
 msgid "Paid"
 msgstr "Pagado"
 
-msgctxt "selection:sale.sale,invoice_state:0"
+msgctxt "selection:sale.sale,invoice_state:"
 msgid "Waiting"
 msgstr "En Espera"
 
-msgctxt "selection:sale.sale,shipment_method:0"
+msgctxt "selection:sale.sale,shipment_method:"
 msgid "Manual"
 msgstr "Manual"
 
-msgctxt "selection:sale.sale,shipment_method:0"
+msgctxt "selection:sale.sale,shipment_method:"
 msgid "On Invoice Paid"
 msgstr "Al Pagar"
 
-msgctxt "selection:sale.sale,shipment_method:0"
-msgid "On Order Confirmed"
-msgstr "Al Confirmar la Orden"
+msgctxt "selection:sale.sale,shipment_method:"
+msgid "On Order Processed"
+msgstr ""
 
-msgctxt "selection:sale.sale,shipment_state:0"
+msgctxt "selection:sale.sale,shipment_state:"
 msgid "Exception"
 msgstr "Excepción"
 
-msgctxt "selection:sale.sale,shipment_state:0"
+msgctxt "selection:sale.sale,shipment_state:"
 msgid "None"
 msgstr "Ninguno"
 
-msgctxt "selection:sale.sale,shipment_state:0"
+msgctxt "selection:sale.sale,shipment_state:"
 msgid "Sent"
 msgstr "Enviado"
 
-msgctxt "selection:sale.sale,shipment_state:0"
+msgctxt "selection:sale.sale,shipment_state:"
 msgid "Waiting"
 msgstr "En Espera"
 
-msgctxt "selection:sale.sale,state:0"
+msgctxt "selection:sale.sale,state:"
 msgid "Canceled"
 msgstr "Cancelado"
 
-msgctxt "selection:sale.sale,state:0"
+msgctxt "selection:sale.sale,state:"
 msgid "Confirmed"
 msgstr "Confirmado"
 
-msgctxt "selection:sale.sale,state:0"
+msgctxt "selection:sale.sale,state:"
 msgid "Done"
 msgstr "Hecho"
 
-msgctxt "selection:sale.sale,state:0"
+msgctxt "selection:sale.sale,state:"
 msgid "Draft"
 msgstr "Borrador"
 
-msgctxt "selection:sale.sale,state:0"
+#, fuzzy
+msgctxt "selection:sale.sale,state:"
+msgid "Processing"
+msgstr "Procesamiento"
+
+msgctxt "selection:sale.sale,state:"
 msgid "Quotation"
 msgstr "Cotización"
 
-msgctxt "selection:stock.move,sale_exception_state:0"
+msgctxt "selection:stock.move,sale_exception_state:"
 msgid ""
 msgstr ""
 
-msgctxt "selection:stock.move,sale_exception_state:0"
+msgctxt "selection:stock.move,sale_exception_state:"
 msgid "Ignored"
 msgstr "Ignore"
 
-msgctxt "selection:stock.move,sale_exception_state:0"
+msgctxt "selection:stock.move,sale_exception_state:"
 msgid "Recreated"
 msgstr "Rehacer"
 
-msgctxt "view:product.product:0"
+msgctxt "view:product.product:"
 msgid "Customers"
 msgstr "Clientes"
 
-msgctxt "view:product.template:0"
+#, fuzzy
+msgctxt "view:product.product:"
+msgid "Products"
+msgstr "Productos"
+
+msgctxt "view:product.template:"
 msgid "Customers"
 msgstr "Clientes"
 
-msgctxt "view:sale.configuration:0"
+msgctxt "view:sale.configuration:"
 msgid "Sale Configuration"
 msgstr ""
 
-msgctxt "view:sale.handle.invoice.exception.ask:0"
+msgctxt "view:sale.handle.invoice.exception.ask:"
 msgid "Choose invoices to recreate"
 msgstr "Escoja una factura a rehacer"
 
-msgctxt "view:sale.handle.invoice.exception.ask:0"
+msgctxt "view:sale.handle.invoice.exception.ask:"
 msgid "Handle Invoice Exception"
 msgstr "Tratar Excepción de factura"
 
-msgctxt "view:sale.handle.shipment.exception.ask:0"
+msgctxt "view:sale.handle.shipment.exception.ask:"
 msgid "Choose move to recreate"
 msgstr "Escoja un movimiento a rehacer"
 
-msgctxt "view:sale.handle.shipment.exception.ask:0"
+msgctxt "view:sale.handle.shipment.exception.ask:"
 msgid "Handle shipment Exception"
 msgstr "Maneje Excepciones de empaquetado"
 
-msgctxt "view:sale.handle.shipment.exception.ask:0"
+msgctxt "view:sale.handle.shipment.exception.ask:"
 msgid "Recreate Moves"
 msgstr "Recrear movimientos"
 
-msgctxt "view:sale.line:0"
+msgctxt "view:sale.line:"
 msgid "General"
 msgstr "General"
 
-msgctxt "view:sale.line:0"
+msgctxt "view:sale.line:"
 msgid "Notes"
 msgstr "Notas"
 
-msgctxt "view:sale.line:0"
+msgctxt "view:sale.line:"
 msgid "Products"
 msgstr "Productos"
 
-msgctxt "view:sale.line:0"
+msgctxt "view:sale.line:"
 msgid "Sale Line"
 msgstr "Línea de Venta"
 
-msgctxt "view:sale.line:0"
+msgctxt "view:sale.line:"
 msgid "Sale Lines"
 msgstr "Líneas de Venta"
 
-msgctxt "view:sale.sale:0"
+msgctxt "view:sale.sale:"
 msgid "Cancel"
 msgstr "Cancelar"
 
-msgctxt "view:sale.sale:0"
+msgctxt "view:sale.sale:"
 msgid "Confirm"
 msgstr "Confirmar"
 
-msgctxt "view:sale.sale:0"
+msgctxt "view:sale.sale:"
 msgid "Draft"
 msgstr "Borrador"
 
-msgctxt "view:sale.sale:0"
+msgctxt "view:sale.sale:"
 msgid "Handle Invoice Exception"
 msgstr "Excepción que maneja factura"
 
-msgctxt "view:sale.sale:0"
+msgctxt "view:sale.sale:"
 msgid "Handle Shipment Exception"
 msgstr "Excepción que maneja envío"
 
-msgctxt "view:sale.sale:0"
+msgctxt "view:sale.sale:"
 msgid "Ignore Invoice Exception"
 msgstr "Ignorar excepción en Factura"
 
-msgctxt "view:sale.sale:0"
+msgctxt "view:sale.sale:"
 msgid "Invoices"
 msgstr "Facturas"
 
-msgctxt "view:sale.sale:0"
+msgctxt "view:sale.sale:"
 msgid "Lines"
 msgstr "Líneas"
 
-msgctxt "view:sale.sale:0"
+msgctxt "view:sale.sale:"
 msgid "Moves"
 msgstr "Movimientos"
 
-msgctxt "view:sale.sale:0"
+msgctxt "view:sale.sale:"
 msgid "Other Info"
 msgstr "Información Adicional"
 
-msgctxt "view:sale.sale:0"
+msgctxt "view:sale.sale:"
+msgid "Process"
+msgstr ""
+
+msgctxt "view:sale.sale:"
 msgid "Quotation"
 msgstr "Cotización"
 
-msgctxt "view:sale.sale:0"
+msgctxt "view:sale.sale:"
+msgid "Quote"
+msgstr ""
+
+msgctxt "view:sale.sale:"
 msgid "Sale"
 msgstr "Venta"
 
-msgctxt "view:sale.sale:0"
+msgctxt "view:sale.sale:"
 msgid "Sales"
 msgstr "Ventas"
 
-msgctxt "view:sale.sale:0"
+msgctxt "view:sale.sale:"
 msgid "Shipments"
 msgstr "Empaques"
 
-msgctxt "wizard_button:sale.handle.invoice.exception,init,end:0"
+#, fuzzy
+msgctxt "view:stock.move:"
+msgid "Moves"
+msgstr "Movimientos"
+
+#, fuzzy
+msgctxt "wizard_button:sale.handle.invoice.exception,ask,end:"
 msgid "Cancel"
 msgstr "Cancelar"
 
-msgctxt "wizard_button:sale.handle.invoice.exception,init,ok:0"
+#, fuzzy
+msgctxt "wizard_button:sale.handle.invoice.exception,ask,handle:"
 msgid "Ok"
 msgstr "Aceptar"
 
-msgctxt "wizard_button:sale.handle.shipment.exception,init,end:0"
+#, fuzzy
+msgctxt "wizard_button:sale.handle.shipment.exception,ask,end:"
 msgid "Cancel"
 msgstr "Cancelar"
 
-msgctxt "wizard_button:sale.handle.shipment.exception,init,ok:0"
+#, fuzzy
+msgctxt "wizard_button:sale.handle.shipment.exception,ask,handle:"
 msgid "Ok"
 msgstr "Aceptar"
diff --git a/locale/es_ES.po b/locale/es_ES.po
index e8360f0..49b2aa5 100644
--- a/locale/es_ES.po
+++ b/locale/es_ES.po
@@ -2,415 +2,648 @@
 msgid ""
 msgstr "Content-Type: text/plain; charset=utf-8\n"
 
-msgctxt "error:account.invoice:0"
+msgctxt "error:account.invoice:"
 msgid "You can not delete invoices that come from a sale!"
-msgstr "No puede borrar facturas que provienen de una venta"
+msgstr "No puede eliminar facturas que provienen de una venta."
 
-msgctxt "error:account.invoice:0"
+msgctxt "error:account.invoice:"
 msgid "You cannot reset to draft an invoice generated by a sale."
 msgstr "No puede restablecer a borrador una factura generada por una venta."
 
-msgctxt "error:sale.line:0"
+msgctxt "error:sale.line:"
 msgid "It misses an \"Account Revenue\" on product \"%s\"!"
-msgstr "Falta una «cuenta de ingresos» en el producto «%s»"
+msgstr "Al producto \"%s\" le falta una \"Cuenta de ingresos\"."
 
-msgctxt "error:sale.line:0"
+msgctxt "error:sale.line:"
 msgid "It misses an \"account Revenue\" default property!"
-msgstr "Falta una propiedad predeterminada de «cuenta de ingresos»"
+msgstr "Falta una propiedad por defecto de \"Cuenta de ingresos\"."
 
-msgctxt "error:sale.line:0"
+msgctxt "error:sale.line:"
 msgid "The customer location is required!"
-msgstr "Se necesita la ubicación del cliente"
+msgstr "La ubicación de cliente es requerida."
 
-msgctxt "error:sale.sale:0"
+msgctxt "error:sale.sale:"
 msgid "Invoice and Shipment addresses must be defined for the quotation."
 msgstr ""
-"Las direcciones de facturación y de envío debe ser definida para el "
-"presupuesto."
+"Debe indicar las direcciones de facturación y de envío en el presupuesto."
 
-msgctxt "error:sale.sale:0"
+msgctxt "error:sale.sale:"
 msgid "It misses an \"Account Receivable\" on the party \"%s\"!"
-msgstr "Falta una «cuenta de ingresos» en el tercero «%s»"
+msgstr "Al tercero \"%s\" le falta una \"Cuenta a cobrar\"."
 
-msgctxt "error:sale.sale:0"
+msgctxt "error:sale.sale:"
+msgid "Sale \"%s\" must be cancelled before deletion!"
+msgstr "La venta \"%s\" debe ser cancelada antes de ser eliminada."
+
+msgctxt "error:sale.sale:"
+msgid "Warehouse must be defined for the quotation."
+msgstr "Debe indicar un almacén en el presupuesto."
+
+msgctxt "error:sale.sale:"
 msgid "Wrong combination of method!"
-msgstr "Combinación inválida de métodos"
+msgstr "Combinación no válida de métodos."
+
+msgctxt "error:stock.shipment.out.return:"
+msgid "You cannot reset to draft a move generated by a sale."
+msgstr "No puede restablecer a borrador un movimiento generado por una venta."
 
-msgctxt "error:stock.shipment.out:0"
+msgctxt "error:stock.shipment.out:"
 msgid "You cannot reset to draft a move generated by a sale."
 msgstr "No puede restablecer a borrador un movimiento generado por una venta."
 
-msgctxt "field:account.invoice,sale_exception_state:0"
+msgctxt "field:account.invoice,sale_exception_state:"
 msgid "Exception State"
-msgstr "Estado de excepción"
+msgstr "Estado excepción"
 
-#, fuzzy
-msgctxt "field:account.invoice,sales:0"
+msgctxt "field:account.invoice,sales:"
 msgid "Sales"
 msgstr "Ventas"
 
-#, fuzzy
-msgctxt "field:account.invoice.line,sale_lines:0"
+msgctxt "field:account.invoice.line,sale_lines:"
 msgid "Sale Lines"
 msgstr "Líneas de venta"
 
-#, fuzzy
-msgctxt "field:product.template,delivery_time:0"
+msgctxt "field:product.template,delivery_time:"
 msgid "Delivery Time"
 msgstr "Tiempo de envío"
 
-msgctxt "field:product.template,salable:0"
+msgctxt "field:product.template,salable:"
 msgid "Salable"
-msgstr "Vendible"
+msgstr "Puede ser vendido"
 
-msgctxt "field:product.template,sale_uom:0"
+msgctxt "field:product.template,sale_uom:"
 msgid "Sale UOM"
 msgstr "UdM de venta"
 
-#, fuzzy
-msgctxt "field:sale.configuration,rec_name:0"
+msgctxt "field:sale.configuration,create_date:"
+msgid "Create Date"
+msgstr "Fecha creación"
+
+msgctxt "field:sale.configuration,create_uid:"
+msgid "Create User"
+msgstr "Usuario creación"
+
+msgctxt "field:sale.configuration,id:"
+msgid "ID"
+msgstr "ID"
+
+msgctxt "field:sale.configuration,rec_name:"
 msgid "Name"
-msgstr "Nombre del campo"
+msgstr "Nombre"
 
-msgctxt "field:sale.configuration,sale_invoice_method:0"
+msgctxt "field:sale.configuration,sale_invoice_method:"
 msgid "Sale Invoice Method"
-msgstr ""
+msgstr "Método de facturación"
 
-msgctxt "field:sale.configuration,sale_sequence:0"
+msgctxt "field:sale.configuration,sale_sequence:"
 msgid "Sale Reference Sequence"
-msgstr ""
+msgstr "Secuencia pedidos de venta"
 
-msgctxt "field:sale.configuration,sale_shipment_method:0"
+msgctxt "field:sale.configuration,sale_shipment_method:"
 msgid "Sale Shipment Method"
-msgstr ""
+msgstr "Método de envío"
+
+msgctxt "field:sale.configuration,write_date:"
+msgid "Write Date"
+msgstr "Fecha modificación"
+
+msgctxt "field:sale.configuration,write_uid:"
+msgid "Write User"
+msgstr "Usuario modificación"
 
-msgctxt "field:sale.handle.invoice.exception.ask,domain_invoices:0"
+msgctxt "field:sale.handle.invoice.exception.ask,domain_invoices:"
 msgid "Domain Invoices"
-msgstr "Facturas del dominio"
+msgstr "Dominio de facturas"
 
-msgctxt "field:sale.handle.invoice.exception.ask,recreate_invoices:0"
+msgctxt "field:sale.handle.invoice.exception.ask,id:"
+msgid "ID"
+msgstr "ID"
+
+msgctxt "field:sale.handle.invoice.exception.ask,recreate_invoices:"
 msgid "Recreate Invoices"
-msgstr "Rehacer facturas"
+msgstr "Recrear facturas"
 
-msgctxt "field:sale.handle.shipment.exception.ask,domain_moves:0"
+msgctxt "field:sale.handle.shipment.exception.ask,domain_moves:"
 msgid "Domain Moves"
-msgstr "Movimientos de dominio"
+msgstr "Dominio de movimientos"
+
+msgctxt "field:sale.handle.shipment.exception.ask,id:"
+msgid "ID"
+msgstr "ID"
 
-msgctxt "field:sale.handle.shipment.exception.ask,recreate_moves:0"
+msgctxt "field:sale.handle.shipment.exception.ask,recreate_moves:"
 msgid "Recreate Moves"
-msgstr "Rehacer movimientos"
+msgstr "Recrear movimientos"
 
-msgctxt "field:sale.line,amount:0"
+msgctxt "field:sale.line,amount:"
 msgid "Amount"
-msgstr "Cantidad"
+msgstr "Importe"
+
+msgctxt "field:sale.line,create_date:"
+msgid "Create Date"
+msgstr "Fecha creación"
+
+msgctxt "field:sale.line,create_uid:"
+msgid "Create User"
+msgstr "Usuario creación"
 
-msgctxt "field:sale.line,description:0"
+msgctxt "field:sale.line,delivery_date:"
+msgid "Delivery Date"
+msgstr "Fecha de entrega"
+
+msgctxt "field:sale.line,description:"
 msgid "Description"
 msgstr "Descripción"
 
-msgctxt "field:sale.line,invoice_lines:0"
+msgctxt "field:sale.line,from_location:"
+msgid "From Location"
+msgstr "Desde ubicación"
+
+msgctxt "field:sale.line,id:"
+msgid "ID"
+msgstr "ID"
+
+msgctxt "field:sale.line,invoice_lines:"
 msgid "Invoice Lines"
 msgstr "Líneas de factura"
 
-msgctxt "field:sale.line,move_done:0"
+msgctxt "field:sale.line,move_done:"
 msgid "Moves Done"
-msgstr "Movimientos terminados"
+msgstr "Movimientos realizados"
 
-msgctxt "field:sale.line,move_exception:0"
+msgctxt "field:sale.line,move_exception:"
 msgid "Moves Exception"
 msgstr "Exepción de movimientos"
 
-msgctxt "field:sale.line,moves:0"
+msgctxt "field:sale.line,moves:"
 msgid "Moves"
 msgstr "Movimientos"
 
-msgctxt "field:sale.line,moves_ignored:0"
+msgctxt "field:sale.line,moves_ignored:"
 msgid "Ignored Moves"
 msgstr "Movimientos ignorados"
 
-msgctxt "field:sale.line,moves_recreated:0"
+msgctxt "field:sale.line,moves_recreated:"
 msgid "Recreated Moves"
-msgstr "Rehacer movimientos"
+msgstr "Movimientos recreados"
 
-msgctxt "field:sale.line,note:0"
+msgctxt "field:sale.line,note:"
 msgid "Note"
 msgstr "Nota"
 
-msgctxt "field:sale.line,product:0"
+msgctxt "field:sale.line,product:"
 msgid "Product"
 msgstr "Producto"
 
-msgctxt "field:sale.line,quantity:0"
+msgctxt "field:sale.line,product_uom_category:"
+msgid "Product Uom Category"
+msgstr "Categoría UdM del producto"
+
+msgctxt "field:sale.line,quantity:"
 msgid "Quantity"
 msgstr "Cantidad"
 
-msgctxt "field:sale.line,rec_name:0"
+msgctxt "field:sale.line,rec_name:"
 msgid "Name"
 msgstr "Nombre"
 
-msgctxt "field:sale.line,sale:0"
+msgctxt "field:sale.line,sale:"
 msgid "Sale"
 msgstr "Venta"
 
-msgctxt "field:sale.line,sequence:0"
+msgctxt "field:sale.line,sequence:"
 msgid "Sequence"
 msgstr "Secuencia"
 
-msgctxt "field:sale.line,taxes:0"
+msgctxt "field:sale.line,taxes:"
 msgid "Taxes"
 msgstr "Impuestos"
 
-msgctxt "field:sale.line,type:0"
+msgctxt "field:sale.line,to_location:"
+msgid "To Location"
+msgstr "A ubicación"
+
+msgctxt "field:sale.line,type:"
 msgid "Type"
 msgstr "Tipo"
 
-msgctxt "field:sale.line,unit:0"
+msgctxt "field:sale.line,unit:"
 msgid "Unit"
 msgstr "Unidad"
 
-msgctxt "field:sale.line,unit_digits:0"
+msgctxt "field:sale.line,unit_digits:"
 msgid "Unit Digits"
 msgstr "Dígitos de la unidad"
 
-msgctxt "field:sale.line,unit_price:0"
+msgctxt "field:sale.line,unit_price:"
 msgid "Unit Price"
-msgstr "Precio unitario"
+msgstr "Precio unidad"
 
-msgctxt "field:sale.line-account.invoice.line,invoice_line:0"
+msgctxt "field:sale.line,warehouse:"
+msgid "Warehouse"
+msgstr "Almacén"
+
+msgctxt "field:sale.line,write_date:"
+msgid "Write Date"
+msgstr "Fecha modificación"
+
+msgctxt "field:sale.line,write_uid:"
+msgid "Write User"
+msgstr "Usuario modificación"
+
+msgctxt "field:sale.line-account.invoice.line,create_date:"
+msgid "Create Date"
+msgstr "Fecha creación"
+
+msgctxt "field:sale.line-account.invoice.line,create_uid:"
+msgid "Create User"
+msgstr "Usuario creación"
+
+msgctxt "field:sale.line-account.invoice.line,id:"
+msgid "ID"
+msgstr "ID"
+
+msgctxt "field:sale.line-account.invoice.line,invoice_line:"
 msgid "Invoice Line"
 msgstr "Línea de factura"
 
-msgctxt "field:sale.line-account.invoice.line,rec_name:0"
+msgctxt "field:sale.line-account.invoice.line,rec_name:"
 msgid "Name"
 msgstr "Nombre"
 
-msgctxt "field:sale.line-account.invoice.line,sale_line:0"
+msgctxt "field:sale.line-account.invoice.line,sale_line:"
 msgid "Sale Line"
 msgstr "Línea de venta"
 
-msgctxt "field:sale.line-account.tax,line:0"
+msgctxt "field:sale.line-account.invoice.line,write_date:"
+msgid "Write Date"
+msgstr "Fecha modificación"
+
+msgctxt "field:sale.line-account.invoice.line,write_uid:"
+msgid "Write User"
+msgstr "Usuario modificación"
+
+msgctxt "field:sale.line-account.tax,create_date:"
+msgid "Create Date"
+msgstr "Fecha creación"
+
+msgctxt "field:sale.line-account.tax,create_uid:"
+msgid "Create User"
+msgstr "Usuario creación"
+
+msgctxt "field:sale.line-account.tax,id:"
+msgid "ID"
+msgstr "ID"
+
+msgctxt "field:sale.line-account.tax,line:"
 msgid "Sale Line"
 msgstr "Línea de venta"
 
-msgctxt "field:sale.line-account.tax,rec_name:0"
+msgctxt "field:sale.line-account.tax,rec_name:"
 msgid "Name"
 msgstr "Nombre"
 
-msgctxt "field:sale.line-account.tax,tax:0"
+msgctxt "field:sale.line-account.tax,tax:"
 msgid "Tax"
 msgstr "Impuesto"
 
-msgctxt "field:sale.line-ignored-stock.move,move:0"
+msgctxt "field:sale.line-account.tax,write_date:"
+msgid "Write Date"
+msgstr "Fecha modificación"
+
+msgctxt "field:sale.line-account.tax,write_uid:"
+msgid "Write User"
+msgstr "Usuario modificación"
+
+msgctxt "field:sale.line-ignored-stock.move,create_date:"
+msgid "Create Date"
+msgstr "Fecha creación"
+
+msgctxt "field:sale.line-ignored-stock.move,create_uid:"
+msgid "Create User"
+msgstr "Usuario creación"
+
+msgctxt "field:sale.line-ignored-stock.move,id:"
+msgid "ID"
+msgstr "ID"
+
+msgctxt "field:sale.line-ignored-stock.move,move:"
 msgid "Move"
 msgstr "Movimiento"
 
-msgctxt "field:sale.line-ignored-stock.move,rec_name:0"
+msgctxt "field:sale.line-ignored-stock.move,rec_name:"
 msgid "Name"
 msgstr "Nombre"
 
-msgctxt "field:sale.line-ignored-stock.move,sale_line:0"
+msgctxt "field:sale.line-ignored-stock.move,sale_line:"
 msgid "Sale Line"
 msgstr "Línea de venta"
 
-msgctxt "field:sale.line-recreated-stock.move,move:0"
+msgctxt "field:sale.line-ignored-stock.move,write_date:"
+msgid "Write Date"
+msgstr "Fecha modificación"
+
+msgctxt "field:sale.line-ignored-stock.move,write_uid:"
+msgid "Write User"
+msgstr "Usuario modificación"
+
+msgctxt "field:sale.line-recreated-stock.move,create_date:"
+msgid "Create Date"
+msgstr "Fecha creación"
+
+msgctxt "field:sale.line-recreated-stock.move,create_uid:"
+msgid "Create User"
+msgstr "Usuario creación"
+
+msgctxt "field:sale.line-recreated-stock.move,id:"
+msgid "ID"
+msgstr "ID"
+
+msgctxt "field:sale.line-recreated-stock.move,move:"
 msgid "Move"
 msgstr "Movimiento"
 
-msgctxt "field:sale.line-recreated-stock.move,rec_name:0"
+msgctxt "field:sale.line-recreated-stock.move,rec_name:"
 msgid "Name"
 msgstr "Nombre"
 
-msgctxt "field:sale.line-recreated-stock.move,sale_line:0"
+msgctxt "field:sale.line-recreated-stock.move,sale_line:"
 msgid "Sale Line"
 msgstr "Línea de venta"
 
-msgctxt "field:sale.sale,comment:0"
+msgctxt "field:sale.line-recreated-stock.move,write_date:"
+msgid "Write Date"
+msgstr "Fecha modificación"
+
+msgctxt "field:sale.line-recreated-stock.move,write_uid:"
+msgid "Write User"
+msgstr "Usuario modificación"
+
+msgctxt "field:sale.sale,comment:"
 msgid "Comment"
 msgstr "Comentario"
 
-msgctxt "field:sale.sale,company:0"
+msgctxt "field:sale.sale,company:"
 msgid "Company"
 msgstr "Empresa"
 
-msgctxt "field:sale.sale,currency:0"
+msgctxt "field:sale.sale,create_date:"
+msgid "Create Date"
+msgstr "Fecha creación"
+
+msgctxt "field:sale.sale,create_uid:"
+msgid "Create User"
+msgstr "Usuario creación"
+
+msgctxt "field:sale.sale,currency:"
 msgid "Currency"
 msgstr "Divisa"
 
-msgctxt "field:sale.sale,currency_digits:0"
+msgctxt "field:sale.sale,currency_digits:"
 msgid "Currency Digits"
-msgstr "Dígitos de la divisa"
+msgstr "Decimales de la divisa"
 
-msgctxt "field:sale.sale,description:0"
+msgctxt "field:sale.sale,description:"
 msgid "Description"
 msgstr "Descripción"
 
-msgctxt "field:sale.sale,invoice_address:0"
+msgctxt "field:sale.sale,id:"
+msgid "ID"
+msgstr "ID"
+
+msgctxt "field:sale.sale,invoice_address:"
 msgid "Invoice Address"
 msgstr "Dirección de facturación"
 
-msgctxt "field:sale.sale,invoice_exception:0"
-msgid "Invoices Exception"
-msgstr "Excepción de facturación"
-
-msgctxt "field:sale.sale,invoice_method:0"
+msgctxt "field:sale.sale,invoice_method:"
 msgid "Invoice Method"
 msgstr "Método de facturación"
 
-msgctxt "field:sale.sale,invoice_paid:0"
-msgid "Invoices Paid"
-msgstr "Facturas pagadas"
-
-msgctxt "field:sale.sale,invoice_state:0"
+msgctxt "field:sale.sale,invoice_state:"
 msgid "Invoice State"
-msgstr "Estado de factura"
+msgstr "Estado factura"
 
-msgctxt "field:sale.sale,invoices:0"
+msgctxt "field:sale.sale,invoices:"
 msgid "Invoices"
 msgstr "Facturas"
 
-msgctxt "field:sale.sale,invoices_ignored:0"
+msgctxt "field:sale.sale,invoices_ignored:"
 msgid "Ignored Invoices"
 msgstr "Facturas ignoradas"
 
-msgctxt "field:sale.sale,invoices_recreated:0"
+msgctxt "field:sale.sale,invoices_recreated:"
 msgid "Recreated Invoices"
-msgstr "Rehacer facturas"
+msgstr "Facturas recreadas"
 
-msgctxt "field:sale.sale,lines:0"
+msgctxt "field:sale.sale,lines:"
 msgid "Lines"
 msgstr "Líneas"
 
-msgctxt "field:sale.sale,moves:0"
+msgctxt "field:sale.sale,moves:"
 msgid "Moves"
 msgstr "Movimientos"
 
-msgctxt "field:sale.sale,party:0"
+msgctxt "field:sale.sale,party:"
 msgid "Party"
 msgstr "Tercero"
 
-msgctxt "field:sale.sale,party_lang:0"
+msgctxt "field:sale.sale,party_lang:"
 msgid "Party Language"
 msgstr "Idioma del tercero"
 
-msgctxt "field:sale.sale,payment_term:0"
+msgctxt "field:sale.sale,payment_term:"
 msgid "Payment Term"
-msgstr "Término de pago"
+msgstr "Plazo de pago"
 
-msgctxt "field:sale.sale,rec_name:0"
+msgctxt "field:sale.sale,rec_name:"
 msgid "Name"
 msgstr "Nombre"
 
-msgctxt "field:sale.sale,reference:0"
+msgctxt "field:sale.sale,reference:"
 msgid "Reference"
 msgstr "Referencia"
 
-msgctxt "field:sale.sale,sale_date:0"
+msgctxt "field:sale.sale,sale_date:"
 msgid "Sale Date"
 msgstr "Fecha de venta"
 
-msgctxt "field:sale.sale,shipment_address:0"
+msgctxt "field:sale.sale,shipment_address:"
 msgid "Shipment Address"
 msgstr "Dirección de envío"
 
-msgctxt "field:sale.sale,shipment_done:0"
-msgid "Shipment Done"
-msgstr "Envío terminado"
-
-msgctxt "field:sale.sale,shipment_exception:0"
-msgid "Shipments Exception"
-msgstr "Excepción de envíos"
-
-msgctxt "field:sale.sale,shipment_method:0"
+msgctxt "field:sale.sale,shipment_method:"
 msgid "Shipment Method"
 msgstr "Método de envío"
 
-msgctxt "field:sale.sale,shipment_state:0"
+msgctxt "field:sale.sale,shipment_returns:"
+msgid "Shipment Returns"
+msgstr "Albaranes de devolución"
+
+msgctxt "field:sale.sale,shipment_state:"
 msgid "Shipment State"
-msgstr "Estado de envío"
+msgstr "Estado envío"
 
-msgctxt "field:sale.sale,shipments:0"
+msgctxt "field:sale.sale,shipments:"
 msgid "Shipments"
-msgstr "Envíos"
+msgstr "Albaranes"
 
-msgctxt "field:sale.sale,state:0"
+msgctxt "field:sale.sale,state:"
 msgid "State"
 msgstr "Estado"
 
-msgctxt "field:sale.sale,tax_amount:0"
+msgctxt "field:sale.sale,tax_amount:"
 msgid "Tax"
 msgstr "Impuesto"
 
-msgctxt "field:sale.sale,total_amount:0"
+msgctxt "field:sale.sale,tax_amount_cache:"
+msgid "Tax Cache"
+msgstr "Impuestos precalculado"
+
+msgctxt "field:sale.sale,total_amount:"
 msgid "Total"
 msgstr "Total"
 
-msgctxt "field:sale.sale,untaxed_amount:0"
+msgctxt "field:sale.sale,total_amount_cache:"
+msgid "Total Tax"
+msgstr "Total impuestos"
+
+msgctxt "field:sale.sale,untaxed_amount:"
 msgid "Untaxed"
-msgstr "Sin impuesto"
+msgstr "Base imponible"
+
+msgctxt "field:sale.sale,untaxed_amount_cache:"
+msgid "Untaxed Cache"
+msgstr "Base imponible precalculada"
 
-msgctxt "field:sale.sale,warehouse:0"
+msgctxt "field:sale.sale,warehouse:"
 msgid "Warehouse"
 msgstr "Almacén"
 
-msgctxt "field:sale.sale-account.invoice,invoice:0"
+msgctxt "field:sale.sale,write_date:"
+msgid "Write Date"
+msgstr "Fecha modificación"
+
+msgctxt "field:sale.sale,write_uid:"
+msgid "Write User"
+msgstr "Usuario modificación"
+
+msgctxt "field:sale.sale-account.invoice,create_date:"
+msgid "Create Date"
+msgstr "Fecha creación"
+
+msgctxt "field:sale.sale-account.invoice,create_uid:"
+msgid "Create User"
+msgstr "Usuario creación"
+
+msgctxt "field:sale.sale-account.invoice,id:"
+msgid "ID"
+msgstr "ID"
+
+msgctxt "field:sale.sale-account.invoice,invoice:"
 msgid "Invoice"
 msgstr "Factura"
 
-msgctxt "field:sale.sale-account.invoice,rec_name:0"
+msgctxt "field:sale.sale-account.invoice,rec_name:"
 msgid "Name"
 msgstr "Nombre"
 
-msgctxt "field:sale.sale-account.invoice,sale:0"
+msgctxt "field:sale.sale-account.invoice,sale:"
 msgid "Sale"
 msgstr "Venta"
 
-msgctxt "field:sale.sale-ignored-account.invoice,invoice:0"
+msgctxt "field:sale.sale-account.invoice,write_date:"
+msgid "Write Date"
+msgstr "Fecha modificación"
+
+msgctxt "field:sale.sale-account.invoice,write_uid:"
+msgid "Write User"
+msgstr "Usuario modificación"
+
+msgctxt "field:sale.sale-ignored-account.invoice,create_date:"
+msgid "Create Date"
+msgstr "Fecha creación"
+
+msgctxt "field:sale.sale-ignored-account.invoice,create_uid:"
+msgid "Create User"
+msgstr "Usuario creación"
+
+msgctxt "field:sale.sale-ignored-account.invoice,id:"
+msgid "ID"
+msgstr "ID"
+
+msgctxt "field:sale.sale-ignored-account.invoice,invoice:"
 msgid "Invoice"
 msgstr "Factura"
 
-msgctxt "field:sale.sale-ignored-account.invoice,rec_name:0"
+msgctxt "field:sale.sale-ignored-account.invoice,rec_name:"
 msgid "Name"
 msgstr "Nombre"
 
-msgctxt "field:sale.sale-ignored-account.invoice,sale:0"
+msgctxt "field:sale.sale-ignored-account.invoice,sale:"
 msgid "Sale"
 msgstr "Venta"
 
-msgctxt "field:sale.sale-recreated-account.invoice,invoice:0"
+msgctxt "field:sale.sale-ignored-account.invoice,write_date:"
+msgid "Write Date"
+msgstr "Fecha modificación"
+
+msgctxt "field:sale.sale-ignored-account.invoice,write_uid:"
+msgid "Write User"
+msgstr "Usuario modificación"
+
+msgctxt "field:sale.sale-recreated-account.invoice,create_date:"
+msgid "Create Date"
+msgstr "Fecha creación"
+
+msgctxt "field:sale.sale-recreated-account.invoice,create_uid:"
+msgid "Create User"
+msgstr "Usuario creación"
+
+msgctxt "field:sale.sale-recreated-account.invoice,id:"
+msgid "ID"
+msgstr "ID"
+
+msgctxt "field:sale.sale-recreated-account.invoice,invoice:"
 msgid "Invoice"
 msgstr "Factura"
 
-msgctxt "field:sale.sale-recreated-account.invoice,rec_name:0"
+msgctxt "field:sale.sale-recreated-account.invoice,rec_name:"
 msgid "Name"
 msgstr "Nombre"
 
-msgctxt "field:sale.sale-recreated-account.invoice,sale:0"
+msgctxt "field:sale.sale-recreated-account.invoice,sale:"
 msgid "Sale"
 msgstr "Venta"
 
-msgctxt "field:stock.move,sale:0"
+msgctxt "field:sale.sale-recreated-account.invoice,write_date:"
+msgid "Write Date"
+msgstr "Fecha modificación"
+
+msgctxt "field:sale.sale-recreated-account.invoice,write_uid:"
+msgid "Write User"
+msgstr "Usuario modificación"
+
+msgctxt "field:stock.move,sale:"
 msgid "Sale"
 msgstr "Venta"
 
-msgctxt "field:stock.move,sale_exception_state:0"
+msgctxt "field:stock.move,sale_exception_state:"
 msgid "Exception State"
 msgstr "Estado excepción"
 
-#, fuzzy
-msgctxt "field:stock.move,sale_line:0"
+msgctxt "field:stock.move,sale_line:"
 msgid "Sale Line"
 msgstr "Línea de venta"
 
-#, fuzzy
-msgctxt "help:product.template,delivery_time:0"
+msgctxt "help:product.template,delivery_time:"
 msgid "In number of days"
-msgstr "En número de días"
+msgstr "En número de días."
 
-msgctxt "help:sale.handle.invoice.exception.ask,recreate_invoices:0"
+msgctxt "help:sale.handle.invoice.exception.ask,recreate_invoices:"
 msgid ""
 "The selected invoices will be recreated. The other ones will be ignored."
 msgstr ""
-"Las facturas seleccionadas seran recreadas. Las otras serán ignoradas."
+"Las facturas seleccionadas serán recreadas. Las otras serán ignoradas."
 
 msgctxt "model:ir.action,name:act_invoice_form"
 msgid "Invoices"
@@ -420,9 +653,13 @@ msgctxt "model:ir.action,name:act_open_customer"
 msgid "Parties associated to Sales"
 msgstr "Terceros asociados a ventas"
 
+msgctxt "model:ir.action,name:act_return_form"
+msgid "Returns"
+msgstr "Devolver"
+
 msgctxt "model:ir.action,name:act_sale_configuration_form"
 msgid "Sales Configuration"
-msgstr ""
+msgstr "Configuración pedidos de venta"
 
 msgctxt "model:ir.action,name:act_sale_form"
 msgid "Sales"
@@ -438,7 +675,11 @@ msgstr "Ventas confirmadas"
 
 msgctxt "model:ir.action,name:act_sale_form_draft"
 msgid "Draft Sales"
-msgstr "Ventas en borrador"
+msgstr "Ventas borrador"
+
+msgctxt "model:ir.action,name:act_sale_form_processing"
+msgid "Processing Sales"
+msgstr "Ventas en proceso"
 
 msgctxt "model:ir.action,name:act_sale_form_quotation"
 msgid "Quotation Sales"
@@ -446,7 +687,7 @@ msgstr "Ventas presupuestadas"
 
 msgctxt "model:ir.action,name:act_shipment_form"
 msgid "Shipments"
-msgstr "Envíos"
+msgstr "Albaranes"
 
 msgctxt "model:ir.action,name:report_sale"
 msgid "Sale"
@@ -456,9 +697,13 @@ msgctxt "model:ir.action,name:wizard_invoice_handle_exception"
 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"
+
 msgctxt "model:ir.action,name:wizard_shipment_handle_exception"
 msgid "Handle Shipment Exception"
-msgstr "Gestionar excepción de envio"
+msgstr "Gestionar excepción de envío"
 
 msgctxt "model:ir.sequence,name:sequence_sale"
 msgid "Sale"
@@ -468,7 +713,6 @@ msgctxt "model:ir.sequence.type,name:sequence_type_sale"
 msgid "Sale"
 msgstr "Venta"
 
-#, fuzzy
 msgctxt "model:ir.ui.menu,name:menu_configuration"
 msgid "Configuration"
 msgstr "Configuración"
@@ -477,14 +721,13 @@ msgctxt "model:ir.ui.menu,name:menu_customer"
 msgid "Parties associated to Sales"
 msgstr "Terceros asociados a ventas"
 
-#, fuzzy
 msgctxt "model:ir.ui.menu,name:menu_sale"
 msgid "Sales"
-msgstr "Gestión de ventas"
+msgstr "Ventas"
 
 msgctxt "model:ir.ui.menu,name:menu_sale_configuration"
 msgid "Sales Configuration"
-msgstr ""
+msgstr "Pedidos de venta"
 
 msgctxt "model:ir.ui.menu,name:menu_sale_form"
 msgid "Sales"
@@ -496,519 +739,422 @@ msgstr "Ventas confirmadas"
 
 msgctxt "model:ir.ui.menu,name:menu_sale_form_draft"
 msgid "Draft Sales"
-msgstr "Ventas en borrador"
+msgstr "Ventas borrador"
+
+msgctxt "model:ir.ui.menu,name:menu_sale_form_processing"
+msgid "Processing Sales"
+msgstr "Ventas en proceso"
 
 msgctxt "model:ir.ui.menu,name:menu_sale_form_quotation"
 msgid "Quotation Sales"
 msgstr "Ventas presupuestadas"
 
-#, fuzzy
 msgctxt "model:res.group,name:group_sale"
 msgid "Sales"
-msgstr "Venta"
+msgstr "Ventas"
 
 msgctxt "model:res.group,name:group_sale_admin"
 msgid "Sales Administrator"
-msgstr ""
+msgstr "Administración de ventas"
 
-msgctxt "model:sale.configuration,name:0"
+msgctxt "model:sale.configuration,name:"
 msgid "Sale Configuration"
-msgstr ""
+msgstr "Configuración ventas"
 
-msgctxt "model:sale.handle.invoice.exception.ask,name:0"
-msgid "Invoice Exception Ask"
-msgstr "Factura de excepcion - Petición"
+#, fuzzy
+msgctxt "model:sale.handle.invoice.exception.ask,name:"
+msgid "Handle Invoice Exception"
+msgstr "Gestionar excepción de factura"
 
-msgctxt "model:sale.handle.shipment.exception.ask,name:0"
-msgid "Shipment Exception Ask"
-msgstr "Envio de excepcion - Petición"
+#, fuzzy
+msgctxt "model:sale.handle.shipment.exception.ask,name:"
+msgid "Handle Shipment Exception"
+msgstr "Gestionar excepción de envío"
 
-msgctxt "model:sale.line,name:0"
+msgctxt "model:sale.line,name:"
 msgid "Sale Line"
 msgstr "Línea de venta"
 
-msgctxt "model:sale.line-account.invoice.line,name:0"
+msgctxt "model:sale.line-account.invoice.line,name:"
 msgid "Sale Line - Invoice Line"
 msgstr "Línea de venta - Línea de factura"
 
-msgctxt "model:sale.line-account.tax,name:0"
+msgctxt "model:sale.line-account.tax,name:"
 msgid "Sale Line - Tax"
 msgstr "Línea de venta - Impuesto"
 
-msgctxt "model:sale.line-ignored-stock.move,name:0"
+msgctxt "model:sale.line-ignored-stock.move,name:"
 msgid "Sale Line - Ignored Move"
 msgstr "Línea de venta - Movimiento ignorado"
 
-msgctxt "model:sale.line-recreated-stock.move,name:0"
+msgctxt "model:sale.line-recreated-stock.move,name:"
 msgid "Sale Line - Recreated Move"
 msgstr "Línea de venta - Movimiento recreado"
 
-msgctxt "model:sale.sale,name:0"
+msgctxt "model:sale.sale,name:"
 msgid "Sale"
 msgstr "Venta"
 
-msgctxt "model:sale.sale-account.invoice,name:0"
+msgctxt "model:sale.sale-account.invoice,name:"
 msgid "Sale - Invoice"
 msgstr "Venta - Factura"
 
-msgctxt "model:sale.sale-ignored-account.invoice,name:0"
+msgctxt "model:sale.sale-ignored-account.invoice,name:"
 msgid "Sale - Ignored Invoice"
 msgstr "Venta - Factura ignorada"
 
-msgctxt "model:sale.sale-recreated-account.invoice,name:0"
+msgctxt "model:sale.sale-recreated-account.invoice,name:"
 msgid "Sale - Recreated Invoice"
 msgstr "Venta - Factura recreada"
 
-msgctxt "model:workflow,name:sale_workflow"
-msgid "Sale workflow"
-msgstr "Flujo de Trabajo de Ventas"
-
-msgctxt "model:workflow.activity,name:sale_activity_cancel"
-msgid "Canceled"
-msgstr "Cancelado"
-
-msgctxt "model:workflow.activity,name:sale_activity_confirmed"
-msgid "Confirmed"
-msgstr "Confirmado"
-
-msgctxt "model:workflow.activity,name:sale_activity_done"
-msgid "Done"
-msgstr "Terminado"
-
-msgctxt "model:workflow.activity,name:sale_activity_draft"
-msgid "Draft"
-msgstr "Borrador"
-
-msgctxt "model:workflow.activity,name:sale_activity_invoice_method"
-msgid "Invoice Method"
-msgstr "Método de facturación"
-
-msgctxt "model:workflow.activity,name:sale_activity_invoice_method_done"
-msgid "Invoice Method Done"
-msgstr "Método de factura terminado"
-
-msgctxt "model:workflow.activity,name:sale_activity_invoice_sale_done"
-msgid "Invoice Done"
-msgstr "Factura terminada"
-
-msgctxt "model:workflow.activity,name:sale_activity_invoice_sale_exception"
-msgid "Invoice Exception"
-msgstr "Excepción de factura"
-
-msgctxt "model:workflow.activity,name:sale_activity_invoice_shipment"
-msgid "Invoice Shipment"
-msgstr "Envío de factura"
-
-msgctxt "model:workflow.activity,name:sale_activity_invoice_shipment_done"
-msgid "Invoice Shipment Done"
-msgstr "Envío de factura terminado"
-
-msgctxt ""
-"model:workflow.activity,name:sale_activity_invoice_shipment_exception"
-msgid "Invoice Shipment Exception"
-msgstr "Excepción de envío de factura"
-
-msgctxt "model:workflow.activity,name:sale_activity_invoice_shipment_method"
-msgid "Invoice Shipment Method"
-msgstr "Método de envío de factura"
-
-msgctxt ""
-"model:workflow.activity,name:sale_activity_invoice_shipment_method_done"
-msgid "Invoice Shipment Method Done"
-msgstr "Método de envío de factura terminado"
-
-msgctxt "model:workflow.activity,name:sale_activity_quotation"
-msgid "Quotation"
-msgstr "Presupuesto"
-
-msgctxt "model:workflow.activity,name:sale_activity_shipment"
-msgid "Shipment"
-msgstr "Envío"
-
-msgctxt "model:workflow.activity,name:sale_activity_shipment_exception"
-msgid "Shipment Exception"
-msgstr "Excepción de envío"
-
-msgctxt "model:workflow.activity,name:sale_activity_shipment_invoice"
-msgid "Shipment Invoice"
-msgstr "Envío de factura"
-
-msgctxt "model:workflow.activity,name:sale_activity_shipment_invoice_done"
-msgid "Shipment Invoice Done"
-msgstr "Envío de factura terminado"
-
-msgctxt ""
-"model:workflow.activity,name:sale_activity_shipment_invoice_exception"
-msgid "Shipment Invoice Exception"
-msgstr "Excepción de envío de factura"
-
-msgctxt "model:workflow.activity,name:sale_activity_shipment_invoice_method"
-msgid "Shipment Invoice Method"
-msgstr "Método de envío de factura"
-
-msgctxt ""
-"model:workflow.activity,name:sale_activity_shipment_invoice_method_done"
-msgid "Shipment Invoice Method Done"
-msgstr "Método de envío de factura terminado"
-
-msgctxt "model:workflow.activity,name:sale_activity_shipment_method"
-msgid "Shipment Method"
-msgstr "Método de envío"
-
-msgctxt "model:workflow.activity,name:sale_activity_shipment_method_done"
-msgid "Shipment Method Done"
-msgstr "Método de envío terminado"
-
-msgctxt "model:workflow.activity,name:sale_activity_waiting_invoice_sale"
-msgid "Waiting Invoice"
-msgstr "Esperando factura"
-
-msgctxt "model:workflow.activity,name:sale_activity_waiting_invoice_shipment"
-msgid "Waiting Invoice Shipment"
-msgstr "Esperando Envío de Factura"
-
-msgctxt "model:workflow.activity,name:sale_activity_waiting_shipment"
-msgid "Waiting Shipment"
-msgstr "Esperando Envío"
-
-msgctxt "model:workflow.activity,name:sale_activity_waiting_shipment_invoice"
-msgid "Waiting Shipment Invoice"
-msgstr "Esperando Envío de Factura"
-
-msgctxt "odt:sale.sale:0"
+msgctxt "odt:sale.sale:"
 msgid "Amount"
-msgstr "Cantidad"
+msgstr "Importe"
 
-msgctxt "odt:sale.sale:0"
+msgctxt "odt:sale.sale:"
 msgid "Date:"
 msgstr "Fecha:"
 
-msgctxt "odt:sale.sale:0"
+msgctxt "odt:sale.sale:"
 msgid "Description"
 msgstr "Descripción"
 
-msgctxt "odt:sale.sale:0"
+msgctxt "odt:sale.sale:"
 msgid "Description:"
 msgstr "Descripción:"
 
-msgctxt "odt:sale.sale:0"
+msgctxt "odt:sale.sale:"
 msgid "Draft Sale Order"
-msgstr "Orden de venta en borrador"
+msgstr "Pedido de venta borrador"
 
-msgctxt "odt:sale.sale:0"
+msgctxt "odt:sale.sale:"
 msgid "E-Mail:"
 msgstr "Correo electrónico:"
 
-msgctxt "odt:sale.sale:0"
+msgctxt "odt:sale.sale:"
 msgid "Phone:"
 msgstr "Teléfono:"
 
-msgctxt "odt:sale.sale:0"
+msgctxt "odt:sale.sale:"
 msgid "Quantity"
 msgstr "Cantidad"
 
-msgctxt "odt:sale.sale:0"
+msgctxt "odt:sale.sale:"
 msgid "Quotation N°:"
 msgstr "Presupuesto Nº:"
 
-msgctxt "odt:sale.sale:0"
+msgctxt "odt:sale.sale:"
 msgid "Sale Order N°:"
-msgstr "Orden de venta Nº:"
+msgstr "Pedido de venta Nº:"
 
-msgctxt "odt:sale.sale:0"
+msgctxt "odt:sale.sale:"
 msgid "Taxes"
 msgstr "Impuestos"
 
-msgctxt "odt:sale.sale:0"
+msgctxt "odt:sale.sale:"
 msgid "Taxes:"
 msgstr "Impuestos:"
 
-msgctxt "odt:sale.sale:0"
+msgctxt "odt:sale.sale:"
 msgid "Total (excl. taxes):"
-msgstr "Total (sin impuestos):"
+msgstr "Base imponible:"
 
-msgctxt "odt:sale.sale:0"
+msgctxt "odt:sale.sale:"
 msgid "Total:"
 msgstr "Total:"
 
-msgctxt "odt:sale.sale:0"
+msgctxt "odt:sale.sale:"
 msgid "Unit Price"
-msgstr "Precio unitario"
+msgstr "Precio unidad"
 
-msgctxt "odt:sale.sale:0"
+msgctxt "odt:sale.sale:"
 msgid "VAT Number:"
-msgstr ""
+msgstr "Número CIF/NIF:"
 
-msgctxt "odt:sale.sale:0"
+msgctxt "odt:sale.sale:"
 msgid "VAT:"
 msgstr "NIF:"
 
-msgctxt "selection:account.invoice,sale_exception_state:0"
+msgctxt "selection:account.invoice,sale_exception_state:"
 msgid ""
 msgstr ""
 
-msgctxt "selection:account.invoice,sale_exception_state:0"
+msgctxt "selection:account.invoice,sale_exception_state:"
 msgid "Ignored"
 msgstr "Ignorado"
 
-msgctxt "selection:account.invoice,sale_exception_state:0"
+msgctxt "selection:account.invoice,sale_exception_state:"
 msgid "Recreated"
-msgstr "Rehecho"
+msgstr "Recreada"
 
-#, fuzzy
-msgctxt "selection:sale.configuration,sale_invoice_method:0"
+msgctxt "selection:sale.configuration,sale_invoice_method:"
 msgid "Manual"
 msgstr "Manual"
 
-#, fuzzy
-msgctxt "selection:sale.configuration,sale_invoice_method:0"
-msgid "On Order Confirmed"
-msgstr "Al confirmar la orden"
+msgctxt "selection:sale.configuration,sale_invoice_method:"
+msgid "On Order Processed"
+msgstr "Al procesar el pedido"
 
-#, fuzzy
-msgctxt "selection:sale.configuration,sale_invoice_method:0"
+msgctxt "selection:sale.configuration,sale_invoice_method:"
 msgid "On Shipment Sent"
-msgstr "Al Enviarlo"
+msgstr "Al enviar"
 
-#, fuzzy
-msgctxt "selection:sale.configuration,sale_shipment_method:0"
+msgctxt "selection:sale.configuration,sale_shipment_method:"
 msgid "Manual"
 msgstr "Manual"
 
-#, fuzzy
-msgctxt "selection:sale.configuration,sale_shipment_method:0"
+msgctxt "selection:sale.configuration,sale_shipment_method:"
 msgid "On Invoice Paid"
 msgstr "Al pagar la factura"
 
-#, fuzzy
-msgctxt "selection:sale.configuration,sale_shipment_method:0"
-msgid "On Order Confirmed"
-msgstr "Al confirmar la orden"
+msgctxt "selection:sale.configuration,sale_shipment_method:"
+msgid "On Order Processed"
+msgstr "Al procesar el pedido"
 
-msgctxt "selection:sale.line,type:0"
+msgctxt "selection:sale.line,type:"
 msgid "Comment"
 msgstr "Comentario"
 
-msgctxt "selection:sale.line,type:0"
+msgctxt "selection:sale.line,type:"
 msgid "Line"
 msgstr "Línea"
 
-msgctxt "selection:sale.line,type:0"
+msgctxt "selection:sale.line,type:"
 msgid "Subtotal"
 msgstr "Subtotal"
 
-msgctxt "selection:sale.line,type:0"
+msgctxt "selection:sale.line,type:"
 msgid "Title"
 msgstr "Título"
 
-msgctxt "selection:sale.sale,invoice_method:0"
+msgctxt "selection:sale.sale,invoice_method:"
 msgid "Manual"
 msgstr "Manual"
 
-msgctxt "selection:sale.sale,invoice_method:0"
-msgid "On Order Confirmed"
-msgstr "Al confirmar la orden"
+msgctxt "selection:sale.sale,invoice_method:"
+msgid "On Order Processed"
+msgstr "Al procesar el pedido"
 
-msgctxt "selection:sale.sale,invoice_method:0"
+msgctxt "selection:sale.sale,invoice_method:"
 msgid "On Shipment Sent"
-msgstr "Al Enviarlo"
+msgstr "Al enviar"
 
-msgctxt "selection:sale.sale,invoice_state:0"
+msgctxt "selection:sale.sale,invoice_state:"
 msgid "Exception"
 msgstr "Excepción"
 
-msgctxt "selection:sale.sale,invoice_state:0"
+msgctxt "selection:sale.sale,invoice_state:"
 msgid "None"
 msgstr "Ninguno"
 
-msgctxt "selection:sale.sale,invoice_state:0"
+msgctxt "selection:sale.sale,invoice_state:"
 msgid "Paid"
-msgstr "Pagado"
+msgstr "Pagada"
 
-msgctxt "selection:sale.sale,invoice_state:0"
+msgctxt "selection:sale.sale,invoice_state:"
 msgid "Waiting"
 msgstr "En espera"
 
-msgctxt "selection:sale.sale,shipment_method:0"
+msgctxt "selection:sale.sale,shipment_method:"
 msgid "Manual"
 msgstr "Manual"
 
-msgctxt "selection:sale.sale,shipment_method:0"
+msgctxt "selection:sale.sale,shipment_method:"
 msgid "On Invoice Paid"
 msgstr "Al pagar la factura"
 
-msgctxt "selection:sale.sale,shipment_method:0"
-msgid "On Order Confirmed"
-msgstr "Al confirmar la orden"
+msgctxt "selection:sale.sale,shipment_method:"
+msgid "On Order Processed"
+msgstr "Al procesar el pedido"
 
-msgctxt "selection:sale.sale,shipment_state:0"
+msgctxt "selection:sale.sale,shipment_state:"
 msgid "Exception"
 msgstr "Excepción"
 
-msgctxt "selection:sale.sale,shipment_state:0"
+msgctxt "selection:sale.sale,shipment_state:"
 msgid "None"
 msgstr "Ninguno"
 
-msgctxt "selection:sale.sale,shipment_state:0"
+msgctxt "selection:sale.sale,shipment_state:"
 msgid "Sent"
-msgstr "Enviado"
+msgstr "Enviada"
 
-msgctxt "selection:sale.sale,shipment_state:0"
+msgctxt "selection:sale.sale,shipment_state:"
 msgid "Waiting"
 msgstr "En espera"
 
-msgctxt "selection:sale.sale,state:0"
+msgctxt "selection:sale.sale,state:"
 msgid "Canceled"
-msgstr "Cancelado"
+msgstr "Cancelada"
 
-msgctxt "selection:sale.sale,state:0"
+msgctxt "selection:sale.sale,state:"
 msgid "Confirmed"
-msgstr "Confirmado"
+msgstr "Confirmada"
 
-msgctxt "selection:sale.sale,state:0"
+msgctxt "selection:sale.sale,state:"
 msgid "Done"
-msgstr "Terminada"
+msgstr "Realizada"
 
-msgctxt "selection:sale.sale,state:0"
+msgctxt "selection:sale.sale,state:"
 msgid "Draft"
 msgstr "Borrador"
 
-msgctxt "selection:sale.sale,state:0"
+msgctxt "selection:sale.sale,state:"
+msgid "Processing"
+msgstr "En proceso"
+
+msgctxt "selection:sale.sale,state:"
 msgid "Quotation"
 msgstr "Presupuesto"
 
-msgctxt "selection:stock.move,sale_exception_state:0"
+msgctxt "selection:stock.move,sale_exception_state:"
 msgid ""
 msgstr ""
 
-msgctxt "selection:stock.move,sale_exception_state:0"
+msgctxt "selection:stock.move,sale_exception_state:"
 msgid "Ignored"
 msgstr "Ignorado"
 
-msgctxt "selection:stock.move,sale_exception_state:0"
+msgctxt "selection:stock.move,sale_exception_state:"
 msgid "Recreated"
-msgstr "Rehacer"
+msgstr "Recreado"
 
-msgctxt "view:product.product:0"
+msgctxt "view:product.product:"
 msgid "Customers"
 msgstr "Clientes"
 
-msgctxt "view:product.template:0"
+msgctxt "view:product.product:"
+msgid "Products"
+msgstr "Productos"
+
+msgctxt "view:product.template:"
 msgid "Customers"
 msgstr "Clientes"
 
-msgctxt "view:sale.configuration:0"
+msgctxt "view:sale.configuration:"
 msgid "Sale Configuration"
-msgstr ""
+msgstr "Configuración pedidos de venta"
 
-msgctxt "view:sale.handle.invoice.exception.ask:0"
+msgctxt "view:sale.handle.invoice.exception.ask:"
 msgid "Choose invoices to recreate"
-msgstr "Escoja una factura a rehacer"
+msgstr "Seleccione facturas a recrear"
 
-msgctxt "view:sale.handle.invoice.exception.ask:0"
+msgctxt "view:sale.handle.invoice.exception.ask:"
 msgid "Handle Invoice Exception"
-msgstr "Excepción de manejo de factura"
+msgstr "Gestionar excepción de factura"
 
-msgctxt "view:sale.handle.shipment.exception.ask:0"
+msgctxt "view:sale.handle.shipment.exception.ask:"
 msgid "Choose move to recreate"
-msgstr "Escoja un movimiento a rehacer"
+msgstr "Seleccione movimientos a recrear"
 
-msgctxt "view:sale.handle.shipment.exception.ask:0"
+msgctxt "view:sale.handle.shipment.exception.ask:"
 msgid "Handle shipment Exception"
-msgstr "Manejar excepción de envio"
+msgstr "Gestionar excepción de envío"
 
-msgctxt "view:sale.handle.shipment.exception.ask:0"
+msgctxt "view:sale.handle.shipment.exception.ask:"
 msgid "Recreate Moves"
 msgstr "Recrear movimientos"
 
-msgctxt "view:sale.line:0"
+msgctxt "view:sale.line:"
 msgid "General"
 msgstr "General"
 
-msgctxt "view:sale.line:0"
+msgctxt "view:sale.line:"
 msgid "Notes"
 msgstr "Notas"
 
-msgctxt "view:sale.line:0"
+msgctxt "view:sale.line:"
 msgid "Products"
 msgstr "Productos"
 
-msgctxt "view:sale.line:0"
+msgctxt "view:sale.line:"
 msgid "Sale Line"
 msgstr "Línea de venta"
 
-msgctxt "view:sale.line:0"
+msgctxt "view:sale.line:"
 msgid "Sale Lines"
 msgstr "Líneas de venta"
 
-msgctxt "view:sale.sale:0"
+msgctxt "view:sale.sale:"
 msgid "Cancel"
 msgstr "Cancelar"
 
-msgctxt "view:sale.sale:0"
+msgctxt "view:sale.sale:"
 msgid "Confirm"
 msgstr "Confirmar"
 
-msgctxt "view:sale.sale:0"
+msgctxt "view:sale.sale:"
 msgid "Draft"
 msgstr "Borrador"
 
-msgctxt "view:sale.sale:0"
+msgctxt "view:sale.sale:"
 msgid "Handle Invoice Exception"
-msgstr "Manejar excepción de factura"
+msgstr "Gestionar excepción de factura"
 
-msgctxt "view:sale.sale:0"
+msgctxt "view:sale.sale:"
 msgid "Handle Shipment Exception"
-msgstr "Manejar excepción de envio"
+msgstr "Gestionar excepción de envío"
 
-msgctxt "view:sale.sale:0"
+msgctxt "view:sale.sale:"
 msgid "Ignore Invoice Exception"
 msgstr "Ignorar excepción de factura"
 
-msgctxt "view:sale.sale:0"
+msgctxt "view:sale.sale:"
 msgid "Invoices"
 msgstr "Facturas"
 
-msgctxt "view:sale.sale:0"
+msgctxt "view:sale.sale:"
 msgid "Lines"
 msgstr "Líneas"
 
-msgctxt "view:sale.sale:0"
+msgctxt "view:sale.sale:"
 msgid "Moves"
 msgstr "Movimientos"
 
-msgctxt "view:sale.sale:0"
+msgctxt "view:sale.sale:"
 msgid "Other Info"
 msgstr "Información adicional"
 
-msgctxt "view:sale.sale:0"
+msgctxt "view:sale.sale:"
+msgid "Process"
+msgstr "Procesar"
+
+msgctxt "view:sale.sale:"
 msgid "Quotation"
 msgstr "Presupuesto"
 
-msgctxt "view:sale.sale:0"
+msgctxt "view:sale.sale:"
+msgid "Quote"
+msgstr "Presupuesto"
+
+msgctxt "view:sale.sale:"
 msgid "Sale"
 msgstr "Venta"
 
-msgctxt "view:sale.sale:0"
+msgctxt "view:sale.sale:"
 msgid "Sales"
 msgstr "Ventas"
 
-msgctxt "view:sale.sale:0"
+msgctxt "view:sale.sale:"
 msgid "Shipments"
-msgstr "Envios"
+msgstr "Albaranes"
+
+msgctxt "view:stock.move:"
+msgid "Moves"
+msgstr "Movimientos"
 
-msgctxt "wizard_button:sale.handle.invoice.exception,init,end:0"
+msgctxt "wizard_button:sale.handle.invoice.exception,ask,end:"
 msgid "Cancel"
 msgstr "Cancelar"
 
-msgctxt "wizard_button:sale.handle.invoice.exception,init,ok:0"
+msgctxt "wizard_button:sale.handle.invoice.exception,ask,handle:"
 msgid "Ok"
 msgstr "Aceptar"
 
-msgctxt "wizard_button:sale.handle.shipment.exception,init,end:0"
+msgctxt "wizard_button:sale.handle.shipment.exception,ask,end:"
 msgid "Cancel"
 msgstr "Cancelar"
 
-msgctxt "wizard_button:sale.handle.shipment.exception,init,ok:0"
+msgctxt "wizard_button:sale.handle.shipment.exception,ask,handle:"
 msgid "Ok"
 msgstr "Aceptar"
diff --git a/locale/fr_FR.po b/locale/fr_FR.po
index 6f87b06..d99cfdb 100644
--- a/locale/fr_FR.po
+++ b/locale/fr_FR.po
@@ -2,404 +2,681 @@
 msgid ""
 msgstr "Content-Type: text/plain; charset=utf-8\n"
 
-msgctxt "error:account.invoice:0"
+msgctxt "error:account.invoice:"
 msgid "You can not delete invoices that come from a sale!"
 msgstr "Vous ne pouvez pas supprimer une facture qui provient d'une vente"
 
-msgctxt "error:account.invoice:0"
+msgctxt "error:account.invoice:"
+msgid "You can not delete invoices that come from a sale!"
+msgstr "Vous ne pouvez pas supprimer une facture qui provient d'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: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:0"
+msgctxt "error:sale.line:"
 msgid "It misses an \"Account Revenue\" on product \"%s\"!"
 msgstr "Il manque un compte de produits sur le produit \"%s\" !"
 
-msgctxt "error:sale.line:0"
+msgctxt "error:sale.line:"
+msgid "It misses an \"Account Revenue\" on product \"%s\"!"
+msgstr "Il manque un compte de produits sur le produit \"%s\" !"
+
+msgctxt "error:sale.line:"
+msgid "It misses an \"account Revenue\" default property!"
+msgstr "il manque une propriété par défaut \"compte de produits\" !"
+
+msgctxt "error:sale.line:"
 msgid "It misses an \"account Revenue\" default property!"
 msgstr "il manque une propriété par défaut \"compte de produits\" !"
 
-msgctxt "error:sale.line:0"
+msgctxt "error:sale.line:"
 msgid "The customer location is required!"
 msgstr "L'emplacement client est requis !"
 
-msgctxt "error:sale.sale:0"
+msgctxt "error:sale.line:"
+msgid "The customer location is required!"
+msgstr "L'emplacement client est requis !"
+
+msgctxt "error:sale.sale:"
 msgid "Invoice and Shipment addresses must be defined for the quotation."
 msgstr ""
 "Les adresses de facturation et d'expédition sont requises pour le devis."
 
-msgctxt "error:sale.sale:0"
+msgctxt "error:sale.sale:"
+msgid "Invoice and Shipment addresses must be defined for the quotation."
+msgstr ""
+"Les adresses de facturation et d'expédition sont requises pour le devis."
+
+msgctxt "error:sale.sale:"
 msgid "It misses an \"Account Receivable\" on the party \"%s\"!"
 msgstr "Il manque un compte à recevoir sur le tiers \"%s\" !"
 
-msgctxt "error:sale.sale:0"
+msgctxt "error:sale.sale:"
+msgid "It misses an \"Account Receivable\" on the party \"%s\"!"
+msgstr "Il manque un compte à recevoir sur le tiers \"%s\" !"
+
+msgctxt "error:sale.sale:"
+msgid "Sale \"%s\" must be cancelled before deletion!"
+msgstr "La vente \"%s\" doit être annulée avant suppression"
+
+msgctxt "error:sale.sale:"
+msgid "Warehouse must be defined for the quotation."
+msgstr "L'entrepôt doit être défini pour le devis"
+
+msgctxt "error:sale.sale:"
+msgid "Wrong combination of method!"
+msgstr "Mauvaise combinaison de méthodes !"
+
+msgctxt "error:sale.sale:"
 msgid "Wrong combination of method!"
 msgstr "Mauvaise combinaison de méthodes !"
 
-msgctxt "error:stock.shipment.out:0"
+msgctxt "error:stock.shipment.out.return:"
 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:0"
+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"
 
-msgctxt "field:account.invoice,sales:0"
+msgctxt "field:account.invoice,sales:"
 msgid "Sales"
 msgstr "Ventes"
 
-msgctxt "field:account.invoice.line,sale_lines:0"
+msgctxt "field:account.invoice.line,sale_lines:"
 msgid "Sale Lines"
 msgstr "Lignes de vente"
 
-msgctxt "field:product.template,delivery_time:0"
+msgctxt "field:product.template,delivery_time:"
 msgid "Delivery Time"
 msgstr "Délai de livraison"
 
-msgctxt "field:product.template,salable:0"
+msgctxt "field:product.template,salable:"
 msgid "Salable"
 msgstr "Vendable"
 
-msgctxt "field:product.template,sale_uom:0"
+msgctxt "field:product.template,sale_uom:"
 msgid "Sale UOM"
 msgstr "UDM de vente"
 
-msgctxt "field:sale.configuration,rec_name:0"
+msgctxt "field:sale.configuration,create_date:"
+msgid "Create Date"
+msgstr "Date de création"
+
+msgctxt "field:sale.configuration,create_uid:"
+msgid "Create User"
+msgstr "Créé par"
+
+msgctxt "field:sale.configuration,id:"
+msgid "ID"
+msgstr "ID"
+
+msgctxt "field:sale.configuration,rec_name:"
 msgid "Name"
 msgstr "Nom"
 
-msgctxt "field:sale.configuration,sale_invoice_method:0"
+msgctxt "field:sale.configuration,sale_invoice_method:"
 msgid "Sale Invoice Method"
 msgstr "Facturation"
 
-msgctxt "field:sale.configuration,sale_sequence:0"
+msgctxt "field:sale.configuration,sale_sequence:"
 msgid "Sale Reference Sequence"
 msgstr "Séquence de référence de vente"
 
-msgctxt "field:sale.configuration,sale_shipment_method:0"
+msgctxt "field:sale.configuration,sale_shipment_method:"
 msgid "Sale Shipment Method"
 msgstr "Expédition"
 
-msgctxt "field:sale.handle.invoice.exception.ask,domain_invoices:0"
+msgctxt "field:sale.configuration,write_date:"
+msgid "Write Date"
+msgstr "Date de mise à jour"
+
+msgctxt "field:sale.configuration,write_uid:"
+msgid "Write User"
+msgstr "Mis à jour par"
+
+msgctxt "field:sale.handle.invoice.exception.ask,domain_invoices:"
 msgid "Domain Invoices"
 msgstr "Domaine des factures"
 
-msgctxt "field:sale.handle.invoice.exception.ask,recreate_invoices:0"
+msgctxt "field:sale.handle.invoice.exception.ask,id:"
+msgid "ID"
+msgstr "ID"
+
+msgctxt "field:sale.handle.invoice.exception.ask,recreate_invoices:"
 msgid "Recreate Invoices"
 msgstr "Recréer les factures"
 
-msgctxt "field:sale.handle.shipment.exception.ask,domain_moves:0"
+msgctxt "field:sale.handle.shipment.exception.ask,domain_moves:"
 msgid "Domain Moves"
 msgstr "Domaine des mouvements"
 
-msgctxt "field:sale.handle.shipment.exception.ask,recreate_moves:0"
+msgctxt "field:sale.handle.shipment.exception.ask,id:"
+msgid "ID"
+msgstr "ID"
+
+msgctxt "field:sale.handle.shipment.exception.ask,recreate_moves:"
 msgid "Recreate Moves"
 msgstr "Recréer les mouvements"
 
-msgctxt "field:sale.line,amount:0"
+msgctxt "field:sale.line,amount:"
 msgid "Amount"
 msgstr "Montant"
 
-msgctxt "field:sale.line,description:0"
+msgctxt "field:sale.line,create_date:"
+msgid "Create Date"
+msgstr "Date de création"
+
+msgctxt "field:sale.line,create_uid:"
+msgid "Create User"
+msgstr "Créé par"
+
+msgctxt "field:sale.line,delivery_date:"
+msgid "Delivery Date"
+msgstr "Date de livraison"
+
+msgctxt "field:sale.line,description:"
 msgid "Description"
 msgstr "Description"
 
-msgctxt "field:sale.line,invoice_lines:0"
+msgctxt "field:sale.line,from_location:"
+msgid "From Location"
+msgstr "Emplacement d'origine"
+
+msgctxt "field:sale.line,id:"
+msgid "ID"
+msgstr "ID"
+
+msgctxt "field:sale.line,invoice_lines:"
 msgid "Invoice Lines"
 msgstr "Lignes de facture"
 
-msgctxt "field:sale.line,move_done:0"
+msgctxt "field:sale.line,move_done:"
 msgid "Moves Done"
 msgstr "Mouvements effectués"
 
-msgctxt "field:sale.line,move_exception:0"
+msgctxt "field:sale.line,move_exception:"
 msgid "Moves Exception"
 msgstr "Mouvements en exception"
 
-msgctxt "field:sale.line,moves:0"
+msgctxt "field:sale.line,moves:"
 msgid "Moves"
 msgstr "Mouvements"
 
-msgctxt "field:sale.line,moves_ignored:0"
+msgctxt "field:sale.line,moves_ignored:"
 msgid "Ignored Moves"
 msgstr "Mouvements ignorés"
 
-msgctxt "field:sale.line,moves_recreated:0"
+msgctxt "field:sale.line,moves_recreated:"
 msgid "Recreated Moves"
 msgstr "Mouvements recréés"
 
-msgctxt "field:sale.line,note:0"
+msgctxt "field:sale.line,note:"
 msgid "Note"
 msgstr "Note"
 
-msgctxt "field:sale.line,product:0"
+msgctxt "field:sale.line,product:"
 msgid "Product"
 msgstr "Produit"
 
-msgctxt "field:sale.line,quantity:0"
+msgctxt "field:sale.line,product_uom_category:"
+msgid "Product Uom Category"
+msgstr "Catégorie d'unité de mesure"
+
+msgctxt "field:sale.line,quantity:"
 msgid "Quantity"
 msgstr "Quantité"
 
-msgctxt "field:sale.line,rec_name:0"
+msgctxt "field:sale.line,rec_name:"
 msgid "Name"
 msgstr "Nom"
 
-msgctxt "field:sale.line,sale:0"
+msgctxt "field:sale.line,sale:"
 msgid "Sale"
 msgstr "Vente"
 
-msgctxt "field:sale.line,sequence:0"
+msgctxt "field:sale.line,sequence:"
 msgid "Sequence"
 msgstr "Séquence"
 
-msgctxt "field:sale.line,taxes:0"
+msgctxt "field:sale.line,taxes:"
 msgid "Taxes"
 msgstr "Taxes"
 
-msgctxt "field:sale.line,type:0"
+msgctxt "field:sale.line,to_location:"
+msgid "To Location"
+msgstr "Emplacement de destination"
+
+msgctxt "field:sale.line,type:"
 msgid "Type"
 msgstr "Type"
 
-msgctxt "field:sale.line,unit:0"
+msgctxt "field:sale.line,unit:"
 msgid "Unit"
 msgstr "Unité"
 
-msgctxt "field:sale.line,unit_digits:0"
+msgctxt "field:sale.line,unit_digits:"
 msgid "Unit Digits"
 msgstr "Décimales de l'unité"
 
-msgctxt "field:sale.line,unit_price:0"
+msgctxt "field:sale.line,unit_price:"
 msgid "Unit Price"
 msgstr "Prix unitaire"
 
-msgctxt "field:sale.line-account.invoice.line,invoice_line:0"
+msgctxt "field:sale.line,warehouse:"
+msgid "Warehouse"
+msgstr "Entrepôt"
+
+msgctxt "field:sale.line,write_date:"
+msgid "Write Date"
+msgstr "Date de mise à jour"
+
+msgctxt "field:sale.line,write_uid:"
+msgid "Write User"
+msgstr "Mis à jour par"
+
+msgctxt "field:sale.line-account.invoice.line,create_date:"
+msgid "Create Date"
+msgstr "Date de création"
+
+msgctxt "field:sale.line-account.invoice.line,create_uid:"
+msgid "Create User"
+msgstr "Créé par"
+
+msgctxt "field:sale.line-account.invoice.line,id:"
+msgid "ID"
+msgstr "ID"
+
+msgctxt "field:sale.line-account.invoice.line,invoice_line:"
 msgid "Invoice Line"
 msgstr "Ligne de facture"
 
-msgctxt "field:sale.line-account.invoice.line,rec_name:0"
+msgctxt "field:sale.line-account.invoice.line,rec_name:"
 msgid "Name"
 msgstr "Nom"
 
-msgctxt "field:sale.line-account.invoice.line,sale_line:0"
+msgctxt "field:sale.line-account.invoice.line,sale_line:"
 msgid "Sale Line"
 msgstr "Ligne de vente"
 
-msgctxt "field:sale.line-account.tax,line:0"
+msgctxt "field:sale.line-account.invoice.line,write_date:"
+msgid "Write Date"
+msgstr "Date de mise à jour"
+
+msgctxt "field:sale.line-account.invoice.line,write_uid:"
+msgid "Write User"
+msgstr "Mis à jour par"
+
+msgctxt "field:sale.line-account.tax,create_date:"
+msgid "Create Date"
+msgstr "Date de création"
+
+msgctxt "field:sale.line-account.tax,create_uid:"
+msgid "Create User"
+msgstr "Créé par"
+
+msgctxt "field:sale.line-account.tax,id:"
+msgid "ID"
+msgstr "ID"
+
+msgctxt "field:sale.line-account.tax,line:"
 msgid "Sale Line"
 msgstr "Ligne de vente"
 
-msgctxt "field:sale.line-account.tax,rec_name:0"
+msgctxt "field:sale.line-account.tax,rec_name:"
 msgid "Name"
 msgstr "Nom"
 
-msgctxt "field:sale.line-account.tax,tax:0"
+msgctxt "field:sale.line-account.tax,tax:"
 msgid "Tax"
 msgstr "Taxe"
 
-msgctxt "field:sale.line-ignored-stock.move,move:0"
+msgctxt "field:sale.line-account.tax,write_date:"
+msgid "Write Date"
+msgstr "Date de mise à jour"
+
+msgctxt "field:sale.line-account.tax,write_uid:"
+msgid "Write User"
+msgstr "Mis à jour par"
+
+msgctxt "field:sale.line-ignored-stock.move,create_date:"
+msgid "Create Date"
+msgstr "Date de création"
+
+msgctxt "field:sale.line-ignored-stock.move,create_uid:"
+msgid "Create User"
+msgstr "Créé par"
+
+msgctxt "field:sale.line-ignored-stock.move,id:"
+msgid "ID"
+msgstr "ID"
+
+msgctxt "field:sale.line-ignored-stock.move,move:"
 msgid "Move"
 msgstr "Mouvement"
 
-msgctxt "field:sale.line-ignored-stock.move,rec_name:0"
+msgctxt "field:sale.line-ignored-stock.move,rec_name:"
 msgid "Name"
 msgstr "Nom"
 
-msgctxt "field:sale.line-ignored-stock.move,sale_line:0"
+msgctxt "field:sale.line-ignored-stock.move,sale_line:"
 msgid "Sale Line"
 msgstr "Ligne de vente"
 
-msgctxt "field:sale.line-recreated-stock.move,move:0"
+msgctxt "field:sale.line-ignored-stock.move,write_date:"
+msgid "Write Date"
+msgstr "Date de mise à jour"
+
+msgctxt "field:sale.line-ignored-stock.move,write_uid:"
+msgid "Write User"
+msgstr "Mis à jour par"
+
+msgctxt "field:sale.line-recreated-stock.move,create_date:"
+msgid "Create Date"
+msgstr "Date de création"
+
+msgctxt "field:sale.line-recreated-stock.move,create_uid:"
+msgid "Create User"
+msgstr "Créé par"
+
+msgctxt "field:sale.line-recreated-stock.move,id:"
+msgid "ID"
+msgstr "ID"
+
+msgctxt "field:sale.line-recreated-stock.move,move:"
 msgid "Move"
 msgstr "Mouvement"
 
-msgctxt "field:sale.line-recreated-stock.move,rec_name:0"
+msgctxt "field:sale.line-recreated-stock.move,rec_name:"
 msgid "Name"
 msgstr "Nom"
 
-msgctxt "field:sale.line-recreated-stock.move,sale_line:0"
+msgctxt "field:sale.line-recreated-stock.move,sale_line:"
 msgid "Sale Line"
 msgstr "Ligne de vente"
 
-msgctxt "field:sale.sale,comment:0"
+msgctxt "field:sale.line-recreated-stock.move,write_date:"
+msgid "Write Date"
+msgstr "Date de mise à jour"
+
+msgctxt "field:sale.line-recreated-stock.move,write_uid:"
+msgid "Write User"
+msgstr "Mis à jour par"
+
+msgctxt "field:sale.sale,comment:"
 msgid "Comment"
 msgstr "Commentaire"
 
-msgctxt "field:sale.sale,company:0"
+msgctxt "field:sale.sale,company:"
 msgid "Company"
 msgstr "Companie"
 
-msgctxt "field:sale.sale,currency:0"
+msgctxt "field:sale.sale,create_date:"
+msgid "Create Date"
+msgstr "Date de création"
+
+msgctxt "field:sale.sale,create_uid:"
+msgid "Create User"
+msgstr "Créé par"
+
+msgctxt "field:sale.sale,currency:"
 msgid "Currency"
 msgstr "Devise"
 
-msgctxt "field:sale.sale,currency_digits:0"
+msgctxt "field:sale.sale,currency_digits:"
 msgid "Currency Digits"
 msgstr "Décimales de la devise"
 
-msgctxt "field:sale.sale,description:0"
+msgctxt "field:sale.sale,description:"
 msgid "Description"
 msgstr "Description"
 
-msgctxt "field:sale.sale,invoice_address:0"
+msgctxt "field:sale.sale,id:"
+msgid "ID"
+msgstr "ID"
+
+msgctxt "field:sale.sale,invoice_address:"
 msgid "Invoice Address"
 msgstr "Adresse de facturation"
 
-msgctxt "field:sale.sale,invoice_exception:0"
-msgid "Invoices Exception"
-msgstr "Factures en exception"
-
-msgctxt "field:sale.sale,invoice_method:0"
+msgctxt "field:sale.sale,invoice_method:"
 msgid "Invoice Method"
 msgstr "Méthode de facturation"
 
-msgctxt "field:sale.sale,invoice_paid:0"
-msgid "Invoices Paid"
-msgstr "Factures payées"
-
-msgctxt "field:sale.sale,invoice_state:0"
+msgctxt "field:sale.sale,invoice_state:"
 msgid "Invoice State"
 msgstr "État de la factutre"
 
-msgctxt "field:sale.sale,invoices:0"
+msgctxt "field:sale.sale,invoices:"
 msgid "Invoices"
 msgstr "Factures"
 
-msgctxt "field:sale.sale,invoices_ignored:0"
+msgctxt "field:sale.sale,invoices_ignored:"
 msgid "Ignored Invoices"
 msgstr "Factures ignorées"
 
-msgctxt "field:sale.sale,invoices_recreated:0"
+msgctxt "field:sale.sale,invoices_recreated:"
 msgid "Recreated Invoices"
 msgstr "Factures recréées"
 
-msgctxt "field:sale.sale,lines:0"
+msgctxt "field:sale.sale,lines:"
 msgid "Lines"
 msgstr "Lignes"
 
-msgctxt "field:sale.sale,moves:0"
+msgctxt "field:sale.sale,moves:"
 msgid "Moves"
 msgstr "Mouvements"
 
-msgctxt "field:sale.sale,party:0"
+msgctxt "field:sale.sale,party:"
 msgid "Party"
 msgstr "Tiers"
 
-msgctxt "field:sale.sale,party_lang:0"
+msgctxt "field:sale.sale,party_lang:"
 msgid "Party Language"
 msgstr "Langue du tiers"
 
-msgctxt "field:sale.sale,payment_term:0"
+msgctxt "field:sale.sale,payment_term:"
 msgid "Payment Term"
 msgstr "Conditions de paiement"
 
-msgctxt "field:sale.sale,rec_name:0"
+msgctxt "field:sale.sale,rec_name:"
 msgid "Name"
 msgstr "Nom"
 
-msgctxt "field:sale.sale,reference:0"
+msgctxt "field:sale.sale,reference:"
 msgid "Reference"
 msgstr "Référence"
 
-msgctxt "field:sale.sale,sale_date:0"
+msgctxt "field:sale.sale,sale_date:"
 msgid "Sale Date"
 msgstr "Date de la vente"
 
-msgctxt "field:sale.sale,shipment_address:0"
+msgctxt "field:sale.sale,shipment_address:"
 msgid "Shipment Address"
 msgstr "Adresse de livraison"
 
-msgctxt "field:sale.sale,shipment_done:0"
-msgid "Shipment Done"
-msgstr "Expédition effectuée"
-
-msgctxt "field:sale.sale,shipment_exception:0"
-msgid "Shipments Exception"
-msgstr "Expéditions en exception"
-
-msgctxt "field:sale.sale,shipment_method:0"
+msgctxt "field:sale.sale,shipment_method:"
 msgid "Shipment Method"
 msgstr "Méthode de livraison"
 
-msgctxt "field:sale.sale,shipment_state:0"
+msgctxt "field:sale.sale,shipment_returns:"
+msgid "Shipment Returns"
+msgstr "Retour d'expédition"
+
+msgctxt "field:sale.sale,shipment_state:"
 msgid "Shipment State"
 msgstr "État de l'expédition"
 
-msgctxt "field:sale.sale,shipments:0"
+msgctxt "field:sale.sale,shipments:"
 msgid "Shipments"
 msgstr "Expédition"
 
-msgctxt "field:sale.sale,state:0"
+msgctxt "field:sale.sale,state:"
 msgid "State"
 msgstr "État"
 
-msgctxt "field:sale.sale,tax_amount:0"
+msgctxt "field:sale.sale,tax_amount:"
 msgid "Tax"
 msgstr "Taxe"
 
-msgctxt "field:sale.sale,total_amount:0"
+msgctxt "field:sale.sale,tax_amount_cache:"
+msgid "Tax Cache"
+msgstr "Cache des taxes"
+
+msgctxt "field:sale.sale,total_amount:"
 msgid "Total"
 msgstr "Total"
 
-msgctxt "field:sale.sale,untaxed_amount:0"
+msgctxt "field:sale.sale,total_amount_cache:"
+msgid "Total Tax"
+msgstr "Total des taxes"
+
+msgctxt "field:sale.sale,untaxed_amount:"
 msgid "Untaxed"
 msgstr "Non-taxé"
 
-msgctxt "field:sale.sale,warehouse:0"
+msgctxt "field:sale.sale,untaxed_amount_cache:"
+msgid "Untaxed Cache"
+msgstr "Cache hors taxe"
+
+msgctxt "field:sale.sale,warehouse:"
 msgid "Warehouse"
 msgstr "Entrepôt"
 
-msgctxt "field:sale.sale-account.invoice,invoice:0"
+msgctxt "field:sale.sale,write_date:"
+msgid "Write Date"
+msgstr "Date de mise à jour"
+
+msgctxt "field:sale.sale,write_uid:"
+msgid "Write User"
+msgstr "Mis à jour par"
+
+msgctxt "field:sale.sale-account.invoice,create_date:"
+msgid "Create Date"
+msgstr "Date de création"
+
+msgctxt "field:sale.sale-account.invoice,create_uid:"
+msgid "Create User"
+msgstr "Créé par"
+
+msgctxt "field:sale.sale-account.invoice,id:"
+msgid "ID"
+msgstr "ID"
+
+msgctxt "field:sale.sale-account.invoice,invoice:"
 msgid "Invoice"
 msgstr "Facture"
 
-msgctxt "field:sale.sale-account.invoice,rec_name:0"
+msgctxt "field:sale.sale-account.invoice,rec_name:"
 msgid "Name"
 msgstr "Nom"
 
-msgctxt "field:sale.sale-account.invoice,sale:0"
+msgctxt "field:sale.sale-account.invoice,sale:"
 msgid "Sale"
 msgstr "Vente"
 
-msgctxt "field:sale.sale-ignored-account.invoice,invoice:0"
+msgctxt "field:sale.sale-account.invoice,write_date:"
+msgid "Write Date"
+msgstr "Date de mise à jour"
+
+msgctxt "field:sale.sale-account.invoice,write_uid:"
+msgid "Write User"
+msgstr "Mis à jour par"
+
+msgctxt "field:sale.sale-ignored-account.invoice,create_date:"
+msgid "Create Date"
+msgstr "Date de création"
+
+msgctxt "field:sale.sale-ignored-account.invoice,create_uid:"
+msgid "Create User"
+msgstr "Créé par"
+
+msgctxt "field:sale.sale-ignored-account.invoice,id:"
+msgid "ID"
+msgstr "ID"
+
+msgctxt "field:sale.sale-ignored-account.invoice,invoice:"
 msgid "Invoice"
 msgstr "Facture"
 
-msgctxt "field:sale.sale-ignored-account.invoice,rec_name:0"
+msgctxt "field:sale.sale-ignored-account.invoice,rec_name:"
 msgid "Name"
 msgstr "Nom"
 
-msgctxt "field:sale.sale-ignored-account.invoice,sale:0"
+msgctxt "field:sale.sale-ignored-account.invoice,sale:"
 msgid "Sale"
 msgstr "Vente"
 
-msgctxt "field:sale.sale-recreated-account.invoice,invoice:0"
+msgctxt "field:sale.sale-ignored-account.invoice,write_date:"
+msgid "Write Date"
+msgstr "Date de mise à jour"
+
+msgctxt "field:sale.sale-ignored-account.invoice,write_uid:"
+msgid "Write User"
+msgstr "Mis à jour par"
+
+msgctxt "field:sale.sale-recreated-account.invoice,create_date:"
+msgid "Create Date"
+msgstr "Date de création"
+
+msgctxt "field:sale.sale-recreated-account.invoice,create_uid:"
+msgid "Create User"
+msgstr "Créé par"
+
+msgctxt "field:sale.sale-recreated-account.invoice,id:"
+msgid "ID"
+msgstr "ID"
+
+msgctxt "field:sale.sale-recreated-account.invoice,invoice:"
 msgid "Invoice"
 msgstr "Facture"
 
-msgctxt "field:sale.sale-recreated-account.invoice,rec_name:0"
+msgctxt "field:sale.sale-recreated-account.invoice,rec_name:"
 msgid "Name"
 msgstr "Nom"
 
-msgctxt "field:sale.sale-recreated-account.invoice,sale:0"
+msgctxt "field:sale.sale-recreated-account.invoice,sale:"
 msgid "Sale"
 msgstr "Vente"
 
-msgctxt "field:stock.move,sale:0"
+msgctxt "field:sale.sale-recreated-account.invoice,write_date:"
+msgid "Write Date"
+msgstr "Date de mise à jour"
+
+msgctxt "field:sale.sale-recreated-account.invoice,write_uid:"
+msgid "Write User"
+msgstr "Mis à jour par"
+
+msgctxt "field:stock.move,sale:"
 msgid "Sale"
 msgstr "Vente"
 
-msgctxt "field:stock.move,sale_exception_state:0"
+msgctxt "field:stock.move,sale_exception_state:"
 msgid "Exception State"
 msgstr "État d'exception"
 
-msgctxt "field:stock.move,sale_line:0"
+msgctxt "field:stock.move,sale_line:"
 msgid "Sale Line"
 msgstr "Ligne de vente"
 
-msgctxt "help:product.template,delivery_time:0"
+msgctxt "help:product.template,delivery_time:"
 msgid "In number of days"
 msgstr "En nombre de jours"
 
-msgctxt "help:sale.handle.invoice.exception.ask,recreate_invoices:0"
+msgctxt "help:sale.handle.invoice.exception.ask,recreate_invoices:"
 msgid ""
 "The selected invoices will be recreated. The other ones will be ignored."
 msgstr ""
@@ -413,6 +690,10 @@ msgctxt "model:ir.action,name:act_open_customer"
 msgid "Parties associated to Sales"
 msgstr "Tiers associés à des ventes"
 
+msgctxt "model:ir.action,name:act_return_form"
+msgid "Returns"
+msgstr "Retours"
+
 msgctxt "model:ir.action,name:act_sale_configuration_form"
 msgid "Sales Configuration"
 msgstr "Configuration des ventes"
@@ -433,6 +714,10 @@ msgctxt "model:ir.action,name:act_sale_form_draft"
 msgid "Draft Sales"
 msgstr "Ventes brouillon"
 
+msgctxt "model:ir.action,name:act_sale_form_processing"
+msgid "Processing Sales"
+msgstr "Ventes en cours de traitement"
+
 msgctxt "model:ir.action,name:act_sale_form_quotation"
 msgid "Quotation Sales"
 msgstr "Devis"
@@ -449,6 +734,10 @@ msgctxt "model:ir.action,name:wizard_invoice_handle_exception"
 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"
+
 msgctxt "model:ir.action,name:wizard_shipment_handle_exception"
 msgid "Handle Shipment Exception"
 msgstr "Gérer l'exception d'expédition"
@@ -489,6 +778,10 @@ msgctxt "model:ir.ui.menu,name:menu_sale_form_draft"
 msgid "Draft Sales"
 msgstr "Ventes brouillons"
 
+msgctxt "model:ir.ui.menu,name:menu_sale_form_processing"
+msgid "Processing Sales"
+msgstr "Ventes en cours de traitement"
+
 msgctxt "model:ir.ui.menu,name:menu_sale_form_quotation"
 msgid "Quotation Sales"
 msgstr "Devis"
@@ -501,502 +794,678 @@ msgctxt "model:res.group,name:group_sale_admin"
 msgid "Sales Administrator"
 msgstr "Administrateur des ventes"
 
-msgctxt "model:sale.configuration,name:0"
+msgctxt "model:sale.configuration,name:"
 msgid "Sale Configuration"
 msgstr "Configuration des ventes"
 
-msgctxt "model:sale.handle.invoice.exception.ask,name:0"
-msgid "Invoice Exception Ask"
+msgctxt "model:sale.handle.invoice.exception.ask,name:"
+msgid "Handle Invoice Exception"
 msgstr "Exception de facture - Demande"
 
-msgctxt "model:sale.handle.shipment.exception.ask,name:0"
-msgid "Shipment Exception Ask"
+msgctxt "model:sale.handle.shipment.exception.ask,name:"
+msgid "Handle Shipment Exception"
 msgstr "Exception d'expédition - Demande"
 
-msgctxt "model:sale.line,name:0"
+msgctxt "model:sale.line,name:"
 msgid "Sale Line"
 msgstr "Ligne de vente"
 
-msgctxt "model:sale.line-account.invoice.line,name:0"
+msgctxt "model:sale.line-account.invoice.line,name:"
 msgid "Sale Line - Invoice Line"
 msgstr "Ligne de vente - Ligne de facture"
 
-msgctxt "model:sale.line-account.tax,name:0"
+msgctxt "model:sale.line-account.tax,name:"
 msgid "Sale Line - Tax"
 msgstr "Ligne de vente - Taxe"
 
-msgctxt "model:sale.line-ignored-stock.move,name:0"
+msgctxt "model:sale.line-ignored-stock.move,name:"
 msgid "Sale Line - Ignored Move"
 msgstr "Ligne de vente - Mouvement ignoré"
 
-msgctxt "model:sale.line-recreated-stock.move,name:0"
+msgctxt "model:sale.line-recreated-stock.move,name:"
 msgid "Sale Line - Recreated Move"
 msgstr "Ligne de vente - Mouvement recréé"
 
-msgctxt "model:sale.sale,name:0"
+msgctxt "model:sale.sale,name:"
 msgid "Sale"
 msgstr "Vente"
 
-msgctxt "model:sale.sale-account.invoice,name:0"
+msgctxt "model:sale.sale-account.invoice,name:"
 msgid "Sale - Invoice"
 msgstr "Vente - Facture"
 
-msgctxt "model:sale.sale-ignored-account.invoice,name:0"
+msgctxt "model:sale.sale-ignored-account.invoice,name:"
 msgid "Sale - Ignored Invoice"
 msgstr "Vente - Facture Ignorée"
 
-msgctxt "model:sale.sale-recreated-account.invoice,name:0"
+msgctxt "model:sale.sale-recreated-account.invoice,name:"
 msgid "Sale - Recreated Invoice"
 msgstr "Vente - Facture recréée"
 
-msgctxt "model:workflow,name:sale_workflow"
-msgid "Sale workflow"
-msgstr "Workflow de vente"
-
-msgctxt "model:workflow.activity,name:sale_activity_cancel"
-msgid "Canceled"
-msgstr "Annulé"
-
-msgctxt "model:workflow.activity,name:sale_activity_confirmed"
-msgid "Confirmed"
-msgstr "Confirmé"
-
-msgctxt "model:workflow.activity,name:sale_activity_done"
-msgid "Done"
-msgstr "Fait"
-
-msgctxt "model:workflow.activity,name:sale_activity_draft"
-msgid "Draft"
-msgstr "Brouillon"
-
-msgctxt "model:workflow.activity,name:sale_activity_invoice_method"
-msgid "Invoice Method"
-msgstr "Méthode de facturation"
-
-msgctxt "model:workflow.activity,name:sale_activity_invoice_method_done"
-msgid "Invoice Method Done"
-msgstr "Méthode de facture faite"
-
-msgctxt "model:workflow.activity,name:sale_activity_invoice_sale_done"
-msgid "Invoice Done"
-msgstr "Facture faite"
-
-msgctxt "model:workflow.activity,name:sale_activity_invoice_sale_exception"
-msgid "Invoice Exception"
-msgstr "Facture en exception"
-
-msgctxt "model:workflow.activity,name:sale_activity_invoice_shipment"
-msgid "Invoice Shipment"
-msgstr "Facture expédition"
-
-msgctxt "model:workflow.activity,name:sale_activity_invoice_shipment_done"
-msgid "Invoice Shipment Done"
-msgstr "Facture expédition faite"
-
-msgctxt ""
-"model:workflow.activity,name:sale_activity_invoice_shipment_exception"
-msgid "Invoice Shipment Exception"
-msgstr "Facture expédition en exception"
-
-msgctxt "model:workflow.activity,name:sale_activity_invoice_shipment_method"
-msgid "Invoice Shipment Method"
-msgstr "Méthode facture expédition"
-
-msgctxt ""
-"model:workflow.activity,name:sale_activity_invoice_shipment_method_done"
-msgid "Invoice Shipment Method Done"
-msgstr "Méthode facture expédition faite"
-
-msgctxt "model:workflow.activity,name:sale_activity_quotation"
-msgid "Quotation"
-msgstr "Devis"
-
-msgctxt "model:workflow.activity,name:sale_activity_shipment"
-msgid "Shipment"
-msgstr "Expédition"
-
-msgctxt "model:workflow.activity,name:sale_activity_shipment_exception"
-msgid "Shipment Exception"
-msgstr "Expédition en exception"
-
-msgctxt "model:workflow.activity,name:sale_activity_shipment_invoice"
-msgid "Shipment Invoice"
-msgstr "Facture expédition"
-
-msgctxt "model:workflow.activity,name:sale_activity_shipment_invoice_done"
-msgid "Shipment Invoice Done"
-msgstr "Facture expédition faite"
-
-msgctxt ""
-"model:workflow.activity,name:sale_activity_shipment_invoice_exception"
-msgid "Shipment Invoice Exception"
-msgstr "Facture expédition en exception"
-
-msgctxt "model:workflow.activity,name:sale_activity_shipment_invoice_method"
-msgid "Shipment Invoice Method"
-msgstr "Méthode facture expédition"
-
-msgctxt ""
-"model:workflow.activity,name:sale_activity_shipment_invoice_method_done"
-msgid "Shipment Invoice Method Done"
-msgstr "Méthode facture expédition faite"
-
-msgctxt "model:workflow.activity,name:sale_activity_shipment_method"
-msgid "Shipment Method"
-msgstr "Méthode d'expédition"
-
-msgctxt "model:workflow.activity,name:sale_activity_shipment_method_done"
-msgid "Shipment Method Done"
-msgstr "Méthode d'expédition faite"
-
-msgctxt "model:workflow.activity,name:sale_activity_waiting_invoice_sale"
-msgid "Waiting Invoice"
-msgstr "Facture en attente"
-
-msgctxt "model:workflow.activity,name:sale_activity_waiting_invoice_shipment"
-msgid "Waiting Invoice Shipment"
-msgstr "Facture expédition en attente"
-
-msgctxt "model:workflow.activity,name:sale_activity_waiting_shipment"
-msgid "Waiting Shipment"
-msgstr "Expédition en attente"
-
-msgctxt "model:workflow.activity,name:sale_activity_waiting_shipment_invoice"
-msgid "Waiting Shipment Invoice"
-msgstr "Facture expédition en attente"
+msgctxt "odt:sale.sale:"
+msgid "Amount"
+msgstr "Montant"
 
-msgctxt "odt:sale.sale:0"
+msgctxt "odt:sale.sale:"
 msgid "Amount"
 msgstr "Montant"
 
-msgctxt "odt:sale.sale:0"
+msgctxt "odt:sale.sale:"
+msgid "Date:"
+msgstr "Date :"
+
+msgctxt "odt:sale.sale:"
 msgid "Date:"
 msgstr "Date :"
 
-msgctxt "odt:sale.sale:0"
+msgctxt "odt:sale.sale:"
 msgid "Description"
 msgstr "Description"
 
-msgctxt "odt:sale.sale:0"
+msgctxt "odt:sale.sale:"
+msgid "Description"
+msgstr "Description"
+
+msgctxt "odt:sale.sale:"
+msgid "Description:"
+msgstr "Description :"
+
+msgctxt "odt:sale.sale:"
 msgid "Description:"
 msgstr "Description :"
 
-msgctxt "odt:sale.sale:0"
+msgctxt "odt:sale.sale:"
 msgid "Draft Sale Order"
 msgstr "Bon de commande brouillon"
 
-msgctxt "odt:sale.sale:0"
+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 :"
 
-msgctxt "odt:sale.sale:0"
+msgctxt "odt:sale.sale:"
 msgid "Phone:"
 msgstr "Téléphone :"
 
-msgctxt "odt:sale.sale:0"
+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é"
 
-msgctxt "odt:sale.sale:0"
+msgctxt "odt:sale.sale:"
+msgid "Quotation N°:"
+msgstr "Devis N° :"
+
+msgctxt "odt:sale.sale:"
 msgid "Quotation N°:"
 msgstr "Devis N° :"
 
-msgctxt "odt:sale.sale:0"
+msgctxt "odt:sale.sale:"
 msgid "Sale Order N°:"
 msgstr "Bon de commande N° :"
 
-msgctxt "odt:sale.sale:0"
+msgctxt "odt:sale.sale:"
+msgid "Sale Order N°:"
+msgstr "Bon de commande N° :"
+
+msgctxt "odt:sale.sale:"
 msgid "Taxes"
 msgstr "Taxes"
 
-msgctxt "odt:sale.sale:0"
+msgctxt "odt:sale.sale:"
+msgid "Taxes"
+msgstr "Taxes"
+
+msgctxt "odt:sale.sale:"
+msgid "Taxes:"
+msgstr "Taxes :"
+
+msgctxt "odt:sale.sale:"
 msgid "Taxes:"
 msgstr "Taxes :"
 
-msgctxt "odt:sale.sale:0"
+msgctxt "odt:sale.sale:"
+msgid "Total (excl. taxes):"
+msgstr "Total (HT) :"
+
+msgctxt "odt:sale.sale:"
 msgid "Total (excl. taxes):"
 msgstr "Total (HT) :"
 
-msgctxt "odt:sale.sale:0"
+msgctxt "odt:sale.sale:"
+msgid "Total:"
+msgstr "Total :"
+
+msgctxt "odt:sale.sale:"
 msgid "Total:"
 msgstr "Total :"
 
-msgctxt "odt:sale.sale:0"
+msgctxt "odt:sale.sale:"
+msgid "Unit Price"
+msgstr "Prix unitaire"
+
+msgctxt "odt:sale.sale:"
 msgid "Unit Price"
 msgstr "Prix unitaire"
 
-msgctxt "odt:sale.sale:0"
+msgctxt "odt:sale.sale:"
 msgid "VAT Number:"
 msgstr "Numéro TVA :"
 
-msgctxt "odt:sale.sale:0"
+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 :"
 
-msgctxt "selection:account.invoice,sale_exception_state:0"
+msgctxt "selection:account.invoice,sale_exception_state:"
 msgid ""
 msgstr ""
 
-msgctxt "selection:account.invoice,sale_exception_state:0"
+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é"
 
-msgctxt "selection:account.invoice,sale_exception_state:0"
+msgctxt "selection:account.invoice,sale_exception_state:"
 msgid "Recreated"
 msgstr "Recréé"
 
-msgctxt "selection:sale.configuration,sale_invoice_method:0"
+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"
 
-msgctxt "selection:sale.configuration,sale_invoice_method:0"
-msgid "On Order Confirmed"
-msgstr "À la confirmation"
+msgctxt "selection:sale.configuration,sale_invoice_method:"
+msgid "On Order Processed"
+msgstr "Sur traitement de l'ordre"
 
-msgctxt "selection:sale.configuration,sale_invoice_method:0"
+msgctxt "selection:sale.configuration,sale_invoice_method:"
 msgid "On Shipment Sent"
 msgstr "À la livraison"
 
-msgctxt "selection:sale.configuration,sale_shipment_method:0"
+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"
 
-msgctxt "selection:sale.configuration,sale_shipment_method:0"
+msgctxt "selection:sale.configuration,sale_shipment_method:"
+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:0"
-msgid "On Order Confirmed"
-msgstr "À la confirmation"
+msgctxt "selection:sale.configuration,sale_shipment_method:"
+msgid "On Order Processed"
+msgstr "Sur traitement de l'ordre"
 
-msgctxt "selection:sale.line,type:0"
+msgctxt "selection:sale.line,type:"
 msgid "Comment"
 msgstr "Commentaire"
 
-msgctxt "selection:sale.line,type:0"
+msgctxt "selection:sale.line,type:"
+msgid "Comment"
+msgstr "Commentaire"
+
+msgctxt "selection:sale.line,type:"
 msgid "Line"
 msgstr "Ligne"
 
-msgctxt "selection:sale.line,type:0"
+msgctxt "selection:sale.line,type:"
+msgid "Line"
+msgstr "Ligne"
+
+msgctxt "selection:sale.line,type:"
+msgid "Subtotal"
+msgstr "Sous-total"
+
+msgctxt "selection:sale.line,type:"
 msgid "Subtotal"
 msgstr "Sous-total"
 
-msgctxt "selection:sale.line,type:0"
+msgctxt "selection:sale.line,type:"
+msgid "Title"
+msgstr "Titre"
+
+msgctxt "selection:sale.line,type:"
 msgid "Title"
 msgstr "Titre"
 
-msgctxt "selection:sale.sale,invoice_method:0"
+msgctxt "selection:sale.sale,invoice_method:"
+msgid "Manual"
+msgstr "Manuel"
+
+msgctxt "selection:sale.sale,invoice_method:"
 msgid "Manual"
 msgstr "Manuel"
 
-msgctxt "selection:sale.sale,invoice_method:0"
-msgid "On Order Confirmed"
-msgstr "A la confirmation"
+msgctxt "selection:sale.sale,invoice_method:"
+msgid "On Order Processed"
+msgstr "Sur traitement de l'ordre"
+
+msgctxt "selection:sale.sale,invoice_method:"
+msgid "On Shipment Sent"
+msgstr "À la livraison"
 
-msgctxt "selection:sale.sale,invoice_method:0"
+msgctxt "selection:sale.sale,invoice_method:"
 msgid "On Shipment Sent"
 msgstr "À la livraison"
 
-msgctxt "selection:sale.sale,invoice_state:0"
+msgctxt "selection:sale.sale,invoice_state:"
 msgid "Exception"
 msgstr "Exception"
 
-msgctxt "selection:sale.sale,invoice_state:0"
+msgctxt "selection:sale.sale,invoice_state:"
+msgid "Exception"
+msgstr "Exception"
+
+msgctxt "selection:sale.sale,invoice_state:"
+msgid "None"
+msgstr "Aucun"
+
+msgctxt "selection:sale.sale,invoice_state:"
 msgid "None"
 msgstr "Aucun"
 
-msgctxt "selection:sale.sale,invoice_state:0"
+msgctxt "selection:sale.sale,invoice_state:"
 msgid "Paid"
 msgstr "Payé"
 
-msgctxt "selection:sale.sale,invoice_state:0"
+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"
 
-msgctxt "selection:sale.sale,shipment_method:0"
+msgctxt "selection:sale.sale,shipment_method:"
 msgid "Manual"
 msgstr "Manuel"
 
-msgctxt "selection:sale.sale,shipment_method:0"
+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"
 
-msgctxt "selection:sale.sale,shipment_method:0"
-msgid "On Order Confirmed"
-msgstr "À la confirmation"
+msgctxt "selection:sale.sale,shipment_method:"
+msgid "On Order Processed"
+msgstr "Sur traitement de l'ordre"
 
-msgctxt "selection:sale.sale,shipment_state:0"
+msgctxt "selection:sale.sale,shipment_state:"
 msgid "Exception"
 msgstr "Exception"
 
-msgctxt "selection:sale.sale,shipment_state:0"
+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"
 
-msgctxt "selection:sale.sale,shipment_state:0"
+msgctxt "selection:sale.sale,shipment_state:"
+msgid "Sent"
+msgstr "Envoyé"
+
+msgctxt "selection:sale.sale,shipment_state:"
 msgid "Sent"
 msgstr "Envoyé"
 
-msgctxt "selection:sale.sale,shipment_state:0"
+msgctxt "selection:sale.sale,shipment_state:"
 msgid "Waiting"
 msgstr "En attente"
 
-msgctxt "selection:sale.sale,state:0"
+msgctxt "selection:sale.sale,shipment_state:"
+msgid "Waiting"
+msgstr "En attente"
+
+msgctxt "selection:sale.sale,state:"
 msgid "Canceled"
 msgstr "Annulé"
 
-msgctxt "selection:sale.sale,state:0"
+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é"
 
-msgctxt "selection:sale.sale,state:0"
+msgctxt "selection:sale.sale,state:"
+msgid "Done"
+msgstr "Fait"
+
+msgctxt "selection:sale.sale,state:"
 msgid "Done"
 msgstr "Fait"
 
-msgctxt "selection:sale.sale,state:0"
+msgctxt "selection:sale.sale,state:"
+msgid "Draft"
+msgstr "Brouillon"
+
+msgctxt "selection:sale.sale,state:"
 msgid "Draft"
 msgstr "Brouillon"
 
-msgctxt "selection:sale.sale,state:0"
+msgctxt "selection:sale.sale,state:"
+msgid "Processing"
+msgstr "Traitement"
+
+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:0"
+msgctxt "selection:stock.move,sale_exception_state:"
 msgid ""
 msgstr ""
 
-msgctxt "selection:stock.move,sale_exception_state:0"
+msgctxt "selection:stock.move,sale_exception_state:"
+msgid ""
+msgstr ""
+
+msgctxt "selection:stock.move,sale_exception_state:"
+msgid "Ignored"
+msgstr "Ignoré"
+
+msgctxt "selection:stock.move,sale_exception_state:"
 msgid "Ignored"
 msgstr "Ignoré"
 
-msgctxt "selection:stock.move,sale_exception_state:0"
+msgctxt "selection:stock.move,sale_exception_state:"
 msgid "Recreated"
 msgstr "Recréé"
 
-msgctxt "view:product.product:0"
+msgctxt "selection:stock.move,sale_exception_state:"
+msgid "Recreated"
+msgstr "Recréé"
+
+msgctxt "view:product.product:"
 msgid "Customers"
 msgstr "Clients"
 
-msgctxt "view:product.template:0"
+msgctxt "view:product.product:"
+msgid "Products"
+msgstr "produits"
+
+msgctxt "view:product.template:"
+msgid "Customers"
+msgstr "Clients"
+
+msgctxt "view:product.template:"
 msgid "Customers"
 msgstr "Clients"
 
-msgctxt "view:sale.configuration:0"
+msgctxt "view:sale.configuration:"
 msgid "Sale Configuration"
 msgstr "Configuration des ventes"
 
-msgctxt "view:sale.handle.invoice.exception.ask:0"
+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:0"
+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 "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:0"
+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:0"
+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:0"
+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 "Recreate Moves"
 msgstr "Recréer les mouvements"
 
-msgctxt "view:sale.line:0"
+msgctxt "view:sale.line:"
+msgid "General"
+msgstr "Général"
+
+msgctxt "view:sale.line:"
 msgid "General"
 msgstr "Général"
 
-msgctxt "view:sale.line:0"
+msgctxt "view:sale.line:"
 msgid "Notes"
 msgstr "Notes"
 
-msgctxt "view:sale.line:0"
+msgctxt "view:sale.line:"
+msgid "Notes"
+msgstr "Notes"
+
+msgctxt "view:sale.line:"
 msgid "Products"
 msgstr "produits"
 
-msgctxt "view:sale.line:0"
+msgctxt "view:sale.line:"
+msgid "Sale Line"
+msgstr "Ligne de vente"
+
+msgctxt "view:sale.line:"
 msgid "Sale Line"
 msgstr "Ligne de vente"
 
-msgctxt "view:sale.line:0"
+msgctxt "view:sale.line:"
 msgid "Sale Lines"
 msgstr "Lignes de vente"
 
-msgctxt "view:sale.sale:0"
+msgctxt "view:sale.line:"
+msgid "Sale Lines"
+msgstr "Lignes de vente"
+
+msgctxt "view:sale.sale:"
+msgid "Cancel"
+msgstr "Annuler"
+
+msgctxt "view:sale.sale:"
 msgid "Cancel"
 msgstr "Annuler"
 
-msgctxt "view:sale.sale:0"
+msgctxt "view:sale.sale:"
 msgid "Confirm"
 msgstr "Confirmer"
 
-msgctxt "view:sale.sale:0"
+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:0"
+msgctxt "view:sale.sale:"
 msgid "Handle Invoice Exception"
 msgstr "Gérer l'exception de facture"
 
-msgctxt "view:sale.sale:0"
+msgctxt "view:sale.sale:"
+msgid "Handle Invoice Exception"
+msgstr "Gérer l'exception de facture"
+
+msgctxt "view:sale.sale:"
 msgid "Handle Shipment Exception"
 msgstr "Gérer l'exception d'expédition"
 
-msgctxt "view:sale.sale:0"
+msgctxt "view:sale.sale:"
+msgid "Handle Shipment Exception"
+msgstr "Gérer l'exception d'expédition"
+
+msgctxt "view:sale.sale:"
 msgid "Ignore Invoice Exception"
 msgstr "Ignorer l'exception de facturation "
 
-msgctxt "view:sale.sale:0"
+msgctxt "view:sale.sale:"
 msgid "Ignore Shipment Exception"
 msgstr "Ignorer l'exception de livraison"
 
-msgctxt "view:sale.sale:0"
+msgctxt "view:sale.sale:"
+msgid "Invoices"
+msgstr "Factures"
+
+msgctxt "view:sale.sale:"
 msgid "Invoices"
 msgstr "Factures"
 
-msgctxt "view:sale.sale:0"
+msgctxt "view:sale.sale:"
 msgid "Lines"
 msgstr "Lignes"
 
-msgctxt "view:sale.sale:0"
+msgctxt "view:sale.sale:"
 msgid "Moves"
 msgstr "Mouvements"
 
-msgctxt "view:sale.sale:0"
+msgctxt "view:sale.sale:"
 msgid "Other Info"
 msgstr "Autre information"
 
-msgctxt "view:sale.sale:0"
+msgctxt "view:sale.sale:"
+msgid "Other Info"
+msgstr "Autre information"
+
+msgctxt "view:sale.sale:"
+msgid "Process"
+msgstr "Traitement"
+
+msgctxt "view:sale.sale:"
 msgid "Quotation"
 msgstr "Devis"
 
-msgctxt "view:sale.sale:0"
+msgctxt "view:sale.sale:"
+msgid "Quote"
+msgstr "Devis"
+
+msgctxt "view:sale.sale:"
+msgid "Sale"
+msgstr "Vente"
+
+msgctxt "view:sale.sale:"
 msgid "Sale"
 msgstr "Vente"
 
-msgctxt "view:sale.sale:0"
+msgctxt "view:sale.sale:"
+msgid "Sales"
+msgstr "Ventes"
+
+msgctxt "view:sale.sale:"
 msgid "Sales"
 msgstr "Ventes"
 
-msgctxt "view:sale.sale:0"
+msgctxt "view:sale.sale:"
 msgid "Shipments"
 msgstr "Expéditions"
 
-msgctxt "wizard_button:sale.handle.invoice.exception,init,end:0"
+msgctxt "view:sale.sale:"
+msgid "Shipments"
+msgstr "Expéditions"
+
+msgctxt "view:stock.move:"
+msgid "Moves"
+msgstr "Mouvements"
+
+msgctxt "wizard_button:sale.handle.invoice.exception,ask,end:"
 msgid "Cancel"
 msgstr "Annuler"
 
-msgctxt "wizard_button:sale.handle.invoice.exception,init,ok:0"
+msgctxt "wizard_button:sale.handle.invoice.exception,ask,handle:"
 msgid "Ok"
 msgstr "Ok"
 
-msgctxt "wizard_button:sale.handle.shipment.exception,init,end:0"
+msgctxt "wizard_button:sale.handle.shipment.exception,ask,end:"
 msgid "Cancel"
 msgstr "Annuler"
 
-msgctxt "wizard_button:sale.handle.shipment.exception,init,ok:0"
+msgctxt "wizard_button:sale.handle.shipment.exception,ask,handle:"
 msgid "Ok"
 msgstr "Ok"
diff --git a/locale/nl_NL.po b/locale/nl_NL.po
index 1462234..a9a030d 100644
--- a/locale/nl_NL.po
+++ b/locale/nl_NL.po
@@ -2,407 +2,650 @@
 msgid ""
 msgstr "Content-Type: text/plain; charset=utf-8\n"
 
-msgctxt "error:account.invoice:0"
+msgctxt "error:account.invoice:"
 msgid "You can not delete invoices that come from a sale!"
 msgstr "U kunt geen facturen verwijderen die uit verkoop voortkomen!"
 
-msgctxt "error:account.invoice:0"
+msgctxt "error:account.invoice:"
 msgid "You cannot reset to draft an invoice generated by a sale."
 msgstr ""
 "U kunt een factuur die uit verkoop voortkomt niet terug zetten naar concept."
 
-msgctxt "error:sale.line:0"
+msgctxt "error:sale.line:"
 msgid "It misses an \"Account Revenue\" on product \"%s\"!"
 msgstr "Grootboekrekening \"Opbrengst\" ontbreekt voor product \"%s\"!"
 
-msgctxt "error:sale.line:0"
+msgctxt "error:sale.line:"
 msgid "It misses an \"account Revenue\" default property!"
 msgstr "De standaard grootboekrekening \"Opbrengst\" ontbreekt!"
 
-msgctxt "error:sale.line:0"
+msgctxt "error:sale.line:"
 msgid "The customer location is required!"
 msgstr "De afleverlocatie is vereist!"
 
-msgctxt "error:sale.sale:0"
+msgctxt "error:sale.sale:"
 msgid "Invoice and Shipment addresses must be defined for the quotation."
 msgstr "Factuur- en afleveradres moeten gedefinieerd zijn voor de offerte."
 
-msgctxt "error:sale.sale:0"
+msgctxt "error:sale.sale:"
 msgid "It misses an \"Account Receivable\" on the party \"%s\"!"
 msgstr "Grootboekrekening \"Debiteuren\" ontbreekt voor relatie \"%s\"!"
 
-msgctxt "error:sale.sale:0"
+msgctxt "error:sale.sale:"
+msgid "Sale \"%s\" must be cancelled before deletion!"
+msgstr ""
+
+msgctxt "error:sale.sale:"
+msgid "Warehouse must be defined for the quotation."
+msgstr ""
+
+msgctxt "error:sale.sale:"
 msgid "Wrong combination of method!"
 msgstr "Verkeerde combinatie van afhandeling!"
 
-msgctxt "error:stock.shipment.out:0"
+#, fuzzy
+msgctxt "error:stock.shipment.out.return:"
+msgid "You cannot reset to draft a move generated by a sale."
+msgstr ""
+"U kunt een boeking die uit verkoop voortkomt niet terug zetten naar concept."
+
+msgctxt "error:stock.shipment.out:"
 msgid "You cannot reset to draft a move generated by a sale."
 msgstr ""
 "U kunt een boeking die uit verkoop voortkomt niet terug zetten naar concept."
 
-msgctxt "field:account.invoice,sale_exception_state:0"
+msgctxt "field:account.invoice,sale_exception_state:"
 msgid "Exception State"
 msgstr "Uitzonderingstoestand"
 
 #, fuzzy
-msgctxt "field:account.invoice,sales:0"
+msgctxt "field:account.invoice,sales:"
 msgid "Sales"
 msgstr "Verkoopbeheer"
 
 #, fuzzy
-msgctxt "field:account.invoice.line,sale_lines:0"
+msgctxt "field:account.invoice.line,sale_lines:"
 msgid "Sale Lines"
 msgstr "Offerteregels"
 
-msgctxt "field:product.template,delivery_time:0"
+msgctxt "field:product.template,delivery_time:"
 msgid "Delivery Time"
 msgstr ""
 
-msgctxt "field:product.template,salable:0"
+msgctxt "field:product.template,salable:"
 msgid "Salable"
 msgstr "Verkoopbaar"
 
-msgctxt "field:product.template,sale_uom:0"
+msgctxt "field:product.template,sale_uom:"
 msgid "Sale UOM"
 msgstr "Maateenheid verkoop"
 
-msgctxt "field:sale.configuration,rec_name:0"
+msgctxt "field:sale.configuration,create_date:"
+msgid "Create Date"
+msgstr ""
+
+msgctxt "field:sale.configuration,create_uid:"
+msgid "Create User"
+msgstr ""
+
+msgctxt "field:sale.configuration,id:"
+msgid "ID"
+msgstr ""
+
+msgctxt "field:sale.configuration,rec_name:"
 msgid "Name"
 msgstr "Naam"
 
-msgctxt "field:sale.configuration,sale_invoice_method:0"
+msgctxt "field:sale.configuration,sale_invoice_method:"
 msgid "Sale Invoice Method"
 msgstr ""
 
-msgctxt "field:sale.configuration,sale_sequence:0"
+msgctxt "field:sale.configuration,sale_sequence:"
 msgid "Sale Reference Sequence"
 msgstr "Verkoopkenmerkreeks"
 
-msgctxt "field:sale.configuration,sale_shipment_method:0"
+msgctxt "field:sale.configuration,sale_shipment_method:"
 msgid "Sale Shipment Method"
 msgstr ""
 
-msgctxt "field:sale.handle.invoice.exception.ask,domain_invoices:0"
+msgctxt "field:sale.configuration,write_date:"
+msgid "Write Date"
+msgstr ""
+
+msgctxt "field:sale.configuration,write_uid:"
+msgid "Write User"
+msgstr ""
+
+msgctxt "field:sale.handle.invoice.exception.ask,domain_invoices:"
 msgid "Domain Invoices"
 msgstr "Domein facturen"
 
-msgctxt "field:sale.handle.invoice.exception.ask,recreate_invoices:0"
+msgctxt "field:sale.handle.invoice.exception.ask,id:"
+msgid "ID"
+msgstr ""
+
+msgctxt "field:sale.handle.invoice.exception.ask,recreate_invoices:"
 msgid "Recreate Invoices"
 msgstr "Facturen opnieuw aanmaken"
 
-msgctxt "field:sale.handle.shipment.exception.ask,domain_moves:0"
+msgctxt "field:sale.handle.shipment.exception.ask,domain_moves:"
 msgid "Domain Moves"
 msgstr "Domein boekingen"
 
-msgctxt "field:sale.handle.shipment.exception.ask,recreate_moves:0"
+msgctxt "field:sale.handle.shipment.exception.ask,id:"
+msgid "ID"
+msgstr ""
+
+msgctxt "field:sale.handle.shipment.exception.ask,recreate_moves:"
 msgid "Recreate Moves"
 msgstr "Boekingen opnieuw aanmaken"
 
-msgctxt "field:sale.line,amount:0"
+msgctxt "field:sale.line,amount:"
 msgid "Amount"
 msgstr "Bedrag"
 
-msgctxt "field:sale.line,description:0"
+msgctxt "field:sale.line,create_date:"
+msgid "Create Date"
+msgstr ""
+
+msgctxt "field:sale.line,create_uid:"
+msgid "Create User"
+msgstr ""
+
+msgctxt "field:sale.line,delivery_date:"
+msgid "Delivery Date"
+msgstr ""
+
+msgctxt "field:sale.line,description:"
 msgid "Description"
 msgstr "Specificatie"
 
-msgctxt "field:sale.line,invoice_lines:0"
+msgctxt "field:sale.line,from_location:"
+msgid "From Location"
+msgstr ""
+
+msgctxt "field:sale.line,id:"
+msgid "ID"
+msgstr ""
+
+msgctxt "field:sale.line,invoice_lines:"
 msgid "Invoice Lines"
 msgstr "Factuurregels"
 
-msgctxt "field:sale.line,move_done:0"
+msgctxt "field:sale.line,move_done:"
 msgid "Moves Done"
 msgstr "Boekingen klaar"
 
-msgctxt "field:sale.line,move_exception:0"
+msgctxt "field:sale.line,move_exception:"
 msgid "Moves Exception"
 msgstr "Boekingen uitzondering"
 
-msgctxt "field:sale.line,moves:0"
+msgctxt "field:sale.line,moves:"
 msgid "Moves"
 msgstr "Boekingen"
 
-msgctxt "field:sale.line,moves_ignored:0"
+msgctxt "field:sale.line,moves_ignored:"
 msgid "Ignored Moves"
 msgstr "Genegeerde boekingen"
 
-msgctxt "field:sale.line,moves_recreated:0"
+msgctxt "field:sale.line,moves_recreated:"
 msgid "Recreated Moves"
 msgstr "Opnieuw aangemaakte boekingen"
 
-msgctxt "field:sale.line,note:0"
+msgctxt "field:sale.line,note:"
 msgid "Note"
 msgstr "Aantekening"
 
-msgctxt "field:sale.line,product:0"
+msgctxt "field:sale.line,product:"
 msgid "Product"
 msgstr "Product"
 
-msgctxt "field:sale.line,quantity:0"
+msgctxt "field:sale.line,product_uom_category:"
+msgid "Product Uom Category"
+msgstr ""
+
+msgctxt "field:sale.line,quantity:"
 msgid "Quantity"
 msgstr "Hoeveelheid"
 
-msgctxt "field:sale.line,rec_name:0"
+msgctxt "field:sale.line,rec_name:"
 msgid "Name"
 msgstr "Naam"
 
-msgctxt "field:sale.line,sale:0"
+msgctxt "field:sale.line,sale:"
 msgid "Sale"
 msgstr "Verkoop"
 
-msgctxt "field:sale.line,sequence:0"
+msgctxt "field:sale.line,sequence:"
 msgid "Sequence"
 msgstr "Reeks"
 
-msgctxt "field:sale.line,taxes:0"
+msgctxt "field:sale.line,taxes:"
 msgid "Taxes"
 msgstr "Belastingen"
 
-msgctxt "field:sale.line,type:0"
+msgctxt "field:sale.line,to_location:"
+msgid "To Location"
+msgstr ""
+
+msgctxt "field:sale.line,type:"
 msgid "Type"
 msgstr "Type"
 
-msgctxt "field:sale.line,unit:0"
+msgctxt "field:sale.line,unit:"
 msgid "Unit"
 msgstr "Eenheid"
 
-msgctxt "field:sale.line,unit_digits:0"
+msgctxt "field:sale.line,unit_digits:"
 msgid "Unit Digits"
 msgstr "Decimalen eenheid"
 
-msgctxt "field:sale.line,unit_price:0"
+msgctxt "field:sale.line,unit_price:"
 msgid "Unit Price"
 msgstr "Eenheidsprijs"
 
-msgctxt "field:sale.line-account.invoice.line,invoice_line:0"
+#, fuzzy
+msgctxt "field:sale.line,warehouse:"
+msgid "Warehouse"
+msgstr "Magazijn"
+
+msgctxt "field:sale.line,write_date:"
+msgid "Write Date"
+msgstr ""
+
+msgctxt "field:sale.line,write_uid:"
+msgid "Write User"
+msgstr ""
+
+msgctxt "field:sale.line-account.invoice.line,create_date:"
+msgid "Create Date"
+msgstr ""
+
+msgctxt "field:sale.line-account.invoice.line,create_uid:"
+msgid "Create User"
+msgstr ""
+
+msgctxt "field:sale.line-account.invoice.line,id:"
+msgid "ID"
+msgstr ""
+
+msgctxt "field:sale.line-account.invoice.line,invoice_line:"
 msgid "Invoice Line"
 msgstr "Factuurregel"
 
-msgctxt "field:sale.line-account.invoice.line,rec_name:0"
+msgctxt "field:sale.line-account.invoice.line,rec_name:"
 msgid "Name"
 msgstr "Naam"
 
-msgctxt "field:sale.line-account.invoice.line,sale_line:0"
+msgctxt "field:sale.line-account.invoice.line,sale_line:"
 msgid "Sale Line"
 msgstr "Offerteregel"
 
-msgctxt "field:sale.line-account.tax,line:0"
+msgctxt "field:sale.line-account.invoice.line,write_date:"
+msgid "Write Date"
+msgstr ""
+
+msgctxt "field:sale.line-account.invoice.line,write_uid:"
+msgid "Write User"
+msgstr ""
+
+msgctxt "field:sale.line-account.tax,create_date:"
+msgid "Create Date"
+msgstr ""
+
+msgctxt "field:sale.line-account.tax,create_uid:"
+msgid "Create User"
+msgstr ""
+
+msgctxt "field:sale.line-account.tax,id:"
+msgid "ID"
+msgstr ""
+
+msgctxt "field:sale.line-account.tax,line:"
 msgid "Sale Line"
 msgstr "Offerteregel"
 
-msgctxt "field:sale.line-account.tax,rec_name:0"
+msgctxt "field:sale.line-account.tax,rec_name:"
 msgid "Name"
 msgstr "Naam"
 
-msgctxt "field:sale.line-account.tax,tax:0"
+msgctxt "field:sale.line-account.tax,tax:"
 msgid "Tax"
 msgstr "Belasting"
 
-msgctxt "field:sale.line-ignored-stock.move,move:0"
+msgctxt "field:sale.line-account.tax,write_date:"
+msgid "Write Date"
+msgstr ""
+
+msgctxt "field:sale.line-account.tax,write_uid:"
+msgid "Write User"
+msgstr ""
+
+msgctxt "field:sale.line-ignored-stock.move,create_date:"
+msgid "Create Date"
+msgstr ""
+
+msgctxt "field:sale.line-ignored-stock.move,create_uid:"
+msgid "Create User"
+msgstr ""
+
+msgctxt "field:sale.line-ignored-stock.move,id:"
+msgid "ID"
+msgstr ""
+
+msgctxt "field:sale.line-ignored-stock.move,move:"
 msgid "Move"
 msgstr "Boeking"
 
-msgctxt "field:sale.line-ignored-stock.move,rec_name:0"
+msgctxt "field:sale.line-ignored-stock.move,rec_name:"
 msgid "Name"
 msgstr "Naam"
 
-msgctxt "field:sale.line-ignored-stock.move,sale_line:0"
+msgctxt "field:sale.line-ignored-stock.move,sale_line:"
 msgid "Sale Line"
 msgstr "Offerteregel"
 
-msgctxt "field:sale.line-recreated-stock.move,move:0"
+msgctxt "field:sale.line-ignored-stock.move,write_date:"
+msgid "Write Date"
+msgstr ""
+
+msgctxt "field:sale.line-ignored-stock.move,write_uid:"
+msgid "Write User"
+msgstr ""
+
+msgctxt "field:sale.line-recreated-stock.move,create_date:"
+msgid "Create Date"
+msgstr ""
+
+msgctxt "field:sale.line-recreated-stock.move,create_uid:"
+msgid "Create User"
+msgstr ""
+
+msgctxt "field:sale.line-recreated-stock.move,id:"
+msgid "ID"
+msgstr ""
+
+msgctxt "field:sale.line-recreated-stock.move,move:"
 msgid "Move"
 msgstr "Boeking"
 
-msgctxt "field:sale.line-recreated-stock.move,rec_name:0"
+msgctxt "field:sale.line-recreated-stock.move,rec_name:"
 msgid "Name"
 msgstr "Naam"
 
-msgctxt "field:sale.line-recreated-stock.move,sale_line:0"
+msgctxt "field:sale.line-recreated-stock.move,sale_line:"
 msgid "Sale Line"
 msgstr "Offerteregel"
 
-msgctxt "field:sale.sale,comment:0"
+msgctxt "field:sale.line-recreated-stock.move,write_date:"
+msgid "Write Date"
+msgstr ""
+
+msgctxt "field:sale.line-recreated-stock.move,write_uid:"
+msgid "Write User"
+msgstr ""
+
+msgctxt "field:sale.sale,comment:"
 msgid "Comment"
 msgstr "Opmerking"
 
-msgctxt "field:sale.sale,company:0"
+msgctxt "field:sale.sale,company:"
 msgid "Company"
 msgstr "Bedrijf"
 
-msgctxt "field:sale.sale,currency:0"
+msgctxt "field:sale.sale,create_date:"
+msgid "Create Date"
+msgstr ""
+
+msgctxt "field:sale.sale,create_uid:"
+msgid "Create User"
+msgstr ""
+
+msgctxt "field:sale.sale,currency:"
 msgid "Currency"
 msgstr "Valuta"
 
-msgctxt "field:sale.sale,currency_digits:0"
+msgctxt "field:sale.sale,currency_digits:"
 msgid "Currency Digits"
 msgstr "Valuta decimalen"
 
-msgctxt "field:sale.sale,description:0"
+msgctxt "field:sale.sale,description:"
 msgid "Description"
 msgstr "Specificatie"
 
-msgctxt "field:sale.sale,invoice_address:0"
+msgctxt "field:sale.sale,id:"
+msgid "ID"
+msgstr ""
+
+msgctxt "field:sale.sale,invoice_address:"
 msgid "Invoice Address"
 msgstr "Factuuradres"
 
-msgctxt "field:sale.sale,invoice_exception:0"
-msgid "Invoices Exception"
-msgstr "Facturen uitzondering"
-
-msgctxt "field:sale.sale,invoice_method:0"
+msgctxt "field:sale.sale,invoice_method:"
 msgid "Invoice Method"
 msgstr "Factuur afhandeling"
 
-msgctxt "field:sale.sale,invoice_paid:0"
-msgid "Invoices Paid"
-msgstr "Facturen betaald"
-
-msgctxt "field:sale.sale,invoice_state:0"
+msgctxt "field:sale.sale,invoice_state:"
 msgid "Invoice State"
 msgstr "Factuur status"
 
-msgctxt "field:sale.sale,invoices:0"
+msgctxt "field:sale.sale,invoices:"
 msgid "Invoices"
 msgstr "Facturen"
 
-msgctxt "field:sale.sale,invoices_ignored:0"
+msgctxt "field:sale.sale,invoices_ignored:"
 msgid "Ignored Invoices"
 msgstr "Genegeerde facturen"
 
-msgctxt "field:sale.sale,invoices_recreated:0"
+msgctxt "field:sale.sale,invoices_recreated:"
 msgid "Recreated Invoices"
 msgstr "Opnieuw aangemaakte facturen"
 
-msgctxt "field:sale.sale,lines:0"
+msgctxt "field:sale.sale,lines:"
 msgid "Lines"
 msgstr "Regels"
 
-msgctxt "field:sale.sale,moves:0"
+msgctxt "field:sale.sale,moves:"
 msgid "Moves"
 msgstr "Boekingen"
 
-msgctxt "field:sale.sale,party:0"
+msgctxt "field:sale.sale,party:"
 msgid "Party"
 msgstr "Relatie"
 
-msgctxt "field:sale.sale,party_lang:0"
+msgctxt "field:sale.sale,party_lang:"
 msgid "Party Language"
 msgstr "Taal relatie"
 
-msgctxt "field:sale.sale,payment_term:0"
+msgctxt "field:sale.sale,payment_term:"
 msgid "Payment Term"
 msgstr "Betalingstermijn"
 
-msgctxt "field:sale.sale,rec_name:0"
+msgctxt "field:sale.sale,rec_name:"
 msgid "Name"
 msgstr "Naam"
 
-msgctxt "field:sale.sale,reference:0"
+msgctxt "field:sale.sale,reference:"
 msgid "Reference"
 msgstr "Referentie"
 
-msgctxt "field:sale.sale,sale_date:0"
+msgctxt "field:sale.sale,sale_date:"
 msgid "Sale Date"
 msgstr "Verkoopdatum"
 
-msgctxt "field:sale.sale,shipment_address:0"
+msgctxt "field:sale.sale,shipment_address:"
 msgid "Shipment Address"
 msgstr "Afleveradres"
 
-msgctxt "field:sale.sale,shipment_done:0"
-msgid "Shipment Done"
-msgstr "Afgeleverd"
-
-msgctxt "field:sale.sale,shipment_exception:0"
-msgid "Shipments Exception"
-msgstr "Leveringen uitzonderingen"
-
-msgctxt "field:sale.sale,shipment_method:0"
+msgctxt "field:sale.sale,shipment_method:"
 msgid "Shipment Method"
 msgstr "Levering afhandeling"
 
-msgctxt "field:sale.sale,shipment_state:0"
+msgctxt "field:sale.sale,shipment_returns:"
+msgid "Shipment Returns"
+msgstr ""
+
+msgctxt "field:sale.sale,shipment_state:"
 msgid "Shipment State"
 msgstr "Levering status"
 
-msgctxt "field:sale.sale,shipments:0"
+msgctxt "field:sale.sale,shipments:"
 msgid "Shipments"
 msgstr "Leveringen"
 
-msgctxt "field:sale.sale,state:0"
+msgctxt "field:sale.sale,state:"
 msgid "State"
 msgstr "Status"
 
-msgctxt "field:sale.sale,tax_amount:0"
+msgctxt "field:sale.sale,tax_amount:"
 msgid "Tax"
 msgstr "Belasting"
 
-msgctxt "field:sale.sale,total_amount:0"
+msgctxt "field:sale.sale,tax_amount_cache:"
+msgid "Tax Cache"
+msgstr ""
+
+msgctxt "field:sale.sale,total_amount:"
 msgid "Total"
 msgstr "Totaal"
 
-msgctxt "field:sale.sale,untaxed_amount:0"
+msgctxt "field:sale.sale,total_amount_cache:"
+msgid "Total Tax"
+msgstr ""
+
+msgctxt "field:sale.sale,untaxed_amount:"
 msgid "Untaxed"
 msgstr "Onbelast"
 
-msgctxt "field:sale.sale,warehouse:0"
+msgctxt "field:sale.sale,untaxed_amount_cache:"
+msgid "Untaxed Cache"
+msgstr ""
+
+msgctxt "field:sale.sale,warehouse:"
 msgid "Warehouse"
 msgstr "Magazijn"
 
-msgctxt "field:sale.sale-account.invoice,invoice:0"
+msgctxt "field:sale.sale,write_date:"
+msgid "Write Date"
+msgstr ""
+
+msgctxt "field:sale.sale,write_uid:"
+msgid "Write User"
+msgstr ""
+
+msgctxt "field:sale.sale-account.invoice,create_date:"
+msgid "Create Date"
+msgstr ""
+
+msgctxt "field:sale.sale-account.invoice,create_uid:"
+msgid "Create User"
+msgstr ""
+
+msgctxt "field:sale.sale-account.invoice,id:"
+msgid "ID"
+msgstr ""
+
+msgctxt "field:sale.sale-account.invoice,invoice:"
 msgid "Invoice"
 msgstr "Factuur"
 
-msgctxt "field:sale.sale-account.invoice,rec_name:0"
+msgctxt "field:sale.sale-account.invoice,rec_name:"
 msgid "Name"
 msgstr "Naam"
 
-msgctxt "field:sale.sale-account.invoice,sale:0"
+msgctxt "field:sale.sale-account.invoice,sale:"
 msgid "Sale"
 msgstr "Verkoop"
 
-msgctxt "field:sale.sale-ignored-account.invoice,invoice:0"
+msgctxt "field:sale.sale-account.invoice,write_date:"
+msgid "Write Date"
+msgstr ""
+
+msgctxt "field:sale.sale-account.invoice,write_uid:"
+msgid "Write User"
+msgstr ""
+
+msgctxt "field:sale.sale-ignored-account.invoice,create_date:"
+msgid "Create Date"
+msgstr ""
+
+msgctxt "field:sale.sale-ignored-account.invoice,create_uid:"
+msgid "Create User"
+msgstr ""
+
+msgctxt "field:sale.sale-ignored-account.invoice,id:"
+msgid "ID"
+msgstr ""
+
+msgctxt "field:sale.sale-ignored-account.invoice,invoice:"
 msgid "Invoice"
 msgstr "Factuur"
 
-msgctxt "field:sale.sale-ignored-account.invoice,rec_name:0"
+msgctxt "field:sale.sale-ignored-account.invoice,rec_name:"
 msgid "Name"
 msgstr "Naam"
 
-msgctxt "field:sale.sale-ignored-account.invoice,sale:0"
+msgctxt "field:sale.sale-ignored-account.invoice,sale:"
 msgid "Sale"
 msgstr "Verkoop"
 
-msgctxt "field:sale.sale-recreated-account.invoice,invoice:0"
+msgctxt "field:sale.sale-ignored-account.invoice,write_date:"
+msgid "Write Date"
+msgstr ""
+
+msgctxt "field:sale.sale-ignored-account.invoice,write_uid:"
+msgid "Write User"
+msgstr ""
+
+msgctxt "field:sale.sale-recreated-account.invoice,create_date:"
+msgid "Create Date"
+msgstr ""
+
+msgctxt "field:sale.sale-recreated-account.invoice,create_uid:"
+msgid "Create User"
+msgstr ""
+
+msgctxt "field:sale.sale-recreated-account.invoice,id:"
+msgid "ID"
+msgstr ""
+
+msgctxt "field:sale.sale-recreated-account.invoice,invoice:"
 msgid "Invoice"
 msgstr "Factuur"
 
-msgctxt "field:sale.sale-recreated-account.invoice,rec_name:0"
+msgctxt "field:sale.sale-recreated-account.invoice,rec_name:"
 msgid "Name"
 msgstr "Naam"
 
-msgctxt "field:sale.sale-recreated-account.invoice,sale:0"
+msgctxt "field:sale.sale-recreated-account.invoice,sale:"
 msgid "Sale"
 msgstr "Verkoop"
 
-msgctxt "field:stock.move,sale:0"
+msgctxt "field:sale.sale-recreated-account.invoice,write_date:"
+msgid "Write Date"
+msgstr ""
+
+msgctxt "field:sale.sale-recreated-account.invoice,write_uid:"
+msgid "Write User"
+msgstr ""
+
+msgctxt "field:stock.move,sale:"
 msgid "Sale"
 msgstr "Verkoop"
 
-msgctxt "field:stock.move,sale_exception_state:0"
+msgctxt "field:stock.move,sale_exception_state:"
 msgid "Exception State"
 msgstr "Uitzonderingstoestand"
 
-msgctxt "field:stock.move,sale_line:0"
+msgctxt "field:stock.move,sale_line:"
 msgid "Sale Line"
 msgstr "Offerteregel"
 
-msgctxt "help:product.template,delivery_time:0"
+msgctxt "help:product.template,delivery_time:"
 msgid "In number of days"
 msgstr ""
 
-msgctxt "help:sale.handle.invoice.exception.ask,recreate_invoices:0"
+msgctxt "help:sale.handle.invoice.exception.ask,recreate_invoices:"
 msgid ""
 "The selected invoices will be recreated. The other ones will be ignored."
 msgstr ""
@@ -417,6 +660,10 @@ msgctxt "model:ir.action,name:act_open_customer"
 msgid "Parties associated to Sales"
 msgstr "Klanten"
 
+msgctxt "model:ir.action,name:act_return_form"
+msgid "Returns"
+msgstr ""
+
 #, fuzzy
 msgctxt "model:ir.action,name:act_sale_configuration_form"
 msgid "Sales Configuration"
@@ -438,6 +685,10 @@ msgctxt "model:ir.action,name:act_sale_form_draft"
 msgid "Draft Sales"
 msgstr "Concept offertes"
 
+msgctxt "model:ir.action,name:act_sale_form_processing"
+msgid "Processing Sales"
+msgstr ""
+
 msgctxt "model:ir.action,name:act_sale_form_quotation"
 msgid "Quotation Sales"
 msgstr "Uitstaande offertes"
@@ -454,6 +705,10 @@ msgctxt "model:ir.action,name:wizard_invoice_handle_exception"
 msgid "Handle Invoice Exception"
 msgstr "Factuuruitzondering afhandelen"
 
+msgctxt "model:ir.action,name:wizard_return_sale"
+msgid "Create Return Sale"
+msgstr ""
+
 msgctxt "model:ir.action,name:wizard_shipment_handle_exception"
 msgid "Handle Shipment Exception"
 msgstr "Zendinguitzondering afhandelen"
@@ -496,6 +751,10 @@ msgctxt "model:ir.ui.menu,name:menu_sale_form_draft"
 msgid "Draft Sales"
 msgstr "Concept offertes"
 
+msgctxt "model:ir.ui.menu,name:menu_sale_form_processing"
+msgid "Processing Sales"
+msgstr ""
+
 msgctxt "model:ir.ui.menu,name:menu_sale_form_quotation"
 msgid "Quotation Sales"
 msgstr "Uitstaande offertes"
@@ -510,510 +769,421 @@ msgctxt "model:res.group,name:group_sale_admin"
 msgid "Sales Administrator"
 msgstr "Verkoop beheerder"
 
-msgctxt "model:sale.configuration,name:0"
+msgctxt "model:sale.configuration,name:"
 msgid "Sale Configuration"
 msgstr "Verkoop instellingen"
 
-msgctxt "model:sale.handle.invoice.exception.ask,name:0"
-msgid "Invoice Exception Ask"
+#, fuzzy
+msgctxt "model:sale.handle.invoice.exception.ask,name:"
+msgid "Handle Invoice Exception"
 msgstr "Factuur uitzondering vragen"
 
-msgctxt "model:sale.handle.shipment.exception.ask,name:0"
-msgid "Shipment Exception Ask"
+#, fuzzy
+msgctxt "model:sale.handle.shipment.exception.ask,name:"
+msgid "Handle Shipment Exception"
 msgstr "Afleveren uitzondering vragen"
 
-msgctxt "model:sale.line,name:0"
+msgctxt "model:sale.line,name:"
 msgid "Sale Line"
 msgstr "Offerteregel"
 
-msgctxt "model:sale.line-account.invoice.line,name:0"
+msgctxt "model:sale.line-account.invoice.line,name:"
 msgid "Sale Line - Invoice Line"
 msgstr "Offerteregel - factuurregel"
 
-msgctxt "model:sale.line-account.tax,name:0"
+msgctxt "model:sale.line-account.tax,name:"
 msgid "Sale Line - Tax"
 msgstr "Offerteregel - belasting"
 
-msgctxt "model:sale.line-ignored-stock.move,name:0"
+msgctxt "model:sale.line-ignored-stock.move,name:"
 msgid "Sale Line - Ignored Move"
 msgstr "Offerteregel - genegeerde boeking"
 
-msgctxt "model:sale.line-recreated-stock.move,name:0"
+msgctxt "model:sale.line-recreated-stock.move,name:"
 msgid "Sale Line - Recreated Move"
 msgstr "Offerteregel - boeking opnieuw aanmaken"
 
-msgctxt "model:sale.sale,name:0"
+msgctxt "model:sale.sale,name:"
 msgid "Sale"
 msgstr "Verkoop"
 
-msgctxt "model:sale.sale-account.invoice,name:0"
+msgctxt "model:sale.sale-account.invoice,name:"
 msgid "Sale - Invoice"
 msgstr "Verkoop - factuur"
 
-msgctxt "model:sale.sale-ignored-account.invoice,name:0"
+msgctxt "model:sale.sale-ignored-account.invoice,name:"
 msgid "Sale - Ignored Invoice"
 msgstr "Verkoop - genereerde factuur"
 
-msgctxt "model:sale.sale-recreated-account.invoice,name:0"
+msgctxt "model:sale.sale-recreated-account.invoice,name:"
 msgid "Sale - Recreated Invoice"
 msgstr "Verkoop - factuur opnieuw aanmaken"
 
-msgctxt "model:workflow,name:sale_workflow"
-msgid "Sale workflow"
-msgstr "Sjaboon verkoop"
-
-msgctxt "model:workflow.activity,name:sale_activity_cancel"
-msgid "Canceled"
-msgstr "Geannuleerd"
-
-msgctxt "model:workflow.activity,name:sale_activity_confirmed"
-msgid "Confirmed"
-msgstr "Bevestigd"
-
-msgctxt "model:workflow.activity,name:sale_activity_done"
-msgid "Done"
-msgstr "Klaar"
-
-msgctxt "model:workflow.activity,name:sale_activity_draft"
-msgid "Draft"
-msgstr "Concept"
-
-msgctxt "model:workflow.activity,name:sale_activity_invoice_method"
-msgid "Invoice Method"
-msgstr "Factuur afhandeling"
-
-msgctxt "model:workflow.activity,name:sale_activity_invoice_method_done"
-msgid "Invoice Method Done"
-msgstr "Factuur afhandeling klaar"
-
-msgctxt "model:workflow.activity,name:sale_activity_invoice_sale_done"
-msgid "Invoice Done"
-msgstr "Factuur klaar"
-
-msgctxt "model:workflow.activity,name:sale_activity_invoice_sale_exception"
-msgid "Invoice Exception"
-msgstr "Factuur uitzondering"
-
-msgctxt "model:workflow.activity,name:sale_activity_invoice_shipment"
-msgid "Invoice Shipment"
-msgstr "Factuur zending"
-
-msgctxt "model:workflow.activity,name:sale_activity_invoice_shipment_done"
-msgid "Invoice Shipment Done"
-msgstr "Factuur zending klaar"
-
-msgctxt ""
-"model:workflow.activity,name:sale_activity_invoice_shipment_exception"
-msgid "Invoice Shipment Exception"
-msgstr "Factuur zending uitzondering"
-
-msgctxt "model:workflow.activity,name:sale_activity_invoice_shipment_method"
-msgid "Invoice Shipment Method"
-msgstr "Factuur zending afhandeling"
-
-msgctxt ""
-"model:workflow.activity,name:sale_activity_invoice_shipment_method_done"
-msgid "Invoice Shipment Method Done"
-msgstr "Factuur zending afhandeling klaar"
-
-msgctxt "model:workflow.activity,name:sale_activity_quotation"
-msgid "Quotation"
-msgstr "Offerte"
-
-msgctxt "model:workflow.activity,name:sale_activity_shipment"
-msgid "Shipment"
-msgstr "Afleveren"
-
-msgctxt "model:workflow.activity,name:sale_activity_shipment_exception"
-msgid "Shipment Exception"
-msgstr "Afleveren uitzondering"
-
-msgctxt "model:workflow.activity,name:sale_activity_shipment_invoice"
-msgid "Shipment Invoice"
-msgstr "Afleverfactuur"
-
-msgctxt "model:workflow.activity,name:sale_activity_shipment_invoice_done"
-msgid "Shipment Invoice Done"
-msgstr "Afleverfactuur klaar"
-
-msgctxt ""
-"model:workflow.activity,name:sale_activity_shipment_invoice_exception"
-msgid "Shipment Invoice Exception"
-msgstr "Afleverfactuur uitzondering"
-
-msgctxt "model:workflow.activity,name:sale_activity_shipment_invoice_method"
-msgid "Shipment Invoice Method"
-msgstr "Afleverfactuur afhandeling"
-
-msgctxt ""
-"model:workflow.activity,name:sale_activity_shipment_invoice_method_done"
-msgid "Shipment Invoice Method Done"
-msgstr "Afleverfactuur afhandeling klaar"
-
-msgctxt "model:workflow.activity,name:sale_activity_shipment_method"
-msgid "Shipment Method"
-msgstr "Levering afhandeling"
-
-msgctxt "model:workflow.activity,name:sale_activity_shipment_method_done"
-msgid "Shipment Method Done"
-msgstr "Levering afhandeling klaar"
-
-msgctxt "model:workflow.activity,name:sale_activity_waiting_invoice_sale"
-msgid "Waiting Invoice"
-msgstr "Wacht op factuur"
-
-msgctxt "model:workflow.activity,name:sale_activity_waiting_invoice_shipment"
-msgid "Waiting Invoice Shipment"
-msgstr "Wacht op factuur levering"
-
-msgctxt "model:workflow.activity,name:sale_activity_waiting_shipment"
-msgid "Waiting Shipment"
-msgstr "Wacht op aflevering"
-
-msgctxt "model:workflow.activity,name:sale_activity_waiting_shipment_invoice"
-msgid "Waiting Shipment Invoice"
-msgstr "Wacht op afleverfactuur"
-
 #, fuzzy
-msgctxt "odt:sale.sale:0"
+msgctxt "odt:sale.sale:"
 msgid "Amount"
 msgstr "Bedrag"
 
 #, fuzzy
-msgctxt "odt:sale.sale:0"
+msgctxt "odt:sale.sale:"
 msgid "Date:"
 msgstr "Datum:"
 
 #, fuzzy
-msgctxt "odt:sale.sale:0"
+msgctxt "odt:sale.sale:"
 msgid "Description"
 msgstr "Specificatie"
 
 #, fuzzy
-msgctxt "odt:sale.sale:0"
+msgctxt "odt:sale.sale:"
 msgid "Description:"
 msgstr "Betreft:"
 
-msgctxt "odt:sale.sale:0"
+msgctxt "odt:sale.sale:"
 msgid "Draft Sale Order"
 msgstr ""
 
 #, fuzzy
-msgctxt "odt:sale.sale:0"
+msgctxt "odt:sale.sale:"
 msgid "E-Mail:"
 msgstr "E-mail:"
 
 #, fuzzy
-msgctxt "odt:sale.sale:0"
+msgctxt "odt:sale.sale:"
 msgid "Phone:"
 msgstr "Telefoon:"
 
 #, fuzzy
-msgctxt "odt:sale.sale:0"
+msgctxt "odt:sale.sale:"
 msgid "Quantity"
 msgstr "Hoeveelheid"
 
-msgctxt "odt:sale.sale:0"
+msgctxt "odt:sale.sale:"
 msgid "Quotation N°:"
 msgstr ""
 
-msgctxt "odt:sale.sale:0"
+msgctxt "odt:sale.sale:"
 msgid "Sale Order N°:"
 msgstr ""
 
 #, fuzzy
-msgctxt "odt:sale.sale:0"
+msgctxt "odt:sale.sale:"
 msgid "Taxes"
 msgstr "Belastingen"
 
 #, fuzzy
-msgctxt "odt:sale.sale:0"
+msgctxt "odt:sale.sale:"
 msgid "Taxes:"
 msgstr "Belastingen:"
 
 #, fuzzy
-msgctxt "odt:sale.sale:0"
+msgctxt "odt:sale.sale:"
 msgid "Total (excl. taxes):"
 msgstr "Totaal (excl. belasting):"
 
 #, fuzzy
-msgctxt "odt:sale.sale:0"
+msgctxt "odt:sale.sale:"
 msgid "Total:"
 msgstr "Totaal:"
 
 #, fuzzy
-msgctxt "odt:sale.sale:0"
+msgctxt "odt:sale.sale:"
 msgid "Unit Price"
 msgstr "Eenheidsprijs"
 
 #, fuzzy
-msgctxt "odt:sale.sale:0"
+msgctxt "odt:sale.sale:"
 msgid "VAT Number:"
 msgstr "BTW-nummer:"
 
 #, fuzzy
-msgctxt "odt:sale.sale:0"
+msgctxt "odt:sale.sale:"
 msgid "VAT:"
 msgstr "BTW:"
 
-msgctxt "selection:account.invoice,sale_exception_state:0"
+msgctxt "selection:account.invoice,sale_exception_state:"
 msgid ""
 msgstr ""
 
-msgctxt "selection:account.invoice,sale_exception_state:0"
+msgctxt "selection:account.invoice,sale_exception_state:"
 msgid "Ignored"
 msgstr "Genegeerd"
 
-msgctxt "selection:account.invoice,sale_exception_state:0"
+msgctxt "selection:account.invoice,sale_exception_state:"
 msgid "Recreated"
 msgstr "Opnieuw aangemaakt"
 
 #, fuzzy
-msgctxt "selection:sale.configuration,sale_invoice_method:0"
+msgctxt "selection:sale.configuration,sale_invoice_method:"
 msgid "Manual"
 msgstr "Handmatig"
 
-#, fuzzy
-msgctxt "selection:sale.configuration,sale_invoice_method:0"
-msgid "On Order Confirmed"
-msgstr "Na opdrachtbevestiging"
+msgctxt "selection:sale.configuration,sale_invoice_method:"
+msgid "On Order Processed"
+msgstr ""
 
 #, fuzzy
-msgctxt "selection:sale.configuration,sale_invoice_method:0"
+msgctxt "selection:sale.configuration,sale_invoice_method:"
 msgid "On Shipment Sent"
 msgstr "Na verzending"
 
 #, fuzzy
-msgctxt "selection:sale.configuration,sale_shipment_method:0"
+msgctxt "selection:sale.configuration,sale_shipment_method:"
 msgid "Manual"
 msgstr "Handmatig"
 
 #, fuzzy
-msgctxt "selection:sale.configuration,sale_shipment_method:0"
+msgctxt "selection:sale.configuration,sale_shipment_method:"
 msgid "On Invoice Paid"
 msgstr "Na factuur betaald"
 
-#, fuzzy
-msgctxt "selection:sale.configuration,sale_shipment_method:0"
-msgid "On Order Confirmed"
-msgstr "Na opdrachtbevestiging"
+msgctxt "selection:sale.configuration,sale_shipment_method:"
+msgid "On Order Processed"
+msgstr ""
 
-msgctxt "selection:sale.line,type:0"
+msgctxt "selection:sale.line,type:"
 msgid "Comment"
 msgstr "Opmerking"
 
-msgctxt "selection:sale.line,type:0"
+msgctxt "selection:sale.line,type:"
 msgid "Line"
 msgstr "Regel"
 
-msgctxt "selection:sale.line,type:0"
+msgctxt "selection:sale.line,type:"
 msgid "Subtotal"
 msgstr "Subtotaal"
 
-msgctxt "selection:sale.line,type:0"
+msgctxt "selection:sale.line,type:"
 msgid "Title"
 msgstr "Titel"
 
-msgctxt "selection:sale.sale,invoice_method:0"
+msgctxt "selection:sale.sale,invoice_method:"
 msgid "Manual"
 msgstr "Handmatig"
 
-msgctxt "selection:sale.sale,invoice_method:0"
-msgid "On Order Confirmed"
-msgstr "Na opdrachtbevestiging"
+msgctxt "selection:sale.sale,invoice_method:"
+msgid "On Order Processed"
+msgstr ""
 
-msgctxt "selection:sale.sale,invoice_method:0"
+msgctxt "selection:sale.sale,invoice_method:"
 msgid "On Shipment Sent"
 msgstr "Na verzending"
 
-msgctxt "selection:sale.sale,invoice_state:0"
+msgctxt "selection:sale.sale,invoice_state:"
 msgid "Exception"
 msgstr "Uitzondering"
 
-msgctxt "selection:sale.sale,invoice_state:0"
+msgctxt "selection:sale.sale,invoice_state:"
 msgid "None"
 msgstr "Geen"
 
-msgctxt "selection:sale.sale,invoice_state:0"
+msgctxt "selection:sale.sale,invoice_state:"
 msgid "Paid"
 msgstr "Betaald"
 
-msgctxt "selection:sale.sale,invoice_state:0"
+msgctxt "selection:sale.sale,invoice_state:"
 msgid "Waiting"
 msgstr "In afwachting"
 
-msgctxt "selection:sale.sale,shipment_method:0"
+msgctxt "selection:sale.sale,shipment_method:"
 msgid "Manual"
 msgstr "Handmatig"
 
-msgctxt "selection:sale.sale,shipment_method:0"
+msgctxt "selection:sale.sale,shipment_method:"
 msgid "On Invoice Paid"
 msgstr "Na factuur betaald"
 
-msgctxt "selection:sale.sale,shipment_method:0"
-msgid "On Order Confirmed"
-msgstr "Na opdrachtbevestiging"
+msgctxt "selection:sale.sale,shipment_method:"
+msgid "On Order Processed"
+msgstr ""
 
-msgctxt "selection:sale.sale,shipment_state:0"
+msgctxt "selection:sale.sale,shipment_state:"
 msgid "Exception"
 msgstr "Uitzondering"
 
-msgctxt "selection:sale.sale,shipment_state:0"
+msgctxt "selection:sale.sale,shipment_state:"
 msgid "None"
 msgstr "Geen"
 
-msgctxt "selection:sale.sale,shipment_state:0"
+msgctxt "selection:sale.sale,shipment_state:"
 msgid "Sent"
 msgstr "Verzonden"
 
-msgctxt "selection:sale.sale,shipment_state:0"
+msgctxt "selection:sale.sale,shipment_state:"
 msgid "Waiting"
 msgstr "In afwachting"
 
-msgctxt "selection:sale.sale,state:0"
+msgctxt "selection:sale.sale,state:"
 msgid "Canceled"
 msgstr "Geannuleerd"
 
-msgctxt "selection:sale.sale,state:0"
+msgctxt "selection:sale.sale,state:"
 msgid "Confirmed"
 msgstr "Bevestigd"
 
-msgctxt "selection:sale.sale,state:0"
+msgctxt "selection:sale.sale,state:"
 msgid "Done"
 msgstr "Klaar"
 
-msgctxt "selection:sale.sale,state:0"
+msgctxt "selection:sale.sale,state:"
 msgid "Draft"
 msgstr "Concept"
 
-msgctxt "selection:sale.sale,state:0"
+#, fuzzy
+msgctxt "selection:sale.sale,state:"
+msgid "Processing"
+msgstr "Verwerking"
+
+msgctxt "selection:sale.sale,state:"
 msgid "Quotation"
 msgstr "Offerte"
 
-msgctxt "selection:stock.move,sale_exception_state:0"
+msgctxt "selection:stock.move,sale_exception_state:"
 msgid ""
 msgstr ""
 
-msgctxt "selection:stock.move,sale_exception_state:0"
+msgctxt "selection:stock.move,sale_exception_state:"
 msgid "Ignored"
 msgstr "Genegeerd"
 
-msgctxt "selection:stock.move,sale_exception_state:0"
+msgctxt "selection:stock.move,sale_exception_state:"
 msgid "Recreated"
 msgstr "Opnieuw aangemaakt"
 
-msgctxt "view:product.template:0"
+#, fuzzy
+msgctxt "view:product.product:"
+msgid "Products"
+msgstr "Producten"
+
+msgctxt "view:product.template:"
 msgid "Customers"
 msgstr "Klanten"
 
-msgctxt "view:sale.configuration:0"
+msgctxt "view:sale.configuration:"
 msgid "Sale Configuration"
 msgstr "Verkoop instellingen"
 
-msgctxt "view:sale.handle.invoice.exception.ask:0"
+msgctxt "view:sale.handle.invoice.exception.ask:"
 msgid "Choose invoices to recreate"
 msgstr "Kies facturen om opnieuw aan te maken"
 
-msgctxt "view:sale.handle.invoice.exception.ask:0"
+msgctxt "view:sale.handle.invoice.exception.ask:"
 msgid "Handle Invoice Exception"
 msgstr "Factuuruitzondering afhandelen"
 
-msgctxt "view:sale.handle.shipment.exception.ask:0"
+msgctxt "view:sale.handle.shipment.exception.ask:"
 msgid "Choose move to recreate"
 msgstr "Kies boeking om opnieuw aan te maken"
 
-msgctxt "view:sale.handle.shipment.exception.ask:0"
+msgctxt "view:sale.handle.shipment.exception.ask:"
 msgid "Handle shipment Exception"
 msgstr "Zendinguitzondering afhandelen"
 
-msgctxt "view:sale.handle.shipment.exception.ask:0"
+msgctxt "view:sale.handle.shipment.exception.ask:"
 msgid "Recreate Moves"
 msgstr "Boekingen opnieuw aanmaken"
 
-msgctxt "view:sale.line:0"
+msgctxt "view:sale.line:"
 msgid "General"
 msgstr "Algemeen"
 
-msgctxt "view:sale.line:0"
+msgctxt "view:sale.line:"
 msgid "Notes"
 msgstr "Aantekeningen"
 
-msgctxt "view:sale.line:0"
+msgctxt "view:sale.line:"
 msgid "Products"
 msgstr "Producten"
 
-msgctxt "view:sale.line:0"
+msgctxt "view:sale.line:"
 msgid "Sale Line"
 msgstr "Offerteregel"
 
-msgctxt "view:sale.line:0"
+msgctxt "view:sale.line:"
 msgid "Sale Lines"
 msgstr "Offerteregels"
 
-msgctxt "view:sale.sale:0"
+msgctxt "view:sale.sale:"
 msgid "Cancel"
 msgstr "Annuleren"
 
-msgctxt "view:sale.sale:0"
+msgctxt "view:sale.sale:"
 msgid "Confirm"
 msgstr "Bevestig"
 
-msgctxt "view:sale.sale:0"
+msgctxt "view:sale.sale:"
 msgid "Draft"
 msgstr "Concept"
 
-msgctxt "view:sale.sale:0"
+msgctxt "view:sale.sale:"
 msgid "Handle Invoice Exception"
 msgstr "Factuuruitzondering afhandelen"
 
-msgctxt "view:sale.sale:0"
+msgctxt "view:sale.sale:"
 msgid "Handle Shipment Exception"
 msgstr "Zendinguitzondering afhandelen"
 
-msgctxt "view:sale.sale:0"
+msgctxt "view:sale.sale:"
 msgid "Invoices"
 msgstr "Facturen"
 
-msgctxt "view:sale.sale:0"
+msgctxt "view:sale.sale:"
 msgid "Lines"
 msgstr "Regels"
 
-msgctxt "view:sale.sale:0"
+msgctxt "view:sale.sale:"
 msgid "Moves"
 msgstr "Boekingen"
 
-msgctxt "view:sale.sale:0"
+msgctxt "view:sale.sale:"
 msgid "Other Info"
 msgstr "Aanvullende informatie"
 
-msgctxt "view:sale.sale:0"
+msgctxt "view:sale.sale:"
+msgid "Process"
+msgstr ""
+
+msgctxt "view:sale.sale:"
 msgid "Quotation"
 msgstr "Offerte"
 
-msgctxt "view:sale.sale:0"
+msgctxt "view:sale.sale:"
+msgid "Quote"
+msgstr ""
+
+msgctxt "view:sale.sale:"
 msgid "Sale"
 msgstr "Verkoop"
 
-msgctxt "view:sale.sale:0"
+msgctxt "view:sale.sale:"
 msgid "Sales"
 msgstr "Verkoop"
 
-msgctxt "view:sale.sale:0"
+msgctxt "view:sale.sale:"
 msgid "Shipments"
 msgstr "Leveringen"
 
-msgctxt "wizard_button:sale.handle.invoice.exception,init,end:0"
+#, fuzzy
+msgctxt "view:stock.move:"
+msgid "Moves"
+msgstr "Boekingen"
+
+#, fuzzy
+msgctxt "wizard_button:sale.handle.invoice.exception,ask,end:"
 msgid "Cancel"
 msgstr "Annuleren"
 
-msgctxt "wizard_button:sale.handle.invoice.exception,init,ok:0"
+#, fuzzy
+msgctxt "wizard_button:sale.handle.invoice.exception,ask,handle:"
 msgid "Ok"
 msgstr "Oké"
 
-msgctxt "wizard_button:sale.handle.shipment.exception,init,end:0"
+#, fuzzy
+msgctxt "wizard_button:sale.handle.shipment.exception,ask,end:"
 msgid "Cancel"
 msgstr "Annuleren"
 
-msgctxt "wizard_button:sale.handle.shipment.exception,init,ok:0"
+#, fuzzy
+msgctxt "wizard_button:sale.handle.shipment.exception,ask,handle:"
 msgid "Ok"
 msgstr "Oké"
diff --git a/locale/ru_RU.po b/locale/ru_RU.po
index 4aa9b50..2ad52a8 100644
--- a/locale/ru_RU.po
+++ b/locale/ru_RU.po
@@ -2,434 +2,677 @@
 msgid ""
 msgstr "Content-Type: text/plain; charset=utf-8\n"
 
-msgctxt "error:account.invoice:0"
+msgctxt "error:account.invoice:"
 msgid "You can not delete invoices that come from a sale!"
 msgstr ""
 
-msgctxt "error:account.invoice:0"
+msgctxt "error:account.invoice:"
 msgid "You cannot reset to draft an invoice generated by a sale."
 msgstr ""
 
-msgctxt "error:sale.line:0"
+msgctxt "error:sale.line:"
 msgid "It misses an \"Account Revenue\" on product \"%s\"!"
 msgstr ""
 
-msgctxt "error:sale.line:0"
+msgctxt "error:sale.line:"
 msgid "It misses an \"account Revenue\" default property!"
 msgstr ""
 
-msgctxt "error:sale.line:0"
+msgctxt "error:sale.line:"
 msgid "The customer location is required!"
 msgstr ""
 
-msgctxt "error:sale.sale:0"
+msgctxt "error:sale.sale:"
 msgid "Invoice and Shipment addresses must be defined for the quotation."
 msgstr ""
 
-msgctxt "error:sale.sale:0"
+msgctxt "error:sale.sale:"
 msgid "It misses an \"Account Receivable\" on the party \"%s\"!"
 msgstr ""
 
-msgctxt "error:sale.sale:0"
+msgctxt "error:sale.sale:"
+msgid "Sale \"%s\" must be cancelled before deletion!"
+msgstr ""
+
+msgctxt "error:sale.sale:"
+msgid "Warehouse must be defined for the quotation."
+msgstr ""
+
+msgctxt "error:sale.sale:"
 msgid "Wrong combination of method!"
 msgstr ""
 
-msgctxt "error:stock.shipment.out:0"
+msgctxt "error:stock.shipment.out.return:"
 msgid "You cannot reset to draft a move generated by a sale."
 msgstr ""
 
-msgctxt "field:account.invoice,sale_exception_state:0"
+msgctxt "error:stock.shipment.out:"
+msgid "You cannot reset to draft a move generated by a sale."
+msgstr ""
+
+msgctxt "field:account.invoice,sale_exception_state:"
 msgid "Exception State"
 msgstr ""
 
-msgctxt "field:account.invoice,sales:0"
+msgctxt "field:account.invoice,sales:"
 msgid "Sales"
 msgstr ""
 
-msgctxt "field:account.invoice.line,sale_lines:0"
+msgctxt "field:account.invoice.line,sale_lines:"
 msgid "Sale Lines"
 msgstr ""
 
-msgctxt "field:product.template,delivery_time:0"
+msgctxt "field:product.template,delivery_time:"
 msgid "Delivery Time"
 msgstr ""
 
-msgctxt "field:product.template,salable:0"
+msgctxt "field:product.template,salable:"
 msgid "Salable"
 msgstr ""
 
-msgctxt "field:product.template,sale_uom:0"
+msgctxt "field:product.template,sale_uom:"
 msgid "Sale UOM"
 msgstr ""
 
+msgctxt "field:sale.configuration,create_date:"
+msgid "Create Date"
+msgstr ""
+
+msgctxt "field:sale.configuration,create_uid:"
+msgid "Create User"
+msgstr ""
+
+msgctxt "field:sale.configuration,id:"
+msgid "ID"
+msgstr ""
+
 #, fuzzy
-msgctxt "field:sale.configuration,rec_name:0"
+msgctxt "field:sale.configuration,rec_name:"
 msgid "Name"
 msgstr "Наименование"
 
-msgctxt "field:sale.configuration,sale_invoice_method:0"
+msgctxt "field:sale.configuration,sale_invoice_method:"
 msgid "Sale Invoice Method"
 msgstr ""
 
-msgctxt "field:sale.configuration,sale_sequence:0"
+msgctxt "field:sale.configuration,sale_sequence:"
 msgid "Sale Reference Sequence"
 msgstr ""
 
-msgctxt "field:sale.configuration,sale_shipment_method:0"
+msgctxt "field:sale.configuration,sale_shipment_method:"
 msgid "Sale Shipment Method"
 msgstr ""
 
-msgctxt "field:sale.handle.invoice.exception.ask,domain_invoices:0"
+msgctxt "field:sale.configuration,write_date:"
+msgid "Write Date"
+msgstr ""
+
+msgctxt "field:sale.configuration,write_uid:"
+msgid "Write User"
+msgstr ""
+
+msgctxt "field:sale.handle.invoice.exception.ask,domain_invoices:"
 msgid "Domain Invoices"
 msgstr ""
 
-msgctxt "field:sale.handle.invoice.exception.ask,recreate_invoices:0"
+msgctxt "field:sale.handle.invoice.exception.ask,id:"
+msgid "ID"
+msgstr ""
+
+msgctxt "field:sale.handle.invoice.exception.ask,recreate_invoices:"
 msgid "Recreate Invoices"
 msgstr ""
 
-msgctxt "field:sale.handle.shipment.exception.ask,domain_moves:0"
+msgctxt "field:sale.handle.shipment.exception.ask,domain_moves:"
 msgid "Domain Moves"
 msgstr ""
 
-msgctxt "field:sale.handle.shipment.exception.ask,recreate_moves:0"
+msgctxt "field:sale.handle.shipment.exception.ask,id:"
+msgid "ID"
+msgstr ""
+
+msgctxt "field:sale.handle.shipment.exception.ask,recreate_moves:"
 msgid "Recreate Moves"
 msgstr ""
 
-msgctxt "field:sale.line,amount:0"
+msgctxt "field:sale.line,amount:"
 msgid "Amount"
 msgstr ""
 
+msgctxt "field:sale.line,create_date:"
+msgid "Create Date"
+msgstr ""
+
+msgctxt "field:sale.line,create_uid:"
+msgid "Create User"
+msgstr ""
+
+msgctxt "field:sale.line,delivery_date:"
+msgid "Delivery Date"
+msgstr ""
+
 #, fuzzy
-msgctxt "field:sale.line,description:0"
+msgctxt "field:sale.line,description:"
 msgid "Description"
 msgstr "Описание"
 
-msgctxt "field:sale.line,invoice_lines:0"
+#, fuzzy
+msgctxt "field:sale.line,from_location:"
+msgid "From Location"
+msgstr "Из места"
+
+msgctxt "field:sale.line,id:"
+msgid "ID"
+msgstr ""
+
+msgctxt "field:sale.line,invoice_lines:"
 msgid "Invoice Lines"
 msgstr ""
 
-msgctxt "field:sale.line,move_done:0"
+msgctxt "field:sale.line,move_done:"
 msgid "Moves Done"
 msgstr ""
 
-msgctxt "field:sale.line,move_exception:0"
+msgctxt "field:sale.line,move_exception:"
 msgid "Moves Exception"
 msgstr ""
 
 #, fuzzy
-msgctxt "field:sale.line,moves:0"
+msgctxt "field:sale.line,moves:"
 msgid "Moves"
 msgstr "Перемещения"
 
-msgctxt "field:sale.line,moves_ignored:0"
+msgctxt "field:sale.line,moves_ignored:"
 msgid "Ignored Moves"
 msgstr ""
 
-msgctxt "field:sale.line,moves_recreated:0"
+msgctxt "field:sale.line,moves_recreated:"
 msgid "Recreated Moves"
 msgstr ""
 
-msgctxt "field:sale.line,note:0"
+msgctxt "field:sale.line,note:"
 msgid "Note"
 msgstr ""
 
 #, fuzzy
-msgctxt "field:sale.line,product:0"
+msgctxt "field:sale.line,product:"
 msgid "Product"
 msgstr "Товарно материальные ценности (ТМЦ)"
 
+msgctxt "field:sale.line,product_uom_category:"
+msgid "Product Uom Category"
+msgstr ""
+
 #, fuzzy
-msgctxt "field:sale.line,quantity:0"
+msgctxt "field:sale.line,quantity:"
 msgid "Quantity"
 msgstr "Кол-во"
 
 #, fuzzy
-msgctxt "field:sale.line,rec_name:0"
+msgctxt "field:sale.line,rec_name:"
 msgid "Name"
 msgstr "Наименование"
 
-msgctxt "field:sale.line,sale:0"
+msgctxt "field:sale.line,sale:"
 msgid "Sale"
 msgstr ""
 
 #, fuzzy
-msgctxt "field:sale.line,sequence:0"
+msgctxt "field:sale.line,sequence:"
 msgid "Sequence"
 msgstr "Последовательность"
 
-msgctxt "field:sale.line,taxes:0"
+msgctxt "field:sale.line,taxes:"
 msgid "Taxes"
 msgstr ""
 
 #, fuzzy
-msgctxt "field:sale.line,type:0"
+msgctxt "field:sale.line,to_location:"
+msgid "To Location"
+msgstr "В место"
+
+#, fuzzy
+msgctxt "field:sale.line,type:"
 msgid "Type"
 msgstr "Тип"
 
 #, fuzzy
-msgctxt "field:sale.line,unit:0"
+msgctxt "field:sale.line,unit:"
 msgid "Unit"
 msgstr "Штука"
 
 #, fuzzy
-msgctxt "field:sale.line,unit_digits:0"
+msgctxt "field:sale.line,unit_digits:"
 msgid "Unit Digits"
 msgstr "Группа цифр"
 
 #, fuzzy
-msgctxt "field:sale.line,unit_price:0"
+msgctxt "field:sale.line,unit_price:"
 msgid "Unit Price"
 msgstr "Цена за единицу"
 
-msgctxt "field:sale.line-account.invoice.line,invoice_line:0"
+#, fuzzy
+msgctxt "field:sale.line,warehouse:"
+msgid "Warehouse"
+msgstr "Товарный склад"
+
+msgctxt "field:sale.line,write_date:"
+msgid "Write Date"
+msgstr ""
+
+msgctxt "field:sale.line,write_uid:"
+msgid "Write User"
+msgstr ""
+
+msgctxt "field:sale.line-account.invoice.line,create_date:"
+msgid "Create Date"
+msgstr ""
+
+msgctxt "field:sale.line-account.invoice.line,create_uid:"
+msgid "Create User"
+msgstr ""
+
+msgctxt "field:sale.line-account.invoice.line,id:"
+msgid "ID"
+msgstr ""
+
+msgctxt "field:sale.line-account.invoice.line,invoice_line:"
 msgid "Invoice Line"
 msgstr ""
 
 #, fuzzy
-msgctxt "field:sale.line-account.invoice.line,rec_name:0"
+msgctxt "field:sale.line-account.invoice.line,rec_name:"
 msgid "Name"
 msgstr "Наименование"
 
-msgctxt "field:sale.line-account.invoice.line,sale_line:0"
+msgctxt "field:sale.line-account.invoice.line,sale_line:"
 msgid "Sale Line"
 msgstr ""
 
-msgctxt "field:sale.line-account.tax,line:0"
+msgctxt "field:sale.line-account.invoice.line,write_date:"
+msgid "Write Date"
+msgstr ""
+
+msgctxt "field:sale.line-account.invoice.line,write_uid:"
+msgid "Write User"
+msgstr ""
+
+msgctxt "field:sale.line-account.tax,create_date:"
+msgid "Create Date"
+msgstr ""
+
+msgctxt "field:sale.line-account.tax,create_uid:"
+msgid "Create User"
+msgstr ""
+
+msgctxt "field:sale.line-account.tax,id:"
+msgid "ID"
+msgstr ""
+
+msgctxt "field:sale.line-account.tax,line:"
 msgid "Sale Line"
 msgstr ""
 
 #, fuzzy
-msgctxt "field:sale.line-account.tax,rec_name:0"
+msgctxt "field:sale.line-account.tax,rec_name:"
 msgid "Name"
 msgstr "Наименование"
 
-msgctxt "field:sale.line-account.tax,tax:0"
+msgctxt "field:sale.line-account.tax,tax:"
 msgid "Tax"
 msgstr ""
 
+msgctxt "field:sale.line-account.tax,write_date:"
+msgid "Write Date"
+msgstr ""
+
+msgctxt "field:sale.line-account.tax,write_uid:"
+msgid "Write User"
+msgstr ""
+
+msgctxt "field:sale.line-ignored-stock.move,create_date:"
+msgid "Create Date"
+msgstr ""
+
+msgctxt "field:sale.line-ignored-stock.move,create_uid:"
+msgid "Create User"
+msgstr ""
+
+msgctxt "field:sale.line-ignored-stock.move,id:"
+msgid "ID"
+msgstr ""
+
 #, fuzzy
-msgctxt "field:sale.line-ignored-stock.move,move:0"
+msgctxt "field:sale.line-ignored-stock.move,move:"
 msgid "Move"
 msgstr "Перемещение"
 
 #, fuzzy
-msgctxt "field:sale.line-ignored-stock.move,rec_name:0"
+msgctxt "field:sale.line-ignored-stock.move,rec_name:"
 msgid "Name"
 msgstr "Наименование"
 
-msgctxt "field:sale.line-ignored-stock.move,sale_line:0"
+msgctxt "field:sale.line-ignored-stock.move,sale_line:"
 msgid "Sale Line"
 msgstr ""
 
+msgctxt "field:sale.line-ignored-stock.move,write_date:"
+msgid "Write Date"
+msgstr ""
+
+msgctxt "field:sale.line-ignored-stock.move,write_uid:"
+msgid "Write User"
+msgstr ""
+
+msgctxt "field:sale.line-recreated-stock.move,create_date:"
+msgid "Create Date"
+msgstr ""
+
+msgctxt "field:sale.line-recreated-stock.move,create_uid:"
+msgid "Create User"
+msgstr ""
+
+msgctxt "field:sale.line-recreated-stock.move,id:"
+msgid "ID"
+msgstr ""
+
 #, fuzzy
-msgctxt "field:sale.line-recreated-stock.move,move:0"
+msgctxt "field:sale.line-recreated-stock.move,move:"
 msgid "Move"
 msgstr "Перемещение"
 
 #, fuzzy
-msgctxt "field:sale.line-recreated-stock.move,rec_name:0"
+msgctxt "field:sale.line-recreated-stock.move,rec_name:"
 msgid "Name"
 msgstr "Наименование"
 
-msgctxt "field:sale.line-recreated-stock.move,sale_line:0"
+msgctxt "field:sale.line-recreated-stock.move,sale_line:"
 msgid "Sale Line"
 msgstr ""
 
+msgctxt "field:sale.line-recreated-stock.move,write_date:"
+msgid "Write Date"
+msgstr ""
+
+msgctxt "field:sale.line-recreated-stock.move,write_uid:"
+msgid "Write User"
+msgstr ""
+
 #, fuzzy
-msgctxt "field:sale.sale,comment:0"
+msgctxt "field:sale.sale,comment:"
 msgid "Comment"
 msgstr "Комментарии"
 
 #, fuzzy
-msgctxt "field:sale.sale,company:0"
+msgctxt "field:sale.sale,company:"
 msgid "Company"
 msgstr "Учет.орг."
 
+msgctxt "field:sale.sale,create_date:"
+msgid "Create Date"
+msgstr ""
+
+msgctxt "field:sale.sale,create_uid:"
+msgid "Create User"
+msgstr ""
+
 #, fuzzy
-msgctxt "field:sale.sale,currency:0"
+msgctxt "field:sale.sale,currency:"
 msgid "Currency"
 msgstr "Валюты"
 
-msgctxt "field:sale.sale,currency_digits:0"
+msgctxt "field:sale.sale,currency_digits:"
 msgid "Currency Digits"
 msgstr ""
 
 #, fuzzy
-msgctxt "field:sale.sale,description:0"
+msgctxt "field:sale.sale,description:"
 msgid "Description"
 msgstr "Описание"
 
-msgctxt "field:sale.sale,invoice_address:0"
-msgid "Invoice Address"
+msgctxt "field:sale.sale,id:"
+msgid "ID"
 msgstr ""
 
-msgctxt "field:sale.sale,invoice_exception:0"
-msgid "Invoices Exception"
+msgctxt "field:sale.sale,invoice_address:"
+msgid "Invoice Address"
 msgstr ""
 
-msgctxt "field:sale.sale,invoice_method:0"
+msgctxt "field:sale.sale,invoice_method:"
 msgid "Invoice Method"
 msgstr ""
 
-msgctxt "field:sale.sale,invoice_paid:0"
-msgid "Invoices Paid"
-msgstr ""
-
-msgctxt "field:sale.sale,invoice_state:0"
+msgctxt "field:sale.sale,invoice_state:"
 msgid "Invoice State"
 msgstr ""
 
-msgctxt "field:sale.sale,invoices:0"
+msgctxt "field:sale.sale,invoices:"
 msgid "Invoices"
 msgstr ""
 
-msgctxt "field:sale.sale,invoices_ignored:0"
+msgctxt "field:sale.sale,invoices_ignored:"
 msgid "Ignored Invoices"
 msgstr ""
 
-msgctxt "field:sale.sale,invoices_recreated:0"
+msgctxt "field:sale.sale,invoices_recreated:"
 msgid "Recreated Invoices"
 msgstr ""
 
 #, fuzzy
-msgctxt "field:sale.sale,lines:0"
+msgctxt "field:sale.sale,lines:"
 msgid "Lines"
 msgstr "Строки"
 
 #, fuzzy
-msgctxt "field:sale.sale,moves:0"
+msgctxt "field:sale.sale,moves:"
 msgid "Moves"
 msgstr "Перемещения"
 
 #, fuzzy
-msgctxt "field:sale.sale,party:0"
+msgctxt "field:sale.sale,party:"
 msgid "Party"
 msgstr "Организации"
 
-msgctxt "field:sale.sale,party_lang:0"
+msgctxt "field:sale.sale,party_lang:"
 msgid "Party Language"
 msgstr ""
 
-msgctxt "field:sale.sale,payment_term:0"
+msgctxt "field:sale.sale,payment_term:"
 msgid "Payment Term"
 msgstr ""
 
 #, fuzzy
-msgctxt "field:sale.sale,rec_name:0"
+msgctxt "field:sale.sale,rec_name:"
 msgid "Name"
 msgstr "Наименование"
 
 #, fuzzy
-msgctxt "field:sale.sale,reference:0"
+msgctxt "field:sale.sale,reference:"
 msgid "Reference"
 msgstr "Ссылка"
 
-msgctxt "field:sale.sale,sale_date:0"
+msgctxt "field:sale.sale,sale_date:"
 msgid "Sale Date"
 msgstr ""
 
-msgctxt "field:sale.sale,shipment_address:0"
+msgctxt "field:sale.sale,shipment_address:"
 msgid "Shipment Address"
 msgstr ""
 
-msgctxt "field:sale.sale,shipment_done:0"
-msgid "Shipment Done"
-msgstr ""
-
-msgctxt "field:sale.sale,shipment_exception:0"
-msgid "Shipments Exception"
+msgctxt "field:sale.sale,shipment_method:"
+msgid "Shipment Method"
 msgstr ""
 
-msgctxt "field:sale.sale,shipment_method:0"
-msgid "Shipment Method"
+msgctxt "field:sale.sale,shipment_returns:"
+msgid "Shipment Returns"
 msgstr ""
 
-msgctxt "field:sale.sale,shipment_state:0"
+msgctxt "field:sale.sale,shipment_state:"
 msgid "Shipment State"
 msgstr ""
 
-msgctxt "field:sale.sale,shipments:0"
+msgctxt "field:sale.sale,shipments:"
 msgid "Shipments"
 msgstr ""
 
 #, fuzzy
-msgctxt "field:sale.sale,state:0"
+msgctxt "field:sale.sale,state:"
 msgid "State"
 msgstr "Статус"
 
-msgctxt "field:sale.sale,tax_amount:0"
+msgctxt "field:sale.sale,tax_amount:"
 msgid "Tax"
 msgstr ""
 
-msgctxt "field:sale.sale,total_amount:0"
+msgctxt "field:sale.sale,tax_amount_cache:"
+msgid "Tax Cache"
+msgstr ""
+
+msgctxt "field:sale.sale,total_amount:"
 msgid "Total"
 msgstr ""
 
-msgctxt "field:sale.sale,untaxed_amount:0"
+msgctxt "field:sale.sale,total_amount_cache:"
+msgid "Total Tax"
+msgstr ""
+
+msgctxt "field:sale.sale,untaxed_amount:"
 msgid "Untaxed"
 msgstr ""
 
+msgctxt "field:sale.sale,untaxed_amount_cache:"
+msgid "Untaxed Cache"
+msgstr ""
+
 #, fuzzy
-msgctxt "field:sale.sale,warehouse:0"
+msgctxt "field:sale.sale,warehouse:"
 msgid "Warehouse"
 msgstr "Товарный склад"
 
-msgctxt "field:sale.sale-account.invoice,invoice:0"
+msgctxt "field:sale.sale,write_date:"
+msgid "Write Date"
+msgstr ""
+
+msgctxt "field:sale.sale,write_uid:"
+msgid "Write User"
+msgstr ""
+
+msgctxt "field:sale.sale-account.invoice,create_date:"
+msgid "Create Date"
+msgstr ""
+
+msgctxt "field:sale.sale-account.invoice,create_uid:"
+msgid "Create User"
+msgstr ""
+
+msgctxt "field:sale.sale-account.invoice,id:"
+msgid "ID"
+msgstr ""
+
+msgctxt "field:sale.sale-account.invoice,invoice:"
 msgid "Invoice"
 msgstr ""
 
 #, fuzzy
-msgctxt "field:sale.sale-account.invoice,rec_name:0"
+msgctxt "field:sale.sale-account.invoice,rec_name:"
 msgid "Name"
 msgstr "Наименование"
 
-msgctxt "field:sale.sale-account.invoice,sale:0"
+msgctxt "field:sale.sale-account.invoice,sale:"
 msgid "Sale"
 msgstr ""
 
-msgctxt "field:sale.sale-ignored-account.invoice,invoice:0"
+msgctxt "field:sale.sale-account.invoice,write_date:"
+msgid "Write Date"
+msgstr ""
+
+msgctxt "field:sale.sale-account.invoice,write_uid:"
+msgid "Write User"
+msgstr ""
+
+msgctxt "field:sale.sale-ignored-account.invoice,create_date:"
+msgid "Create Date"
+msgstr ""
+
+msgctxt "field:sale.sale-ignored-account.invoice,create_uid:"
+msgid "Create User"
+msgstr ""
+
+msgctxt "field:sale.sale-ignored-account.invoice,id:"
+msgid "ID"
+msgstr ""
+
+msgctxt "field:sale.sale-ignored-account.invoice,invoice:"
 msgid "Invoice"
 msgstr ""
 
 #, fuzzy
-msgctxt "field:sale.sale-ignored-account.invoice,rec_name:0"
+msgctxt "field:sale.sale-ignored-account.invoice,rec_name:"
 msgid "Name"
 msgstr "Наименование"
 
-msgctxt "field:sale.sale-ignored-account.invoice,sale:0"
+msgctxt "field:sale.sale-ignored-account.invoice,sale:"
 msgid "Sale"
 msgstr ""
 
-msgctxt "field:sale.sale-recreated-account.invoice,invoice:0"
+msgctxt "field:sale.sale-ignored-account.invoice,write_date:"
+msgid "Write Date"
+msgstr ""
+
+msgctxt "field:sale.sale-ignored-account.invoice,write_uid:"
+msgid "Write User"
+msgstr ""
+
+msgctxt "field:sale.sale-recreated-account.invoice,create_date:"
+msgid "Create Date"
+msgstr ""
+
+msgctxt "field:sale.sale-recreated-account.invoice,create_uid:"
+msgid "Create User"
+msgstr ""
+
+msgctxt "field:sale.sale-recreated-account.invoice,id:"
+msgid "ID"
+msgstr ""
+
+msgctxt "field:sale.sale-recreated-account.invoice,invoice:"
 msgid "Invoice"
 msgstr ""
 
 #, fuzzy
-msgctxt "field:sale.sale-recreated-account.invoice,rec_name:0"
+msgctxt "field:sale.sale-recreated-account.invoice,rec_name:"
 msgid "Name"
 msgstr "Наименование"
 
-msgctxt "field:sale.sale-recreated-account.invoice,sale:0"
+msgctxt "field:sale.sale-recreated-account.invoice,sale:"
 msgid "Sale"
 msgstr ""
 
-msgctxt "field:stock.move,sale:0"
+msgctxt "field:sale.sale-recreated-account.invoice,write_date:"
+msgid "Write Date"
+msgstr ""
+
+msgctxt "field:sale.sale-recreated-account.invoice,write_uid:"
+msgid "Write User"
+msgstr ""
+
+msgctxt "field:stock.move,sale:"
 msgid "Sale"
 msgstr ""
 
-msgctxt "field:stock.move,sale_exception_state:0"
+msgctxt "field:stock.move,sale_exception_state:"
 msgid "Exception State"
 msgstr ""
 
-msgctxt "field:stock.move,sale_line:0"
+msgctxt "field:stock.move,sale_line:"
 msgid "Sale Line"
 msgstr ""
 
-msgctxt "help:product.template,delivery_time:0"
+msgctxt "help:product.template,delivery_time:"
 msgid "In number of days"
 msgstr ""
 
-msgctxt "help:sale.handle.invoice.exception.ask,recreate_invoices:0"
+msgctxt "help:sale.handle.invoice.exception.ask,recreate_invoices:"
 msgid ""
 "The selected invoices will be recreated. The other ones will be ignored."
 msgstr ""
@@ -442,6 +685,10 @@ msgctxt "model:ir.action,name:act_open_customer"
 msgid "Parties associated to Sales"
 msgstr ""
 
+msgctxt "model:ir.action,name:act_return_form"
+msgid "Returns"
+msgstr ""
+
 msgctxt "model:ir.action,name:act_sale_configuration_form"
 msgid "Sales Configuration"
 msgstr ""
@@ -462,6 +709,10 @@ msgctxt "model:ir.action,name:act_sale_form_draft"
 msgid "Draft Sales"
 msgstr ""
 
+msgctxt "model:ir.action,name:act_sale_form_processing"
+msgid "Processing Sales"
+msgstr ""
+
 msgctxt "model:ir.action,name:act_sale_form_quotation"
 msgid "Quotation Sales"
 msgstr ""
@@ -478,6 +729,10 @@ msgctxt "model:ir.action,name:wizard_invoice_handle_exception"
 msgid "Handle Invoice Exception"
 msgstr ""
 
+msgctxt "model:ir.action,name:wizard_return_sale"
+msgid "Create Return Sale"
+msgstr ""
+
 msgctxt "model:ir.action,name:wizard_shipment_handle_exception"
 msgid "Handle Shipment Exception"
 msgstr ""
@@ -519,6 +774,10 @@ msgctxt "model:ir.ui.menu,name:menu_sale_form_draft"
 msgid "Draft Sales"
 msgstr ""
 
+msgctxt "model:ir.ui.menu,name:menu_sale_form_processing"
+msgid "Processing Sales"
+msgstr ""
+
 msgctxt "model:ir.ui.menu,name:menu_sale_form_quotation"
 msgid "Quotation Sales"
 msgstr ""
@@ -531,523 +790,423 @@ msgctxt "model:res.group,name:group_sale_admin"
 msgid "Sales Administrator"
 msgstr ""
 
-msgctxt "model:sale.configuration,name:0"
+msgctxt "model:sale.configuration,name:"
 msgid "Sale Configuration"
 msgstr ""
 
-msgctxt "model:sale.handle.invoice.exception.ask,name:0"
-msgid "Invoice Exception Ask"
+msgctxt "model:sale.handle.invoice.exception.ask,name:"
+msgid "Handle Invoice Exception"
 msgstr ""
 
-msgctxt "model:sale.handle.shipment.exception.ask,name:0"
-msgid "Shipment Exception Ask"
+msgctxt "model:sale.handle.shipment.exception.ask,name:"
+msgid "Handle Shipment Exception"
 msgstr ""
 
-msgctxt "model:sale.line,name:0"
+msgctxt "model:sale.line,name:"
 msgid "Sale Line"
 msgstr ""
 
-msgctxt "model:sale.line-account.invoice.line,name:0"
+msgctxt "model:sale.line-account.invoice.line,name:"
 msgid "Sale Line - Invoice Line"
 msgstr ""
 
-msgctxt "model:sale.line-account.tax,name:0"
+msgctxt "model:sale.line-account.tax,name:"
 msgid "Sale Line - Tax"
 msgstr ""
 
-msgctxt "model:sale.line-ignored-stock.move,name:0"
+msgctxt "model:sale.line-ignored-stock.move,name:"
 msgid "Sale Line - Ignored Move"
 msgstr ""
 
-msgctxt "model:sale.line-recreated-stock.move,name:0"
+msgctxt "model:sale.line-recreated-stock.move,name:"
 msgid "Sale Line - Recreated Move"
 msgstr ""
 
-msgctxt "model:sale.sale,name:0"
+msgctxt "model:sale.sale,name:"
 msgid "Sale"
 msgstr ""
 
-msgctxt "model:sale.sale-account.invoice,name:0"
+msgctxt "model:sale.sale-account.invoice,name:"
 msgid "Sale - Invoice"
 msgstr ""
 
-msgctxt "model:sale.sale-ignored-account.invoice,name:0"
+msgctxt "model:sale.sale-ignored-account.invoice,name:"
 msgid "Sale - Ignored Invoice"
 msgstr ""
 
-msgctxt "model:sale.sale-recreated-account.invoice,name:0"
+msgctxt "model:sale.sale-recreated-account.invoice,name:"
 msgid "Sale - Recreated Invoice"
 msgstr ""
 
-msgctxt "model:workflow,name:sale_workflow"
-msgid "Sale workflow"
-msgstr ""
-
-#, fuzzy
-msgctxt "model:workflow.activity,name:sale_activity_cancel"
-msgid "Canceled"
-msgstr "Отменено"
-
-#, fuzzy
-msgctxt "model:workflow.activity,name:sale_activity_confirmed"
-msgid "Confirmed"
-msgstr "Подтвержденно"
-
-#, fuzzy
-msgctxt "model:workflow.activity,name:sale_activity_done"
-msgid "Done"
-msgstr "Выполнено"
-
-#, fuzzy
-msgctxt "model:workflow.activity,name:sale_activity_draft"
-msgid "Draft"
-msgstr "Черновик"
-
-msgctxt "model:workflow.activity,name:sale_activity_invoice_method"
-msgid "Invoice Method"
-msgstr ""
-
-msgctxt "model:workflow.activity,name:sale_activity_invoice_method_done"
-msgid "Invoice Method Done"
-msgstr ""
-
-msgctxt "model:workflow.activity,name:sale_activity_invoice_sale_done"
-msgid "Invoice Done"
-msgstr ""
-
-msgctxt "model:workflow.activity,name:sale_activity_invoice_sale_exception"
-msgid "Invoice Exception"
-msgstr ""
-
-msgctxt "model:workflow.activity,name:sale_activity_invoice_shipment"
-msgid "Invoice Shipment"
-msgstr ""
-
-msgctxt "model:workflow.activity,name:sale_activity_invoice_shipment_done"
-msgid "Invoice Shipment Done"
-msgstr ""
-
-msgctxt ""
-"model:workflow.activity,name:sale_activity_invoice_shipment_exception"
-msgid "Invoice Shipment Exception"
-msgstr ""
-
-msgctxt "model:workflow.activity,name:sale_activity_invoice_shipment_method"
-msgid "Invoice Shipment Method"
-msgstr ""
-
-msgctxt ""
-"model:workflow.activity,name:sale_activity_invoice_shipment_method_done"
-msgid "Invoice Shipment Method Done"
-msgstr ""
-
-msgctxt "model:workflow.activity,name:sale_activity_quotation"
-msgid "Quotation"
-msgstr ""
-
-msgctxt "model:workflow.activity,name:sale_activity_shipment"
-msgid "Shipment"
-msgstr ""
-
-msgctxt "model:workflow.activity,name:sale_activity_shipment_exception"
-msgid "Shipment Exception"
-msgstr ""
-
-msgctxt "model:workflow.activity,name:sale_activity_shipment_invoice"
-msgid "Shipment Invoice"
-msgstr ""
-
-msgctxt "model:workflow.activity,name:sale_activity_shipment_invoice_done"
-msgid "Shipment Invoice Done"
-msgstr ""
-
-msgctxt ""
-"model:workflow.activity,name:sale_activity_shipment_invoice_exception"
-msgid "Shipment Invoice Exception"
-msgstr ""
-
-msgctxt "model:workflow.activity,name:sale_activity_shipment_invoice_method"
-msgid "Shipment Invoice Method"
-msgstr ""
-
-msgctxt ""
-"model:workflow.activity,name:sale_activity_shipment_invoice_method_done"
-msgid "Shipment Invoice Method Done"
-msgstr ""
-
-msgctxt "model:workflow.activity,name:sale_activity_shipment_method"
-msgid "Shipment Method"
-msgstr ""
-
-msgctxt "model:workflow.activity,name:sale_activity_shipment_method_done"
-msgid "Shipment Method Done"
-msgstr ""
-
-msgctxt "model:workflow.activity,name:sale_activity_waiting_invoice_sale"
-msgid "Waiting Invoice"
-msgstr ""
-
-msgctxt "model:workflow.activity,name:sale_activity_waiting_invoice_shipment"
-msgid "Waiting Invoice Shipment"
-msgstr ""
-
-msgctxt "model:workflow.activity,name:sale_activity_waiting_shipment"
-msgid "Waiting Shipment"
-msgstr ""
-
-msgctxt "model:workflow.activity,name:sale_activity_waiting_shipment_invoice"
-msgid "Waiting Shipment Invoice"
-msgstr ""
-
-msgctxt "odt:sale.sale:0"
+msgctxt "odt:sale.sale:"
 msgid "Amount"
 msgstr ""
 
 #, fuzzy
-msgctxt "odt:sale.sale:0"
+msgctxt "odt:sale.sale:"
 msgid "Date:"
 msgstr "Дата:"
 
 #, fuzzy
-msgctxt "odt:sale.sale:0"
+msgctxt "odt:sale.sale:"
 msgid "Description"
 msgstr "Описание"
 
-msgctxt "odt:sale.sale:0"
+msgctxt "odt:sale.sale:"
 msgid "Description:"
 msgstr ""
 
-msgctxt "odt:sale.sale:0"
+msgctxt "odt:sale.sale:"
 msgid "Draft Sale Order"
 msgstr ""
 
 #, fuzzy
-msgctxt "odt:sale.sale:0"
+msgctxt "odt:sale.sale:"
 msgid "E-Mail:"
 msgstr "E-Mail:"
 
 #, fuzzy
-msgctxt "odt:sale.sale:0"
+msgctxt "odt:sale.sale:"
 msgid "Phone:"
 msgstr "Телефон:"
 
 #, fuzzy
-msgctxt "odt:sale.sale:0"
+msgctxt "odt:sale.sale:"
 msgid "Quantity"
 msgstr "Кол-во"
 
-msgctxt "odt:sale.sale:0"
+msgctxt "odt:sale.sale:"
 msgid "Quotation N°:"
 msgstr ""
 
-msgctxt "odt:sale.sale:0"
+msgctxt "odt:sale.sale:"
 msgid "Sale Order N°:"
 msgstr ""
 
-msgctxt "odt:sale.sale:0"
+msgctxt "odt:sale.sale:"
 msgid "Taxes"
 msgstr ""
 
-msgctxt "odt:sale.sale:0"
+msgctxt "odt:sale.sale:"
 msgid "Taxes:"
 msgstr ""
 
-msgctxt "odt:sale.sale:0"
+msgctxt "odt:sale.sale:"
 msgid "Total (excl. taxes):"
 msgstr ""
 
-msgctxt "odt:sale.sale:0"
+msgctxt "odt:sale.sale:"
 msgid "Total:"
 msgstr ""
 
 #, fuzzy
-msgctxt "odt:sale.sale:0"
+msgctxt "odt:sale.sale:"
 msgid "Unit Price"
 msgstr "Цена за единицу"
 
-msgctxt "odt:sale.sale:0"
+msgctxt "odt:sale.sale:"
 msgid "VAT Number:"
 msgstr ""
 
-msgctxt "odt:sale.sale:0"
+msgctxt "odt:sale.sale:"
 msgid "VAT:"
 msgstr ""
 
-#, fuzzy
-msgctxt "selection:account.invoice,sale_exception_state:0"
+msgctxt "selection:account.invoice,sale_exception_state:"
 msgid ""
-msgstr "Резервный счет"
+msgstr ""
 
-msgctxt "selection:account.invoice,sale_exception_state:0"
+msgctxt "selection:account.invoice,sale_exception_state:"
 msgid "Ignored"
 msgstr ""
 
-msgctxt "selection:account.invoice,sale_exception_state:0"
+msgctxt "selection:account.invoice,sale_exception_state:"
 msgid "Recreated"
 msgstr ""
 
-msgctxt "selection:sale.configuration,sale_invoice_method:0"
+msgctxt "selection:sale.configuration,sale_invoice_method:"
 msgid "Manual"
 msgstr ""
 
-msgctxt "selection:sale.configuration,sale_invoice_method:0"
-msgid "On Order Confirmed"
+msgctxt "selection:sale.configuration,sale_invoice_method:"
+msgid "On Order Processed"
 msgstr ""
 
-msgctxt "selection:sale.configuration,sale_invoice_method:0"
+msgctxt "selection:sale.configuration,sale_invoice_method:"
 msgid "On Shipment Sent"
 msgstr ""
 
-msgctxt "selection:sale.configuration,sale_shipment_method:0"
+msgctxt "selection:sale.configuration,sale_shipment_method:"
 msgid "Manual"
 msgstr ""
 
-msgctxt "selection:sale.configuration,sale_shipment_method:0"
+msgctxt "selection:sale.configuration,sale_shipment_method:"
 msgid "On Invoice Paid"
 msgstr ""
 
-msgctxt "selection:sale.configuration,sale_shipment_method:0"
-msgid "On Order Confirmed"
+msgctxt "selection:sale.configuration,sale_shipment_method:"
+msgid "On Order Processed"
 msgstr ""
 
 #, fuzzy
-msgctxt "selection:sale.line,type:0"
+msgctxt "selection:sale.line,type:"
 msgid "Comment"
 msgstr "Комментарии"
 
-msgctxt "selection:sale.line,type:0"
+msgctxt "selection:sale.line,type:"
 msgid "Line"
 msgstr ""
 
-msgctxt "selection:sale.line,type:0"
+msgctxt "selection:sale.line,type:"
 msgid "Subtotal"
 msgstr ""
 
-msgctxt "selection:sale.line,type:0"
+msgctxt "selection:sale.line,type:"
 msgid "Title"
 msgstr ""
 
-msgctxt "selection:sale.sale,invoice_method:0"
+msgctxt "selection:sale.sale,invoice_method:"
 msgid "Manual"
 msgstr ""
 
-msgctxt "selection:sale.sale,invoice_method:0"
-msgid "On Order Confirmed"
+msgctxt "selection:sale.sale,invoice_method:"
+msgid "On Order Processed"
 msgstr ""
 
-msgctxt "selection:sale.sale,invoice_method:0"
+msgctxt "selection:sale.sale,invoice_method:"
 msgid "On Shipment Sent"
 msgstr ""
 
-msgctxt "selection:sale.sale,invoice_state:0"
+msgctxt "selection:sale.sale,invoice_state:"
 msgid "Exception"
 msgstr ""
 
 #, fuzzy
-msgctxt "selection:sale.sale,invoice_state:0"
+msgctxt "selection:sale.sale,invoice_state:"
 msgid "None"
 msgstr "Отсутствует"
 
-msgctxt "selection:sale.sale,invoice_state:0"
+msgctxt "selection:sale.sale,invoice_state:"
 msgid "Paid"
 msgstr ""
 
 #, fuzzy
-msgctxt "selection:sale.sale,invoice_state:0"
+msgctxt "selection:sale.sale,invoice_state:"
 msgid "Waiting"
 msgstr "Ожидание"
 
-msgctxt "selection:sale.sale,shipment_method:0"
+msgctxt "selection:sale.sale,shipment_method:"
 msgid "Manual"
 msgstr ""
 
-msgctxt "selection:sale.sale,shipment_method:0"
+msgctxt "selection:sale.sale,shipment_method:"
 msgid "On Invoice Paid"
 msgstr ""
 
-msgctxt "selection:sale.sale,shipment_method:0"
-msgid "On Order Confirmed"
+msgctxt "selection:sale.sale,shipment_method:"
+msgid "On Order Processed"
 msgstr ""
 
-msgctxt "selection:sale.sale,shipment_state:0"
+msgctxt "selection:sale.sale,shipment_state:"
 msgid "Exception"
 msgstr ""
 
 #, fuzzy
-msgctxt "selection:sale.sale,shipment_state:0"
+msgctxt "selection:sale.sale,shipment_state:"
 msgid "None"
 msgstr "Отсутствует"
 
-msgctxt "selection:sale.sale,shipment_state:0"
+msgctxt "selection:sale.sale,shipment_state:"
 msgid "Sent"
 msgstr ""
 
 #, fuzzy
-msgctxt "selection:sale.sale,shipment_state:0"
+msgctxt "selection:sale.sale,shipment_state:"
 msgid "Waiting"
 msgstr "Ожидание"
 
 #, fuzzy
-msgctxt "selection:sale.sale,state:0"
+msgctxt "selection:sale.sale,state:"
 msgid "Canceled"
 msgstr "Отменено"
 
 #, fuzzy
-msgctxt "selection:sale.sale,state:0"
+msgctxt "selection:sale.sale,state:"
 msgid "Confirmed"
 msgstr "Подтвержденно"
 
 #, fuzzy
-msgctxt "selection:sale.sale,state:0"
+msgctxt "selection:sale.sale,state:"
 msgid "Done"
 msgstr "Выполнено"
 
 #, fuzzy
-msgctxt "selection:sale.sale,state:0"
+msgctxt "selection:sale.sale,state:"
 msgid "Draft"
 msgstr "Черновик"
 
-msgctxt "selection:sale.sale,state:0"
+msgctxt "selection:sale.sale,state:"
+msgid "Processing"
+msgstr ""
+
+msgctxt "selection:sale.sale,state:"
 msgid "Quotation"
 msgstr ""
 
-#, fuzzy
-msgctxt "selection:stock.move,sale_exception_state:0"
+msgctxt "selection:stock.move,sale_exception_state:"
 msgid ""
-msgstr "Резервный счет"
+msgstr ""
 
-msgctxt "selection:stock.move,sale_exception_state:0"
+msgctxt "selection:stock.move,sale_exception_state:"
 msgid "Ignored"
 msgstr ""
 
-msgctxt "selection:stock.move,sale_exception_state:0"
+msgctxt "selection:stock.move,sale_exception_state:"
 msgid "Recreated"
 msgstr ""
 
-msgctxt "view:product.template:0"
+#, fuzzy
+msgctxt "view:product.product:"
+msgid "Products"
+msgstr "ТМЦ"
+
+msgctxt "view:product.template:"
 msgid "Customers"
 msgstr ""
 
-msgctxt "view:sale.configuration:0"
+msgctxt "view:sale.configuration:"
 msgid "Sale Configuration"
 msgstr ""
 
-msgctxt "view:sale.handle.invoice.exception.ask:0"
+msgctxt "view:sale.handle.invoice.exception.ask:"
 msgid "Choose invoices to recreate"
 msgstr ""
 
-msgctxt "view:sale.handle.invoice.exception.ask:0"
+msgctxt "view:sale.handle.invoice.exception.ask:"
 msgid "Handle Invoice Exception"
 msgstr ""
 
-msgctxt "view:sale.handle.shipment.exception.ask:0"
+msgctxt "view:sale.handle.shipment.exception.ask:"
 msgid "Choose move to recreate"
 msgstr ""
 
-msgctxt "view:sale.handle.shipment.exception.ask:0"
+msgctxt "view:sale.handle.shipment.exception.ask:"
 msgid "Handle shipment Exception"
 msgstr ""
 
-msgctxt "view:sale.handle.shipment.exception.ask:0"
+msgctxt "view:sale.handle.shipment.exception.ask:"
 msgid "Recreate Moves"
 msgstr ""
 
 #, fuzzy
-msgctxt "view:sale.line:0"
+msgctxt "view:sale.line:"
 msgid "General"
 msgstr "Основной"
 
 #, fuzzy
-msgctxt "view:sale.line:0"
+msgctxt "view:sale.line:"
 msgid "Notes"
 msgstr "Комментарии"
 
 #, fuzzy
-msgctxt "view:sale.line:0"
+msgctxt "view:sale.line:"
 msgid "Products"
 msgstr "ТМЦ"
 
-msgctxt "view:sale.line:0"
+msgctxt "view:sale.line:"
 msgid "Sale Line"
 msgstr ""
 
-msgctxt "view:sale.line:0"
+msgctxt "view:sale.line:"
 msgid "Sale Lines"
 msgstr ""
 
 #, fuzzy
-msgctxt "view:sale.sale:0"
+msgctxt "view:sale.sale:"
 msgid "Cancel"
 msgstr "Отменить"
 
 #, fuzzy
-msgctxt "view:sale.sale:0"
+msgctxt "view:sale.sale:"
 msgid "Confirm"
 msgstr "Подтверждать"
 
 #, fuzzy
-msgctxt "view:sale.sale:0"
+msgctxt "view:sale.sale:"
 msgid "Draft"
 msgstr "Черновик"
 
-msgctxt "view:sale.sale:0"
+msgctxt "view:sale.sale:"
 msgid "Handle Invoice Exception"
 msgstr ""
 
-msgctxt "view:sale.sale:0"
+msgctxt "view:sale.sale:"
 msgid "Handle Shipment Exception"
 msgstr ""
 
-msgctxt "view:sale.sale:0"
+msgctxt "view:sale.sale:"
 msgid "Invoices"
 msgstr ""
 
 #, fuzzy
-msgctxt "view:sale.sale:0"
+msgctxt "view:sale.sale:"
 msgid "Lines"
 msgstr "Строки"
 
 #, fuzzy
-msgctxt "view:sale.sale:0"
+msgctxt "view:sale.sale:"
 msgid "Moves"
 msgstr "Перемещения"
 
-msgctxt "view:sale.sale:0"
+msgctxt "view:sale.sale:"
 msgid "Other Info"
 msgstr ""
 
-msgctxt "view:sale.sale:0"
+msgctxt "view:sale.sale:"
+msgid "Process"
+msgstr ""
+
+msgctxt "view:sale.sale:"
 msgid "Quotation"
 msgstr ""
 
-msgctxt "view:sale.sale:0"
+msgctxt "view:sale.sale:"
+msgid "Quote"
+msgstr ""
+
+msgctxt "view:sale.sale:"
 msgid "Sale"
 msgstr ""
 
-msgctxt "view:sale.sale:0"
+msgctxt "view:sale.sale:"
 msgid "Sales"
 msgstr ""
 
-msgctxt "view:sale.sale:0"
+msgctxt "view:sale.sale:"
 msgid "Shipments"
 msgstr ""
 
 #, fuzzy
-msgctxt "wizard_button:sale.handle.invoice.exception,init,end:0"
+msgctxt "view:stock.move:"
+msgid "Moves"
+msgstr "Перемещения"
+
+#, fuzzy
+msgctxt "wizard_button:sale.handle.invoice.exception,ask,end:"
 msgid "Cancel"
 msgstr "Отменить"
 
 #, fuzzy
-msgctxt "wizard_button:sale.handle.invoice.exception,init,ok:0"
+msgctxt "wizard_button:sale.handle.invoice.exception,ask,handle:"
 msgid "Ok"
-msgstr "Ок"
+msgstr "Да"
 
 #, fuzzy
-msgctxt "wizard_button:sale.handle.shipment.exception,init,end:0"
+msgctxt "wizard_button:sale.handle.shipment.exception,ask,end:"
 msgid "Cancel"
 msgstr "Отменить"
 
 #, fuzzy
-msgctxt "wizard_button:sale.handle.shipment.exception,init,ok:0"
+msgctxt "wizard_button:sale.handle.shipment.exception,ask,handle:"
 msgid "Ok"
-msgstr "Ок"
+msgstr "Да"
diff --git a/product.xml b/product.xml
new file mode 100644
index 0000000..adff21d
--- /dev/null
+++ b/product.xml
@@ -0,0 +1,26 @@
+<?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. -->
+<tryton>
+    <data>
+        <record model="ir.ui.view" id="product_view_list_sale_line">
+            <field name="model">product.product</field>
+            <field name="type">tree</field>
+            <field name="priority" eval="20"/>
+            <field name="arch" type="xml">
+                <![CDATA[
+                <tree string="Products">
+                    <field name="name"/>
+                    <field name="code"/>
+                    <field name="list_price_uom"/>
+                    <field name="cost_price_uom"/>
+                    <field name="quantity"/>
+                    <field name="forecast_quantity"/>
+                    <field name="default_uom"/>
+                    <field name="active"/>
+                </tree>
+                ]]>
+            </field>
+        </record>
+    </data>
+</tryton>
diff --git a/sale.odt b/sale.odt
index 63e8db8..600372b 100644
Binary files a/sale.odt and b/sale.odt differ
diff --git a/sale.py b/sale.py
index c817e99..91aa373 100644
--- a/sale.py
+++ b/sale.py
@@ -5,16 +5,18 @@ from decimal import Decimal
 import datetime
 from itertools import groupby
 from functools import partial
-from trytond.model import ModelWorkflow, ModelView, ModelSQL, fields
+from trytond.model import Workflow, ModelView, ModelSQL, fields
 from trytond.modules.company import CompanyReport
-from trytond.wizard import Wizard
+from trytond.wizard import Wizard, StateAction, StateView, StateTransition, \
+    Button
 from trytond.backend import TableHandler
 from trytond.pyson import If, Eval, Bool, PYSONEncoder
 from trytond.transaction import Transaction
 from trytond.pool import Pool
+from trytond.config import CONFIG
 
 
-class Sale(ModelWorkflow, ModelSQL, ModelView):
+class Sale(Workflow, ModelSQL, ModelView):
     'Sale'
     _name = 'sale.sale'
     _rec_name = 'reference'
@@ -22,14 +24,14 @@ class Sale(ModelWorkflow, ModelSQL, ModelView):
 
     company = fields.Many2One('company.company', 'Company', required=True,
         states={
-            'readonly': (Eval('state') != 'draft') | Eval('lines', []),
+            'readonly': (Eval('state') != 'draft') | Eval('lines', [0]),
             },
         domain=[
             ('id', If(Eval('context', {}).contains('company'), '=', '!='),
                 Eval('context', {}).get('company', 0)),
             ],
-        depends=['state', 'lines'])
-    reference = fields.Char('Reference', readonly=True, select=1)
+        depends=['state'], select=True)
+    reference = fields.Char('Reference', readonly=True, select=True)
     description = fields.Char('Description',
         states={
             'readonly': Eval('state') != 'draft',
@@ -39,12 +41,14 @@ class Sale(ModelWorkflow, ModelSQL, ModelView):
         ('draft', 'Draft'),
         ('quotation', 'Quotation'),
         ('confirmed', 'Confirmed'),
+        ('processing', 'Processing'),
         ('done', 'Done'),
         ('cancel', 'Canceled'),
     ], 'State', readonly=True, required=True)
-    sale_date = fields.Date('Sale Date', required=True,
+    sale_date = fields.Date('Sale Date',
         states={
-            'readonly': Eval('state') != 'draft',
+            'readonly': ~Eval('state').in_(['draft', 'quotation']),
+            'required': ~Eval('state').in_(['draft', 'quotation', 'cancel']),
             },
         depends=['state'])
     payment_term = fields.Many2One('account.invoice.payment_term',
@@ -52,8 +56,8 @@ class Sale(ModelWorkflow, ModelSQL, ModelView):
             'readonly': Eval('state') != 'draft',
             },
         depends=['state'])
-    party = fields.Many2One('party.party', 'Party', change_default=True,
-        required=True, select=1, states={
+    party = fields.Many2One('party.party', 'Party', required=True, select=True,
+        states={
             'readonly': Eval('state') != 'draft',
             }, on_change=['party', 'payment_term'],
         depends=['state'])
@@ -69,16 +73,16 @@ class Sale(ModelWorkflow, ModelSQL, ModelView):
             },
         depends=['party', 'state'])
     warehouse = fields.Many2One('stock.location', 'Warehouse',
-        domain=[('type', '=', 'warehouse')], required=True, states={
+        domain=[('type', '=', 'warehouse')], states={
             'readonly': Eval('state') != 'draft',
             },
         depends=['state'])
     currency = fields.Many2One('currency.currency', 'Currency', required=True,
         states={
             'readonly': (Eval('state') != 'draft') |
-                (Eval('lines', []) & Eval('currency', 0)),
+                (Eval('lines', [0]) & Eval('currency', 0)),
             },
-        depends=['state', 'lines'])
+        depends=['state'])
     currency_digits = fields.Function(fields.Integer('Currency Digits',
         on_change_with=['currency']), 'get_function_fields')
     lines = fields.One2Many('sale.line', 'sale', 'Lines', states={
@@ -88,16 +92,28 @@ class Sale(ModelWorkflow, ModelSQL, ModelView):
     comment = fields.Text('Comment')
     untaxed_amount = fields.Function(fields.Numeric('Untaxed',
             digits=(16, Eval('currency_digits', 2)),
-            depends=['currency_digits']), 'get_function_fields')
+            depends=['currency_digits']), 'get_untaxed_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_function_fields')
+            depends=['currency_digits']), 'get_tax_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_function_fields')
+            depends=['currency_digits']), 'get_total_amount')
+    total_amount_cache = fields.Numeric('Total Tax',
+        digits=(16, Eval('currency_digits', 2)),
+        readonly=True,
+        depends=['currency_digits'])
     invoice_method = fields.Selection([
             ('manual', 'Manual'),
-            ('order', 'On Order Confirmed'),
+            ('order', 'On Order Processed'),
             ('shipment', 'On Shipment Sent'),
             ],
         'Invoice Method', required=True, states={
@@ -105,24 +121,21 @@ class Sale(ModelWorkflow, ModelSQL, ModelView):
             },
         depends=['state'])
     invoice_state = fields.Selection([
-        ('none', 'None'),
-        ('waiting', 'Waiting'),
-        ('paid', 'Paid'),
-        ('exception', 'Exception'),
-    ], 'Invoice State', readonly=True, required=True)
+            ('none', 'None'),
+            ('waiting', 'Waiting'),
+            ('paid', 'Paid'),
+            ('exception', 'Exception'),
+            ], 'Invoice State', readonly=True, required=True)
     invoices = fields.Many2Many('sale.sale-account.invoice',
             'sale', 'invoice', 'Invoices', readonly=True)
     invoices_ignored = fields.Many2Many('sale.sale-ignored-account.invoice',
             'sale', 'invoice', 'Ignored Invoices', readonly=True)
-    invoices_recreated = fields.Many2Many('sale.sale-recreated-account.invoice',
-            'sale', 'invoice', 'Recreated Invoices', readonly=True)
-    invoice_paid = fields.Function(fields.Boolean('Invoices Paid'),
-            'get_function_fields')
-    invoice_exception = fields.Function(fields.Boolean('Invoices Exception'),
-            'get_function_fields')
+    invoices_recreated = fields.Many2Many(
+        'sale.sale-recreated-account.invoice', 'sale', 'invoice',
+        'Recreated Invoices', readonly=True)
     shipment_method = fields.Selection([
             ('manual', 'Manual'),
-            ('order', 'On Order Confirmed'),
+            ('order', 'On Order Processed'),
             ('invoice', 'On Invoice Paid'),
             ], 'Shipment Method', required=True,
         states={
@@ -130,24 +143,23 @@ class Sale(ModelWorkflow, ModelSQL, ModelView):
             },
         depends=['state'])
     shipment_state = fields.Selection([
-        ('none', 'None'),
-        ('waiting', 'Waiting'),
-        ('sent', 'Sent'),
-        ('exception', 'Exception'),
-    ], 'Shipment State', readonly=True, required=True)
+            ('none', 'None'),
+            ('waiting', 'Waiting'),
+            ('sent', 'Sent'),
+            ('exception', 'Exception'),
+            ], 'Shipment State', readonly=True, required=True)
     shipments = fields.Function(fields.One2Many('stock.shipment.out', None,
-        'Shipments'), 'get_function_fields')
+        'Shipments'), 'get_shipments')
+    shipment_returns = fields.Function(
+        fields.One2Many('stock.shipment.out.return', None, 'Shipment Returns'),
+        'get_shipment_returns')
     moves = fields.Function(fields.One2Many('stock.move', None, 'Moves'),
             'get_function_fields')
-    shipment_done = fields.Function(fields.Boolean('Shipment Done'),
-            'get_function_fields')
-    shipment_exception = fields.Function(fields.Boolean('Shipments Exception'),
-            'get_function_fields')
 
     def __init__(self):
         super(Sale, self).__init__()
-        self._order[0] = ('sale_date', 'DESC')
-        self._order[0] = ('id', 'DESC')
+        self._order.insert(0, ('sale_date', 'DESC'))
+        self._order.insert(1, ('id', 'DESC'))
         self._constraints += [
             ('check_method', 'wrong_method')
         ]
@@ -155,9 +167,44 @@ class Sale(ModelWorkflow, ModelSQL, ModelView):
             'wrong_method': 'Wrong combination of method!',
             'addresses_required': 'Invoice and Shipment addresses must be '
             'defined for the quotation.',
+            'warehouse_required': 'Warehouse must be defined for the ' \
+                'quotation.',
             'missing_account_receivable': 'It misses '
                     'an "Account Receivable" on the party "%s"!',
+            'delete_cancel': 'Sale "%s" must be cancelled before deletion!',
         })
+        self._transitions |= set((
+                ('draft', 'quotation'),
+                ('quotation', 'confirmed'),
+                ('confirmed', 'processing'),
+                ('processing', 'processing'),
+                ('draft', 'cancel'),
+                ('quotation', 'cancel'),
+                ('quotation', 'draft'),
+                ))
+        self._buttons.update({
+                'cancel': {
+                    'invisible': ((Eval('state') == 'cancel')
+                        | (~Eval('state').in_(['draft', 'quotation'])
+                            & (Eval('invoice_state') != 'exception')
+                            & (Eval('shipment_state') != 'exception'))),
+                    },
+                'draft': {
+                    'invisible': Eval('state') != 'quotation',
+                    },
+                'quote': {
+                    'invisible': Eval('state') != 'draft',
+                    'readonly': ~Eval('lines', []),
+                    },
+                'confirm': {
+                    'invisible': Eval('state') != 'quotation',
+                    },
+                'process': {
+                    'invisible': Eval('state') != 'confirmed',
+                    },
+                })
+        # The states where amounts are cached
+        self._states_cached = ['confirmed', 'processing', 'done', 'cancel']
 
     def init(self, module_name):
         cursor = Transaction().cursor
@@ -184,6 +231,20 @@ class Sale(ModelWorkflow, ModelSQL, ModelView):
                 "SET invoice_method = 'shipment' "
                 "WHERE invoice_method = 'packing'")
 
+        table = TableHandler(cursor, self, module_name)
+        # Migration from 2.2
+        table.not_null_action('sale_date', 'remove')
+
+        # state confirmed splitted into confirmed and processing
+        confirmed2processing = []
+        for sale in self.browse(self.search([
+                        ('state', '=', 'confirmed'),
+                        ])):
+            if sale.invoices or sale.moves:
+                confirmed2processing.append(sale.id)
+        if confirmed2processing:
+            self.write(confirmed2processing, {'state': 'processing'})
+
         # Add index on create_date
         table = TableHandler(cursor, self, module_name)
         table.index_action('create_date', action='add')
@@ -193,32 +254,24 @@ class Sale(ModelWorkflow, ModelSQL, ModelView):
         payment_term_ids = payment_term_obj.search(self.payment_term.domain)
         if len(payment_term_ids) == 1:
             return payment_term_ids[0]
-        return False
 
     def default_warehouse(self):
         location_obj = Pool().get('stock.location')
         location_ids = location_obj.search(self.warehouse.domain)
         if len(location_ids) == 1:
             return location_ids[0]
-        return False
 
     def default_company(self):
-        return Transaction().context.get('company') or False
+        return Transaction().context.get('company')
 
     def default_state(self):
         return 'draft'
 
-    def default_sale_date(self):
-        date_obj = Pool().get('ir.date')
-        return date_obj.today()
-
     def default_currency(self):
         company_obj = Pool().get('company.company')
-        currency_obj = Pool().get('currency.currency')
         company = Transaction().context.get('company')
         if company:
             return company_obj.browse(company).currency.id
-        return False
 
     def default_currency_digits(self):
         company_obj = Pool().get('company.company')
@@ -249,9 +302,9 @@ class Sale(ModelWorkflow, ModelSQL, ModelView):
         address_obj = pool.get('party.address')
         payment_term_obj = pool.get('account.invoice.payment_term')
         res = {
-            'invoice_address': False,
-            'shipment_address': False,
-            'payment_term': False,
+            'invoice_address': None,
+            'shipment_address': None,
+            'payment_term': None,
         }
         if vals.get('party'):
             party = party_obj.browse(vals['party'])
@@ -259,8 +312,8 @@ class Sale(ModelWorkflow, ModelSQL, ModelView):
                     type='invoice')
             res['shipment_address'] = party_obj.address_get(party.id,
                     type='delivery')
-            if party.payment_term:
-                res['payment_term'] = party.payment_term.id
+            if party.customer_payment_term:
+                res['payment_term'] = party.customer_payment_term.id
 
         if res['invoice_address']:
             res['invoice_address.rec_name'] = address_obj.browse(
@@ -314,7 +367,7 @@ class Sale(ModelWorkflow, ModelSQL, ModelView):
             party = party_obj.browse(vals['party'])
             if party.lang:
                 return party.lang.code
-        return 'en_US'
+        return CONFIG['language']
 
     def get_party_lang(self, sales):
         '''
@@ -329,10 +382,9 @@ class Sale(ModelWorkflow, ModelSQL, ModelView):
             if sale.party.lang:
                 res[sale.id] = sale.party.lang.code
             else:
-                res[sale.id] = 'en_US'
+                res[sale.id] = CONFIG['language']
         return res
 
-
     def on_change_lines(self, vals):
         pool = Pool()
         currency_obj = pool.get('currency.currency')
@@ -354,14 +406,14 @@ class Sale(ModelWorkflow, ModelSQL, ModelView):
             for line in vals['lines']:
                 if line.get('type', 'line') != 'line':
                     continue
-                res['untaxed_amount'] += line.get('amount', Decimal('0.0'))
+                res['untaxed_amount'] += line.get('amount') or Decimal(0)
                 tax_list = ()
                 with Transaction().set_context(self.get_tax_context(vals)):
                     tax_list = tax_obj.compute(line.get('taxes', []),
                             line.get('unit_price', Decimal('0.0')),
                             line.get('quantity', 0.0))
                 for tax in tax_list:
-                    key, val = invoice_obj._compute_tax(tax,'out_invoice')
+                    key, val = invoice_obj._compute_tax(tax, 'out_invoice')
                     if not key in taxes:
                         taxes[key] = val['amount']
                     else:
@@ -396,158 +448,120 @@ class Sale(ModelWorkflow, ModelSQL, ModelView):
             res['currency_digits'] = self.get_currency_digits(sales)
         if 'party_lang' in names:
             res['party_lang'] = self.get_party_lang(sales)
-        if 'untaxed_amount' in names:
-            res['untaxed_amount'] = self.get_untaxed_amount(sales)
-        if 'tax_amount' in names:
-            res['tax_amount'] = self.get_tax_amount(sales)
-        if 'total_amount' in names:
-            res['total_amount'] = self.get_total_amount(sales)
-        if 'invoice_paid' in names:
-            res['invoice_paid'] = self.get_invoice_paid(sales)
-        if 'invoice_exception' in names:
-            res['invoice_exception'] = self.get_invoice_exception(sales)
-        if 'shipments' in names:
-            res['shipments'] = self.get_shipments(sales)
         if 'moves' in names:
             res['moves'] = self.get_moves(sales)
-        if 'shipment_done' in names:
-            res['shipment_done'] = self.get_shipment_done(sales)
-        if 'shipment_exception' in names:
-            res['shipment_exception'] = self.get_shipment_exception(sales)
         return res
 
-    def get_untaxed_amount(self, sales):
+    def get_untaxed_amount(self, ids, name):
         '''
         Compute the untaxed amount for each sales
-
-        :param sales: a BrowseRecordList of sales
-        :return: a dictionary with sale id as key and
-            untaxed amount as value
         '''
         currency_obj = Pool().get('currency.currency')
-        res = {}
-        for sale in sales:
-            res.setdefault(sale.id, Decimal('0.0'))
-            for line in sale.lines:
-                if line.type != 'line':
-                    continue
-                res[sale.id] += line.amount
-            res[sale.id] = currency_obj.round(sale.currency, res[sale.id])
-        return res
+        amounts = {}
+        for sale in self.browse(ids):
+            if (sale.state in self._states_cached
+                    and sale.untaxed_amount_cache is not None):
+                amounts[sale.id] = sale.untaxed_amount_cache
+                continue
+            amount = sum((l.amount for l in sale.lines if l.type == 'line'),
+                Decimal(0))
+            amounts[sale.id] = currency_obj.round(sale.currency, amount)
+        return amounts
 
-    def get_tax_amount(self, sales):
+    def get_tax_amount(self, ids, name):
         '''
         Compute tax amount for each sales
-
-        :param sales: a BrowseRecordList of sales
-        :return: a dictionary with sale id as key and
-            tax amount as value
         '''
         pool = Pool()
         currency_obj = pool.get('currency.currency')
         tax_obj = pool.get('account.tax')
         invoice_obj = pool.get('account.invoice')
 
-        res = {}
-        for sale in sales:
-            res.setdefault(sale.id, Decimal('0.0'))
+        amounts = {}
+        for sale in self.browse(ids):
+            if (sale.state in self._states_cached
+                    and sale.tax_amount_cache is not None):
+                amounts[sale.id] = sale.tax_amount_cache
+                continue
+            context = self.get_tax_context(sale)
             taxes = {}
             for line in sale.lines:
                 if line.type != 'line':
                     continue
-                # Don't round on each line to handle rounding error
-                tax_list = ()
-                with Transaction().set_context(self.get_tax_context(sale)):
+                with Transaction().set_context(context):
                     tax_list = tax_obj.compute(
                             [t.id for t in line.taxes], line.unit_price,
                             line.quantity)
+                # Don't round on each line to handle rounding error
                 for tax in tax_list:
                     key, val = invoice_obj._compute_tax(tax, 'out_invoice')
                     if not key in taxes:
                         taxes[key] = val['amount']
                     else:
                         taxes[key] += val['amount']
-            for key in taxes:
-                res[sale.id] += currency_obj.round(sale.currency, taxes[key])
-            res[sale.id] = currency_obj.round(sale.currency, res[sale.id])
-        return res
+            amount = sum((currency_obj.round(sale.currency, taxes[key])
+                    for key in taxes), Decimal(0))
+            amounts[sale.id] = currency_obj.round(sale.currency, amount)
+        return amounts
 
-    def get_total_amount(self, sales):
+    def get_total_amount(self, ids, name):
         '''
         Return the total amount of each sales
-
-        :param sales: a BrowseRecordList of sales
-        :return: a dictionary with sale id as key and
-            total amount as value
         '''
         currency_obj = Pool().get('currency.currency')
-        res = {}
-        untaxed_amounts = self.get_untaxed_amount(sales)
-        tax_amounts = self.get_tax_amount(sales)
-        for sale in sales:
-            res[sale.id] = currency_obj.round(sale.currency,
-                    untaxed_amounts[sale.id] + tax_amounts[sale.id])
-        return res
-
-    def get_invoice_paid(self, sales):
-        '''
-        Return if all invoices have been paid for each sales
+        amounts = {}
+        for sale in self.browse(ids):
+            if (sale.state in self._states_cached
+                    and sale.total_amount_cache is not None):
+                amounts[sale.id] = sale.total_amount_cache
+                continue
+            amounts[sale.id] = currency_obj.round(sale.currency,
+                sale.untaxed_amount + sale.tax_amount)
+        return amounts
 
-        :param sales: a BrowseRecordList of sales
-        :return: a dictionary with sale id as key and
-            a boolean as value
+    def get_invoice_state(self, sale):
         '''
-        res = {}
-        for sale in sales:
-            val = True
-            skip_ids = set(x.id for x in sale.invoices_ignored)
-            skip_ids.update(x.id for x in sale.invoices_recreated)
-            for invoice in sale.invoices:
-                if invoice.state != 'paid' \
-                        and invoice.id not in skip_ids:
-                    val = False
-                    break
-            res[sale.id] = val
-        return res
-
-    def get_invoice_exception(self, sales):
+        Return the invoice state for the sale.
         '''
-        Return if there is an invoice exception for each sales
+        skip_ids = set(x.id for x in sale.invoices_ignored)
+        skip_ids.update(x.id for x in sale.invoices_recreated)
+        invoices = [i for i in sale.invoices if i.id not in skip_ids]
+        if invoices:
+            if any(i.state == 'cancel' for i in invoices):
+                return 'exception'
+            elif all(i.state == 'paid' for i in invoices):
+                return 'paid'
+            else:
+                return 'waiting'
+        return 'none'
 
-        :param sales: a BrowseRecordList of sales
-        :return: a dictionary with sale id as key and
-            a boolean as value
+    def set_invoice_state(self, sale):
         '''
-        res = {}
-        for sale in sales:
-            val = False
-            skip_ids = set(x.id for x in sale.invoices_ignored)
-            skip_ids.update(x.id for x in sale.invoices_recreated)
-            for invoice in sale.invoices:
-                if invoice.state == 'cancel' \
-                        and invoice.id not in skip_ids:
-                    val = True
-                    break
-            res[sale.id] = val
-        return res
-
-    def get_shipments(self, sales):
+        Set the invoice state.
         '''
-        Return shipment_out ids for each sales
+        state = self.get_invoice_state(sale)
+        if sale.invoice_state != state:
+            self.write(sale.id, {
+                    'invoice_state': state,
+                    })
 
-        :param sales: a BrowseRecordList of sales
-        :return: a dictionary with sale id as key and
-            a list of shipment_out id as value
-        '''
-        res = {}
-        for sale in sales:
-            res[sale.id] = []
-            for line in sale.lines:
-                for move in line.moves:
-                    if move.shipment_out:
-                        if move.shipment_out.id not in res[sale.id]:
-                            res[sale.id].append(move.shipment_out.id)
-        return res
+    def get_shipments_returns(attribute):
+        "Computes the returns or shipments"
+        def method(self, ids, name):
+            shipments = {}
+            for sale in self.browse(ids):
+                shipments[sale.id] = []
+                for line in sale.lines:
+                    for move in line.moves:
+                        ship_or_return = getattr(move, attribute)
+                        if bool(ship_or_return):
+                            if ship_or_return.id not in shipments[sale.id]:
+                                shipments[sale.id].append(ship_or_return.id)
+            return shipments
+        return method
+
+    get_shipments = get_shipments_returns('shipment_out')
+    get_shipment_returns = get_shipments_returns('shipment_out_return')
 
     def get_moves(self, sales):
         '''
@@ -564,41 +578,28 @@ class Sale(ModelWorkflow, ModelSQL, ModelView):
                 res[sale.id].extend([x.id for x in line.moves])
         return res
 
-    def get_shipment_done(self, sales):
+    def get_shipment_state(self, sale):
         '''
-        Return if all the shipments have been done for each sales
-
-        :param sales: a BrowseRecordList of sales
-        :return: a dictionary with sale id as key and
-            a boolean as value
+        Return the shipment state for the sale.
         '''
-        res = {}
-        for sale in sales:
-            val = True
-            for line in sale.lines:
-                if not line.move_done:
-                    val = False
-                    break
-            res[sale.id] = val
-        return res
+        if sale.moves:
+            if any(l.move_exception for l in sale.lines):
+                return 'exception'
+            elif all(l.move_done for l in sale.lines):
+                return 'sent'
+            else:
+                return 'waiting'
+        return 'none'
 
-    def get_shipment_exception(self, sales):
+    def set_shipment_state(self, sale):
         '''
-        Return if there is a shipment exception for each sales
-
-        :param sales: a BrowseRecordList of sales
-        :return: a dictionary with sale id as key and
-            a boolean as value
+        Set the shipment state.
         '''
-        res = {}
-        for sale in sales:
-            val = False
-            for line in sale.lines:
-                if line.move_exception:
-                    val = True
-                    break
-            res[sale.id] = val
-        return res
+        state = self.get_shipment_state(sale)
+        if sale.shipment_state != state:
+            self.write(sale.id, {
+                    'shipment_state': state,
+                    })
 
     def check_method(self, ids):
         '''
@@ -634,75 +635,78 @@ class Sale(ModelWorkflow, ModelSQL, ModelView):
             default = {}
         default = default.copy()
         default['state'] = 'draft'
-        default['reference'] = False
+        default['reference'] = None
         default['invoice_state'] = 'none'
-        default['invoices'] = False
-        default['invoices_ignored'] = False
+        default['invoices'] = None
+        default['invoices_ignored'] = None
         default['shipment_state'] = 'none'
+        default.setdefault('sale_date', None)
         return super(Sale, self).copy(ids, default=default)
 
-    def check_for_quotation(self, sale_id):
-        sale = self.browse(sale_id)
-        if not sale.invoice_address or not sale.shipment_address:
-            self.raise_user_error('addresses_required')
-        return True
+    def check_for_quotation(self, ids):
+        sales = self.browse(ids)
+        for sale in sales:
+            if not sale.invoice_address or not sale.shipment_address:
+                self.raise_user_error('addresses_required')
+            for line in sale.lines:
+                if line.quantity >= 0:
+                    location = line.from_location
+                else:
+                    location = line.to_location
+                if (not location
+                        and line.product
+                        and line.product.type in ('goods', 'assets')):
+                    self.raise_user_error('warehouse_required')
 
-    def set_reference(self, sale_id):
+    def set_reference(self, ids):
         '''
         Fill the reference field with the sale sequence
-
-        :param sale_id: the id of the sale
-
-        :return: True if succeed
         '''
         sequence_obj = Pool().get('ir.sequence')
         config_obj = Pool().get('sale.configuration')
 
-        sale = self.browse(sale_id)
-
-        if sale.reference:
-            return True
-
         config = config_obj.browse(1)
-        reference = sequence_obj.get_id(config.sale_sequence.id)
-        self.write(sale_id, {
-            'reference': reference,
-            })
-        return True
+        sales = self.browse(ids)
+        for sale in sales:
+            if sale.reference:
+                continue
+            reference = sequence_obj.get_id(config.sale_sequence.id)
+            self.write(sale.id, {
+                'reference': reference,
+                })
 
-    def set_sale_date(self, sale_id):
+    def set_sale_date(self, ids):
         date_obj = Pool().get('ir.date')
+        for sale in self.browse(ids):
+            if not sale.sale_date:
+                self.write(sale.id, {
+                        'sale_date': date_obj.today(),
+                        })
 
-        self.write(sale_id, {
-                'sale_date': date_obj.today(),
-                })
-        return True
+    def store_cache(self, ids):
+        for sale in self.browse(ids):
+            self.write(sale.id, {
+                    'untaxed_amount_cache': sale.untaxed_amount,
+                    'tax_amount_cache': sale.tax_amount,
+                    'total_amount_cache': sale.total_amount,
+                    })
 
-    def _get_invoice_line_sale_line(self, sale):
+    def _get_invoice_line_sale_line(self, sale, invoice_type):
         '''
-        Return invoice line values for each sale lines
-
-        :param sale: the BrowseRecord of the sale
-
-        :return: a dictionary with invoiced sale line id as key
-            and a list of invoice lines values as value
+        Return invoice line values for each sale lines according to
+        invoice_type
         '''
         line_obj = Pool().get('sale.line')
         res = {}
         for line in sale.lines:
-            val = line_obj.get_invoice_line(line)
+            val = line_obj.get_invoice_line(line, invoice_type)
             if val:
                 res[line.id] = val
         return res
 
-    def _get_invoice_sale(self, sale):
+    def _get_invoice_sale(self, sale, invoice_type):
         '''
-        Return invoice values for sale
-
-        :param sale: the BrowseRecord of the sale
-
-        :return: a dictionary with invoice fields as key and
-            invoice values as value
+        Return invoice values of type invoice_type for sale
         '''
         journal_obj = Pool().get('account.journal')
 
@@ -714,7 +718,7 @@ class Sale(ModelWorkflow, ModelSQL, ModelView):
 
         res = {
             'company': sale.company.id,
-            'type': 'out_invoice',
+            'type': invoice_type,
             'reference': sale.reference,
             'journal': journal_id,
             'party': sale.party.id,
@@ -725,31 +729,24 @@ class Sale(ModelWorkflow, ModelSQL, ModelView):
             }
         return res
 
-    def create_invoice(self, sale_id):
+    def create_invoice(self, sale, invoice_type):
         '''
-        Create an invoice for the sale
-
-        :param sale_id: the sale id
-
-        :return: the created invoice id or None
+        Create an invoice of type invoice_type for the sale and return the id
         '''
         pool = Pool()
         invoice_obj = pool.get('account.invoice')
         invoice_line_obj = pool.get('account.invoice.line')
         sale_line_obj = pool.get('sale.line')
 
-        sale = self.browse(sale_id)
-
         if not sale.party.account_receivable:
             self.raise_user_error('missing_account_receivable',
                     error_args=(sale.party.rec_name,))
 
-        invoice_lines = self._get_invoice_line_sale_line(sale)
+        invoice_lines = self._get_invoice_line_sale_line(sale, invoice_type)
         if not invoice_lines:
             return
 
-
-        vals = self._get_invoice_sale(sale)
+        vals = self._get_invoice_sale(sale, invoice_type)
         with Transaction().set_user(0, set_context=True):
             invoice_id = invoice_obj.create(vals)
 
@@ -767,23 +764,20 @@ class Sale(ModelWorkflow, ModelSQL, ModelView):
         with Transaction().set_user(0, set_context=True):
             invoice_obj.update_taxes([invoice_id])
 
-        self.write(sale_id, {
+        self.write(sale.id, {
             'invoices': [('add', invoice_id)],
         })
         return invoice_id
 
-    def _get_move_sale_line(self, sale):
+    def _get_move_sale_line(self, sale, shipment_type):
         '''
-        Return a dictionary of move values for each sale lines
-
-        :param sale: the BrowseRecord of the sale
-
-        :return: a dictionary with move as key and move values as value
+        Return a dictionary of move values for each sale lines of the right
+        shipment_type
         '''
         line_obj = Pool().get('sale.line')
         res = {}
         for line in sale.lines:
-            val = line_obj.get_move(line)
+            val = line_obj.get_move(line, shipment_type)
             if val:
                 res[line.id] = val
         return res
@@ -797,28 +791,38 @@ class Sale(ModelWorkflow, ModelSQL, ModelView):
 
         :return: a list of key-value as tuples of the shipment
         '''
-        planned_date = max(m['planned_date'] for m in moves)
-        return (('planned_date', planned_date),)
+        sale_line_obj = Pool().get('sale.line')
+        line_id, move = move
+        line = sale_line_obj.browse(line_id)
 
-    def create_shipment(self, sale_id):
-        '''
-        Create a shipment for the sale
+        planned_date = max(m['planned_date'] for m in moves)
+        return (
+            ('planned_date', planned_date),
+            ('warehouse', line.warehouse.id),
+            )
 
-        :param sale_id: the sale id
+    _group_return_key = _group_shipment_key
 
-        :return: the list of created shipment id or None
+    def create_shipment(self, sale, shipment_type):
+        '''
+        Create a shipment of type shipment_type for the sale
+        and return the list of created shipment ids
         '''
         pool = Pool()
-        shipment_obj = pool.get('stock.shipment.out')
         move_obj = pool.get('stock.move')
         sale_line_obj = pool.get('sale.line')
 
-        sale = self.browse(sale_id)
-
-        moves = self._get_move_sale_line(sale)
+        moves = self._get_move_sale_line(sale, shipment_type)
         if not moves:
             return
-        keyfunc = partial(self._group_shipment_key, moves.values())
+        if shipment_type == 'out':
+            keyfunc = partial(self._group_shipment_key, moves.values())
+            move_shipment_key = 'shipment_out'
+            shipment_obj = pool.get('stock.shipment.out')
+        elif shipment_type == 'return':
+            keyfunc = partial(self._group_return_key, moves.values())
+            move_shipment_key = 'shipment_out_return'
+            shipment_obj = pool.get('stock.shipment.out.return')
         moves = moves.items()
         moves = sorted(moves, key=keyfunc)
 
@@ -829,157 +833,75 @@ class Sale(ModelWorkflow, ModelSQL, ModelView):
                     'customer': sale.party.id,
                     'delivery_address': sale.shipment_address.id,
                     'reference': sale.reference,
-                    'warehouse': sale.warehouse.id,
                     'company': sale.company.id,
                     }
                 values.update(dict(key))
                 shipment_id = shipment_obj.create(values)
                 shipments.append(shipment_id)
                 for line_id, values in grouped_moves:
-                    values['shipment_out'] = shipment_id
+                    values[move_shipment_key] = shipment_id
                     move_id = move_obj.create(values)
                     sale_line_obj.write(line_id, {
                         'moves': [('add', move_id)],
                     })
-                shipment_obj.workflow_trigger_validate(shipment_id, 'waiting')
+            if shipment_type == 'out':
+                shipment_obj.wait(shipments)
         return shipments
 
-    def wkf_draft(self, sale):
-        self.write(sale.id, {'state': 'draft'})
-
-    def wkf_quotation(self, sale):
-        self.check_for_quotation(sale.id)
-        self.set_reference(sale.id)
-        self.write(sale.id, {'state': 'quotation'})
-
-    def wkf_confirmed(self, sale):
-        self.set_sale_date(sale.id)
-        self.write(sale.id, {'state': 'confirmed'})
-
-    def wkf_waiting_invoice_sale(self, sale):
-        self.create_invoice(sale.id)
-        self.write(sale.id, {'invoice_state': 'waiting'})
-
-    def wkf_invoice_sale_exception(self, sale):
-        self.write(sale.id, {'invoice_state': 'exception'})
-
-    def wkf_invoice_sale_done(self, sale):
-        self.write(sale.id, {'invoice_state': 'paid'})
-
-    def wkf_shipment_invoice(self, sale):
-        self.create_shipment(sale.id)
-
-    def wkf_waiting_shipment_invoice(self, sale):
-        self.write(sale.id, {'shipment_state': 'waiting'})
-        self.create_shipment(sale.id)
-
-    def wkf_shipment_invoice_exception(self, sale):
-        self.write(sale.id, {'shipment_state': 'exception'})
-
-    def wkf_shipment_invoice_done(self, sale):
-        self.write(sale.id, {'shipment_state': 'sent'})
-
-    def wkf_shipment(self, sale):
-        self.create_shipment(sale.id)
-
-    def wkf_waiting_shipment(self, sale):
-        self.write(sale.id, {'shipment_state': 'waiting'})
-        self.create_shipment(sale.id)
-
-    def wkf_shipment_exception(self, sale):
-        self.write(sale.id, {'shipment_state': 'exception'})
-
-    def wkf_invoice_shipment(self, sale):
-        self.create_invoice(sale.id)
-        self.write(sale.id, {'invoice_state': 'waiting'})
-
-    def wkf_waiting_invoice_shipment(self, sale):
-        self.write(sale.id,
-            {'invoice_state': 'waiting', 'shipment_state': 'sent'})
-
-    def wkf_invoice_shipment_exception(self, sale):
-        self.write(sale.id, {'invoice_state': 'exception'})
-
-    def wkf_invoice_shipment_done(self, sale):
-        self.write(sale.id, {'invoice_state': 'paid'})
-
-    def wkf_invoice_shipment_method_done(self, sale):
-        self.write(sale.id, {'shipment_state': 'sent'})
-
-    def wkf_done(self, sale):
-        self.write(sale.id, {'state': 'done'})
-
-    def wkf_cancel(self, sale):
-        self.write(sale.id, {'state': 'cancel'})
-
-    def wkf_draft2quotation(self, sale):
-        return bool(sale.lines)
-
-    def wkf_invoice_method2waiting_invoice_sale(self, sale):
-        return sale.invoice_method == 'order'
-
-    def wkf_invoice_method2invoice_method_done(self, sale):
-        return sale.invoice_method != 'order'
-
-    def wkf_triggered_invoices(self, sale):
-        return [x.id for x in sale.invoices]
-
-    def wkf_waiting_invoice_sale2invoice_sale_exception(self, sale):
-        return sale.invoice_exception
+    def is_done(self, sale):
+        return sale.invoice_state == 'paid' and sale.shipment_state == 'sent'
 
-    def wkf_waiting_invoice_sale2invoice_sale_done(self, sale):
-        return sale.invoice_paid
-
-    def wkf_shipment_invoice_method2shipment_invoice_method_done(self, sale):
-        return sale.shipment_method != 'invoice'
-
-    def wkf_shipment_invoice_method2shipment_invoice(self, sale):
-        return self.shipment_method == 'invoice'
-
-    def wkf_triggered_shipments(self, sale):
-        return [x.id for x in sale.shipments]
-
-    def wkf_waiting_shipment_invoice2shipment_invoice_exception(self, sale):
-        return sale.shipment_exception
-
-    def wkf_waiting_shipment_invoice2shipment_invoice_done(self, sale):
-        return sale.shipment_done
-
-    def wkf_shipment_method2shipment_method_done(self, sale):
-        return sale.shipment_method != 'order'
-
-    def wkf_shipment_method2shipment(self, sale):
-        return sale.shipment_method == 'order'
-
-    def wkf_waiting_shipment2shipment_exception(self, sale):
-        return sale.shipment_exception
-
-    def wkf_waiting_shipment2invoice_shipment_method(self, sale):
-        return not sale.shipment_exception
-
-    def wkf_waiting_shipment2invoice_shipment_method_nosignal(self, sale):
-        return sale.shipment_done
-
-    def wkf_invoice_shipment_method2invoice_shipment(self, sale):
-        return sale.invoice_method == 'shipment'
-
-    def wkf_invoice_shipment_method2invoice_shipment_method_done(self, sale):
-        return sale.invoice_method != 'shipment' and sale.shipment_done
-
-    def wkf_invoice_shipment_method2waiting_shipment(self, sale):
-        return sale.invoice_method != 'shipment' and not sale.shipment_done
-
-    def wkf_invoice_shipment2waiting_shipment(self, sale):
-        return not sale.shipment_done
-
-    def wkf_invoice_shipment2waiting_invoice_shipment(self, sale):
-        return sale.shipment_done
-
-    def wkf_waiting_invoice_shipment2invoice_shipment_exception(self, sale):
-        return sale.invoice_exception
-
-    def wkf_waiting_invoice_shipment2invoice_shipment_done(self, sale):
-        return sale.invoice_paid
+    def delete(self, ids):
+        if isinstance(ids, (int, long)):
+            ids = [ids]
+        # Cancel before delete
+        self.cancel(ids)
+        for sale in self.browse(ids):
+            if sale.state != 'cancel':
+                self.raise_user_error('delete_cancel', sale.rec_name)
+        return super(Sale, self).delete(ids)
+
+    @ModelView.button
+    @Workflow.transition('cancel')
+    def cancel(self, ids):
+        self.store_cache(ids)
+
+    @ModelView.button
+    @Workflow.transition('draft')
+    def draft(self, ids):
+        pass
+
+    @ModelView.button
+    @Workflow.transition('quotation')
+    def quote(self, ids):
+        self.check_for_quotation(ids)
+        self.set_reference(ids)
+
+    @ModelView.button
+    @Workflow.transition('confirmed')
+    def confirm(self, ids):
+        self.set_sale_date(ids)
+        self.store_cache(ids)
+
+    @ModelView.button
+    @Workflow.transition('processing')
+    def process(self, ids):
+        done = []
+        for sale in self.browse(ids):
+            if sale.state in ('done', 'cancel'):
+                continue
+            self.create_invoice(sale, 'out_invoice')
+            self.create_invoice(sale, 'out_credit_note')
+            self.set_invoice_state(sale)
+            self.create_shipment(sale, 'out')
+            self.create_shipment(sale, 'return')
+            self.set_shipment_state(sale)
+            if self.is_done(sale):
+                done.append(sale.id)
+        if done:
+            self.write(done, {
+                    'state': 'done',
+                    })
 
 Sale()
 
@@ -989,10 +911,10 @@ class SaleInvoice(ModelSQL):
     _name = 'sale.sale-account.invoice'
     _table = 'sale_invoices_rel'
     _description = __doc__
-    sale = fields.Many2One('sale.sale', 'Sale', ondelete='CASCADE', select=1,
-            required=True)
+    sale = fields.Many2One('sale.sale', 'Sale', ondelete='CASCADE',
+        select=True, required=True)
     invoice = fields.Many2One('account.invoice', 'Invoice',
-            ondelete='RESTRICT', select=1, required=True)
+            ondelete='RESTRICT', select=True, required=True)
 
 SaleInvoice()
 
@@ -1002,10 +924,10 @@ class SaleIgnoredInvoice(ModelSQL):
     _name = 'sale.sale-ignored-account.invoice'
     _table = 'sale_invoice_ignored_rel'
     _description = __doc__
-    sale = fields.Many2One('sale.sale', 'Sale', ondelete='CASCADE', select=1,
-            required=True)
+    sale = fields.Many2One('sale.sale', 'Sale', ondelete='CASCADE',
+        select=True, required=True)
     invoice = fields.Many2One('account.invoice', 'Invoice',
-            ondelete='RESTRICT', select=1, required=True)
+            ondelete='RESTRICT', select=True, required=True)
 
 SaleIgnoredInvoice()
 
@@ -1015,10 +937,10 @@ class SaleRecreatedInvoice(ModelSQL):
     _name = 'sale.sale-recreated-account.invoice'
     _table = 'sale_invoice_recreated_rel'
     _description = __doc__
-    sale = fields.Many2One('sale.sale', 'Sale', ondelete='CASCADE', select=1,
-            required=True)
+    sale = fields.Many2One('sale.sale', 'Sale', ondelete='CASCADE',
+        select=True, required=True)
     invoice = fields.Many2One('account.invoice', 'Invoice',
-            ondelete='RESTRICT', select=1, required=True)
+            ondelete='RESTRICT', select=True, required=True)
 
 SaleRecreatedInvoice()
 
@@ -1029,14 +951,15 @@ class SaleLine(ModelSQL, ModelView):
     _rec_name = 'description'
     _description = __doc__
 
-    sale = fields.Many2One('sale.sale', 'Sale', ondelete='CASCADE', select=1)
-    sequence = fields.Integer('Sequence')
+    sale = fields.Many2One('sale.sale', 'Sale', ondelete='CASCADE',
+        select=True)
+    sequence = fields.Integer('Sequence', required=True)
     type = fields.Selection([
         ('line', 'Line'),
         ('subtotal', 'Subtotal'),
         ('title', 'Title'),
         ('comment', 'Comment'),
-        ], 'Type', select=1, required=True)
+        ], 'Type', select=True, required=True)
     quantity = fields.Float('Quantity',
         digits=(16, Eval('unit_digits', 2)),
         states={
@@ -1051,16 +974,15 @@ class SaleLine(ModelSQL, ModelView):
                 'required': Bool(Eval('product')),
                 'invisible': Eval('type') != 'line',
                 'readonly': ~Eval('_parent_sale', {}),
-            }, domain=[
-                ('category', '=',
-                    (Eval('product'), 'product.default_uom.category')),
-            ],
-            context={
-                'category': (Eval('product'), 'product.default_uom.category'),
             },
-            on_change=['product', 'quantity', 'unit', '_parent_sale.currency',
-                '_parent_sale.party'],
-            depends=['product', 'type'])
+        domain=[
+            If(Bool(Eval('product_uom_category')),
+                ('category', '=', Eval('product_uom_category')),
+                ('category', '!=', -1)),
+            ],
+        on_change=['product', 'quantity', 'unit', '_parent_sale.currency',
+            '_parent_sale.party'],
+        depends=['product', 'type', 'product_uom_category'])
     unit_digits = fields.Function(fields.Integer('Unit Digits',
         on_change_with=['unit']), 'get_unit_digits')
     product = fields.Many2One('product.product', 'Product',
@@ -1072,12 +994,16 @@ class SaleLine(ModelSQL, ModelView):
         on_change=['product', 'unit', 'quantity', 'description',
             '_parent_sale.party', '_parent_sale.currency'],
         context={
-            'locations': If(Bool(Eval('_parent_sale', {}).get( 'warehouse')),
+            '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(
+        fields.Many2One('product.uom.category', 'Product Uom Category',
+            on_change_with=['product']),
+        'get_product_uom_category')
     unit_price = fields.Numeric('Unit Price', digits=(16, 4),
         states={
             'invisible': Eval('type') != 'line',
@@ -1088,13 +1014,13 @@ class SaleLine(ModelSQL, ModelView):
             states={
                 'invisible': ~Eval('type').in_(['line', 'subtotal']),
                 'readonly': ~Eval('_parent_sale'),
-                }, on_change_with=['type', 'quantity', 'unit_price',
+                }, on_change_with=['type', 'quantity', 'unit_price', 'unit',
                 '_parent_sale.currency'],
             depends=['type']), 'get_amount')
     description = fields.Text('Description', size=None, required=True)
     note = fields.Text('Note')
     taxes = fields.Many2Many('sale.line-account.tax', 'line', 'tax', 'Taxes',
-        domain=[('parent', '=', False)], states={
+        domain=[('parent', '=', None)], states={
             'invisible': Eval('type') != 'line',
             }, depends=['type'])
     invoice_lines = fields.Many2Many('sale.line-account.invoice.line',
@@ -1108,6 +1034,19 @@ class SaleLine(ModelSQL, ModelView):
     move_done = fields.Function(fields.Boolean('Moves Done'), 'get_move_done')
     move_exception = fields.Function(fields.Boolean('Moves Exception'),
             'get_move_exception')
+    warehouse = fields.Function(fields.Many2One('stock.location',
+            'Warehouse'), 'get_warehouse')
+    from_location = fields.Function(fields.Many2One('stock.location',
+            'From Location'), 'get_from_location')
+    to_location = fields.Function(fields.Many2One('stock.location',
+            'To Location'), 'get_to_location')
+    delivery_date = fields.Function(fields.Date('Delivery Date',
+            on_change_with=['product', '_parent_sale.sale_date'],
+            states={
+                'invisible': Eval('type') != 'line',
+                },
+            depends=['type']),
+        'get_delivery_date')
 
     def __init__(self):
         super(SaleLine, self).__init__()
@@ -1133,11 +1072,8 @@ class SaleLine(ModelSQL, ModelView):
     def default_type(self):
         return 'line'
 
-    def default_quantity(self):
-        return 0.0
-
-    def default_unit_price(self):
-        return Decimal('0.0')
+    def default_unit_digits(self):
+        return 2
 
     def on_change_with_unit_digits(self, vals):
         uom_obj = Pool().get('product.uom')
@@ -1225,7 +1161,6 @@ class SaleLine(ModelSQL, ModelView):
         pool = Pool()
         party_obj = pool.get('party.party')
         product_obj = pool.get('product.product')
-        uom_obj = pool.get('product.uom')
         tax_rule_obj = pool.get('account.tax.rule')
 
         if not vals.get('product'):
@@ -1242,7 +1177,7 @@ class SaleLine(ModelSQL, ModelView):
         product = product_obj.browse(vals['product'])
 
         with Transaction().set_context(
-                self._get_context_sale_price(product,vals)):
+                self._get_context_sale_price(product, vals)):
             res['unit_price'] = product_obj.get_sale_price([product.id],
                     vals.get('quantity', 0))[product.id]
             if res['unit_price']:
@@ -1259,7 +1194,7 @@ class SaleLine(ModelSQL, ModelView):
                 continue
             res['taxes'].append(tax.id)
         if party and party.customer_tax_rule:
-            tax_ids = tax_rule_obj.apply(party.customer_tax_rule, False,
+            tax_ids = tax_rule_obj.apply(party.customer_tax_rule, None,
                     pattern)
             if tax_ids:
                 res['taxes'].extend(tax_ids)
@@ -1281,6 +1216,22 @@ class SaleLine(ModelSQL, ModelView):
         res['amount'] = self.on_change_with_amount(vals)
         return res
 
+    def on_change_with_product_uom_category(self, values):
+        pool = Pool()
+        product_obj = pool.get('product.product')
+        if values.get('product'):
+            product = product_obj.browse(values['product'])
+            return product.default_uom_category.id
+
+    def get_product_uom_category(self, ids, name):
+        categories = {}
+        for line in self.browse(ids):
+            if line.product:
+                categories[line.id] = line.product.default_uom_category.id
+            else:
+                categories[line.id] = None
+        return categories
+
     def on_change_quantity(self, vals):
         product_obj = Pool().get('product.product')
 
@@ -1337,13 +1288,59 @@ class SaleLine(ModelSQL, ModelView):
                 res[line.id] = Decimal('0.0')
         return res
 
-    def get_invoice_line(self, line):
-        '''
-        Return invoice line values for sale line
+    def get_warehouse(self, ids, name):
+        result = {}
+        for line in self.browse(ids):
+            result[line.id] = line.sale.warehouse.id
+        return result
+
+    def get_from_location(self, ids, name):
+        result = {}
+        for line in self.browse(ids):
+            if line.quantity >= 0 and line.warehouse:
+                result[line.id] = line.warehouse.output_location.id
+            else:
+                result[line.id] = line.sale.party.customer_location.id
+        return result
+
+    def get_to_location(self, ids, name):
+        result = {}
+        for line in self.browse(ids):
+            if line.quantity >= 0:
+                result[line.id] = line.sale.party.customer_location.id
+            else:
+                if line.warehouse:
+                    result[line.id] = line.warehouse.input_location.id
+                else:
+                    result[line.id] = None
+        return result
+
+    def _compute_delivery_date(self, product, date):
+        product_obj = Pool().get('product.product')
+        if product:
+            return product_obj.compute_delivery_date(product, date=date)
+        else:
+            return None
 
-        :param line: the BrowseRecord of the line
+    def on_change_with_delivery_date(self, values):
+        product_obj = Pool().get('product.product')
+        if values.get('product'):
+            product = product_obj.browse(values['product'])
+            return self._compute_delivery_date(product,
+                values.get('_parent_sale.sale_date'))
+        return None
+
+    def get_delivery_date(self, ids, name):
+        dates = {}
+        for line in self.browse(ids):
+            dates[line.id] = self._compute_delivery_date(line.product,
+                line.sale.sale_date)
+        return dates
 
-        :return: a list of invoice line values
+    def get_invoice_line(self, line, invoice_type):
+        '''
+        Return a list of invoice line values for sale line according to
+        invoice_type
         '''
         uom_obj = Pool().get('product.uom')
         property_obj = Pool().get('ir.property')
@@ -1354,12 +1351,22 @@ class SaleLine(ModelSQL, ModelView):
         res['description'] = line.description
         res['note'] = line.note
         if line.type != 'line':
-            return [res]
+            if (line.sale.invoice_method == 'order'
+                    and (all(l.quantity >= 0 for l in line.sale.lines
+                            if l.type == 'line')
+                        or all(l.quantity <= 0 for l in line.sale.lines
+                            if l.type == 'line'))):
+                return [res]
+            else:
+                return []
+
+        if (invoice_type == 'out_invoice') != (line.quantity >= 0):
+            return []
 
         if (line.sale.invoice_method == 'order'
                 or not line.product
                 or line.product.type == 'service'):
-            quantity = line.quantity
+            quantity = abs(line.quantity)
         else:
             quantity = 0.0
             for move in line.moves:
@@ -1370,6 +1377,8 @@ class SaleLine(ModelSQL, ModelView):
         ignored_ids = set(
             l.id for i in line.sale.invoices_ignored for l in i.lines)
         for invoice_line in line.invoice_lines:
+            if invoice_line.type != 'line':
+                continue
             if ((invoice_line.invoice and
                     invoice_line.invoice.state != 'cancel') or
                 invoice_line.id in ignored_ids):
@@ -1401,22 +1410,17 @@ class SaleLine(ModelSQL, ModelView):
         if default is None:
             default = {}
         default = default.copy()
-        default['moves'] = False
-        default['moves_ignored'] = False
-        default['moves_recreated'] = False
-        default['invoice_lines'] = False
+        default['moves'] = None
+        default['moves_ignored'] = None
+        default['moves_recreated'] = None
+        default['invoice_lines'] = None
         return super(SaleLine, self).copy(ids, default=default)
 
-    def get_move(self, line):
+    def get_move(self, line, shipment_type):
         '''
-        Return move values for the sale line
-
-        :param line: the BrowseRecord of the line
-
-        :return: a dictionary of values of move
+        Return move values for the sale line according ot shipment_type
         '''
         uom_obj = Pool().get('product.uom')
-        product_obj = Pool().get('product.product')
 
         res = {}
         if line.type != 'line':
@@ -1425,8 +1429,10 @@ class SaleLine(ModelSQL, ModelView):
             return
         if line.product.type == 'service':
             return
+        if (shipment_type == 'out') != (line.quantity >= 0):
+            return
         skip_ids = set(x.id for x in line.moves_recreated)
-        quantity = line.quantity
+        quantity = abs(line.quantity)
         for move in line.moves:
             if move.id not in skip_ids:
                 quantity -= uom_obj.compute_qty(move.uom, move.quantity,
@@ -1438,14 +1444,13 @@ class SaleLine(ModelSQL, ModelView):
         res['quantity'] = quantity
         res['uom'] = line.unit.id
         res['product'] = line.product.id
-        res['from_location'] = line.sale.warehouse.output_location.id
-        res['to_location'] = line.sale.party.customer_location.id
+        res['from_location'] = line.from_location.id
+        res['to_location'] = line.to_location.id
         res['state'] = 'draft'
         res['company'] = line.sale.company.id
         res['unit_price'] = line.unit_price
         res['currency'] = line.sale.currency.id
-        res['planned_date'] = product_obj.compute_delivery_date(
-            line.product)
+        res['planned_date'] = line.delivery_date
         return res
 
 SaleLine()
@@ -1457,9 +1462,9 @@ class SaleLineTax(ModelSQL):
     _table = 'sale_line_account_tax'
     _description = __doc__
     line = fields.Many2One('sale.line', 'Sale Line', ondelete='CASCADE',
-            select=1, required=True)
+            select=True, required=True)
     tax = fields.Many2One('account.tax', 'Tax', ondelete='RESTRICT',
-            select=1, required=True)
+            select=True, required=True)
 
 SaleLineTax()
 
@@ -1470,9 +1475,9 @@ class SaleLineInvoiceLine(ModelSQL):
     _table = 'sale_line_invoice_lines_rel'
     _description = __doc__
     sale_line = fields.Many2One('sale.line', 'Sale Line', ondelete='CASCADE',
-            select=1, required=True)
+            select=True, required=True)
     invoice_line = fields.Many2One('account.invoice.line', 'Invoice Line',
-            ondelete='RESTRICT', select=1, required=True)
+            ondelete='RESTRICT', select=True, required=True)
 
 SaleLineInvoiceLine()
 
@@ -1483,9 +1488,9 @@ class SaleLineIgnoredMove(ModelSQL):
     _table = 'sale_line_moves_ignored_rel'
     _description = __doc__
     sale_line = fields.Many2One('sale.line', 'Sale Line', ondelete='CASCADE',
-            select=1, required=True)
+            select=True, required=True)
     move = fields.Many2One('stock.move', 'Move', ondelete='RESTRICT',
-            select=1, required=True)
+            select=True, required=True)
 
 SaleLineIgnoredMove()
 
@@ -1496,9 +1501,9 @@ class SaleLineRecreatedMove(ModelSQL):
     _table = 'sale_line_moves_recreated_rel'
     _description = __doc__
     sale_line = fields.Many2One('sale.line', 'Sale Line', ondelete='CASCADE',
-            select=1, required=True)
+            select=True, required=True)
     move = fields.Many2One('stock.move', 'Move', ondelete='RESTRICT',
-            select=1, required=True)
+            select=True, required=True)
 
 SaleLineRecreatedMove()
 
@@ -1521,14 +1526,14 @@ class Template(ModelSQL, ModelView):
             'required': Eval('salable', False),
             },
         domain=[
-            ('category', '=', (Eval('default_uom'), 'uom.category')),
+            ('category', '=', Eval('default_uom_category')),
             ],
-        context={'category': (Eval('default_uom'), 'uom.category')},
         on_change_with=['default_uom', 'sale_uom', 'salable'],
-        depends=['active', 'salable', 'default_uom'])
+        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')
@@ -1558,9 +1563,12 @@ class Template(ModelSQL, ModelView):
     def default_salable(self):
         return True if Transaction().context.get('salable') else False
 
+    def default_delivery_time(self):
+        return 0
+
     def on_change_with_sale_uom(self, vals):
         uom_obj = Pool().get('product.uom')
-        res = False
+        res = None
 
         if vals.get('default_uom'):
             default_uom = uom_obj.browse(vals['default_uom'])
@@ -1669,29 +1677,81 @@ class ShipmentOut(ModelSQL, ModelView):
                     if sale_line.sale.id not in sale_ids:
                         sale_ids.append(sale_line.sale.id)
 
-            sale_obj.workflow_trigger_validate(sale_ids, 'shipment_update')
+            with Transaction().set_user(0, set_context=True):
+                sale_obj.process(sale_ids)
         return res
 
-    def button_draft(self, ids):
+    @ModelView.button
+    @Workflow.transition('draft')
+    def draft(self, ids):
         for shipment in self.browse(ids):
             for move in shipment.outgoing_moves:
                 if move.state == 'cancel' and move.sale_line:
                     self.raise_user_error('reset_move')
 
-        return super(ShipmentOut, self).button_draft(ids)
+        return super(ShipmentOut, self).draft(ids)
 
 ShipmentOut()
 
 
+class ShipmentOutReturn(ModelSQL, ModelView):
+    _name = 'stock.shipment.out.return'
+
+    def __init__(self):
+        super(ShipmentOutReturn, self).__init__()
+        self._error_messages.update({
+                'reset_move': 'You cannot reset to draft a move generated '
+                    'by a sale.',
+            })
+
+    def write(self, ids, vals):
+        sale_obj = Pool().get('sale.sale')
+        sale_line_obj = Pool().get('sale.line')
+
+        res = super(ShipmentOutReturn, self).write(ids, vals)
+
+        if 'state' in vals and vals['state'] == 'received':
+            sale_ids = []
+            move_ids = []
+            if isinstance(ids, (int, long)):
+                ids = [ids]
+            for shipment in self.browse(ids):
+                move_ids.extend([x.id for x in shipment.incoming_moves])
+
+            sale_line_ids = sale_line_obj.search([
+                ('moves', 'in', move_ids),
+                ])
+            if sale_line_ids:
+                for sale_line in sale_line_obj.browse(sale_line_ids):
+                    if sale_line.sale.id not in sale_ids:
+                        sale_ids.append(sale_line.sale.id)
+
+            with Transaction().set_user(0, set_context=True):
+                sale_obj.process(sale_ids)
+        return res
+
+    @ModelView.button
+    @Workflow.transition('draft')
+    def draft(self, ids):
+        for shipment in self.browse(ids):
+            for move in shipment.incoming_moves:
+                if move.state == 'cancel' and move.sale_line:
+                    self.raise_user_error('reset_move')
+
+        return super(ShipmentOutReturn, self).draft(ids)
+
+ShipmentOutReturn()
+
+
 class Move(ModelSQL, ModelView):
     _name = 'stock.move'
 
-    sale_line = fields.Many2One('sale.line', 'Sale Line', select=1,
+    sale_line = fields.Many2One('sale.line', 'Sale Line', select=True,
         states={
             'readonly': Eval('state') != 'draft',
             },
         depends=['state'])
-    sale = fields.Function(fields.Many2One('sale.sale', 'Sale', select=1),
+    sale = fields.Function(fields.Many2One('sale.sale', 'Sale', select=True),
             'get_sale', searcher='search_sale')
     sale_exception_state = fields.Function(fields.Selection([
         ('', ''),
@@ -1700,11 +1760,9 @@ class Move(ModelSQL, ModelView):
         ], 'Exception State'), 'get_sale_exception_state')
 
     def get_sale(self, ids, name):
-        sale_obj = Pool().get('sale.sale')
-
         res = {}
         for move in self.browse(ids):
-            res[move.id] = False
+            res[move.id] = None
             if move.sale_line:
                 res[move.id] = move.sale_line.sale.id
         return res
@@ -1739,8 +1797,8 @@ class Move(ModelSQL, ModelView):
                 for sale_line in sale_line_obj.browse(sale_line_ids):
                     sale_ids.add(sale_line.sale.id)
             if sale_ids:
-                sale_obj.workflow_trigger_validate(list(sale_ids),
-                        'shipment_update')
+                with Transaction().set_user(0, set_context=True):
+                    sale_obj.process(list(sale_ids))
         return res
 
     def delete(self, ids):
@@ -1761,8 +1819,8 @@ class Move(ModelSQL, ModelView):
             for sale_line in sale_line_obj.browse(sale_line_ids):
                 sale_ids.add(sale_line.sale.id)
             if sale_ids:
-                sale_obj.workflow_trigger_validate(list(sale_ids),
-                        'shipment_update')
+                with Transaction().set_user(0, set_context=True):
+                    sale_obj.process(list(sale_ids))
         return res
 
 Move()
@@ -1786,7 +1844,8 @@ class Invoice(ModelSQL, ModelView):
                     'an invoice generated by a sale.',
             })
 
-    def button_draft(self, ids):
+    @Workflow.transition('draft')
+    def draft(self, ids):
         sale_obj = Pool().get('sale.sale')
         sale_ids = sale_obj.search([
             ('invoices', 'in', ids),
@@ -1795,7 +1854,7 @@ class Invoice(ModelSQL, ModelView):
         if sale_ids:
             self.raise_user_error('reset_invoice_sale')
 
-        return super(Invoice, self).button_draft(ids)
+        return super(Invoice, self).draft(ids)
 
     def get_sale_exception_state(self, ids, name):
         sale_obj = Pool().get('sale.sale')
@@ -1805,7 +1864,8 @@ class Invoice(ModelSQL, ModelView):
 
         sales = sale_obj.browse(sale_ids)
 
-        recreated_ids = tuple(i.id for p in sales for i in p.invoices_recreated)
+        recreated_ids = tuple(i.id for p in sales
+            for i in p.invoices_recreated)
         ignored_ids = tuple(i.id for p in sales for i in p.invoices_ignored)
 
         res = {}.fromkeys(ids, '')
@@ -1835,44 +1895,37 @@ Invoice()
 class OpenCustomer(Wizard):
     'Open Customers'
     _name = 'sale.open_customer'
-    states = {
-        'init': {
-            'result': {
-                'type': 'action',
-                'action': '_action_open',
-                'state': 'end',
-            },
-        },
-    }
+    start_state = 'open_'
+    open_ = StateAction('party.act_party_form')
 
-    def _action_open(self, datas):
+    def do_open_(self, session, action):
         pool = Pool()
         model_data_obj = pool.get('ir.model.data')
-        act_window_obj = pool.get('ir.action.act_window')
         wizard_obj = pool.get('ir.action.wizard')
-        act_window_id = model_data_obj.get_id('party', 'act_party_form')
-        res = act_window_obj.read(act_window_id)
         Transaction().cursor.execute("SELECT DISTINCT(party) FROM sale_sale")
         customer_ids = [line[0] for line in Transaction().cursor.fetchall()]
-        res['pyson_domain'] = PYSONEncoder().encode(
-                [('id', 'in', customer_ids)])
+        action['pyson_domain'] = PYSONEncoder().encode(
+            [('id', 'in', customer_ids)])
 
         model_data_ids = model_data_obj.search([
             ('fs_id', '=', 'act_open_customer'),
             ('module', '=', 'sale'),
-            ('inherit', '=', False),
+            ('inherit', '=', None),
             ], limit=1)
         model_data = model_data_obj.browse(model_data_ids[0])
         wizard = wizard_obj.browse(model_data.db_id)
 
-        res['name'] = wizard.name
-        return res
+        action['name'] = wizard.name
+        return action, {}
+
+    def transition_open_(self, session):
+        return 'end'
 
 OpenCustomer()
 
 
 class HandleShipmentExceptionAsk(ModelView):
-    'Shipment Exception Ask'
+    'Handle Shipment Exception'
     _name = 'sale.handle.shipment.exception.ask'
     _description = __doc__
 
@@ -1891,66 +1944,44 @@ class HandleShipmentExceptionAsk(ModelView):
                 (module_name,))
         super(HandleShipmentExceptionAsk, self).init(module_name)
 
-    def default_recreate_moves(self):
-        return self.default_domain_moves()
+HandleShipmentExceptionAsk()
 
-    def default_domain_moves(self):
-        sale_line_obj = Pool().get('sale.line')
-        active_id = Transaction().context.get('active_id')
-        if not active_id:
-            return []
 
-        line_ids = sale_line_obj.search([
-            ('sale', '=', active_id),
+class HandleShipmentException(Wizard):
+    'Handle Shipment Exception'
+    _name = 'sale.handle.shipment.exception'
+    start_state = 'ask'
+    ask = StateView('sale.handle.shipment.exception.ask',
+        'sale.handle_shipment_exception_ask_view_form', [
+            Button('Cancel', 'end', 'tryton-cancel'),
+            Button('Ok', 'handle', 'tryton-ok', default=True),
             ])
-        lines = sale_line_obj.browse(line_ids)
+    handle = StateTransition()
+
+    def default_ask(self, session, fields):
+        sale_obj = Pool().get('sale.sale')
+        sale = sale_obj.browse(Transaction().context.get('active_id'))
 
-        domain_moves = []
-        for line in lines:
+        moves = []
+        for line in sale.lines:
             skip_ids = set(x.id for x in line.moves_ignored)
             skip_ids.update(x.id for x in line.moves_recreated)
             for move in line.moves:
                 if move.state == 'cancel' and move.id not in skip_ids:
-                    domain_moves.append(move.id)
-
-        return domain_moves
-
-HandleShipmentExceptionAsk()
-
-class HandleShipmentException(Wizard):
-    'Handle Shipment Exception'
-    _name = 'sale.handle.shipment.exception'
-    states = {
-        'init': {
-            'actions': [],
-            'result': {
-                'type': 'form',
-                'object': 'sale.handle.shipment.exception.ask',
-                'state': [
-                    ('end', 'Cancel', 'tryton-cancel'),
-                    ('ok', 'Ok', 'tryton-ok', True),
-                ],
-            },
-        },
-        'ok': {
-            'result': {
-                'type': 'action',
-                'action': '_handle_moves',
-                'state': 'end',
-            },
-        },
-    }
+                    moves.append(move.id)
+        return {
+            'recreate_moves': moves,
+            'domain_moves': moves,
+            }
 
-    def _handle_moves(self, data):
+    def transition_handle(self, session):
         pool = Pool()
         sale_obj = pool.get('sale.sale')
         sale_line_obj = pool.get('sale.line')
-        move_obj = pool.get('stock.move')
-        shipment_obj = pool.get('stock.shipment.out')
-        to_recreate = data['form']['recreate_moves'][0][1]
-        domain_moves = data['form']['domain_moves'][0][1]
+        to_recreate = [x.id for x in session.ask.recreate_moves]
+        domain_moves = [x.id for x in session.ask.domain_moves]
 
-        sale = sale_obj.browse(data['id'])
+        sale = sale_obj.browse(Transaction().context['active_id'])
 
         for line in sale.lines:
             moves_ignored = []
@@ -1965,18 +1996,18 @@ class HandleShipmentException(Wizard):
                 else:
                     moves_ignored.append(move.id)
 
-            sale_line_obj.write(line.id,{
-                'moves_ignored': [('add', moves_ignored)],
-                'moves_recreated': [('add', moves_recreated)],
-                })
-
-        sale_obj.workflow_trigger_validate(data['id'], 'shipment_ok')
+            sale_line_obj.write(line.id, {
+                    'moves_ignored': [('add', moves_ignored)],
+                    'moves_recreated': [('add', moves_recreated)],
+                    })
+        sale_obj.process([sale.id])
+        return 'end'
 
 HandleShipmentException()
 
 
 class HandleInvoiceExceptionAsk(ModelView):
-    'Invoice Exception Ask'
+    'Handle Invoice Exception'
     _name = 'sale.handle.invoice.exception.ask'
     _description = __doc__
 
@@ -1989,59 +2020,41 @@ class HandleInvoiceExceptionAsk(ModelView):
     domain_invoices = fields.Many2Many(
         'account.invoice', None, None, 'Domain Invoices')
 
-    def default_recreate_invoices(self):
-        return self.default_domain_invoices()
+HandleInvoiceExceptionAsk()
+
+
+class HandleInvoiceException(Wizard):
+    'Handle Invoice Exception'
+    _name = 'sale.handle.invoice.exception'
+    start_state = 'ask'
+    ask = StateView('sale.handle.invoice.exception.ask',
+        'sale.handle_invoice_exception_ask_view_form', [
+            Button('Cancel', 'end', 'tryton-cancel'),
+            Button('Ok', 'handle', 'tryton-ok', default=True),
+            ])
+    handle = StateTransition()
 
-    def default_domain_invoices(self):
+    def default_ask(self, session, fields):
         sale_obj = Pool().get('sale.sale')
-        active_id = Transaction().context.get('active_id')
-        if not active_id:
-            return []
 
-        sale = sale_obj.browse(active_id)
+        sale = sale_obj.browse(Transaction().context['active_id'])
         skip_ids = set(x.id for x in sale.invoices_ignored)
         skip_ids.update(x.id for x in sale.invoices_recreated)
-        domain_invoices = []
+        invoices = []
         for invoice in sale.invoices:
             if invoice.state == 'cancel' and invoice.id not in skip_ids:
-                domain_invoices.append(invoice.id)
-
-        return domain_invoices
-
-HandleInvoiceExceptionAsk()
-
-
-class HandleInvoiceException(Wizard):
-    'Handle Invoice Exception'
-    _name = 'sale.handle.invoice.exception'
-    states = {
-        'init': {
-            'actions': [],
-            'result': {
-                'type': 'form',
-                'object': 'sale.handle.invoice.exception.ask',
-                'state': [
-                    ('end', 'Cancel', 'tryton-cancel'),
-                    ('ok', 'Ok', 'tryton-ok', True),
-                ],
-            },
-        },
-        'ok': {
-            'result': {
-                'type': 'action',
-                'action': '_handle_invoices',
-                'state': 'end',
-            },
-        },
-    }
+                invoices.append(invoice.id)
+        return {
+            'to_recreate': invoices,
+            'domain_invoices': invoices,
+            }
 
-    def _handle_invoices(self, data):
+    def transition_handle(self, session):
         sale_obj = Pool().get('sale.sale')
-        invoice_obj = Pool().get('account.invoice')
-        to_recreate = data['form']['recreate_invoices'][0][1]
-        domain_invoices = data['form']['domain_invoices'][0][1]
+        to_recreate = [x.id for x in session.ask.recreate_invoices]
+        domain_invoices = [x.id for x in session.ask.domain_invoices]
 
-        sale = sale_obj.browse(data['id'])
+        sale = sale_obj.browse(Transaction().context['active_id'])
 
         skip_ids = set(x.id for x in sale.invoices_ignored)
         skip_ids.update(x.id for x in sale.invoices_recreated)
@@ -2055,11 +2068,31 @@ class HandleInvoiceException(Wizard):
             else:
                 invoices_ignored.append(invoice.id)
 
-        sale_obj.write(sale.id,{
-            'invoices_ignored': [('add', invoices_ignored)],
-            'invoices_recreated': [('add', invoices_recreated)],
-             })
-
-        sale_obj.workflow_trigger_validate(data['id'], 'invoice_ok')
+        sale_obj.write(sale.id, {
+                'invoices_ignored': [('add', invoices_ignored)],
+                'invoices_recreated': [('add', invoices_recreated)],
+                })
+        sale_obj.process([sale.id])
+        return 'end'
 
 HandleInvoiceException()
+
+
+class ReturnSale(Wizard):
+    _name = 'sale.return_sale'
+    start_state = 'make_return'
+    make_return = StateTransition()
+
+    def transition_make_return(self, session):
+        pool = Pool()
+        sale_obj = pool.get('sale.sale')
+        line_obj = pool.get('sale.line')
+
+        sale_id = Transaction().context['active_id']
+        new_sale_id = sale_obj.copy(sale_id)
+        new_line_ids = line_obj.search([('sale', '=', new_sale_id)])
+        for new_line in line_obj.browse(new_line_ids):
+            line_obj.write(new_line.id, {'quantity': -new_line.quantity})
+        return 'end'
+
+ReturnSale()
diff --git a/sale.xml b/sale.xml
index d4f45ff..6267342 100644
--- a/sale.xml
+++ b/sale.xml
@@ -71,20 +71,8 @@ this repository contains the full copyright notices and license terms. -->
                             <field name="warehouse"/>
                             <label name="currency"/>
                             <field name="currency"/>
-                            <field name="lines" colspan="4">
-                                <tree string="Lines" sequence="sequence" fill="1">
-                                    <field name="type"/>
-                                    <field name="product"/>
-                                    <field name="description"/>
-                                    <field name="quantity"/>
-                                    <field name="unit"/>
-                                    <field name="unit_price"/>
-                                    <field name="taxes"/>
-                                    <field name="amount"/>
-                                    <field name="sequence" tree_invisible="1"/>
-                                    <field name="unit_digits" tree_invisible="1"/>
-                                </tree>
-                            </field>
+                            <field name="lines" colspan="4"
+                                view_ids="sale.sale_line_view_tree_sequence"/>
                             <group col="2" colspan="2" id="states">
                                 <label name="invoice_state"/>
                                 <field name="invoice_state"/>
@@ -100,15 +88,12 @@ this repository contains the full copyright notices and license terms. -->
                                 <field name="tax_amount" xalign="1.0" xexpand="0"/>
                                 <label name="total_amount" xalign="1.0" xexpand="1"/>
                                 <field name="total_amount" xalign="1.0" xexpand="0"/>
-                                <group col="6" colspan="2" id="buttons">
-                                    <button name="cancel" string="Cancel"
-                                        states="{'invisible': Or(Equal(Eval('state'), 'cancel'), And(Not(In(Eval('state'), ['draft', 'quotation'])), Not(Equal(Eval('invoice_state'), 'exception')), Not(Equal(Eval('shipment_state'), 'exception')))), 'readonly': Not(In(%(group_sale)d, Eval('groups', [])))}"
+                                <group col="7" colspan="2" id="buttons">
+                                    <button name="cancel" type="object" string="Cancel"
                                         icon="tryton-cancel"/>
-                                    <button name="draft" string="Draft"
-                                        states="{'invisible': Not(Equal(Eval('state'), 'quotation')), 'readonly': Not(In(%(group_sale)d, Eval('groups', [])))}"
+                                    <button name="draft" type="object" string="Draft"
                                         icon="tryton-go-previous"/>
-                                    <button name="quotation" string="Quotation"
-                                        states="{'invisible': Not(Equal(Eval('state'), 'draft')), 'readonly': Or(Not(Bool(Eval('lines'))), Not(In(%(group_sale)d, Eval('groups', []))))}"
+                                    <button name="quote" type="object" string="Quote"
                                         icon="tryton-go-next"/>
                                     <button name="%(wizard_invoice_handle_exception)d"
                                             string="Handle Invoice Exception"
@@ -120,8 +105,9 @@ this repository contains the full copyright notices and license terms. -->
                                             string="Handle Shipment Exception"
                                             states="{'invisible': Or(Not(Equal(Eval('shipment_state'), 'exception')), Equal(Eval('state'), 'cancel')), 'readonly': Not(In(%(group_sale)d, Eval('groups', [])))}"
                                             icon="tryton-go-next"/>
-                                    <button name="confirm" string="Confirm"
-                                        states="{'invisible': Not(Equal(Eval('state'), 'quotation')), 'readonly': Not(In(%(group_sale)d, Eval('groups', [])))}"
+                                    <button name="confirm" type="object" string="Confirm"
+                                        icon="tryton-go-next"/>
+                                    <button name="process" type="object" string="Process"
                                         icon="tryton-go-next"/>
                                 </group>
                             </group>
@@ -138,38 +124,13 @@ this repository contains the full copyright notices and license terms. -->
                             <field name="comment" colspan="4" spell="Eval('party_lang')"/>
                         </page>
                         <page string="Invoices" id="invoices">
-                            <field name="invoices" colspan="4">
-                                <tree>
-                                  <field name="number"/>
-                                  <field name="reference"/>
-                                  <field name="invoice_date"/>
-                                  <field name="party"/>
-                                  <field name="currency"/>
-                                  <field name="untaxed_amount"/>
-                                  <field name="tax_amount"/>
-                                  <field name="total_amount"/>
-                                  <field name="state"/>
-                                  <field name="sale_exception_state"/>
-                                  <field name="amount_to_pay_today"/>
-                                  <field name="description"/>
-                                  <field name="currency_digits" tree_invisible="1"/>
-                              </tree>
-                            </field>
+                            <field name="invoices" colspan="4"/>
                         </page>
                         <page string="Shipments" id="shipments">
-                            <field name="moves" colspan="4">
-                                <tree string="Moves">
-                                    <field name="product"/>
-                                    <field name="from_location"/>
-                                    <field name="to_location"/>
-                                    <field name="quantity"/>
-                                    <field name="uom"/>
-                                    <field name="state"/>
-                                    <field name="sale_exception_state"/>
-                                    <field name="unit_digits" tree_invisible="1"/>
-                                </tree>
-                            </field>
+                            <field name="moves" colspan="4"
+                                view_ids="sale.move_view_list_shipment"/>
                             <field name="shipments" colspan="4"/>
+                            <field name="shipment_returns" colspan="4"/>
                         </page>
                     </notebook>
                     <field name="currency_digits" invisible="1" colspan="6"/>
@@ -202,7 +163,7 @@ this repository contains the full copyright notices and license terms. -->
             </field>
         </record>
 
-        <record model="ir.ui.view" id="handle_shipment_exception_view_form">
+        <record model="ir.ui.view" id="handle_shipment_exception_ask_view_form">
             <field name="model">sale.handle.shipment.exception.ask</field>
             <field name="type">form</field>
             <field name="arch" type="xml">
@@ -213,20 +174,14 @@ this repository contains the full copyright notices and license terms. -->
                     <label string="Choose move to recreate"
                         id="choose"
                         yalign="0.0" xalign="0.0" xexpand="1"/>
-                    <field name="recreate_moves" colspan="2">
-                        <tree string="Recreate Moves" fill="1">
-                            <field name="product"/>
-                            <field name="quantity"/>
-                            <field name="uom"/>
-                            <field name="unit_digits" tree_invisible="1"/>
-                        </tree>
-                    </field>
+                    <field name="recreate_moves" colspan="2"
+                        view_ids="stock.move_view_tree"/>
                 </form>
                 ]]>
             </field>
         </record>
 
-        <record model="ir.ui.view" id="handle_invoice_exception_view_form">
+        <record model="ir.ui.view" id="handle_invoice_exception_ask_view_form">
             <field name="model">sale.handle.invoice.exception.ask</field>
             <field name="type">form</field>
             <field name="arch" type="xml">
@@ -254,6 +209,16 @@ this repository contains the full copyright notices and license terms. -->
             <field name="model">sale.sale,-1</field>
             <field name="action" ref="act_shipment_form"/>
         </record>
+        <record model="ir.action.act_window" id="act_return_form">
+            <field name="name">Returns</field>
+            <field name="res_model">stock.shipment.out.return</field>
+            <field name="domain">[("id", "in", Eval('shipment_returns'))]</field>
+        </record>
+        <record model="ir.action.keyword" id="act_open_shipment_return_keyword1">
+            <field name="keyword">form_relate</field>
+            <field name="model">sale.sale,-1</field>
+            <field name="action" ref="act_return_form"/>
+        </record>
         <record model="ir.action.act_window" id="act_invoice_form">
             <field name="name">Invoices</field>
             <field name="res_model">account.invoice</field>
@@ -342,6 +307,24 @@ this repository contains the full copyright notices and license terms. -->
         <menuitem parent="menu_sale_form" action="act_sale_form_confirmed"
             id="menu_sale_form_confirmed" sequence="40"/>
 
+        <record model="ir.action.act_window" id="act_sale_form_processing">
+            <field name="name">Processing Sales</field>
+            <field name="res_model">sale.sale</field>
+            <field name="domain">[('state', '=', 'processing')]</field>
+        </record>
+        <record model="ir.action.act_window.view" id="act_sale_form_processing_view1">
+            <field name="sequence" eval="10"/>
+            <field name="view" ref="sale_view_tree"/>
+            <field name="act_window" ref="act_sale_form_processing"/>
+        </record>
+        <record model="ir.action.act_window.view" id="act_sale_form_processing_view2">
+            <field name="sequence" eval="20"/>
+            <field name="view" ref="sale_view_form"/>
+            <field name="act_window" ref="act_sale_form_processing"/>
+        </record>
+        <menuitem parent="menu_sale_form" action="act_sale_form_processing"
+            id="menu_sale_form_processing" sequence="50"/>
+
         <record model="ir.model.access" id="access_sale">
             <field name="model" search="[('model', '=', 'sale.sale')]"/>
             <field name="perm_read" eval="False"/>
@@ -358,418 +341,69 @@ this repository contains the full copyright notices and license terms. -->
             <field name="perm_delete" eval="True"/>
         </record>
 
-        <record model="ir.sequence.type" id="sequence_type_sale">
-            <field name="name">Sale</field>
-            <field name="code">sale.sale</field>
-        </record>
-        <record model="ir.sequence.type-res.group"
-            id="sequence_type_sale_group_admin">
-            <field name="sequence_type" ref="sequence_type_sale"/>
-            <field name="group" ref="res.group_admin"/>
-        </record>
-        <record model="ir.sequence.type-res.group"
-            id="sequence_type_sale_group_sale_admin">
-            <field name="sequence_type" ref="sequence_type_sale"/>
-            <field name="group" ref="group_sale_admin"/>
-        </record>
-
-        <record model="ir.sequence" id="sequence_sale">
-            <field name="name">Sale</field>
-            <field name="code">sale.sale</field>
-        </record>
-
-        <record model="workflow" id="sale_workflow">
-            <field name="name">Sale workflow</field>
-            <field name="model">sale.sale</field>
-            <field name="on_create" eval="True"/>
-        </record>
-        <record model="workflow.activity" id="sale_activity_draft">
-            <field name="name">Draft</field>
-            <field name="workflow" ref="sale_workflow"/>
-            <field name="method">wkf_draft</field>
-            <field name="flow_start" eval="True"/>
-        </record>
-        <record model="workflow.activity" id="sale_activity_quotation">
-            <field name="name">Quotation</field>
-            <field name="workflow" ref="sale_workflow"/>
-            <field name="method">wkf_quotation</field>
-        </record>
-        <record model="workflow.activity" id="sale_activity_confirmed">
-            <field name="name">Confirmed</field>
-            <field name="workflow" ref="sale_workflow"/>
-            <field name="split_mode">AND</field>
-            <field name="method">wkf_confirmed</field>
-        </record>
-        <record model="workflow.activity" id="sale_activity_invoice_method">
-            <field name="name">Invoice Method</field>
-            <field name="workflow" ref="sale_workflow"/>
-            <field name="split_mode">OR</field>
-        </record>
-        <record model="workflow.activity" id="sale_activity_waiting_invoice_sale">
-            <field name="name">Waiting Invoice</field>
-            <field name="workflow" ref="sale_workflow"/>
-            <field name="method">wkf_waiting_invoice_sale</field>
-        </record>
-        <record model="workflow.activity" id="sale_activity_invoice_sale_exception">
-            <field name="name">Invoice Exception</field>
-            <field name="workflow" ref="sale_workflow"/>
-            <field name="method">wkf_invoice_sale_exception</field>
-        </record>
-        <record model="workflow.activity" id="sale_activity_invoice_sale_done">
-            <field name="name">Invoice Done</field>
-            <field name="workflow" ref="sale_workflow"/>
-            <field name="method">wkf_invoice_sale_done</field>
-        </record>
-        <record model="workflow.activity" id="sale_activity_shipment_invoice_method">
-            <field name="name">Shipment Invoice Method</field>
-            <field name="workflow" ref="sale_workflow"/>
-            <field name="split_mode">OR</field>
-        </record>
-        <record model="workflow.activity" id="sale_activity_shipment_invoice">
-            <field name="name">Shipment Invoice</field>
-            <field name="workflow" ref="sale_workflow"/>
-            <field name="method">wkf_shipment_invoice</field>
-        </record>
-        <record model="workflow.activity" id="sale_activity_waiting_shipment_invoice">
-            <field name="name">Waiting Shipment Invoice</field>
-            <field name="workflow" ref="sale_workflow"/>
-            <field name="method">wkf_waiting_shipment_invoice</field>
-        </record>
-        <record model="workflow.activity" id="sale_activity_shipment_invoice_exception">
-            <field name="name">Shipment Invoice Exception</field>
-            <field name="workflow" ref="sale_workflow"/>
-            <field name="method">wkf_shipment_invoice_exception</field>
-        </record>
-        <record model="workflow.activity" id="sale_activity_shipment_invoice_done">
-            <field name="name">Shipment Invoice Done</field>
-            <field name="workflow" ref="sale_workflow"/>
-            <field name="method">wkf_shipment_invoice_done</field>
-        </record>
-        <record model="workflow.activity" id="sale_activity_shipment_invoice_method_done">
-            <field name="name">Shipment Invoice Method Done</field>
-            <field name="workflow" ref="sale_workflow"/>
-        </record>
-        <record model="workflow.activity" id="sale_activity_invoice_method_done">
-            <field name="name">Invoice Method Done</field>
-            <field name="workflow" ref="sale_workflow"/>
-        </record>
-        <record model="workflow.activity" id="sale_activity_shipment_method">
-            <field name="name">Shipment Method</field>
-            <field name="workflow" ref="sale_workflow"/>
-        </record>
-        <record model="workflow.activity" id="sale_activity_shipment">
-            <field name="name">Shipment</field>
-            <field name="workflow" ref="sale_workflow"/>
-            <field name="method">wkf_shipment</field>
-        </record>
-        <record model="workflow.activity" id="sale_activity_waiting_shipment">
-            <field name="name">Waiting Shipment</field>
-            <field name="workflow" ref="sale_workflow"/>
-            <field name="method">wkf_waiting_shipment</field>
-        </record>
-        <record model="workflow.activity" id="sale_activity_shipment_exception">
-            <field name="name">Shipment Exception</field>
-            <field name="workflow" ref="sale_workflow"/>
-            <field name="method">wkf_shipment_exception</field>
-        </record>
-        <record model="workflow.activity" id="sale_activity_invoice_shipment_method">
-            <field name="name">Invoice Shipment Method</field>
-            <field name="workflow" ref="sale_workflow"/>
-            <field name="split_mode">OR</field>
-        </record>
-        <record model="workflow.activity" id="sale_activity_invoice_shipment">
-            <field name="name">Invoice Shipment</field>
-            <field name="workflow" ref="sale_workflow"/>
-            <field name="method">wkf_invoice_shipment</field>
-        </record>
-        <record model="workflow.activity" id="sale_activity_waiting_invoice_shipment">
-            <field name="name">Waiting Invoice Shipment</field>
-            <field name="workflow" ref="sale_workflow"/>
-            <field name="method">wkf_waiting_invoice_shipment</field>
-        </record>
-        <record model="workflow.activity" id="sale_activity_invoice_shipment_exception">
-            <field name="name">Invoice Shipment Exception</field>
-            <field name="workflow" ref="sale_workflow"/>
-            <field name="method">wkf_invoice_shipment_exception</field>
-        </record>
-        <record model="workflow.activity" id="sale_activity_invoice_shipment_done">
-            <field name="name">Invoice Shipment Done</field>
-            <field name="workflow" ref="sale_workflow"/>
-            <field name="method">wkf_invoice_shipment_done</field>
-        </record>
-        <record model="workflow.activity" id="sale_activity_invoice_shipment_method_done">
-            <field name="name">Invoice Shipment Method Done</field>
-            <field name="workflow" ref="sale_workflow"/>
-            <field name="method">wkf_invoice_shipment_method_done</field>
-        </record>
-        <record model="workflow.activity" id="sale_activity_shipment_method_done">
-            <field name="name">Shipment Method Done</field>
-            <field name="workflow" ref="sale_workflow"/>
-        </record>
-        <record model="workflow.activity" id="sale_activity_done">
-            <field name="name">Done</field>
-            <field name="workflow" ref="sale_workflow"/>
-            <field name="join_mode">AND</field>
-            <field name="method">wkf_done</field>
-            <field name="flow_stop" eval="True"/>
-        </record>
-        <record model="workflow.activity" id="sale_activity_cancel">
-            <field name="name">Canceled</field>
-            <field name="workflow" ref="sale_workflow"/>
-            <field name="method">wkf_cancel</field>
-            <field name="flow_stop" eval="True"/>
-        </record>
-
-        <record model="workflow.transition" id="sale_transition_draft_quotation">
-            <field name="act_from" ref="sale_activity_draft"/>
-            <field name="act_to" ref="sale_activity_quotation"/>
-            <field name="condition">wkf_draft2quotation</field>
-            <field name="signal">quotation</field>
-            <field name="group" ref="group_sale"/>
-        </record>
-        <record model="workflow.transition" id="sale_transition_draft_cancel">
-            <field name="act_from" ref="sale_activity_draft"/>
-            <field name="act_to" ref="sale_activity_cancel"/>
-            <field name="signal">cancel</field>
-            <field name="group" ref="group_sale"/>
-        </record>
-        <record model="workflow.transition" id="sale_transition_quotation_draft">
-            <field name="act_from" ref="sale_activity_quotation"/>
-            <field name="act_to" ref="sale_activity_draft"/>
-            <field name="signal">draft</field>
-            <field name="group" ref="group_sale"/>
-        </record>
-        <record model="workflow.transition" id="sale_transition_quotation_confirmed">
-            <field name="act_from" ref="sale_activity_quotation"/>
-            <field name="act_to" ref="sale_activity_confirmed"/>
-            <field name="signal">confirm</field>
-            <field name="group" ref="group_sale"/>
+        <record model="ir.model.button" id="sale_cancel_button">
+            <field name="name">cancel</field>
+            <field name="model" search="[('model', '=', 'sale.sale')]"/>
         </record>
-        <record model="workflow.transition" id="sale_transition_quotation_cancel">
-            <field name="act_from" ref="sale_activity_quotation"/>
-            <field name="act_to" ref="sale_activity_cancel"/>
-            <field name="signal">cancel</field>
+        <record model="ir.model.button-res.group" id="sale_cancel_button_group_sale">
+            <field name="button" ref="sale_cancel_button"/>
             <field name="group" ref="group_sale"/>
         </record>
-        <record model="workflow.transition" id="sale_transition_confirmed_invoice_method">
-            <field name="act_from" ref="sale_activity_confirmed"/>
-            <field name="act_to" ref="sale_activity_invoice_method"/>
-        </record>
-
-        <record model="workflow.transition" id="sale_transition_invoice_method_waiting_invoice_sale">
-            <field name="act_from" ref="sale_activity_invoice_method"/>
-            <field name="act_to" ref="sale_activity_waiting_invoice_sale"/>
-            <field name="condition">wkf_invoice_method2waiting_invoice_sale</field>
-        </record>
-        <record model="workflow.transition" id="sale_transition_invoice_method_invoice_method_done">
-            <field name="act_from" ref="sale_activity_invoice_method"/>
-            <field name="act_to" ref="sale_activity_invoice_method_done"/>
-            <field name="condition">wkf_invoice_method2invoice_method_done</field>
-        </record>
-        <record model="workflow.transition" id="sale_transition_waiting_invoice_sale_invoice_sale_exception">
-            <field name="act_from" ref="sale_activity_waiting_invoice_sale"/>
-            <field name="act_to" ref="sale_activity_invoice_sale_exception"/>
-            <field name="trigger_model">account.invoice</field>
-            <field name="trigger_ids">wkf_triggered_invoices</field>
-            <field
-                name="condition">wkf_waiting_invoice_sale2invoice_sale_exception</field>
-        </record>
-        <record model="workflow.transition" id="sale_transition_invoice_sale_exception_invoice_sale">
-            <field name="act_from" ref="sale_activity_invoice_sale_exception"/>
-            <field name="act_to" ref="sale_activity_waiting_invoice_sale"/>
-            <field name="signal">invoice_ok</field>
-            <field name="group" ref="group_sale"/>
+
+        <record model="ir.model.button" id="sale_draft_button">
+            <field name="name">draft</field>
+            <field name="model" search="[('model', '=', 'sale.sale')]"/>
         </record>
-        <record model="workflow.transition" id="sale_transition_invoice_sale_exception_cancel">
-            <field name="act_from" ref="sale_activity_invoice_sale_exception"/>
-            <field name="act_to" ref="sale_activity_cancel"/>
-            <field name="signal">cancel</field>
+        <record model="ir.model.button-res.group" id="sale_draft_button_group_sale">
+            <field name="button" ref="sale_draft_button"/>
             <field name="group" ref="group_sale"/>
         </record>
-        <record model="workflow.transition" id="sale_transition_waiting_invoice_sale_invoic_sale_done">
-            <field name="act_from" ref="sale_activity_waiting_invoice_sale"/>
-            <field name="act_to" ref="sale_activity_invoice_sale_done"/>
-            <field name="trigger_model">account.invoice</field>
-            <field name="trigger_ids">wkf_triggered_invoices</field>
-            <field name="condition">wkf_waiting_invoice_sale2invoice_sale_done</field>
-        </record>
-        <record model="workflow.transition" id="sale_transition_invoice_sale_done">
-            <field name="act_from" ref="sale_activity_invoice_sale_done"/>
-            <field name="act_to" ref="sale_activity_shipment_invoice_method"/>
-        </record>
-        <record model="workflow.transition" id="sale_transition_shipment_invoice_method_shipment_invoice_method_done">
-            <field name="act_from" ref="sale_activity_shipment_invoice_method"/>
-            <field name="act_to" ref="sale_activity_shipment_invoice_method_done"/>
-            <field
-                name="condition">wkf_shipment_invoice_method2shipment_invoice_method_done</field>
-        </record>
-        <record model="workflow.transition" id="sale_transition_shipment_invoice_method_shipment_invoice">
-            <field name="act_from" ref="sale_activity_shipment_invoice_method"/>
-            <field name="act_to" ref="sale_activity_shipment_invoice"/>
-            <field
-                name="condition">wkf_shipment_invoice_method2shipment_invoice</field>
-        </record>
-        <record model="workflow.transition" id="sale_transition_shipment_invoice_waiting_shipment_invoice">
-            <field name="act_from" ref="sale_activity_shipment_invoice"/>
-            <field name="act_to" ref="sale_activity_waiting_shipment_invoice"/>
-        </record>
-        <record model="workflow.transition" id="sale_transition_shipment_invoice_shipment_invoice_exception">
-            <field name="act_from" ref="sale_activity_waiting_shipment_invoice"/>
-            <field name="act_to" ref="sale_activity_shipment_invoice_exception"/>
-            <field name="trigger_model">stock.shipment.out</field>
-            <field name="trigger_ids">wkf_triggered_shipments</field>
-            <field
-                name="condition">wkf_waiting_shipment_invoice2shipment_invoice_exception</field>
-        </record>
-        <record model="workflow.transition" id="sale_transition_shipment_invoice_exception_cancel">
-            <field name="act_from" ref="sale_activity_shipment_invoice_exception"/>
-            <field name="act_to" ref="sale_activity_cancel"/>
-            <field name="signal">cancel</field>
-            <field name="group" ref="group_sale"/>
+
+        <record model="ir.model.button" id="sale_quote_button">
+            <field name="name">quote</field>
+            <field name="model" search="[('model', '=', 'sale.sale')]"/>
         </record>
-        <record model="workflow.transition" id="sale_transition_shipment_invoice_exception_waiting_shipment_invoice">
-            <field name="act_from" ref="sale_activity_shipment_invoice_exception"/>
-            <field name="act_to" ref="sale_activity_waiting_shipment_invoice"/>
-            <field name="signal">shipment_ok</field>
+        <record model="ir.model.button-res.group" id="sale_quote_button_group_sale">
+            <field name="button" ref="sale_quote_button"/>
             <field name="group" ref="group_sale"/>
         </record>
-        <record model="workflow.transition" id="sale_transition_shipment_waiting_shipment_invoice_shipment_invoice_done">
-            <field name="act_from" ref="sale_activity_waiting_shipment_invoice"/>
-            <field name="act_to" ref="sale_activity_shipment_invoice_done"/>
-            <field name="trigger_model">stock.shipment.out</field>
-            <field name="trigger_ids">wkf_triggered_shipments</field>
-            <field
-                name="condition">wkf_waiting_shipment_invoice2shipment_invoice_done</field>
-        </record>
-        <record model="workflow.transition" id="sale_transition_shipment_invoice_done_shipment_invoice_method_done">
-            <field name="act_from" ref="sale_activity_shipment_invoice_done"/>
-            <field name="act_to" ref="sale_activity_shipment_invoice_method_done"/>
-        </record>
-        <record model="workflow.transition" id="sale_transition_shipment_invoice_method_done_invoice_method_done">
-            <field name="act_from" ref="sale_activity_shipment_invoice_method_done"/>
-            <field name="act_to" ref="sale_activity_invoice_method_done"/>
-        </record>
-        <record model="workflow.transition" id="sale_transition_invoice_method_done_done">
-            <field name="act_from" ref="sale_activity_invoice_method_done"/>
-            <field name="act_to" ref="sale_activity_done"/>
-        </record>
-        <record model="workflow.transition" id="sale_transition_confirmed_shipment_method">
-            <field name="act_from" ref="sale_activity_confirmed"/>
-            <field name="act_to" ref="sale_activity_shipment_method"/>
-        </record>
-        <record model="workflow.transition" id="sale_transition_shipment_method_shipment_method_done">
-            <field name="act_from" ref="sale_activity_shipment_method"/>
-            <field name="act_to" ref="sale_activity_shipment_method_done"/>
-            <field name="condition">wkf_shipment_method2shipment_method_done</field>
-        </record>
-        <record model="workflow.transition" id="sale_transition_shipment_method_shipment">
-            <field name="act_from" ref="sale_activity_shipment_method"/>
-            <field name="act_to" ref="sale_activity_shipment"/>
-            <field name="condition">wkf_shipment_method2shipment</field>
-        </record>
-        <record model="workflow.transition" id="sale_transition_shipment_waiting_shipment">
-            <field name="act_from" ref="sale_activity_shipment"/>
-            <field name="act_to" ref="sale_activity_waiting_shipment"/>
-        </record>
-        <record model="workflow.transition" id="sale_transition_waiting_shipment_shipment_exception">
-            <field name="act_from" ref="sale_activity_waiting_shipment"/>
-            <field name="act_to" ref="sale_activity_shipment_exception"/>
-            <field name="signal">shipment_update</field>
-            <field name="condition">wkf_waiting_shipment2shipment_exception</field>
-        </record>
-        <record model="workflow.transition" id="sale_transition_shipment_exception_cancel">
-            <field name="act_from" ref="sale_activity_shipment_exception"/>
-            <field name="act_to" ref="sale_activity_cancel"/>
-            <field name="signal">cancel</field>
-            <field name="group" ref="group_sale"/>
+
+        <record model="ir.model.button" id="sale_confirm_button">
+            <field name="name">confirm</field>
+            <field name="model" search="[('model', '=', 'sale.sale')]"/>
         </record>
-        <record model="workflow.transition" id="sale_transition_shipment_exception_waiting_shipment">
-            <field name="act_from" ref="sale_activity_shipment_exception"/>
-            <field name="act_to" ref="sale_activity_waiting_shipment"/>
-            <field name="signal">shipment_ok</field>
+        <record model="ir.model.button-res.group" id="sale_confirm_button_group_sale">
+            <field name="button" ref="sale_confirm_button"/>
             <field name="group" ref="group_sale"/>
         </record>
-        <record model="workflow.transition" id="sale_transition_waiting_shipment_invoice_shipment_method">
-            <field name="act_from" ref="sale_activity_waiting_shipment"/>
-            <field name="act_to" ref="sale_activity_invoice_shipment_method"/>
-            <field name="signal">shipment_update</field>
-            <field
-                name="condition">wkf_waiting_shipment2invoice_shipment_method</field>
-        </record>
-        <record model="workflow.transition" id="sale_transition_waiting_shipment_invoice_shipment_method2">
-            <field name="act_from" ref="sale_activity_waiting_shipment"/>
-            <field name="act_to" ref="sale_activity_invoice_shipment_method"/>
-            <field
-                name="condition">wkf_waiting_shipment2invoice_shipment_method_nosignal</field>
-        </record>
-        <record model="workflow.transition" id="sale_transition_invoice_shipment_method_invoice_shipment">
-            <field name="act_from" ref="sale_activity_invoice_shipment_method"/>
-            <field name="act_to" ref="sale_activity_invoice_shipment"/>
-            <field
-                name="condition">wkf_invoice_shipment_method2invoice_shipment</field>
-        </record>
-        <record model="workflow.transition" id="sale_transition_invoice_shipment_method_invoice_shipment_method_done">
-            <field name="act_from" ref="sale_activity_invoice_shipment_method"/>
-            <field name="act_to" ref="sale_activity_invoice_shipment_method_done"/>
-            <field
-                name="condition">wkf_invoice_shipment_method2invoice_shipment_method_done</field>
-        </record>
-        <record model="workflow.transition" id="sale_transition_invoice_shipment_method_waiting_shipment">
-            <field name="act_from" ref="sale_activity_invoice_shipment_method"/>
-            <field name="act_to" ref="sale_activity_waiting_shipment"/>
-            <field
-                name="condition">wkf_invoice_shipment_method2waiting_shipment</field>
-        </record>
-        <record model="workflow.transition" id="sale_transition_invoice_shipment_waiting_shipment">
-            <field name="act_from" ref="sale_activity_invoice_shipment"/>
-            <field name="act_to" ref="sale_activity_waiting_shipment"/>
-            <field name="condition">wkf_invoice_shipment2waiting_shipment</field>
-        </record>
-        <record model="workflow.transition" id="sale_transition_invoice_shipment_waiting_invoice_shipment">
-            <field name="act_from" ref="sale_activity_invoice_shipment"/>
-            <field name="act_to" ref="sale_activity_waiting_invoice_shipment"/>
-            <field
-                name="condition">wkf_invoice_shipment2waiting_invoice_shipment</field>
-        </record>
-        <record model="workflow.transition" id="sale_transition_waiting_invoice_shipment_invoice_shipment_exception">
-            <field name="act_from" ref="sale_activity_waiting_invoice_shipment"/>
-            <field name="act_to" ref="sale_activity_invoice_shipment_exception"/>
-            <field name="trigger_model">account.invoice</field>
-            <field name="trigger_ids">wkf_triggered_invoices</field>
-            <field
-                name="condition">wkf_waiting_invoice_shipment2invoice_shipment_exception</field>
-        </record>
-        <record model="workflow.transition" id="sale_transition_invoice_shipment_exception_cancel">
-            <field name="act_from" ref="sale_activity_invoice_shipment_exception"/>
-            <field name="act_to" ref="sale_activity_cancel"/>
-            <field name="signal">cancel</field>
-            <field name="group" ref="group_sale"/>
+
+        <record model="ir.model.button" id="sale_process_button">
+            <field name="name">process</field>
+            <field name="model" search="[('model', '=', 'sale.sale')]"/>
         </record>
-        <record model="workflow.transition" id="sale_transition_invoice_shipment_exception_waiting_invoice_shipment">
-            <field name="act_from" ref="sale_activity_invoice_shipment_exception"/>
-            <field name="act_to" ref="sale_activity_waiting_invoice_shipment"/>
-            <field name="signal">invoice_ok</field>
+        <record model="ir.model.button-res.group" id="sale_process_button_group_sale">
+            <field name="button" ref="sale_process_button"/>
             <field name="group" ref="group_sale"/>
         </record>
-        <record model="workflow.transition" id="sale_transition_waiting_invoice_shipment_invoice_shipment_done">
-            <field name="act_from" ref="sale_activity_waiting_invoice_shipment"/>
-            <field name="act_to" ref="sale_activity_invoice_shipment_done"/>
-            <field name="trigger_model">account.invoice</field>
-            <field name="trigger_ids">wkf_triggered_invoices</field>
-            <field
-                name="condition">wkf_waiting_invoice_shipment2invoice_shipment_done</field>
+
+        <record model="ir.sequence.type" id="sequence_type_sale">
+            <field name="name">Sale</field>
+            <field name="code">sale.sale</field>
         </record>
-        <record model="workflow.transition" id="sale_transition_invoice_shipment_done_invoice_shipment_method_done">
-            <field name="act_from" ref="sale_activity_invoice_shipment_done"/>
-            <field name="act_to" ref="sale_activity_invoice_shipment_method_done"/>
+        <record model="ir.sequence.type-res.group"
+            id="sequence_type_sale_group_admin">
+            <field name="sequence_type" ref="sequence_type_sale"/>
+            <field name="group" ref="res.group_admin"/>
         </record>
-        <record model="workflow.transition" id="sale_transition_invoice_shipment_method_done_shipment_method_done">
-            <field name="act_from" ref="sale_activity_invoice_shipment_method_done"/>
-            <field name="act_to" ref="sale_activity_shipment_method_done"/>
+        <record model="ir.sequence.type-res.group"
+            id="sequence_type_sale_group_sale_admin">
+            <field name="sequence_type" ref="sequence_type_sale"/>
+            <field name="group" ref="group_sale_admin"/>
         </record>
-        <record model="workflow.transition" id="sale_transition_shipment_method_done_done">
-            <field name="act_from" ref="sale_activity_shipment_method_done"/>
-            <field name="act_to" ref="sale_activity_done"/>
+
+        <record model="ir.sequence" id="sequence_sale">
+            <field name="name">Sale</field>
+            <field name="code">sale.sale</field>
         </record>
 
         <record model="ir.action.report" id="report_sale">
@@ -800,18 +434,8 @@ this repository contains the full copyright notices and license terms. -->
                             <label name="sequence"/>
                             <field name="sequence"/>
                             <label name="product"/>
-                            <field name="product">
-                                <tree string="Products">
-                                    <field name="name"/>
-                                    <field name="code"/>
-                                    <field name="list_price_uom"/>
-                                    <field name="cost_price_uom"/>
-                                    <field name="quantity"/>
-                                    <field name="forecast_quantity"/>
-                                    <field name="default_uom"/>
-                                    <field name="active"/>
-                                </tree>
-                            </field>
+                            <field name="product"
+                                view_ids="sale.product_view_list_sale_line"/>
                             <newline/>
                             <label name="description"/>
                             <field name="description" colspan="3"
@@ -824,6 +448,8 @@ this repository contains the full copyright notices and license terms. -->
                             <field name="unit_price"/>
                             <label name="amount"/>
                             <field name="amount"/>
+                            <label name="delivery_date"/>
+                            <field name="delivery_date"/>
                             <field name="taxes" colspan="4"/>
                         </page>
                         <page string="Notes" id="notes">
@@ -837,9 +463,11 @@ this repository contains the full copyright notices and license terms. -->
                 ]]>
             </field>
         </record>
+
         <record model="ir.ui.view" id="sale_line_view_tree">
             <field name="model">sale.line</field>
             <field name="type">tree</field>
+            <field name="priority" eval="10"/>
             <field name="arch" type="xml">
                 <![CDATA[
                 <tree string="Sale Lines">
@@ -858,6 +486,27 @@ this repository contains the full copyright notices and license terms. -->
             </field>
         </record>
 
+        <record model="ir.ui.view" id="sale_line_view_tree_sequence">
+            <field name="model">sale.line</field>
+            <field name="type">tree</field>
+            <field name="priority" eval="20"/>
+            <field name="arch" type="xml">
+                <![CDATA[
+                <tree string="Sale Lines" sequence="sequence">
+                    <field name="type"/>
+                    <field name="product"/>
+                    <field name="description"/>
+                    <field name="quantity"/>
+                    <field name="unit"/>
+                    <field name="unit_price"/>
+                    <field name="taxes"/>
+                    <field name="amount" expand="1"/>
+                    <field name="unit_digits" tree_invisible="1"/>
+                </tree>
+                ]]>
+            </field>
+        </record>
+
         <record model="ir.model.access" id="access_sale_line">
             <field name="model" search="[('model', '=', 'sale.line')]"/>
             <field name="perm_read" eval="False"/>
@@ -927,6 +576,17 @@ this repository contains the full copyright notices and license terms. -->
             icon="tryton-list"
             id="menu_customer"/>
 
+        <record model="ir.action.wizard" id="wizard_return_sale">
+            <field name="name">Create Return Sale</field>
+            <field name="wiz_name">sale.return_sale</field>
+            <field name="model">sale.sale</field>
+        </record>
+        <record model="ir.action.keyword" id="act_wizard_return_sale_keyword">
+            <field name="keyword">form_action</field>
+            <field name="model">sale.sale,-1</field>
+            <field name="action" ref="wizard_return_sale"/>
+        </record>
+
         <record model="ir.rule.group" id="rule_group_sale">
             <field name="model" search="[('model', '=', 'sale.sale')]"/>
             <field name="global_p" eval="True"/>
diff --git a/setup.py b/setup.py
index 721a34e..4466f62 100644
--- a/setup.py
+++ b/setup.py
@@ -12,13 +12,16 @@ minor_version = int(minor_version)
 
 requires = []
 for dep in info.get('depends', []):
-    if not re.match(r'(ir|res|workflow|webdav)(\W|$)', dep):
+    if not re.match(r'(ir|res|webdav)(\W|$)', dep):
         requires.append('trytond_%s >= %s.%s, < %s.%s' %
                 (dep, major_version, minor_version, major_version,
                     minor_version + 1))
 requires.append('trytond >= %s.%s, < %s.%s' %
         (major_version, minor_version, major_version, minor_version + 1))
 
+tests_require = ['proteus >= %s.%s, < %s.%s' %
+    (major_version, minor_version, major_version, minor_version + 1)]
+
 setup(name='trytond_sale',
     version=info.get('version', '0.0.1'),
     description=info.get('description', ''),
@@ -68,4 +71,5 @@ setup(name='trytond_sale',
     """,
     test_suite='tests',
     test_loader='trytond.test_loader:Loader',
+    test_require=tests_require,
 )
diff --git a/stock.xml b/stock.xml
new file mode 100644
index 0000000..c9d079f
--- /dev/null
+++ b/stock.xml
@@ -0,0 +1,26 @@
+<?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. -->
+<tryton>
+    <data>
+        <record model="ir.ui.view" id="move_view_list_shipment">
+            <field name="model">stock.move</field>
+            <field name="type">tree</field>
+            <field name="priority" eval="20"/>
+            <field name="arch" type="xml">
+                <![CDATA[
+                <tree string="Moves">
+                    <field name="product"/>
+                    <field name="from_location"/>
+                    <field name="to_location"/>
+                    <field name="quantity"/>
+                    <field name="uom"/>
+                    <field name="state"/>
+                    <field name="sale_exception_state"/>
+                    <field name="unit_digits" tree_invisible="1"/>
+                </tree>
+                ]]>
+            </field>
+        </record>
+    </data>
+</tryton>
diff --git a/tests/__init__.py b/tests/__init__.py
index df19c77..656a242 100644
--- a/tests/__init__.py
+++ b/tests/__init__.py
@@ -1,4 +1,4 @@
 #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 test_sale import suite
+from .test_sale import suite
diff --git a/tests/test_sale.py b/tests/test_sale.py
index d68d1c6..0b897f7 100644
--- a/tests/test_sale.py
+++ b/tests/test_sale.py
@@ -2,15 +2,18 @@
 #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 sys, os
+import sys
+import os
 DIR = os.path.abspath(os.path.normpath(os.path.join(__file__,
     '..', '..', '..', '..', '..', 'trytond')))
 if os.path.isdir(DIR):
     sys.path.insert(0, os.path.dirname(DIR))
 
 import unittest
+import doctest
 import trytond.tests.test_tryton
 from trytond.tests.test_tryton import test_view, test_depends
+from trytond.backend.sqlite.database import Database as SQLiteDatabase
 
 
 class SaleTestCase(unittest.TestCase):
@@ -33,9 +36,23 @@ class SaleTestCase(unittest.TestCase):
         '''
         test_depends()
 
+
+def doctest_dropdb(test):
+    database = SQLiteDatabase().connect()
+    cursor = database.cursor(autocommit=True)
+    try:
+        database.drop(cursor, ':memory:')
+        cursor.commit()
+    finally:
+        cursor.close()
+
+
 def suite():
     suite = trytond.tests.test_tryton.suite()
     suite.addTests(unittest.TestLoader().loadTestsFromTestCase(SaleTestCase))
+    suite.addTests(doctest.DocFileSuite('scenario_sale.rst',
+            setUp=doctest_dropdb, tearDown=doctest_dropdb, encoding='utf-8',
+            optionflags=doctest.REPORT_ONLY_FIRST_FAILURE))
     return suite
 
 if __name__ == '__main__':
diff --git a/trytond_sale.egg-info/PKG-INFO b/trytond_sale.egg-info/PKG-INFO
index 9f8ee0f..79d143d 100644
--- a/trytond_sale.egg-info/PKG-INFO
+++ b/trytond_sale.egg-info/PKG-INFO
@@ -1,6 +1,6 @@
-Metadata-Version: 1.1
+Metadata-Version: 1.0
 Name: trytond-sale
-Version: 2.2.1
+Version: 2.4.0
 Summary: Define sale order.
 Add to product sale informations.
 Define the sale price as the list price.
@@ -9,18 +9,18 @@ With the possibilities:
     - to follow invoice and shipment states from the sale order.
     - to define invoice method:
         - Manual
-        - On Order Confirmed
+        - On Order Processed
         - On shipment Sent
     - to define shipment method:
         - Manual
-        - On Order Confirmed
+        - On Order Processed
         - On Invoice Paid
 
 Home-page: http://www.tryton.org/
 Author: B2CK
 Author-email: info at b2ck.com
 License: GPL-3
-Download-URL: http://downloads.tryton.org/2.2/
+Download-URL: http://downloads.tryton.org/2.4/
 Description: UNKNOWN
 Platform: UNKNOWN
 Classifier: Development Status :: 5 - Production/Stable
diff --git a/trytond_sale.egg-info/SOURCES.txt b/trytond_sale.egg-info/SOURCES.txt
index 80c27bb..8a0843f 100644
--- a/trytond_sale.egg-info/SOURCES.txt
+++ b/trytond_sale.egg-info/SOURCES.txt
@@ -7,9 +7,11 @@ README
 TODO
 configuration.xml
 party.xml
+product.xml
 sale.odt
 sale.xml
 setup.py
+stock.xml
 ./__init__.py
 ./__tryton__.py
 ./configuration.py
@@ -19,8 +21,10 @@ setup.py
 ./tests/test_sale.py
 doc/index.rst
 locale/bg_BG.po
+locale/ca_ES.po
 locale/cs_CZ.po
 locale/de_DE.po
+locale/es_AR.po
 locale/es_CO.po
 locale/es_ES.po
 locale/fr_FR.po
diff --git a/trytond_sale.egg-info/requires.txt b/trytond_sale.egg-info/requires.txt
index e3b51f8..a073a56 100644
--- a/trytond_sale.egg-info/requires.txt
+++ b/trytond_sale.egg-info/requires.txt
@@ -1,9 +1,9 @@
-trytond_company >= 2.2, < 2.3
-trytond_party >= 2.2, < 2.3
-trytond_stock >= 2.2, < 2.3
-trytond_account >= 2.2, < 2.3
-trytond_product >= 2.2, < 2.3
-trytond_account_invoice >= 2.2, < 2.3
-trytond_currency >= 2.2, < 2.3
-trytond_account_product >= 2.2, < 2.3
-trytond >= 2.2, < 2.3
\ No newline at end of file
+trytond_company >= 2.4, < 2.5
+trytond_party >= 2.4, < 2.5
+trytond_stock >= 2.4, < 2.5
+trytond_account >= 2.4, < 2.5
+trytond_product >= 2.4, < 2.5
+trytond_account_invoice >= 2.4, < 2.5
+trytond_currency >= 2.4, < 2.5
+trytond_account_product >= 2.4, < 2.5
+trytond >= 2.4, < 2.5
\ No newline at end of file
commit cb98ed0a236ba756ff78af6301b3e2f51fe2ce53
Author: Mathias Behrle <mathiasb at m9s.biz>
Date:   Sun Mar 25 15:28:18 2012 +0200

    Adding Format header for DEP5.

diff --git a/debian/copyright b/debian/copyright
index 0ce2e9b..21a85a7 100644
--- a/debian/copyright
+++ b/debian/copyright
@@ -1,3 +1,5 @@
+Format: http://www.debian.org/doc/packaging-manuals/copyright-format/1.0/
+
 Files: *
 Copyright:
  (C) 2004-2008 Tiny SPRL
commit e0662f5bbd1529434df25900a1f2c88799235df7
Author: Mathias Behrle <mathiasb at m9s.biz>
Date:   Fri Feb 24 14:09:12 2012 +0100

    Adding myself to copyright.

diff --git a/debian/copyright b/debian/copyright
index 9e33b25..0ce2e9b 100644
--- a/debian/copyright
+++ b/debian/copyright
@@ -7,7 +7,9 @@ Copyright:
 License: GPL-3+
 
 Files: debian/*
-Copyright: (C) 2009-2012 Daniel Baumann <daniel at debian.org>
+Copyright:
+ (C) 2009-2012 Daniel Baumann <daniel at debian.org>
+ (C) 2012 Mathias Behrle <mathiasb at m9s.biz>
 License: GPL-3+
 
 License: GPL-3+
commit 88e09d6e3b15b1ba2c9269a8038161fc99e6a514
Author: Mathias Behrle <mathiasb at m9s.biz>
Date:   Fri Feb 24 14:01:03 2012 +0100

    Updating year in copyright.

diff --git a/debian/copyright b/debian/copyright
index b2d5d1a..9e33b25 100644
--- a/debian/copyright
+++ b/debian/copyright
@@ -7,7 +7,7 @@ Copyright:
 License: GPL-3+
 
 Files: debian/*
-Copyright: (C) 2009-2011 Daniel Baumann <daniel at debian.org>
+Copyright: (C) 2009-2012 Daniel Baumann <daniel at debian.org>
 License: GPL-3+
 
 License: GPL-3+
commit 99e993643a179ad02da3f0b8106d0131652f6c85
Author: Mathias Behrle <mathiasb at m9s.biz>
Date:   Fri Feb 24 13:47:02 2012 +0100

    Updating to Standards-Version: 3.9.3, no changes needed.

diff --git a/debian/control b/debian/control
index 4249401..df3f92d 100644
--- a/debian/control
+++ b/debian/control
@@ -5,7 +5,7 @@ Maintainer: Debian Tryton Maintainers <tryton at lists.debian-maintainers.org>
 Uploaders: Daniel Baumann <daniel at debian.org>, Mathias Behrle <mathiasb at m9s.biz>
 Dm-Upload-Allowed: yes
 Build-Depends: debhelper (>= 8), python (>= 2.6.6-3~), python-setuptools
-Standards-Version: 3.9.2
+Standards-Version: 3.9.3
 Homepage: http://www.tryton.org/
 Vcs-Browser: http://git.debian-maintainers.org/?p=tryton/tryton-modules-sale.git
 Vcs-Git: git://git.debian-maintainers.org/git/tryton/tryton-modules-sale.git
commit 4c814914caf229ffa06a384f812ecfaaf8173067
Author: Mathias Behrle <mathiasb at m9s.biz>
Date:   Mon Dec 26 18:09:15 2011 +0100

    Releasing debian version 2.2.1-1.

diff --git a/debian/changelog b/debian/changelog
index 96ea337..cb2d277 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -1,3 +1,13 @@
+tryton-modules-sale (2.2.1-1) unstable; urgency=low
+
+  * Merging upstream version 2.2.1.
+  * Bumping X-Python-Version to >=2.6.
+  * Updating versioned tryton depends to 2.2.
+  * Merging upstream version 2.2.0.
+  * Removing deprecated XB-Python-Version for dh_python2.
+
+ -- Mathias Behrle <mathiasb at m9s.biz>  Mon, 26 Dec 2011 13:55:43 +0100
+
 tryton-modules-sale (2.0.1-2) unstable; urgency=low
 
   [ Daniel Baumann ]
commit f72cdebb8dd1ffe00f32d9a8dd31770ad3887f7c
Author: Mathias Behrle <mathiasb at m9s.biz>
Date:   Mon Dec 26 13:35:53 2011 +0100

    Merging upstream version 2.2.1.

diff --git a/CHANGELOG b/CHANGELOG
index f16348b..c07ac6e 100644
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -1,3 +1,6 @@
+Version 2.2.1 - 2011-12-26
+* Bug fixes (see mercurial logs for details)
+
 Version 2.2.0 - 2011-10-25
 * Bug fixes (see mercurial logs for details)
 * Add delivery time on product
diff --git a/PKG-INFO b/PKG-INFO
index 8a443a7..d2cf512 100644
--- a/PKG-INFO
+++ b/PKG-INFO
@@ -1,6 +1,6 @@
-Metadata-Version: 1.0
+Metadata-Version: 1.1
 Name: trytond_sale
-Version: 2.2.0
+Version: 2.2.1
 Summary: Define sale order.
 Add to product sale informations.
 Define the sale price as the list price.
diff --git a/__tryton__.py b/__tryton__.py
index c94a1be..f57b590 100644
--- a/__tryton__.py
+++ b/__tryton__.py
@@ -8,7 +8,7 @@
     'name_es_ES': 'Venta',
     'name_fr_FR': 'Vente',
     'name_nl_NL': 'Verkoop',
-    'version': '2.2.0',
+    'version': '2.2.1',
     'author': 'B2CK',
     'email': 'info at b2ck.com',
     'website': 'http://www.tryton.org/',
diff --git a/sale.py b/sale.py
index 493221c..c817e99 100644
--- a/sale.py
+++ b/sale.py
@@ -830,6 +830,7 @@ class Sale(ModelWorkflow, ModelSQL, ModelView):
                     'delivery_address': sale.shipment_address.id,
                     'reference': sale.reference,
                     'warehouse': sale.warehouse.id,
+                    'company': sale.company.id,
                     }
                 values.update(dict(key))
                 shipment_id = shipment_obj.create(values)
diff --git a/trytond_sale.egg-info/PKG-INFO b/trytond_sale.egg-info/PKG-INFO
index 03bbc17..9f8ee0f 100644
--- a/trytond_sale.egg-info/PKG-INFO
+++ b/trytond_sale.egg-info/PKG-INFO
@@ -1,6 +1,6 @@
-Metadata-Version: 1.0
+Metadata-Version: 1.1
 Name: trytond-sale
-Version: 2.2.0
+Version: 2.2.1
 Summary: Define sale order.
 Add to product sale informations.
 Define the sale price as the list price.
commit 3ce690266d6b55127d16983c7a5cb1cdbdb9fa1f
Author: Mathias Behrle <mathiasb at m9s.biz>
Date:   Sat Dec 17 13:59:45 2011 +0100

    Bumping X-Python-Version to >=2.6.

diff --git a/debian/control b/debian/control
index 929a5f1..4249401 100644
--- a/debian/control
+++ b/debian/control
@@ -9,7 +9,7 @@ Standards-Version: 3.9.2
 Homepage: http://www.tryton.org/
 Vcs-Browser: http://git.debian-maintainers.org/?p=tryton/tryton-modules-sale.git
 Vcs-Git: git://git.debian-maintainers.org/git/tryton/tryton-modules-sale.git
-X-Python-Version: >= 2.5
+X-Python-Version: >= 2.6
 
 Package: tryton-modules-sale
 Architecture: all
commit 6446f04a82591bd9a97d5c3a5ec57e6b11545acb
Author: Mathias Behrle <mathiasb at m9s.biz>
Date:   Tue Nov 1 15:19:31 2011 +0100

    Updating versioned tryton depends to 2.2.

diff --git a/debian/control b/debian/control
index 64d6b7f..929a5f1 100644
--- a/debian/control
+++ b/debian/control
@@ -14,11 +14,11 @@ X-Python-Version: >= 2.5
 Package: tryton-modules-sale
 Architecture: all
 Depends:
- ${misc:Depends}, ${python:Depends}, tryton-server (>= 2.0),
- tryton-modules-account (>= 2.0), tryton-modules-account-invoice (>= 2.0),
- tryton-modules-account-product (>= 2.0), tryton-modules-company (>= 2.0),
- tryton-modules-currency (>= 2.0), tryton-modules-party (>= 2.0),
- tryton-modules-product (>= 2.0), tryton-modules-stock (>= 2.0),
+ ${misc:Depends}, ${python:Depends}, tryton-server (>= 2.2),
+ tryton-modules-account (>= 2.2), tryton-modules-account-invoice (>= 2.2),
+ tryton-modules-account-product (>= 2.2), tryton-modules-company (>= 2.2),
+ tryton-modules-currency (>= 2.2), tryton-modules-party (>= 2.2),
+ tryton-modules-product (>= 2.2), tryton-modules-stock (>= 2.2),
  python-pkg-resources
 Description: Tryton Application Platform (Sale Module)
  Tryton is a high-level general purpose application platform written in Python
commit f2668ae1a7957ad80466a01b06b814cde6faa1ad
Author: Mathias Behrle <mathiasb at m9s.biz>
Date:   Mon Oct 31 16:21:21 2011 +0100

    Merging upstream version 2.2.0.

diff --git a/CHANGELOG b/CHANGELOG
index afdc791..f16348b 100644
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -1,5 +1,8 @@
-Version 2.0.1 - 2011-05-29
+Version 2.2.0 - 2011-10-25
 * Bug fixes (see mercurial logs for details)
+* Add delivery time on product
+* Use compute delivery date for stock moves
+* Group stock moves on shipment using a key
 
 Version 2.0.0 - 2011-04-27
 * Bug fixes (see mercurial logs for details)
diff --git a/MANIFEST.in b/MANIFEST.in
index dcb2afa..32879df 100644
--- a/MANIFEST.in
+++ b/MANIFEST.in
@@ -6,5 +6,5 @@ include CHANGELOG
 include LICENSE
 include *.xml
 include *.odt
-include *.csv
+include locale/*.po
 include doc/*
diff --git a/PKG-INFO b/PKG-INFO
index be9d0d8..8a443a7 100644
--- a/PKG-INFO
+++ b/PKG-INFO
@@ -1,6 +1,6 @@
 Metadata-Version: 1.0
 Name: trytond_sale
-Version: 2.0.1
+Version: 2.2.0
 Summary: Define sale order.
 Add to product sale informations.
 Define the sale price as the list price.
@@ -20,23 +20,25 @@ Home-page: http://www.tryton.org/
 Author: B2CK
 Author-email: info at b2ck.com
 License: GPL-3
-Download-URL: http://downloads.tryton.org/2.0/
+Download-URL: http://downloads.tryton.org/2.2/
 Description: UNKNOWN
 Platform: UNKNOWN
 Classifier: Development Status :: 5 - Production/Stable
 Classifier: Environment :: Plugins
+Classifier: Framework :: Tryton
 Classifier: Intended Audience :: Developers
 Classifier: Intended Audience :: Financial and Insurance Industry
 Classifier: Intended Audience :: Legal Industry
 Classifier: License :: OSI Approved :: GNU General Public License (GPL)
 Classifier: Natural Language :: Bulgarian
+Classifier: Natural Language :: Czech
 Classifier: Natural Language :: Dutch
 Classifier: Natural Language :: English
 Classifier: Natural Language :: French
 Classifier: Natural Language :: German
+Classifier: Natural Language :: Russian
 Classifier: Natural Language :: Spanish
 Classifier: Operating System :: OS Independent
-Classifier: Programming Language :: Python :: 2.5
 Classifier: Programming Language :: Python :: 2.6
 Classifier: Programming Language :: Python :: 2.7
 Classifier: Topic :: Office/Business
diff --git a/__tryton__.py b/__tryton__.py
index af032a1..c94a1be 100644
--- a/__tryton__.py
+++ b/__tryton__.py
@@ -8,7 +8,7 @@
     'name_es_ES': 'Venta',
     'name_fr_FR': 'Vente',
     'name_nl_NL': 'Verkoop',
-    'version': '2.0.1',
+    'version': '2.2.0',
     'author': 'B2CK',
     'email': 'info at b2ck.com',
     'website': 'http://www.tryton.org/',
@@ -135,11 +135,14 @@ Biedt mogelijkheden tot:
         'party.xml',
     ],
     'translation': [
-        'bg_BG.csv',
-        'de_DE.csv',
-        'es_CO.csv',
-        'es_ES.csv',
-        'fr_FR.csv',
-        'nl_NL.csv',
+        'locale/bg_BG.po',
+        'locale/cs_CZ.po',
+        'locale/de_DE.po',
+        'locale/es_CO.po',
+        'locale/es_ES.po',
+        'locale/fr_FR.po',
+        'locale/nl_NL.po',
+        'locale/fr_FR.po',
+        'locale/ru_RU.po',
     ],
 }
diff --git a/bg_BG.csv b/bg_BG.csv
deleted file mode 100644
index bc46695..0000000
--- a/bg_BG.csv
+++ /dev/null
@@ -1,245 +0,0 @@
-type,name,res_id,src,value,fuzzy
-error,account.invoice,0,You can not delete invoices that come from a sale!,Не може да изтриете фактура която идва от продажба!,0
-error,account.invoice,0,You cannot reset to draft an invoice generated by a sale.,Не може да прехвърляте в проект фактура генерирана при продажба.,0
-error,sale.line,0,"It misses an ""Account Revenue"" on product ""%s""!","Не е зададена ""Сметка за приходи"" за продукт ""%s""!",0
-error,sale.line,0,"It misses an ""account Revenue"" default property!","Няма е зададено свойство по подразбиране ""Сметка за приходи""!",0
-error,sale.line,0,The customer location is required!,Местонахождението на клиента е задължително!,0
-error,sale.sale,0,Invoice and Shipment addresses must be defined for the quotation.,Адрес за фактура и за доставка трябва да са зададени при запитване,0
-error,sale.sale,0,"It misses an ""Account Receivable"" on the party ""%s""!","Липсва ""Приходна сметка"" за партньор ""%s""!",0
-error,sale.sale,0,Wrong combination of method!,Грешна комбинация от методи!,0
-error,stock.shipment.out,0,You cannot reset to draft a move generated by a sale.,Не може да прехвърляте в проект движение генерирано при продажба.,0
-field,"account.invoice,sale_exception_state",0,Exception State,Състояние на грешка,0
-field,"account.invoice,sales",0,Sales,Продажби,0
-field,"account.invoice.line,sale_lines",0,Sale Lines,Редове от продажба,0
-field,"product.template,salable",0,Salable,Продажен,0
-field,"product.template,sale_uom",0,Sale UOM,Мер. ед. на продажба,0
-field,"sale.configuration,rec_name",0,Name,Име,0
-field,"sale.configuration,sale_invoice_method",0,Sale Invoice Method,Начин на фактурине на продажба,0
-field,"sale.configuration,sale_sequence",0,Sale Reference Sequence,Последователност за отпратка на продажба,0
-field,"sale.configuration,sale_shipment_method",0,Sale Shipment Method,Начин на фактуриране на продажба,0
-field,"sale.handle.invoice.exception.ask,domain_invoices",0,Domain Invoices,Фактури на домейн,0
-field,"sale.handle.invoice.exception.ask,recreate_invoices",0,Recreate Invoices,Наново създаване на фактури,0
-field,"sale.handle.shipment.exception.ask,domain_moves",0,Domain Moves,Движение на домейн,0
-field,"sale.handle.shipment.exception.ask,recreate_moves",0,Recreate Moves,Наново създаване на движения,0
-field,"sale.line,amount",0,Amount,Сума,0
-field,"sale.line,description",0,Description,Описание,0
-field,"sale.line,invoice_lines",0,Invoice Lines,Редове от фактура,0
-field,"sale.line,move_done",0,Moves Done,Направени движения,0
-field,"sale.line,move_exception",0,Moves Exception,Грешка при движение,0
-field,"sale.line,moves",0,Moves,Движения,0
-field,"sale.line,moves_ignored",0,Ignored Moves,Игнорирани движения,0
-field,"sale.line,moves_recreated",0,Recreated Moves,Наново създаване на движения,0
-field,"sale.line,note",0,Note,Бележка,0
-field,"sale.line,product",0,Product,Продукт,0
-field,"sale.line,quantity",0,Quantity,Количество,0
-field,"sale.line,rec_name",0,Name,Име,0
-field,"sale.line,sale",0,Sale,Продажба,0
-field,"sale.line,sequence",0,Sequence,Последователност,0
-field,"sale.line,taxes",0,Taxes,Данъци,0
-field,"sale.line,type",0,Type,Вид,0
-field,"sale.line,unit",0,Unit,Единица,0
-field,"sale.line,unit_digits",0,Unit Digits,Десетични единици,0
-field,"sale.line,unit_price",0,Unit Price,Единична цена,0
-field,"sale.line-account.invoice.line,invoice_line",0,Invoice Line,Ред от фактура,0
-field,"sale.line-account.invoice.line,rec_name",0,Name,Име,0
-field,"sale.line-account.invoice.line,sale_line",0,Sale Line,Ред от продажба,0
-field,"sale.line-account.tax,line",0,Sale Line,Ред от продажба,0
-field,"sale.line-account.tax,rec_name",0,Name,Име,0
-field,"sale.line-account.tax,tax",0,Tax,Данък,0
-field,"sale.line-ignored-stock.move,move",0,Move,Движение,0
-field,"sale.line-ignored-stock.move,rec_name",0,Name,Име,0
-field,"sale.line-ignored-stock.move,sale_line",0,Sale Line,Ред от продажба,0
-field,"sale.line-recreated-stock.move,move",0,Move,Движение,0
-field,"sale.line-recreated-stock.move,rec_name",0,Name,Име,0
-field,"sale.line-recreated-stock.move,sale_line",0,Sale Line,Ред от продажба,0
-field,"sale.sale,comment",0,Comment,Коментар,0
-field,"sale.sale,company",0,Company,Фирма,0
-field,"sale.sale,currency",0,Currency,Валута,0
-field,"sale.sale,currency_digits",0,Currency Digits,Цифри за валута,0
-field,"sale.sale,description",0,Description,Описание,0
-field,"sale.sale,invoice_address",0,Invoice Address,Адрес за фактура,0
-field,"sale.sale,invoice_exception",0,Invoices Exception,Грешка при фактури,0
-field,"sale.sale,invoice_method",0,Invoice Method,Начин на фактуриране,0
-field,"sale.sale,invoice_paid",0,Invoices Paid,Платени фактури,0
-field,"sale.sale,invoice_state",0,Invoice State,Състояние на фактура,0
-field,"sale.sale,invoices",0,Invoices,Фактури,0
-field,"sale.sale,invoices_ignored",0,Ignored Invoices,Игнорирани фактури,0
-field,"sale.sale,invoices_recreated",0,Recreated Invoices,Наново създадени на фактури,0
-field,"sale.sale,lines",0,Lines,Редове,0
-field,"sale.sale,moves",0,Moves,Движения,0
-field,"sale.sale,party",0,Party,Партньор,0
-field,"sale.sale,party_lang",0,Party Language,Език на партньор,0
-field,"sale.sale,payment_term",0,Payment Term,Условие за плащане,0
-field,"sale.sale,rec_name",0,Name,Име,0
-field,"sale.sale,reference",0,Reference,Отпратка,0
-field,"sale.sale,sale_date",0,Sale Date,Дата на продажба,0
-field,"sale.sale,shipment_address",0,Shipment Address,Адрес за доставка,0
-field,"sale.sale,shipment_done",0,Shipment Done,Направена пратка,0
-field,"sale.sale,shipment_exception",0,Shipments Exception,Грешки при пратка,0
-field,"sale.sale,shipment_method",0,Shipment Method,Начин на изпращане,0
-field,"sale.sale,shipment_state",0,Shipment State,Състояние на пратка,0
-field,"sale.sale,shipments",0,Shipments,Изпращания,0
-field,"sale.sale,state",0,State,Състояние,0
-field,"sale.sale,tax_amount",0,Tax,Данък,0
-field,"sale.sale,total_amount",0,Total,Общо,0
-field,"sale.sale,untaxed_amount",0,Untaxed,Необложен с данък,0
-field,"sale.sale,warehouse",0,Warehouse,Склад,0
-field,"sale.sale-account.invoice,invoice",0,Invoice,Фактура,0
-field,"sale.sale-account.invoice,rec_name",0,Name,Име,0
-field,"sale.sale-account.invoice,sale",0,Sale,Продажба,0
-field,"sale.sale-ignored-account.invoice,invoice",0,Invoice,Фактура,0
-field,"sale.sale-ignored-account.invoice,rec_name",0,Name,Име,0
-field,"sale.sale-ignored-account.invoice,sale",0,Sale,Продажба,0
-field,"sale.sale-recreated-account.invoice,invoice",0,Invoice,Фактура,0
-field,"sale.sale-recreated-account.invoice,rec_name",0,Name,Име,0
-field,"sale.sale-recreated-account.invoice,sale",0,Sale,Продажба,0
-field,"stock.move,sale",0,Sale,Продажба,0
-field,"stock.move,sale_exception_state",0,Exception State,Състояние на грешка,0
-field,"stock.move,sale_line",0,Sale Line,Ред от продажба,0
-help,"sale.handle.invoice.exception.ask,recreate_invoices",0,The selected invoices will be recreated. The other ones will be ignored.,Избраните фактури ще бъдат наново създадени. Останалите ще бъдат игнорирани.,0
-model,"ir.action,name",act_invoice_form,Invoices,Фактури,0
-model,"ir.action,name",act_open_customer,Parties associated to Sales,Партньори свързани с продажби,0
-model,"ir.action,name",act_sale_configuration_form,Sale Configuration,Конфигурация на продажба,0
-model,"ir.action,name",act_sale_form,Sales,Продажби,0
-model,"ir.action,name",act_sale_form2,Sales,Продажби,0
-model,"ir.action,name",act_sale_form_confirmed,Confirmed Sales,Потвърдени продажби,0
-model,"ir.action,name",act_sale_form_draft,Draft Sales,Проект на продажби,0
-model,"ir.action,name",act_sale_form_new,New Sale,Нова продажба,0
-model,"ir.action,name",act_sale_form_quotation,Quotation Sales,Продажби (запитвания) ,0
-model,"ir.action,name",act_shipment_form,Shipments,Изпращания,0
-model,"ir.action,name",report_sale,Sale,Продажба,0
-model,"ir.action,name",wizard_invoice_handle_exception,Handle Invoice Exception,Обработка на грешка към фактура,0
-model,"ir.action,name",wizard_shipment_handle_exception,Handle Shipment Exception,Обработка на грешки при изпращане,0
-model,"ir.sequence,name",sequence_sale,Sale,Продажба,0
-model,"ir.sequence.type,name",sequence_type_sale,Sale,Продажба,0
-model,"ir.ui.menu,name",menu_configuration,Configuration,Конфигурация,0
-model,"ir.ui.menu,name",menu_customer,Parties associated to Sales,Партньори свързани с продажби,0
-model,"ir.ui.menu,name",menu_sale,Sale Management,Управление на продажби,0
-model,"ir.ui.menu,name",menu_sale_configuration,Sale Configuration,Конфигурация на продажба,0
-model,"ir.ui.menu,name",menu_sale_form,Sales,Продажби,0
-model,"ir.ui.menu,name",menu_sale_form_confirmed,Confirmed Sales,Потвърдени продажби,0
-model,"ir.ui.menu,name",menu_sale_form_draft,Draft Sales,Проект на продажби,0
-model,"ir.ui.menu,name",menu_sale_form_new,New Sale,Нова продажба,0
-model,"ir.ui.menu,name",menu_sale_form_quotation,Quotation Sales,Продажби (запитвания) ,0
-model,"res.group,name",group_sale,Sale,Продажба,0
-model,"res.group,name",group_sale_admin,Sale Administrator,Отговорник продажби,0
-model,"sale.configuration,name",0,Sale Configuration,Конфигурация на продажба,0
-model,"sale.handle.invoice.exception.ask,name",0,Invoice Exception Ask,Запитване за грешка в фактура,0
-model,"sale.handle.shipment.exception.ask,name",0,Shipment Exception Ask,Запитване за грешка при пратка,0
-model,"sale.line,name",0,Sale Line,Ред от продажба,0
-model,"sale.line-account.invoice.line,name",0,Sale Line - Invoice Line,Ред от продажба - Ред от фактура,0
-model,"sale.line-account.tax,name",0,Sale Line - Tax,Ред от продажба - Данък,0
-model,"sale.line-ignored-stock.move,name",0,Sale Line - Ignored Move,Ред от продажба - Игнорирано движение,0
-model,"sale.line-recreated-stock.move,name",0,Sale Line - Recreated Move,Ред от продажба - Нановосъздадено движение,0
-model,"sale.sale,name",0,Sale,Продажба,0
-model,"sale.sale-account.invoice,name",0,Sale - Invoice,Продажба - фактура,0
-model,"sale.sale-ignored-account.invoice,name",0,Sale - Ignored Invoice,Продажба - Игнорирани фактури,0
-model,"sale.sale-recreated-account.invoice,name",0,Sale - Recreated Invoice,Продажба - Наново създадена фактура,0
-model,"workflow,name",sale_workflow,Sale workflow,Работен процес на продажба,0
-model,"workflow.activity,name",sale_activity_cancel,Canceled,Отказан,0
-model,"workflow.activity,name",sale_activity_confirmed,Confirmed,Потвърден,0
-model,"workflow.activity,name",sale_activity_done,Done,Приключен,0
-model,"workflow.activity,name",sale_activity_draft,Draft,Проект,0
-model,"workflow.activity,name",sale_activity_invoice_method,Invoice Method,Начин на фактуриране,0
-model,"workflow.activity,name",sale_activity_invoice_method_done,Invoice Method Done,Направен начин на фактуриране,0
-model,"workflow.activity,name",sale_activity_invoice_sale_done,Invoice Done,Направени фактури,0
-model,"workflow.activity,name",sale_activity_invoice_sale_exception,Invoice Exception,Грешка при фактура,0
-model,"workflow.activity,name",sale_activity_invoice_shipment,Invoice Shipment,Фактура за изпращане,0
-model,"workflow.activity,name",sale_activity_invoice_shipment_done,Invoice Shipment Done,Направено фактуриране на пратка,0
-model,"workflow.activity,name",sale_activity_invoice_shipment_exception,Invoice Shipment Exception,Грешка при фактуриране на пратка,0
-model,"workflow.activity,name",sale_activity_invoice_shipment_method,Invoice Shipment Method,Начин на фактуриране на пратка,0
-model,"workflow.activity,name",sale_activity_invoice_shipment_method_done,Invoice Shipment Method Done,Направено фактуриране на начина на изпращане,0
-model,"workflow.activity,name",sale_activity_quotation,Quotation,Запитване,0
-model,"workflow.activity,name",sale_activity_shipment,Shipment,Пратка,0
-model,"workflow.activity,name",sale_activity_shipment_exception,Shipment Exception,Грешка при пратка,0
-model,"workflow.activity,name",sale_activity_shipment_invoice,Shipment Invoice,Пратка с грешка,0
-model,"workflow.activity,name",sale_activity_shipment_invoice_done,Shipment Invoice Done,Направено фактуриране на пратка,0
-model,"workflow.activity,name",sale_activity_shipment_invoice_exception,Shipment Invoice Exception,Грешка при фактуриране на пратка,0
-model,"workflow.activity,name",sale_activity_shipment_invoice_method,Shipment Invoice Method,Начин на фактуриране на пратка,0
-model,"workflow.activity,name",sale_activity_shipment_invoice_method_done,Shipment Invoice Method Done,Направен начин на фактуриране на пратка,0
-model,"workflow.activity,name",sale_activity_shipment_method,Shipment Method,Начин на изпращане,0
-model,"workflow.activity,name",sale_activity_shipment_method_done,Shipment Method Done,Направен начин на изпращане,0
-model,"workflow.activity,name",sale_activity_waiting_invoice_sale,Waiting Invoice,Очакващи фактура,0
-model,"workflow.activity,name",sale_activity_waiting_invoice_shipment,Waiting Invoice Shipment,Изчакващи фактури за пратки,0
-model,"workflow.activity,name",sale_activity_waiting_shipment,Waiting Shipment,Очаква изпращане,0
-model,"workflow.activity,name",sale_activity_waiting_shipment_invoice,Waiting Shipment Invoice,Изчакващи фактури за пратки,0
-odt,sale.sale,0,Amount,Сума,0
-odt,sale.sale,0,Date:,Дата:,0
-odt,sale.sale,0,Description,Описание,0
-odt,sale.sale,0,Description:,Описание:,0
-odt,sale.sale,0,Draft Sale Order,Проект на поръчка за продажба,0
-odt,sale.sale,0,E-Mail:,E-Mail:,0
-odt,sale.sale,0,Phone:,Телефон:,0
-odt,sale.sale,0,Quantity,Количество,0
-odt,sale.sale,0,Quotation N°:,Запитване N°:,0
-odt,sale.sale,0,Sale Order N°:,Поръчка за продажба N°:,0
-odt,sale.sale,0,Taxes,Данъци,0
-odt,sale.sale,0,Taxes:,Данъци:,0
-odt,sale.sale,0,Total (excl. taxes):,Общо (без данъци):,0
-odt,sale.sale,0,Total:,Общо:,0
-odt,sale.sale,0,Unit Price,Единична цена,0
-odt,sale.sale,0,VAT:,ДДС:,0
-selection,"account.invoice,sale_exception_state",0,,,0
-selection,"account.invoice,sale_exception_state",0,Ignored,Игнорирано,0
-selection,"account.invoice,sale_exception_state",0,Recreated,Създаден наново,0
-selection,"sale.configuration,sale_invoice_method",0,Manual,Ръчно,0
-selection,"sale.configuration,sale_invoice_method",0,On Order Confirmed,При потвърждаване на поръчка,0
-selection,"sale.configuration,sale_invoice_method",0,On Shipment Sent,При изпращане на пратка,0
-selection,"sale.configuration,sale_shipment_method",0,Manual,Ръчно,0
-selection,"sale.configuration,sale_shipment_method",0,On Invoice Paid,При плащане на фактура,0
-selection,"sale.configuration,sale_shipment_method",0,On Order Confirmed,При потвърждаване на поръчка,0
-selection,"sale.line,type",0,Comment,Коментар,0
-selection,"sale.line,type",0,Line,Ред,0
-selection,"sale.line,type",0,Subtotal,Междинна сума,0
-selection,"sale.line,type",0,Title,Заглавие,0
-selection,"sale.sale,invoice_method",0,Manual,Ръчно,0
-selection,"sale.sale,invoice_method",0,On Order Confirmed,При потвърждаване на поръчка,0
-selection,"sale.sale,invoice_method",0,On Shipment Sent,При изпращане на пратка,0
-selection,"sale.sale,invoice_state",0,Exception,Грешка,0
-selection,"sale.sale,invoice_state",0,None,Няма,0
-selection,"sale.sale,invoice_state",0,Paid,Платен,0
-selection,"sale.sale,invoice_state",0,Waiting,Изчакващ,0
-selection,"sale.sale,shipment_method",0,Manual,Ръчно,0
-selection,"sale.sale,shipment_method",0,On Invoice Paid,При плащане на фактура,0
-selection,"sale.sale,shipment_method",0,On Order Confirmed,При потвърждаване на поръчка,0
-selection,"sale.sale,shipment_state",0,Exception,Грешка,0
-selection,"sale.sale,shipment_state",0,None,Няма,0
-selection,"sale.sale,shipment_state",0,Sent,Изпратен,0
-selection,"sale.sale,shipment_state",0,Waiting,Изчакващ,0
-selection,"sale.sale,state",0,Canceled,Отказан,0
-selection,"sale.sale,state",0,Confirmed,Потвърден,0
-selection,"sale.sale,state",0,Done,Приключен,0
-selection,"sale.sale,state",0,Draft,Проект,0
-selection,"sale.sale,state",0,Quotation,Запитване,0
-selection,"stock.move,sale_exception_state",0,,,0
-selection,"stock.move,sale_exception_state",0,Ignored,Игнорирано,0
-selection,"stock.move,sale_exception_state",0,Recreated,Създаден наново,0
-view,product.template,0,Customers,Клиенти,0
-view,sale.configuration,0,Sale Configuration,Конфигурация на продажба,0
-view,sale.handle.invoice.exception.ask,0,Choose invoices to recreate,Избор на фактури за ново създаване,0
-view,sale.handle.invoice.exception.ask,0,Handle Invoice Exception,Обработка на грешка към фактура,0
-view,sale.handle.shipment.exception.ask,0,Choose move to recreate,Избор на движение за ново създаване,0
-view,sale.handle.shipment.exception.ask,0,Handle shipment Exception,Обработване на грешка при изпращане,0
-view,sale.handle.shipment.exception.ask,0,Recreate Moves,Наново създаване на движения,0
-view,sale.line,0,General,Основен,0
-view,sale.line,0,Notes,Бележки,0
-view,sale.line,0,Products,Продукти,0
-view,sale.line,0,Sale Line,Ред от продажба,0
-view,sale.line,0,Sale Lines,Редове от продажба,0
-view,sale.sale,0,Cancel,Отказ,0
-view,sale.sale,0,Confirm,Потвърждаване,0
-view,sale.sale,0,Draft,Проект,0
-view,sale.sale,0,Handle Invoice Exception,Обработка на грешка към фактура,0
-view,sale.sale,0,Handle Shipment Exception,Обработване на грешка при изпращане,0
-view,sale.sale,0,Invoices,Фактури,0
-view,sale.sale,0,Lines,Редове,0
-view,sale.sale,0,Moves,Движения,0
-view,sale.sale,0,Other Info,Друга информация,0
-view,sale.sale,0,Quotation,Запитване,0
-view,sale.sale,0,Sale,Продажба,0
-view,sale.sale,0,Sales,Продажби,0
-view,sale.sale,0,Shipments,Изпращания,0
-wizard_button,"sale.handle.invoice.exception,init,end",0,Cancel,Отказ,0
-wizard_button,"sale.handle.invoice.exception,init,ok",0,Ok,Добре,0
-wizard_button,"sale.handle.shipment.exception,init,end",0,Cancel,Отказ,0
-wizard_button,"sale.handle.shipment.exception,init,ok",0,Ok,Добре,0
diff --git a/configuration.py b/configuration.py
index c1dadce..5b246bc 100644
--- a/configuration.py
+++ b/configuration.py
@@ -10,23 +10,24 @@ class Configuration(ModelSingleton, ModelSQL, ModelView):
     _description = __doc__
 
     sale_sequence = fields.Property(fields.Many2One('ir.sequence',
-        'Sale Reference Sequence', domain=[
-            ('company', 'in', [Eval('company'), False]),
-            ('code', '=', 'sale.sale'),
-        ], required=True))
+            'Sale Reference Sequence', domain=[
+                ('company', 'in', [Eval('context', {}).get('company', 0),
+                        False]),
+                ('code', '=', 'sale.sale'),
+                ], required=True))
     sale_invoice_method = fields.Property(fields.Selection([
-        ('manual', 'Manual'),
-        ('order', 'On Order Confirmed'),
-        ('shipment', 'On Shipment Sent')
-    ], 'Sale Invoice Method', states={
-        'required': Bool(Eval('company')),
-    }))
+                ('manual', 'Manual'),
+                ('order', 'On Order Confirmed'),
+                ('shipment', 'On Shipment Sent')
+                ], 'Sale Invoice Method', states={
+                'required': Bool(Eval('context', {}).get('company', 0)),
+                }))
     sale_shipment_method = fields.Property(fields.Selection([
-        ('manual', 'Manual'),
-        ('order', 'On Order Confirmed'),
-        ('invoice', 'On Invoice Paid'),
-    ], 'Sale Shipment Method', states={
-        'required': Bool(Eval('company')),
-    }))
+                ('manual', 'Manual'),
+                ('order', 'On Order Confirmed'),
+                ('invoice', 'On Invoice Paid'),
+                ], 'Sale Shipment Method', states={
+                'required': Bool(Eval('context', {}).get('company', 0)),
+                }))
 
 Configuration()
diff --git a/configuration.xml b/configuration.xml
index 964c74b..98eab75 100644
--- a/configuration.xml
+++ b/configuration.xml
@@ -4,8 +4,12 @@ this repository contains the full copyright notices and license terms. -->
 <tryton>
     <data>
         <menuitem name="Configuration" parent="menu_sale"
-            id="menu_configuration" groups="group_sale_admin"
-            sequence="0" icon="tryton-preferences"/>
+            id="menu_configuration" sequence="0" icon="tryton-preferences"/>
+        <record model="ir.ui.menu-res.group"
+            id="menu_configuration_group_sale_admin">
+            <field name="menu" ref="menu_configuration"/>
+            <field name="group" ref="group_sale_admin"/>
+        </record>
 
         <record model="ir.ui.view" id="sale_configuration_view_form">
             <field name="model">sale.configuration</field>
@@ -25,7 +29,7 @@ this repository contains the full copyright notices and license terms. -->
             </field>
         </record>
         <record model="ir.action.act_window" id="act_sale_configuration_form">
-            <field name="name">Sale Configuration</field>
+            <field name="name">Sales Configuration</field>
             <field name="res_model">sale.configuration</field>
         </record>
         <record model="ir.action.act_window.view"
diff --git a/de_DE.csv b/de_DE.csv
deleted file mode 100644
index b5c4c73..0000000
--- a/de_DE.csv
+++ /dev/null
@@ -1,251 +0,0 @@
-type,name,res_id,src,value,fuzzy
-error,account.invoice,0,You can not delete invoices that come from a sale!,Durch einen Verkauf generierte Rechnungen können nicht gelöscht werden!,0
-error,account.invoice,0,You cannot reset to draft an invoice generated by a sale.,Eine durch einen Verkauf generierte Rechnung kann nicht auf Entwurf zurückgesetzt werden.,0
-error,sale.line,0,"It misses an ""Account Revenue"" on product ""%s""!","Es ist kein Ertragskonto für Artikel ""%s"" definiert!",0
-error,sale.line,0,"It misses an ""account Revenue"" default property!",Es ist keine Standardeigenschaft für das Ertragskonto definiert!,0
-error,sale.line,0,The customer location is required!,Der Lagerort des Kunden muss eingegeben werden!,0
-error,sale.sale,0,Invoice and Shipment addresses must be defined for the quotation.,Rechnungs- und Lieferadresse müssen für das Angebot eingetragen sein!,0
-error,sale.sale,0,"It misses an ""Account Receivable"" on the party ""%s""!","Es ist kein Forderungskonto für Partei ""%s"" definiert!",0
-error,sale.sale,0,Wrong combination of method!,Ungültige Kombination von Methoden!,0
-error,stock.shipment.out,0,You cannot reset to draft a move generated by a sale.,Eine durch einen Verkauf generierte Bewegung kann nicht auf Entwurf zurückgesetzt werden.,0
-field,"account.invoice,sale_exception_state",0,Exception State,Vorbehalt Status,0
-field,"account.invoice,sales",0,Sales,Verkäufe,0
-field,"account.invoice.line,sale_lines",0,Sale Lines,Positionen Verkauf,0
-field,"product.template,salable",0,Salable,Verkäuflich,0
-field,"product.template,sale_uom",0,Sale UOM,Einheit Verkauf,0
-field,"sale.configuration,rec_name",0,Name,Name,0
-field,"sale.configuration,sale_invoice_method",0,Sale Invoice Method,Rechnungsstellung Verkauf,0
-field,"sale.configuration,sale_sequence",0,Sale Reference Sequence,Nummernkreis Verkauf,0
-field,"sale.configuration,sale_shipment_method",0,Sale Shipment Method,Liefermethode Verkauf,0
-field,"sale.handle.invoice.exception.ask,domain_invoices",0,Domain Invoices,Wertebereich Rechnungen (Domain),0
-field,"sale.handle.invoice.exception.ask,recreate_invoices",0,Recreate Invoices,Rechnungen nachbilden,0
-field,"sale.handle.shipment.exception.ask,domain_moves",0,Domain Moves,Wertebereich Bewegungen (Domain),0
-field,"sale.handle.shipment.exception.ask,recreate_moves",0,Recreate Moves,Bewegungen nachbilden,0
-field,"sale.line,amount",0,Amount,Betrag,0
-field,"sale.line,description",0,Description,Bezeichnung,0
-field,"sale.line,invoice_lines",0,Invoice Lines,Rechnungspositionen,0
-field,"sale.line,move_done",0,Moves Done,Bewegungen erledigt,0
-field,"sale.line,move_exception",0,Moves Exception,Bewegungsvorbehalt,0
-field,"sale.line,moves",0,Moves,Bewegungen,0
-field,"sale.line,moves_ignored",0,Ignored Moves,Ignorierte Bewegungen,0
-field,"sale.line,moves_recreated",0,Recreated Moves,Nachgebildete Bewegungen,0
-field,"sale.line,note",0,Note,Notiz,0
-field,"sale.line,product",0,Product,Artikel,0
-field,"sale.line,quantity",0,Quantity,Anzahl,0
-field,"sale.line,rec_name",0,Name,Name,0
-field,"sale.line,sale",0,Sale,Verkauf,0
-field,"sale.line,sequence",0,Sequence,Reihenfolge,0
-field,"sale.line,taxes",0,Taxes,Steuern,0
-field,"sale.line,type",0,Type,Typ,0
-field,"sale.line,unit",0,Unit,Einheit,0
-field,"sale.line,unit_digits",0,Unit Digits,Anzahl Stellen,0
-field,"sale.line,unit_price",0,Unit Price,Einzelpreis,0
-field,"sale.line-account.invoice.line,invoice_line",0,Invoice Line,Rechnungsposition,0
-field,"sale.line-account.invoice.line,rec_name",0,Name,Name,0
-field,"sale.line-account.invoice.line,sale_line",0,Sale Line,Position Verkauf,0
-field,"sale.line-account.tax,line",0,Sale Line,Position Verkauf,0
-field,"sale.line-account.tax,rec_name",0,Name,Name,0
-field,"sale.line-account.tax,tax",0,Tax,Steuer,0
-field,"sale.line-ignored-stock.move,move",0,Move,Bewegung,0
-field,"sale.line-ignored-stock.move,rec_name",0,Name,Name,0
-field,"sale.line-ignored-stock.move,sale_line",0,Sale Line,Position Verkauf,0
-field,"sale.line-recreated-stock.move,move",0,Move,Bewegung,0
-field,"sale.line-recreated-stock.move,rec_name",0,Name,Name,0
-field,"sale.line-recreated-stock.move,sale_line",0,Sale Line,Position Verkauf,0
-field,"sale.sale,comment",0,Comment,Kommentar,0
-field,"sale.sale,company",0,Company,Unternehmen,0
-field,"sale.sale,currency",0,Currency,Währung,0
-field,"sale.sale,currency_digits",0,Currency Digits,Währung (signifikante Stellen),0
-field,"sale.sale,description",0,Description,Beschreibung,0
-field,"sale.sale,invoice_address",0,Invoice Address,Rechnungsadresse,0
-field,"sale.sale,invoice_exception",0,Invoices Exception,Rechnungsvorbehalt,0
-field,"sale.sale,invoice_method",0,Invoice Method,Rechnungsstellung,0
-field,"sale.sale,invoice_paid",0,Invoices Paid,Bezahlte Rechnungen,0
-field,"sale.sale,invoice_state",0,Invoice State,Rechnungsstatus,0
-field,"sale.sale,invoices",0,Invoices,Rechnungen,0
-field,"sale.sale,invoices_ignored",0,Ignored Invoices,Ignorierte Rechnungen,0
-field,"sale.sale,invoices_recreated",0,Recreated Invoices,Nachgebildete Rechnungen,0
-field,"sale.sale,lines",0,Lines,Positionen,0
-field,"sale.sale,moves",0,Moves,Bewegungen,0
-field,"sale.sale,party",0,Party,Partei,0
-field,"sale.sale,party_lang",0,Party Language,Sprache Partei,0
-field,"sale.sale,payment_term",0,Payment Term,Zahlungsbedingung,0
-field,"sale.sale,rec_name",0,Name,Name,0
-field,"sale.sale,reference",0,Reference,Beleg-Nr.,0
-field,"sale.sale,sale_date",0,Sale Date,Verkaufsdatum,0
-field,"sale.sale,shipment_address",0,Shipment Address,Lieferadresse,0
-field,"sale.sale,shipment_done",0,Shipment Done,Gepackt,0
-field,"sale.sale,shipment_exception",0,Shipments Exception,Lieferungsvorbehalt,0
-field,"sale.sale,shipment_method",0,Shipment Method,Liefermethode,0
-field,"sale.sale,shipment_state",0,Shipment State,Lieferstatus,0
-field,"sale.sale,shipments",0,Shipments,Lieferposten,0
-field,"sale.sale,state",0,State,Status,0
-field,"sale.sale,tax_amount",0,Tax,Steuer,0
-field,"sale.sale,total_amount",0,Total,Gesamt,0
-field,"sale.sale,untaxed_amount",0,Untaxed,Netto,0
-field,"sale.sale,warehouse",0,Warehouse,Warenlager,0
-field,"sale.sale-account.invoice,invoice",0,Invoice,Rechnung,0
-field,"sale.sale-account.invoice,rec_name",0,Name,Name,0
-field,"sale.sale-account.invoice,sale",0,Sale,Verkauf,0
-field,"sale.sale-ignored-account.invoice,invoice",0,Invoice,Rechnung,0
-field,"sale.sale-ignored-account.invoice,rec_name",0,Name,Name,0
-field,"sale.sale-ignored-account.invoice,sale",0,Sale,Verkauf,0
-field,"sale.sale-recreated-account.invoice,invoice",0,Invoice,Rechnung,0
-field,"sale.sale-recreated-account.invoice,rec_name",0,Name,Name,0
-field,"sale.sale-recreated-account.invoice,sale",0,Sale,Verkauf,0
-field,"stock.move,sale",0,Sale,Verkauf,0
-field,"stock.move,sale_exception_state",0,Exception State,Status Vorbehalt,0
-field,"stock.move,sale_line",0,Sale Line,Verkauf Position,0
-help,"sale.handle.invoice.exception.ask,recreate_invoices",0,The selected invoices will be recreated. The other ones will be ignored.,Die ausgewählten Rechnungen werden nachgebildet. Alle anderen werden ignoriert.,0
-model,"ir.action,name",act_invoice_form,Invoices,Rechnungsausgang,0
-model,"ir.action,name",act_open_customer,Parties associated to Sales,Parteien: Verkäufen zugeordnet,0
-model,"ir.action,name",act_sale_configuration_form,Sale Configuration,Einstellungen Verkauf,0
-model,"ir.action,name",act_sale_form,Sales,Verkäufe,0
-model,"ir.action,name",act_sale_form2,Sales,Verkäufe,0
-model,"ir.action,name",act_sale_form_confirmed,Confirmed Sales,Aufträge Verkäufe,0
-model,"ir.action,name",act_sale_form_draft,Draft Sales,Entwürfe Verkäufe,0
-model,"ir.action,name",act_sale_form_new,New Sale,Neuer Verkauf,0
-model,"ir.action,name",act_sale_form_quotation,Quotation Sales,Angebote Verkäufe,0
-model,"ir.action,name",act_shipment_form,Shipments,Lieferposten,0
-model,"ir.action,name",report_sale,Sale,Verkauf,0
-model,"ir.action,name",wizard_invoice_handle_exception,Handle Invoice Exception,Rechnungsvorbehalt bearbeiten,0
-model,"ir.action,name",wizard_shipment_handle_exception,Handle Shipment Exception,Liefervorbehalt bearbeiten,0
-model,"ir.sequence,name",sequence_sale,Sale,Verkauf,0
-model,"ir.sequence.type,name",sequence_type_sale,Sale,Verkauf,0
-model,"ir.ui.menu,name",menu_configuration,Configuration,Einstellungen,0
-model,"ir.ui.menu,name",menu_customer,Parties associated to Sales,Parteien: Verkäufen zugeordnet,0
-model,"ir.ui.menu,name",menu_sale,Sale Management,Verkauf,0
-model,"ir.ui.menu,name",menu_sale_configuration,Sale Configuration,Einstellungen Verkauf,0
-model,"ir.ui.menu,name",menu_sale_form,Sales,Verkäufe,0
-model,"ir.ui.menu,name",menu_sale_form_confirmed,Confirmed Sales,Aufträge (Verkäufe),0
-model,"ir.ui.menu,name",menu_sale_form_draft,Draft Sales,Entwürfe (Verkäufe),0
-model,"ir.ui.menu,name",menu_sale_form_new,New Sale,Neuer Verkauf,0
-model,"ir.ui.menu,name",menu_sale_form_quotation,Quotation Sales,Angebote (Verkäufe),0
-model,"res.group,name",group_sale,Sale,Verkauf,0
-model,"res.group,name",group_sale_admin,Sale Administrator,Verkauf Administration,0
-model,"sale.configuration,name",0,Sale Configuration,Einstellungen Verkauf,0
-model,"sale.handle.invoice.exception.ask,name",0,Invoice Exception Ask,Rechnungsvorbehalt Nachfrage,0
-model,"sale.handle.shipment.exception.ask,name",0,Shipment Exception Ask,Nachfrage Liefervorbehalt,0
-model,"sale.line,name",0,Sale Line,Verkauf Position,0
-model,"sale.line-account.invoice.line,name",0,Sale Line - Invoice Line,Verkauf Position - Rechnung Zeile,0
-model,"sale.line-account.tax,name",0,Sale Line - Tax,Verkauf Position - Steuer,0
-model,"sale.line-ignored-stock.move,name",0,Sale Line - Ignored Move,Verkauf Position - Bewegung Ignoriert,0
-model,"sale.line-recreated-stock.move,name",0,Sale Line - Recreated Move,Verkauf Position - Bewegung Nachgebildet,0
-model,"sale.sale,name",0,Sale,Verkauf,0
-model,"sale.sale-account.invoice,name",0,Sale - Invoice,Verkauf - Rechnung,0
-model,"sale.sale-ignored-account.invoice,name",0,Sale - Ignored Invoice,Verkauf - Rechnung Ignoriert,0
-model,"sale.sale-recreated-account.invoice,name",0,Sale - Recreated Invoice,Verkauf - Rechnung Nachgebildet,0
-model,"workflow,name",sale_workflow,Sale workflow,Workflow Verkauf,0
-model,"workflow.activity,name",sale_activity_cancel,Canceled,Annulliert,0
-model,"workflow.activity,name",sale_activity_confirmed,Confirmed,Beauftragt,0
-model,"workflow.activity,name",sale_activity_done,Done,Erledigt,0
-model,"workflow.activity,name",sale_activity_draft,Draft,Entwurf,0
-model,"workflow.activity,name",sale_activity_invoice_method,Invoice Method,Rechnungsstellung,0
-model,"workflow.activity,name",sale_activity_invoice_method_done,Invoice Method Done,Rechnungsstellung erledigt,0
-model,"workflow.activity,name",sale_activity_invoice_sale_done,Invoice Done,Rechnung erledigt,0
-model,"workflow.activity,name",sale_activity_invoice_sale_exception,Invoice Exception,Rechnungsvorbehalt,0
-model,"workflow.activity,name",sale_activity_invoice_shipment,Invoice Shipment,Rechnung Lieferposten,0
-model,"workflow.activity,name",sale_activity_invoice_shipment_done,Invoice Shipment Done,Rechnung Lieferposten erledigt,0
-model,"workflow.activity,name",sale_activity_invoice_shipment_exception,Invoice Shipment Exception,Rechnung Lieferposten Vorbehalt,0
-model,"workflow.activity,name",sale_activity_invoice_shipment_method,Invoice Shipment Method,Rechnung Liefermethode,0
-model,"workflow.activity,name",sale_activity_invoice_shipment_method_done,Invoice Shipment Method Done,Rechnung Liefermethode erledigt,0
-model,"workflow.activity,name",sale_activity_quotation,Quotation,Angebot,0
-model,"workflow.activity,name",sale_activity_shipment,Shipment,Lieferposten,0
-model,"workflow.activity,name",sale_activity_shipment_exception,Shipment Exception,Lieferposten Vorbehalt,0
-model,"workflow.activity,name",sale_activity_shipment_invoice,Shipment Invoice,Lieferposten Rechnung,0
-model,"workflow.activity,name",sale_activity_shipment_invoice_done,Shipment Invoice Done,Lieferposten Rechnung erledigt,0
-model,"workflow.activity,name",sale_activity_shipment_invoice_exception,Shipment Invoice Exception,Lieferposten Rechnung Vorbehalt,0
-model,"workflow.activity,name",sale_activity_shipment_invoice_method,Shipment Invoice Method,Lieferposten Rechnungsmethode,0
-model,"workflow.activity,name",sale_activity_shipment_invoice_method_done,Shipment Invoice Method Done,Lieferposten Rechnungsmethode erledigt,0
-model,"workflow.activity,name",sale_activity_shipment_method,Shipment Method,Liefermethode,0
-model,"workflow.activity,name",sale_activity_shipment_method_done,Shipment Method Done,Liefermethode erledigt,0
-model,"workflow.activity,name",sale_activity_waiting_invoice_sale,Waiting Invoice,Rechnung Wartend,0
-model,"workflow.activity,name",sale_activity_waiting_invoice_shipment,Waiting Invoice Shipment,Rechnung Lieferposten Wartend,0
-model,"workflow.activity,name",sale_activity_waiting_shipment,Waiting Shipment,Lieferposten Wartend,0
-model,"workflow.activity,name",sale_activity_waiting_shipment_invoice,Waiting Shipment Invoice,Lieferposten Rechnung Wartend,0
-odt,sale.sale,0,Amount,Betrag,0
-odt,sale.sale,0,Date:,Datum:,0
-odt,sale.sale,0,Description,Bezeichnung,0
-odt,sale.sale,0,Description:,Bezeichnung:,0
-odt,sale.sale,0,Draft Sale Order,Auftrag (Entwurf),0
-odt,sale.sale,0,E-Mail:,E-Mail:,0
-odt,sale.sale,0,Phone:,Telefon:,0
-odt,sale.sale,0,Quantity,Anzahl,0
-odt,sale.sale,0,Quotation N°:,Angebot Nr.:,0
-odt,sale.sale,0,Sale Order N°:,Auftrag Nr.:,0
-odt,sale.sale,0,Taxes,Steuern,0
-odt,sale.sale,0,Taxes:,Steuern:,0
-odt,sale.sale,0,Total (excl. taxes):,Netto:,0
-odt,sale.sale,0,Total:,Gesamt:,0
-odt,sale.sale,0,Unit Price,Einzelpreis,0
-odt,sale.sale,0,VAT Number:,USt-ID-Nr.:,0
-odt,sale.sale,0,VAT:,USt:,0
-selection,"account.invoice,sale_exception_state",0,,,0
-selection,"account.invoice,sale_exception_state",0,Ignored,Ignoriert,0
-selection,"account.invoice,sale_exception_state",0,Recreated,Nachgebildet,0
-selection,"sale.configuration,sale_invoice_method",0,Manual,Manuell,0
-selection,"sale.configuration,sale_invoice_method",0,On Order Confirmed,Bei Beauftragung,0
-selection,"sale.configuration,sale_invoice_method",0,On Shipment Sent,Bei Versand,0
-selection,"sale.configuration,sale_shipment_method",0,Manual,Manuell,0
-selection,"sale.configuration,sale_shipment_method",0,On Invoice Paid,Bei Bezahlung,0
-selection,"sale.configuration,sale_shipment_method",0,On Order Confirmed,Bei Beauftragung,0
-selection,"sale.line,type",0,Comment,Kommentar,0
-selection,"sale.line,type",0,Line,Position,0
-selection,"sale.line,type",0,Subtotal,Zwischensumme,0
-selection,"sale.line,type",0,Title,Überschrift,0
-selection,"sale.sale,invoice_method",0,Manual,Manuell,0
-selection,"sale.sale,invoice_method",0,On Order Confirmed,Bei Beauftragung,0
-selection,"sale.sale,invoice_method",0,On Shipment Sent,Bei Versand,0
-selection,"sale.sale,invoice_state",0,Exception,Vorbehalt,0
-selection,"sale.sale,invoice_state",0,None,Kein,0
-selection,"sale.sale,invoice_state",0,Paid,Bezahlt,0
-selection,"sale.sale,invoice_state",0,Waiting,Wartend,0
-selection,"sale.sale,shipment_method",0,Manual,Manuell,0
-selection,"sale.sale,shipment_method",0,On Invoice Paid,Bei Bezahlung,0
-selection,"sale.sale,shipment_method",0,On Order Confirmed,Bei Beauftragung,0
-selection,"sale.sale,shipment_state",0,Exception,Vorbehalt,0
-selection,"sale.sale,shipment_state",0,None,Kein,0
-selection,"sale.sale,shipment_state",0,Sent,Gesendet,0
-selection,"sale.sale,shipment_state",0,Waiting,Wartend,0
-selection,"sale.sale,state",0,Canceled,Annulliert,0
-selection,"sale.sale,state",0,Confirmed,Beauftragt,0
-selection,"sale.sale,state",0,Done,Erledigt,0
-selection,"sale.sale,state",0,Draft,Entwurf,0
-selection,"sale.sale,state",0,Quotation,Angebot,0
-selection,"stock.move,sale_exception_state",0,,,0
-selection,"stock.move,sale_exception_state",0,Ignored,Ignoriert,0
-selection,"stock.move,sale_exception_state",0,Recreated,Nachgebildet,0
-view,product.product,0,Customers,Kunden,0
-view,product.template,0,Customers,Kunden,0
-view,sale.configuration,0,Sale Configuration,Einstellungen Verkauf,0
-view,sale.handle.invoice.exception.ask,0,Choose invoices to duplicate,Auswahl Rechnungen für Duplizierung,0
-view,sale.handle.invoice.exception.ask,0,Choose invoices to recreate,Rechnungen zum Nachbilden auswählen,0
-view,sale.handle.invoice.exception.ask,0,Handle Invoice Exception,Rechnungsvorbehalt bearbeiten,0
-view,sale.handle.shipment.exception.ask,0,Choose move to duplicate,Auswahl Bewegungen für Duplizierung,0
-view,sale.handle.shipment.exception.ask,0,Choose move to recreate,Bewegungen zum Nachbilden auswählen,0
-view,sale.handle.shipment.exception.ask,0,Duplicate Moves,Bewegungen duplizieren,0
-view,sale.handle.shipment.exception.ask,0,Handle shipment Exception,Liefervorbehalt bearbeiten,0
-view,sale.handle.shipment.exception.ask,0,Recreate Moves,Bewegungen nachbilden,0
-view,sale.line,0,General,Allgemein,0
-view,sale.line,0,Notes,Notizen,0
-view,sale.line,0,Products,Artikel,0
-view,sale.line,0,Sale Line,Position Verkauf,0
-view,sale.line,0,Sale Lines,Positionen Verkauf,0
-view,sale.sale,0,Cancel,Annullieren,0
-view,sale.sale,0,Confirm,Bestätigen,0
-view,sale.sale,0,Draft,Entwurf,0
-view,sale.sale,0,Handle Invoice Exception,Rechnungsvorbehalt bearbeiten,0
-view,sale.sale,0,Handle Shipment Exception,Liefervorbehalt bearbeiten,0
-view,sale.sale,0,Ignore Invoice Exception,Rechnungsvorbehalt ignorieren,0
-view,sale.sale,0,Invoices,Rechnungen,0
-view,sale.sale,0,Lines,Positionen,0
-view,sale.sale,0,Moves,Bewegungen,0
-view,sale.sale,0,Other Info,Sonstiges,0
-view,sale.sale,0,Quotation,Angebot,0
-view,sale.sale,0,Sale,Verkauf,0
-view,sale.sale,0,Sales,Verkäufe,0
-view,sale.sale,0,Shipments,Lieferposten,0
-wizard_button,"sale.handle.invoice.exception,init,end",0,Cancel,Abbrechen,0
-wizard_button,"sale.handle.invoice.exception,init,ok",0,Ok,OK,0
-wizard_button,"sale.handle.shipment.exception,init,end",0,Cancel,Abbrechen,0
-wizard_button,"sale.handle.shipment.exception,init,ok",0,Ok,OK,0
diff --git a/es_CO.csv b/es_CO.csv
deleted file mode 100644
index ab0b87d..0000000
--- a/es_CO.csv
+++ /dev/null
@@ -1,237 +0,0 @@
-type,name,res_id,src,value,fuzzy
-error,account.invoice,0,You can not delete invoices that come from a sale!,No puede borrar la factura proveniente de una venta!,0
-error,account.invoice,0,You cannot reset to draft an invoice generated by a sale.,No puede regresar a borrador una factura generada por una venta.,0
-error,sale.line,0,"It misses an ""account Revenue"" default property!","¡Hace falta una propiedad predeterminada de ""cuenta de ganancias""!",0
-error,sale.line,0,"It misses an ""Account Revenue"" on product ""%s""!","Falta un ""cuenta de ingresos"" para el producto ""%s""!",0
-error,sale.line,0,The customer location is required!,Es indispensable el lugar del cliente!,0
-error,sale.sale,0,Invoice and Shipment addresses must be defined for the quotation.,Factura y dirección de Envío debe ser definida por el presupuesto.,0
-error,sale.sale,0,"It misses an ""Account Receivable"" on the party ""%s""!","Falta una ""cuenta de ingresos"" en la partida ""%s""!",0
-error,sale.sale,0,Wrong combination of method!,Combinación o método erróneos!,0
-error,stock.shipment.out,0,You cannot reset to draft a move generated by a sale.,No puede regresar a borrador un movimiento generado por una venta.,0
-field,"account.invoice,sale_exception_state",0,Exception State,Estado de Excepción,0
-field,"product.template,salable",0,Salable,De fácil venta,0
-field,"product.template,sale_uom",0,Sale UOM,UdM de Venta,0
-field,"sale.configuration,rec_name",0,Name,Nombre de Contacto,1
-field,"sale.configuration,sale_sequence",0,Sale Reference Sequence,,0
-field,"sale.handle.invoice.exception.ask,domain_invoices",0,Domain Invoices,Rango de facturas,0
-field,"sale.handle.invoice.exception.ask,recreate_invoices",0,Recreate Invoices,Rehacer factura,0
-field,"sale.handle.shipment.exception.ask,domain_moves",0,Domain Moves,Rango de movimientos,0
-field,"sale.handle.shipment.exception.ask,recreate_moves",0,Recreate Moves,Rehacer movimientos,0
-field,"sale.line-account.invoice.line,invoice_line",0,Invoice Line,Línea de Factura,0
-field,"sale.line-account.invoice.line,rec_name",0,Name,Nombre,0
-field,"sale.line-account.invoice.line,sale_line",0,Sale Line,Línea de Venta,0
-field,"sale.line-account.tax,line",0,Sale Line,Línea de Venta,0
-field,"sale.line-account.tax,rec_name",0,Name,Nombre,0
-field,"sale.line-account.tax,tax",0,Tax,Impuesto,0
-field,"sale.line,amount",0,Amount,Cantidad,0
-field,"sale.line,description",0,Description,Descripción,0
-field,"sale.line-ignored-stock.move,move",0,Move,Movimiento,0
-field,"sale.line-ignored-stock.move,rec_name",0,Name,Nombre,0
-field,"sale.line-ignored-stock.move,sale_line",0,Sale Line,Línea de Venta,0
-field,"sale.line,invoice_lines",0,Invoice Lines,Líneas de Factura,0
-field,"sale.line,move_done",0,Moves Done,Movimientos Hechos,0
-field,"sale.line,move_exception",0,Moves Exception,Exepción de Movimientos,0
-field,"sale.line,moves",0,Moves,Movimientos,0
-field,"sale.line,moves_ignored",0,Ignored Moves,Movimientos Ignorados,0
-field,"sale.line,moves_recreated",0,Recreated Moves,Rehacer Movimientos,0
-field,"sale.line,note",0,Note,Nota,0
-field,"sale.line,product",0,Product,Producto,0
-field,"sale.line,quantity",0,Quantity,Cantidad,0
-field,"sale.line,rec_name",0,Name,Nombre,0
-field,"sale.line-recreated-stock.move,move",0,Move,Movimiento,0
-field,"sale.line-recreated-stock.move,rec_name",0,Name,Nombre,0
-field,"sale.line-recreated-stock.move,sale_line",0,Sale Line,Línea de Venta,0
-field,"sale.line,sale",0,Sale,Venta,0
-field,"sale.line,sequence",0,Sequence,Secuencia,0
-field,"sale.line,taxes",0,Taxes,Impuestos,0
-field,"sale.line,type",0,Type,Tipo,0
-field,"sale.line,unit",0,Unit,Unidad,0
-field,"sale.line,unit_digits",0,Unit Digits,Dígitos de Unidad,0
-field,"sale.line,unit_price",0,Unit Price,Precio Unitario,0
-field,"sale.sale-account.invoice,invoice",0,Invoice,Factura,0
-field,"sale.sale-account.invoice,rec_name",0,Name,Nombre,0
-field,"sale.sale-account.invoice,sale",0,Sale,Ventas,0
-field,"sale.sale,comment",0,Comment,Comentario,0
-field,"sale.sale,company",0,Company,Compañía,0
-field,"sale.sale,currency",0,Currency,Moneda,0
-field,"sale.sale,currency_digits",0,Currency Digits,Dígitos de Moneda,0
-field,"sale.sale,description",0,Description,Descripción,0
-field,"sale.sale-ignored-account.invoice,invoice",0,Invoice,Factura,0
-field,"sale.sale-ignored-account.invoice,rec_name",0,Name,Nombre,0
-field,"sale.sale-ignored-account.invoice,sale",0,Sale,Ventas,0
-field,"sale.sale,invoice_address",0,Invoice Address,Dirección de Facturación,0
-field,"sale.sale,invoice_exception",0,Invoices Exception,Excepción de Facturación,0
-field,"sale.sale,invoice_method",0,Invoice Method,Método de Facturación,0
-field,"sale.sale,invoice_paid",0,Invoices Paid,Facturas Pagadas,0
-field,"sale.sale,invoices",0,Invoices,Facturas,0
-field,"sale.sale,invoices_ignored",0,Ignored Invoices,Facturas Ignoradas,0
-field,"sale.sale,invoices_recreated",0,Recreated Invoices,Rehacer facturas,0
-field,"sale.sale,invoice_state",0,Invoice State,Estado de Factura,0
-field,"sale.sale,lines",0,Lines,Líneas,0
-field,"sale.sale,moves",0,Moves,Movimientos,0
-field,"sale.sale,party",0,Party,Tercero,0
-field,"sale.sale,party_lang",0,Party Language,Idioma del Tercero,0
-field,"sale.sale,payment_term",0,Payment Term,Término de Pago,0
-field,"sale.sale,rec_name",0,Name,Nombre,0
-field,"sale.sale-recreated-account.invoice,invoice",0,Invoice,Factura,0
-field,"sale.sale-recreated-account.invoice,rec_name",0,Name,Nombre,0
-field,"sale.sale-recreated-account.invoice,sale",0,Sale,Ventas,0
-field,"sale.sale,reference",0,Reference,Referencia,0
-field,"sale.sale,sale_date",0,Sale Date,Fecha de Venta,0
-field,"sale.sale,shipment_address",0,Shipment Address,Dirección de envío,0
-field,"sale.sale,shipment_done",0,Shipment Done,Envío Finalizado,0
-field,"sale.sale,shipment_exception",0,Shipments Exception,Excepción de Envíos,0
-field,"sale.sale,shipment_method",0,Shipment Method,Método de Envío,0
-field,"sale.sale,shipments",0,Shipments,Envíos,0
-field,"sale.sale,shipment_state",0,Shipment State,Estado de Envío,0
-field,"sale.sale,state",0,State,Estado,0
-field,"sale.sale,tax_amount",0,Tax,Impuesto,0
-field,"sale.sale,total_amount",0,Total,Total,0
-field,"sale.sale,untaxed_amount",0,Untaxed,Sin Impuesto,0
-field,"sale.sale,warehouse",0,Warehouse,Depósito,0
-field,"stock.move,sale",0,Sale,Venta,0
-field,"stock.move,sale_exception_state",0,Exception State,Estado Excepción,0
-field,"stock.move,sale_line",0,,,0
-help,"sale.handle.invoice.exception.ask,recreate_invoices",0,The selected invoices will be recreated. The other ones will be ignored.,La factura seleccionada será recreada. Las otras serán ignoradas.,0
-model,"ir.action,name",act_sale_form_confirmed,Confirmed Sales,Ventas Confirmadas,0
-model,"ir.action,name",act_sale_form_draft,Draft Sales,Ventas en Borrador,0
-model,"ir.action,name",wizard_invoice_handle_exception,Handle Invoice Exception,Tratar Excepción de factura,0
-model,"ir.action,name",wizard_shipment_handle_exception,Handle Shipment Exception,Tratar Excepción de Envío,0
-model,"ir.action,name",act_invoice_form,Invoices,Facturas,0
-model,"ir.action,name",act_sale_form_new,New Sale,Nueva venta,0
-model,"ir.action,name",act_open_customer,Parties associated to Sales,Terceros asociados a Ventas,0
-model,"ir.action,name",act_sale_form_quotation,Quotation Sales,Ventas Cotizadas,0
-model,"ir.action,name",report_sale,Sale,Venta,0
-model,"ir.action,name",act_sale_configuration_form,Sale Configuration,,0
-model,"ir.action,name",act_sale_form,Sales,Ventas,0
-model,"ir.action,name",act_sale_form2,Sales,Ventas,0
-model,"ir.action,name",act_shipment_form,Shipments,Envíos,0
-model,"ir.sequence,name",sequence_sale,Sale,Venta,0
-model,"ir.sequence.type,name",sequence_type_sale,Sale,Venta,0
-model,"ir.ui.menu,name",menu_configuration,Configuration,Configuración,1
-model,"ir.ui.menu,name",menu_sale_form_confirmed,Confirmed Sales,Ventas Confirmadas,0
-model,"ir.ui.menu,name",menu_sale_form_draft,Draft Sales,Ventas en Borrador,0
-model,"ir.ui.menu,name",menu_sale_form_new,New Sale,Nueva venta,0
-model,"ir.ui.menu,name",menu_customer,Parties associated to Sales,Terceros asociados a Ventas,0
-model,"ir.ui.menu,name",menu_sale_form_quotation,Quotation Sales,Ventas Cotizadas,0
-model,"ir.ui.menu,name",menu_sale_configuration,Sale Configuration,,0
-model,"ir.ui.menu,name",menu_sale,Sale Management,Gestión de Ventas,0
-model,"ir.ui.menu,name",menu_sale_form,Sales,Ventas,0
-model,"res.group,name",group_sale,Sale,Venta,0
-model,"res.group,name",group_sale_admin,Sale Administrator,,0
-model,"sale.configuration,name",0,sale.configuration,,0
-model,"sale.handle.invoice.exception.ask,name",0,Invoice Exception Ask,Pregunta de Excepción de Factura,0
-model,"sale.handle.shipment.exception.ask,name",0,Shipment Exception Ask,Pregunta de Excepción de Envío,0
-model,"sale.line-account.invoice.line,name",0,Sale Line - Invoice Line,Línea de Venta - Línea de Factura,0
-model,"sale.line-account.tax,name",0,Sale Line - Tax,Línea de Venta - Impuesto,0
-model,"sale.line-ignored-stock.move,name",0,Sale Line - Ignored Move,Línea de Venta - Movimiento Ignorado,0
-model,"sale.line,name",0,Sale Line,Línea de Venta,0
-model,"sale.line-recreated-stock.move,name",0,Sale Line - Recreated Move,Línea de Venta - Movimiento Recreado,0
-model,"sale.sale-account.invoice,name",0,Sale - Invoice,Venta - Factura,0
-model,"sale.sale-ignored-account.invoice,name",0,Sale - Ignored Invoice,Venta - Factura Ignorada,0
-model,"sale.sale,name",0,Sale,Ventas,0
-model,"sale.sale-recreated-account.invoice,name",0,Sale - Recreated Invoice,Venta - Factura Recreada,0
-model,"workflow.activity,name",sale_activity_cancel,Canceled,Cancelado,0
-model,"workflow.activity,name",sale_activity_confirmed,Confirmed,Confirmado,0
-model,"workflow.activity,name",sale_activity_done,Done,Hecho,0
-model,"workflow.activity,name",sale_activity_draft,Draft,Borrador,0
-model,"workflow.activity,name",sale_activity_invoice_sale_done,Invoice Done,Factura Hecha,0
-model,"workflow.activity,name",sale_activity_invoice_sale_exception,Invoice Exception,Excepción de Factura,0
-model,"workflow.activity,name",sale_activity_invoice_method,Invoice Method,Método de Facturación,0
-model,"workflow.activity,name",sale_activity_invoice_method_done,Invoice Method Done,Método de Factura Concluido,0
-model,"workflow.activity,name",sale_activity_invoice_shipment,Invoice Shipment,Envío de Factura,0
-model,"workflow.activity,name",sale_activity_invoice_shipment_done,Invoice Shipment Done,Envío de Factura Concluido,0
-model,"workflow.activity,name",sale_activity_invoice_shipment_exception,Invoice Shipment Exception,Excepción de Envío de Factura,0
-model,"workflow.activity,name",sale_activity_invoice_shipment_method,Invoice Shipment Method,Método de Envío de Factura,0
-model,"workflow.activity,name",sale_activity_invoice_shipment_method_done,Invoice Shipment Method Done,Método de Envío de Factura Concluido,0
-model,"workflow.activity,name",sale_activity_quotation,Quotation,Cotización,0
-model,"workflow.activity,name",sale_activity_shipment,Shipment,Envío,0
-model,"workflow.activity,name",sale_activity_shipment_exception,Shipment Exception,Excepción de Envío,0
-model,"workflow.activity,name",sale_activity_shipment_invoice,Shipment Invoice,Envío de Factura,0
-model,"workflow.activity,name",sale_activity_shipment_invoice_done,Shipment Invoice Done,Envío de Factura Concluido,0
-model,"workflow.activity,name",sale_activity_shipment_invoice_exception,Shipment Invoice Exception,Excepción de Envío de Factura,0
-model,"workflow.activity,name",sale_activity_shipment_invoice_method,Shipment Invoice Method,Método Envío de Factura,0
-model,"workflow.activity,name",sale_activity_shipment_invoice_method_done,Shipment Invoice Method Done,Método de Envío de Factura Concluido,0
-model,"workflow.activity,name",sale_activity_shipment_method,Shipment Method,Método de Envío,0
-model,"workflow.activity,name",sale_activity_shipment_method_done,Shipment Method Done,Método de Envío Concluido,0
-model,"workflow.activity,name",sale_activity_waiting_invoice_sale,Waiting Invoice,Esperando Factura,0
-model,"workflow.activity,name",sale_activity_waiting_invoice_shipment,Waiting Invoice Shipment,Esperando Envío de Factura,0
-model,"workflow.activity,name",sale_activity_waiting_shipment,Waiting Shipment,Esperando Envío,0
-model,"workflow.activity,name",sale_activity_waiting_shipment_invoice,Waiting Shipment Invoice,Esperando Envío de Factura,0
-model,"workflow,name",sale_workflow,Sale workflow,Flujo de Trabajo de Ventas,0
-odt,sale.sale,0,Amount,Cantidad,0
-odt,sale.sale,0,Date:,Fecha:,0
-odt,sale.sale,0,Description,Descripción,0
-odt,sale.sale,0,Description:,Descripción:,0
-odt,sale.sale,0,Draft Sale Order,Orden de Venta en Borrador,0
-odt,sale.sale,0,E-Mail:,Correo electrónico:,0
-odt,sale.sale,0,Phone:,Teléfono:,0
-odt,sale.sale,0,Quantity,Cantidad,0
-odt,sale.sale,0,Quotation N°:,Cotización Nº:,0
-odt,sale.sale,0,Sale Order N°:,Orden de Venta Nº:,0
-odt,sale.sale,0,Taxes,Impuestos,0
-odt,sale.sale,0,Taxes:,Impuestos:,0
-odt,sale.sale,0,Total:,Total:,0
-odt,sale.sale,0,Total (excl. taxes):,Total (sin impuestos):,0
-odt,sale.sale,0,Unit Price,Precio Unitario,0
-odt,sale.sale,0,VAT:,NIT:,0
-selection,"account.invoice,sale_exception_state",0,,,0
-selection,"account.invoice,sale_exception_state",0,Ignored,Ignorado,0
-selection,"account.invoice,sale_exception_state",0,Recreated,Rehecho,0
-selection,"sale.line,type",0,Comment,Comentario,0
-selection,"sale.line,type",0,Line,Línea,0
-selection,"sale.line,type",0,Subtotal,Subtotal,0
-selection,"sale.line,type",0,Title,Título,0
-selection,"sale.sale,invoice_method",0,Manual,Manual,0
-selection,"sale.sale,invoice_method",0,On Order Confirmed,Al Confirmar la Orden,0
-selection,"sale.sale,invoice_method",0,On Shipment Sent,Enviado,0
-selection,"sale.sale,invoice_state",0,Exception,Excepción,0
-selection,"sale.sale,invoice_state",0,None,Ninguno,0
-selection,"sale.sale,invoice_state",0,Paid,Pagado,0
-selection,"sale.sale,invoice_state",0,Waiting,En Espera,0
-selection,"sale.sale,shipment_method",0,Manual,Manual,0
-selection,"sale.sale,shipment_method",0,On Invoice Paid,Al Pagar,0
-selection,"sale.sale,shipment_method",0,On Order Confirmed,Al Confirmar la Orden,0
-selection,"sale.sale,shipment_state",0,Exception,Excepción,0
-selection,"sale.sale,shipment_state",0,None,Ninguno,0
-selection,"sale.sale,shipment_state",0,Sent,Enviado,0
-selection,"sale.sale,shipment_state",0,Waiting,En Espera,0
-selection,"sale.sale,state",0,Canceled,Cancelado,0
-selection,"sale.sale,state",0,Confirmed,Confirmado,0
-selection,"sale.sale,state",0,Done,Hecho,0
-selection,"sale.sale,state",0,Draft,Borrador,0
-selection,"sale.sale,state",0,Quotation,Cotización,0
-selection,"stock.move,sale_exception_state",0,,,0
-selection,"stock.move,sale_exception_state",0,Ignored,Ignore,0
-selection,"stock.move,sale_exception_state",0,Recreated,Rehacer,0
-view,product.product,0,Customers,Clientes,0
-view,product.template,0,Customers,Clientes,0
-view,sale.configuration,0,Sale Configuration,,0
-view,sale.handle.invoice.exception.ask,0,Choose invoices to recreate,Escoja una factura a rehacer,0
-view,sale.handle.invoice.exception.ask,0,Handle Invoice Exception,Tratar Excepción de factura,0
-view,sale.handle.shipment.exception.ask,0,Choose move to recreate,Escoja un movimiento a rehacer,0
-view,sale.handle.shipment.exception.ask,0,Handle shipment Exception,Maneje Excepciones de empaquetado,0
-view,sale.handle.shipment.exception.ask,0,Recreate Moves,Recrear movimientos,0
-view,sale.line,0,General,General,0
-view,sale.line,0,Notes,Notas,0
-view,sale.line,0,Products,Productos,0
-view,sale.line,0,Sale Line,Línea de Venta,0
-view,sale.line,0,Sale Lines,Líneas de Venta,0
-view,sale.sale,0,Cancel,Cancelar,0
-view,sale.sale,0,Confirm,Confirmar,0
-view,sale.sale,0,Draft,Borrador,0
-view,sale.sale,0,Handle Invoice Exception,Excepción que maneja factura,0
-view,sale.sale,0,Handle Shipment Exception,Excepción que maneja envío,0
-view,sale.sale,0,Ignore Invoice Exception,Ignorar excepción en Factura,0
-view,sale.sale,0,Invoices,Facturas,0
-view,sale.sale,0,Lines,Líneas,0
-view,sale.sale,0,Moves,Movimientos,0
-view,sale.sale,0,Other Info,Información Adicional,0
-view,sale.sale,0,Quotation,Cotización,0
-view,sale.sale,0,Sale,Venta,0
-view,sale.sale,0,Sales,Ventas,0
-view,sale.sale,0,Shipments,Empaques,0
-wizard_button,"sale.handle.invoice.exception,init,end",0,Cancel,Cancelar,0
-wizard_button,"sale.handle.invoice.exception,init,ok",0,Ok,Aceptar,0
-wizard_button,"sale.handle.shipment.exception,init,end",0,Cancel,Cancelar,0
-wizard_button,"sale.handle.shipment.exception,init,ok",0,Ok,Aceptar,0
diff --git a/es_ES.csv b/es_ES.csv
deleted file mode 100644
index 6e13270..0000000
--- a/es_ES.csv
+++ /dev/null
@@ -1,229 +0,0 @@
-type,name,res_id,src,value,fuzzy
-error,account.invoice,0,You can not delete invoices that come from a sale!,No puede borrar facturas que provienen de una venta,0
-error,account.invoice,0,You cannot reset to draft an invoice generated by a sale.,No puede restablecer a borrador una factura generada por una venta.,0
-error,sale.line,0,"It misses an ""account Revenue"" default property!",Falta una propiedad predeterminada de «cuenta de ingresos»,0
-error,sale.line,0,"It misses an ""Account Revenue"" on product ""%s""!",Falta una «cuenta de ingresos» en el producto «%s»,0
-error,sale.line,0,The customer location is required!,Se necesita la ubicación del cliente,0
-error,sale.sale,0,Invoice and Shipment addresses must be defined for the quotation.,Las direcciones de facturación y de envío debe ser definida para el presupuesto.,0
-error,sale.sale,0,"It misses an ""Account Receivable"" on the party ""%s""!",Falta una «cuenta de ingresos» en el tercero «%s»,0
-error,sale.sale,0,Wrong combination of method!,Combinación inválida de métodos,0
-error,stock.shipment.out,0,You cannot reset to draft a move generated by a sale.,No puede restablecer a borrador un movimiento generado por una venta.,0
-field,"account.invoice,sale_exception_state",0,Exception State,Estado de excepción,0
-field,"product.template,salable",0,Salable,Vendible,0
-field,"product.template,sale_uom",0,Sale UOM,UdM de venta,0
-field,"sale.handle.invoice.exception.ask,domain_invoices",0,Domain Invoices,Facturas del dominio,0
-field,"sale.handle.invoice.exception.ask,recreate_invoices",0,Recreate Invoices,Rehacer facturas,0
-field,"sale.handle.shipment.exception.ask,domain_moves",0,Domain Moves,Movimientos de dominio,0
-field,"sale.handle.shipment.exception.ask,recreate_moves",0,Recreate Moves,Rehacer movimientos,0
-field,"sale.line-account.invoice.line,invoice_line",0,Invoice Line,Línea de factura,0
-field,"sale.line-account.invoice.line,rec_name",0,Name,Nombre,0
-field,"sale.line-account.invoice.line,sale_line",0,Sale Line,Línea de venta,0
-field,"sale.line-account.tax,line",0,Sale Line,Línea de venta,0
-field,"sale.line-account.tax,rec_name",0,Name,Nombre,0
-field,"sale.line-account.tax,tax",0,Tax,Impuesto,0
-field,"sale.line,amount",0,Amount,Cantidad,0
-field,"sale.line,description",0,Description,Descripción,0
-field,"sale.line-ignored-stock.move,move",0,Move,Movimiento,0
-field,"sale.line-ignored-stock.move,rec_name",0,Name,Nombre,0
-field,"sale.line-ignored-stock.move,sale_line",0,Sale Line,Línea de venta,0
-field,"sale.line,invoice_lines",0,Invoice Lines,Líneas de factura,0
-field,"sale.line,move_done",0,Moves Done,Movimientos terminados,0
-field,"sale.line,move_exception",0,Moves Exception,Exepción de movimientos,0
-field,"sale.line,moves",0,Moves,Movimientos,0
-field,"sale.line,moves_ignored",0,Ignored Moves,Movimientos ignorados,0
-field,"sale.line,moves_recreated",0,Recreated Moves,Rehacer movimientos,0
-field,"sale.line,note",0,Note,Nota,0
-field,"sale.line,product",0,Product,Producto,0
-field,"sale.line,quantity",0,Quantity,Cantidad,0
-field,"sale.line,rec_name",0,Name,Nombre,0
-field,"sale.line-recreated-stock.move,move",0,Move,Movimiento,0
-field,"sale.line-recreated-stock.move,rec_name",0,Name,Nombre,0
-field,"sale.line-recreated-stock.move,sale_line",0,Sale Line,Línea de venta,0
-field,"sale.line,sale",0,Sale,Venta,0
-field,"sale.line,sequence",0,Sequence,Secuencia,0
-field,"sale.line,taxes",0,Taxes,Impuestos,0
-field,"sale.line,type",0,Type,Tipo,0
-field,"sale.line,unit",0,Unit,Unidad,0
-field,"sale.line,unit_digits",0,Unit Digits,Dígitos de la unidad,0
-field,"sale.line,unit_price",0,Unit Price,Precio unitario,0
-field,"sale.sale-account.invoice,invoice",0,Invoice,Factura,0
-field,"sale.sale-account.invoice,rec_name",0,Name,Nombre,0
-field,"sale.sale-account.invoice,sale",0,Sale,Venta,0
-field,"sale.sale,comment",0,Comment,Comentario,0
-field,"sale.sale,company",0,Company,Empresa,0
-field,"sale.sale,currency",0,Currency,Divisa,0
-field,"sale.sale,currency_digits",0,Currency Digits,Dígitos de la divisa,0
-field,"sale.sale,description",0,Description,Descripción,0
-field,"sale.sale-ignored-account.invoice,invoice",0,Invoice,Factura,0
-field,"sale.sale-ignored-account.invoice,rec_name",0,Name,Nombre,0
-field,"sale.sale-ignored-account.invoice,sale",0,Sale,Venta,0
-field,"sale.sale,invoice_address",0,Invoice Address,Dirección de facturación,0
-field,"sale.sale,invoice_exception",0,Invoices Exception,Excepción de facturación,0
-field,"sale.sale,invoice_method",0,Invoice Method,Método de facturación,0
-field,"sale.sale,invoice_paid",0,Invoices Paid,Facturas pagadas,0
-field,"sale.sale,invoices",0,Invoices,Facturas,0
-field,"sale.sale,invoices_ignored",0,Ignored Invoices,Facturas ignoradas,0
-field,"sale.sale,invoices_recreated",0,Recreated Invoices,Rehacer facturas,0
-field,"sale.sale,invoice_state",0,Invoice State,Estado de factura,0
-field,"sale.sale,lines",0,Lines,Líneas,0
-field,"sale.sale,moves",0,Moves,Movimientos,0
-field,"sale.sale,party",0,Party,Tercero,0
-field,"sale.sale,party_lang",0,Party Language,Idioma del tercero,0
-field,"sale.sale,payment_term",0,Payment Term,Término de pago,0
-field,"sale.sale,rec_name",0,Name,Nombre,0
-field,"sale.sale-recreated-account.invoice,invoice",0,Invoice,Factura,0
-field,"sale.sale-recreated-account.invoice,rec_name",0,Name,Nombre,0
-field,"sale.sale-recreated-account.invoice,sale",0,Sale,Venta,0
-field,"sale.sale,reference",0,Reference,Referencia,0
-field,"sale.sale,sale_date",0,Sale Date,Fecha de venta,0
-field,"sale.sale,shipment_address",0,Shipment Address,Dirección de envío,0
-field,"sale.sale,shipment_done",0,Shipment Done,Envío terminado,0
-field,"sale.sale,shipment_exception",0,Shipments Exception,Excepción de envíos,0
-field,"sale.sale,shipment_method",0,Shipment Method,Método de envío,0
-field,"sale.sale,shipments",0,Shipments,Envíos,0
-field,"sale.sale,shipment_state",0,Shipment State,Estado de envío,0
-field,"sale.sale,state",0,State,Estado,0
-field,"sale.sale,tax_amount",0,Tax,Impuesto,0
-field,"sale.sale,total_amount",0,Total,Total,0
-field,"sale.sale,untaxed_amount",0,Untaxed,Sin impuesto,0
-field,"sale.sale,warehouse",0,Warehouse,Almacén,0
-field,"stock.move,sale",0,Sale,Venta,0
-field,"stock.move,sale_exception_state",0,Exception State,Estado excepción,0
-field,"stock.move,sale_line",0,,,0
-help,"sale.handle.invoice.exception.ask,recreate_invoices",0,The selected invoices will be recreated. The other ones will be ignored.,Las facturas seleccionadas seran recreadas. Las otras serán ignoradas.,0
-model,"ir.action,name",act_sale_form_confirmed,Confirmed Sales,Ventas confirmadas,0
-model,"ir.action,name",act_sale_form_draft,Draft Sales,Ventas en borrador,0
-model,"ir.action,name",wizard_invoice_handle_exception,Handle Invoice Exception,Gestionar excepción de factura,0
-model,"ir.action,name",wizard_shipment_handle_exception,Handle Shipment Exception,Gestionar excepción de envio,0
-model,"ir.action,name",act_invoice_form,Invoices,Facturas,0
-model,"ir.action,name",act_sale_form_new,New Sale,Nueva venta,0
-model,"ir.action,name",act_open_customer,Parties associated to Sales,Terceros asociados a ventas,0
-model,"ir.action,name",act_sale_form_quotation,Quotation Sales,Ventas presupuestadas,0
-model,"ir.action,name",report_sale,Sale,Venta,0
-model,"ir.action,name",act_sale_form,Sales,Ventas,0
-model,"ir.action,name",act_sale_form2,Sales,Ventas,0
-model,"ir.action,name",act_shipment_form,Shipments,Envíos,0
-model,"ir.sequence,name",sequence_sale,Sale,Venta,0
-model,"ir.sequence.type,name",sequence_type_sale,Sale,Venta,0
-model,"ir.ui.menu,name",menu_sale_form_confirmed,Confirmed Sales,Ventas confirmadas,0
-model,"ir.ui.menu,name",menu_sale_form_draft,Draft Sales,Ventas en borrador,0
-model,"ir.ui.menu,name",menu_sale_form_new,New Sale,Nueva venta,0
-model,"ir.ui.menu,name",menu_customer,Parties associated to Sales,Terceros asociados a ventas,0
-model,"ir.ui.menu,name",menu_sale_form_quotation,Quotation Sales,Ventas presupuestadas,0
-model,"ir.ui.menu,name",menu_sale,Sale Management,Gestión de ventas,0
-model,"ir.ui.menu,name",menu_sale_form,Sales,Ventas,0
-model,"res.group,name",group_sale,Sale,Venta,0
-model,"sale.handle.invoice.exception.ask,name",0,Invoice Exception Ask,Factura de excepcion - Petición,0
-model,"sale.handle.shipment.exception.ask,name",0,Shipment Exception Ask,Envio de excepcion - Petición,0
-model,"sale.line-account.invoice.line,name",0,Sale Line - Invoice Line,Línea de venta - Línea de factura,0
-model,"sale.line-account.tax,name",0,Sale Line - Tax,Línea de venta - Impuesto,0
-model,"sale.line-ignored-stock.move,name",0,Sale Line - Ignored Move,Línea de venta - Movimiento ignorado,0
-model,"sale.line,name",0,Sale Line,Línea de venta,0
-model,"sale.line-recreated-stock.move,name",0,Sale Line - Recreated Move,Línea de venta - Movimiento recreado,0
-model,"sale.sale-account.invoice,name",0,Sale - Invoice,Venta - Factura,0
-model,"sale.sale-ignored-account.invoice,name",0,Sale - Ignored Invoice,Venta - Factura ignorada,0
-model,"sale.sale,name",0,Sale,Venta,0
-model,"sale.sale-recreated-account.invoice,name",0,Sale - Recreated Invoice,Venta - Factura recreada,0
-model,"workflow.activity,name",sale_activity_cancel,Canceled,Cancelado,0
-model,"workflow.activity,name",sale_activity_confirmed,Confirmed,Confirmado,0
-model,"workflow.activity,name",sale_activity_done,Done,Terminado,0
-model,"workflow.activity,name",sale_activity_draft,Draft,Borrador,0
-model,"workflow.activity,name",sale_activity_invoice_sale_done,Invoice Done,Factura terminada,0
-model,"workflow.activity,name",sale_activity_invoice_sale_exception,Invoice Exception,Excepción de factura,0
-model,"workflow.activity,name",sale_activity_invoice_method,Invoice Method,Método de facturación,0
-model,"workflow.activity,name",sale_activity_invoice_method_done,Invoice Method Done,Método de factura terminado,0
-model,"workflow.activity,name",sale_activity_invoice_shipment,Invoice Shipment,Envío de factura,0
-model,"workflow.activity,name",sale_activity_invoice_shipment_done,Invoice Shipment Done,Envío de factura terminado,0
-model,"workflow.activity,name",sale_activity_invoice_shipment_exception,Invoice Shipment Exception,Excepción de envío de factura,0
-model,"workflow.activity,name",sale_activity_invoice_shipment_method,Invoice Shipment Method,Método de envío de factura,0
-model,"workflow.activity,name",sale_activity_invoice_shipment_method_done,Invoice Shipment Method Done,Método de envío de factura terminado,0
-model,"workflow.activity,name",sale_activity_quotation,Quotation,Presupuesto,0
-model,"workflow.activity,name",sale_activity_shipment,Shipment,Envío,0
-model,"workflow.activity,name",sale_activity_shipment_exception,Shipment Exception,Excepción de envío,0
-model,"workflow.activity,name",sale_activity_shipment_invoice,Shipment Invoice,Envío de factura,0
-model,"workflow.activity,name",sale_activity_shipment_invoice_done,Shipment Invoice Done,Envío de factura terminado,0
-model,"workflow.activity,name",sale_activity_shipment_invoice_exception,Shipment Invoice Exception,Excepción de envío de factura,0
-model,"workflow.activity,name",sale_activity_shipment_invoice_method,Shipment Invoice Method,Método de envío de factura,0
-model,"workflow.activity,name",sale_activity_shipment_invoice_method_done,Shipment Invoice Method Done,Método de envío de factura terminado,0
-model,"workflow.activity,name",sale_activity_shipment_method,Shipment Method,Método de envío,0
-model,"workflow.activity,name",sale_activity_shipment_method_done,Shipment Method Done,Método de envío terminado,0
-model,"workflow.activity,name",sale_activity_waiting_invoice_sale,Waiting Invoice,Esperando factura,0
-model,"workflow.activity,name",sale_activity_waiting_invoice_shipment,Waiting Invoice Shipment,Esperando Envío de Factura,0
-model,"workflow.activity,name",sale_activity_waiting_shipment,Waiting Shipment,Esperando Envío,0
-model,"workflow.activity,name",sale_activity_waiting_shipment_invoice,Waiting Shipment Invoice,Esperando Envío de Factura,0
-model,"workflow,name",sale_workflow,Sale workflow,Flujo de Trabajo de Ventas,0
-odt,sale.sale,0,Amount,Cantidad,0
-odt,sale.sale,0,Date:,Fecha:,0
-odt,sale.sale,0,Description,Descripción,0
-odt,sale.sale,0,Description:,Descripción:,0
-odt,sale.sale,0,Draft Sale Order,Orden de venta en borrador,0
-odt,sale.sale,0,E-Mail:,Correo electrónico:,0
-odt,sale.sale,0,Phone:,Teléfono:,0
-odt,sale.sale,0,Quantity,Cantidad,0
-odt,sale.sale,0,Quotation N°:,Presupuesto Nº:,0
-odt,sale.sale,0,Sale Order N°:,Orden de venta Nº:,0
-odt,sale.sale,0,Taxes,Impuestos,0
-odt,sale.sale,0,Taxes:,Impuestos:,0
-odt,sale.sale,0,Total:,Total:,0
-odt,sale.sale,0,Total (excl. taxes):,Total (sin impuestos):,0
-odt,sale.sale,0,Unit Price,Precio unitario,0
-odt,sale.sale,0,VAT:,NIF:,0
-selection,"account.invoice,sale_exception_state",0,,,0
-selection,"account.invoice,sale_exception_state",0,Ignored,Ignorado,0
-selection,"account.invoice,sale_exception_state",0,Recreated,Rehecho,0
-selection,"sale.line,type",0,Comment,Comentario,0
-selection,"sale.line,type",0,Line,Línea,0
-selection,"sale.line,type",0,Subtotal,Subtotal,0
-selection,"sale.line,type",0,Title,Título,0
-selection,"sale.sale,invoice_method",0,Manual,Manual,0
-selection,"sale.sale,invoice_method",0,On Order Confirmed,Al confirmar la orden,0
-selection,"sale.sale,invoice_method",0,On Shipment Sent,Al Enviarlo,0
-selection,"sale.sale,invoice_state",0,Exception,Excepción,0
-selection,"sale.sale,invoice_state",0,None,Ninguno,0
-selection,"sale.sale,invoice_state",0,Paid,Pagado,0
-selection,"sale.sale,invoice_state",0,Waiting,En espera,0
-selection,"sale.sale,shipment_method",0,Manual,Manual,0
-selection,"sale.sale,shipment_method",0,On Invoice Paid,Al pagar la factura,0
-selection,"sale.sale,shipment_method",0,On Order Confirmed,Al confirmar la orden,0
-selection,"sale.sale,shipment_state",0,Exception,Excepción,0
-selection,"sale.sale,shipment_state",0,None,Ninguno,0
-selection,"sale.sale,shipment_state",0,Sent,Enviado,0
-selection,"sale.sale,shipment_state",0,Waiting,En espera,0
-selection,"sale.sale,state",0,Canceled,Cancelado,0
-selection,"sale.sale,state",0,Confirmed,Confirmado,0
-selection,"sale.sale,state",0,Done,Terminada,0
-selection,"sale.sale,state",0,Draft,Borrador,0
-selection,"sale.sale,state",0,Quotation,Presupuesto,0
-selection,"stock.move,sale_exception_state",0,,,0
-selection,"stock.move,sale_exception_state",0,Ignored,Ignorado,0
-selection,"stock.move,sale_exception_state",0,Recreated,Rehacer,0
-view,product.product,0,Customers,Clientes,0
-view,product.template,0,Customers,Clientes,0
-view,sale.handle.invoice.exception.ask,0,Choose invoices to recreate,Escoja una factura a rehacer,0
-view,sale.handle.invoice.exception.ask,0,Handle Invoice Exception,Excepción de manejo de factura,0
-view,sale.handle.shipment.exception.ask,0,Choose move to recreate,Escoja un movimiento a rehacer,0
-view,sale.handle.shipment.exception.ask,0,Handle shipment Exception,Manejar excepción de envio,0
-view,sale.handle.shipment.exception.ask,0,Recreate Moves,Recrear movimientos,0
-view,sale.line,0,General,General,0
-view,sale.line,0,Notes,Notas,0
-view,sale.line,0,Products,Productos,0
-view,sale.line,0,Sale Line,Línea de venta,0
-view,sale.line,0,Sale Lines,Líneas de venta,0
-view,sale.sale,0,Cancel,Cancelar,0
-view,sale.sale,0,Confirm,Confirmar,0
-view,sale.sale,0,Draft,Borrador,0
-view,sale.sale,0,Handle Invoice Exception,Manejar excepción de factura,0
-view,sale.sale,0,Handle Shipment Exception,Manejar excepción de envio,0
-view,sale.sale,0,Ignore Invoice Exception,Ignorar excepción de factura,0
-view,sale.sale,0,Invoices,Facturas,0
-view,sale.sale,0,Lines,Líneas,0
-view,sale.sale,0,Moves,Movimientos,0
-view,sale.sale,0,Other Info,Información adicional,0
-view,sale.sale,0,Quotation,Presupuesto,0
-view,sale.sale,0,Sale,Venta,0
-view,sale.sale,0,Sales,Ventas,0
-view,sale.sale,0,Shipments,Envios,0
-wizard_button,"sale.handle.invoice.exception,init,end",0,Cancel,Cancelar,0
-wizard_button,"sale.handle.invoice.exception,init,ok",0,Ok,Aceptar,0
-wizard_button,"sale.handle.shipment.exception,init,end",0,Cancel,Cancelar,0
-wizard_button,"sale.handle.shipment.exception,init,ok",0,Ok,Aceptar,0
diff --git a/fr_FR.csv b/fr_FR.csv
deleted file mode 100644
index 409ee5c..0000000
--- a/fr_FR.csv
+++ /dev/null
@@ -1,249 +0,0 @@
-type,name,res_id,src,value,fuzzy
-error,account.invoice,0,You can not delete invoices that come from a sale!,Vous ne pouvez pas supprimer une facture qui provient d'une vente,0
-error,account.invoice,0,You cannot reset to draft an invoice generated by a sale.,Vous ne pouvez pas réinitialiser une facture générée par une vente.,0
-error,sale.line,0,"It misses an ""Account Revenue"" on product ""%s""!","Il manque un compte de produits sur le produit ""%s"" !",0
-error,sale.line,0,"It misses an ""account Revenue"" default property!","il manque une propriété par défaut ""compte de produits"" !",0
-error,sale.line,0,The customer location is required!,L'emplacement client est requis !,0
-error,sale.sale,0,Invoice and Shipment addresses must be defined for the quotation.,Les adresses de facturation et d'expédition sont requises pour le devis.,0
-error,sale.sale,0,"It misses an ""Account Receivable"" on the party ""%s""!","Il manque un compte à recevoir sur le tiers ""%s"" !",0
-error,sale.sale,0,Wrong combination of method!,Mauvaise combinaison de méthodes !,0
-error,stock.shipment.out,0,You cannot reset to draft a move generated by a sale.,Vous ne pouvez pas réinitialiser un mouvement généré par une vente.,0
-field,"account.invoice,sale_exception_state",0,Exception State,État d'exception,0
-field,"account.invoice,sales",0,Sales,Ventes,1
-field,"account.invoice.line,sale_lines",0,Sale Lines,Lignes de vente,1
-field,"product.template,salable",0,Salable,Vendable,0
-field,"product.template,sale_uom",0,Sale UOM,UDM de vente,0
-field,"sale.configuration,rec_name",0,Name,Nom,0
-field,"sale.configuration,sale_invoice_method",0,Sale Invoice Method,Facturation,0
-field,"sale.configuration,sale_sequence",0,Sale Reference Sequence,Séquence de référence de vente,0
-field,"sale.configuration,sale_shipment_method",0,Sale Shipment Method,Expédition,0
-field,"sale.handle.invoice.exception.ask,domain_invoices",0,Domain Invoices,Domaine des factures,0
-field,"sale.handle.invoice.exception.ask,recreate_invoices",0,Recreate Invoices,Recréer les factures,0
-field,"sale.handle.shipment.exception.ask,domain_moves",0,Domain Moves,Domaine des mouvements,0
-field,"sale.handle.shipment.exception.ask,recreate_moves",0,Recreate Moves,Recréer les mouvements,0
-field,"sale.line,amount",0,Amount,Montant,0
-field,"sale.line,description",0,Description,Description,0
-field,"sale.line,invoice_lines",0,Invoice Lines,Lignes de facture,0
-field,"sale.line,move_done",0,Moves Done,Mouvements effectués,0
-field,"sale.line,move_exception",0,Moves Exception,Mouvements en exception,0
-field,"sale.line,moves",0,Moves,Mouvements,0
-field,"sale.line,moves_ignored",0,Ignored Moves,Mouvements ignorés,0
-field,"sale.line,moves_recreated",0,Recreated Moves,Mouvements recréés,0
-field,"sale.line,note",0,Note,Note,0
-field,"sale.line,product",0,Product,Produit,0
-field,"sale.line,quantity",0,Quantity,Quantité,0
-field,"sale.line,rec_name",0,Name,Nom,0
-field,"sale.line,sale",0,Sale,Vente,0
-field,"sale.line,sequence",0,Sequence,Séquence,0
-field,"sale.line,taxes",0,Taxes,Taxes,0
-field,"sale.line,type",0,Type,Type,0
-field,"sale.line,unit",0,Unit,Unité,0
-field,"sale.line,unit_digits",0,Unit Digits,Décimales de l'unité,0
-field,"sale.line,unit_price",0,Unit Price,Prix unitaire,0
-field,"sale.line-account.invoice.line,invoice_line",0,Invoice Line,Ligne de facture,0
-field,"sale.line-account.invoice.line,rec_name",0,Name,Nom,0
-field,"sale.line-account.invoice.line,sale_line",0,Sale Line,Ligne de vente,0
-field,"sale.line-account.tax,line",0,Sale Line,Ligne de vente,0
-field,"sale.line-account.tax,rec_name",0,Name,Nom,0
-field,"sale.line-account.tax,tax",0,Tax,Taxe,0
-field,"sale.line-ignored-stock.move,move",0,Move,Mouvement,0
-field,"sale.line-ignored-stock.move,rec_name",0,Name,Nom,0
-field,"sale.line-ignored-stock.move,sale_line",0,Sale Line,Ligne de vente,0
-field,"sale.line-recreated-stock.move,move",0,Move,Mouvement,0
-field,"sale.line-recreated-stock.move,rec_name",0,Name,Nom,0
-field,"sale.line-recreated-stock.move,sale_line",0,Sale Line,Ligne de vente,0
-field,"sale.sale,comment",0,Comment,Commentaire,0
-field,"sale.sale,company",0,Company,Companie,0
-field,"sale.sale,currency",0,Currency,Devise,0
-field,"sale.sale,currency_digits",0,Currency Digits,Décimales de la devise,0
-field,"sale.sale,description",0,Description,Description,0
-field,"sale.sale,invoice_address",0,Invoice Address,Adresse de facturation,0
-field,"sale.sale,invoice_exception",0,Invoices Exception,Factures en exception,0
-field,"sale.sale,invoice_method",0,Invoice Method,Méthode de facturation,0
-field,"sale.sale,invoice_paid",0,Invoices Paid,Factures payées,0
-field,"sale.sale,invoice_state",0,Invoice State,État de la factutre,0
-field,"sale.sale,invoices",0,Invoices,Factures,0
-field,"sale.sale,invoices_ignored",0,Ignored Invoices,Factures ignorées,0
-field,"sale.sale,invoices_recreated",0,Recreated Invoices,Factures recréées,0
-field,"sale.sale,lines",0,Lines,Lignes,0
-field,"sale.sale,moves",0,Moves,Mouvements,0
-field,"sale.sale,party",0,Party,Tiers,0
-field,"sale.sale,party_lang",0,Party Language,Langue du tiers,0
-field,"sale.sale,payment_term",0,Payment Term,Conditions de paiement,0
-field,"sale.sale,rec_name",0,Name,Nom,0
-field,"sale.sale,reference",0,Reference,Référence,0
-field,"sale.sale,sale_date",0,Sale Date,Date de la vente,0
-field,"sale.sale,shipment_address",0,Shipment Address,Adresse de livraison,0
-field,"sale.sale,shipment_done",0,Shipment Done,Expédition effectuée,0
-field,"sale.sale,shipment_exception",0,Shipments Exception,Expéditions en exception,0
-field,"sale.sale,shipment_method",0,Shipment Method,Méthode de livraison,0
-field,"sale.sale,shipment_state",0,Shipment State,État de l'expédition,0
-field,"sale.sale,shipments",0,Shipments,Expédition,0
-field,"sale.sale,state",0,State,État,0
-field,"sale.sale,tax_amount",0,Tax,Taxe,0
-field,"sale.sale,total_amount",0,Total,Total,0
-field,"sale.sale,untaxed_amount",0,Untaxed,Non-taxé,0
-field,"sale.sale,warehouse",0,Warehouse,Entrepôt,0
-field,"sale.sale-account.invoice,invoice",0,Invoice,Facture,0
-field,"sale.sale-account.invoice,rec_name",0,Name,Nom,0
-field,"sale.sale-account.invoice,sale",0,Sale,Vente,0
-field,"sale.sale-ignored-account.invoice,invoice",0,Invoice,Facture,0
-field,"sale.sale-ignored-account.invoice,rec_name",0,Name,Nom,0
-field,"sale.sale-ignored-account.invoice,sale",0,Sale,Vente,0
-field,"sale.sale-recreated-account.invoice,invoice",0,Invoice,Facture,0
-field,"sale.sale-recreated-account.invoice,rec_name",0,Name,Nom,0
-field,"sale.sale-recreated-account.invoice,sale",0,Sale,Vente,0
-field,"stock.move,sale",0,Sale,Vente,0
-field,"stock.move,sale_exception_state",0,Exception State,État d'exception,0
-field,"stock.move,sale_line",0,Sale Line,Ligne de vente,0
-help,"sale.handle.invoice.exception.ask,recreate_invoices",0,The selected invoices will be recreated. The other ones will be ignored.,Les factures sélectionnées seront recréés. Les autres seront ignorées.,0
-model,"ir.action,name",act_invoice_form,Invoices,Factures,0
-model,"ir.action,name",act_open_customer,Parties associated to Sales,Tiers associés à des ventes,0
-model,"ir.action,name",act_sale_configuration_form,Sale Configuration,Configuration des ventes,0
-model,"ir.action,name",act_sale_form,Sales,Ventes,0
-model,"ir.action,name",act_sale_form2,Sales,Ventes,0
-model,"ir.action,name",act_sale_form_confirmed,Confirmed Sales,Ventes confirmées,0
-model,"ir.action,name",act_sale_form_draft,Draft Sales,Ventes brouillon,0
-model,"ir.action,name",act_sale_form_new,New Sale,Nouvelle vente,0
-model,"ir.action,name",act_sale_form_quotation,Quotation Sales,Devis,0
-model,"ir.action,name",act_shipment_form,Shipments,Expéditions,0
-model,"ir.action,name",report_sale,Sale,Vente,0
-model,"ir.action,name",wizard_invoice_handle_exception,Handle Invoice Exception,Gérer l'exception de facture,0
-model,"ir.action,name",wizard_shipment_handle_exception,Handle Shipment Exception,Gérer l'exception d'expédition,0
-model,"ir.sequence,name",sequence_sale,Sale,Vente,0
-model,"ir.sequence.type,name",sequence_type_sale,Sale,Vente,0
-model,"ir.ui.menu,name",menu_configuration,Configuration,Configuration,0
-model,"ir.ui.menu,name",menu_customer,Parties associated to Sales,Tiers associés à des ventes,0
-model,"ir.ui.menu,name",menu_sale,Sale Management,Gestion des ventes,0
-model,"ir.ui.menu,name",menu_sale_configuration,Sale Configuration,Configuration des ventes,0
-model,"ir.ui.menu,name",menu_sale_form,Sales,Ventes,0
-model,"ir.ui.menu,name",menu_sale_form_confirmed,Confirmed Sales,Ventes confirmées,0
-model,"ir.ui.menu,name",menu_sale_form_draft,Draft Sales,Ventes brouillons,0
-model,"ir.ui.menu,name",menu_sale_form_new,New Sale,Nouvelle vente,0
-model,"ir.ui.menu,name",menu_sale_form_quotation,Quotation Sales,Devis,0
-model,"res.group,name",group_sale,Sale,Vente,0
-model,"res.group,name",group_sale_admin,Sale Administrator,Administrateur des ventes,0
-model,"sale.configuration,name",0,Sale Configuration,Configuration des ventes,0
-model,"sale.handle.invoice.exception.ask,name",0,Invoice Exception Ask,Exception de facture - Demande,0
-model,"sale.handle.shipment.exception.ask,name",0,Shipment Exception Ask,Exception d'expédition - Demande,0
-model,"sale.line,name",0,Sale Line,Ligne de vente,0
-model,"sale.line-account.invoice.line,name",0,Sale Line - Invoice Line,Ligne de vente - Ligne de facture,0
-model,"sale.line-account.tax,name",0,Sale Line - Tax,Ligne de vente - Taxe,0
-model,"sale.line-ignored-stock.move,name",0,Sale Line - Ignored Move,Ligne de vente - Mouvement ignoré,0
-model,"sale.line-recreated-stock.move,name",0,Sale Line - Recreated Move,Ligne de vente - Mouvement recréé,0
-model,"sale.sale,name",0,Sale,Vente,0
-model,"sale.sale-account.invoice,name",0,Sale - Invoice,Vente - Facture,0
-model,"sale.sale-ignored-account.invoice,name",0,Sale - Ignored Invoice,Vente - Facture Ignorée,0
-model,"sale.sale-recreated-account.invoice,name",0,Sale - Recreated Invoice,Vente - Facture recréée,0
-model,"workflow,name",sale_workflow,Sale workflow,Workflow de vente,0
-model,"workflow.activity,name",sale_activity_cancel,Canceled,Annulé,0
-model,"workflow.activity,name",sale_activity_confirmed,Confirmed,Confirmé,0
-model,"workflow.activity,name",sale_activity_done,Done,Fait,0
-model,"workflow.activity,name",sale_activity_draft,Draft,Brouillon,0
-model,"workflow.activity,name",sale_activity_invoice_method,Invoice Method,Méthode de facturation,0
-model,"workflow.activity,name",sale_activity_invoice_method_done,Invoice Method Done,Méthode de facture faite,0
-model,"workflow.activity,name",sale_activity_invoice_sale_done,Invoice Done,Facture faite,0
-model,"workflow.activity,name",sale_activity_invoice_sale_exception,Invoice Exception,Facture en exception,0
-model,"workflow.activity,name",sale_activity_invoice_shipment,Invoice Shipment,Facture expédition,0
-model,"workflow.activity,name",sale_activity_invoice_shipment_done,Invoice Shipment Done,Facture expédition faite,0
-model,"workflow.activity,name",sale_activity_invoice_shipment_exception,Invoice Shipment Exception,Facture expédition en exception,0
-model,"workflow.activity,name",sale_activity_invoice_shipment_method,Invoice Shipment Method,Méthode facture expédition,0
-model,"workflow.activity,name",sale_activity_invoice_shipment_method_done,Invoice Shipment Method Done,Méthode facture expédition faite,0
-model,"workflow.activity,name",sale_activity_quotation,Quotation,Devis,0
-model,"workflow.activity,name",sale_activity_shipment,Shipment,Expédition,0
-model,"workflow.activity,name",sale_activity_shipment_exception,Shipment Exception,Expédition en exception,0
-model,"workflow.activity,name",sale_activity_shipment_invoice,Shipment Invoice,Facture expédition,0
-model,"workflow.activity,name",sale_activity_shipment_invoice_done,Shipment Invoice Done,Facture expédition faite,0
-model,"workflow.activity,name",sale_activity_shipment_invoice_exception,Shipment Invoice Exception,Facture expédition en exception,0
-model,"workflow.activity,name",sale_activity_shipment_invoice_method,Shipment Invoice Method,Méthode facture expédition,0
-model,"workflow.activity,name",sale_activity_shipment_invoice_method_done,Shipment Invoice Method Done,Méthode facture expédition faite,0
-model,"workflow.activity,name",sale_activity_shipment_method,Shipment Method,Méthode d'expédition,0
-model,"workflow.activity,name",sale_activity_shipment_method_done,Shipment Method Done,Méthode d'expédition faite,0
-model,"workflow.activity,name",sale_activity_waiting_invoice_sale,Waiting Invoice,Facture en attente,0
-model,"workflow.activity,name",sale_activity_waiting_invoice_shipment,Waiting Invoice Shipment,Facture expédition en attente,0
-model,"workflow.activity,name",sale_activity_waiting_shipment,Waiting Shipment,Expédition en attente,0
-model,"workflow.activity,name",sale_activity_waiting_shipment_invoice,Waiting Shipment Invoice,Facture expédition en attente,0
-odt,sale.sale,0,Amount,Montant,0
-odt,sale.sale,0,Date:,Date :,0
-odt,sale.sale,0,Description,Description,0
-odt,sale.sale,0,Description:,Description :,0
-odt,sale.sale,0,Draft Sale Order,Bon de commande brouillon,0
-odt,sale.sale,0,E-Mail:,E-Mail :,0
-odt,sale.sale,0,Phone:,Téléphone :,0
-odt,sale.sale,0,Quantity,Quantité,0
-odt,sale.sale,0,Quotation N°:,Devis N° :,0
-odt,sale.sale,0,Sale Order N°:,Bon de commande N° :,0
-odt,sale.sale,0,Taxes,Taxes,0
-odt,sale.sale,0,Taxes:,Taxes :,0
-odt,sale.sale,0,Total (excl. taxes):,Total (HT) :,0
-odt,sale.sale,0,Total:,Total :,0
-odt,sale.sale,0,Unit Price,Prix unitaire,0
-odt,sale.sale,0,VAT Number:,Numéro TVA :,0
-odt,sale.sale,0,VAT:,TVA :,0
-selection,"account.invoice,sale_exception_state",0,,,0
-selection,"account.invoice,sale_exception_state",0,Ignored,Ignoré,0
-selection,"account.invoice,sale_exception_state",0,Recreated,Recréé,0
-selection,"sale.configuration,sale_invoice_method",0,Manual,Manuel,1
-selection,"sale.configuration,sale_invoice_method",0,On Order Confirmed,À la confirmation de la commande,1
-selection,"sale.configuration,sale_invoice_method",0,On Shipment Sent,À la livraison,1
-selection,"sale.configuration,sale_shipment_method",0,Manual,Manuel,1
-selection,"sale.configuration,sale_shipment_method",0,On Invoice Paid,Au paiement de la facture,1
-selection,"sale.configuration,sale_shipment_method",0,On Order Confirmed,À la confirmation de la commande,1
-selection,"sale.line,type",0,Comment,Commentaire,0
-selection,"sale.line,type",0,Line,Ligne,0
-selection,"sale.line,type",0,Subtotal,Sous-total,0
-selection,"sale.line,type",0,Title,Titre,0
-selection,"sale.sale,invoice_method",0,Manual,Manuel,0
-selection,"sale.sale,invoice_method",0,On Order Confirmed,A la confirmation de la commande,0
-selection,"sale.sale,invoice_method",0,On Shipment Sent,À la livraison,0
-selection,"sale.sale,invoice_state",0,Exception,Exception,0
-selection,"sale.sale,invoice_state",0,None,Aucun,0
-selection,"sale.sale,invoice_state",0,Paid,Payé,0
-selection,"sale.sale,invoice_state",0,Waiting,En attente,0
-selection,"sale.sale,shipment_method",0,Manual,Manuel,0
-selection,"sale.sale,shipment_method",0,On Invoice Paid,Au paiement de la facture,0
-selection,"sale.sale,shipment_method",0,On Order Confirmed,À la confirmation de la commande,0
-selection,"sale.sale,shipment_state",0,Exception,Exception,0
-selection,"sale.sale,shipment_state",0,None,Aucun,0
-selection,"sale.sale,shipment_state",0,Sent,Envoyé,0
-selection,"sale.sale,shipment_state",0,Waiting,En attente,0
-selection,"sale.sale,state",0,Canceled,Annulé,0
-selection,"sale.sale,state",0,Confirmed,Confirmé,0
-selection,"sale.sale,state",0,Done,Fait,0
-selection,"sale.sale,state",0,Draft,Brouillon,0
-selection,"sale.sale,state",0,Quotation,Devis,0
-selection,"stock.move,sale_exception_state",0,,,0
-selection,"stock.move,sale_exception_state",0,Ignored,Ignoré,0
-selection,"stock.move,sale_exception_state",0,Recreated,Recréé,0
-view,product.product,0,Customers,Clients,0
-view,product.template,0,Customers,Clients,0
-view,sale.configuration,0,Sale Configuration,Configuration des ventes,0
-view,sale.handle.invoice.exception.ask,0,Choose invoices to recreate,Choisir les factures à recréer,0
-view,sale.handle.invoice.exception.ask,0,Handle Invoice Exception,Gérer l'exception de facture,0
-view,sale.handle.shipment.exception.ask,0,Choose move to recreate,Choisir le mouvement à recréer,0
-view,sale.handle.shipment.exception.ask,0,Handle shipment Exception,Gérer l'exception d'expédition,0
-view,sale.handle.shipment.exception.ask,0,Recreate Moves,Recréer les mouvements,0
-view,sale.line,0,General,Général,0
-view,sale.line,0,Notes,Notes,0
-view,sale.line,0,Products,produits,0
-view,sale.line,0,Sale Line,Ligne de vente,0
-view,sale.line,0,Sale Lines,Lignes de vente,0
-view,sale.sale,0,Cancel,Annuler,0
-view,sale.sale,0,Confirm,Confirmer,0
-view,sale.sale,0,Draft,Brouillon,0
-view,sale.sale,0,Handle Invoice Exception,Gérer l'exception de facture,0
-view,sale.sale,0,Handle Shipment Exception,Gérer l'exception d'expédition,0
-view,sale.sale,0,Ignore Invoice Exception,Ignorer l'exception de facturation ,0
-view,sale.sale,0,Ignore Shipment Exception,Ignorer l'exception de livraison,0
-view,sale.sale,0,Invoices,Factures,0
-view,sale.sale,0,Lines,Lignes,0
-view,sale.sale,0,Moves,Mouvements,0
-view,sale.sale,0,Other Info,Autre informations,0
-view,sale.sale,0,Quotation,Devis,0
-view,sale.sale,0,Sale,Vente,0
-view,sale.sale,0,Sales,Ventes,0
-view,sale.sale,0,Shipments,Expéditions,0
-wizard_button,"sale.handle.invoice.exception,init,end",0,Cancel,Annuler,0
-wizard_button,"sale.handle.invoice.exception,init,ok",0,Ok,Ok,0
-wizard_button,"sale.handle.shipment.exception,init,end",0,Cancel,Annuler,0
-wizard_button,"sale.handle.shipment.exception,init,ok",0,Ok,Ok,0
diff --git a/locale/bg_BG.po b/locale/bg_BG.po
new file mode 100644
index 0000000..8011482
--- /dev/null
+++ b/locale/bg_BG.po
@@ -0,0 +1,996 @@
+# 
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "error:account.invoice:0"
+msgid "You can not delete invoices that come from a sale!"
+msgstr "Не може да изтриете фактура която идва от продажба!"
+
+msgctxt "error:account.invoice:0"
+msgid "You cannot reset to draft an invoice generated by a sale."
+msgstr "Не може да прехвърляте в проект фактура генерирана при продажба."
+
+msgctxt "error:sale.line:0"
+msgid "It misses an \"Account Revenue\" on product \"%s\"!"
+msgstr "Не е зададена \"Сметка за приходи\" за продукт \"%s\"!"
+
+msgctxt "error:sale.line:0"
+msgid "It misses an \"account Revenue\" default property!"
+msgstr "Няма е зададено свойство по подразбиране \"Сметка за приходи\"!"
+
+msgctxt "error:sale.line:0"
+msgid "The customer location is required!"
+msgstr "Местонахождението на клиента е задължително!"
+
+msgctxt "error:sale.sale:0"
+msgid "Invoice and Shipment addresses must be defined for the quotation."
+msgstr "Адрес за фактура и за доставка трябва да са зададени при запитване"
+
+msgctxt "error:sale.sale:0"
+msgid "It misses an \"Account Receivable\" on the party \"%s\"!"
+msgstr "Липсва \"Приходна сметка\" за партньор \"%s\"!"
+
+msgctxt "error:sale.sale:0"
+msgid "Wrong combination of method!"
+msgstr "Грешна комбинация от методи!"
+
+msgctxt "error:stock.shipment.out:0"
+msgid "You cannot reset to draft a move generated by a sale."
+msgstr "Не може да прехвърляте в проект движение генерирано при продажба."
+
+msgctxt "field:account.invoice,sale_exception_state:0"
+msgid "Exception State"
+msgstr "Състояние на грешка"
+
+msgctxt "field:account.invoice,sales:0"
+msgid "Sales"
+msgstr "Продажби"
+
+msgctxt "field:account.invoice.line,sale_lines:0"
+msgid "Sale Lines"
+msgstr "Редове от продажба"
+
+#, fuzzy
+msgctxt "field:product.template,delivery_time:0"
+msgid "Delivery Time"
+msgstr "Време за доставка"
+
+msgctxt "field:product.template,salable:0"
+msgid "Salable"
+msgstr "Продажен"
+
+msgctxt "field:product.template,sale_uom:0"
+msgid "Sale UOM"
+msgstr "Мер. ед. на продажба"
+
+msgctxt "field:sale.configuration,rec_name:0"
+msgid "Name"
+msgstr "Име"
+
+msgctxt "field:sale.configuration,sale_invoice_method:0"
+msgid "Sale Invoice Method"
+msgstr "Начин на фактурине на продажба"
+
+msgctxt "field:sale.configuration,sale_sequence:0"
+msgid "Sale Reference Sequence"
+msgstr "Последователност за отпратка на продажба"
+
+msgctxt "field:sale.configuration,sale_shipment_method:0"
+msgid "Sale Shipment Method"
+msgstr "Начин на фактуриране на продажба"
+
+msgctxt "field:sale.handle.invoice.exception.ask,domain_invoices:0"
+msgid "Domain Invoices"
+msgstr "Фактури на домейн"
+
+msgctxt "field:sale.handle.invoice.exception.ask,recreate_invoices:0"
+msgid "Recreate Invoices"
+msgstr "Наново създаване на фактури"
+
+msgctxt "field:sale.handle.shipment.exception.ask,domain_moves:0"
+msgid "Domain Moves"
+msgstr "Движение на домейн"
+
+msgctxt "field:sale.handle.shipment.exception.ask,recreate_moves:0"
+msgid "Recreate Moves"
+msgstr "Наново създаване на движения"
+
+msgctxt "field:sale.line,amount:0"
+msgid "Amount"
+msgstr "Сума"
+
+msgctxt "field:sale.line,description:0"
+msgid "Description"
+msgstr "Описание"
+
+msgctxt "field:sale.line,invoice_lines:0"
+msgid "Invoice Lines"
+msgstr "Редове от фактура"
+
+msgctxt "field:sale.line,move_done:0"
+msgid "Moves Done"
+msgstr "Направени движения"
+
+msgctxt "field:sale.line,move_exception:0"
+msgid "Moves Exception"
+msgstr "Грешка при движение"
+
+msgctxt "field:sale.line,moves:0"
+msgid "Moves"
+msgstr "Движения"
+
+msgctxt "field:sale.line,moves_ignored:0"
+msgid "Ignored Moves"
+msgstr "Игнорирани движения"
+
+msgctxt "field:sale.line,moves_recreated:0"
+msgid "Recreated Moves"
+msgstr "Наново създаване на движения"
+
+msgctxt "field:sale.line,note:0"
+msgid "Note"
+msgstr "Бележка"
+
+msgctxt "field:sale.line,product:0"
+msgid "Product"
+msgstr "Продукт"
+
+msgctxt "field:sale.line,quantity:0"
+msgid "Quantity"
+msgstr "Количество"
+
+msgctxt "field:sale.line,rec_name:0"
+msgid "Name"
+msgstr "Име"
+
+msgctxt "field:sale.line,sale:0"
+msgid "Sale"
+msgstr "Продажба"
+
+msgctxt "field:sale.line,sequence:0"
+msgid "Sequence"
+msgstr "Последователност"
+
+msgctxt "field:sale.line,taxes:0"
+msgid "Taxes"
+msgstr "Данъци"
+
+msgctxt "field:sale.line,type:0"
+msgid "Type"
+msgstr "Вид"
+
+msgctxt "field:sale.line,unit:0"
+msgid "Unit"
+msgstr "Единица"
+
+msgctxt "field:sale.line,unit_digits:0"
+msgid "Unit Digits"
+msgstr "Десетични единици"
+
+msgctxt "field:sale.line,unit_price:0"
+msgid "Unit Price"
+msgstr "Единична цена"
+
+msgctxt "field:sale.line-account.invoice.line,invoice_line:0"
+msgid "Invoice Line"
+msgstr "Ред от фактура"
+
+msgctxt "field:sale.line-account.invoice.line,rec_name:0"
+msgid "Name"
+msgstr "Име"
+
+msgctxt "field:sale.line-account.invoice.line,sale_line:0"
+msgid "Sale Line"
+msgstr "Ред от продажба"
+
+msgctxt "field:sale.line-account.tax,line:0"
+msgid "Sale Line"
+msgstr "Ред от продажба"
+
+msgctxt "field:sale.line-account.tax,rec_name:0"
+msgid "Name"
+msgstr "Име"
+
+msgctxt "field:sale.line-account.tax,tax:0"
+msgid "Tax"
+msgstr "Данък"
+
+msgctxt "field:sale.line-ignored-stock.move,move:0"
+msgid "Move"
+msgstr "Движение"
+
+msgctxt "field:sale.line-ignored-stock.move,rec_name:0"
+msgid "Name"
+msgstr "Име"
+
+msgctxt "field:sale.line-ignored-stock.move,sale_line:0"
+msgid "Sale Line"
+msgstr "Ред от продажба"
+
+msgctxt "field:sale.line-recreated-stock.move,move:0"
+msgid "Move"
+msgstr "Движение"
+
+msgctxt "field:sale.line-recreated-stock.move,rec_name:0"
+msgid "Name"
+msgstr "Име"
+
+msgctxt "field:sale.line-recreated-stock.move,sale_line:0"
+msgid "Sale Line"
+msgstr "Ред от продажба"
+
+msgctxt "field:sale.sale,comment:0"
+msgid "Comment"
+msgstr "Коментар"
+
+msgctxt "field:sale.sale,company:0"
+msgid "Company"
+msgstr "Фирма"
+
+msgctxt "field:sale.sale,currency:0"
+msgid "Currency"
+msgstr "Валута"
+
+msgctxt "field:sale.sale,currency_digits:0"
+msgid "Currency Digits"
+msgstr "Цифри за валута"
+
+msgctxt "field:sale.sale,description:0"
+msgid "Description"
+msgstr "Описание"
+
+msgctxt "field:sale.sale,invoice_address:0"
+msgid "Invoice Address"
+msgstr "Адрес за фактура"
+
+msgctxt "field:sale.sale,invoice_exception:0"
+msgid "Invoices Exception"
+msgstr "Грешка при фактури"
+
+msgctxt "field:sale.sale,invoice_method:0"
+msgid "Invoice Method"
+msgstr "Начин на фактуриране"
+
+msgctxt "field:sale.sale,invoice_paid:0"
+msgid "Invoices Paid"
+msgstr "Платени фактури"
+
+msgctxt "field:sale.sale,invoice_state:0"
+msgid "Invoice State"
+msgstr "Състояние на фактура"
+
+msgctxt "field:sale.sale,invoices:0"
+msgid "Invoices"
+msgstr "Фактури"
+
+msgctxt "field:sale.sale,invoices_ignored:0"
+msgid "Ignored Invoices"
+msgstr "Игнорирани фактури"
+
+msgctxt "field:sale.sale,invoices_recreated:0"
+msgid "Recreated Invoices"
+msgstr "Наново създадени на фактури"
+
+msgctxt "field:sale.sale,lines:0"
+msgid "Lines"
+msgstr "Редове"
+
+msgctxt "field:sale.sale,moves:0"
+msgid "Moves"
+msgstr "Движения"
+
+msgctxt "field:sale.sale,party:0"
+msgid "Party"
+msgstr "Партньор"
+
+msgctxt "field:sale.sale,party_lang:0"
+msgid "Party Language"
+msgstr "Език на партньор"
+
+msgctxt "field:sale.sale,payment_term:0"
+msgid "Payment Term"
+msgstr "Условие за плащане"
+
+msgctxt "field:sale.sale,rec_name:0"
+msgid "Name"
+msgstr "Име"
+
+msgctxt "field:sale.sale,reference:0"
+msgid "Reference"
+msgstr "Отпратка"
+
+msgctxt "field:sale.sale,sale_date:0"
+msgid "Sale Date"
+msgstr "Дата на продажба"
+
+msgctxt "field:sale.sale,shipment_address:0"
+msgid "Shipment Address"
+msgstr "Адрес за доставка"
+
+msgctxt "field:sale.sale,shipment_done:0"
+msgid "Shipment Done"
+msgstr "Направена пратка"
+
+msgctxt "field:sale.sale,shipment_exception:0"
+msgid "Shipments Exception"
+msgstr "Грешки при пратка"
+
+msgctxt "field:sale.sale,shipment_method:0"
+msgid "Shipment Method"
+msgstr "Начин на изпращане"
+
+msgctxt "field:sale.sale,shipment_state:0"
+msgid "Shipment State"
+msgstr "Състояние на пратка"
+
+msgctxt "field:sale.sale,shipments:0"
+msgid "Shipments"
+msgstr "Изпращания"
+
+msgctxt "field:sale.sale,state:0"
+msgid "State"
+msgstr "Състояние"
+
+msgctxt "field:sale.sale,tax_amount:0"
+msgid "Tax"
+msgstr "Данък"
+
+msgctxt "field:sale.sale,total_amount:0"
+msgid "Total"
+msgstr "Общо"
+
+msgctxt "field:sale.sale,untaxed_amount:0"
+msgid "Untaxed"
+msgstr "Необложен с данък"
+
+msgctxt "field:sale.sale,warehouse:0"
+msgid "Warehouse"
+msgstr "Склад"
+
+msgctxt "field:sale.sale-account.invoice,invoice:0"
+msgid "Invoice"
+msgstr "Фактура"
+
+msgctxt "field:sale.sale-account.invoice,rec_name:0"
+msgid "Name"
+msgstr "Име"
+
+msgctxt "field:sale.sale-account.invoice,sale:0"
+msgid "Sale"
+msgstr "Продажба"
+
+msgctxt "field:sale.sale-ignored-account.invoice,invoice:0"
+msgid "Invoice"
+msgstr "Фактура"
+
+msgctxt "field:sale.sale-ignored-account.invoice,rec_name:0"
+msgid "Name"
+msgstr "Име"
+
+msgctxt "field:sale.sale-ignored-account.invoice,sale:0"
+msgid "Sale"
+msgstr "Продажба"
+
+msgctxt "field:sale.sale-recreated-account.invoice,invoice:0"
+msgid "Invoice"
+msgstr "Фактура"
+
+msgctxt "field:sale.sale-recreated-account.invoice,rec_name:0"
+msgid "Name"
+msgstr "Име"
+
+msgctxt "field:sale.sale-recreated-account.invoice,sale:0"
+msgid "Sale"
+msgstr "Продажба"
+
+msgctxt "field:stock.move,sale:0"
+msgid "Sale"
+msgstr "Продажба"
+
+msgctxt "field:stock.move,sale_exception_state:0"
+msgid "Exception State"
+msgstr "Състояние на грешка"
+
+msgctxt "field:stock.move,sale_line:0"
+msgid "Sale Line"
+msgstr "Ред от продажба"
+
+#, fuzzy
+msgctxt "help:product.template,delivery_time:0"
+msgid "In number of days"
+msgstr "В брой дни"
+
+msgctxt "help:sale.handle.invoice.exception.ask,recreate_invoices:0"
+msgid ""
+"The selected invoices will be recreated. The other ones will be ignored."
+msgstr ""
+"Избраните фактури ще бъдат наново създадени. Останалите ще бъдат игнорирани."
+
+msgctxt "model:ir.action,name:act_invoice_form"
+msgid "Invoices"
+msgstr "Фактури"
+
+msgctxt "model:ir.action,name:act_open_customer"
+msgid "Parties associated to Sales"
+msgstr "Партньори свързани с продажби"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_sale_configuration_form"
+msgid "Sales Configuration"
+msgstr "Конфигурация на продажба"
+
+msgctxt "model:ir.action,name:act_sale_form"
+msgid "Sales"
+msgstr "Продажби"
+
+msgctxt "model:ir.action,name:act_sale_form2"
+msgid "Sales"
+msgstr "Продажби"
+
+msgctxt "model:ir.action,name:act_sale_form_confirmed"
+msgid "Confirmed Sales"
+msgstr "Потвърдени продажби"
+
+msgctxt "model:ir.action,name:act_sale_form_draft"
+msgid "Draft Sales"
+msgstr "Проект на продажби"
+
+msgctxt "model:ir.action,name:act_sale_form_quotation"
+msgid "Quotation Sales"
+msgstr "Продажби (запитвания) "
+
+msgctxt "model:ir.action,name:act_shipment_form"
+msgid "Shipments"
+msgstr "Изпращания"
+
+msgctxt "model:ir.action,name:report_sale"
+msgid "Sale"
+msgstr "Продажба"
+
+msgctxt "model:ir.action,name:wizard_invoice_handle_exception"
+msgid "Handle Invoice Exception"
+msgstr "Обработка на грешка към фактура"
+
+msgctxt "model:ir.action,name:wizard_shipment_handle_exception"
+msgid "Handle Shipment Exception"
+msgstr "Обработка на грешки при изпращане"
+
+msgctxt "model:ir.sequence,name:sequence_sale"
+msgid "Sale"
+msgstr "Продажба"
+
+msgctxt "model:ir.sequence.type,name:sequence_type_sale"
+msgid "Sale"
+msgstr "Продажба"
+
+msgctxt "model:ir.ui.menu,name:menu_configuration"
+msgid "Configuration"
+msgstr "Конфигурация"
+
+msgctxt "model:ir.ui.menu,name:menu_customer"
+msgid "Parties associated to Sales"
+msgstr "Партньори свързани с продажби"
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_sale"
+msgid "Sales"
+msgstr "Управление на продажби"
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_sale_configuration"
+msgid "Sales Configuration"
+msgstr "Конфигурация на продажба"
+
+msgctxt "model:ir.ui.menu,name:menu_sale_form"
+msgid "Sales"
+msgstr "Продажби"
+
+msgctxt "model:ir.ui.menu,name:menu_sale_form_confirmed"
+msgid "Confirmed Sales"
+msgstr "Потвърдени продажби"
+
+msgctxt "model:ir.ui.menu,name:menu_sale_form_draft"
+msgid "Draft Sales"
+msgstr "Проект на продажби"
+
+msgctxt "model:ir.ui.menu,name:menu_sale_form_quotation"
+msgid "Quotation Sales"
+msgstr "Продажби (запитвания) "
+
+#, fuzzy
+msgctxt "model:res.group,name:group_sale"
+msgid "Sales"
+msgstr "Продажба"
+
+#, fuzzy
+msgctxt "model:res.group,name:group_sale_admin"
+msgid "Sales Administrator"
+msgstr "Отговорник продажби"
+
+msgctxt "model:sale.configuration,name:0"
+msgid "Sale Configuration"
+msgstr "Конфигурация на продажба"
+
+msgctxt "model:sale.handle.invoice.exception.ask,name:0"
+msgid "Invoice Exception Ask"
+msgstr "Запитване за грешка в фактура"
+
+msgctxt "model:sale.handle.shipment.exception.ask,name:0"
+msgid "Shipment Exception Ask"
+msgstr "Запитване за грешка при пратка"
+
+msgctxt "model:sale.line,name:0"
+msgid "Sale Line"
+msgstr "Ред от продажба"
+
+msgctxt "model:sale.line-account.invoice.line,name:0"
+msgid "Sale Line - Invoice Line"
+msgstr "Ред от продажба - Ред от фактура"
+
+msgctxt "model:sale.line-account.tax,name:0"
+msgid "Sale Line - Tax"
+msgstr "Ред от продажба - Данък"
+
+msgctxt "model:sale.line-ignored-stock.move,name:0"
+msgid "Sale Line - Ignored Move"
+msgstr "Ред от продажба - Игнорирано движение"
+
+msgctxt "model:sale.line-recreated-stock.move,name:0"
+msgid "Sale Line - Recreated Move"
+msgstr "Ред от продажба - Нановосъздадено движение"
+
+msgctxt "model:sale.sale,name:0"
+msgid "Sale"
+msgstr "Продажба"
+
+msgctxt "model:sale.sale-account.invoice,name:0"
+msgid "Sale - Invoice"
+msgstr "Продажба - фактура"
+
+msgctxt "model:sale.sale-ignored-account.invoice,name:0"
+msgid "Sale - Ignored Invoice"
+msgstr "Продажба - Игнорирани фактури"
+
+msgctxt "model:sale.sale-recreated-account.invoice,name:0"
+msgid "Sale - Recreated Invoice"
+msgstr "Продажба - Наново създадена фактура"
+
+msgctxt "model:workflow,name:sale_workflow"
+msgid "Sale workflow"
+msgstr "Работен процес на продажба"
+
+msgctxt "model:workflow.activity,name:sale_activity_cancel"
+msgid "Canceled"
+msgstr "Отказан"
+
+msgctxt "model:workflow.activity,name:sale_activity_confirmed"
+msgid "Confirmed"
+msgstr "Потвърден"
+
+msgctxt "model:workflow.activity,name:sale_activity_done"
+msgid "Done"
+msgstr "Приключен"
+
+msgctxt "model:workflow.activity,name:sale_activity_draft"
+msgid "Draft"
+msgstr "Проект"
+
+msgctxt "model:workflow.activity,name:sale_activity_invoice_method"
+msgid "Invoice Method"
+msgstr "Начин на фактуриране"
+
+msgctxt "model:workflow.activity,name:sale_activity_invoice_method_done"
+msgid "Invoice Method Done"
+msgstr "Направен начин на фактуриране"
+
+msgctxt "model:workflow.activity,name:sale_activity_invoice_sale_done"
+msgid "Invoice Done"
+msgstr "Направени фактури"
+
+msgctxt "model:workflow.activity,name:sale_activity_invoice_sale_exception"
+msgid "Invoice Exception"
+msgstr "Грешка при фактура"
+
+msgctxt "model:workflow.activity,name:sale_activity_invoice_shipment"
+msgid "Invoice Shipment"
+msgstr "Фактура за изпращане"
+
+msgctxt "model:workflow.activity,name:sale_activity_invoice_shipment_done"
+msgid "Invoice Shipment Done"
+msgstr "Направено фактуриране на пратка"
+
+msgctxt ""
+"model:workflow.activity,name:sale_activity_invoice_shipment_exception"
+msgid "Invoice Shipment Exception"
+msgstr "Грешка при фактуриране на пратка"
+
+msgctxt "model:workflow.activity,name:sale_activity_invoice_shipment_method"
+msgid "Invoice Shipment Method"
+msgstr "Начин на фактуриране на пратка"
+
+msgctxt ""
+"model:workflow.activity,name:sale_activity_invoice_shipment_method_done"
+msgid "Invoice Shipment Method Done"
+msgstr "Направено фактуриране на начина на изпращане"
+
+msgctxt "model:workflow.activity,name:sale_activity_quotation"
+msgid "Quotation"
+msgstr "Запитване"
+
+msgctxt "model:workflow.activity,name:sale_activity_shipment"
+msgid "Shipment"
+msgstr "Пратка"
+
+msgctxt "model:workflow.activity,name:sale_activity_shipment_exception"
+msgid "Shipment Exception"
+msgstr "Грешка при пратка"
+
+msgctxt "model:workflow.activity,name:sale_activity_shipment_invoice"
+msgid "Shipment Invoice"
+msgstr "Пратка с грешка"
+
+msgctxt "model:workflow.activity,name:sale_activity_shipment_invoice_done"
+msgid "Shipment Invoice Done"
+msgstr "Направено фактуриране на пратка"
+
+msgctxt ""
+"model:workflow.activity,name:sale_activity_shipment_invoice_exception"
+msgid "Shipment Invoice Exception"
+msgstr "Грешка при фактуриране на пратка"
+
+msgctxt "model:workflow.activity,name:sale_activity_shipment_invoice_method"
+msgid "Shipment Invoice Method"
+msgstr "Начин на фактуриране на пратка"
+
+msgctxt ""
+"model:workflow.activity,name:sale_activity_shipment_invoice_method_done"
+msgid "Shipment Invoice Method Done"
+msgstr "Направен начин на фактуриране на пратка"
+
+msgctxt "model:workflow.activity,name:sale_activity_shipment_method"
+msgid "Shipment Method"
+msgstr "Начин на изпращане"
+
+msgctxt "model:workflow.activity,name:sale_activity_shipment_method_done"
+msgid "Shipment Method Done"
+msgstr "Направен начин на изпращане"
+
+msgctxt "model:workflow.activity,name:sale_activity_waiting_invoice_sale"
+msgid "Waiting Invoice"
+msgstr "Очакващи фактура"
+
+msgctxt "model:workflow.activity,name:sale_activity_waiting_invoice_shipment"
+msgid "Waiting Invoice Shipment"
+msgstr "Изчакващи фактури за пратки"
+
+msgctxt "model:workflow.activity,name:sale_activity_waiting_shipment"
+msgid "Waiting Shipment"
+msgstr "Очаква изпращане"
+
+msgctxt "model:workflow.activity,name:sale_activity_waiting_shipment_invoice"
+msgid "Waiting Shipment Invoice"
+msgstr "Изчакващи фактури за пратки"
+
+msgctxt "odt:sale.sale:0"
+msgid "Amount"
+msgstr "Сума"
+
+msgctxt "odt:sale.sale:0"
+msgid "Date:"
+msgstr "Дата:"
+
+msgctxt "odt:sale.sale:0"
+msgid "Description"
+msgstr "Описание"
+
+msgctxt "odt:sale.sale:0"
+msgid "Description:"
+msgstr "Описание:"
+
+msgctxt "odt:sale.sale:0"
+msgid "Draft Sale Order"
+msgstr "Проект на поръчка за продажба"
+
+msgctxt "odt:sale.sale:0"
+msgid "E-Mail:"
+msgstr "E-Mail:"
+
+msgctxt "odt:sale.sale:0"
+msgid "Phone:"
+msgstr "Телефон:"
+
+msgctxt "odt:sale.sale:0"
+msgid "Quantity"
+msgstr "Количество"
+
+msgctxt "odt:sale.sale:0"
+msgid "Quotation N°:"
+msgstr "Запитване N°:"
+
+msgctxt "odt:sale.sale:0"
+msgid "Sale Order N°:"
+msgstr "Поръчка за продажба N°:"
+
+msgctxt "odt:sale.sale:0"
+msgid "Taxes"
+msgstr "Данъци"
+
+msgctxt "odt:sale.sale:0"
+msgid "Taxes:"
+msgstr "Данъци:"
+
+msgctxt "odt:sale.sale:0"
+msgid "Total (excl. taxes):"
+msgstr "Общо (без данъци):"
+
+msgctxt "odt:sale.sale:0"
+msgid "Total:"
+msgstr "Общо:"
+
+msgctxt "odt:sale.sale:0"
+msgid "Unit Price"
+msgstr "Единична цена"
+
+msgctxt "odt:sale.sale:0"
+msgid "VAT Number:"
+msgstr ""
+
+msgctxt "odt:sale.sale:0"
+msgid "VAT:"
+msgstr "ДДС:"
+
+msgctxt "selection:account.invoice,sale_exception_state:0"
+msgid ""
+msgstr ""
+
+msgctxt "selection:account.invoice,sale_exception_state:0"
+msgid "Ignored"
+msgstr "Игнорирано"
+
+msgctxt "selection:account.invoice,sale_exception_state:0"
+msgid "Recreated"
+msgstr "Създаден наново"
+
+msgctxt "selection:sale.configuration,sale_invoice_method:0"
+msgid "Manual"
+msgstr "Ръчно"
+
+msgctxt "selection:sale.configuration,sale_invoice_method:0"
+msgid "On Order Confirmed"
+msgstr "При потвърждаване на поръчка"
+
+msgctxt "selection:sale.configuration,sale_invoice_method:0"
+msgid "On Shipment Sent"
+msgstr "При изпращане на пратка"
+
+msgctxt "selection:sale.configuration,sale_shipment_method:0"
+msgid "Manual"
+msgstr "Ръчно"
+
+msgctxt "selection:sale.configuration,sale_shipment_method:0"
+msgid "On Invoice Paid"
+msgstr "При плащане на фактура"
+
+msgctxt "selection:sale.configuration,sale_shipment_method:0"
+msgid "On Order Confirmed"
+msgstr "При потвърждаване на поръчка"
+
+msgctxt "selection:sale.line,type:0"
+msgid "Comment"
+msgstr "Коментар"
+
+msgctxt "selection:sale.line,type:0"
+msgid "Line"
+msgstr "Ред"
+
+msgctxt "selection:sale.line,type:0"
+msgid "Subtotal"
+msgstr "Междинна сума"
+
+msgctxt "selection:sale.line,type:0"
+msgid "Title"
+msgstr "Заглавие"
+
+msgctxt "selection:sale.sale,invoice_method:0"
+msgid "Manual"
+msgstr "Ръчно"
+
+msgctxt "selection:sale.sale,invoice_method:0"
+msgid "On Order Confirmed"
+msgstr "При потвърждаване на поръчка"
+
+msgctxt "selection:sale.sale,invoice_method:0"
+msgid "On Shipment Sent"
+msgstr "При изпращане на пратка"
+
+msgctxt "selection:sale.sale,invoice_state:0"
+msgid "Exception"
+msgstr "Грешка"
+
+msgctxt "selection:sale.sale,invoice_state:0"
+msgid "None"
+msgstr "Няма"
+
+msgctxt "selection:sale.sale,invoice_state:0"
+msgid "Paid"
+msgstr "Платен"
+
+msgctxt "selection:sale.sale,invoice_state:0"
+msgid "Waiting"
+msgstr "Изчакващ"
+
+msgctxt "selection:sale.sale,shipment_method:0"
+msgid "Manual"
+msgstr "Ръчно"
+
+msgctxt "selection:sale.sale,shipment_method:0"
+msgid "On Invoice Paid"
+msgstr "При плащане на фактура"
+
+msgctxt "selection:sale.sale,shipment_method:0"
+msgid "On Order Confirmed"
+msgstr "При потвърждаване на поръчка"
+
+msgctxt "selection:sale.sale,shipment_state:0"
+msgid "Exception"
+msgstr "Грешка"
+
+msgctxt "selection:sale.sale,shipment_state:0"
+msgid "None"
+msgstr "Няма"
+
+msgctxt "selection:sale.sale,shipment_state:0"
+msgid "Sent"
+msgstr "Изпратен"
+
+msgctxt "selection:sale.sale,shipment_state:0"
+msgid "Waiting"
+msgstr "Изчакващ"
+
+msgctxt "selection:sale.sale,state:0"
+msgid "Canceled"
+msgstr "Отказан"
+
+msgctxt "selection:sale.sale,state:0"
+msgid "Confirmed"
+msgstr "Потвърден"
+
+msgctxt "selection:sale.sale,state:0"
+msgid "Done"
+msgstr "Приключен"
+
+msgctxt "selection:sale.sale,state:0"
+msgid "Draft"
+msgstr "Проект"
+
+msgctxt "selection:sale.sale,state:0"
+msgid "Quotation"
+msgstr "Запитване"
+
+msgctxt "selection:stock.move,sale_exception_state:0"
+msgid ""
+msgstr ""
+
+msgctxt "selection:stock.move,sale_exception_state:0"
+msgid "Ignored"
+msgstr "Игнорирано"
+
+msgctxt "selection:stock.move,sale_exception_state:0"
+msgid "Recreated"
+msgstr "Създаден наново"
+
+msgctxt "view:product.template:0"
+msgid "Customers"
+msgstr "Клиенти"
+
+msgctxt "view:sale.configuration:0"
+msgid "Sale Configuration"
+msgstr "Конфигурация на продажба"
+
+msgctxt "view:sale.handle.invoice.exception.ask:0"
+msgid "Choose invoices to recreate"
+msgstr "Избор на фактури за ново създаване"
+
+msgctxt "view:sale.handle.invoice.exception.ask:0"
+msgid "Handle Invoice Exception"
+msgstr "Обработка на грешка към фактура"
+
+msgctxt "view:sale.handle.shipment.exception.ask:0"
+msgid "Choose move to recreate"
+msgstr "Избор на движение за ново създаване"
+
+msgctxt "view:sale.handle.shipment.exception.ask:0"
+msgid "Handle shipment Exception"
+msgstr "Обработване на грешка при изпращане"
+
+msgctxt "view:sale.handle.shipment.exception.ask:0"
+msgid "Recreate Moves"
+msgstr "Наново създаване на движения"
+
+msgctxt "view:sale.line:0"
+msgid "General"
+msgstr "Основен"
+
+msgctxt "view:sale.line:0"
+msgid "Notes"
+msgstr "Бележки"
+
+msgctxt "view:sale.line:0"
+msgid "Products"
+msgstr "Продукти"
+
+msgctxt "view:sale.line:0"
+msgid "Sale Line"
+msgstr "Ред от продажба"
+
+msgctxt "view:sale.line:0"
+msgid "Sale Lines"
+msgstr "Редове от продажба"
+
+msgctxt "view:sale.sale:0"
+msgid "Cancel"
+msgstr "Отказ"
+
+msgctxt "view:sale.sale:0"
+msgid "Confirm"
+msgstr "Потвърждаване"
+
+msgctxt "view:sale.sale:0"
+msgid "Draft"
+msgstr "Проект"
+
+msgctxt "view:sale.sale:0"
+msgid "Handle Invoice Exception"
+msgstr "Обработка на грешка към фактура"
+
+msgctxt "view:sale.sale:0"
+msgid "Handle Shipment Exception"
+msgstr "Обработване на грешка при изпращане"
+
+msgctxt "view:sale.sale:0"
+msgid "Invoices"
+msgstr "Фактури"
+
+msgctxt "view:sale.sale:0"
+msgid "Lines"
+msgstr "Редове"
+
+msgctxt "view:sale.sale:0"
+msgid "Moves"
+msgstr "Движения"
+
+msgctxt "view:sale.sale:0"
+msgid "Other Info"
+msgstr "Друга информация"
+
+msgctxt "view:sale.sale:0"
+msgid "Quotation"
+msgstr "Запитване"
+
+msgctxt "view:sale.sale:0"
+msgid "Sale"
+msgstr "Продажба"
+
+msgctxt "view:sale.sale:0"
+msgid "Sales"
+msgstr "Продажби"
+
+msgctxt "view:sale.sale:0"
+msgid "Shipments"
+msgstr "Изпращания"
+
+msgctxt "wizard_button:sale.handle.invoice.exception,init,end:0"
+msgid "Cancel"
+msgstr "Отказ"
+
+msgctxt "wizard_button:sale.handle.invoice.exception,init,ok:0"
+msgid "Ok"
+msgstr "Добре"
+
+msgctxt "wizard_button:sale.handle.shipment.exception,init,end:0"
+msgid "Cancel"
+msgstr "Отказ"
+
+msgctxt "wizard_button:sale.handle.shipment.exception,init,ok:0"
+msgid "Ok"
+msgstr "Добре"
diff --git a/locale/cs_CZ.po b/locale/cs_CZ.po
new file mode 100644
index 0000000..ad771e2
--- /dev/null
+++ b/locale/cs_CZ.po
@@ -0,0 +1,988 @@
+# 
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "error:account.invoice:0"
+msgid "You can not delete invoices that come from a sale!"
+msgstr ""
+
+msgctxt "error:account.invoice:0"
+msgid "You cannot reset to draft an invoice generated by a sale."
+msgstr ""
+
+msgctxt "error:sale.line:0"
+msgid "It misses an \"Account Revenue\" on product \"%s\"!"
+msgstr ""
+
+msgctxt "error:sale.line:0"
+msgid "It misses an \"account Revenue\" default property!"
+msgstr ""
+
+msgctxt "error:sale.line:0"
+msgid "The customer location is required!"
+msgstr ""
+
+msgctxt "error:sale.sale:0"
+msgid "Invoice and Shipment addresses must be defined for the quotation."
+msgstr ""
+
+msgctxt "error:sale.sale:0"
+msgid "It misses an \"Account Receivable\" on the party \"%s\"!"
+msgstr ""
+
+msgctxt "error:sale.sale:0"
+msgid "Wrong combination of method!"
+msgstr ""
+
+msgctxt "error:stock.shipment.out:0"
+msgid "You cannot reset to draft a move generated by a sale."
+msgstr ""
+
+msgctxt "field:account.invoice,sale_exception_state:0"
+msgid "Exception State"
+msgstr ""
+
+msgctxt "field:account.invoice,sales:0"
+msgid "Sales"
+msgstr ""
+
+msgctxt "field:account.invoice.line,sale_lines:0"
+msgid "Sale Lines"
+msgstr ""
+
+msgctxt "field:product.template,delivery_time:0"
+msgid "Delivery Time"
+msgstr ""
+
+msgctxt "field:product.template,salable:0"
+msgid "Salable"
+msgstr ""
+
+msgctxt "field:product.template,sale_uom:0"
+msgid "Sale UOM"
+msgstr ""
+
+msgctxt "field:sale.configuration,rec_name:0"
+msgid "Name"
+msgstr ""
+
+msgctxt "field:sale.configuration,sale_invoice_method:0"
+msgid "Sale Invoice Method"
+msgstr ""
+
+msgctxt "field:sale.configuration,sale_sequence:0"
+msgid "Sale Reference Sequence"
+msgstr ""
+
+msgctxt "field:sale.configuration,sale_shipment_method:0"
+msgid "Sale Shipment Method"
+msgstr ""
+
+msgctxt "field:sale.handle.invoice.exception.ask,domain_invoices:0"
+msgid "Domain Invoices"
+msgstr ""
+
+msgctxt "field:sale.handle.invoice.exception.ask,recreate_invoices:0"
+msgid "Recreate Invoices"
+msgstr ""
+
+msgctxt "field:sale.handle.shipment.exception.ask,domain_moves:0"
+msgid "Domain Moves"
+msgstr ""
+
+msgctxt "field:sale.handle.shipment.exception.ask,recreate_moves:0"
+msgid "Recreate Moves"
+msgstr ""
+
+msgctxt "field:sale.line,amount:0"
+msgid "Amount"
+msgstr ""
+
+msgctxt "field:sale.line,description:0"
+msgid "Description"
+msgstr ""
+
+msgctxt "field:sale.line,invoice_lines:0"
+msgid "Invoice Lines"
+msgstr ""
+
+msgctxt "field:sale.line,move_done:0"
+msgid "Moves Done"
+msgstr ""
+
+msgctxt "field:sale.line,move_exception:0"
+msgid "Moves Exception"
+msgstr ""
+
+msgctxt "field:sale.line,moves:0"
+msgid "Moves"
+msgstr ""
+
+msgctxt "field:sale.line,moves_ignored:0"
+msgid "Ignored Moves"
+msgstr ""
+
+msgctxt "field:sale.line,moves_recreated:0"
+msgid "Recreated Moves"
+msgstr ""
+
+msgctxt "field:sale.line,note:0"
+msgid "Note"
+msgstr ""
+
+msgctxt "field:sale.line,product:0"
+msgid "Product"
+msgstr ""
+
+msgctxt "field:sale.line,quantity:0"
+msgid "Quantity"
+msgstr ""
+
+msgctxt "field:sale.line,rec_name:0"
+msgid "Name"
+msgstr ""
+
+msgctxt "field:sale.line,sale:0"
+msgid "Sale"
+msgstr ""
+
+msgctxt "field:sale.line,sequence:0"
+msgid "Sequence"
+msgstr ""
+
+msgctxt "field:sale.line,taxes:0"
+msgid "Taxes"
+msgstr ""
+
+msgctxt "field:sale.line,type:0"
+msgid "Type"
+msgstr ""
+
+msgctxt "field:sale.line,unit:0"
+msgid "Unit"
+msgstr ""
+
+msgctxt "field:sale.line,unit_digits:0"
+msgid "Unit Digits"
+msgstr ""
+
+msgctxt "field:sale.line,unit_price:0"
+msgid "Unit Price"
+msgstr ""
+
+msgctxt "field:sale.line-account.invoice.line,invoice_line:0"
+msgid "Invoice Line"
+msgstr ""
+
+msgctxt "field:sale.line-account.invoice.line,rec_name:0"
+msgid "Name"
+msgstr ""
+
+msgctxt "field:sale.line-account.invoice.line,sale_line:0"
+msgid "Sale Line"
+msgstr ""
+
+msgctxt "field:sale.line-account.tax,line:0"
+msgid "Sale Line"
+msgstr ""
+
+msgctxt "field:sale.line-account.tax,rec_name:0"
+msgid "Name"
+msgstr ""
+
+msgctxt "field:sale.line-account.tax,tax:0"
+msgid "Tax"
+msgstr ""
+
+msgctxt "field:sale.line-ignored-stock.move,move:0"
+msgid "Move"
+msgstr ""
+
+msgctxt "field:sale.line-ignored-stock.move,rec_name:0"
+msgid "Name"
+msgstr ""
+
+msgctxt "field:sale.line-ignored-stock.move,sale_line:0"
+msgid "Sale Line"
+msgstr ""
+
+msgctxt "field:sale.line-recreated-stock.move,move:0"
+msgid "Move"
+msgstr ""
+
+msgctxt "field:sale.line-recreated-stock.move,rec_name:0"
+msgid "Name"
+msgstr ""
+
+msgctxt "field:sale.line-recreated-stock.move,sale_line:0"
+msgid "Sale Line"
+msgstr ""
+
+msgctxt "field:sale.sale,comment:0"
+msgid "Comment"
+msgstr ""
+
+msgctxt "field:sale.sale,company:0"
+msgid "Company"
+msgstr ""
+
+msgctxt "field:sale.sale,currency:0"
+msgid "Currency"
+msgstr ""
+
+msgctxt "field:sale.sale,currency_digits:0"
+msgid "Currency Digits"
+msgstr ""
+
+msgctxt "field:sale.sale,description:0"
+msgid "Description"
+msgstr ""
+
+msgctxt "field:sale.sale,invoice_address:0"
+msgid "Invoice Address"
+msgstr ""
+
+msgctxt "field:sale.sale,invoice_exception:0"
+msgid "Invoices Exception"
+msgstr ""
+
+msgctxt "field:sale.sale,invoice_method:0"
+msgid "Invoice Method"
+msgstr ""
+
+msgctxt "field:sale.sale,invoice_paid:0"
+msgid "Invoices Paid"
+msgstr ""
+
+msgctxt "field:sale.sale,invoice_state:0"
+msgid "Invoice State"
+msgstr ""
+
+msgctxt "field:sale.sale,invoices:0"
+msgid "Invoices"
+msgstr ""
+
+msgctxt "field:sale.sale,invoices_ignored:0"
+msgid "Ignored Invoices"
+msgstr ""
+
+msgctxt "field:sale.sale,invoices_recreated:0"
+msgid "Recreated Invoices"
+msgstr ""
+
+msgctxt "field:sale.sale,lines:0"
+msgid "Lines"
+msgstr ""
+
+msgctxt "field:sale.sale,moves:0"
+msgid "Moves"
+msgstr ""
+
+msgctxt "field:sale.sale,party:0"
+msgid "Party"
+msgstr ""
+
+msgctxt "field:sale.sale,party_lang:0"
+msgid "Party Language"
+msgstr ""
+
+msgctxt "field:sale.sale,payment_term:0"
+msgid "Payment Term"
+msgstr ""
+
+msgctxt "field:sale.sale,rec_name:0"
+msgid "Name"
+msgstr ""
+
+msgctxt "field:sale.sale,reference:0"
+msgid "Reference"
+msgstr ""
+
+msgctxt "field:sale.sale,sale_date:0"
+msgid "Sale Date"
+msgstr ""
+
+msgctxt "field:sale.sale,shipment_address:0"
+msgid "Shipment Address"
+msgstr ""
+
+msgctxt "field:sale.sale,shipment_done:0"
+msgid "Shipment Done"
+msgstr ""
+
+msgctxt "field:sale.sale,shipment_exception:0"
+msgid "Shipments Exception"
+msgstr ""
+
+msgctxt "field:sale.sale,shipment_method:0"
+msgid "Shipment Method"
+msgstr ""
+
+msgctxt "field:sale.sale,shipment_state:0"
+msgid "Shipment State"
+msgstr ""
+
+msgctxt "field:sale.sale,shipments:0"
+msgid "Shipments"
+msgstr ""
+
+msgctxt "field:sale.sale,state:0"
+msgid "State"
+msgstr ""
+
+msgctxt "field:sale.sale,tax_amount:0"
+msgid "Tax"
+msgstr ""
+
+msgctxt "field:sale.sale,total_amount:0"
+msgid "Total"
+msgstr ""
+
+msgctxt "field:sale.sale,untaxed_amount:0"
+msgid "Untaxed"
+msgstr ""
+
+msgctxt "field:sale.sale,warehouse:0"
+msgid "Warehouse"
+msgstr ""
+
+msgctxt "field:sale.sale-account.invoice,invoice:0"
+msgid "Invoice"
+msgstr ""
+
+msgctxt "field:sale.sale-account.invoice,rec_name:0"
+msgid "Name"
+msgstr ""
+
+msgctxt "field:sale.sale-account.invoice,sale:0"
+msgid "Sale"
+msgstr ""
+
+msgctxt "field:sale.sale-ignored-account.invoice,invoice:0"
+msgid "Invoice"
+msgstr ""
+
+msgctxt "field:sale.sale-ignored-account.invoice,rec_name:0"
+msgid "Name"
+msgstr ""
+
+msgctxt "field:sale.sale-ignored-account.invoice,sale:0"
+msgid "Sale"
+msgstr ""
+
+msgctxt "field:sale.sale-recreated-account.invoice,invoice:0"
+msgid "Invoice"
+msgstr ""
+
+msgctxt "field:sale.sale-recreated-account.invoice,rec_name:0"
+msgid "Name"
+msgstr ""
+
+msgctxt "field:sale.sale-recreated-account.invoice,sale:0"
+msgid "Sale"
+msgstr ""
+
+msgctxt "field:stock.move,sale:0"
+msgid "Sale"
+msgstr ""
+
+msgctxt "field:stock.move,sale_exception_state:0"
+msgid "Exception State"
+msgstr ""
+
+msgctxt "field:stock.move,sale_line:0"
+msgid "Sale Line"
+msgstr ""
+
+msgctxt "help:product.template,delivery_time:0"
+msgid "In number of days"
+msgstr ""
+
+msgctxt "help:sale.handle.invoice.exception.ask,recreate_invoices:0"
+msgid ""
+"The selected invoices will be recreated. The other ones will be ignored."
+msgstr ""
+
+msgctxt "model:ir.action,name:act_invoice_form"
+msgid "Invoices"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_open_customer"
+msgid "Parties associated to Sales"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_sale_configuration_form"
+msgid "Sales Configuration"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_sale_form"
+msgid "Sales"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_sale_form2"
+msgid "Sales"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_sale_form_confirmed"
+msgid "Confirmed Sales"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_sale_form_draft"
+msgid "Draft Sales"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_sale_form_quotation"
+msgid "Quotation Sales"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_shipment_form"
+msgid "Shipments"
+msgstr ""
+
+msgctxt "model:ir.action,name:report_sale"
+msgid "Sale"
+msgstr ""
+
+msgctxt "model:ir.action,name:wizard_invoice_handle_exception"
+msgid "Handle Invoice Exception"
+msgstr ""
+
+msgctxt "model:ir.action,name:wizard_shipment_handle_exception"
+msgid "Handle Shipment Exception"
+msgstr ""
+
+msgctxt "model:ir.sequence,name:sequence_sale"
+msgid "Sale"
+msgstr ""
+
+msgctxt "model:ir.sequence.type,name:sequence_type_sale"
+msgid "Sale"
+msgstr ""
+
+msgctxt "model:ir.ui.menu,name:menu_configuration"
+msgid "Configuration"
+msgstr ""
+
+msgctxt "model:ir.ui.menu,name:menu_customer"
+msgid "Parties associated to Sales"
+msgstr ""
+
+msgctxt "model:ir.ui.menu,name:menu_sale"
+msgid "Sales"
+msgstr ""
+
+msgctxt "model:ir.ui.menu,name:menu_sale_configuration"
+msgid "Sales Configuration"
+msgstr ""
+
+msgctxt "model:ir.ui.menu,name:menu_sale_form"
+msgid "Sales"
+msgstr ""
+
+msgctxt "model:ir.ui.menu,name:menu_sale_form_confirmed"
+msgid "Confirmed Sales"
+msgstr ""
+
+msgctxt "model:ir.ui.menu,name:menu_sale_form_draft"
+msgid "Draft Sales"
+msgstr ""
+
+msgctxt "model:ir.ui.menu,name:menu_sale_form_quotation"
+msgid "Quotation Sales"
+msgstr ""
+
+msgctxt "model:res.group,name:group_sale"
+msgid "Sales"
+msgstr ""
+
+msgctxt "model:res.group,name:group_sale_admin"
+msgid "Sales Administrator"
+msgstr ""
+
+msgctxt "model:sale.configuration,name:0"
+msgid "Sale Configuration"
+msgstr ""
+
+msgctxt "model:sale.handle.invoice.exception.ask,name:0"
+msgid "Invoice Exception Ask"
+msgstr ""
+
+msgctxt "model:sale.handle.shipment.exception.ask,name:0"
+msgid "Shipment Exception Ask"
+msgstr ""
+
+msgctxt "model:sale.line,name:0"
+msgid "Sale Line"
+msgstr ""
+
+msgctxt "model:sale.line-account.invoice.line,name:0"
+msgid "Sale Line - Invoice Line"
+msgstr ""
+
+msgctxt "model:sale.line-account.tax,name:0"
+msgid "Sale Line - Tax"
+msgstr ""
+
+msgctxt "model:sale.line-ignored-stock.move,name:0"
+msgid "Sale Line - Ignored Move"
+msgstr ""
+
+msgctxt "model:sale.line-recreated-stock.move,name:0"
+msgid "Sale Line - Recreated Move"
+msgstr ""
+
+msgctxt "model:sale.sale,name:0"
+msgid "Sale"
+msgstr ""
+
+msgctxt "model:sale.sale-account.invoice,name:0"
+msgid "Sale - Invoice"
+msgstr ""
+
+msgctxt "model:sale.sale-ignored-account.invoice,name:0"
+msgid "Sale - Ignored Invoice"
+msgstr ""
+
+msgctxt "model:sale.sale-recreated-account.invoice,name:0"
+msgid "Sale - Recreated Invoice"
+msgstr ""
+
+msgctxt "model:workflow,name:sale_workflow"
+msgid "Sale workflow"
+msgstr ""
+
+msgctxt "model:workflow.activity,name:sale_activity_cancel"
+msgid "Canceled"
+msgstr ""
+
+msgctxt "model:workflow.activity,name:sale_activity_confirmed"
+msgid "Confirmed"
+msgstr ""
+
+msgctxt "model:workflow.activity,name:sale_activity_done"
+msgid "Done"
+msgstr ""
+
+msgctxt "model:workflow.activity,name:sale_activity_draft"
+msgid "Draft"
+msgstr ""
+
+msgctxt "model:workflow.activity,name:sale_activity_invoice_method"
+msgid "Invoice Method"
+msgstr ""
+
+msgctxt "model:workflow.activity,name:sale_activity_invoice_method_done"
+msgid "Invoice Method Done"
+msgstr ""
+
+msgctxt "model:workflow.activity,name:sale_activity_invoice_sale_done"
+msgid "Invoice Done"
+msgstr ""
+
+msgctxt "model:workflow.activity,name:sale_activity_invoice_sale_exception"
+msgid "Invoice Exception"
+msgstr ""
+
+msgctxt "model:workflow.activity,name:sale_activity_invoice_shipment"
+msgid "Invoice Shipment"
+msgstr ""
+
+msgctxt "model:workflow.activity,name:sale_activity_invoice_shipment_done"
+msgid "Invoice Shipment Done"
+msgstr ""
+
+msgctxt ""
+"model:workflow.activity,name:sale_activity_invoice_shipment_exception"
+msgid "Invoice Shipment Exception"
+msgstr ""
+
+msgctxt "model:workflow.activity,name:sale_activity_invoice_shipment_method"
+msgid "Invoice Shipment Method"
+msgstr ""
+
+msgctxt ""
+"model:workflow.activity,name:sale_activity_invoice_shipment_method_done"
+msgid "Invoice Shipment Method Done"
+msgstr ""
+
+msgctxt "model:workflow.activity,name:sale_activity_quotation"
+msgid "Quotation"
+msgstr ""
+
+msgctxt "model:workflow.activity,name:sale_activity_shipment"
+msgid "Shipment"
+msgstr ""
+
+msgctxt "model:workflow.activity,name:sale_activity_shipment_exception"
+msgid "Shipment Exception"
+msgstr ""
+
+msgctxt "model:workflow.activity,name:sale_activity_shipment_invoice"
+msgid "Shipment Invoice"
+msgstr ""
+
+msgctxt "model:workflow.activity,name:sale_activity_shipment_invoice_done"
+msgid "Shipment Invoice Done"
+msgstr ""
+
+msgctxt ""
+"model:workflow.activity,name:sale_activity_shipment_invoice_exception"
+msgid "Shipment Invoice Exception"
+msgstr ""
+
+msgctxt "model:workflow.activity,name:sale_activity_shipment_invoice_method"
+msgid "Shipment Invoice Method"
+msgstr ""
+
+msgctxt ""
+"model:workflow.activity,name:sale_activity_shipment_invoice_method_done"
+msgid "Shipment Invoice Method Done"
+msgstr ""
+
+msgctxt "model:workflow.activity,name:sale_activity_shipment_method"
+msgid "Shipment Method"
+msgstr ""
+
+msgctxt "model:workflow.activity,name:sale_activity_shipment_method_done"
+msgid "Shipment Method Done"
+msgstr ""
+
+msgctxt "model:workflow.activity,name:sale_activity_waiting_invoice_sale"
+msgid "Waiting Invoice"
+msgstr ""
+
+msgctxt "model:workflow.activity,name:sale_activity_waiting_invoice_shipment"
+msgid "Waiting Invoice Shipment"
+msgstr ""
+
+msgctxt "model:workflow.activity,name:sale_activity_waiting_shipment"
+msgid "Waiting Shipment"
+msgstr ""
+
+msgctxt "model:workflow.activity,name:sale_activity_waiting_shipment_invoice"
+msgid "Waiting Shipment Invoice"
+msgstr ""
+
+msgctxt "odt:sale.sale:0"
+msgid "Amount"
+msgstr ""
+
+msgctxt "odt:sale.sale:0"
+msgid "Date:"
+msgstr ""
+
+msgctxt "odt:sale.sale:0"
+msgid "Description"
+msgstr ""
+
+msgctxt "odt:sale.sale:0"
+msgid "Description:"
+msgstr ""
+
+msgctxt "odt:sale.sale:0"
+msgid "Draft Sale Order"
+msgstr ""
+
+msgctxt "odt:sale.sale:0"
+msgid "E-Mail:"
+msgstr ""
+
+msgctxt "odt:sale.sale:0"
+msgid "Phone:"
+msgstr ""
+
+msgctxt "odt:sale.sale:0"
+msgid "Quantity"
+msgstr ""
+
+msgctxt "odt:sale.sale:0"
+msgid "Quotation N°:"
+msgstr ""
+
+msgctxt "odt:sale.sale:0"
+msgid "Sale Order N°:"
+msgstr ""
+
+msgctxt "odt:sale.sale:0"
+msgid "Taxes"
+msgstr ""
+
+msgctxt "odt:sale.sale:0"
+msgid "Taxes:"
+msgstr ""
+
+msgctxt "odt:sale.sale:0"
+msgid "Total (excl. taxes):"
+msgstr ""
+
+msgctxt "odt:sale.sale:0"
+msgid "Total:"
+msgstr ""
+
+msgctxt "odt:sale.sale:0"
+msgid "Unit Price"
+msgstr ""
+
+msgctxt "odt:sale.sale:0"
+msgid "VAT Number:"
+msgstr ""
+
+msgctxt "odt:sale.sale:0"
+msgid "VAT:"
+msgstr ""
+
+msgctxt "selection:account.invoice,sale_exception_state:0"
+msgid ""
+msgstr ""
+
+msgctxt "selection:account.invoice,sale_exception_state:0"
+msgid "Ignored"
+msgstr ""
+
+msgctxt "selection:account.invoice,sale_exception_state:0"
+msgid "Recreated"
+msgstr ""
+
+msgctxt "selection:sale.configuration,sale_invoice_method:0"
+msgid "Manual"
+msgstr ""
+
+msgctxt "selection:sale.configuration,sale_invoice_method:0"
+msgid "On Order Confirmed"
+msgstr ""
+
+msgctxt "selection:sale.configuration,sale_invoice_method:0"
+msgid "On Shipment Sent"
+msgstr ""
+
+msgctxt "selection:sale.configuration,sale_shipment_method:0"
+msgid "Manual"
+msgstr ""
+
+msgctxt "selection:sale.configuration,sale_shipment_method:0"
+msgid "On Invoice Paid"
+msgstr ""
+
+msgctxt "selection:sale.configuration,sale_shipment_method:0"
+msgid "On Order Confirmed"
+msgstr ""
+
+msgctxt "selection:sale.line,type:0"
+msgid "Comment"
+msgstr ""
+
+msgctxt "selection:sale.line,type:0"
+msgid "Line"
+msgstr ""
+
+msgctxt "selection:sale.line,type:0"
+msgid "Subtotal"
+msgstr ""
+
+msgctxt "selection:sale.line,type:0"
+msgid "Title"
+msgstr ""
+
+msgctxt "selection:sale.sale,invoice_method:0"
+msgid "Manual"
+msgstr ""
+
+msgctxt "selection:sale.sale,invoice_method:0"
+msgid "On Order Confirmed"
+msgstr ""
+
+msgctxt "selection:sale.sale,invoice_method:0"
+msgid "On Shipment Sent"
+msgstr ""
+
+msgctxt "selection:sale.sale,invoice_state:0"
+msgid "Exception"
+msgstr ""
+
+msgctxt "selection:sale.sale,invoice_state:0"
+msgid "None"
+msgstr ""
+
+msgctxt "selection:sale.sale,invoice_state:0"
+msgid "Paid"
+msgstr ""
+
+msgctxt "selection:sale.sale,invoice_state:0"
+msgid "Waiting"
+msgstr ""
+
+msgctxt "selection:sale.sale,shipment_method:0"
+msgid "Manual"
+msgstr ""
+
+msgctxt "selection:sale.sale,shipment_method:0"
+msgid "On Invoice Paid"
+msgstr ""
+
+msgctxt "selection:sale.sale,shipment_method:0"
+msgid "On Order Confirmed"
+msgstr ""
+
+msgctxt "selection:sale.sale,shipment_state:0"
+msgid "Exception"
+msgstr ""
+
+msgctxt "selection:sale.sale,shipment_state:0"
+msgid "None"
+msgstr ""
+
+msgctxt "selection:sale.sale,shipment_state:0"
+msgid "Sent"
+msgstr ""
+
+msgctxt "selection:sale.sale,shipment_state:0"
+msgid "Waiting"
+msgstr ""
+
+msgctxt "selection:sale.sale,state:0"
+msgid "Canceled"
+msgstr ""
+
+msgctxt "selection:sale.sale,state:0"
+msgid "Confirmed"
+msgstr ""
+
+msgctxt "selection:sale.sale,state:0"
+msgid "Done"
+msgstr ""
+
+msgctxt "selection:sale.sale,state:0"
+msgid "Draft"
+msgstr ""
+
+msgctxt "selection:sale.sale,state:0"
+msgid "Quotation"
+msgstr ""
+
+msgctxt "selection:stock.move,sale_exception_state:0"
+msgid ""
+msgstr ""
+
+msgctxt "selection:stock.move,sale_exception_state:0"
+msgid "Ignored"
+msgstr ""
+
+msgctxt "selection:stock.move,sale_exception_state:0"
+msgid "Recreated"
+msgstr ""
+
+msgctxt "view:product.template:0"
+msgid "Customers"
+msgstr ""
+
+msgctxt "view:sale.configuration:0"
+msgid "Sale Configuration"
+msgstr ""
+
+msgctxt "view:sale.handle.invoice.exception.ask:0"
+msgid "Choose invoices to recreate"
+msgstr ""
+
+msgctxt "view:sale.handle.invoice.exception.ask:0"
+msgid "Handle Invoice Exception"
+msgstr ""
+
+msgctxt "view:sale.handle.shipment.exception.ask:0"
+msgid "Choose move to recreate"
+msgstr ""
+
+msgctxt "view:sale.handle.shipment.exception.ask:0"
+msgid "Handle shipment Exception"
+msgstr ""
+
+msgctxt "view:sale.handle.shipment.exception.ask:0"
+msgid "Recreate Moves"
+msgstr ""
+
+msgctxt "view:sale.line:0"
+msgid "General"
+msgstr ""
+
+msgctxt "view:sale.line:0"
+msgid "Notes"
+msgstr ""
+
+msgctxt "view:sale.line:0"
+msgid "Products"
+msgstr ""
+
+msgctxt "view:sale.line:0"
+msgid "Sale Line"
+msgstr ""
+
+msgctxt "view:sale.line:0"
+msgid "Sale Lines"
+msgstr ""
+
+msgctxt "view:sale.sale:0"
+msgid "Cancel"
+msgstr ""
+
+msgctxt "view:sale.sale:0"
+msgid "Confirm"
+msgstr ""
+
+msgctxt "view:sale.sale:0"
+msgid "Draft"
+msgstr ""
+
+msgctxt "view:sale.sale:0"
+msgid "Handle Invoice Exception"
+msgstr ""
+
+msgctxt "view:sale.sale:0"
+msgid "Handle Shipment Exception"
+msgstr ""
+
+msgctxt "view:sale.sale:0"
+msgid "Invoices"
+msgstr ""
+
+msgctxt "view:sale.sale:0"
+msgid "Lines"
+msgstr ""
+
+msgctxt "view:sale.sale:0"
+msgid "Moves"
+msgstr ""
+
+msgctxt "view:sale.sale:0"
+msgid "Other Info"
+msgstr ""
+
+msgctxt "view:sale.sale:0"
+msgid "Quotation"
+msgstr ""
+
+msgctxt "view:sale.sale:0"
+msgid "Sale"
+msgstr ""
+
+msgctxt "view:sale.sale:0"
+msgid "Sales"
+msgstr ""
+
+msgctxt "view:sale.sale:0"
+msgid "Shipments"
+msgstr ""
+
+msgctxt "wizard_button:sale.handle.invoice.exception,init,end:0"
+msgid "Cancel"
+msgstr ""
+
+msgctxt "wizard_button:sale.handle.invoice.exception,init,ok:0"
+msgid "Ok"
+msgstr ""
+
+msgctxt "wizard_button:sale.handle.shipment.exception,init,end:0"
+msgid "Cancel"
+msgstr ""
+
+msgctxt "wizard_button:sale.handle.shipment.exception,init,ok:0"
+msgid "Ok"
+msgstr ""
diff --git a/locale/de_DE.po b/locale/de_DE.po
new file mode 100644
index 0000000..d748bc1
--- /dev/null
+++ b/locale/de_DE.po
@@ -0,0 +1,1015 @@
+# 
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "error:account.invoice:0"
+msgid "You can not delete invoices that come from a sale!"
+msgstr ""
+"Durch einen Verkauf generierte Rechnungen können nicht gelöscht werden!"
+
+msgctxt "error:account.invoice:0"
+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."
+
+msgctxt "error:sale.line:0"
+msgid "It misses an \"Account Revenue\" on product \"%s\"!"
+msgstr "Es ist kein Ertragskonto für Artikel \"%s\" definiert!"
+
+msgctxt "error:sale.line:0"
+msgid "It misses an \"account Revenue\" default property!"
+msgstr "Es ist keine Standardeigenschaft für das Ertragskonto definiert!"
+
+msgctxt "error:sale.line:0"
+msgid "The customer location is required!"
+msgstr "Der Lagerort des Kunden muss eingegeben werden!"
+
+msgctxt "error:sale.sale:0"
+msgid "Invoice and Shipment addresses must be defined for the quotation."
+msgstr "Rechnungs- und Lieferadresse müssen für das Angebot eingetragen sein!"
+
+msgctxt "error:sale.sale:0"
+msgid "It misses an \"Account Receivable\" on the party \"%s\"!"
+msgstr "Es ist kein Forderungskonto für Partei \"%s\" definiert!"
+
+msgctxt "error:sale.sale:0"
+msgid "Wrong combination of method!"
+msgstr "Ungültige Kombination von Methoden!"
+
+msgctxt "error:stock.shipment.out:0"
+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."
+
+msgctxt "field:account.invoice,sale_exception_state:0"
+msgid "Exception State"
+msgstr "Vorbehalt Status"
+
+msgctxt "field:account.invoice,sales:0"
+msgid "Sales"
+msgstr "Verkäufe"
+
+msgctxt "field:account.invoice.line,sale_lines:0"
+msgid "Sale Lines"
+msgstr "Positionen Verkauf"
+
+msgctxt "field:product.template,delivery_time:0"
+msgid "Delivery Time"
+msgstr "Lieferfrist"
+
+msgctxt "field:product.template,salable:0"
+msgid "Salable"
+msgstr "Verkäuflich"
+
+msgctxt "field:product.template,sale_uom:0"
+msgid "Sale UOM"
+msgstr "Einheit Verkauf"
+
+msgctxt "field:sale.configuration,rec_name:0"
+msgid "Name"
+msgstr "Name"
+
+msgctxt "field:sale.configuration,sale_invoice_method:0"
+msgid "Sale Invoice Method"
+msgstr "Rechnungsstellung Verkauf"
+
+msgctxt "field:sale.configuration,sale_sequence:0"
+msgid "Sale Reference Sequence"
+msgstr "Nummernkreis Verkauf"
+
+msgctxt "field:sale.configuration,sale_shipment_method:0"
+msgid "Sale Shipment Method"
+msgstr "Liefermethode Verkauf"
+
+msgctxt "field:sale.handle.invoice.exception.ask,domain_invoices:0"
+msgid "Domain Invoices"
+msgstr "Wertebereich Rechnungen (Domain)"
+
+msgctxt "field:sale.handle.invoice.exception.ask,recreate_invoices:0"
+msgid "Recreate Invoices"
+msgstr "Rechnungen nachbilden"
+
+msgctxt "field:sale.handle.shipment.exception.ask,domain_moves:0"
+msgid "Domain Moves"
+msgstr "Wertebereich Bewegungen (Domain)"
+
+msgctxt "field:sale.handle.shipment.exception.ask,recreate_moves:0"
+msgid "Recreate Moves"
+msgstr "Bewegungen nachbilden"
+
+msgctxt "field:sale.line,amount:0"
+msgid "Amount"
+msgstr "Betrag"
+
+msgctxt "field:sale.line,description:0"
+msgid "Description"
+msgstr "Bezeichnung"
+
+msgctxt "field:sale.line,invoice_lines:0"
+msgid "Invoice Lines"
+msgstr "Rechnungspositionen"
+
+msgctxt "field:sale.line,move_done:0"
+msgid "Moves Done"
+msgstr "Bewegungen erledigt"
+
+msgctxt "field:sale.line,move_exception:0"
+msgid "Moves Exception"
+msgstr "Bewegungsvorbehalt"
+
+msgctxt "field:sale.line,moves:0"
+msgid "Moves"
+msgstr "Bewegungen"
+
+msgctxt "field:sale.line,moves_ignored:0"
+msgid "Ignored Moves"
+msgstr "Ignorierte Bewegungen"
+
+msgctxt "field:sale.line,moves_recreated:0"
+msgid "Recreated Moves"
+msgstr "Nachgebildete Bewegungen"
+
+msgctxt "field:sale.line,note:0"
+msgid "Note"
+msgstr "Notiz"
+
+msgctxt "field:sale.line,product:0"
+msgid "Product"
+msgstr "Artikel"
+
+msgctxt "field:sale.line,quantity:0"
+msgid "Quantity"
+msgstr "Anzahl"
+
+msgctxt "field:sale.line,rec_name:0"
+msgid "Name"
+msgstr "Name"
+
+msgctxt "field:sale.line,sale:0"
+msgid "Sale"
+msgstr "Verkauf"
+
+msgctxt "field:sale.line,sequence:0"
+msgid "Sequence"
+msgstr "Reihenfolge"
+
+msgctxt "field:sale.line,taxes:0"
+msgid "Taxes"
+msgstr "Steuern"
+
+msgctxt "field:sale.line,type:0"
+msgid "Type"
+msgstr "Typ"
+
+msgctxt "field:sale.line,unit:0"
+msgid "Unit"
+msgstr "Einheit"
+
+msgctxt "field:sale.line,unit_digits:0"
+msgid "Unit Digits"
+msgstr "Anzahl Stellen"
+
+msgctxt "field:sale.line,unit_price:0"
+msgid "Unit Price"
+msgstr "Einzelpreis"
+
+msgctxt "field:sale.line-account.invoice.line,invoice_line:0"
+msgid "Invoice Line"
+msgstr "Rechnungsposition"
+
+msgctxt "field:sale.line-account.invoice.line,rec_name:0"
+msgid "Name"
+msgstr "Name"
+
+msgctxt "field:sale.line-account.invoice.line,sale_line:0"
+msgid "Sale Line"
+msgstr "Position Verkauf"
+
+msgctxt "field:sale.line-account.tax,line:0"
+msgid "Sale Line"
+msgstr "Position Verkauf"
+
+msgctxt "field:sale.line-account.tax,rec_name:0"
+msgid "Name"
+msgstr "Name"
+
+msgctxt "field:sale.line-account.tax,tax:0"
+msgid "Tax"
+msgstr "Steuer"
+
+msgctxt "field:sale.line-ignored-stock.move,move:0"
+msgid "Move"
+msgstr "Bewegung"
+
+msgctxt "field:sale.line-ignored-stock.move,rec_name:0"
+msgid "Name"
+msgstr "Name"
+
+msgctxt "field:sale.line-ignored-stock.move,sale_line:0"
+msgid "Sale Line"
+msgstr "Position Verkauf"
+
+msgctxt "field:sale.line-recreated-stock.move,move:0"
+msgid "Move"
+msgstr "Bewegung"
+
+msgctxt "field:sale.line-recreated-stock.move,rec_name:0"
+msgid "Name"
+msgstr "Name"
+
+msgctxt "field:sale.line-recreated-stock.move,sale_line:0"
+msgid "Sale Line"
+msgstr "Position Verkauf"
+
+msgctxt "field:sale.sale,comment:0"
+msgid "Comment"
+msgstr "Kommentar"
+
+msgctxt "field:sale.sale,company:0"
+msgid "Company"
+msgstr "Unternehmen"
+
+msgctxt "field:sale.sale,currency:0"
+msgid "Currency"
+msgstr "Währung"
+
+msgctxt "field:sale.sale,currency_digits:0"
+msgid "Currency Digits"
+msgstr "Währung (signifikante Stellen)"
+
+msgctxt "field:sale.sale,description:0"
+msgid "Description"
+msgstr "Beschreibung"
+
+msgctxt "field:sale.sale,invoice_address:0"
+msgid "Invoice Address"
+msgstr "Rechnungsadresse"
+
+msgctxt "field:sale.sale,invoice_exception:0"
+msgid "Invoices Exception"
+msgstr "Rechnungsvorbehalt"
+
+msgctxt "field:sale.sale,invoice_method:0"
+msgid "Invoice Method"
+msgstr "Rechnungsstellung"
+
+msgctxt "field:sale.sale,invoice_paid:0"
+msgid "Invoices Paid"
+msgstr "Bezahlte Rechnungen"
+
+msgctxt "field:sale.sale,invoice_state:0"
+msgid "Invoice State"
+msgstr "Rechnungsstatus"
+
+msgctxt "field:sale.sale,invoices:0"
+msgid "Invoices"
+msgstr "Rechnungen"
+
+msgctxt "field:sale.sale,invoices_ignored:0"
+msgid "Ignored Invoices"
+msgstr "Ignorierte Rechnungen"
+
+msgctxt "field:sale.sale,invoices_recreated:0"
+msgid "Recreated Invoices"
+msgstr "Nachgebildete Rechnungen"
+
+msgctxt "field:sale.sale,lines:0"
+msgid "Lines"
+msgstr "Positionen"
+
+msgctxt "field:sale.sale,moves:0"
+msgid "Moves"
+msgstr "Bewegungen"
+
+msgctxt "field:sale.sale,party:0"
+msgid "Party"
+msgstr "Partei"
+
+msgctxt "field:sale.sale,party_lang:0"
+msgid "Party Language"
+msgstr "Sprache Partei"
+
+msgctxt "field:sale.sale,payment_term:0"
+msgid "Payment Term"
+msgstr "Zahlungsbedingung"
+
+msgctxt "field:sale.sale,rec_name:0"
+msgid "Name"
+msgstr "Name"
+
+msgctxt "field:sale.sale,reference:0"
+msgid "Reference"
+msgstr "Beleg-Nr."
+
+msgctxt "field:sale.sale,sale_date:0"
+msgid "Sale Date"
+msgstr "Verkaufsdatum"
+
+msgctxt "field:sale.sale,shipment_address:0"
+msgid "Shipment Address"
+msgstr "Lieferadresse"
+
+msgctxt "field:sale.sale,shipment_done:0"
+msgid "Shipment Done"
+msgstr "Gepackt"
+
+msgctxt "field:sale.sale,shipment_exception:0"
+msgid "Shipments Exception"
+msgstr "Lieferungsvorbehalt"
+
+msgctxt "field:sale.sale,shipment_method:0"
+msgid "Shipment Method"
+msgstr "Liefermethode"
+
+msgctxt "field:sale.sale,shipment_state:0"
+msgid "Shipment State"
+msgstr "Lieferstatus"
+
+msgctxt "field:sale.sale,shipments:0"
+msgid "Shipments"
+msgstr "Lieferposten"
+
+msgctxt "field:sale.sale,state:0"
+msgid "State"
+msgstr "Status"
+
+msgctxt "field:sale.sale,tax_amount:0"
+msgid "Tax"
+msgstr "Steuer"
+
+msgctxt "field:sale.sale,total_amount:0"
+msgid "Total"
+msgstr "Gesamt"
+
+msgctxt "field:sale.sale,untaxed_amount:0"
+msgid "Untaxed"
+msgstr "Netto"
+
+msgctxt "field:sale.sale,warehouse:0"
+msgid "Warehouse"
+msgstr "Warenlager"
+
+msgctxt "field:sale.sale-account.invoice,invoice:0"
+msgid "Invoice"
+msgstr "Rechnung"
+
+msgctxt "field:sale.sale-account.invoice,rec_name:0"
+msgid "Name"
+msgstr "Name"
+
+msgctxt "field:sale.sale-account.invoice,sale:0"
+msgid "Sale"
+msgstr "Verkauf"
+
+msgctxt "field:sale.sale-ignored-account.invoice,invoice:0"
+msgid "Invoice"
+msgstr "Rechnung"
+
+msgctxt "field:sale.sale-ignored-account.invoice,rec_name:0"
+msgid "Name"
+msgstr "Name"
+
+msgctxt "field:sale.sale-ignored-account.invoice,sale:0"
+msgid "Sale"
+msgstr "Verkauf"
+
+msgctxt "field:sale.sale-recreated-account.invoice,invoice:0"
+msgid "Invoice"
+msgstr "Rechnung"
+
+msgctxt "field:sale.sale-recreated-account.invoice,rec_name:0"
+msgid "Name"
+msgstr "Name"
+
+msgctxt "field:sale.sale-recreated-account.invoice,sale:0"
+msgid "Sale"
+msgstr "Verkauf"
+
+msgctxt "field:stock.move,sale:0"
+msgid "Sale"
+msgstr "Verkauf"
+
+msgctxt "field:stock.move,sale_exception_state:0"
+msgid "Exception State"
+msgstr "Status Vorbehalt"
+
+msgctxt "field:stock.move,sale_line:0"
+msgid "Sale Line"
+msgstr "Verkauf Position"
+
+msgctxt "help:product.template,delivery_time:0"
+msgid "In number of days"
+msgstr "In Anzahl von Tagen"
+
+msgctxt "help:sale.handle.invoice.exception.ask,recreate_invoices:0"
+msgid ""
+"The selected invoices will be recreated. The other ones will be ignored."
+msgstr ""
+"Die ausgewählten Rechnungen werden nachgebildet. Alle anderen werden "
+"ignoriert."
+
+msgctxt "model:ir.action,name:act_invoice_form"
+msgid "Invoices"
+msgstr "Rechnungsausgang"
+
+msgctxt "model:ir.action,name:act_open_customer"
+msgid "Parties associated to Sales"
+msgstr "Parteien: Verkäufen zugeordnet"
+
+msgctxt "model:ir.action,name:act_sale_configuration_form"
+msgid "Sales Configuration"
+msgstr "Einstellungen Verkauf"
+
+msgctxt "model:ir.action,name:act_sale_form"
+msgid "Sales"
+msgstr "Verkäufe"
+
+msgctxt "model:ir.action,name:act_sale_form2"
+msgid "Sales"
+msgstr "Verkäufe"
+
+msgctxt "model:ir.action,name:act_sale_form_confirmed"
+msgid "Confirmed Sales"
+msgstr "Aufträge Verkäufe"
+
+msgctxt "model:ir.action,name:act_sale_form_draft"
+msgid "Draft Sales"
+msgstr "Entwürfe Verkäufe"
+
+msgctxt "model:ir.action,name:act_sale_form_quotation"
+msgid "Quotation Sales"
+msgstr "Angebote Verkäufe"
+
+msgctxt "model:ir.action,name:act_shipment_form"
+msgid "Shipments"
+msgstr "Lieferposten"
+
+msgctxt "model:ir.action,name:report_sale"
+msgid "Sale"
+msgstr "Verkauf"
+
+msgctxt "model:ir.action,name:wizard_invoice_handle_exception"
+msgid "Handle Invoice Exception"
+msgstr "Rechnungsvorbehalt bearbeiten"
+
+msgctxt "model:ir.action,name:wizard_shipment_handle_exception"
+msgid "Handle Shipment Exception"
+msgstr "Liefervorbehalt bearbeiten"
+
+msgctxt "model:ir.sequence,name:sequence_sale"
+msgid "Sale"
+msgstr "Verkauf"
+
+msgctxt "model:ir.sequence.type,name:sequence_type_sale"
+msgid "Sale"
+msgstr "Verkauf"
+
+msgctxt "model:ir.ui.menu,name:menu_configuration"
+msgid "Configuration"
+msgstr "Einstellungen"
+
+msgctxt "model:ir.ui.menu,name:menu_customer"
+msgid "Parties associated to Sales"
+msgstr "Parteien: Verkäufen zugeordnet"
+
+msgctxt "model:ir.ui.menu,name:menu_sale"
+msgid "Sales"
+msgstr "Verkauf"
+
+msgctxt "model:ir.ui.menu,name:menu_sale_configuration"
+msgid "Sales Configuration"
+msgstr "Einstellungen Verkauf"
+
+msgctxt "model:ir.ui.menu,name:menu_sale_form"
+msgid "Sales"
+msgstr "Verkäufe"
+
+msgctxt "model:ir.ui.menu,name:menu_sale_form_confirmed"
+msgid "Confirmed Sales"
+msgstr "Aufträge (Verkäufe)"
+
+msgctxt "model:ir.ui.menu,name:menu_sale_form_draft"
+msgid "Draft Sales"
+msgstr "Entwürfe (Verkäufe)"
+
+msgctxt "model:ir.ui.menu,name:menu_sale_form_quotation"
+msgid "Quotation Sales"
+msgstr "Angebote (Verkäufe)"
+
+msgctxt "model:res.group,name:group_sale"
+msgid "Sales"
+msgstr "Verkauf"
+
+msgctxt "model:res.group,name:group_sale_admin"
+msgid "Sales Administrator"
+msgstr "Verkauf Administration"
+
+msgctxt "model:sale.configuration,name:0"
+msgid "Sale Configuration"
+msgstr "Einstellungen Verkauf"
+
+msgctxt "model:sale.handle.invoice.exception.ask,name:0"
+msgid "Invoice Exception Ask"
+msgstr "Rechnungsvorbehalt Nachfrage"
+
+msgctxt "model:sale.handle.shipment.exception.ask,name:0"
+msgid "Shipment Exception Ask"
+msgstr "Nachfrage Liefervorbehalt"
+
+msgctxt "model:sale.line,name:0"
+msgid "Sale Line"
+msgstr "Verkauf Position"
+
+msgctxt "model:sale.line-account.invoice.line,name:0"
+msgid "Sale Line - Invoice Line"
+msgstr "Verkauf Position - Rechnungsposition"
+
+msgctxt "model:sale.line-account.tax,name:0"
+msgid "Sale Line - Tax"
+msgstr "Verkauf Position - Steuer"
+
+msgctxt "model:sale.line-ignored-stock.move,name:0"
+msgid "Sale Line - Ignored Move"
+msgstr "Verkauf Position - Bewegung Ignoriert"
+
+msgctxt "model:sale.line-recreated-stock.move,name:0"
+msgid "Sale Line - Recreated Move"
+msgstr "Verkauf Position - Bewegung Nachgebildet"
+
+msgctxt "model:sale.sale,name:0"
+msgid "Sale"
+msgstr "Verkauf"
+
+msgctxt "model:sale.sale-account.invoice,name:0"
+msgid "Sale - Invoice"
+msgstr "Verkauf - Rechnung"
+
+msgctxt "model:sale.sale-ignored-account.invoice,name:0"
+msgid "Sale - Ignored Invoice"
+msgstr "Verkauf - Rechnung Ignoriert"
+
+msgctxt "model:sale.sale-recreated-account.invoice,name:0"
+msgid "Sale - Recreated Invoice"
+msgstr "Verkauf - Rechnung Nachgebildet"
+
+msgctxt "model:workflow,name:sale_workflow"
+msgid "Sale workflow"
+msgstr "Workflow Verkauf"
+
+msgctxt "model:workflow.activity,name:sale_activity_cancel"
+msgid "Canceled"
+msgstr "Annulliert"
+
+msgctxt "model:workflow.activity,name:sale_activity_confirmed"
+msgid "Confirmed"
+msgstr "Beauftragt"
+
+msgctxt "model:workflow.activity,name:sale_activity_done"
+msgid "Done"
+msgstr "Erledigt"
+
+msgctxt "model:workflow.activity,name:sale_activity_draft"
+msgid "Draft"
+msgstr "Entwurf"
+
+msgctxt "model:workflow.activity,name:sale_activity_invoice_method"
+msgid "Invoice Method"
+msgstr "Rechnungsstellung"
+
+msgctxt "model:workflow.activity,name:sale_activity_invoice_method_done"
+msgid "Invoice Method Done"
+msgstr "Rechnungsstellung erledigt"
+
+msgctxt "model:workflow.activity,name:sale_activity_invoice_sale_done"
+msgid "Invoice Done"
+msgstr "Rechnung erledigt"
+
+msgctxt "model:workflow.activity,name:sale_activity_invoice_sale_exception"
+msgid "Invoice Exception"
+msgstr "Rechnungsvorbehalt"
+
+msgctxt "model:workflow.activity,name:sale_activity_invoice_shipment"
+msgid "Invoice Shipment"
+msgstr "Rechnung Lieferposten"
+
+msgctxt "model:workflow.activity,name:sale_activity_invoice_shipment_done"
+msgid "Invoice Shipment Done"
+msgstr "Rechnung Lieferposten erledigt"
+
+msgctxt ""
+"model:workflow.activity,name:sale_activity_invoice_shipment_exception"
+msgid "Invoice Shipment Exception"
+msgstr "Rechnung Lieferposten Vorbehalt"
+
+msgctxt "model:workflow.activity,name:sale_activity_invoice_shipment_method"
+msgid "Invoice Shipment Method"
+msgstr "Rechnung Liefermethode"
+
+msgctxt ""
+"model:workflow.activity,name:sale_activity_invoice_shipment_method_done"
+msgid "Invoice Shipment Method Done"
+msgstr "Rechnung Liefermethode erledigt"
+
+msgctxt "model:workflow.activity,name:sale_activity_quotation"
+msgid "Quotation"
+msgstr "Angebot"
+
+msgctxt "model:workflow.activity,name:sale_activity_shipment"
+msgid "Shipment"
+msgstr "Lieferposten"
+
+msgctxt "model:workflow.activity,name:sale_activity_shipment_exception"
+msgid "Shipment Exception"
+msgstr "Lieferposten Vorbehalt"
+
+msgctxt "model:workflow.activity,name:sale_activity_shipment_invoice"
+msgid "Shipment Invoice"
+msgstr "Lieferposten Rechnung"
+
+msgctxt "model:workflow.activity,name:sale_activity_shipment_invoice_done"
+msgid "Shipment Invoice Done"
+msgstr "Lieferposten Rechnung erledigt"
+
+msgctxt ""
+"model:workflow.activity,name:sale_activity_shipment_invoice_exception"
+msgid "Shipment Invoice Exception"
+msgstr "Lieferposten Rechnung Vorbehalt"
+
+msgctxt "model:workflow.activity,name:sale_activity_shipment_invoice_method"
+msgid "Shipment Invoice Method"
+msgstr "Lieferposten Rechnungsmethode"
+
+msgctxt ""
+"model:workflow.activity,name:sale_activity_shipment_invoice_method_done"
+msgid "Shipment Invoice Method Done"
+msgstr "Lieferposten Rechnungsmethode erledigt"
+
+msgctxt "model:workflow.activity,name:sale_activity_shipment_method"
+msgid "Shipment Method"
+msgstr "Liefermethode"
+
+msgctxt "model:workflow.activity,name:sale_activity_shipment_method_done"
+msgid "Shipment Method Done"
+msgstr "Liefermethode erledigt"
+
+msgctxt "model:workflow.activity,name:sale_activity_waiting_invoice_sale"
+msgid "Waiting Invoice"
+msgstr "Rechnung Wartend"
+
+msgctxt "model:workflow.activity,name:sale_activity_waiting_invoice_shipment"
+msgid "Waiting Invoice Shipment"
+msgstr "Rechnung Lieferposten Wartend"
+
+msgctxt "model:workflow.activity,name:sale_activity_waiting_shipment"
+msgid "Waiting Shipment"
+msgstr "Lieferposten Wartend"
+
+msgctxt "model:workflow.activity,name:sale_activity_waiting_shipment_invoice"
+msgid "Waiting Shipment Invoice"
+msgstr "Lieferposten Rechnung Wartend"
+
+msgctxt "odt:sale.sale:0"
+msgid "Amount"
+msgstr "Betrag"
+
+msgctxt "odt:sale.sale:0"
+msgid "Date:"
+msgstr "Datum:"
+
+msgctxt "odt:sale.sale:0"
+msgid "Description"
+msgstr "Bezeichnung"
+
+msgctxt "odt:sale.sale:0"
+msgid "Description:"
+msgstr "Bezeichnung:"
+
+msgctxt "odt:sale.sale:0"
+msgid "Draft Sale Order"
+msgstr "Auftrag (Entwurf)"
+
+msgctxt "odt:sale.sale:0"
+msgid "E-Mail:"
+msgstr "E-Mail:"
+
+msgctxt "odt:sale.sale:0"
+msgid "Phone:"
+msgstr "Telefon:"
+
+msgctxt "odt:sale.sale:0"
+msgid "Quantity"
+msgstr "Anzahl"
+
+msgctxt "odt:sale.sale:0"
+msgid "Quotation N°:"
+msgstr "Angebot Nr.:"
+
+msgctxt "odt:sale.sale:0"
+msgid "Sale Order N°:"
+msgstr "Auftrag Nr.:"
+
+msgctxt "odt:sale.sale:0"
+msgid "Taxes"
+msgstr "Steuern"
+
+msgctxt "odt:sale.sale:0"
+msgid "Taxes:"
+msgstr "Steuern:"
+
+msgctxt "odt:sale.sale:0"
+msgid "Total (excl. taxes):"
+msgstr "Netto:"
+
+msgctxt "odt:sale.sale:0"
+msgid "Total:"
+msgstr "Gesamt:"
+
+msgctxt "odt:sale.sale:0"
+msgid "Unit Price"
+msgstr "Einzelpreis"
+
+msgctxt "odt:sale.sale:0"
+msgid "VAT Number:"
+msgstr "USt-ID-Nr.:"
+
+msgctxt "odt:sale.sale:0"
+msgid "VAT:"
+msgstr "USt:"
+
+msgctxt "selection:account.invoice,sale_exception_state:0"
+msgid ""
+msgstr ""
+
+msgctxt "selection:account.invoice,sale_exception_state:0"
+msgid "Ignored"
+msgstr "Ignoriert"
+
+msgctxt "selection:account.invoice,sale_exception_state:0"
+msgid "Recreated"
+msgstr "Nachgebildet"
+
+msgctxt "selection:sale.configuration,sale_invoice_method:0"
+msgid "Manual"
+msgstr "Manuell"
+
+msgctxt "selection:sale.configuration,sale_invoice_method:0"
+msgid "On Order Confirmed"
+msgstr "Bei Beauftragung"
+
+msgctxt "selection:sale.configuration,sale_invoice_method:0"
+msgid "On Shipment Sent"
+msgstr "Bei Versand"
+
+msgctxt "selection:sale.configuration,sale_shipment_method:0"
+msgid "Manual"
+msgstr "Manuell"
+
+msgctxt "selection:sale.configuration,sale_shipment_method:0"
+msgid "On Invoice Paid"
+msgstr "Bei Bezahlung"
+
+msgctxt "selection:sale.configuration,sale_shipment_method:0"
+msgid "On Order Confirmed"
+msgstr "Bei Beauftragung"
+
+msgctxt "selection:sale.line,type:0"
+msgid "Comment"
+msgstr "Kommentar"
+
+msgctxt "selection:sale.line,type:0"
+msgid "Line"
+msgstr "Position"
+
+msgctxt "selection:sale.line,type:0"
+msgid "Subtotal"
+msgstr "Zwischensumme"
+
+msgctxt "selection:sale.line,type:0"
+msgid "Title"
+msgstr "Überschrift"
+
+msgctxt "selection:sale.sale,invoice_method:0"
+msgid "Manual"
+msgstr "Manuell"
+
+msgctxt "selection:sale.sale,invoice_method:0"
+msgid "On Order Confirmed"
+msgstr "Bei Beauftragung"
+
+msgctxt "selection:sale.sale,invoice_method:0"
+msgid "On Shipment Sent"
+msgstr "Bei Versand"
+
+msgctxt "selection:sale.sale,invoice_state:0"
+msgid "Exception"
+msgstr "Vorbehalt"
+
+msgctxt "selection:sale.sale,invoice_state:0"
+msgid "None"
+msgstr "Kein"
+
+msgctxt "selection:sale.sale,invoice_state:0"
+msgid "Paid"
+msgstr "Bezahlt"
+
+msgctxt "selection:sale.sale,invoice_state:0"
+msgid "Waiting"
+msgstr "Wartend"
+
+msgctxt "selection:sale.sale,shipment_method:0"
+msgid "Manual"
+msgstr "Manuell"
+
+msgctxt "selection:sale.sale,shipment_method:0"
+msgid "On Invoice Paid"
+msgstr "Bei Bezahlung"
+
+msgctxt "selection:sale.sale,shipment_method:0"
+msgid "On Order Confirmed"
+msgstr "Bei Beauftragung"
+
+msgctxt "selection:sale.sale,shipment_state:0"
+msgid "Exception"
+msgstr "Vorbehalt"
+
+msgctxt "selection:sale.sale,shipment_state:0"
+msgid "None"
+msgstr "Kein"
+
+msgctxt "selection:sale.sale,shipment_state:0"
+msgid "Sent"
+msgstr "Gesendet"
+
+msgctxt "selection:sale.sale,shipment_state:0"
+msgid "Waiting"
+msgstr "Wartend"
+
+msgctxt "selection:sale.sale,state:0"
+msgid "Canceled"
+msgstr "Annulliert"
+
+msgctxt "selection:sale.sale,state:0"
+msgid "Confirmed"
+msgstr "Beauftragt"
+
+msgctxt "selection:sale.sale,state:0"
+msgid "Done"
+msgstr "Erledigt"
+
+msgctxt "selection:sale.sale,state:0"
+msgid "Draft"
+msgstr "Entwurf"
+
+msgctxt "selection:sale.sale,state:0"
+msgid "Quotation"
+msgstr "Angebot"
+
+msgctxt "selection:stock.move,sale_exception_state:0"
+msgid ""
+msgstr ""
+
+msgctxt "selection:stock.move,sale_exception_state:0"
+msgid "Ignored"
+msgstr "Ignoriert"
+
+msgctxt "selection:stock.move,sale_exception_state:0"
+msgid "Recreated"
+msgstr "Nachgebildet"
+
+msgctxt "view:product.product:0"
+msgid "Customers"
+msgstr "Kunden"
+
+msgctxt "view:product.template:0"
+msgid "Customers"
+msgstr "Kunden"
+
+msgctxt "view:sale.configuration:0"
+msgid "Sale Configuration"
+msgstr "Einstellungen Verkauf"
+
+msgctxt "view:sale.handle.invoice.exception.ask:0"
+msgid "Choose invoices to duplicate"
+msgstr "Auswahl Rechnungen für Duplizierung"
+
+msgctxt "view:sale.handle.invoice.exception.ask:0"
+msgid "Choose invoices to recreate"
+msgstr "Rechnungen zum Nachbilden auswählen"
+
+msgctxt "view:sale.handle.invoice.exception.ask:0"
+msgid "Handle Invoice Exception"
+msgstr "Rechnungsvorbehalt bearbeiten"
+
+msgctxt "view:sale.handle.shipment.exception.ask:0"
+msgid "Choose move to duplicate"
+msgstr "Auswahl Bewegungen für Duplizierung"
+
+msgctxt "view:sale.handle.shipment.exception.ask:0"
+msgid "Choose move to recreate"
+msgstr "Bewegungen zum Nachbilden auswählen"
+
+msgctxt "view:sale.handle.shipment.exception.ask:0"
+msgid "Duplicate Moves"
+msgstr "Bewegungen duplizieren"
+
+msgctxt "view:sale.handle.shipment.exception.ask:0"
+msgid "Handle shipment Exception"
+msgstr "Liefervorbehalt bearbeiten"
+
+msgctxt "view:sale.handle.shipment.exception.ask:0"
+msgid "Recreate Moves"
+msgstr "Bewegungen nachbilden"
+
+msgctxt "view:sale.line:0"
+msgid "General"
+msgstr "Allgemein"
+
+msgctxt "view:sale.line:0"
+msgid "Notes"
+msgstr "Notizen"
+
+msgctxt "view:sale.line:0"
+msgid "Products"
+msgstr "Artikel"
+
+msgctxt "view:sale.line:0"
+msgid "Sale Line"
+msgstr "Position Verkauf"
+
+msgctxt "view:sale.line:0"
+msgid "Sale Lines"
+msgstr "Positionen Verkauf"
+
+msgctxt "view:sale.sale:0"
+msgid "Cancel"
+msgstr "Annullieren"
+
+msgctxt "view:sale.sale:0"
+msgid "Confirm"
+msgstr "Bestätigen"
+
+msgctxt "view:sale.sale:0"
+msgid "Draft"
+msgstr "Entwurf"
+
+msgctxt "view:sale.sale:0"
+msgid "Handle Invoice Exception"
+msgstr "Rechnungsvorbehalt bearbeiten"
+
+msgctxt "view:sale.sale:0"
+msgid "Handle Shipment Exception"
+msgstr "Liefervorbehalt bearbeiten"
+
+msgctxt "view:sale.sale:0"
+msgid "Ignore Invoice Exception"
+msgstr "Rechnungsvorbehalt ignorieren"
+
+msgctxt "view:sale.sale:0"
+msgid "Invoices"
+msgstr "Rechnungen"
+
+msgctxt "view:sale.sale:0"
+msgid "Lines"
+msgstr "Positionen"
+
+msgctxt "view:sale.sale:0"
+msgid "Moves"
+msgstr "Bewegungen"
+
+msgctxt "view:sale.sale:0"
+msgid "Other Info"
+msgstr "Sonstiges"
+
+msgctxt "view:sale.sale:0"
+msgid "Quotation"
+msgstr "Angebot"
+
+msgctxt "view:sale.sale:0"
+msgid "Sale"
+msgstr "Verkauf"
+
+msgctxt "view:sale.sale:0"
+msgid "Sales"
+msgstr "Verkäufe"
+
+msgctxt "view:sale.sale:0"
+msgid "Shipments"
+msgstr "Lieferposten"
+
+msgctxt "wizard_button:sale.handle.invoice.exception,init,end:0"
+msgid "Cancel"
+msgstr "Abbrechen"
+
+msgctxt "wizard_button:sale.handle.invoice.exception,init,ok:0"
+msgid "Ok"
+msgstr "OK"
+
+msgctxt "wizard_button:sale.handle.shipment.exception,init,end:0"
+msgid "Cancel"
+msgstr "Abbrechen"
+
+msgctxt "wizard_button:sale.handle.shipment.exception,init,ok:0"
+msgid "Ok"
+msgstr "OK"
diff --git a/locale/es_CO.po b/locale/es_CO.po
new file mode 100644
index 0000000..d040bc3
--- /dev/null
+++ b/locale/es_CO.po
@@ -0,0 +1,1011 @@
+# 
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "error:account.invoice:0"
+msgid "You can not delete invoices that come from a sale!"
+msgstr "No puede borrar la factura proveniente de una venta!"
+
+msgctxt "error:account.invoice:0"
+msgid "You cannot reset to draft an invoice generated by a sale."
+msgstr "No puede regresar a borrador una factura generada por una venta."
+
+msgctxt "error:sale.line:0"
+msgid "It misses an \"Account Revenue\" on product \"%s\"!"
+msgstr "Falta un \"cuenta de ingresos\" para el producto \"%s\"!"
+
+msgctxt "error:sale.line:0"
+msgid "It misses an \"account Revenue\" default property!"
+msgstr "¡Hace falta una propiedad predeterminada de \"cuenta de ganancias\"!"
+
+msgctxt "error:sale.line:0"
+msgid "The customer location is required!"
+msgstr "Es indispensable el lugar del cliente!"
+
+msgctxt "error:sale.sale:0"
+msgid "Invoice and Shipment addresses must be defined for the quotation."
+msgstr "Factura y dirección de Envío debe ser definida por el presupuesto."
+
+msgctxt "error:sale.sale:0"
+msgid "It misses an \"Account Receivable\" on the party \"%s\"!"
+msgstr "Falta una \"cuenta de ingresos\" en la partida \"%s\"!"
+
+msgctxt "error:sale.sale:0"
+msgid "Wrong combination of method!"
+msgstr "Combinación o método erróneos!"
+
+msgctxt "error:stock.shipment.out:0"
+msgid "You cannot reset to draft a move generated by a sale."
+msgstr "No puede regresar a borrador un movimiento generado por una venta."
+
+msgctxt "field:account.invoice,sale_exception_state:0"
+msgid "Exception State"
+msgstr "Estado de Excepción"
+
+#, fuzzy
+msgctxt "field:account.invoice,sales:0"
+msgid "Sales"
+msgstr "Ventas"
+
+#, fuzzy
+msgctxt "field:account.invoice.line,sale_lines:0"
+msgid "Sale Lines"
+msgstr "Líneas de Venta"
+
+#, fuzzy
+msgctxt "field:product.template,delivery_time:0"
+msgid "Delivery Time"
+msgstr "Tiempo de Envío"
+
+msgctxt "field:product.template,salable:0"
+msgid "Salable"
+msgstr "De fácil venta"
+
+msgctxt "field:product.template,sale_uom:0"
+msgid "Sale UOM"
+msgstr "UdM de Venta"
+
+#, fuzzy
+msgctxt "field:sale.configuration,rec_name:0"
+msgid "Name"
+msgstr "Nombre de Contacto"
+
+msgctxt "field:sale.configuration,sale_invoice_method:0"
+msgid "Sale Invoice Method"
+msgstr ""
+
+msgctxt "field:sale.configuration,sale_sequence:0"
+msgid "Sale Reference Sequence"
+msgstr ""
+
+msgctxt "field:sale.configuration,sale_shipment_method:0"
+msgid "Sale Shipment Method"
+msgstr ""
+
+msgctxt "field:sale.handle.invoice.exception.ask,domain_invoices:0"
+msgid "Domain Invoices"
+msgstr "Rango de facturas"
+
+msgctxt "field:sale.handle.invoice.exception.ask,recreate_invoices:0"
+msgid "Recreate Invoices"
+msgstr "Rehacer factura"
+
+msgctxt "field:sale.handle.shipment.exception.ask,domain_moves:0"
+msgid "Domain Moves"
+msgstr "Rango de movimientos"
+
+msgctxt "field:sale.handle.shipment.exception.ask,recreate_moves:0"
+msgid "Recreate Moves"
+msgstr "Rehacer movimientos"
+
+msgctxt "field:sale.line,amount:0"
+msgid "Amount"
+msgstr "Cantidad"
+
+msgctxt "field:sale.line,description:0"
+msgid "Description"
+msgstr "Descripción"
+
+msgctxt "field:sale.line,invoice_lines:0"
+msgid "Invoice Lines"
+msgstr "Líneas de Factura"
+
+msgctxt "field:sale.line,move_done:0"
+msgid "Moves Done"
+msgstr "Movimientos Hechos"
+
+msgctxt "field:sale.line,move_exception:0"
+msgid "Moves Exception"
+msgstr "Exepción de Movimientos"
+
+msgctxt "field:sale.line,moves:0"
+msgid "Moves"
+msgstr "Movimientos"
+
+msgctxt "field:sale.line,moves_ignored:0"
+msgid "Ignored Moves"
+msgstr "Movimientos Ignorados"
+
+msgctxt "field:sale.line,moves_recreated:0"
+msgid "Recreated Moves"
+msgstr "Rehacer Movimientos"
+
+msgctxt "field:sale.line,note:0"
+msgid "Note"
+msgstr "Nota"
+
+msgctxt "field:sale.line,product:0"
+msgid "Product"
+msgstr "Producto"
+
+msgctxt "field:sale.line,quantity:0"
+msgid "Quantity"
+msgstr "Cantidad"
+
+msgctxt "field:sale.line,rec_name:0"
+msgid "Name"
+msgstr "Nombre"
+
+msgctxt "field:sale.line,sale:0"
+msgid "Sale"
+msgstr "Venta"
+
+msgctxt "field:sale.line,sequence:0"
+msgid "Sequence"
+msgstr "Secuencia"
+
+msgctxt "field:sale.line,taxes:0"
+msgid "Taxes"
+msgstr "Impuestos"
+
+msgctxt "field:sale.line,type:0"
+msgid "Type"
+msgstr "Tipo"
+
+msgctxt "field:sale.line,unit:0"
+msgid "Unit"
+msgstr "Unidad"
+
+msgctxt "field:sale.line,unit_digits:0"
+msgid "Unit Digits"
+msgstr "Dígitos de Unidad"
+
+msgctxt "field:sale.line,unit_price:0"
+msgid "Unit Price"
+msgstr "Precio Unitario"
+
+msgctxt "field:sale.line-account.invoice.line,invoice_line:0"
+msgid "Invoice Line"
+msgstr "Línea de Factura"
+
+msgctxt "field:sale.line-account.invoice.line,rec_name:0"
+msgid "Name"
+msgstr "Nombre"
+
+msgctxt "field:sale.line-account.invoice.line,sale_line:0"
+msgid "Sale Line"
+msgstr "Línea de Venta"
+
+msgctxt "field:sale.line-account.tax,line:0"
+msgid "Sale Line"
+msgstr "Línea de Venta"
+
+msgctxt "field:sale.line-account.tax,rec_name:0"
+msgid "Name"
+msgstr "Nombre"
+
+msgctxt "field:sale.line-account.tax,tax:0"
+msgid "Tax"
+msgstr "Impuesto"
+
+msgctxt "field:sale.line-ignored-stock.move,move:0"
+msgid "Move"
+msgstr "Movimiento"
+
+msgctxt "field:sale.line-ignored-stock.move,rec_name:0"
+msgid "Name"
+msgstr "Nombre"
+
+msgctxt "field:sale.line-ignored-stock.move,sale_line:0"
+msgid "Sale Line"
+msgstr "Línea de Venta"
+
+msgctxt "field:sale.line-recreated-stock.move,move:0"
+msgid "Move"
+msgstr "Movimiento"
+
+msgctxt "field:sale.line-recreated-stock.move,rec_name:0"
+msgid "Name"
+msgstr "Nombre"
+
+msgctxt "field:sale.line-recreated-stock.move,sale_line:0"
+msgid "Sale Line"
+msgstr "Línea de Venta"
+
+msgctxt "field:sale.sale,comment:0"
+msgid "Comment"
+msgstr "Comentario"
+
+msgctxt "field:sale.sale,company:0"
+msgid "Company"
+msgstr "Compañía"
+
+msgctxt "field:sale.sale,currency:0"
+msgid "Currency"
+msgstr "Moneda"
+
+msgctxt "field:sale.sale,currency_digits:0"
+msgid "Currency Digits"
+msgstr "Dígitos de Moneda"
+
+msgctxt "field:sale.sale,description:0"
+msgid "Description"
+msgstr "Descripción"
+
+msgctxt "field:sale.sale,invoice_address:0"
+msgid "Invoice Address"
+msgstr "Dirección de Facturación"
+
+msgctxt "field:sale.sale,invoice_exception:0"
+msgid "Invoices Exception"
+msgstr "Excepción de Facturación"
+
+msgctxt "field:sale.sale,invoice_method:0"
+msgid "Invoice Method"
+msgstr "Método de Facturación"
+
+msgctxt "field:sale.sale,invoice_paid:0"
+msgid "Invoices Paid"
+msgstr "Facturas Pagadas"
+
+msgctxt "field:sale.sale,invoice_state:0"
+msgid "Invoice State"
+msgstr "Estado de Factura"
+
+msgctxt "field:sale.sale,invoices:0"
+msgid "Invoices"
+msgstr "Facturas"
+
+msgctxt "field:sale.sale,invoices_ignored:0"
+msgid "Ignored Invoices"
+msgstr "Facturas Ignoradas"
+
+msgctxt "field:sale.sale,invoices_recreated:0"
+msgid "Recreated Invoices"
+msgstr "Rehacer facturas"
+
+msgctxt "field:sale.sale,lines:0"
+msgid "Lines"
+msgstr "Líneas"
+
+msgctxt "field:sale.sale,moves:0"
+msgid "Moves"
+msgstr "Movimientos"
+
+msgctxt "field:sale.sale,party:0"
+msgid "Party"
+msgstr "Tercero"
+
+msgctxt "field:sale.sale,party_lang:0"
+msgid "Party Language"
+msgstr "Idioma del Tercero"
+
+msgctxt "field:sale.sale,payment_term:0"
+msgid "Payment Term"
+msgstr "Término de Pago"
+
+msgctxt "field:sale.sale,rec_name:0"
+msgid "Name"
+msgstr "Nombre"
+
+msgctxt "field:sale.sale,reference:0"
+msgid "Reference"
+msgstr "Referencia"
+
+msgctxt "field:sale.sale,sale_date:0"
+msgid "Sale Date"
+msgstr "Fecha de Venta"
+
+msgctxt "field:sale.sale,shipment_address:0"
+msgid "Shipment Address"
+msgstr "Dirección de envío"
+
+msgctxt "field:sale.sale,shipment_done:0"
+msgid "Shipment Done"
+msgstr "Envío Finalizado"
+
+msgctxt "field:sale.sale,shipment_exception:0"
+msgid "Shipments Exception"
+msgstr "Excepción de Envíos"
+
+msgctxt "field:sale.sale,shipment_method:0"
+msgid "Shipment Method"
+msgstr "Método de Envío"
+
+msgctxt "field:sale.sale,shipment_state:0"
+msgid "Shipment State"
+msgstr "Estado de Envío"
+
+msgctxt "field:sale.sale,shipments:0"
+msgid "Shipments"
+msgstr "Envíos"
+
+msgctxt "field:sale.sale,state:0"
+msgid "State"
+msgstr "Estado"
+
+msgctxt "field:sale.sale,tax_amount:0"
+msgid "Tax"
+msgstr "Impuesto"
+
+msgctxt "field:sale.sale,total_amount:0"
+msgid "Total"
+msgstr "Total"
+
+msgctxt "field:sale.sale,untaxed_amount:0"
+msgid "Untaxed"
+msgstr "Sin Impuesto"
+
+msgctxt "field:sale.sale,warehouse:0"
+msgid "Warehouse"
+msgstr "Depósito"
+
+msgctxt "field:sale.sale-account.invoice,invoice:0"
+msgid "Invoice"
+msgstr "Factura"
+
+msgctxt "field:sale.sale-account.invoice,rec_name:0"
+msgid "Name"
+msgstr "Nombre"
+
+msgctxt "field:sale.sale-account.invoice,sale:0"
+msgid "Sale"
+msgstr "Ventas"
+
+msgctxt "field:sale.sale-ignored-account.invoice,invoice:0"
+msgid "Invoice"
+msgstr "Factura"
+
+msgctxt "field:sale.sale-ignored-account.invoice,rec_name:0"
+msgid "Name"
+msgstr "Nombre"
+
+msgctxt "field:sale.sale-ignored-account.invoice,sale:0"
+msgid "Sale"
+msgstr "Ventas"
+
+msgctxt "field:sale.sale-recreated-account.invoice,invoice:0"
+msgid "Invoice"
+msgstr "Factura"
+
+msgctxt "field:sale.sale-recreated-account.invoice,rec_name:0"
+msgid "Name"
+msgstr "Nombre"
+
+msgctxt "field:sale.sale-recreated-account.invoice,sale:0"
+msgid "Sale"
+msgstr "Ventas"
+
+msgctxt "field:stock.move,sale:0"
+msgid "Sale"
+msgstr "Venta"
+
+msgctxt "field:stock.move,sale_exception_state:0"
+msgid "Exception State"
+msgstr "Estado Excepción"
+
+#, fuzzy
+msgctxt "field:stock.move,sale_line:0"
+msgid "Sale Line"
+msgstr "Línea de Venta"
+
+#, fuzzy
+msgctxt "help:product.template,delivery_time:0"
+msgid "In number of days"
+msgstr "En número de días"
+
+msgctxt "help:sale.handle.invoice.exception.ask,recreate_invoices:0"
+msgid ""
+"The selected invoices will be recreated. The other ones will be ignored."
+msgstr "La factura seleccionada será recreada. Las otras serán ignoradas."
+
+msgctxt "model:ir.action,name:act_invoice_form"
+msgid "Invoices"
+msgstr "Facturas"
+
+msgctxt "model:ir.action,name:act_open_customer"
+msgid "Parties associated to Sales"
+msgstr "Terceros asociados a Ventas"
+
+msgctxt "model:ir.action,name:act_sale_configuration_form"
+msgid "Sales Configuration"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_sale_form"
+msgid "Sales"
+msgstr "Ventas"
+
+msgctxt "model:ir.action,name:act_sale_form2"
+msgid "Sales"
+msgstr "Ventas"
+
+msgctxt "model:ir.action,name:act_sale_form_confirmed"
+msgid "Confirmed Sales"
+msgstr "Ventas Confirmadas"
+
+msgctxt "model:ir.action,name:act_sale_form_draft"
+msgid "Draft Sales"
+msgstr "Ventas en Borrador"
+
+msgctxt "model:ir.action,name:act_sale_form_quotation"
+msgid "Quotation Sales"
+msgstr "Ventas Cotizadas"
+
+msgctxt "model:ir.action,name:act_shipment_form"
+msgid "Shipments"
+msgstr "Envíos"
+
+msgctxt "model:ir.action,name:report_sale"
+msgid "Sale"
+msgstr "Venta"
+
+msgctxt "model:ir.action,name:wizard_invoice_handle_exception"
+msgid "Handle Invoice Exception"
+msgstr "Tratar Excepción de factura"
+
+msgctxt "model:ir.action,name:wizard_shipment_handle_exception"
+msgid "Handle Shipment Exception"
+msgstr "Tratar Excepción de Envío"
+
+msgctxt "model:ir.sequence,name:sequence_sale"
+msgid "Sale"
+msgstr "Venta"
+
+msgctxt "model:ir.sequence.type,name:sequence_type_sale"
+msgid "Sale"
+msgstr "Venta"
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_configuration"
+msgid "Configuration"
+msgstr "Configuración"
+
+msgctxt "model:ir.ui.menu,name:menu_customer"
+msgid "Parties associated to Sales"
+msgstr "Terceros asociados a Ventas"
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_sale"
+msgid "Sales"
+msgstr "Gestión de Ventas"
+
+msgctxt "model:ir.ui.menu,name:menu_sale_configuration"
+msgid "Sales Configuration"
+msgstr ""
+
+msgctxt "model:ir.ui.menu,name:menu_sale_form"
+msgid "Sales"
+msgstr "Ventas"
+
+msgctxt "model:ir.ui.menu,name:menu_sale_form_confirmed"
+msgid "Confirmed Sales"
+msgstr "Ventas Confirmadas"
+
+msgctxt "model:ir.ui.menu,name:menu_sale_form_draft"
+msgid "Draft Sales"
+msgstr "Ventas en Borrador"
+
+msgctxt "model:ir.ui.menu,name:menu_sale_form_quotation"
+msgid "Quotation Sales"
+msgstr "Ventas Cotizadas"
+
+#, fuzzy
+msgctxt "model:res.group,name:group_sale"
+msgid "Sales"
+msgstr "Venta"
+
+msgctxt "model:res.group,name:group_sale_admin"
+msgid "Sales Administrator"
+msgstr ""
+
+msgctxt "model:sale.configuration,name:0"
+msgid "Sale Configuration"
+msgstr ""
+
+msgctxt "model:sale.handle.invoice.exception.ask,name:0"
+msgid "Invoice Exception Ask"
+msgstr "Pregunta de Excepción de Factura"
+
+msgctxt "model:sale.handle.shipment.exception.ask,name:0"
+msgid "Shipment Exception Ask"
+msgstr "Pregunta de Excepción de Envío"
+
+msgctxt "model:sale.line,name:0"
+msgid "Sale Line"
+msgstr "Línea de Venta"
+
+msgctxt "model:sale.line-account.invoice.line,name:0"
+msgid "Sale Line - Invoice Line"
+msgstr "Línea de Venta - Línea de Factura"
+
+msgctxt "model:sale.line-account.tax,name:0"
+msgid "Sale Line - Tax"
+msgstr "Línea de Venta - Impuesto"
+
+msgctxt "model:sale.line-ignored-stock.move,name:0"
+msgid "Sale Line - Ignored Move"
+msgstr "Línea de Venta - Movimiento Ignorado"
+
+msgctxt "model:sale.line-recreated-stock.move,name:0"
+msgid "Sale Line - Recreated Move"
+msgstr "Línea de Venta - Movimiento Recreado"
+
+msgctxt "model:sale.sale,name:0"
+msgid "Sale"
+msgstr "Ventas"
+
+msgctxt "model:sale.sale-account.invoice,name:0"
+msgid "Sale - Invoice"
+msgstr "Venta - Factura"
+
+msgctxt "model:sale.sale-ignored-account.invoice,name:0"
+msgid "Sale - Ignored Invoice"
+msgstr "Venta - Factura Ignorada"
+
+msgctxt "model:sale.sale-recreated-account.invoice,name:0"
+msgid "Sale - Recreated Invoice"
+msgstr "Venta - Factura Recreada"
+
+msgctxt "model:workflow,name:sale_workflow"
+msgid "Sale workflow"
+msgstr "Flujo de Trabajo de Ventas"
+
+msgctxt "model:workflow.activity,name:sale_activity_cancel"
+msgid "Canceled"
+msgstr "Cancelado"
+
+msgctxt "model:workflow.activity,name:sale_activity_confirmed"
+msgid "Confirmed"
+msgstr "Confirmado"
+
+msgctxt "model:workflow.activity,name:sale_activity_done"
+msgid "Done"
+msgstr "Hecho"
+
+msgctxt "model:workflow.activity,name:sale_activity_draft"
+msgid "Draft"
+msgstr "Borrador"
+
+msgctxt "model:workflow.activity,name:sale_activity_invoice_method"
+msgid "Invoice Method"
+msgstr "Método de Facturación"
+
+msgctxt "model:workflow.activity,name:sale_activity_invoice_method_done"
+msgid "Invoice Method Done"
+msgstr "Método de Factura Concluido"
+
+msgctxt "model:workflow.activity,name:sale_activity_invoice_sale_done"
+msgid "Invoice Done"
+msgstr "Factura Hecha"
+
+msgctxt "model:workflow.activity,name:sale_activity_invoice_sale_exception"
+msgid "Invoice Exception"
+msgstr "Excepción de Factura"
+
+msgctxt "model:workflow.activity,name:sale_activity_invoice_shipment"
+msgid "Invoice Shipment"
+msgstr "Envío de Factura"
+
+msgctxt "model:workflow.activity,name:sale_activity_invoice_shipment_done"
+msgid "Invoice Shipment Done"
+msgstr "Envío de Factura Concluido"
+
+msgctxt ""
+"model:workflow.activity,name:sale_activity_invoice_shipment_exception"
+msgid "Invoice Shipment Exception"
+msgstr "Excepción de Envío de Factura"
+
+msgctxt "model:workflow.activity,name:sale_activity_invoice_shipment_method"
+msgid "Invoice Shipment Method"
+msgstr "Método de Envío de Factura"
+
+msgctxt ""
+"model:workflow.activity,name:sale_activity_invoice_shipment_method_done"
+msgid "Invoice Shipment Method Done"
+msgstr "Método de Envío de Factura Concluido"
+
+msgctxt "model:workflow.activity,name:sale_activity_quotation"
+msgid "Quotation"
+msgstr "Cotización"
+
+msgctxt "model:workflow.activity,name:sale_activity_shipment"
+msgid "Shipment"
+msgstr "Envío"
+
+msgctxt "model:workflow.activity,name:sale_activity_shipment_exception"
+msgid "Shipment Exception"
+msgstr "Excepción de Envío"
+
+msgctxt "model:workflow.activity,name:sale_activity_shipment_invoice"
+msgid "Shipment Invoice"
+msgstr "Envío de Factura"
+
+msgctxt "model:workflow.activity,name:sale_activity_shipment_invoice_done"
+msgid "Shipment Invoice Done"
+msgstr "Envío de Factura Concluido"
+
+msgctxt ""
+"model:workflow.activity,name:sale_activity_shipment_invoice_exception"
+msgid "Shipment Invoice Exception"
+msgstr "Excepción de Envío de Factura"
+
+msgctxt "model:workflow.activity,name:sale_activity_shipment_invoice_method"
+msgid "Shipment Invoice Method"
+msgstr "Método Envío de Factura"
+
+msgctxt ""
+"model:workflow.activity,name:sale_activity_shipment_invoice_method_done"
+msgid "Shipment Invoice Method Done"
+msgstr "Método de Envío de Factura Concluido"
+
+msgctxt "model:workflow.activity,name:sale_activity_shipment_method"
+msgid "Shipment Method"
+msgstr "Método de Envío"
+
+msgctxt "model:workflow.activity,name:sale_activity_shipment_method_done"
+msgid "Shipment Method Done"
+msgstr "Método de Envío Concluido"
+
+msgctxt "model:workflow.activity,name:sale_activity_waiting_invoice_sale"
+msgid "Waiting Invoice"
+msgstr "Esperando Factura"
+
+msgctxt "model:workflow.activity,name:sale_activity_waiting_invoice_shipment"
+msgid "Waiting Invoice Shipment"
+msgstr "Esperando Envío de Factura"
+
+msgctxt "model:workflow.activity,name:sale_activity_waiting_shipment"
+msgid "Waiting Shipment"
+msgstr "Esperando Envío"
+
+msgctxt "model:workflow.activity,name:sale_activity_waiting_shipment_invoice"
+msgid "Waiting Shipment Invoice"
+msgstr "Esperando Envío de Factura"
+
+msgctxt "odt:sale.sale:0"
+msgid "Amount"
+msgstr "Cantidad"
+
+msgctxt "odt:sale.sale:0"
+msgid "Date:"
+msgstr "Fecha:"
+
+msgctxt "odt:sale.sale:0"
+msgid "Description"
+msgstr "Descripción"
+
+msgctxt "odt:sale.sale:0"
+msgid "Description:"
+msgstr "Descripción:"
+
+msgctxt "odt:sale.sale:0"
+msgid "Draft Sale Order"
+msgstr "Orden de Venta en Borrador"
+
+msgctxt "odt:sale.sale:0"
+msgid "E-Mail:"
+msgstr "Correo electrónico:"
+
+msgctxt "odt:sale.sale:0"
+msgid "Phone:"
+msgstr "Teléfono:"
+
+msgctxt "odt:sale.sale:0"
+msgid "Quantity"
+msgstr "Cantidad"
+
+msgctxt "odt:sale.sale:0"
+msgid "Quotation N°:"
+msgstr "Cotización Nº:"
+
+msgctxt "odt:sale.sale:0"
+msgid "Sale Order N°:"
+msgstr "Orden de Venta Nº:"
+
+msgctxt "odt:sale.sale:0"
+msgid "Taxes"
+msgstr "Impuestos"
+
+msgctxt "odt:sale.sale:0"
+msgid "Taxes:"
+msgstr "Impuestos:"
+
+msgctxt "odt:sale.sale:0"
+msgid "Total (excl. taxes):"
+msgstr "Total (sin impuestos):"
+
+msgctxt "odt:sale.sale:0"
+msgid "Total:"
+msgstr "Total:"
+
+msgctxt "odt:sale.sale:0"
+msgid "Unit Price"
+msgstr "Precio Unitario"
+
+msgctxt "odt:sale.sale:0"
+msgid "VAT Number:"
+msgstr ""
+
+msgctxt "odt:sale.sale:0"
+msgid "VAT:"
+msgstr "NIT:"
+
+msgctxt "selection:account.invoice,sale_exception_state:0"
+msgid ""
+msgstr ""
+
+msgctxt "selection:account.invoice,sale_exception_state:0"
+msgid "Ignored"
+msgstr "Ignorado"
+
+msgctxt "selection:account.invoice,sale_exception_state:0"
+msgid "Recreated"
+msgstr "Rehecho"
+
+#, fuzzy
+msgctxt "selection:sale.configuration,sale_invoice_method:0"
+msgid "Manual"
+msgstr "Manual"
+
+#, fuzzy
+msgctxt "selection:sale.configuration,sale_invoice_method:0"
+msgid "On Order Confirmed"
+msgstr "Al Confirmar la Orden"
+
+#, fuzzy
+msgctxt "selection:sale.configuration,sale_invoice_method:0"
+msgid "On Shipment Sent"
+msgstr "Enviado"
+
+#, fuzzy
+msgctxt "selection:sale.configuration,sale_shipment_method:0"
+msgid "Manual"
+msgstr "Manual"
+
+#, fuzzy
+msgctxt "selection:sale.configuration,sale_shipment_method:0"
+msgid "On Invoice Paid"
+msgstr "Al Pagar"
+
+#, fuzzy
+msgctxt "selection:sale.configuration,sale_shipment_method:0"
+msgid "On Order Confirmed"
+msgstr "Al Confirmar la Orden"
+
+msgctxt "selection:sale.line,type:0"
+msgid "Comment"
+msgstr "Comentario"
+
+msgctxt "selection:sale.line,type:0"
+msgid "Line"
+msgstr "Línea"
+
+msgctxt "selection:sale.line,type:0"
+msgid "Subtotal"
+msgstr "Subtotal"
+
+msgctxt "selection:sale.line,type:0"
+msgid "Title"
+msgstr "Título"
+
+msgctxt "selection:sale.sale,invoice_method:0"
+msgid "Manual"
+msgstr "Manual"
+
+msgctxt "selection:sale.sale,invoice_method:0"
+msgid "On Order Confirmed"
+msgstr "Al Confirmar la Orden"
+
+msgctxt "selection:sale.sale,invoice_method:0"
+msgid "On Shipment Sent"
+msgstr "Enviado"
+
+msgctxt "selection:sale.sale,invoice_state:0"
+msgid "Exception"
+msgstr "Excepción"
+
+msgctxt "selection:sale.sale,invoice_state:0"
+msgid "None"
+msgstr "Ninguno"
+
+msgctxt "selection:sale.sale,invoice_state:0"
+msgid "Paid"
+msgstr "Pagado"
+
+msgctxt "selection:sale.sale,invoice_state:0"
+msgid "Waiting"
+msgstr "En Espera"
+
+msgctxt "selection:sale.sale,shipment_method:0"
+msgid "Manual"
+msgstr "Manual"
+
+msgctxt "selection:sale.sale,shipment_method:0"
+msgid "On Invoice Paid"
+msgstr "Al Pagar"
+
+msgctxt "selection:sale.sale,shipment_method:0"
+msgid "On Order Confirmed"
+msgstr "Al Confirmar la Orden"
+
+msgctxt "selection:sale.sale,shipment_state:0"
+msgid "Exception"
+msgstr "Excepción"
+
+msgctxt "selection:sale.sale,shipment_state:0"
+msgid "None"
+msgstr "Ninguno"
+
+msgctxt "selection:sale.sale,shipment_state:0"
+msgid "Sent"
+msgstr "Enviado"
+
+msgctxt "selection:sale.sale,shipment_state:0"
+msgid "Waiting"
+msgstr "En Espera"
+
+msgctxt "selection:sale.sale,state:0"
+msgid "Canceled"
+msgstr "Cancelado"
+
+msgctxt "selection:sale.sale,state:0"
+msgid "Confirmed"
+msgstr "Confirmado"
+
+msgctxt "selection:sale.sale,state:0"
+msgid "Done"
+msgstr "Hecho"
+
+msgctxt "selection:sale.sale,state:0"
+msgid "Draft"
+msgstr "Borrador"
+
+msgctxt "selection:sale.sale,state:0"
+msgid "Quotation"
+msgstr "Cotización"
+
+msgctxt "selection:stock.move,sale_exception_state:0"
+msgid ""
+msgstr ""
+
+msgctxt "selection:stock.move,sale_exception_state:0"
+msgid "Ignored"
+msgstr "Ignore"
+
+msgctxt "selection:stock.move,sale_exception_state:0"
+msgid "Recreated"
+msgstr "Rehacer"
+
+msgctxt "view:product.product:0"
+msgid "Customers"
+msgstr "Clientes"
+
+msgctxt "view:product.template:0"
+msgid "Customers"
+msgstr "Clientes"
+
+msgctxt "view:sale.configuration:0"
+msgid "Sale Configuration"
+msgstr ""
+
+msgctxt "view:sale.handle.invoice.exception.ask:0"
+msgid "Choose invoices to recreate"
+msgstr "Escoja una factura a rehacer"
+
+msgctxt "view:sale.handle.invoice.exception.ask:0"
+msgid "Handle Invoice Exception"
+msgstr "Tratar Excepción de factura"
+
+msgctxt "view:sale.handle.shipment.exception.ask:0"
+msgid "Choose move to recreate"
+msgstr "Escoja un movimiento a rehacer"
+
+msgctxt "view:sale.handle.shipment.exception.ask:0"
+msgid "Handle shipment Exception"
+msgstr "Maneje Excepciones de empaquetado"
+
+msgctxt "view:sale.handle.shipment.exception.ask:0"
+msgid "Recreate Moves"
+msgstr "Recrear movimientos"
+
+msgctxt "view:sale.line:0"
+msgid "General"
+msgstr "General"
+
+msgctxt "view:sale.line:0"
+msgid "Notes"
+msgstr "Notas"
+
+msgctxt "view:sale.line:0"
+msgid "Products"
+msgstr "Productos"
+
+msgctxt "view:sale.line:0"
+msgid "Sale Line"
+msgstr "Línea de Venta"
+
+msgctxt "view:sale.line:0"
+msgid "Sale Lines"
+msgstr "Líneas de Venta"
+
+msgctxt "view:sale.sale:0"
+msgid "Cancel"
+msgstr "Cancelar"
+
+msgctxt "view:sale.sale:0"
+msgid "Confirm"
+msgstr "Confirmar"
+
+msgctxt "view:sale.sale:0"
+msgid "Draft"
+msgstr "Borrador"
+
+msgctxt "view:sale.sale:0"
+msgid "Handle Invoice Exception"
+msgstr "Excepción que maneja factura"
+
+msgctxt "view:sale.sale:0"
+msgid "Handle Shipment Exception"
+msgstr "Excepción que maneja envío"
+
+msgctxt "view:sale.sale:0"
+msgid "Ignore Invoice Exception"
+msgstr "Ignorar excepción en Factura"
+
+msgctxt "view:sale.sale:0"
+msgid "Invoices"
+msgstr "Facturas"
+
+msgctxt "view:sale.sale:0"
+msgid "Lines"
+msgstr "Líneas"
+
+msgctxt "view:sale.sale:0"
+msgid "Moves"
+msgstr "Movimientos"
+
+msgctxt "view:sale.sale:0"
+msgid "Other Info"
+msgstr "Información Adicional"
+
+msgctxt "view:sale.sale:0"
+msgid "Quotation"
+msgstr "Cotización"
+
+msgctxt "view:sale.sale:0"
+msgid "Sale"
+msgstr "Venta"
+
+msgctxt "view:sale.sale:0"
+msgid "Sales"
+msgstr "Ventas"
+
+msgctxt "view:sale.sale:0"
+msgid "Shipments"
+msgstr "Empaques"
+
+msgctxt "wizard_button:sale.handle.invoice.exception,init,end:0"
+msgid "Cancel"
+msgstr "Cancelar"
+
+msgctxt "wizard_button:sale.handle.invoice.exception,init,ok:0"
+msgid "Ok"
+msgstr "Aceptar"
+
+msgctxt "wizard_button:sale.handle.shipment.exception,init,end:0"
+msgid "Cancel"
+msgstr "Cancelar"
+
+msgctxt "wizard_button:sale.handle.shipment.exception,init,ok:0"
+msgid "Ok"
+msgstr "Aceptar"
diff --git a/locale/es_ES.po b/locale/es_ES.po
new file mode 100644
index 0000000..e8360f0
--- /dev/null
+++ b/locale/es_ES.po
@@ -0,0 +1,1014 @@
+# 
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "error:account.invoice:0"
+msgid "You can not delete invoices that come from a sale!"
+msgstr "No puede borrar facturas que provienen de una venta"
+
+msgctxt "error:account.invoice:0"
+msgid "You cannot reset to draft an invoice generated by a sale."
+msgstr "No puede restablecer a borrador una factura generada por una venta."
+
+msgctxt "error:sale.line:0"
+msgid "It misses an \"Account Revenue\" on product \"%s\"!"
+msgstr "Falta una «cuenta de ingresos» en el producto «%s»"
+
+msgctxt "error:sale.line:0"
+msgid "It misses an \"account Revenue\" default property!"
+msgstr "Falta una propiedad predeterminada de «cuenta de ingresos»"
+
+msgctxt "error:sale.line:0"
+msgid "The customer location is required!"
+msgstr "Se necesita la ubicación del cliente"
+
+msgctxt "error:sale.sale:0"
+msgid "Invoice and Shipment addresses must be defined for the quotation."
+msgstr ""
+"Las direcciones de facturación y de envío debe ser definida para el "
+"presupuesto."
+
+msgctxt "error:sale.sale:0"
+msgid "It misses an \"Account Receivable\" on the party \"%s\"!"
+msgstr "Falta una «cuenta de ingresos» en el tercero «%s»"
+
+msgctxt "error:sale.sale:0"
+msgid "Wrong combination of method!"
+msgstr "Combinación inválida de métodos"
+
+msgctxt "error:stock.shipment.out:0"
+msgid "You cannot reset to draft a move generated by a sale."
+msgstr "No puede restablecer a borrador un movimiento generado por una venta."
+
+msgctxt "field:account.invoice,sale_exception_state:0"
+msgid "Exception State"
+msgstr "Estado de excepción"
+
+#, fuzzy
+msgctxt "field:account.invoice,sales:0"
+msgid "Sales"
+msgstr "Ventas"
+
+#, fuzzy
+msgctxt "field:account.invoice.line,sale_lines:0"
+msgid "Sale Lines"
+msgstr "Líneas de venta"
+
+#, fuzzy
+msgctxt "field:product.template,delivery_time:0"
+msgid "Delivery Time"
+msgstr "Tiempo de envío"
+
+msgctxt "field:product.template,salable:0"
+msgid "Salable"
+msgstr "Vendible"
+
+msgctxt "field:product.template,sale_uom:0"
+msgid "Sale UOM"
+msgstr "UdM de venta"
+
+#, fuzzy
+msgctxt "field:sale.configuration,rec_name:0"
+msgid "Name"
+msgstr "Nombre del campo"
+
+msgctxt "field:sale.configuration,sale_invoice_method:0"
+msgid "Sale Invoice Method"
+msgstr ""
+
+msgctxt "field:sale.configuration,sale_sequence:0"
+msgid "Sale Reference Sequence"
+msgstr ""
+
+msgctxt "field:sale.configuration,sale_shipment_method:0"
+msgid "Sale Shipment Method"
+msgstr ""
+
+msgctxt "field:sale.handle.invoice.exception.ask,domain_invoices:0"
+msgid "Domain Invoices"
+msgstr "Facturas del dominio"
+
+msgctxt "field:sale.handle.invoice.exception.ask,recreate_invoices:0"
+msgid "Recreate Invoices"
+msgstr "Rehacer facturas"
+
+msgctxt "field:sale.handle.shipment.exception.ask,domain_moves:0"
+msgid "Domain Moves"
+msgstr "Movimientos de dominio"
+
+msgctxt "field:sale.handle.shipment.exception.ask,recreate_moves:0"
+msgid "Recreate Moves"
+msgstr "Rehacer movimientos"
+
+msgctxt "field:sale.line,amount:0"
+msgid "Amount"
+msgstr "Cantidad"
+
+msgctxt "field:sale.line,description:0"
+msgid "Description"
+msgstr "Descripción"
+
+msgctxt "field:sale.line,invoice_lines:0"
+msgid "Invoice Lines"
+msgstr "Líneas de factura"
+
+msgctxt "field:sale.line,move_done:0"
+msgid "Moves Done"
+msgstr "Movimientos terminados"
+
+msgctxt "field:sale.line,move_exception:0"
+msgid "Moves Exception"
+msgstr "Exepción de movimientos"
+
+msgctxt "field:sale.line,moves:0"
+msgid "Moves"
+msgstr "Movimientos"
+
+msgctxt "field:sale.line,moves_ignored:0"
+msgid "Ignored Moves"
+msgstr "Movimientos ignorados"
+
+msgctxt "field:sale.line,moves_recreated:0"
+msgid "Recreated Moves"
+msgstr "Rehacer movimientos"
+
+msgctxt "field:sale.line,note:0"
+msgid "Note"
+msgstr "Nota"
+
+msgctxt "field:sale.line,product:0"
+msgid "Product"
+msgstr "Producto"
+
+msgctxt "field:sale.line,quantity:0"
+msgid "Quantity"
+msgstr "Cantidad"
+
+msgctxt "field:sale.line,rec_name:0"
+msgid "Name"
+msgstr "Nombre"
+
+msgctxt "field:sale.line,sale:0"
+msgid "Sale"
+msgstr "Venta"
+
+msgctxt "field:sale.line,sequence:0"
+msgid "Sequence"
+msgstr "Secuencia"
+
+msgctxt "field:sale.line,taxes:0"
+msgid "Taxes"
+msgstr "Impuestos"
+
+msgctxt "field:sale.line,type:0"
+msgid "Type"
+msgstr "Tipo"
+
+msgctxt "field:sale.line,unit:0"
+msgid "Unit"
+msgstr "Unidad"
+
+msgctxt "field:sale.line,unit_digits:0"
+msgid "Unit Digits"
+msgstr "Dígitos de la unidad"
+
+msgctxt "field:sale.line,unit_price:0"
+msgid "Unit Price"
+msgstr "Precio unitario"
+
+msgctxt "field:sale.line-account.invoice.line,invoice_line:0"
+msgid "Invoice Line"
+msgstr "Línea de factura"
+
+msgctxt "field:sale.line-account.invoice.line,rec_name:0"
+msgid "Name"
+msgstr "Nombre"
+
+msgctxt "field:sale.line-account.invoice.line,sale_line:0"
+msgid "Sale Line"
+msgstr "Línea de venta"
+
+msgctxt "field:sale.line-account.tax,line:0"
+msgid "Sale Line"
+msgstr "Línea de venta"
+
+msgctxt "field:sale.line-account.tax,rec_name:0"
+msgid "Name"
+msgstr "Nombre"
+
+msgctxt "field:sale.line-account.tax,tax:0"
+msgid "Tax"
+msgstr "Impuesto"
+
+msgctxt "field:sale.line-ignored-stock.move,move:0"
+msgid "Move"
+msgstr "Movimiento"
+
+msgctxt "field:sale.line-ignored-stock.move,rec_name:0"
+msgid "Name"
+msgstr "Nombre"
+
+msgctxt "field:sale.line-ignored-stock.move,sale_line:0"
+msgid "Sale Line"
+msgstr "Línea de venta"
+
+msgctxt "field:sale.line-recreated-stock.move,move:0"
+msgid "Move"
+msgstr "Movimiento"
+
+msgctxt "field:sale.line-recreated-stock.move,rec_name:0"
+msgid "Name"
+msgstr "Nombre"
+
+msgctxt "field:sale.line-recreated-stock.move,sale_line:0"
+msgid "Sale Line"
+msgstr "Línea de venta"
+
+msgctxt "field:sale.sale,comment:0"
+msgid "Comment"
+msgstr "Comentario"
+
+msgctxt "field:sale.sale,company:0"
+msgid "Company"
+msgstr "Empresa"
+
+msgctxt "field:sale.sale,currency:0"
+msgid "Currency"
+msgstr "Divisa"
+
+msgctxt "field:sale.sale,currency_digits:0"
+msgid "Currency Digits"
+msgstr "Dígitos de la divisa"
+
+msgctxt "field:sale.sale,description:0"
+msgid "Description"
+msgstr "Descripción"
+
+msgctxt "field:sale.sale,invoice_address:0"
+msgid "Invoice Address"
+msgstr "Dirección de facturación"
+
+msgctxt "field:sale.sale,invoice_exception:0"
+msgid "Invoices Exception"
+msgstr "Excepción de facturación"
+
+msgctxt "field:sale.sale,invoice_method:0"
+msgid "Invoice Method"
+msgstr "Método de facturación"
+
+msgctxt "field:sale.sale,invoice_paid:0"
+msgid "Invoices Paid"
+msgstr "Facturas pagadas"
+
+msgctxt "field:sale.sale,invoice_state:0"
+msgid "Invoice State"
+msgstr "Estado de factura"
+
+msgctxt "field:sale.sale,invoices:0"
+msgid "Invoices"
+msgstr "Facturas"
+
+msgctxt "field:sale.sale,invoices_ignored:0"
+msgid "Ignored Invoices"
+msgstr "Facturas ignoradas"
+
+msgctxt "field:sale.sale,invoices_recreated:0"
+msgid "Recreated Invoices"
+msgstr "Rehacer facturas"
+
+msgctxt "field:sale.sale,lines:0"
+msgid "Lines"
+msgstr "Líneas"
+
+msgctxt "field:sale.sale,moves:0"
+msgid "Moves"
+msgstr "Movimientos"
+
+msgctxt "field:sale.sale,party:0"
+msgid "Party"
+msgstr "Tercero"
+
+msgctxt "field:sale.sale,party_lang:0"
+msgid "Party Language"
+msgstr "Idioma del tercero"
+
+msgctxt "field:sale.sale,payment_term:0"
+msgid "Payment Term"
+msgstr "Término de pago"
+
+msgctxt "field:sale.sale,rec_name:0"
+msgid "Name"
+msgstr "Nombre"
+
+msgctxt "field:sale.sale,reference:0"
+msgid "Reference"
+msgstr "Referencia"
+
+msgctxt "field:sale.sale,sale_date:0"
+msgid "Sale Date"
+msgstr "Fecha de venta"
+
+msgctxt "field:sale.sale,shipment_address:0"
+msgid "Shipment Address"
+msgstr "Dirección de envío"
+
+msgctxt "field:sale.sale,shipment_done:0"
+msgid "Shipment Done"
+msgstr "Envío terminado"
+
+msgctxt "field:sale.sale,shipment_exception:0"
+msgid "Shipments Exception"
+msgstr "Excepción de envíos"
+
+msgctxt "field:sale.sale,shipment_method:0"
+msgid "Shipment Method"
+msgstr "Método de envío"
+
+msgctxt "field:sale.sale,shipment_state:0"
+msgid "Shipment State"
+msgstr "Estado de envío"
+
+msgctxt "field:sale.sale,shipments:0"
+msgid "Shipments"
+msgstr "Envíos"
+
+msgctxt "field:sale.sale,state:0"
+msgid "State"
+msgstr "Estado"
+
+msgctxt "field:sale.sale,tax_amount:0"
+msgid "Tax"
+msgstr "Impuesto"
+
+msgctxt "field:sale.sale,total_amount:0"
+msgid "Total"
+msgstr "Total"
+
+msgctxt "field:sale.sale,untaxed_amount:0"
+msgid "Untaxed"
+msgstr "Sin impuesto"
+
+msgctxt "field:sale.sale,warehouse:0"
+msgid "Warehouse"
+msgstr "Almacén"
+
+msgctxt "field:sale.sale-account.invoice,invoice:0"
+msgid "Invoice"
+msgstr "Factura"
+
+msgctxt "field:sale.sale-account.invoice,rec_name:0"
+msgid "Name"
+msgstr "Nombre"
+
+msgctxt "field:sale.sale-account.invoice,sale:0"
+msgid "Sale"
+msgstr "Venta"
+
+msgctxt "field:sale.sale-ignored-account.invoice,invoice:0"
+msgid "Invoice"
+msgstr "Factura"
+
+msgctxt "field:sale.sale-ignored-account.invoice,rec_name:0"
+msgid "Name"
+msgstr "Nombre"
+
+msgctxt "field:sale.sale-ignored-account.invoice,sale:0"
+msgid "Sale"
+msgstr "Venta"
+
+msgctxt "field:sale.sale-recreated-account.invoice,invoice:0"
+msgid "Invoice"
+msgstr "Factura"
+
+msgctxt "field:sale.sale-recreated-account.invoice,rec_name:0"
+msgid "Name"
+msgstr "Nombre"
+
+msgctxt "field:sale.sale-recreated-account.invoice,sale:0"
+msgid "Sale"
+msgstr "Venta"
+
+msgctxt "field:stock.move,sale:0"
+msgid "Sale"
+msgstr "Venta"
+
+msgctxt "field:stock.move,sale_exception_state:0"
+msgid "Exception State"
+msgstr "Estado excepción"
+
+#, fuzzy
+msgctxt "field:stock.move,sale_line:0"
+msgid "Sale Line"
+msgstr "Línea de venta"
+
+#, fuzzy
+msgctxt "help:product.template,delivery_time:0"
+msgid "In number of days"
+msgstr "En número de días"
+
+msgctxt "help:sale.handle.invoice.exception.ask,recreate_invoices:0"
+msgid ""
+"The selected invoices will be recreated. The other ones will be ignored."
+msgstr ""
+"Las facturas seleccionadas seran recreadas. Las otras serán ignoradas."
+
+msgctxt "model:ir.action,name:act_invoice_form"
+msgid "Invoices"
+msgstr "Facturas"
+
+msgctxt "model:ir.action,name:act_open_customer"
+msgid "Parties associated to Sales"
+msgstr "Terceros asociados a ventas"
+
+msgctxt "model:ir.action,name:act_sale_configuration_form"
+msgid "Sales Configuration"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_sale_form"
+msgid "Sales"
+msgstr "Ventas"
+
+msgctxt "model:ir.action,name:act_sale_form2"
+msgid "Sales"
+msgstr "Ventas"
+
+msgctxt "model:ir.action,name:act_sale_form_confirmed"
+msgid "Confirmed Sales"
+msgstr "Ventas confirmadas"
+
+msgctxt "model:ir.action,name:act_sale_form_draft"
+msgid "Draft Sales"
+msgstr "Ventas en borrador"
+
+msgctxt "model:ir.action,name:act_sale_form_quotation"
+msgid "Quotation Sales"
+msgstr "Ventas presupuestadas"
+
+msgctxt "model:ir.action,name:act_shipment_form"
+msgid "Shipments"
+msgstr "Envíos"
+
+msgctxt "model:ir.action,name:report_sale"
+msgid "Sale"
+msgstr "Venta"
+
+msgctxt "model:ir.action,name:wizard_invoice_handle_exception"
+msgid "Handle Invoice Exception"
+msgstr "Gestionar excepción de factura"
+
+msgctxt "model:ir.action,name:wizard_shipment_handle_exception"
+msgid "Handle Shipment Exception"
+msgstr "Gestionar excepción de envio"
+
+msgctxt "model:ir.sequence,name:sequence_sale"
+msgid "Sale"
+msgstr "Venta"
+
+msgctxt "model:ir.sequence.type,name:sequence_type_sale"
+msgid "Sale"
+msgstr "Venta"
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_configuration"
+msgid "Configuration"
+msgstr "Configuración"
+
+msgctxt "model:ir.ui.menu,name:menu_customer"
+msgid "Parties associated to Sales"
+msgstr "Terceros asociados a ventas"
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_sale"
+msgid "Sales"
+msgstr "Gestión de ventas"
+
+msgctxt "model:ir.ui.menu,name:menu_sale_configuration"
+msgid "Sales Configuration"
+msgstr ""
+
+msgctxt "model:ir.ui.menu,name:menu_sale_form"
+msgid "Sales"
+msgstr "Ventas"
+
+msgctxt "model:ir.ui.menu,name:menu_sale_form_confirmed"
+msgid "Confirmed Sales"
+msgstr "Ventas confirmadas"
+
+msgctxt "model:ir.ui.menu,name:menu_sale_form_draft"
+msgid "Draft Sales"
+msgstr "Ventas en borrador"
+
+msgctxt "model:ir.ui.menu,name:menu_sale_form_quotation"
+msgid "Quotation Sales"
+msgstr "Ventas presupuestadas"
+
+#, fuzzy
+msgctxt "model:res.group,name:group_sale"
+msgid "Sales"
+msgstr "Venta"
+
+msgctxt "model:res.group,name:group_sale_admin"
+msgid "Sales Administrator"
+msgstr ""
+
+msgctxt "model:sale.configuration,name:0"
+msgid "Sale Configuration"
+msgstr ""
+
+msgctxt "model:sale.handle.invoice.exception.ask,name:0"
+msgid "Invoice Exception Ask"
+msgstr "Factura de excepcion - Petición"
+
+msgctxt "model:sale.handle.shipment.exception.ask,name:0"
+msgid "Shipment Exception Ask"
+msgstr "Envio de excepcion - Petición"
+
+msgctxt "model:sale.line,name:0"
+msgid "Sale Line"
+msgstr "Línea de venta"
+
+msgctxt "model:sale.line-account.invoice.line,name:0"
+msgid "Sale Line - Invoice Line"
+msgstr "Línea de venta - Línea de factura"
+
+msgctxt "model:sale.line-account.tax,name:0"
+msgid "Sale Line - Tax"
+msgstr "Línea de venta - Impuesto"
+
+msgctxt "model:sale.line-ignored-stock.move,name:0"
+msgid "Sale Line - Ignored Move"
+msgstr "Línea de venta - Movimiento ignorado"
+
+msgctxt "model:sale.line-recreated-stock.move,name:0"
+msgid "Sale Line - Recreated Move"
+msgstr "Línea de venta - Movimiento recreado"
+
+msgctxt "model:sale.sale,name:0"
+msgid "Sale"
+msgstr "Venta"
+
+msgctxt "model:sale.sale-account.invoice,name:0"
+msgid "Sale - Invoice"
+msgstr "Venta - Factura"
+
+msgctxt "model:sale.sale-ignored-account.invoice,name:0"
+msgid "Sale - Ignored Invoice"
+msgstr "Venta - Factura ignorada"
+
+msgctxt "model:sale.sale-recreated-account.invoice,name:0"
+msgid "Sale - Recreated Invoice"
+msgstr "Venta - Factura recreada"
+
+msgctxt "model:workflow,name:sale_workflow"
+msgid "Sale workflow"
+msgstr "Flujo de Trabajo de Ventas"
+
+msgctxt "model:workflow.activity,name:sale_activity_cancel"
+msgid "Canceled"
+msgstr "Cancelado"
+
+msgctxt "model:workflow.activity,name:sale_activity_confirmed"
+msgid "Confirmed"
+msgstr "Confirmado"
+
+msgctxt "model:workflow.activity,name:sale_activity_done"
+msgid "Done"
+msgstr "Terminado"
+
+msgctxt "model:workflow.activity,name:sale_activity_draft"
+msgid "Draft"
+msgstr "Borrador"
+
+msgctxt "model:workflow.activity,name:sale_activity_invoice_method"
+msgid "Invoice Method"
+msgstr "Método de facturación"
+
+msgctxt "model:workflow.activity,name:sale_activity_invoice_method_done"
+msgid "Invoice Method Done"
+msgstr "Método de factura terminado"
+
+msgctxt "model:workflow.activity,name:sale_activity_invoice_sale_done"
+msgid "Invoice Done"
+msgstr "Factura terminada"
+
+msgctxt "model:workflow.activity,name:sale_activity_invoice_sale_exception"
+msgid "Invoice Exception"
+msgstr "Excepción de factura"
+
+msgctxt "model:workflow.activity,name:sale_activity_invoice_shipment"
+msgid "Invoice Shipment"
+msgstr "Envío de factura"
+
+msgctxt "model:workflow.activity,name:sale_activity_invoice_shipment_done"
+msgid "Invoice Shipment Done"
+msgstr "Envío de factura terminado"
+
+msgctxt ""
+"model:workflow.activity,name:sale_activity_invoice_shipment_exception"
+msgid "Invoice Shipment Exception"
+msgstr "Excepción de envío de factura"
+
+msgctxt "model:workflow.activity,name:sale_activity_invoice_shipment_method"
+msgid "Invoice Shipment Method"
+msgstr "Método de envío de factura"
+
+msgctxt ""
+"model:workflow.activity,name:sale_activity_invoice_shipment_method_done"
+msgid "Invoice Shipment Method Done"
+msgstr "Método de envío de factura terminado"
+
+msgctxt "model:workflow.activity,name:sale_activity_quotation"
+msgid "Quotation"
+msgstr "Presupuesto"
+
+msgctxt "model:workflow.activity,name:sale_activity_shipment"
+msgid "Shipment"
+msgstr "Envío"
+
+msgctxt "model:workflow.activity,name:sale_activity_shipment_exception"
+msgid "Shipment Exception"
+msgstr "Excepción de envío"
+
+msgctxt "model:workflow.activity,name:sale_activity_shipment_invoice"
+msgid "Shipment Invoice"
+msgstr "Envío de factura"
+
+msgctxt "model:workflow.activity,name:sale_activity_shipment_invoice_done"
+msgid "Shipment Invoice Done"
+msgstr "Envío de factura terminado"
+
+msgctxt ""
+"model:workflow.activity,name:sale_activity_shipment_invoice_exception"
+msgid "Shipment Invoice Exception"
+msgstr "Excepción de envío de factura"
+
+msgctxt "model:workflow.activity,name:sale_activity_shipment_invoice_method"
+msgid "Shipment Invoice Method"
+msgstr "Método de envío de factura"
+
+msgctxt ""
+"model:workflow.activity,name:sale_activity_shipment_invoice_method_done"
+msgid "Shipment Invoice Method Done"
+msgstr "Método de envío de factura terminado"
+
+msgctxt "model:workflow.activity,name:sale_activity_shipment_method"
+msgid "Shipment Method"
+msgstr "Método de envío"
+
+msgctxt "model:workflow.activity,name:sale_activity_shipment_method_done"
+msgid "Shipment Method Done"
+msgstr "Método de envío terminado"
+
+msgctxt "model:workflow.activity,name:sale_activity_waiting_invoice_sale"
+msgid "Waiting Invoice"
+msgstr "Esperando factura"
+
+msgctxt "model:workflow.activity,name:sale_activity_waiting_invoice_shipment"
+msgid "Waiting Invoice Shipment"
+msgstr "Esperando Envío de Factura"
+
+msgctxt "model:workflow.activity,name:sale_activity_waiting_shipment"
+msgid "Waiting Shipment"
+msgstr "Esperando Envío"
+
+msgctxt "model:workflow.activity,name:sale_activity_waiting_shipment_invoice"
+msgid "Waiting Shipment Invoice"
+msgstr "Esperando Envío de Factura"
+
+msgctxt "odt:sale.sale:0"
+msgid "Amount"
+msgstr "Cantidad"
+
+msgctxt "odt:sale.sale:0"
+msgid "Date:"
+msgstr "Fecha:"
+
+msgctxt "odt:sale.sale:0"
+msgid "Description"
+msgstr "Descripción"
+
+msgctxt "odt:sale.sale:0"
+msgid "Description:"
+msgstr "Descripción:"
+
+msgctxt "odt:sale.sale:0"
+msgid "Draft Sale Order"
+msgstr "Orden de venta en borrador"
+
+msgctxt "odt:sale.sale:0"
+msgid "E-Mail:"
+msgstr "Correo electrónico:"
+
+msgctxt "odt:sale.sale:0"
+msgid "Phone:"
+msgstr "Teléfono:"
+
+msgctxt "odt:sale.sale:0"
+msgid "Quantity"
+msgstr "Cantidad"
+
+msgctxt "odt:sale.sale:0"
+msgid "Quotation N°:"
+msgstr "Presupuesto Nº:"
+
+msgctxt "odt:sale.sale:0"
+msgid "Sale Order N°:"
+msgstr "Orden de venta Nº:"
+
+msgctxt "odt:sale.sale:0"
+msgid "Taxes"
+msgstr "Impuestos"
+
+msgctxt "odt:sale.sale:0"
+msgid "Taxes:"
+msgstr "Impuestos:"
+
+msgctxt "odt:sale.sale:0"
+msgid "Total (excl. taxes):"
+msgstr "Total (sin impuestos):"
+
+msgctxt "odt:sale.sale:0"
+msgid "Total:"
+msgstr "Total:"
+
+msgctxt "odt:sale.sale:0"
+msgid "Unit Price"
+msgstr "Precio unitario"
+
+msgctxt "odt:sale.sale:0"
+msgid "VAT Number:"
+msgstr ""
+
+msgctxt "odt:sale.sale:0"
+msgid "VAT:"
+msgstr "NIF:"
+
+msgctxt "selection:account.invoice,sale_exception_state:0"
+msgid ""
+msgstr ""
+
+msgctxt "selection:account.invoice,sale_exception_state:0"
+msgid "Ignored"
+msgstr "Ignorado"
+
+msgctxt "selection:account.invoice,sale_exception_state:0"
+msgid "Recreated"
+msgstr "Rehecho"
+
+#, fuzzy
+msgctxt "selection:sale.configuration,sale_invoice_method:0"
+msgid "Manual"
+msgstr "Manual"
+
+#, fuzzy
+msgctxt "selection:sale.configuration,sale_invoice_method:0"
+msgid "On Order Confirmed"
+msgstr "Al confirmar la orden"
+
+#, fuzzy
+msgctxt "selection:sale.configuration,sale_invoice_method:0"
+msgid "On Shipment Sent"
+msgstr "Al Enviarlo"
+
+#, fuzzy
+msgctxt "selection:sale.configuration,sale_shipment_method:0"
+msgid "Manual"
+msgstr "Manual"
+
+#, fuzzy
+msgctxt "selection:sale.configuration,sale_shipment_method:0"
+msgid "On Invoice Paid"
+msgstr "Al pagar la factura"
+
+#, fuzzy
+msgctxt "selection:sale.configuration,sale_shipment_method:0"
+msgid "On Order Confirmed"
+msgstr "Al confirmar la orden"
+
+msgctxt "selection:sale.line,type:0"
+msgid "Comment"
+msgstr "Comentario"
+
+msgctxt "selection:sale.line,type:0"
+msgid "Line"
+msgstr "Línea"
+
+msgctxt "selection:sale.line,type:0"
+msgid "Subtotal"
+msgstr "Subtotal"
+
+msgctxt "selection:sale.line,type:0"
+msgid "Title"
+msgstr "Título"
+
+msgctxt "selection:sale.sale,invoice_method:0"
+msgid "Manual"
+msgstr "Manual"
+
+msgctxt "selection:sale.sale,invoice_method:0"
+msgid "On Order Confirmed"
+msgstr "Al confirmar la orden"
+
+msgctxt "selection:sale.sale,invoice_method:0"
+msgid "On Shipment Sent"
+msgstr "Al Enviarlo"
+
+msgctxt "selection:sale.sale,invoice_state:0"
+msgid "Exception"
+msgstr "Excepción"
+
+msgctxt "selection:sale.sale,invoice_state:0"
+msgid "None"
+msgstr "Ninguno"
+
+msgctxt "selection:sale.sale,invoice_state:0"
+msgid "Paid"
+msgstr "Pagado"
+
+msgctxt "selection:sale.sale,invoice_state:0"
+msgid "Waiting"
+msgstr "En espera"
+
+msgctxt "selection:sale.sale,shipment_method:0"
+msgid "Manual"
+msgstr "Manual"
+
+msgctxt "selection:sale.sale,shipment_method:0"
+msgid "On Invoice Paid"
+msgstr "Al pagar la factura"
+
+msgctxt "selection:sale.sale,shipment_method:0"
+msgid "On Order Confirmed"
+msgstr "Al confirmar la orden"
+
+msgctxt "selection:sale.sale,shipment_state:0"
+msgid "Exception"
+msgstr "Excepción"
+
+msgctxt "selection:sale.sale,shipment_state:0"
+msgid "None"
+msgstr "Ninguno"
+
+msgctxt "selection:sale.sale,shipment_state:0"
+msgid "Sent"
+msgstr "Enviado"
+
+msgctxt "selection:sale.sale,shipment_state:0"
+msgid "Waiting"
+msgstr "En espera"
+
+msgctxt "selection:sale.sale,state:0"
+msgid "Canceled"
+msgstr "Cancelado"
+
+msgctxt "selection:sale.sale,state:0"
+msgid "Confirmed"
+msgstr "Confirmado"
+
+msgctxt "selection:sale.sale,state:0"
+msgid "Done"
+msgstr "Terminada"
+
+msgctxt "selection:sale.sale,state:0"
+msgid "Draft"
+msgstr "Borrador"
+
+msgctxt "selection:sale.sale,state:0"
+msgid "Quotation"
+msgstr "Presupuesto"
+
+msgctxt "selection:stock.move,sale_exception_state:0"
+msgid ""
+msgstr ""
+
+msgctxt "selection:stock.move,sale_exception_state:0"
+msgid "Ignored"
+msgstr "Ignorado"
+
+msgctxt "selection:stock.move,sale_exception_state:0"
+msgid "Recreated"
+msgstr "Rehacer"
+
+msgctxt "view:product.product:0"
+msgid "Customers"
+msgstr "Clientes"
+
+msgctxt "view:product.template:0"
+msgid "Customers"
+msgstr "Clientes"
+
+msgctxt "view:sale.configuration:0"
+msgid "Sale Configuration"
+msgstr ""
+
+msgctxt "view:sale.handle.invoice.exception.ask:0"
+msgid "Choose invoices to recreate"
+msgstr "Escoja una factura a rehacer"
+
+msgctxt "view:sale.handle.invoice.exception.ask:0"
+msgid "Handle Invoice Exception"
+msgstr "Excepción de manejo de factura"
+
+msgctxt "view:sale.handle.shipment.exception.ask:0"
+msgid "Choose move to recreate"
+msgstr "Escoja un movimiento a rehacer"
+
+msgctxt "view:sale.handle.shipment.exception.ask:0"
+msgid "Handle shipment Exception"
+msgstr "Manejar excepción de envio"
+
+msgctxt "view:sale.handle.shipment.exception.ask:0"
+msgid "Recreate Moves"
+msgstr "Recrear movimientos"
+
+msgctxt "view:sale.line:0"
+msgid "General"
+msgstr "General"
+
+msgctxt "view:sale.line:0"
+msgid "Notes"
+msgstr "Notas"
+
+msgctxt "view:sale.line:0"
+msgid "Products"
+msgstr "Productos"
+
+msgctxt "view:sale.line:0"
+msgid "Sale Line"
+msgstr "Línea de venta"
+
+msgctxt "view:sale.line:0"
+msgid "Sale Lines"
+msgstr "Líneas de venta"
+
+msgctxt "view:sale.sale:0"
+msgid "Cancel"
+msgstr "Cancelar"
+
+msgctxt "view:sale.sale:0"
+msgid "Confirm"
+msgstr "Confirmar"
+
+msgctxt "view:sale.sale:0"
+msgid "Draft"
+msgstr "Borrador"
+
+msgctxt "view:sale.sale:0"
+msgid "Handle Invoice Exception"
+msgstr "Manejar excepción de factura"
+
+msgctxt "view:sale.sale:0"
+msgid "Handle Shipment Exception"
+msgstr "Manejar excepción de envio"
+
+msgctxt "view:sale.sale:0"
+msgid "Ignore Invoice Exception"
+msgstr "Ignorar excepción de factura"
+
+msgctxt "view:sale.sale:0"
+msgid "Invoices"
+msgstr "Facturas"
+
+msgctxt "view:sale.sale:0"
+msgid "Lines"
+msgstr "Líneas"
+
+msgctxt "view:sale.sale:0"
+msgid "Moves"
+msgstr "Movimientos"
+
+msgctxt "view:sale.sale:0"
+msgid "Other Info"
+msgstr "Información adicional"
+
+msgctxt "view:sale.sale:0"
+msgid "Quotation"
+msgstr "Presupuesto"
+
+msgctxt "view:sale.sale:0"
+msgid "Sale"
+msgstr "Venta"
+
+msgctxt "view:sale.sale:0"
+msgid "Sales"
+msgstr "Ventas"
+
+msgctxt "view:sale.sale:0"
+msgid "Shipments"
+msgstr "Envios"
+
+msgctxt "wizard_button:sale.handle.invoice.exception,init,end:0"
+msgid "Cancel"
+msgstr "Cancelar"
+
+msgctxt "wizard_button:sale.handle.invoice.exception,init,ok:0"
+msgid "Ok"
+msgstr "Aceptar"
+
+msgctxt "wizard_button:sale.handle.shipment.exception,init,end:0"
+msgid "Cancel"
+msgstr "Cancelar"
+
+msgctxt "wizard_button:sale.handle.shipment.exception,init,ok:0"
+msgid "Ok"
+msgstr "Aceptar"
diff --git a/locale/fr_FR.po b/locale/fr_FR.po
new file mode 100644
index 0000000..6f87b06
--- /dev/null
+++ b/locale/fr_FR.po
@@ -0,0 +1,1002 @@
+# 
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "error:account.invoice:0"
+msgid "You can not delete invoices that come from a sale!"
+msgstr "Vous ne pouvez pas supprimer une facture qui provient d'une vente"
+
+msgctxt "error:account.invoice:0"
+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:0"
+msgid "It misses an \"Account Revenue\" on product \"%s\"!"
+msgstr "Il manque un compte de produits sur le produit \"%s\" !"
+
+msgctxt "error:sale.line:0"
+msgid "It misses an \"account Revenue\" default property!"
+msgstr "il manque une propriété par défaut \"compte de produits\" !"
+
+msgctxt "error:sale.line:0"
+msgid "The customer location is required!"
+msgstr "L'emplacement client est requis !"
+
+msgctxt "error:sale.sale:0"
+msgid "Invoice and Shipment addresses must be defined for the quotation."
+msgstr ""
+"Les adresses de facturation et d'expédition sont requises pour le devis."
+
+msgctxt "error:sale.sale:0"
+msgid "It misses an \"Account Receivable\" on the party \"%s\"!"
+msgstr "Il manque un compte à recevoir sur le tiers \"%s\" !"
+
+msgctxt "error:sale.sale:0"
+msgid "Wrong combination of method!"
+msgstr "Mauvaise combinaison de méthodes !"
+
+msgctxt "error:stock.shipment.out:0"
+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:0"
+msgid "Exception State"
+msgstr "État d'exception"
+
+msgctxt "field:account.invoice,sales:0"
+msgid "Sales"
+msgstr "Ventes"
+
+msgctxt "field:account.invoice.line,sale_lines:0"
+msgid "Sale Lines"
+msgstr "Lignes de vente"
+
+msgctxt "field:product.template,delivery_time:0"
+msgid "Delivery Time"
+msgstr "Délai de livraison"
+
+msgctxt "field:product.template,salable:0"
+msgid "Salable"
+msgstr "Vendable"
+
+msgctxt "field:product.template,sale_uom:0"
+msgid "Sale UOM"
+msgstr "UDM de vente"
+
+msgctxt "field:sale.configuration,rec_name:0"
+msgid "Name"
+msgstr "Nom"
+
+msgctxt "field:sale.configuration,sale_invoice_method:0"
+msgid "Sale Invoice Method"
+msgstr "Facturation"
+
+msgctxt "field:sale.configuration,sale_sequence:0"
+msgid "Sale Reference Sequence"
+msgstr "Séquence de référence de vente"
+
+msgctxt "field:sale.configuration,sale_shipment_method:0"
+msgid "Sale Shipment Method"
+msgstr "Expédition"
+
+msgctxt "field:sale.handle.invoice.exception.ask,domain_invoices:0"
+msgid "Domain Invoices"
+msgstr "Domaine des factures"
+
+msgctxt "field:sale.handle.invoice.exception.ask,recreate_invoices:0"
+msgid "Recreate Invoices"
+msgstr "Recréer les factures"
+
+msgctxt "field:sale.handle.shipment.exception.ask,domain_moves:0"
+msgid "Domain Moves"
+msgstr "Domaine des mouvements"
+
+msgctxt "field:sale.handle.shipment.exception.ask,recreate_moves:0"
+msgid "Recreate Moves"
+msgstr "Recréer les mouvements"
+
+msgctxt "field:sale.line,amount:0"
+msgid "Amount"
+msgstr "Montant"
+
+msgctxt "field:sale.line,description:0"
+msgid "Description"
+msgstr "Description"
+
+msgctxt "field:sale.line,invoice_lines:0"
+msgid "Invoice Lines"
+msgstr "Lignes de facture"
+
+msgctxt "field:sale.line,move_done:0"
+msgid "Moves Done"
+msgstr "Mouvements effectués"
+
+msgctxt "field:sale.line,move_exception:0"
+msgid "Moves Exception"
+msgstr "Mouvements en exception"
+
+msgctxt "field:sale.line,moves:0"
+msgid "Moves"
+msgstr "Mouvements"
+
+msgctxt "field:sale.line,moves_ignored:0"
+msgid "Ignored Moves"
+msgstr "Mouvements ignorés"
+
+msgctxt "field:sale.line,moves_recreated:0"
+msgid "Recreated Moves"
+msgstr "Mouvements recréés"
+
+msgctxt "field:sale.line,note:0"
+msgid "Note"
+msgstr "Note"
+
+msgctxt "field:sale.line,product:0"
+msgid "Product"
+msgstr "Produit"
+
+msgctxt "field:sale.line,quantity:0"
+msgid "Quantity"
+msgstr "Quantité"
+
+msgctxt "field:sale.line,rec_name:0"
+msgid "Name"
+msgstr "Nom"
+
+msgctxt "field:sale.line,sale:0"
+msgid "Sale"
+msgstr "Vente"
+
+msgctxt "field:sale.line,sequence:0"
+msgid "Sequence"
+msgstr "Séquence"
+
+msgctxt "field:sale.line,taxes:0"
+msgid "Taxes"
+msgstr "Taxes"
+
+msgctxt "field:sale.line,type:0"
+msgid "Type"
+msgstr "Type"
+
+msgctxt "field:sale.line,unit:0"
+msgid "Unit"
+msgstr "Unité"
+
+msgctxt "field:sale.line,unit_digits:0"
+msgid "Unit Digits"
+msgstr "Décimales de l'unité"
+
+msgctxt "field:sale.line,unit_price:0"
+msgid "Unit Price"
+msgstr "Prix unitaire"
+
+msgctxt "field:sale.line-account.invoice.line,invoice_line:0"
+msgid "Invoice Line"
+msgstr "Ligne de facture"
+
+msgctxt "field:sale.line-account.invoice.line,rec_name:0"
+msgid "Name"
+msgstr "Nom"
+
+msgctxt "field:sale.line-account.invoice.line,sale_line:0"
+msgid "Sale Line"
+msgstr "Ligne de vente"
+
+msgctxt "field:sale.line-account.tax,line:0"
+msgid "Sale Line"
+msgstr "Ligne de vente"
+
+msgctxt "field:sale.line-account.tax,rec_name:0"
+msgid "Name"
+msgstr "Nom"
+
+msgctxt "field:sale.line-account.tax,tax:0"
+msgid "Tax"
+msgstr "Taxe"
+
+msgctxt "field:sale.line-ignored-stock.move,move:0"
+msgid "Move"
+msgstr "Mouvement"
+
+msgctxt "field:sale.line-ignored-stock.move,rec_name:0"
+msgid "Name"
+msgstr "Nom"
+
+msgctxt "field:sale.line-ignored-stock.move,sale_line:0"
+msgid "Sale Line"
+msgstr "Ligne de vente"
+
+msgctxt "field:sale.line-recreated-stock.move,move:0"
+msgid "Move"
+msgstr "Mouvement"
+
+msgctxt "field:sale.line-recreated-stock.move,rec_name:0"
+msgid "Name"
+msgstr "Nom"
+
+msgctxt "field:sale.line-recreated-stock.move,sale_line:0"
+msgid "Sale Line"
+msgstr "Ligne de vente"
+
+msgctxt "field:sale.sale,comment:0"
+msgid "Comment"
+msgstr "Commentaire"
+
+msgctxt "field:sale.sale,company:0"
+msgid "Company"
+msgstr "Companie"
+
+msgctxt "field:sale.sale,currency:0"
+msgid "Currency"
+msgstr "Devise"
+
+msgctxt "field:sale.sale,currency_digits:0"
+msgid "Currency Digits"
+msgstr "Décimales de la devise"
+
+msgctxt "field:sale.sale,description:0"
+msgid "Description"
+msgstr "Description"
+
+msgctxt "field:sale.sale,invoice_address:0"
+msgid "Invoice Address"
+msgstr "Adresse de facturation"
+
+msgctxt "field:sale.sale,invoice_exception:0"
+msgid "Invoices Exception"
+msgstr "Factures en exception"
+
+msgctxt "field:sale.sale,invoice_method:0"
+msgid "Invoice Method"
+msgstr "Méthode de facturation"
+
+msgctxt "field:sale.sale,invoice_paid:0"
+msgid "Invoices Paid"
+msgstr "Factures payées"
+
+msgctxt "field:sale.sale,invoice_state:0"
+msgid "Invoice State"
+msgstr "État de la factutre"
+
+msgctxt "field:sale.sale,invoices:0"
+msgid "Invoices"
+msgstr "Factures"
+
+msgctxt "field:sale.sale,invoices_ignored:0"
+msgid "Ignored Invoices"
+msgstr "Factures ignorées"
+
+msgctxt "field:sale.sale,invoices_recreated:0"
+msgid "Recreated Invoices"
+msgstr "Factures recréées"
+
+msgctxt "field:sale.sale,lines:0"
+msgid "Lines"
+msgstr "Lignes"
+
+msgctxt "field:sale.sale,moves:0"
+msgid "Moves"
+msgstr "Mouvements"
+
+msgctxt "field:sale.sale,party:0"
+msgid "Party"
+msgstr "Tiers"
+
+msgctxt "field:sale.sale,party_lang:0"
+msgid "Party Language"
+msgstr "Langue du tiers"
+
+msgctxt "field:sale.sale,payment_term:0"
+msgid "Payment Term"
+msgstr "Conditions de paiement"
+
+msgctxt "field:sale.sale,rec_name:0"
+msgid "Name"
+msgstr "Nom"
+
+msgctxt "field:sale.sale,reference:0"
+msgid "Reference"
+msgstr "Référence"
+
+msgctxt "field:sale.sale,sale_date:0"
+msgid "Sale Date"
+msgstr "Date de la vente"
+
+msgctxt "field:sale.sale,shipment_address:0"
+msgid "Shipment Address"
+msgstr "Adresse de livraison"
+
+msgctxt "field:sale.sale,shipment_done:0"
+msgid "Shipment Done"
+msgstr "Expédition effectuée"
+
+msgctxt "field:sale.sale,shipment_exception:0"
+msgid "Shipments Exception"
+msgstr "Expéditions en exception"
+
+msgctxt "field:sale.sale,shipment_method:0"
+msgid "Shipment Method"
+msgstr "Méthode de livraison"
+
+msgctxt "field:sale.sale,shipment_state:0"
+msgid "Shipment State"
+msgstr "État de l'expédition"
+
+msgctxt "field:sale.sale,shipments:0"
+msgid "Shipments"
+msgstr "Expédition"
+
+msgctxt "field:sale.sale,state:0"
+msgid "State"
+msgstr "État"
+
+msgctxt "field:sale.sale,tax_amount:0"
+msgid "Tax"
+msgstr "Taxe"
+
+msgctxt "field:sale.sale,total_amount:0"
+msgid "Total"
+msgstr "Total"
+
+msgctxt "field:sale.sale,untaxed_amount:0"
+msgid "Untaxed"
+msgstr "Non-taxé"
+
+msgctxt "field:sale.sale,warehouse:0"
+msgid "Warehouse"
+msgstr "Entrepôt"
+
+msgctxt "field:sale.sale-account.invoice,invoice:0"
+msgid "Invoice"
+msgstr "Facture"
+
+msgctxt "field:sale.sale-account.invoice,rec_name:0"
+msgid "Name"
+msgstr "Nom"
+
+msgctxt "field:sale.sale-account.invoice,sale:0"
+msgid "Sale"
+msgstr "Vente"
+
+msgctxt "field:sale.sale-ignored-account.invoice,invoice:0"
+msgid "Invoice"
+msgstr "Facture"
+
+msgctxt "field:sale.sale-ignored-account.invoice,rec_name:0"
+msgid "Name"
+msgstr "Nom"
+
+msgctxt "field:sale.sale-ignored-account.invoice,sale:0"
+msgid "Sale"
+msgstr "Vente"
+
+msgctxt "field:sale.sale-recreated-account.invoice,invoice:0"
+msgid "Invoice"
+msgstr "Facture"
+
+msgctxt "field:sale.sale-recreated-account.invoice,rec_name:0"
+msgid "Name"
+msgstr "Nom"
+
+msgctxt "field:sale.sale-recreated-account.invoice,sale:0"
+msgid "Sale"
+msgstr "Vente"
+
+msgctxt "field:stock.move,sale:0"
+msgid "Sale"
+msgstr "Vente"
+
+msgctxt "field:stock.move,sale_exception_state:0"
+msgid "Exception State"
+msgstr "État d'exception"
+
+msgctxt "field:stock.move,sale_line:0"
+msgid "Sale Line"
+msgstr "Ligne de vente"
+
+msgctxt "help:product.template,delivery_time:0"
+msgid "In number of days"
+msgstr "En nombre de jours"
+
+msgctxt "help:sale.handle.invoice.exception.ask,recreate_invoices:0"
+msgid ""
+"The selected invoices will be recreated. The other ones will be ignored."
+msgstr ""
+"Les factures sélectionnées seront recréés. Les autres seront ignorées."
+
+msgctxt "model:ir.action,name:act_invoice_form"
+msgid "Invoices"
+msgstr "Factures"
+
+msgctxt "model:ir.action,name:act_open_customer"
+msgid "Parties associated to Sales"
+msgstr "Tiers associés à des ventes"
+
+msgctxt "model:ir.action,name:act_sale_configuration_form"
+msgid "Sales Configuration"
+msgstr "Configuration des ventes"
+
+msgctxt "model:ir.action,name:act_sale_form"
+msgid "Sales"
+msgstr "Ventes"
+
+msgctxt "model:ir.action,name:act_sale_form2"
+msgid "Sales"
+msgstr "Ventes"
+
+msgctxt "model:ir.action,name:act_sale_form_confirmed"
+msgid "Confirmed Sales"
+msgstr "Ventes confirmées"
+
+msgctxt "model:ir.action,name:act_sale_form_draft"
+msgid "Draft Sales"
+msgstr "Ventes brouillon"
+
+msgctxt "model:ir.action,name:act_sale_form_quotation"
+msgid "Quotation Sales"
+msgstr "Devis"
+
+msgctxt "model:ir.action,name:act_shipment_form"
+msgid "Shipments"
+msgstr "Expéditions"
+
+msgctxt "model:ir.action,name:report_sale"
+msgid "Sale"
+msgstr "Vente"
+
+msgctxt "model:ir.action,name:wizard_invoice_handle_exception"
+msgid "Handle Invoice Exception"
+msgstr "Gérer l'exception de facture"
+
+msgctxt "model:ir.action,name:wizard_shipment_handle_exception"
+msgid "Handle Shipment Exception"
+msgstr "Gérer l'exception d'expédition"
+
+msgctxt "model:ir.sequence,name:sequence_sale"
+msgid "Sale"
+msgstr "Vente"
+
+msgctxt "model:ir.sequence.type,name:sequence_type_sale"
+msgid "Sale"
+msgstr "Vente"
+
+msgctxt "model:ir.ui.menu,name:menu_configuration"
+msgid "Configuration"
+msgstr "Configuration"
+
+msgctxt "model:ir.ui.menu,name:menu_customer"
+msgid "Parties associated to Sales"
+msgstr "Tiers associés à des ventes"
+
+msgctxt "model:ir.ui.menu,name:menu_sale"
+msgid "Sales"
+msgstr "Ventes"
+
+msgctxt "model:ir.ui.menu,name:menu_sale_configuration"
+msgid "Sales Configuration"
+msgstr "Configuration des ventes"
+
+msgctxt "model:ir.ui.menu,name:menu_sale_form"
+msgid "Sales"
+msgstr "Ventes"
+
+msgctxt "model:ir.ui.menu,name:menu_sale_form_confirmed"
+msgid "Confirmed Sales"
+msgstr "Ventes confirmées"
+
+msgctxt "model:ir.ui.menu,name:menu_sale_form_draft"
+msgid "Draft Sales"
+msgstr "Ventes brouillons"
+
+msgctxt "model:ir.ui.menu,name:menu_sale_form_quotation"
+msgid "Quotation Sales"
+msgstr "Devis"
+
+msgctxt "model:res.group,name:group_sale"
+msgid "Sales"
+msgstr "Vente"
+
+msgctxt "model:res.group,name:group_sale_admin"
+msgid "Sales Administrator"
+msgstr "Administrateur des ventes"
+
+msgctxt "model:sale.configuration,name:0"
+msgid "Sale Configuration"
+msgstr "Configuration des ventes"
+
+msgctxt "model:sale.handle.invoice.exception.ask,name:0"
+msgid "Invoice Exception Ask"
+msgstr "Exception de facture - Demande"
+
+msgctxt "model:sale.handle.shipment.exception.ask,name:0"
+msgid "Shipment Exception Ask"
+msgstr "Exception d'expédition - Demande"
+
+msgctxt "model:sale.line,name:0"
+msgid "Sale Line"
+msgstr "Ligne de vente"
+
+msgctxt "model:sale.line-account.invoice.line,name:0"
+msgid "Sale Line - Invoice Line"
+msgstr "Ligne de vente - Ligne de facture"
+
+msgctxt "model:sale.line-account.tax,name:0"
+msgid "Sale Line - Tax"
+msgstr "Ligne de vente - Taxe"
+
+msgctxt "model:sale.line-ignored-stock.move,name:0"
+msgid "Sale Line - Ignored Move"
+msgstr "Ligne de vente - Mouvement ignoré"
+
+msgctxt "model:sale.line-recreated-stock.move,name:0"
+msgid "Sale Line - Recreated Move"
+msgstr "Ligne de vente - Mouvement recréé"
+
+msgctxt "model:sale.sale,name:0"
+msgid "Sale"
+msgstr "Vente"
+
+msgctxt "model:sale.sale-account.invoice,name:0"
+msgid "Sale - Invoice"
+msgstr "Vente - Facture"
+
+msgctxt "model:sale.sale-ignored-account.invoice,name:0"
+msgid "Sale - Ignored Invoice"
+msgstr "Vente - Facture Ignorée"
+
+msgctxt "model:sale.sale-recreated-account.invoice,name:0"
+msgid "Sale - Recreated Invoice"
+msgstr "Vente - Facture recréée"
+
+msgctxt "model:workflow,name:sale_workflow"
+msgid "Sale workflow"
+msgstr "Workflow de vente"
+
+msgctxt "model:workflow.activity,name:sale_activity_cancel"
+msgid "Canceled"
+msgstr "Annulé"
+
+msgctxt "model:workflow.activity,name:sale_activity_confirmed"
+msgid "Confirmed"
+msgstr "Confirmé"
+
+msgctxt "model:workflow.activity,name:sale_activity_done"
+msgid "Done"
+msgstr "Fait"
+
+msgctxt "model:workflow.activity,name:sale_activity_draft"
+msgid "Draft"
+msgstr "Brouillon"
+
+msgctxt "model:workflow.activity,name:sale_activity_invoice_method"
+msgid "Invoice Method"
+msgstr "Méthode de facturation"
+
+msgctxt "model:workflow.activity,name:sale_activity_invoice_method_done"
+msgid "Invoice Method Done"
+msgstr "Méthode de facture faite"
+
+msgctxt "model:workflow.activity,name:sale_activity_invoice_sale_done"
+msgid "Invoice Done"
+msgstr "Facture faite"
+
+msgctxt "model:workflow.activity,name:sale_activity_invoice_sale_exception"
+msgid "Invoice Exception"
+msgstr "Facture en exception"
+
+msgctxt "model:workflow.activity,name:sale_activity_invoice_shipment"
+msgid "Invoice Shipment"
+msgstr "Facture expédition"
+
+msgctxt "model:workflow.activity,name:sale_activity_invoice_shipment_done"
+msgid "Invoice Shipment Done"
+msgstr "Facture expédition faite"
+
+msgctxt ""
+"model:workflow.activity,name:sale_activity_invoice_shipment_exception"
+msgid "Invoice Shipment Exception"
+msgstr "Facture expédition en exception"
+
+msgctxt "model:workflow.activity,name:sale_activity_invoice_shipment_method"
+msgid "Invoice Shipment Method"
+msgstr "Méthode facture expédition"
+
+msgctxt ""
+"model:workflow.activity,name:sale_activity_invoice_shipment_method_done"
+msgid "Invoice Shipment Method Done"
+msgstr "Méthode facture expédition faite"
+
+msgctxt "model:workflow.activity,name:sale_activity_quotation"
+msgid "Quotation"
+msgstr "Devis"
+
+msgctxt "model:workflow.activity,name:sale_activity_shipment"
+msgid "Shipment"
+msgstr "Expédition"
+
+msgctxt "model:workflow.activity,name:sale_activity_shipment_exception"
+msgid "Shipment Exception"
+msgstr "Expédition en exception"
+
+msgctxt "model:workflow.activity,name:sale_activity_shipment_invoice"
+msgid "Shipment Invoice"
+msgstr "Facture expédition"
+
+msgctxt "model:workflow.activity,name:sale_activity_shipment_invoice_done"
+msgid "Shipment Invoice Done"
+msgstr "Facture expédition faite"
+
+msgctxt ""
+"model:workflow.activity,name:sale_activity_shipment_invoice_exception"
+msgid "Shipment Invoice Exception"
+msgstr "Facture expédition en exception"
+
+msgctxt "model:workflow.activity,name:sale_activity_shipment_invoice_method"
+msgid "Shipment Invoice Method"
+msgstr "Méthode facture expédition"
+
+msgctxt ""
+"model:workflow.activity,name:sale_activity_shipment_invoice_method_done"
+msgid "Shipment Invoice Method Done"
+msgstr "Méthode facture expédition faite"
+
+msgctxt "model:workflow.activity,name:sale_activity_shipment_method"
+msgid "Shipment Method"
+msgstr "Méthode d'expédition"
+
+msgctxt "model:workflow.activity,name:sale_activity_shipment_method_done"
+msgid "Shipment Method Done"
+msgstr "Méthode d'expédition faite"
+
+msgctxt "model:workflow.activity,name:sale_activity_waiting_invoice_sale"
+msgid "Waiting Invoice"
+msgstr "Facture en attente"
+
+msgctxt "model:workflow.activity,name:sale_activity_waiting_invoice_shipment"
+msgid "Waiting Invoice Shipment"
+msgstr "Facture expédition en attente"
+
+msgctxt "model:workflow.activity,name:sale_activity_waiting_shipment"
+msgid "Waiting Shipment"
+msgstr "Expédition en attente"
+
+msgctxt "model:workflow.activity,name:sale_activity_waiting_shipment_invoice"
+msgid "Waiting Shipment Invoice"
+msgstr "Facture expédition en attente"
+
+msgctxt "odt:sale.sale:0"
+msgid "Amount"
+msgstr "Montant"
+
+msgctxt "odt:sale.sale:0"
+msgid "Date:"
+msgstr "Date :"
+
+msgctxt "odt:sale.sale:0"
+msgid "Description"
+msgstr "Description"
+
+msgctxt "odt:sale.sale:0"
+msgid "Description:"
+msgstr "Description :"
+
+msgctxt "odt:sale.sale:0"
+msgid "Draft Sale Order"
+msgstr "Bon de commande brouillon"
+
+msgctxt "odt:sale.sale:0"
+msgid "E-Mail:"
+msgstr "E-Mail :"
+
+msgctxt "odt:sale.sale:0"
+msgid "Phone:"
+msgstr "Téléphone :"
+
+msgctxt "odt:sale.sale:0"
+msgid "Quantity"
+msgstr "Quantité"
+
+msgctxt "odt:sale.sale:0"
+msgid "Quotation N°:"
+msgstr "Devis N° :"
+
+msgctxt "odt:sale.sale:0"
+msgid "Sale Order N°:"
+msgstr "Bon de commande N° :"
+
+msgctxt "odt:sale.sale:0"
+msgid "Taxes"
+msgstr "Taxes"
+
+msgctxt "odt:sale.sale:0"
+msgid "Taxes:"
+msgstr "Taxes :"
+
+msgctxt "odt:sale.sale:0"
+msgid "Total (excl. taxes):"
+msgstr "Total (HT) :"
+
+msgctxt "odt:sale.sale:0"
+msgid "Total:"
+msgstr "Total :"
+
+msgctxt "odt:sale.sale:0"
+msgid "Unit Price"
+msgstr "Prix unitaire"
+
+msgctxt "odt:sale.sale:0"
+msgid "VAT Number:"
+msgstr "Numéro TVA :"
+
+msgctxt "odt:sale.sale:0"
+msgid "VAT:"
+msgstr "TVA :"
+
+msgctxt "selection:account.invoice,sale_exception_state:0"
+msgid ""
+msgstr ""
+
+msgctxt "selection:account.invoice,sale_exception_state:0"
+msgid "Ignored"
+msgstr "Ignoré"
+
+msgctxt "selection:account.invoice,sale_exception_state:0"
+msgid "Recreated"
+msgstr "Recréé"
+
+msgctxt "selection:sale.configuration,sale_invoice_method:0"
+msgid "Manual"
+msgstr "Manuel"
+
+msgctxt "selection:sale.configuration,sale_invoice_method:0"
+msgid "On Order Confirmed"
+msgstr "À la confirmation"
+
+msgctxt "selection:sale.configuration,sale_invoice_method:0"
+msgid "On Shipment Sent"
+msgstr "À la livraison"
+
+msgctxt "selection:sale.configuration,sale_shipment_method:0"
+msgid "Manual"
+msgstr "Manuel"
+
+msgctxt "selection:sale.configuration,sale_shipment_method:0"
+msgid "On Invoice Paid"
+msgstr "Au paiement"
+
+msgctxt "selection:sale.configuration,sale_shipment_method:0"
+msgid "On Order Confirmed"
+msgstr "À la confirmation"
+
+msgctxt "selection:sale.line,type:0"
+msgid "Comment"
+msgstr "Commentaire"
+
+msgctxt "selection:sale.line,type:0"
+msgid "Line"
+msgstr "Ligne"
+
+msgctxt "selection:sale.line,type:0"
+msgid "Subtotal"
+msgstr "Sous-total"
+
+msgctxt "selection:sale.line,type:0"
+msgid "Title"
+msgstr "Titre"
+
+msgctxt "selection:sale.sale,invoice_method:0"
+msgid "Manual"
+msgstr "Manuel"
+
+msgctxt "selection:sale.sale,invoice_method:0"
+msgid "On Order Confirmed"
+msgstr "A la confirmation"
+
+msgctxt "selection:sale.sale,invoice_method:0"
+msgid "On Shipment Sent"
+msgstr "À la livraison"
+
+msgctxt "selection:sale.sale,invoice_state:0"
+msgid "Exception"
+msgstr "Exception"
+
+msgctxt "selection:sale.sale,invoice_state:0"
+msgid "None"
+msgstr "Aucun"
+
+msgctxt "selection:sale.sale,invoice_state:0"
+msgid "Paid"
+msgstr "Payé"
+
+msgctxt "selection:sale.sale,invoice_state:0"
+msgid "Waiting"
+msgstr "En attente"
+
+msgctxt "selection:sale.sale,shipment_method:0"
+msgid "Manual"
+msgstr "Manuel"
+
+msgctxt "selection:sale.sale,shipment_method:0"
+msgid "On Invoice Paid"
+msgstr "Au paiement"
+
+msgctxt "selection:sale.sale,shipment_method:0"
+msgid "On Order Confirmed"
+msgstr "À la confirmation"
+
+msgctxt "selection:sale.sale,shipment_state:0"
+msgid "Exception"
+msgstr "Exception"
+
+msgctxt "selection:sale.sale,shipment_state:0"
+msgid "None"
+msgstr "Aucun"
+
+msgctxt "selection:sale.sale,shipment_state:0"
+msgid "Sent"
+msgstr "Envoyé"
+
+msgctxt "selection:sale.sale,shipment_state:0"
+msgid "Waiting"
+msgstr "En attente"
+
+msgctxt "selection:sale.sale,state:0"
+msgid "Canceled"
+msgstr "Annulé"
+
+msgctxt "selection:sale.sale,state:0"
+msgid "Confirmed"
+msgstr "Confirmé"
+
+msgctxt "selection:sale.sale,state:0"
+msgid "Done"
+msgstr "Fait"
+
+msgctxt "selection:sale.sale,state:0"
+msgid "Draft"
+msgstr "Brouillon"
+
+msgctxt "selection:sale.sale,state:0"
+msgid "Quotation"
+msgstr "Devis"
+
+msgctxt "selection:stock.move,sale_exception_state:0"
+msgid ""
+msgstr ""
+
+msgctxt "selection:stock.move,sale_exception_state:0"
+msgid "Ignored"
+msgstr "Ignoré"
+
+msgctxt "selection:stock.move,sale_exception_state:0"
+msgid "Recreated"
+msgstr "Recréé"
+
+msgctxt "view:product.product:0"
+msgid "Customers"
+msgstr "Clients"
+
+msgctxt "view:product.template:0"
+msgid "Customers"
+msgstr "Clients"
+
+msgctxt "view:sale.configuration:0"
+msgid "Sale Configuration"
+msgstr "Configuration des ventes"
+
+msgctxt "view:sale.handle.invoice.exception.ask:0"
+msgid "Choose invoices to recreate"
+msgstr "Choisir les factures à recréer"
+
+msgctxt "view:sale.handle.invoice.exception.ask:0"
+msgid "Handle Invoice Exception"
+msgstr "Gérer l'exception de facture"
+
+msgctxt "view:sale.handle.shipment.exception.ask:0"
+msgid "Choose move to recreate"
+msgstr "Choisir le mouvement à recréer"
+
+msgctxt "view:sale.handle.shipment.exception.ask:0"
+msgid "Handle shipment Exception"
+msgstr "Gérer l'exception d'expédition"
+
+msgctxt "view:sale.handle.shipment.exception.ask:0"
+msgid "Recreate Moves"
+msgstr "Recréer les mouvements"
+
+msgctxt "view:sale.line:0"
+msgid "General"
+msgstr "Général"
+
+msgctxt "view:sale.line:0"
+msgid "Notes"
+msgstr "Notes"
+
+msgctxt "view:sale.line:0"
+msgid "Products"
+msgstr "produits"
+
+msgctxt "view:sale.line:0"
+msgid "Sale Line"
+msgstr "Ligne de vente"
+
+msgctxt "view:sale.line:0"
+msgid "Sale Lines"
+msgstr "Lignes de vente"
+
+msgctxt "view:sale.sale:0"
+msgid "Cancel"
+msgstr "Annuler"
+
+msgctxt "view:sale.sale:0"
+msgid "Confirm"
+msgstr "Confirmer"
+
+msgctxt "view:sale.sale:0"
+msgid "Draft"
+msgstr "Brouillon"
+
+msgctxt "view:sale.sale:0"
+msgid "Handle Invoice Exception"
+msgstr "Gérer l'exception de facture"
+
+msgctxt "view:sale.sale:0"
+msgid "Handle Shipment Exception"
+msgstr "Gérer l'exception d'expédition"
+
+msgctxt "view:sale.sale:0"
+msgid "Ignore Invoice Exception"
+msgstr "Ignorer l'exception de facturation "
+
+msgctxt "view:sale.sale:0"
+msgid "Ignore Shipment Exception"
+msgstr "Ignorer l'exception de livraison"
+
+msgctxt "view:sale.sale:0"
+msgid "Invoices"
+msgstr "Factures"
+
+msgctxt "view:sale.sale:0"
+msgid "Lines"
+msgstr "Lignes"
+
+msgctxt "view:sale.sale:0"
+msgid "Moves"
+msgstr "Mouvements"
+
+msgctxt "view:sale.sale:0"
+msgid "Other Info"
+msgstr "Autre information"
+
+msgctxt "view:sale.sale:0"
+msgid "Quotation"
+msgstr "Devis"
+
+msgctxt "view:sale.sale:0"
+msgid "Sale"
+msgstr "Vente"
+
+msgctxt "view:sale.sale:0"
+msgid "Sales"
+msgstr "Ventes"
+
+msgctxt "view:sale.sale:0"
+msgid "Shipments"
+msgstr "Expéditions"
+
+msgctxt "wizard_button:sale.handle.invoice.exception,init,end:0"
+msgid "Cancel"
+msgstr "Annuler"
+
+msgctxt "wizard_button:sale.handle.invoice.exception,init,ok:0"
+msgid "Ok"
+msgstr "Ok"
+
+msgctxt "wizard_button:sale.handle.shipment.exception,init,end:0"
+msgid "Cancel"
+msgstr "Annuler"
+
+msgctxt "wizard_button:sale.handle.shipment.exception,init,ok:0"
+msgid "Ok"
+msgstr "Ok"
diff --git a/locale/nl_NL.po b/locale/nl_NL.po
new file mode 100644
index 0000000..1462234
--- /dev/null
+++ b/locale/nl_NL.po
@@ -0,0 +1,1019 @@
+# 
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "error:account.invoice:0"
+msgid "You can not delete invoices that come from a sale!"
+msgstr "U kunt geen facturen verwijderen die uit verkoop voortkomen!"
+
+msgctxt "error:account.invoice:0"
+msgid "You cannot reset to draft an invoice generated by a sale."
+msgstr ""
+"U kunt een factuur die uit verkoop voortkomt niet terug zetten naar concept."
+
+msgctxt "error:sale.line:0"
+msgid "It misses an \"Account Revenue\" on product \"%s\"!"
+msgstr "Grootboekrekening \"Opbrengst\" ontbreekt voor product \"%s\"!"
+
+msgctxt "error:sale.line:0"
+msgid "It misses an \"account Revenue\" default property!"
+msgstr "De standaard grootboekrekening \"Opbrengst\" ontbreekt!"
+
+msgctxt "error:sale.line:0"
+msgid "The customer location is required!"
+msgstr "De afleverlocatie is vereist!"
+
+msgctxt "error:sale.sale:0"
+msgid "Invoice and Shipment addresses must be defined for the quotation."
+msgstr "Factuur- en afleveradres moeten gedefinieerd zijn voor de offerte."
+
+msgctxt "error:sale.sale:0"
+msgid "It misses an \"Account Receivable\" on the party \"%s\"!"
+msgstr "Grootboekrekening \"Debiteuren\" ontbreekt voor relatie \"%s\"!"
+
+msgctxt "error:sale.sale:0"
+msgid "Wrong combination of method!"
+msgstr "Verkeerde combinatie van afhandeling!"
+
+msgctxt "error:stock.shipment.out:0"
+msgid "You cannot reset to draft a move generated by a sale."
+msgstr ""
+"U kunt een boeking die uit verkoop voortkomt niet terug zetten naar concept."
+
+msgctxt "field:account.invoice,sale_exception_state:0"
+msgid "Exception State"
+msgstr "Uitzonderingstoestand"
+
+#, fuzzy
+msgctxt "field:account.invoice,sales:0"
+msgid "Sales"
+msgstr "Verkoopbeheer"
+
+#, fuzzy
+msgctxt "field:account.invoice.line,sale_lines:0"
+msgid "Sale Lines"
+msgstr "Offerteregels"
+
+msgctxt "field:product.template,delivery_time:0"
+msgid "Delivery Time"
+msgstr ""
+
+msgctxt "field:product.template,salable:0"
+msgid "Salable"
+msgstr "Verkoopbaar"
+
+msgctxt "field:product.template,sale_uom:0"
+msgid "Sale UOM"
+msgstr "Maateenheid verkoop"
+
+msgctxt "field:sale.configuration,rec_name:0"
+msgid "Name"
+msgstr "Naam"
+
+msgctxt "field:sale.configuration,sale_invoice_method:0"
+msgid "Sale Invoice Method"
+msgstr ""
+
+msgctxt "field:sale.configuration,sale_sequence:0"
+msgid "Sale Reference Sequence"
+msgstr "Verkoopkenmerkreeks"
+
+msgctxt "field:sale.configuration,sale_shipment_method:0"
+msgid "Sale Shipment Method"
+msgstr ""
+
+msgctxt "field:sale.handle.invoice.exception.ask,domain_invoices:0"
+msgid "Domain Invoices"
+msgstr "Domein facturen"
+
+msgctxt "field:sale.handle.invoice.exception.ask,recreate_invoices:0"
+msgid "Recreate Invoices"
+msgstr "Facturen opnieuw aanmaken"
+
+msgctxt "field:sale.handle.shipment.exception.ask,domain_moves:0"
+msgid "Domain Moves"
+msgstr "Domein boekingen"
+
+msgctxt "field:sale.handle.shipment.exception.ask,recreate_moves:0"
+msgid "Recreate Moves"
+msgstr "Boekingen opnieuw aanmaken"
+
+msgctxt "field:sale.line,amount:0"
+msgid "Amount"
+msgstr "Bedrag"
+
+msgctxt "field:sale.line,description:0"
+msgid "Description"
+msgstr "Specificatie"
+
+msgctxt "field:sale.line,invoice_lines:0"
+msgid "Invoice Lines"
+msgstr "Factuurregels"
+
+msgctxt "field:sale.line,move_done:0"
+msgid "Moves Done"
+msgstr "Boekingen klaar"
+
+msgctxt "field:sale.line,move_exception:0"
+msgid "Moves Exception"
+msgstr "Boekingen uitzondering"
+
+msgctxt "field:sale.line,moves:0"
+msgid "Moves"
+msgstr "Boekingen"
+
+msgctxt "field:sale.line,moves_ignored:0"
+msgid "Ignored Moves"
+msgstr "Genegeerde boekingen"
+
+msgctxt "field:sale.line,moves_recreated:0"
+msgid "Recreated Moves"
+msgstr "Opnieuw aangemaakte boekingen"
+
+msgctxt "field:sale.line,note:0"
+msgid "Note"
+msgstr "Aantekening"
+
+msgctxt "field:sale.line,product:0"
+msgid "Product"
+msgstr "Product"
+
+msgctxt "field:sale.line,quantity:0"
+msgid "Quantity"
+msgstr "Hoeveelheid"
+
+msgctxt "field:sale.line,rec_name:0"
+msgid "Name"
+msgstr "Naam"
+
+msgctxt "field:sale.line,sale:0"
+msgid "Sale"
+msgstr "Verkoop"
+
+msgctxt "field:sale.line,sequence:0"
+msgid "Sequence"
+msgstr "Reeks"
+
+msgctxt "field:sale.line,taxes:0"
+msgid "Taxes"
+msgstr "Belastingen"
+
+msgctxt "field:sale.line,type:0"
+msgid "Type"
+msgstr "Type"
+
+msgctxt "field:sale.line,unit:0"
+msgid "Unit"
+msgstr "Eenheid"
+
+msgctxt "field:sale.line,unit_digits:0"
+msgid "Unit Digits"
+msgstr "Decimalen eenheid"
+
+msgctxt "field:sale.line,unit_price:0"
+msgid "Unit Price"
+msgstr "Eenheidsprijs"
+
+msgctxt "field:sale.line-account.invoice.line,invoice_line:0"
+msgid "Invoice Line"
+msgstr "Factuurregel"
+
+msgctxt "field:sale.line-account.invoice.line,rec_name:0"
+msgid "Name"
+msgstr "Naam"
+
+msgctxt "field:sale.line-account.invoice.line,sale_line:0"
+msgid "Sale Line"
+msgstr "Offerteregel"
+
+msgctxt "field:sale.line-account.tax,line:0"
+msgid "Sale Line"
+msgstr "Offerteregel"
+
+msgctxt "field:sale.line-account.tax,rec_name:0"
+msgid "Name"
+msgstr "Naam"
+
+msgctxt "field:sale.line-account.tax,tax:0"
+msgid "Tax"
+msgstr "Belasting"
+
+msgctxt "field:sale.line-ignored-stock.move,move:0"
+msgid "Move"
+msgstr "Boeking"
+
+msgctxt "field:sale.line-ignored-stock.move,rec_name:0"
+msgid "Name"
+msgstr "Naam"
+
+msgctxt "field:sale.line-ignored-stock.move,sale_line:0"
+msgid "Sale Line"
+msgstr "Offerteregel"
+
+msgctxt "field:sale.line-recreated-stock.move,move:0"
+msgid "Move"
+msgstr "Boeking"
+
+msgctxt "field:sale.line-recreated-stock.move,rec_name:0"
+msgid "Name"
+msgstr "Naam"
+
+msgctxt "field:sale.line-recreated-stock.move,sale_line:0"
+msgid "Sale Line"
+msgstr "Offerteregel"
+
+msgctxt "field:sale.sale,comment:0"
+msgid "Comment"
+msgstr "Opmerking"
+
+msgctxt "field:sale.sale,company:0"
+msgid "Company"
+msgstr "Bedrijf"
+
+msgctxt "field:sale.sale,currency:0"
+msgid "Currency"
+msgstr "Valuta"
+
+msgctxt "field:sale.sale,currency_digits:0"
+msgid "Currency Digits"
+msgstr "Valuta decimalen"
+
+msgctxt "field:sale.sale,description:0"
+msgid "Description"
+msgstr "Specificatie"
+
+msgctxt "field:sale.sale,invoice_address:0"
+msgid "Invoice Address"
+msgstr "Factuuradres"
+
+msgctxt "field:sale.sale,invoice_exception:0"
+msgid "Invoices Exception"
+msgstr "Facturen uitzondering"
+
+msgctxt "field:sale.sale,invoice_method:0"
+msgid "Invoice Method"
+msgstr "Factuur afhandeling"
+
+msgctxt "field:sale.sale,invoice_paid:0"
+msgid "Invoices Paid"
+msgstr "Facturen betaald"
+
+msgctxt "field:sale.sale,invoice_state:0"
+msgid "Invoice State"
+msgstr "Factuur status"
+
+msgctxt "field:sale.sale,invoices:0"
+msgid "Invoices"
+msgstr "Facturen"
+
+msgctxt "field:sale.sale,invoices_ignored:0"
+msgid "Ignored Invoices"
+msgstr "Genegeerde facturen"
+
+msgctxt "field:sale.sale,invoices_recreated:0"
+msgid "Recreated Invoices"
+msgstr "Opnieuw aangemaakte facturen"
+
+msgctxt "field:sale.sale,lines:0"
+msgid "Lines"
+msgstr "Regels"
+
+msgctxt "field:sale.sale,moves:0"
+msgid "Moves"
+msgstr "Boekingen"
+
+msgctxt "field:sale.sale,party:0"
+msgid "Party"
+msgstr "Relatie"
+
+msgctxt "field:sale.sale,party_lang:0"
+msgid "Party Language"
+msgstr "Taal relatie"
+
+msgctxt "field:sale.sale,payment_term:0"
+msgid "Payment Term"
+msgstr "Betalingstermijn"
+
+msgctxt "field:sale.sale,rec_name:0"
+msgid "Name"
+msgstr "Naam"
+
+msgctxt "field:sale.sale,reference:0"
+msgid "Reference"
+msgstr "Referentie"
+
+msgctxt "field:sale.sale,sale_date:0"
+msgid "Sale Date"
+msgstr "Verkoopdatum"
+
+msgctxt "field:sale.sale,shipment_address:0"
+msgid "Shipment Address"
+msgstr "Afleveradres"
+
+msgctxt "field:sale.sale,shipment_done:0"
+msgid "Shipment Done"
+msgstr "Afgeleverd"
+
+msgctxt "field:sale.sale,shipment_exception:0"
+msgid "Shipments Exception"
+msgstr "Leveringen uitzonderingen"
+
+msgctxt "field:sale.sale,shipment_method:0"
+msgid "Shipment Method"
+msgstr "Levering afhandeling"
+
+msgctxt "field:sale.sale,shipment_state:0"
+msgid "Shipment State"
+msgstr "Levering status"
+
+msgctxt "field:sale.sale,shipments:0"
+msgid "Shipments"
+msgstr "Leveringen"
+
+msgctxt "field:sale.sale,state:0"
+msgid "State"
+msgstr "Status"
+
+msgctxt "field:sale.sale,tax_amount:0"
+msgid "Tax"
+msgstr "Belasting"
+
+msgctxt "field:sale.sale,total_amount:0"
+msgid "Total"
+msgstr "Totaal"
+
+msgctxt "field:sale.sale,untaxed_amount:0"
+msgid "Untaxed"
+msgstr "Onbelast"
+
+msgctxt "field:sale.sale,warehouse:0"
+msgid "Warehouse"
+msgstr "Magazijn"
+
+msgctxt "field:sale.sale-account.invoice,invoice:0"
+msgid "Invoice"
+msgstr "Factuur"
+
+msgctxt "field:sale.sale-account.invoice,rec_name:0"
+msgid "Name"
+msgstr "Naam"
+
+msgctxt "field:sale.sale-account.invoice,sale:0"
+msgid "Sale"
+msgstr "Verkoop"
+
+msgctxt "field:sale.sale-ignored-account.invoice,invoice:0"
+msgid "Invoice"
+msgstr "Factuur"
+
+msgctxt "field:sale.sale-ignored-account.invoice,rec_name:0"
+msgid "Name"
+msgstr "Naam"
+
+msgctxt "field:sale.sale-ignored-account.invoice,sale:0"
+msgid "Sale"
+msgstr "Verkoop"
+
+msgctxt "field:sale.sale-recreated-account.invoice,invoice:0"
+msgid "Invoice"
+msgstr "Factuur"
+
+msgctxt "field:sale.sale-recreated-account.invoice,rec_name:0"
+msgid "Name"
+msgstr "Naam"
+
+msgctxt "field:sale.sale-recreated-account.invoice,sale:0"
+msgid "Sale"
+msgstr "Verkoop"
+
+msgctxt "field:stock.move,sale:0"
+msgid "Sale"
+msgstr "Verkoop"
+
+msgctxt "field:stock.move,sale_exception_state:0"
+msgid "Exception State"
+msgstr "Uitzonderingstoestand"
+
+msgctxt "field:stock.move,sale_line:0"
+msgid "Sale Line"
+msgstr "Offerteregel"
+
+msgctxt "help:product.template,delivery_time:0"
+msgid "In number of days"
+msgstr ""
+
+msgctxt "help:sale.handle.invoice.exception.ask,recreate_invoices:0"
+msgid ""
+"The selected invoices will be recreated. The other ones will be ignored."
+msgstr ""
+"De geselecteerde facturen worden opnieuw aangemaakt. De rest wordt "
+"genegeerd."
+
+msgctxt "model:ir.action,name:act_invoice_form"
+msgid "Invoices"
+msgstr "Facturen"
+
+msgctxt "model:ir.action,name:act_open_customer"
+msgid "Parties associated to Sales"
+msgstr "Klanten"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_sale_configuration_form"
+msgid "Sales Configuration"
+msgstr "Verkoop instellingen"
+
+msgctxt "model:ir.action,name:act_sale_form"
+msgid "Sales"
+msgstr "Verkoop"
+
+msgctxt "model:ir.action,name:act_sale_form2"
+msgid "Sales"
+msgstr "Verkoop"
+
+msgctxt "model:ir.action,name:act_sale_form_confirmed"
+msgid "Confirmed Sales"
+msgstr "Bevestigde offertes"
+
+msgctxt "model:ir.action,name:act_sale_form_draft"
+msgid "Draft Sales"
+msgstr "Concept offertes"
+
+msgctxt "model:ir.action,name:act_sale_form_quotation"
+msgid "Quotation Sales"
+msgstr "Uitstaande offertes"
+
+msgctxt "model:ir.action,name:act_shipment_form"
+msgid "Shipments"
+msgstr "Leveringen"
+
+msgctxt "model:ir.action,name:report_sale"
+msgid "Sale"
+msgstr "Verkoop"
+
+msgctxt "model:ir.action,name:wizard_invoice_handle_exception"
+msgid "Handle Invoice Exception"
+msgstr "Factuuruitzondering afhandelen"
+
+msgctxt "model:ir.action,name:wizard_shipment_handle_exception"
+msgid "Handle Shipment Exception"
+msgstr "Zendinguitzondering afhandelen"
+
+msgctxt "model:ir.sequence,name:sequence_sale"
+msgid "Sale"
+msgstr "Verkoop"
+
+msgctxt "model:ir.sequence.type,name:sequence_type_sale"
+msgid "Sale"
+msgstr "Verkoop"
+
+msgctxt "model:ir.ui.menu,name:menu_configuration"
+msgid "Configuration"
+msgstr "Instellingen"
+
+msgctxt "model:ir.ui.menu,name:menu_customer"
+msgid "Parties associated to Sales"
+msgstr "Klanten"
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_sale"
+msgid "Sales"
+msgstr "Verkoopbeheer"
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_sale_configuration"
+msgid "Sales Configuration"
+msgstr "Verkoop instellingen"
+
+msgctxt "model:ir.ui.menu,name:menu_sale_form"
+msgid "Sales"
+msgstr "Verkoop"
+
+msgctxt "model:ir.ui.menu,name:menu_sale_form_confirmed"
+msgid "Confirmed Sales"
+msgstr "Bevestigde offertes"
+
+msgctxt "model:ir.ui.menu,name:menu_sale_form_draft"
+msgid "Draft Sales"
+msgstr "Concept offertes"
+
+msgctxt "model:ir.ui.menu,name:menu_sale_form_quotation"
+msgid "Quotation Sales"
+msgstr "Uitstaande offertes"
+
+#, fuzzy
+msgctxt "model:res.group,name:group_sale"
+msgid "Sales"
+msgstr "Verkoop"
+
+#, fuzzy
+msgctxt "model:res.group,name:group_sale_admin"
+msgid "Sales Administrator"
+msgstr "Verkoop beheerder"
+
+msgctxt "model:sale.configuration,name:0"
+msgid "Sale Configuration"
+msgstr "Verkoop instellingen"
+
+msgctxt "model:sale.handle.invoice.exception.ask,name:0"
+msgid "Invoice Exception Ask"
+msgstr "Factuur uitzondering vragen"
+
+msgctxt "model:sale.handle.shipment.exception.ask,name:0"
+msgid "Shipment Exception Ask"
+msgstr "Afleveren uitzondering vragen"
+
+msgctxt "model:sale.line,name:0"
+msgid "Sale Line"
+msgstr "Offerteregel"
+
+msgctxt "model:sale.line-account.invoice.line,name:0"
+msgid "Sale Line - Invoice Line"
+msgstr "Offerteregel - factuurregel"
+
+msgctxt "model:sale.line-account.tax,name:0"
+msgid "Sale Line - Tax"
+msgstr "Offerteregel - belasting"
+
+msgctxt "model:sale.line-ignored-stock.move,name:0"
+msgid "Sale Line - Ignored Move"
+msgstr "Offerteregel - genegeerde boeking"
+
+msgctxt "model:sale.line-recreated-stock.move,name:0"
+msgid "Sale Line - Recreated Move"
+msgstr "Offerteregel - boeking opnieuw aanmaken"
+
+msgctxt "model:sale.sale,name:0"
+msgid "Sale"
+msgstr "Verkoop"
+
+msgctxt "model:sale.sale-account.invoice,name:0"
+msgid "Sale - Invoice"
+msgstr "Verkoop - factuur"
+
+msgctxt "model:sale.sale-ignored-account.invoice,name:0"
+msgid "Sale - Ignored Invoice"
+msgstr "Verkoop - genereerde factuur"
+
+msgctxt "model:sale.sale-recreated-account.invoice,name:0"
+msgid "Sale - Recreated Invoice"
+msgstr "Verkoop - factuur opnieuw aanmaken"
+
+msgctxt "model:workflow,name:sale_workflow"
+msgid "Sale workflow"
+msgstr "Sjaboon verkoop"
+
+msgctxt "model:workflow.activity,name:sale_activity_cancel"
+msgid "Canceled"
+msgstr "Geannuleerd"
+
+msgctxt "model:workflow.activity,name:sale_activity_confirmed"
+msgid "Confirmed"
+msgstr "Bevestigd"
+
+msgctxt "model:workflow.activity,name:sale_activity_done"
+msgid "Done"
+msgstr "Klaar"
+
+msgctxt "model:workflow.activity,name:sale_activity_draft"
+msgid "Draft"
+msgstr "Concept"
+
+msgctxt "model:workflow.activity,name:sale_activity_invoice_method"
+msgid "Invoice Method"
+msgstr "Factuur afhandeling"
+
+msgctxt "model:workflow.activity,name:sale_activity_invoice_method_done"
+msgid "Invoice Method Done"
+msgstr "Factuur afhandeling klaar"
+
+msgctxt "model:workflow.activity,name:sale_activity_invoice_sale_done"
+msgid "Invoice Done"
+msgstr "Factuur klaar"
+
+msgctxt "model:workflow.activity,name:sale_activity_invoice_sale_exception"
+msgid "Invoice Exception"
+msgstr "Factuur uitzondering"
+
+msgctxt "model:workflow.activity,name:sale_activity_invoice_shipment"
+msgid "Invoice Shipment"
+msgstr "Factuur zending"
+
+msgctxt "model:workflow.activity,name:sale_activity_invoice_shipment_done"
+msgid "Invoice Shipment Done"
+msgstr "Factuur zending klaar"
+
+msgctxt ""
+"model:workflow.activity,name:sale_activity_invoice_shipment_exception"
+msgid "Invoice Shipment Exception"
+msgstr "Factuur zending uitzondering"
+
+msgctxt "model:workflow.activity,name:sale_activity_invoice_shipment_method"
+msgid "Invoice Shipment Method"
+msgstr "Factuur zending afhandeling"
+
+msgctxt ""
+"model:workflow.activity,name:sale_activity_invoice_shipment_method_done"
+msgid "Invoice Shipment Method Done"
+msgstr "Factuur zending afhandeling klaar"
+
+msgctxt "model:workflow.activity,name:sale_activity_quotation"
+msgid "Quotation"
+msgstr "Offerte"
+
+msgctxt "model:workflow.activity,name:sale_activity_shipment"
+msgid "Shipment"
+msgstr "Afleveren"
+
+msgctxt "model:workflow.activity,name:sale_activity_shipment_exception"
+msgid "Shipment Exception"
+msgstr "Afleveren uitzondering"
+
+msgctxt "model:workflow.activity,name:sale_activity_shipment_invoice"
+msgid "Shipment Invoice"
+msgstr "Afleverfactuur"
+
+msgctxt "model:workflow.activity,name:sale_activity_shipment_invoice_done"
+msgid "Shipment Invoice Done"
+msgstr "Afleverfactuur klaar"
+
+msgctxt ""
+"model:workflow.activity,name:sale_activity_shipment_invoice_exception"
+msgid "Shipment Invoice Exception"
+msgstr "Afleverfactuur uitzondering"
+
+msgctxt "model:workflow.activity,name:sale_activity_shipment_invoice_method"
+msgid "Shipment Invoice Method"
+msgstr "Afleverfactuur afhandeling"
+
+msgctxt ""
+"model:workflow.activity,name:sale_activity_shipment_invoice_method_done"
+msgid "Shipment Invoice Method Done"
+msgstr "Afleverfactuur afhandeling klaar"
+
+msgctxt "model:workflow.activity,name:sale_activity_shipment_method"
+msgid "Shipment Method"
+msgstr "Levering afhandeling"
+
+msgctxt "model:workflow.activity,name:sale_activity_shipment_method_done"
+msgid "Shipment Method Done"
+msgstr "Levering afhandeling klaar"
+
+msgctxt "model:workflow.activity,name:sale_activity_waiting_invoice_sale"
+msgid "Waiting Invoice"
+msgstr "Wacht op factuur"
+
+msgctxt "model:workflow.activity,name:sale_activity_waiting_invoice_shipment"
+msgid "Waiting Invoice Shipment"
+msgstr "Wacht op factuur levering"
+
+msgctxt "model:workflow.activity,name:sale_activity_waiting_shipment"
+msgid "Waiting Shipment"
+msgstr "Wacht op aflevering"
+
+msgctxt "model:workflow.activity,name:sale_activity_waiting_shipment_invoice"
+msgid "Waiting Shipment Invoice"
+msgstr "Wacht op afleverfactuur"
+
+#, fuzzy
+msgctxt "odt:sale.sale:0"
+msgid "Amount"
+msgstr "Bedrag"
+
+#, fuzzy
+msgctxt "odt:sale.sale:0"
+msgid "Date:"
+msgstr "Datum:"
+
+#, fuzzy
+msgctxt "odt:sale.sale:0"
+msgid "Description"
+msgstr "Specificatie"
+
+#, fuzzy
+msgctxt "odt:sale.sale:0"
+msgid "Description:"
+msgstr "Betreft:"
+
+msgctxt "odt:sale.sale:0"
+msgid "Draft Sale Order"
+msgstr ""
+
+#, fuzzy
+msgctxt "odt:sale.sale:0"
+msgid "E-Mail:"
+msgstr "E-mail:"
+
+#, fuzzy
+msgctxt "odt:sale.sale:0"
+msgid "Phone:"
+msgstr "Telefoon:"
+
+#, fuzzy
+msgctxt "odt:sale.sale:0"
+msgid "Quantity"
+msgstr "Hoeveelheid"
+
+msgctxt "odt:sale.sale:0"
+msgid "Quotation N°:"
+msgstr ""
+
+msgctxt "odt:sale.sale:0"
+msgid "Sale Order N°:"
+msgstr ""
+
+#, fuzzy
+msgctxt "odt:sale.sale:0"
+msgid "Taxes"
+msgstr "Belastingen"
+
+#, fuzzy
+msgctxt "odt:sale.sale:0"
+msgid "Taxes:"
+msgstr "Belastingen:"
+
+#, fuzzy
+msgctxt "odt:sale.sale:0"
+msgid "Total (excl. taxes):"
+msgstr "Totaal (excl. belasting):"
+
+#, fuzzy
+msgctxt "odt:sale.sale:0"
+msgid "Total:"
+msgstr "Totaal:"
+
+#, fuzzy
+msgctxt "odt:sale.sale:0"
+msgid "Unit Price"
+msgstr "Eenheidsprijs"
+
+#, fuzzy
+msgctxt "odt:sale.sale:0"
+msgid "VAT Number:"
+msgstr "BTW-nummer:"
+
+#, fuzzy
+msgctxt "odt:sale.sale:0"
+msgid "VAT:"
+msgstr "BTW:"
+
+msgctxt "selection:account.invoice,sale_exception_state:0"
+msgid ""
+msgstr ""
+
+msgctxt "selection:account.invoice,sale_exception_state:0"
+msgid "Ignored"
+msgstr "Genegeerd"
+
+msgctxt "selection:account.invoice,sale_exception_state:0"
+msgid "Recreated"
+msgstr "Opnieuw aangemaakt"
+
+#, fuzzy
+msgctxt "selection:sale.configuration,sale_invoice_method:0"
+msgid "Manual"
+msgstr "Handmatig"
+
+#, fuzzy
+msgctxt "selection:sale.configuration,sale_invoice_method:0"
+msgid "On Order Confirmed"
+msgstr "Na opdrachtbevestiging"
+
+#, fuzzy
+msgctxt "selection:sale.configuration,sale_invoice_method:0"
+msgid "On Shipment Sent"
+msgstr "Na verzending"
+
+#, fuzzy
+msgctxt "selection:sale.configuration,sale_shipment_method:0"
+msgid "Manual"
+msgstr "Handmatig"
+
+#, fuzzy
+msgctxt "selection:sale.configuration,sale_shipment_method:0"
+msgid "On Invoice Paid"
+msgstr "Na factuur betaald"
+
+#, fuzzy
+msgctxt "selection:sale.configuration,sale_shipment_method:0"
+msgid "On Order Confirmed"
+msgstr "Na opdrachtbevestiging"
+
+msgctxt "selection:sale.line,type:0"
+msgid "Comment"
+msgstr "Opmerking"
+
+msgctxt "selection:sale.line,type:0"
+msgid "Line"
+msgstr "Regel"
+
+msgctxt "selection:sale.line,type:0"
+msgid "Subtotal"
+msgstr "Subtotaal"
+
+msgctxt "selection:sale.line,type:0"
+msgid "Title"
+msgstr "Titel"
+
+msgctxt "selection:sale.sale,invoice_method:0"
+msgid "Manual"
+msgstr "Handmatig"
+
+msgctxt "selection:sale.sale,invoice_method:0"
+msgid "On Order Confirmed"
+msgstr "Na opdrachtbevestiging"
+
+msgctxt "selection:sale.sale,invoice_method:0"
+msgid "On Shipment Sent"
+msgstr "Na verzending"
+
+msgctxt "selection:sale.sale,invoice_state:0"
+msgid "Exception"
+msgstr "Uitzondering"
+
+msgctxt "selection:sale.sale,invoice_state:0"
+msgid "None"
+msgstr "Geen"
+
+msgctxt "selection:sale.sale,invoice_state:0"
+msgid "Paid"
+msgstr "Betaald"
+
+msgctxt "selection:sale.sale,invoice_state:0"
+msgid "Waiting"
+msgstr "In afwachting"
+
+msgctxt "selection:sale.sale,shipment_method:0"
+msgid "Manual"
+msgstr "Handmatig"
+
+msgctxt "selection:sale.sale,shipment_method:0"
+msgid "On Invoice Paid"
+msgstr "Na factuur betaald"
+
+msgctxt "selection:sale.sale,shipment_method:0"
+msgid "On Order Confirmed"
+msgstr "Na opdrachtbevestiging"
+
+msgctxt "selection:sale.sale,shipment_state:0"
+msgid "Exception"
+msgstr "Uitzondering"
+
+msgctxt "selection:sale.sale,shipment_state:0"
+msgid "None"
+msgstr "Geen"
+
+msgctxt "selection:sale.sale,shipment_state:0"
+msgid "Sent"
+msgstr "Verzonden"
+
+msgctxt "selection:sale.sale,shipment_state:0"
+msgid "Waiting"
+msgstr "In afwachting"
+
+msgctxt "selection:sale.sale,state:0"
+msgid "Canceled"
+msgstr "Geannuleerd"
+
+msgctxt "selection:sale.sale,state:0"
+msgid "Confirmed"
+msgstr "Bevestigd"
+
+msgctxt "selection:sale.sale,state:0"
+msgid "Done"
+msgstr "Klaar"
+
+msgctxt "selection:sale.sale,state:0"
+msgid "Draft"
+msgstr "Concept"
+
+msgctxt "selection:sale.sale,state:0"
+msgid "Quotation"
+msgstr "Offerte"
+
+msgctxt "selection:stock.move,sale_exception_state:0"
+msgid ""
+msgstr ""
+
+msgctxt "selection:stock.move,sale_exception_state:0"
+msgid "Ignored"
+msgstr "Genegeerd"
+
+msgctxt "selection:stock.move,sale_exception_state:0"
+msgid "Recreated"
+msgstr "Opnieuw aangemaakt"
+
+msgctxt "view:product.template:0"
+msgid "Customers"
+msgstr "Klanten"
+
+msgctxt "view:sale.configuration:0"
+msgid "Sale Configuration"
+msgstr "Verkoop instellingen"
+
+msgctxt "view:sale.handle.invoice.exception.ask:0"
+msgid "Choose invoices to recreate"
+msgstr "Kies facturen om opnieuw aan te maken"
+
+msgctxt "view:sale.handle.invoice.exception.ask:0"
+msgid "Handle Invoice Exception"
+msgstr "Factuuruitzondering afhandelen"
+
+msgctxt "view:sale.handle.shipment.exception.ask:0"
+msgid "Choose move to recreate"
+msgstr "Kies boeking om opnieuw aan te maken"
+
+msgctxt "view:sale.handle.shipment.exception.ask:0"
+msgid "Handle shipment Exception"
+msgstr "Zendinguitzondering afhandelen"
+
+msgctxt "view:sale.handle.shipment.exception.ask:0"
+msgid "Recreate Moves"
+msgstr "Boekingen opnieuw aanmaken"
+
+msgctxt "view:sale.line:0"
+msgid "General"
+msgstr "Algemeen"
+
+msgctxt "view:sale.line:0"
+msgid "Notes"
+msgstr "Aantekeningen"
+
+msgctxt "view:sale.line:0"
+msgid "Products"
+msgstr "Producten"
+
+msgctxt "view:sale.line:0"
+msgid "Sale Line"
+msgstr "Offerteregel"
+
+msgctxt "view:sale.line:0"
+msgid "Sale Lines"
+msgstr "Offerteregels"
+
+msgctxt "view:sale.sale:0"
+msgid "Cancel"
+msgstr "Annuleren"
+
+msgctxt "view:sale.sale:0"
+msgid "Confirm"
+msgstr "Bevestig"
+
+msgctxt "view:sale.sale:0"
+msgid "Draft"
+msgstr "Concept"
+
+msgctxt "view:sale.sale:0"
+msgid "Handle Invoice Exception"
+msgstr "Factuuruitzondering afhandelen"
+
+msgctxt "view:sale.sale:0"
+msgid "Handle Shipment Exception"
+msgstr "Zendinguitzondering afhandelen"
+
+msgctxt "view:sale.sale:0"
+msgid "Invoices"
+msgstr "Facturen"
+
+msgctxt "view:sale.sale:0"
+msgid "Lines"
+msgstr "Regels"
+
+msgctxt "view:sale.sale:0"
+msgid "Moves"
+msgstr "Boekingen"
+
+msgctxt "view:sale.sale:0"
+msgid "Other Info"
+msgstr "Aanvullende informatie"
+
+msgctxt "view:sale.sale:0"
+msgid "Quotation"
+msgstr "Offerte"
+
+msgctxt "view:sale.sale:0"
+msgid "Sale"
+msgstr "Verkoop"
+
+msgctxt "view:sale.sale:0"
+msgid "Sales"
+msgstr "Verkoop"
+
+msgctxt "view:sale.sale:0"
+msgid "Shipments"
+msgstr "Leveringen"
+
+msgctxt "wizard_button:sale.handle.invoice.exception,init,end:0"
+msgid "Cancel"
+msgstr "Annuleren"
+
+msgctxt "wizard_button:sale.handle.invoice.exception,init,ok:0"
+msgid "Ok"
+msgstr "Oké"
+
+msgctxt "wizard_button:sale.handle.shipment.exception,init,end:0"
+msgid "Cancel"
+msgstr "Annuleren"
+
+msgctxt "wizard_button:sale.handle.shipment.exception,init,ok:0"
+msgid "Ok"
+msgstr "Oké"
diff --git a/locale/ru_RU.po b/locale/ru_RU.po
new file mode 100644
index 0000000..4aa9b50
--- /dev/null
+++ b/locale/ru_RU.po
@@ -0,0 +1,1053 @@
+# 
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "error:account.invoice:0"
+msgid "You can not delete invoices that come from a sale!"
+msgstr ""
+
+msgctxt "error:account.invoice:0"
+msgid "You cannot reset to draft an invoice generated by a sale."
+msgstr ""
+
+msgctxt "error:sale.line:0"
+msgid "It misses an \"Account Revenue\" on product \"%s\"!"
+msgstr ""
+
+msgctxt "error:sale.line:0"
+msgid "It misses an \"account Revenue\" default property!"
+msgstr ""
+
+msgctxt "error:sale.line:0"
+msgid "The customer location is required!"
+msgstr ""
+
+msgctxt "error:sale.sale:0"
+msgid "Invoice and Shipment addresses must be defined for the quotation."
+msgstr ""
+
+msgctxt "error:sale.sale:0"
+msgid "It misses an \"Account Receivable\" on the party \"%s\"!"
+msgstr ""
+
+msgctxt "error:sale.sale:0"
+msgid "Wrong combination of method!"
+msgstr ""
+
+msgctxt "error:stock.shipment.out:0"
+msgid "You cannot reset to draft a move generated by a sale."
+msgstr ""
+
+msgctxt "field:account.invoice,sale_exception_state:0"
+msgid "Exception State"
+msgstr ""
+
+msgctxt "field:account.invoice,sales:0"
+msgid "Sales"
+msgstr ""
+
+msgctxt "field:account.invoice.line,sale_lines:0"
+msgid "Sale Lines"
+msgstr ""
+
+msgctxt "field:product.template,delivery_time:0"
+msgid "Delivery Time"
+msgstr ""
+
+msgctxt "field:product.template,salable:0"
+msgid "Salable"
+msgstr ""
+
+msgctxt "field:product.template,sale_uom:0"
+msgid "Sale UOM"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:sale.configuration,rec_name:0"
+msgid "Name"
+msgstr "Наименование"
+
+msgctxt "field:sale.configuration,sale_invoice_method:0"
+msgid "Sale Invoice Method"
+msgstr ""
+
+msgctxt "field:sale.configuration,sale_sequence:0"
+msgid "Sale Reference Sequence"
+msgstr ""
+
+msgctxt "field:sale.configuration,sale_shipment_method:0"
+msgid "Sale Shipment Method"
+msgstr ""
+
+msgctxt "field:sale.handle.invoice.exception.ask,domain_invoices:0"
+msgid "Domain Invoices"
+msgstr ""
+
+msgctxt "field:sale.handle.invoice.exception.ask,recreate_invoices:0"
+msgid "Recreate Invoices"
+msgstr ""
+
+msgctxt "field:sale.handle.shipment.exception.ask,domain_moves:0"
+msgid "Domain Moves"
+msgstr ""
+
+msgctxt "field:sale.handle.shipment.exception.ask,recreate_moves:0"
+msgid "Recreate Moves"
+msgstr ""
+
+msgctxt "field:sale.line,amount:0"
+msgid "Amount"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:sale.line,description:0"
+msgid "Description"
+msgstr "Описание"
+
+msgctxt "field:sale.line,invoice_lines:0"
+msgid "Invoice Lines"
+msgstr ""
+
+msgctxt "field:sale.line,move_done:0"
+msgid "Moves Done"
+msgstr ""
+
+msgctxt "field:sale.line,move_exception:0"
+msgid "Moves Exception"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:sale.line,moves:0"
+msgid "Moves"
+msgstr "Перемещения"
+
+msgctxt "field:sale.line,moves_ignored:0"
+msgid "Ignored Moves"
+msgstr ""
+
+msgctxt "field:sale.line,moves_recreated:0"
+msgid "Recreated Moves"
+msgstr ""
+
+msgctxt "field:sale.line,note:0"
+msgid "Note"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:sale.line,product:0"
+msgid "Product"
+msgstr "Товарно материальные ценности (ТМЦ)"
+
+#, fuzzy
+msgctxt "field:sale.line,quantity:0"
+msgid "Quantity"
+msgstr "Кол-во"
+
+#, fuzzy
+msgctxt "field:sale.line,rec_name:0"
+msgid "Name"
+msgstr "Наименование"
+
+msgctxt "field:sale.line,sale:0"
+msgid "Sale"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:sale.line,sequence:0"
+msgid "Sequence"
+msgstr "Последовательность"
+
+msgctxt "field:sale.line,taxes:0"
+msgid "Taxes"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:sale.line,type:0"
+msgid "Type"
+msgstr "Тип"
+
+#, fuzzy
+msgctxt "field:sale.line,unit:0"
+msgid "Unit"
+msgstr "Штука"
+
+#, fuzzy
+msgctxt "field:sale.line,unit_digits:0"
+msgid "Unit Digits"
+msgstr "Группа цифр"
+
+#, fuzzy
+msgctxt "field:sale.line,unit_price:0"
+msgid "Unit Price"
+msgstr "Цена за единицу"
+
+msgctxt "field:sale.line-account.invoice.line,invoice_line:0"
+msgid "Invoice Line"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:sale.line-account.invoice.line,rec_name:0"
+msgid "Name"
+msgstr "Наименование"
+
+msgctxt "field:sale.line-account.invoice.line,sale_line:0"
+msgid "Sale Line"
+msgstr ""
+
+msgctxt "field:sale.line-account.tax,line:0"
+msgid "Sale Line"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:sale.line-account.tax,rec_name:0"
+msgid "Name"
+msgstr "Наименование"
+
+msgctxt "field:sale.line-account.tax,tax:0"
+msgid "Tax"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:sale.line-ignored-stock.move,move:0"
+msgid "Move"
+msgstr "Перемещение"
+
+#, fuzzy
+msgctxt "field:sale.line-ignored-stock.move,rec_name:0"
+msgid "Name"
+msgstr "Наименование"
+
+msgctxt "field:sale.line-ignored-stock.move,sale_line:0"
+msgid "Sale Line"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:sale.line-recreated-stock.move,move:0"
+msgid "Move"
+msgstr "Перемещение"
+
+#, fuzzy
+msgctxt "field:sale.line-recreated-stock.move,rec_name:0"
+msgid "Name"
+msgstr "Наименование"
+
+msgctxt "field:sale.line-recreated-stock.move,sale_line:0"
+msgid "Sale Line"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:sale.sale,comment:0"
+msgid "Comment"
+msgstr "Комментарии"
+
+#, fuzzy
+msgctxt "field:sale.sale,company:0"
+msgid "Company"
+msgstr "Учет.орг."
+
+#, fuzzy
+msgctxt "field:sale.sale,currency:0"
+msgid "Currency"
+msgstr "Валюты"
+
+msgctxt "field:sale.sale,currency_digits:0"
+msgid "Currency Digits"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:sale.sale,description:0"
+msgid "Description"
+msgstr "Описание"
+
+msgctxt "field:sale.sale,invoice_address:0"
+msgid "Invoice Address"
+msgstr ""
+
+msgctxt "field:sale.sale,invoice_exception:0"
+msgid "Invoices Exception"
+msgstr ""
+
+msgctxt "field:sale.sale,invoice_method:0"
+msgid "Invoice Method"
+msgstr ""
+
+msgctxt "field:sale.sale,invoice_paid:0"
+msgid "Invoices Paid"
+msgstr ""
+
+msgctxt "field:sale.sale,invoice_state:0"
+msgid "Invoice State"
+msgstr ""
+
+msgctxt "field:sale.sale,invoices:0"
+msgid "Invoices"
+msgstr ""
+
+msgctxt "field:sale.sale,invoices_ignored:0"
+msgid "Ignored Invoices"
+msgstr ""
+
+msgctxt "field:sale.sale,invoices_recreated:0"
+msgid "Recreated Invoices"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:sale.sale,lines:0"
+msgid "Lines"
+msgstr "Строки"
+
+#, fuzzy
+msgctxt "field:sale.sale,moves:0"
+msgid "Moves"
+msgstr "Перемещения"
+
+#, fuzzy
+msgctxt "field:sale.sale,party:0"
+msgid "Party"
+msgstr "Организации"
+
+msgctxt "field:sale.sale,party_lang:0"
+msgid "Party Language"
+msgstr ""
+
+msgctxt "field:sale.sale,payment_term:0"
+msgid "Payment Term"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:sale.sale,rec_name:0"
+msgid "Name"
+msgstr "Наименование"
+
+#, fuzzy
+msgctxt "field:sale.sale,reference:0"
+msgid "Reference"
+msgstr "Ссылка"
+
+msgctxt "field:sale.sale,sale_date:0"
+msgid "Sale Date"
+msgstr ""
+
+msgctxt "field:sale.sale,shipment_address:0"
+msgid "Shipment Address"
+msgstr ""
+
+msgctxt "field:sale.sale,shipment_done:0"
+msgid "Shipment Done"
+msgstr ""
+
+msgctxt "field:sale.sale,shipment_exception:0"
+msgid "Shipments Exception"
+msgstr ""
+
+msgctxt "field:sale.sale,shipment_method:0"
+msgid "Shipment Method"
+msgstr ""
+
+msgctxt "field:sale.sale,shipment_state:0"
+msgid "Shipment State"
+msgstr ""
+
+msgctxt "field:sale.sale,shipments:0"
+msgid "Shipments"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:sale.sale,state:0"
+msgid "State"
+msgstr "Статус"
+
+msgctxt "field:sale.sale,tax_amount:0"
+msgid "Tax"
+msgstr ""
+
+msgctxt "field:sale.sale,total_amount:0"
+msgid "Total"
+msgstr ""
+
+msgctxt "field:sale.sale,untaxed_amount:0"
+msgid "Untaxed"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:sale.sale,warehouse:0"
+msgid "Warehouse"
+msgstr "Товарный склад"
+
+msgctxt "field:sale.sale-account.invoice,invoice:0"
+msgid "Invoice"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:sale.sale-account.invoice,rec_name:0"
+msgid "Name"
+msgstr "Наименование"
+
+msgctxt "field:sale.sale-account.invoice,sale:0"
+msgid "Sale"
+msgstr ""
+
+msgctxt "field:sale.sale-ignored-account.invoice,invoice:0"
+msgid "Invoice"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:sale.sale-ignored-account.invoice,rec_name:0"
+msgid "Name"
+msgstr "Наименование"
+
+msgctxt "field:sale.sale-ignored-account.invoice,sale:0"
+msgid "Sale"
+msgstr ""
+
+msgctxt "field:sale.sale-recreated-account.invoice,invoice:0"
+msgid "Invoice"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:sale.sale-recreated-account.invoice,rec_name:0"
+msgid "Name"
+msgstr "Наименование"
+
+msgctxt "field:sale.sale-recreated-account.invoice,sale:0"
+msgid "Sale"
+msgstr ""
+
+msgctxt "field:stock.move,sale:0"
+msgid "Sale"
+msgstr ""
+
+msgctxt "field:stock.move,sale_exception_state:0"
+msgid "Exception State"
+msgstr ""
+
+msgctxt "field:stock.move,sale_line:0"
+msgid "Sale Line"
+msgstr ""
+
+msgctxt "help:product.template,delivery_time:0"
+msgid "In number of days"
+msgstr ""
+
+msgctxt "help:sale.handle.invoice.exception.ask,recreate_invoices:0"
+msgid ""
+"The selected invoices will be recreated. The other ones will be ignored."
+msgstr ""
+
+msgctxt "model:ir.action,name:act_invoice_form"
+msgid "Invoices"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_open_customer"
+msgid "Parties associated to Sales"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_sale_configuration_form"
+msgid "Sales Configuration"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_sale_form"
+msgid "Sales"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_sale_form2"
+msgid "Sales"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_sale_form_confirmed"
+msgid "Confirmed Sales"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_sale_form_draft"
+msgid "Draft Sales"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_sale_form_quotation"
+msgid "Quotation Sales"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_shipment_form"
+msgid "Shipments"
+msgstr ""
+
+msgctxt "model:ir.action,name:report_sale"
+msgid "Sale"
+msgstr ""
+
+msgctxt "model:ir.action,name:wizard_invoice_handle_exception"
+msgid "Handle Invoice Exception"
+msgstr ""
+
+msgctxt "model:ir.action,name:wizard_shipment_handle_exception"
+msgid "Handle Shipment Exception"
+msgstr ""
+
+msgctxt "model:ir.sequence,name:sequence_sale"
+msgid "Sale"
+msgstr ""
+
+msgctxt "model:ir.sequence.type,name:sequence_type_sale"
+msgid "Sale"
+msgstr ""
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_configuration"
+msgid "Configuration"
+msgstr "Конфигурация"
+
+msgctxt "model:ir.ui.menu,name:menu_customer"
+msgid "Parties associated to Sales"
+msgstr ""
+
+msgctxt "model:ir.ui.menu,name:menu_sale"
+msgid "Sales"
+msgstr ""
+
+msgctxt "model:ir.ui.menu,name:menu_sale_configuration"
+msgid "Sales Configuration"
+msgstr ""
+
+msgctxt "model:ir.ui.menu,name:menu_sale_form"
+msgid "Sales"
+msgstr ""
+
+msgctxt "model:ir.ui.menu,name:menu_sale_form_confirmed"
+msgid "Confirmed Sales"
+msgstr ""
+
+msgctxt "model:ir.ui.menu,name:menu_sale_form_draft"
+msgid "Draft Sales"
+msgstr ""
+
+msgctxt "model:ir.ui.menu,name:menu_sale_form_quotation"
+msgid "Quotation Sales"
+msgstr ""
+
+msgctxt "model:res.group,name:group_sale"
+msgid "Sales"
+msgstr ""
+
+msgctxt "model:res.group,name:group_sale_admin"
+msgid "Sales Administrator"
+msgstr ""
+
+msgctxt "model:sale.configuration,name:0"
+msgid "Sale Configuration"
+msgstr ""
+
+msgctxt "model:sale.handle.invoice.exception.ask,name:0"
+msgid "Invoice Exception Ask"
+msgstr ""
+
+msgctxt "model:sale.handle.shipment.exception.ask,name:0"
+msgid "Shipment Exception Ask"
+msgstr ""
+
+msgctxt "model:sale.line,name:0"
+msgid "Sale Line"
+msgstr ""
+
+msgctxt "model:sale.line-account.invoice.line,name:0"
+msgid "Sale Line - Invoice Line"
+msgstr ""
+
+msgctxt "model:sale.line-account.tax,name:0"
+msgid "Sale Line - Tax"
+msgstr ""
+
+msgctxt "model:sale.line-ignored-stock.move,name:0"
+msgid "Sale Line - Ignored Move"
+msgstr ""
+
+msgctxt "model:sale.line-recreated-stock.move,name:0"
+msgid "Sale Line - Recreated Move"
+msgstr ""
+
+msgctxt "model:sale.sale,name:0"
+msgid "Sale"
+msgstr ""
+
+msgctxt "model:sale.sale-account.invoice,name:0"
+msgid "Sale - Invoice"
+msgstr ""
+
+msgctxt "model:sale.sale-ignored-account.invoice,name:0"
+msgid "Sale - Ignored Invoice"
+msgstr ""
+
+msgctxt "model:sale.sale-recreated-account.invoice,name:0"
+msgid "Sale - Recreated Invoice"
+msgstr ""
+
+msgctxt "model:workflow,name:sale_workflow"
+msgid "Sale workflow"
+msgstr ""
+
+#, fuzzy
+msgctxt "model:workflow.activity,name:sale_activity_cancel"
+msgid "Canceled"
+msgstr "Отменено"
+
+#, fuzzy
+msgctxt "model:workflow.activity,name:sale_activity_confirmed"
+msgid "Confirmed"
+msgstr "Подтвержденно"
+
+#, fuzzy
+msgctxt "model:workflow.activity,name:sale_activity_done"
+msgid "Done"
+msgstr "Выполнено"
+
+#, fuzzy
+msgctxt "model:workflow.activity,name:sale_activity_draft"
+msgid "Draft"
+msgstr "Черновик"
+
+msgctxt "model:workflow.activity,name:sale_activity_invoice_method"
+msgid "Invoice Method"
+msgstr ""
+
+msgctxt "model:workflow.activity,name:sale_activity_invoice_method_done"
+msgid "Invoice Method Done"
+msgstr ""
+
+msgctxt "model:workflow.activity,name:sale_activity_invoice_sale_done"
+msgid "Invoice Done"
+msgstr ""
+
+msgctxt "model:workflow.activity,name:sale_activity_invoice_sale_exception"
+msgid "Invoice Exception"
+msgstr ""
+
+msgctxt "model:workflow.activity,name:sale_activity_invoice_shipment"
+msgid "Invoice Shipment"
+msgstr ""
+
+msgctxt "model:workflow.activity,name:sale_activity_invoice_shipment_done"
+msgid "Invoice Shipment Done"
+msgstr ""
+
+msgctxt ""
+"model:workflow.activity,name:sale_activity_invoice_shipment_exception"
+msgid "Invoice Shipment Exception"
+msgstr ""
+
+msgctxt "model:workflow.activity,name:sale_activity_invoice_shipment_method"
+msgid "Invoice Shipment Method"
+msgstr ""
+
+msgctxt ""
+"model:workflow.activity,name:sale_activity_invoice_shipment_method_done"
+msgid "Invoice Shipment Method Done"
+msgstr ""
+
+msgctxt "model:workflow.activity,name:sale_activity_quotation"
+msgid "Quotation"
+msgstr ""
+
+msgctxt "model:workflow.activity,name:sale_activity_shipment"
+msgid "Shipment"
+msgstr ""
+
+msgctxt "model:workflow.activity,name:sale_activity_shipment_exception"
+msgid "Shipment Exception"
+msgstr ""
+
+msgctxt "model:workflow.activity,name:sale_activity_shipment_invoice"
+msgid "Shipment Invoice"
+msgstr ""
+
+msgctxt "model:workflow.activity,name:sale_activity_shipment_invoice_done"
+msgid "Shipment Invoice Done"
+msgstr ""
+
+msgctxt ""
+"model:workflow.activity,name:sale_activity_shipment_invoice_exception"
+msgid "Shipment Invoice Exception"
+msgstr ""
+
+msgctxt "model:workflow.activity,name:sale_activity_shipment_invoice_method"
+msgid "Shipment Invoice Method"
+msgstr ""
+
+msgctxt ""
+"model:workflow.activity,name:sale_activity_shipment_invoice_method_done"
+msgid "Shipment Invoice Method Done"
+msgstr ""
+
+msgctxt "model:workflow.activity,name:sale_activity_shipment_method"
+msgid "Shipment Method"
+msgstr ""
+
+msgctxt "model:workflow.activity,name:sale_activity_shipment_method_done"
+msgid "Shipment Method Done"
+msgstr ""
+
+msgctxt "model:workflow.activity,name:sale_activity_waiting_invoice_sale"
+msgid "Waiting Invoice"
+msgstr ""
+
+msgctxt "model:workflow.activity,name:sale_activity_waiting_invoice_shipment"
+msgid "Waiting Invoice Shipment"
+msgstr ""
+
+msgctxt "model:workflow.activity,name:sale_activity_waiting_shipment"
+msgid "Waiting Shipment"
+msgstr ""
+
+msgctxt "model:workflow.activity,name:sale_activity_waiting_shipment_invoice"
+msgid "Waiting Shipment Invoice"
+msgstr ""
+
+msgctxt "odt:sale.sale:0"
+msgid "Amount"
+msgstr ""
+
+#, fuzzy
+msgctxt "odt:sale.sale:0"
+msgid "Date:"
+msgstr "Дата:"
+
+#, fuzzy
+msgctxt "odt:sale.sale:0"
+msgid "Description"
+msgstr "Описание"
+
+msgctxt "odt:sale.sale:0"
+msgid "Description:"
+msgstr ""
+
+msgctxt "odt:sale.sale:0"
+msgid "Draft Sale Order"
+msgstr ""
+
+#, fuzzy
+msgctxt "odt:sale.sale:0"
+msgid "E-Mail:"
+msgstr "E-Mail:"
+
+#, fuzzy
+msgctxt "odt:sale.sale:0"
+msgid "Phone:"
+msgstr "Телефон:"
+
+#, fuzzy
+msgctxt "odt:sale.sale:0"
+msgid "Quantity"
+msgstr "Кол-во"
+
+msgctxt "odt:sale.sale:0"
+msgid "Quotation N°:"
+msgstr ""
+
+msgctxt "odt:sale.sale:0"
+msgid "Sale Order N°:"
+msgstr ""
+
+msgctxt "odt:sale.sale:0"
+msgid "Taxes"
+msgstr ""
+
+msgctxt "odt:sale.sale:0"
+msgid "Taxes:"
+msgstr ""
+
+msgctxt "odt:sale.sale:0"
+msgid "Total (excl. taxes):"
+msgstr ""
+
+msgctxt "odt:sale.sale:0"
+msgid "Total:"
+msgstr ""
+
+#, fuzzy
+msgctxt "odt:sale.sale:0"
+msgid "Unit Price"
+msgstr "Цена за единицу"
+
+msgctxt "odt:sale.sale:0"
+msgid "VAT Number:"
+msgstr ""
+
+msgctxt "odt:sale.sale:0"
+msgid "VAT:"
+msgstr ""
+
+#, fuzzy
+msgctxt "selection:account.invoice,sale_exception_state:0"
+msgid ""
+msgstr "Резервный счет"
+
+msgctxt "selection:account.invoice,sale_exception_state:0"
+msgid "Ignored"
+msgstr ""
+
+msgctxt "selection:account.invoice,sale_exception_state:0"
+msgid "Recreated"
+msgstr ""
+
+msgctxt "selection:sale.configuration,sale_invoice_method:0"
+msgid "Manual"
+msgstr ""
+
+msgctxt "selection:sale.configuration,sale_invoice_method:0"
+msgid "On Order Confirmed"
+msgstr ""
+
+msgctxt "selection:sale.configuration,sale_invoice_method:0"
+msgid "On Shipment Sent"
+msgstr ""
+
+msgctxt "selection:sale.configuration,sale_shipment_method:0"
+msgid "Manual"
+msgstr ""
+
+msgctxt "selection:sale.configuration,sale_shipment_method:0"
+msgid "On Invoice Paid"
+msgstr ""
+
+msgctxt "selection:sale.configuration,sale_shipment_method:0"
+msgid "On Order Confirmed"
+msgstr ""
+
+#, fuzzy
+msgctxt "selection:sale.line,type:0"
+msgid "Comment"
+msgstr "Комментарии"
+
+msgctxt "selection:sale.line,type:0"
+msgid "Line"
+msgstr ""
+
+msgctxt "selection:sale.line,type:0"
+msgid "Subtotal"
+msgstr ""
+
+msgctxt "selection:sale.line,type:0"
+msgid "Title"
+msgstr ""
+
+msgctxt "selection:sale.sale,invoice_method:0"
+msgid "Manual"
+msgstr ""
+
+msgctxt "selection:sale.sale,invoice_method:0"
+msgid "On Order Confirmed"
+msgstr ""
+
+msgctxt "selection:sale.sale,invoice_method:0"
+msgid "On Shipment Sent"
+msgstr ""
+
+msgctxt "selection:sale.sale,invoice_state:0"
+msgid "Exception"
+msgstr ""
+
+#, fuzzy
+msgctxt "selection:sale.sale,invoice_state:0"
+msgid "None"
+msgstr "Отсутствует"
+
+msgctxt "selection:sale.sale,invoice_state:0"
+msgid "Paid"
+msgstr ""
+
+#, fuzzy
+msgctxt "selection:sale.sale,invoice_state:0"
+msgid "Waiting"
+msgstr "Ожидание"
+
+msgctxt "selection:sale.sale,shipment_method:0"
+msgid "Manual"
+msgstr ""
+
+msgctxt "selection:sale.sale,shipment_method:0"
+msgid "On Invoice Paid"
+msgstr ""
+
+msgctxt "selection:sale.sale,shipment_method:0"
+msgid "On Order Confirmed"
+msgstr ""
+
+msgctxt "selection:sale.sale,shipment_state:0"
+msgid "Exception"
+msgstr ""
+
+#, fuzzy
+msgctxt "selection:sale.sale,shipment_state:0"
+msgid "None"
+msgstr "Отсутствует"
+
+msgctxt "selection:sale.sale,shipment_state:0"
+msgid "Sent"
+msgstr ""
+
+#, fuzzy
+msgctxt "selection:sale.sale,shipment_state:0"
+msgid "Waiting"
+msgstr "Ожидание"
+
+#, fuzzy
+msgctxt "selection:sale.sale,state:0"
+msgid "Canceled"
+msgstr "Отменено"
+
+#, fuzzy
+msgctxt "selection:sale.sale,state:0"
+msgid "Confirmed"
+msgstr "Подтвержденно"
+
+#, fuzzy
+msgctxt "selection:sale.sale,state:0"
+msgid "Done"
+msgstr "Выполнено"
+
+#, fuzzy
+msgctxt "selection:sale.sale,state:0"
+msgid "Draft"
+msgstr "Черновик"
+
+msgctxt "selection:sale.sale,state:0"
+msgid "Quotation"
+msgstr ""
+
+#, fuzzy
+msgctxt "selection:stock.move,sale_exception_state:0"
+msgid ""
+msgstr "Резервный счет"
+
+msgctxt "selection:stock.move,sale_exception_state:0"
+msgid "Ignored"
+msgstr ""
+
+msgctxt "selection:stock.move,sale_exception_state:0"
+msgid "Recreated"
+msgstr ""
+
+msgctxt "view:product.template:0"
+msgid "Customers"
+msgstr ""
+
+msgctxt "view:sale.configuration:0"
+msgid "Sale Configuration"
+msgstr ""
+
+msgctxt "view:sale.handle.invoice.exception.ask:0"
+msgid "Choose invoices to recreate"
+msgstr ""
+
+msgctxt "view:sale.handle.invoice.exception.ask:0"
+msgid "Handle Invoice Exception"
+msgstr ""
+
+msgctxt "view:sale.handle.shipment.exception.ask:0"
+msgid "Choose move to recreate"
+msgstr ""
+
+msgctxt "view:sale.handle.shipment.exception.ask:0"
+msgid "Handle shipment Exception"
+msgstr ""
+
+msgctxt "view:sale.handle.shipment.exception.ask:0"
+msgid "Recreate Moves"
+msgstr ""
+
+#, fuzzy
+msgctxt "view:sale.line:0"
+msgid "General"
+msgstr "Основной"
+
+#, fuzzy
+msgctxt "view:sale.line:0"
+msgid "Notes"
+msgstr "Комментарии"
+
+#, fuzzy
+msgctxt "view:sale.line:0"
+msgid "Products"
+msgstr "ТМЦ"
+
+msgctxt "view:sale.line:0"
+msgid "Sale Line"
+msgstr ""
+
+msgctxt "view:sale.line:0"
+msgid "Sale Lines"
+msgstr ""
+
+#, fuzzy
+msgctxt "view:sale.sale:0"
+msgid "Cancel"
+msgstr "Отменить"
+
+#, fuzzy
+msgctxt "view:sale.sale:0"
+msgid "Confirm"
+msgstr "Подтверждать"
+
+#, fuzzy
+msgctxt "view:sale.sale:0"
+msgid "Draft"
+msgstr "Черновик"
+
+msgctxt "view:sale.sale:0"
+msgid "Handle Invoice Exception"
+msgstr ""
+
+msgctxt "view:sale.sale:0"
+msgid "Handle Shipment Exception"
+msgstr ""
+
+msgctxt "view:sale.sale:0"
+msgid "Invoices"
+msgstr ""
+
+#, fuzzy
+msgctxt "view:sale.sale:0"
+msgid "Lines"
+msgstr "Строки"
+
+#, fuzzy
+msgctxt "view:sale.sale:0"
+msgid "Moves"
+msgstr "Перемещения"
+
+msgctxt "view:sale.sale:0"
+msgid "Other Info"
+msgstr ""
+
+msgctxt "view:sale.sale:0"
+msgid "Quotation"
+msgstr ""
+
+msgctxt "view:sale.sale:0"
+msgid "Sale"
+msgstr ""
+
+msgctxt "view:sale.sale:0"
+msgid "Sales"
+msgstr ""
+
+msgctxt "view:sale.sale:0"
+msgid "Shipments"
+msgstr ""
+
+#, fuzzy
+msgctxt "wizard_button:sale.handle.invoice.exception,init,end:0"
+msgid "Cancel"
+msgstr "Отменить"
+
+#, fuzzy
+msgctxt "wizard_button:sale.handle.invoice.exception,init,ok:0"
+msgid "Ok"
+msgstr "Ок"
+
+#, fuzzy
+msgctxt "wizard_button:sale.handle.shipment.exception,init,end:0"
+msgid "Cancel"
+msgstr "Отменить"
+
+#, fuzzy
+msgctxt "wizard_button:sale.handle.shipment.exception,init,ok:0"
+msgid "Ok"
+msgstr "Ок"
diff --git a/nl_NL.csv b/nl_NL.csv
deleted file mode 100644
index 1d065ac..0000000
--- a/nl_NL.csv
+++ /dev/null
@@ -1,219 +0,0 @@
-type,name,res_id,src,value,fuzzy
-error,account.invoice,0,You can not delete invoices that come from a sale!,U kunt geen facturen verwijderen die uit verkoop voortkomen!,0
-error,account.invoice,0,You cannot reset to draft an invoice generated by a sale.,U kunt een factuur die uit verkoop voortkomt niet terug zetten naar concept.,0
-error,sale.line,0,"It misses an ""Account Revenue"" on product ""%s""!","Grootboekrekening ""Opbrengst"" ontbreekt voor product ""%s""!",0
-error,sale.line,0,"It misses an ""account Revenue"" default property!","De standaard grootboekrekening ""Opbrengst"" ontbreekt!",0
-error,sale.line,0,The customer location is required!,De afleverlocatie is vereist!,0
-error,sale.sale,0,Invoice and Shipment addresses must be defined for the quotation.,Factuur- en afleveradres moeten gedefinieerd zijn voor de offerte.,0
-error,sale.sale,0,"It misses an ""Account Receivable"" on the party ""%s""!","Grootboekrekening ""Debiteuren"" ontbreekt voor relatie ""%s""!",0
-error,sale.sale,0,Wrong combination of method!,Verkeerde combinatie van afhandeling!,0
-error,stock.shipment.out,0,You cannot reset to draft a move generated by a sale.,U kunt een boeking die uit verkoop voortkomt niet terug zetten naar concept.,0
-field,"account.invoice,sale_exception_state",0,Exception State,Uitzonderingstoestand,0
-field,"product.template,salable",0,Salable,Verkoopbaar,0
-field,"product.template,sale_uom",0,Sale UOM,Maateenheid verkoop,0
-field,"sale.configuration,rec_name",0,Name,Naam,0
-field,"sale.configuration,sale_sequence",0,Sale Reference Sequence,Verkoopkenmerkreeks,0
-field,"sale.handle.invoice.exception.ask,domain_invoices",0,Domain Invoices,Domein facturen,0
-field,"sale.handle.invoice.exception.ask,recreate_invoices",0,Recreate Invoices,Facturen opnieuw aanmaken,0
-field,"sale.handle.shipment.exception.ask,domain_moves",0,Domain Moves,Domein boekingen,0
-field,"sale.handle.shipment.exception.ask,recreate_moves",0,Recreate Moves,Boekingen opnieuw aanmaken,0
-field,"sale.line,amount",0,Amount,Bedrag,0
-field,"sale.line,description",0,Description,Specificatie,0
-field,"sale.line,invoice_lines",0,Invoice Lines,Factuurregels,0
-field,"sale.line,move_done",0,Moves Done,Boekingen klaar,0
-field,"sale.line,move_exception",0,Moves Exception,Boekingen uitzondering,0
-field,"sale.line,moves",0,Moves,Boekingen,0
-field,"sale.line,moves_ignored",0,Ignored Moves,Genegeerde boekingen,0
-field,"sale.line,moves_recreated",0,Recreated Moves,Opnieuw aangemaakte boekingen,0
-field,"sale.line,note",0,Note,Aantekening,0
-field,"sale.line,product",0,Product,Product,0
-field,"sale.line,quantity",0,Quantity,Hoeveelheid,0
-field,"sale.line,rec_name",0,Name,Naam,0
-field,"sale.line,sale",0,Sale,Verkoop,0
-field,"sale.line,sequence",0,Sequence,Reeks,0
-field,"sale.line,taxes",0,Taxes,Belastingen,0
-field,"sale.line,type",0,Type,Type,0
-field,"sale.line,unit",0,Unit,Eenheid,0
-field,"sale.line,unit_digits",0,Unit Digits,Decimalen eenheid,0
-field,"sale.line,unit_price",0,Unit Price,Eenheidsprijs,0
-field,"sale.line-account.invoice.line,invoice_line",0,Invoice Line,Factuurregel,0
-field,"sale.line-account.invoice.line,rec_name",0,Name,Naam,0
-field,"sale.line-account.invoice.line,sale_line",0,Sale Line,Offerteregel,0
-field,"sale.line-account.tax,line",0,Sale Line,Offerteregel,0
-field,"sale.line-account.tax,rec_name",0,Name,Naam,0
-field,"sale.line-account.tax,tax",0,Tax,Belasting,0
-field,"sale.line-ignored-stock.move,move",0,Move,Boeking,0
-field,"sale.line-ignored-stock.move,rec_name",0,Name,Naam,0
-field,"sale.line-ignored-stock.move,sale_line",0,Sale Line,Offerteregel,0
-field,"sale.line-recreated-stock.move,move",0,Move,Boeking,0
-field,"sale.line-recreated-stock.move,rec_name",0,Name,Naam,0
-field,"sale.line-recreated-stock.move,sale_line",0,Sale Line,Offerteregel,0
-field,"sale.sale,comment",0,Comment,Opmerking,0
-field,"sale.sale,company",0,Company,Bedrijf,0
-field,"sale.sale,currency",0,Currency,Valuta,0
-field,"sale.sale,currency_digits",0,Currency Digits,Valuta decimalen,0
-field,"sale.sale,description",0,Description,Specificatie,0
-field,"sale.sale,invoice_address",0,Invoice Address,Factuuradres,0
-field,"sale.sale,invoice_exception",0,Invoices Exception,Facturen uitzondering,0
-field,"sale.sale,invoice_method",0,Invoice Method,Factuur afhandeling,0
-field,"sale.sale,invoice_paid",0,Invoices Paid,Facturen betaald,0
-field,"sale.sale,invoice_state",0,Invoice State,Factuur status,0
-field,"sale.sale,invoices",0,Invoices,Facturen,0
-field,"sale.sale,invoices_ignored",0,Ignored Invoices,Genegeerde facturen,0
-field,"sale.sale,invoices_recreated",0,Recreated Invoices,Opnieuw aangemaakte facturen,0
-field,"sale.sale,lines",0,Lines,Regels,0
-field,"sale.sale,moves",0,Moves,Boekingen,0
-field,"sale.sale,party",0,Party,Relatie,0
-field,"sale.sale,party_lang",0,Party Language,Taal relatie,0
-field,"sale.sale,payment_term",0,Payment Term,Betalingstermijn,0
-field,"sale.sale,rec_name",0,Name,Naam,0
-field,"sale.sale,reference",0,Reference,Referentie,0
-field,"sale.sale,sale_date",0,Sale Date,Verkoopdatum,0
-field,"sale.sale,shipment_address",0,Shipment Address,Afleveradres,0
-field,"sale.sale,shipment_done",0,Shipment Done,Afgeleverd,0
-field,"sale.sale,shipment_exception",0,Shipments Exception,Leveringen uitzonderingen,0
-field,"sale.sale,shipment_method",0,Shipment Method,Levering afhandeling,0
-field,"sale.sale,shipment_state",0,Shipment State,Levering status,0
-field,"sale.sale,shipments",0,Shipments,Leveringen,0
-field,"sale.sale,state",0,State,Status,0
-field,"sale.sale,tax_amount",0,Tax,Belasting,0
-field,"sale.sale,total_amount",0,Total,Totaal,0
-field,"sale.sale,untaxed_amount",0,Untaxed,Onbelast,0
-field,"sale.sale,warehouse",0,Warehouse,Magazijn,0
-field,"sale.sale-account.invoice,invoice",0,Invoice,Factuur,0
-field,"sale.sale-account.invoice,rec_name",0,Name,Naam,0
-field,"sale.sale-account.invoice,sale",0,Sale,Verkoop,0
-field,"sale.sale-ignored-account.invoice,invoice",0,Invoice,Factuur,0
-field,"sale.sale-ignored-account.invoice,rec_name",0,Name,Naam,0
-field,"sale.sale-ignored-account.invoice,sale",0,Sale,Verkoop,0
-field,"sale.sale-recreated-account.invoice,invoice",0,Invoice,Factuur,0
-field,"sale.sale-recreated-account.invoice,rec_name",0,Name,Naam,0
-field,"sale.sale-recreated-account.invoice,sale",0,Sale,Verkoop,0
-field,"stock.move,sale",0,Sale,Verkoop,0
-field,"stock.move,sale_exception_state",0,Exception State,Uitzonderingstoestand,0
-field,"stock.move,sale_line",0,Sale Line,Offerteregel,0
-help,"sale.handle.invoice.exception.ask,recreate_invoices",0,The selected invoices will be recreated. The other ones will be ignored.,De geselecteerde facturen worden opnieuw aangemaakt. De rest wordt genegeerd.,0
-model,"ir.action,name",act_invoice_form,Invoices,Facturen,0
-model,"ir.action,name",act_open_customer,Parties associated to Sales,Klanten,0
-model,"ir.action,name",act_sale_configuration_form,Sale Configuration,Verkoop instellingen,0
-model,"ir.action,name",act_sale_form,Sales,Verkoop,0
-model,"ir.action,name",act_sale_form2,Sales,Verkoop,0
-model,"ir.action,name",act_sale_form_confirmed,Confirmed Sales,Bevestigde offertes,0
-model,"ir.action,name",act_sale_form_draft,Draft Sales,Concept offertes,0
-model,"ir.action,name",act_sale_form_new,New Sale,Nieuwe verkoop,0
-model,"ir.action,name",act_sale_form_quotation,Quotation Sales,Uitstaande offertes,0
-model,"ir.action,name",act_shipment_form,Shipments,Leveringen,0
-model,"ir.action,name",report_sale,Sale,Verkoop,0
-model,"ir.action,name",wizard_invoice_handle_exception,Handle Invoice Exception,Factuuruitzondering afhandelen,0
-model,"ir.action,name",wizard_shipment_handle_exception,Handle Shipment Exception,Zendinguitzondering afhandelen,0
-model,"ir.sequence,name",sequence_sale,Sale,Verkoop,0
-model,"ir.sequence.type,name",sequence_type_sale,Sale,Verkoop,0
-model,"ir.ui.menu,name",menu_configuration,Configuration,Instellingen,0
-model,"ir.ui.menu,name",menu_customer,Parties associated to Sales,Klanten,0
-model,"ir.ui.menu,name",menu_sale,Sale Management,Verkoopbeheer,0
-model,"ir.ui.menu,name",menu_sale_configuration,Sale Configuration,Verkoop instellingen,0
-model,"ir.ui.menu,name",menu_sale_form,Sales,Verkoop,0
-model,"ir.ui.menu,name",menu_sale_form_confirmed,Confirmed Sales,Bevestigde offertes,0
-model,"ir.ui.menu,name",menu_sale_form_draft,Draft Sales,Concept offertes,0
-model,"ir.ui.menu,name",menu_sale_form_new,New Sale,Nieuwe offerte,0
-model,"ir.ui.menu,name",menu_sale_form_quotation,Quotation Sales,Uitstaande offertes,0
-model,"res.group,name",group_sale,Sale,Verkoop,0
-model,"res.group,name",group_sale_admin,Sale Administrator,Verkoop beheerder,0
-model,"sale.configuration,name",0,Sale Configuration,Verkoop instellingen,0
-model,"sale.handle.invoice.exception.ask,name",0,Invoice Exception Ask,Factuur uitzondering vragen,0
-model,"sale.handle.shipment.exception.ask,name",0,Shipment Exception Ask,Afleveren uitzondering vragen,0
-model,"sale.line,name",0,Sale Line,Offerteregel,0
-model,"sale.line-account.invoice.line,name",0,Sale Line - Invoice Line,Offerteregel - factuurregel,0
-model,"sale.line-account.tax,name",0,Sale Line - Tax,Offerteregel - belasting,0
-model,"sale.line-ignored-stock.move,name",0,Sale Line - Ignored Move,Offerteregel - genegeerde boeking,0
-model,"sale.line-recreated-stock.move,name",0,Sale Line - Recreated Move,Offerteregel - boeking opnieuw aanmaken,0
-model,"sale.sale,name",0,Sale,Verkoop,0
-model,"sale.sale-account.invoice,name",0,Sale - Invoice,Verkoop - factuur,0
-model,"sale.sale-ignored-account.invoice,name",0,Sale - Ignored Invoice,Verkoop - genereerde factuur,0
-model,"sale.sale-recreated-account.invoice,name",0,Sale - Recreated Invoice,Verkoop - factuur opnieuw aanmaken,0
-model,"workflow,name",sale_workflow,Sale workflow,Sjaboon verkoop,0
-model,"workflow.activity,name",sale_activity_cancel,Canceled,Geannuleerd,0
-model,"workflow.activity,name",sale_activity_confirmed,Confirmed,Bevestigd,0
-model,"workflow.activity,name",sale_activity_done,Done,Klaar,0
-model,"workflow.activity,name",sale_activity_draft,Draft,Concept,0
-model,"workflow.activity,name",sale_activity_invoice_method,Invoice Method,Factuur afhandeling,0
-model,"workflow.activity,name",sale_activity_invoice_method_done,Invoice Method Done,Factuur afhandeling klaar,0
-model,"workflow.activity,name",sale_activity_invoice_sale_done,Invoice Done,Factuur klaar,0
-model,"workflow.activity,name",sale_activity_invoice_sale_exception,Invoice Exception,Factuur uitzondering,0
-model,"workflow.activity,name",sale_activity_invoice_shipment,Invoice Shipment,Factuur zending,0
-model,"workflow.activity,name",sale_activity_invoice_shipment_done,Invoice Shipment Done,Factuur zending klaar,0
-model,"workflow.activity,name",sale_activity_invoice_shipment_exception,Invoice Shipment Exception,Factuur zending uitzondering,0
-model,"workflow.activity,name",sale_activity_invoice_shipment_method,Invoice Shipment Method,Factuur zending afhandeling,0
-model,"workflow.activity,name",sale_activity_invoice_shipment_method_done,Invoice Shipment Method Done,Factuur zending afhandeling klaar,0
-model,"workflow.activity,name",sale_activity_quotation,Quotation,Offerte,0
-model,"workflow.activity,name",sale_activity_shipment,Shipment,Afleveren,0
-model,"workflow.activity,name",sale_activity_shipment_exception,Shipment Exception,Afleveren uitzondering,0
-model,"workflow.activity,name",sale_activity_shipment_invoice,Shipment Invoice,Afleverfactuur,0
-model,"workflow.activity,name",sale_activity_shipment_invoice_done,Shipment Invoice Done,Afleverfactuur klaar,0
-model,"workflow.activity,name",sale_activity_shipment_invoice_exception,Shipment Invoice Exception,Afleverfactuur uitzondering,0
-model,"workflow.activity,name",sale_activity_shipment_invoice_method,Shipment Invoice Method,Afleverfactuur afhandeling,0
-model,"workflow.activity,name",sale_activity_shipment_invoice_method_done,Shipment Invoice Method Done,Afleverfactuur afhandeling klaar,0
-model,"workflow.activity,name",sale_activity_shipment_method,Shipment Method,Levering afhandeling,0
-model,"workflow.activity,name",sale_activity_shipment_method_done,Shipment Method Done,Levering afhandeling klaar,0
-model,"workflow.activity,name",sale_activity_waiting_invoice_sale,Waiting Invoice,Wacht op factuur,0
-model,"workflow.activity,name",sale_activity_waiting_invoice_shipment,Waiting Invoice Shipment,Wacht op factuur levering,0
-model,"workflow.activity,name",sale_activity_waiting_shipment,Waiting Shipment,Wacht op aflevering,0
-model,"workflow.activity,name",sale_activity_waiting_shipment_invoice,Waiting Shipment Invoice,Wacht op afleverfactuur,0
-selection,"account.invoice,sale_exception_state",0,,,0
-selection,"account.invoice,sale_exception_state",0,Ignored,Genegeerd,0
-selection,"account.invoice,sale_exception_state",0,Recreated,Opnieuw aangemaakt,0
-selection,"sale.line,type",0,Comment,Opmerking,0
-selection,"sale.line,type",0,Line,Regel,0
-selection,"sale.line,type",0,Subtotal,Subtotaal,0
-selection,"sale.line,type",0,Title,Titel,0
-selection,"sale.sale,invoice_method",0,Manual,Handmatig,0
-selection,"sale.sale,invoice_method",0,On Order Confirmed,Na opdrachtbevestiging,0
-selection,"sale.sale,invoice_method",0,On Shipment Sent,Na verzending,0
-selection,"sale.sale,invoice_state",0,Exception,Uitzondering,0
-selection,"sale.sale,invoice_state",0,None,Geen,0
-selection,"sale.sale,invoice_state",0,Paid,Betaald,0
-selection,"sale.sale,invoice_state",0,Waiting,In afwachting,0
-selection,"sale.sale,shipment_method",0,Manual,Handmatig,0
-selection,"sale.sale,shipment_method",0,On Invoice Paid,Na factuur betaald,0
-selection,"sale.sale,shipment_method",0,On Order Confirmed,Na opdrachtbevestiging,0
-selection,"sale.sale,shipment_state",0,Exception,Uitzondering,0
-selection,"sale.sale,shipment_state",0,None,Geen,0
-selection,"sale.sale,shipment_state",0,Sent,Verzonden,0
-selection,"sale.sale,shipment_state",0,Waiting,In afwachting,0
-selection,"sale.sale,state",0,Canceled,Geannuleerd,0
-selection,"sale.sale,state",0,Confirmed,Bevestigd,0
-selection,"sale.sale,state",0,Done,Klaar,0
-selection,"sale.sale,state",0,Draft,Concept,0
-selection,"sale.sale,state",0,Quotation,Offerte,0
-selection,"stock.move,sale_exception_state",0,,,0
-selection,"stock.move,sale_exception_state",0,Ignored,Genegeerd,0
-selection,"stock.move,sale_exception_state",0,Recreated,Opnieuw aangemaakt,0
-view,product.template,0,Customers,Klanten,0
-view,sale.configuration,0,Sale Configuration,Verkoop instellingen,0
-view,sale.handle.invoice.exception.ask,0,Choose invoices to recreate,Kies facturen om opnieuw aan te maken,0
-view,sale.handle.invoice.exception.ask,0,Handle Invoice Exception,Factuuruitzondering afhandelen,0
-view,sale.handle.shipment.exception.ask,0,Choose move to recreate,Kies boeking om opnieuw aan te maken,0
-view,sale.handle.shipment.exception.ask,0,Handle shipment Exception,Zendinguitzondering afhandelen,0
-view,sale.handle.shipment.exception.ask,0,Recreate Moves,Boekingen opnieuw aanmaken,0
-view,sale.line,0,General,Algemeen,0
-view,sale.line,0,Notes,Aantekeningen,0
-view,sale.line,0,Products,Producten,0
-view,sale.line,0,Sale Line,Offerteregel,0
-view,sale.line,0,Sale Lines,Offerteregels,0
-view,sale.sale,0,Cancel,Annuleren,0
-view,sale.sale,0,Confirm,Bevestig,0
-view,sale.sale,0,Draft,Concept,0
-view,sale.sale,0,Handle Invoice Exception,Factuuruitzondering afhandelen,0
-view,sale.sale,0,Handle Shipment Exception,Zendinguitzondering afhandelen,0
-view,sale.sale,0,Invoices,Facturen,0
-view,sale.sale,0,Lines,Regels,0
-view,sale.sale,0,Moves,Boekingen,0
-view,sale.sale,0,Other Info,Aanvullende informatie,0
-view,sale.sale,0,Quotation,Offerte,0
-view,sale.sale,0,Sale,Verkoop,0
-view,sale.sale,0,Sales,Verkoop,0
-view,sale.sale,0,Shipments,Leveringen,0
-wizard_button,"sale.handle.invoice.exception,init,end",0,Cancel,Annuleren,0
-wizard_button,"sale.handle.invoice.exception,init,ok",0,Ok,Oké,0
-wizard_button,"sale.handle.shipment.exception,init,end",0,Cancel,Annuleren,0
-wizard_button,"sale.handle.shipment.exception,init,ok",0,Ok,Oké,0
diff --git a/party.xml b/party.xml
index 1be8b66..7004e6b 100644
--- a/party.xml
+++ b/party.xml
@@ -11,9 +11,14 @@ this repository contains the full copyright notices and license terms. -->
         <record model="ir.action.keyword"
                 id="act_open_sale_keyword1">
             <field name="keyword">form_relate</field>
-            <field name="model">party.party,0</field>
+            <field name="model">party.party,-1</field>
             <field name="action" ref="act_sale_form2"/>
         </record>
+        <record model="ir.action-res.group"
+            id="act_sale_form2-group_sale">
+            <field name="action" ref="act_sale_form2"/>
+            <field name="group" ref="group_sale"/>
+        </record>
 
     </data>
 </tryton>
diff --git a/sale.py b/sale.py
index da6d2cb..493221c 100644
--- a/sale.py
+++ b/sale.py
@@ -1,15 +1,18 @@
 #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 __future__ import with_statement
 import copy
 from decimal import Decimal
+import datetime
+from itertools import groupby
+from functools import partial
 from trytond.model import ModelWorkflow, ModelView, ModelSQL, fields
 from trytond.modules.company import CompanyReport
 from trytond.wizard import Wizard
 from trytond.backend import TableHandler
-from trytond.pyson import If, In, Eval, Get, Or, Not, Equal, Bool, And, \
-        PYSONEncoder
+from trytond.pyson import If, Eval, Bool, PYSONEncoder
 from trytond.transaction import Transaction
+from trytond.pool import Pool
+
 
 class Sale(ModelWorkflow, ModelSQL, ModelView):
     'Sale'
@@ -18,18 +21,20 @@ class Sale(ModelWorkflow, ModelSQL, ModelView):
     _description = __doc__
 
     company = fields.Many2One('company.company', 'Company', required=True,
-            states={
-                'readonly': Or(Not(Equal(Eval('state'), 'draft')),
-                    Bool(Eval('lines'))),
-            }, domain=[
-                ('id', If(In('company', Eval('context', {})), '=', '!='),
-                    Get(Eval('context', {}), 'company', 0)),
-            ])
+        states={
+            'readonly': (Eval('state') != 'draft') | Eval('lines', []),
+            },
+        domain=[
+            ('id', If(Eval('context', {}).contains('company'), '=', '!='),
+                Eval('context', {}).get('company', 0)),
+            ],
+        depends=['state', 'lines'])
     reference = fields.Char('Reference', readonly=True, select=1)
     description = fields.Char('Description',
-            states={
-                'readonly': Not(Equal(Eval('state'), 'draft')),
-            })
+        states={
+            'readonly': Eval('state') != 'draft',
+            },
+        depends=['state'])
     state = fields.Selection([
         ('draft', 'Draft'),
         ('quotation', 'Quotation'),
@@ -38,55 +43,67 @@ class Sale(ModelWorkflow, ModelSQL, ModelView):
         ('cancel', 'Canceled'),
     ], 'State', readonly=True, required=True)
     sale_date = fields.Date('Sale Date', required=True,
-            states={
-                'readonly': Not(Equal(Eval('state'), 'draft')),
-            })
+        states={
+            'readonly': Eval('state') != 'draft',
+            },
+        depends=['state'])
     payment_term = fields.Many2One('account.invoice.payment_term',
-            'Payment Term', required=True, states={
-                'readonly': Not(Equal(Eval('state'), 'draft')),
-            })
+        'Payment Term', required=True, states={
+            'readonly': Eval('state') != 'draft',
+            },
+        depends=['state'])
     party = fields.Many2One('party.party', 'Party', change_default=True,
-            required=True, select=1, states={
-                'readonly': Not(Equal(Eval('state'), 'draft')),
-            }, on_change=['party', 'payment_term'])
+        required=True, select=1, states={
+            'readonly': Eval('state') != 'draft',
+            }, on_change=['party', 'payment_term'],
+        depends=['state'])
     party_lang = fields.Function(fields.Char('Party Language',
         on_change_with=['party']), 'get_function_fields')
     invoice_address = fields.Many2One('party.address', 'Invoice Address',
-            domain=[('party', '=', Eval('party'))], states={
-                'readonly': Not(Equal(Eval('state'), 'draft')),
-            })
+        domain=[('party', '=', Eval('party'))], states={
+            'readonly': Eval('state') != 'draft',
+            }, depends=['state', 'party'])
     shipment_address = fields.Many2One('party.address', 'Shipment Address',
-            domain=[('party', '=', Eval('party'))], states={
-                'readonly': Not(Equal(Eval('state'), 'draft')),
-            })
+        domain=[('party', '=', Eval('party'))], states={
+            'readonly': Eval('state') != 'draft',
+            },
+        depends=['party', 'state'])
     warehouse = fields.Many2One('stock.location', 'Warehouse',
-            domain=[('type', '=', 'warehouse')], required=True, states={
-                'readonly': Not(Equal(Eval('state'), 'draft')),
-            })
+        domain=[('type', '=', 'warehouse')], required=True, states={
+            'readonly': Eval('state') != 'draft',
+            },
+        depends=['state'])
     currency = fields.Many2One('currency.currency', 'Currency', required=True,
         states={
-            'readonly': Or(Not(Equal(Eval('state'), 'draft')),
-                And(Bool(Eval('lines')), Bool(Eval('currency')))),
-        })
+            'readonly': (Eval('state') != 'draft') |
+                (Eval('lines', []) & Eval('currency', 0)),
+            },
+        depends=['state', 'lines'])
     currency_digits = fields.Function(fields.Integer('Currency Digits',
         on_change_with=['currency']), 'get_function_fields')
     lines = fields.One2Many('sale.line', 'sale', 'Lines', states={
-        'readonly': Not(Equal(Eval('state'), 'draft')),
-        }, on_change=['lines', 'currency', 'party'])
+            'readonly': Eval('state') != 'draft',
+            }, on_change=['lines', 'currency', 'party'],
+        depends=['party', 'state'])
     comment = fields.Text('Comment')
     untaxed_amount = fields.Function(fields.Numeric('Untaxed',
-        digits=(16, Eval('currency_digits', 2))), 'get_function_fields')
+            digits=(16, Eval('currency_digits', 2)),
+            depends=['currency_digits']), 'get_function_fields')
     tax_amount = fields.Function(fields.Numeric('Tax',
-        digits=(16, Eval('currency_digits', 2))), 'get_function_fields')
+            digits=(16, Eval('currency_digits', 2)),
+            depends=['currency_digits']), 'get_function_fields')
     total_amount = fields.Function(fields.Numeric('Total',
-        digits=(16, Eval('currency_digits', 2))), 'get_function_fields')
+            digits=(16, Eval('currency_digits', 2)),
+            depends=['currency_digits']), 'get_function_fields')
     invoice_method = fields.Selection([
-        ('manual', 'Manual'),
-        ('order', 'On Order Confirmed'),
-        ('shipment', 'On Shipment Sent'),
-    ], 'Invoice Method', required=True, states={
-        'readonly': Not(Equal(Eval('state'), 'draft')),
-        })
+            ('manual', 'Manual'),
+            ('order', 'On Order Confirmed'),
+            ('shipment', 'On Shipment Sent'),
+            ],
+        'Invoice Method', required=True, states={
+            'readonly': Eval('state') != 'draft',
+            },
+        depends=['state'])
     invoice_state = fields.Selection([
         ('none', 'None'),
         ('waiting', 'Waiting'),
@@ -104,12 +121,14 @@ class Sale(ModelWorkflow, ModelSQL, ModelView):
     invoice_exception = fields.Function(fields.Boolean('Invoices Exception'),
             'get_function_fields')
     shipment_method = fields.Selection([
-        ('manual', 'Manual'),
-        ('order', 'On Order Confirmed'),
-        ('invoice', 'On Invoice Paid'),
-    ], 'Shipment Method', required=True, states={
-        'readonly': Not(Equal(Eval('state'), 'draft')),
-        })
+            ('manual', 'Manual'),
+            ('order', 'On Order Confirmed'),
+            ('invoice', 'On Invoice Paid'),
+            ], 'Shipment Method', required=True,
+        states={
+            'readonly': Eval('state') != 'draft',
+            },
+        depends=['state'])
     shipment_state = fields.Selection([
         ('none', 'None'),
         ('waiting', 'Waiting'),
@@ -170,14 +189,14 @@ class Sale(ModelWorkflow, ModelSQL, ModelView):
         table.index_action('create_date', action='add')
 
     def default_payment_term(self):
-        payment_term_obj = self.pool.get('account.invoice.payment_term')
+        payment_term_obj = Pool().get('account.invoice.payment_term')
         payment_term_ids = payment_term_obj.search(self.payment_term.domain)
         if len(payment_term_ids) == 1:
             return payment_term_ids[0]
         return False
 
     def default_warehouse(self):
-        location_obj = self.pool.get('stock.location')
+        location_obj = Pool().get('stock.location')
         location_ids = location_obj.search(self.warehouse.domain)
         if len(location_ids) == 1:
             return location_ids[0]
@@ -190,26 +209,26 @@ class Sale(ModelWorkflow, ModelSQL, ModelView):
         return 'draft'
 
     def default_sale_date(self):
-        date_obj = self.pool.get('ir.date')
+        date_obj = Pool().get('ir.date')
         return date_obj.today()
 
     def default_currency(self):
-        company_obj = self.pool.get('company.company')
-        currency_obj = self.pool.get('currency.currency')
+        company_obj = Pool().get('company.company')
+        currency_obj = Pool().get('currency.currency')
         company = Transaction().context.get('company')
         if company:
             return company_obj.browse(company).currency.id
         return False
 
     def default_currency_digits(self):
-        company_obj = self.pool.get('company.company')
+        company_obj = Pool().get('company.company')
         company = Transaction().context.get('company')
         if company:
             return company_obj.browse(company).currency.digits
         return 2
 
     def default_invoice_method(self):
-        config_obj = self.pool.get('sale.configuration')
+        config_obj = Pool().get('sale.configuration')
         config = config_obj.browse(1)
         return config.sale_invoice_method
 
@@ -217,7 +236,7 @@ class Sale(ModelWorkflow, ModelSQL, ModelView):
         return 'none'
 
     def default_shipment_method(self):
-        config_obj = self.pool.get('sale.configuration')
+        config_obj = Pool().get('sale.configuration')
         config = config_obj.browse(1)
         return config.sale_shipment_method
 
@@ -225,9 +244,10 @@ class Sale(ModelWorkflow, ModelSQL, ModelView):
         return 'none'
 
     def on_change_party(self, vals):
-        party_obj = self.pool.get('party.party')
-        address_obj = self.pool.get('party.address')
-        payment_term_obj = self.pool.get('account.invoice.payment_term')
+        pool = Pool()
+        party_obj = pool.get('party.party')
+        address_obj = pool.get('party.address')
+        payment_term_obj = pool.get('account.invoice.payment_term')
         res = {
             'invoice_address': False,
             'shipment_address': False,
@@ -256,7 +276,7 @@ class Sale(ModelWorkflow, ModelSQL, ModelView):
         return res
 
     def on_change_with_currency_digits(self, vals):
-        currency_obj = self.pool.get('currency.currency')
+        currency_obj = Pool().get('currency.currency')
         if vals.get('currency'):
             currency = currency_obj.browse(vals['currency'])
             return currency.digits
@@ -276,7 +296,7 @@ class Sale(ModelWorkflow, ModelSQL, ModelView):
         return res
 
     def get_tax_context(self, sale):
-        party_obj = self.pool.get('party.party')
+        party_obj = Pool().get('party.party')
         res = {}
         if isinstance(sale, dict):
             if sale.get('party'):
@@ -289,7 +309,7 @@ class Sale(ModelWorkflow, ModelSQL, ModelView):
         return res
 
     def on_change_with_party_lang(self, vals):
-        party_obj = self.pool.get('party.party')
+        party_obj = Pool().get('party.party')
         if vals.get('party'):
             party = party_obj.browse(vals['party'])
             if party.lang:
@@ -314,9 +334,10 @@ class Sale(ModelWorkflow, ModelSQL, ModelView):
 
 
     def on_change_lines(self, vals):
-        currency_obj = self.pool.get('currency.currency')
-        tax_obj = self.pool.get('account.tax')
-        invoice_obj = self.pool.get('account.invoice')
+        pool = Pool()
+        currency_obj = pool.get('currency.currency')
+        tax_obj = pool.get('account.tax')
+        invoice_obj = pool.get('account.invoice')
 
         res = {
             'untaxed_amount': Decimal('0.0'),
@@ -403,7 +424,7 @@ class Sale(ModelWorkflow, ModelSQL, ModelView):
         :return: a dictionary with sale id as key and
             untaxed amount as value
         '''
-        currency_obj = self.pool.get('currency.currency')
+        currency_obj = Pool().get('currency.currency')
         res = {}
         for sale in sales:
             res.setdefault(sale.id, Decimal('0.0'))
@@ -422,9 +443,10 @@ class Sale(ModelWorkflow, ModelSQL, ModelView):
         :return: a dictionary with sale id as key and
             tax amount as value
         '''
-        currency_obj = self.pool.get('currency.currency')
-        tax_obj = self.pool.get('account.tax')
-        invoice_obj = self.pool.get('account.invoice')
+        pool = Pool()
+        currency_obj = pool.get('currency.currency')
+        tax_obj = pool.get('account.tax')
+        invoice_obj = pool.get('account.invoice')
 
         res = {}
         for sale in sales:
@@ -458,7 +480,7 @@ class Sale(ModelWorkflow, ModelSQL, ModelView):
         :return: a dictionary with sale id as key and
             total amount as value
         '''
-        currency_obj = self.pool.get('currency.currency')
+        currency_obj = Pool().get('currency.currency')
         res = {}
         untaxed_amounts = self.get_untaxed_amount(sales)
         tax_amounts = self.get_tax_amount(sales)
@@ -633,8 +655,8 @@ class Sale(ModelWorkflow, ModelSQL, ModelView):
 
         :return: True if succeed
         '''
-        sequence_obj = self.pool.get('ir.sequence')
-        config_obj = self.pool.get('sale.configuration')
+        sequence_obj = Pool().get('ir.sequence')
+        config_obj = Pool().get('sale.configuration')
 
         sale = self.browse(sale_id)
 
@@ -648,6 +670,14 @@ class Sale(ModelWorkflow, ModelSQL, ModelView):
             })
         return True
 
+    def set_sale_date(self, sale_id):
+        date_obj = Pool().get('ir.date')
+
+        self.write(sale_id, {
+                'sale_date': date_obj.today(),
+                })
+        return True
+
     def _get_invoice_line_sale_line(self, sale):
         '''
         Return invoice line values for each sale lines
@@ -657,7 +687,7 @@ class Sale(ModelWorkflow, ModelSQL, ModelView):
         :return: a dictionary with invoiced sale line id as key
             and a list of invoice lines values as value
         '''
-        line_obj = self.pool.get('sale.line')
+        line_obj = Pool().get('sale.line')
         res = {}
         for line in sale.lines:
             val = line_obj.get_invoice_line(line)
@@ -674,7 +704,7 @@ class Sale(ModelWorkflow, ModelSQL, ModelView):
         :return: a dictionary with invoice fields as key and
             invoice values as value
         '''
-        journal_obj = self.pool.get('account.journal')
+        journal_obj = Pool().get('account.journal')
 
         journal_id = journal_obj.search([
             ('type', '=', 'revenue'),
@@ -703,9 +733,10 @@ class Sale(ModelWorkflow, ModelSQL, ModelView):
 
         :return: the created invoice id or None
         '''
-        invoice_obj = self.pool.get('account.invoice')
-        invoice_line_obj = self.pool.get('account.invoice.line')
-        sale_line_obj = self.pool.get('sale.line')
+        pool = Pool()
+        invoice_obj = pool.get('account.invoice')
+        invoice_line_obj = pool.get('account.invoice.line')
+        sale_line_obj = pool.get('sale.line')
 
         sale = self.browse(sale_id)
 
@@ -749,7 +780,7 @@ class Sale(ModelWorkflow, ModelSQL, ModelView):
 
         :return: a dictionary with move as key and move values as value
         '''
-        line_obj = self.pool.get('sale.line')
+        line_obj = Pool().get('sale.line')
         res = {}
         for line in sale.lines:
             val = line_obj.get_move(line)
@@ -757,42 +788,197 @@ class Sale(ModelWorkflow, ModelSQL, ModelView):
                 res[line.id] = val
         return res
 
+    def _group_shipment_key(self, moves, move):
+        '''
+        The key to group moves by shipments
+
+        :param moves: a list of moves values
+        :param move: a tuple of line id and a dictionary of the move values
+
+        :return: a list of key-value as tuples of the shipment
+        '''
+        planned_date = max(m['planned_date'] for m in moves)
+        return (('planned_date', planned_date),)
+
     def create_shipment(self, sale_id):
         '''
         Create a shipment for the sale
 
         :param sale_id: the sale id
 
-        :return: the created shipment id or None
+        :return: the list of created shipment id or None
         '''
-        shipment_obj = self.pool.get('stock.shipment.out')
-        move_obj = self.pool.get('stock.move')
-        sale_line_obj = self.pool.get('sale.line')
+        pool = Pool()
+        shipment_obj = pool.get('stock.shipment.out')
+        move_obj = pool.get('stock.move')
+        sale_line_obj = pool.get('sale.line')
 
         sale = self.browse(sale_id)
 
         moves = self._get_move_sale_line(sale)
         if not moves:
             return
+        keyfunc = partial(self._group_shipment_key, moves.values())
+        moves = moves.items()
+        moves = sorted(moves, key=keyfunc)
 
+        shipments = []
         with Transaction().set_user(0, set_context=True):
-            shipment_id = shipment_obj.create({
-                'planned_date': sale.sale_date,
-                'customer': sale.party.id,
-                'delivery_address': sale.shipment_address.id,
-                'reference': sale.reference,
-                'warehouse': sale.warehouse.id,
-            })
-
-            for line_id in moves:
-                vals = moves[line_id]
-                vals['shipment_out'] = shipment_id
-                move_id = move_obj.create(vals)
-                sale_line_obj.write(line_id, {
-                    'moves': [('add', move_id)],
-                })
+            for key, grouped_moves in groupby(moves, key=keyfunc):
+                values = {
+                    'customer': sale.party.id,
+                    'delivery_address': sale.shipment_address.id,
+                    'reference': sale.reference,
+                    'warehouse': sale.warehouse.id,
+                    }
+                values.update(dict(key))
+                shipment_id = shipment_obj.create(values)
+                shipments.append(shipment_id)
+                for line_id, values in grouped_moves:
+                    values['shipment_out'] = shipment_id
+                    move_id = move_obj.create(values)
+                    sale_line_obj.write(line_id, {
+                        'moves': [('add', move_id)],
+                    })
                 shipment_obj.workflow_trigger_validate(shipment_id, 'waiting')
-            return shipment_id
+        return shipments
+
+    def wkf_draft(self, sale):
+        self.write(sale.id, {'state': 'draft'})
+
+    def wkf_quotation(self, sale):
+        self.check_for_quotation(sale.id)
+        self.set_reference(sale.id)
+        self.write(sale.id, {'state': 'quotation'})
+
+    def wkf_confirmed(self, sale):
+        self.set_sale_date(sale.id)
+        self.write(sale.id, {'state': 'confirmed'})
+
+    def wkf_waiting_invoice_sale(self, sale):
+        self.create_invoice(sale.id)
+        self.write(sale.id, {'invoice_state': 'waiting'})
+
+    def wkf_invoice_sale_exception(self, sale):
+        self.write(sale.id, {'invoice_state': 'exception'})
+
+    def wkf_invoice_sale_done(self, sale):
+        self.write(sale.id, {'invoice_state': 'paid'})
+
+    def wkf_shipment_invoice(self, sale):
+        self.create_shipment(sale.id)
+
+    def wkf_waiting_shipment_invoice(self, sale):
+        self.write(sale.id, {'shipment_state': 'waiting'})
+        self.create_shipment(sale.id)
+
+    def wkf_shipment_invoice_exception(self, sale):
+        self.write(sale.id, {'shipment_state': 'exception'})
+
+    def wkf_shipment_invoice_done(self, sale):
+        self.write(sale.id, {'shipment_state': 'sent'})
+
+    def wkf_shipment(self, sale):
+        self.create_shipment(sale.id)
+
+    def wkf_waiting_shipment(self, sale):
+        self.write(sale.id, {'shipment_state': 'waiting'})
+        self.create_shipment(sale.id)
+
+    def wkf_shipment_exception(self, sale):
+        self.write(sale.id, {'shipment_state': 'exception'})
+
+    def wkf_invoice_shipment(self, sale):
+        self.create_invoice(sale.id)
+        self.write(sale.id, {'invoice_state': 'waiting'})
+
+    def wkf_waiting_invoice_shipment(self, sale):
+        self.write(sale.id,
+            {'invoice_state': 'waiting', 'shipment_state': 'sent'})
+
+    def wkf_invoice_shipment_exception(self, sale):
+        self.write(sale.id, {'invoice_state': 'exception'})
+
+    def wkf_invoice_shipment_done(self, sale):
+        self.write(sale.id, {'invoice_state': 'paid'})
+
+    def wkf_invoice_shipment_method_done(self, sale):
+        self.write(sale.id, {'shipment_state': 'sent'})
+
+    def wkf_done(self, sale):
+        self.write(sale.id, {'state': 'done'})
+
+    def wkf_cancel(self, sale):
+        self.write(sale.id, {'state': 'cancel'})
+
+    def wkf_draft2quotation(self, sale):
+        return bool(sale.lines)
+
+    def wkf_invoice_method2waiting_invoice_sale(self, sale):
+        return sale.invoice_method == 'order'
+
+    def wkf_invoice_method2invoice_method_done(self, sale):
+        return sale.invoice_method != 'order'
+
+    def wkf_triggered_invoices(self, sale):
+        return [x.id for x in sale.invoices]
+
+    def wkf_waiting_invoice_sale2invoice_sale_exception(self, sale):
+        return sale.invoice_exception
+
+    def wkf_waiting_invoice_sale2invoice_sale_done(self, sale):
+        return sale.invoice_paid
+
+    def wkf_shipment_invoice_method2shipment_invoice_method_done(self, sale):
+        return sale.shipment_method != 'invoice'
+
+    def wkf_shipment_invoice_method2shipment_invoice(self, sale):
+        return self.shipment_method == 'invoice'
+
+    def wkf_triggered_shipments(self, sale):
+        return [x.id for x in sale.shipments]
+
+    def wkf_waiting_shipment_invoice2shipment_invoice_exception(self, sale):
+        return sale.shipment_exception
+
+    def wkf_waiting_shipment_invoice2shipment_invoice_done(self, sale):
+        return sale.shipment_done
+
+    def wkf_shipment_method2shipment_method_done(self, sale):
+        return sale.shipment_method != 'order'
+
+    def wkf_shipment_method2shipment(self, sale):
+        return sale.shipment_method == 'order'
+
+    def wkf_waiting_shipment2shipment_exception(self, sale):
+        return sale.shipment_exception
+
+    def wkf_waiting_shipment2invoice_shipment_method(self, sale):
+        return not sale.shipment_exception
+
+    def wkf_waiting_shipment2invoice_shipment_method_nosignal(self, sale):
+        return sale.shipment_done
+
+    def wkf_invoice_shipment_method2invoice_shipment(self, sale):
+        return sale.invoice_method == 'shipment'
+
+    def wkf_invoice_shipment_method2invoice_shipment_method_done(self, sale):
+        return sale.invoice_method != 'shipment' and sale.shipment_done
+
+    def wkf_invoice_shipment_method2waiting_shipment(self, sale):
+        return sale.invoice_method != 'shipment' and not sale.shipment_done
+
+    def wkf_invoice_shipment2waiting_shipment(self, sale):
+        return not sale.shipment_done
+
+    def wkf_invoice_shipment2waiting_invoice_shipment(self, sale):
+        return sale.shipment_done
+
+    def wkf_waiting_invoice_shipment2invoice_shipment_exception(self, sale):
+        return sale.invoice_exception
+
+    def wkf_waiting_invoice_shipment2invoice_shipment_done(self, sale):
+        return sale.invoice_paid
 
 Sale()
 
@@ -851,18 +1037,19 @@ class SaleLine(ModelSQL, ModelView):
         ('comment', 'Comment'),
         ], 'Type', select=1, required=True)
     quantity = fields.Float('Quantity',
-            digits=(16, Eval('unit_digits', 2)),
-            states={
-                'invisible': Not(Equal(Eval('type'), 'line')),
-                'required': Equal(Eval('type'), 'line'),
-                'readonly': Not(Bool(Eval('_parent_sale'))),
+        digits=(16, Eval('unit_digits', 2)),
+        states={
+            'invisible': Eval('type') != 'line',
+            'required': Eval('type') == 'line',
+            'readonly': ~Eval('_parent_sale', {}),
             }, on_change=['product', 'quantity', 'unit',
-                '_parent_sale.currency', '_parent_sale.party'])
+            '_parent_sale.currency', '_parent_sale.party'],
+        depends=['type', 'unit_digits'])
     unit = fields.Many2One('product.uom', 'Unit',
             states={
                 'required': Bool(Eval('product')),
-                'invisible': Not(Equal(Eval('type'), 'line')),
-                'readonly': Not(Bool(Eval('_parent_sale'))),
+                'invisible': Eval('type') != 'line',
+                'readonly': ~Eval('_parent_sale', {}),
             }, domain=[
                 ('category', '=',
                     (Eval('product'), 'product.default_uom.category')),
@@ -871,47 +1058,48 @@ class SaleLine(ModelSQL, ModelView):
                 'category': (Eval('product'), 'product.default_uom.category'),
             },
             on_change=['product', 'quantity', 'unit', '_parent_sale.currency',
-                '_parent_sale.party'])
+                '_parent_sale.party'],
+            depends=['product', 'type'])
     unit_digits = fields.Function(fields.Integer('Unit Digits',
         on_change_with=['unit']), 'get_unit_digits')
     product = fields.Many2One('product.product', 'Product',
-            domain=[('salable', '=', True)],
-            states={
-                'invisible': Not(Equal(Eval('type'), 'line')),
-                'readonly': Not(Bool(Eval('_parent_sale'))),
-            }, on_change=['product', 'unit', 'quantity', 'description',
-                '_parent_sale.party', '_parent_sale.currency'],
-            context={
-                'locations': If(Bool(Get(Eval('_parent_sale', {}),
-                    'warehouse')),
-                    [Get(Eval('_parent_sale', {}), 'warehouse')],
-                    []),
-                'stock_date_end': Get(Eval('_parent_sale', {}), 'sale_date'),
-                'salable': True,
-                'stock_skip_warehouse': True,
-            })
+        domain=[('salable', '=', True)],
+        states={
+            'invisible': Eval('type') != 'line',
+            'readonly': ~Eval('_parent_sale', {}),
+            },
+        on_change=['product', 'unit', 'quantity', 'description',
+            '_parent_sale.party', '_parent_sale.currency'],
+        context={
+            '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'])
     unit_price = fields.Numeric('Unit Price', digits=(16, 4),
-            states={
-                'invisible': Not(Equal(Eval('type'), 'line')),
-                'required': Equal(Eval('type'), 'line'),
-            })
-    amount = fields.Function(fields.Numeric('Amount',
-        digits=(16, Get(Eval('_parent_sale', {}), 'currency_digits', 2)),
         states={
-            'invisible': Not(In(Eval('type'), ['line', 'subtotal'])),
-            'readonly': Not(Bool(Eval('_parent_sale'))),
-        }, on_change_with=['type', 'quantity', 'unit_price',
-            '_parent_sale.currency']), 'get_amount')
+            'invisible': Eval('type') != 'line',
+            'required': Eval('type') == 'line',
+            }, depends=['type'])
+    amount = fields.Function(fields.Numeric('Amount',
+            digits=(16, Eval('_parent_sale', {}).get('currency_digits', 2)),
+            states={
+                'invisible': ~Eval('type').in_(['line', 'subtotal']),
+                'readonly': ~Eval('_parent_sale'),
+                }, on_change_with=['type', 'quantity', 'unit_price',
+                '_parent_sale.currency'],
+            depends=['type']), 'get_amount')
     description = fields.Text('Description', size=None, required=True)
     note = fields.Text('Note')
     taxes = fields.Many2Many('sale.line-account.tax', 'line', 'tax', 'Taxes',
-            domain=[('parent', '=', False)], states={
-                'invisible': Not(Equal(Eval('type'), 'line')),
-            })
+        domain=[('parent', '=', False)], states={
+            'invisible': Eval('type') != 'line',
+            }, depends=['type'])
     invoice_lines = fields.Many2Many('sale.line-account.invoice.line',
             'sale_line', 'invoice_line', 'Invoice Lines', readonly=True)
     moves = fields.One2Many('stock.move', 'sale_line', 'Moves',
-            readonly=True, select=1)
+            readonly=True)
     moves_ignored = fields.Many2Many('sale.line-ignored-stock.move',
             'sale_line', 'move', 'Ignored Moves', readonly=True)
     moves_recreated = fields.Many2Many('sale.line-recreated-stock.move',
@@ -951,7 +1139,7 @@ class SaleLine(ModelSQL, ModelView):
         return Decimal('0.0')
 
     def on_change_with_unit_digits(self, vals):
-        uom_obj = self.pool.get('product.uom')
+        uom_obj = Pool().get('product.uom')
         if vals.get('unit'):
             uom = uom_obj.browse(vals['unit'])
             return uom.digits
@@ -967,7 +1155,7 @@ class SaleLine(ModelSQL, ModelView):
         return res
 
     def get_move_done(self, ids, name):
-        uom_obj = self.pool.get('product.uom')
+        uom_obj = Pool().get('product.uom')
         res = {}
         for line in self.browse(ids):
             val = True
@@ -1033,10 +1221,11 @@ class SaleLine(ModelSQL, ModelView):
         return context
 
     def on_change_product(self, vals):
-        party_obj = self.pool.get('party.party')
-        product_obj = self.pool.get('product.product')
-        uom_obj = self.pool.get('product.uom')
-        tax_rule_obj = self.pool.get('account.tax.rule')
+        pool = Pool()
+        party_obj = pool.get('party.party')
+        product_obj = pool.get('product.product')
+        uom_obj = pool.get('product.uom')
+        tax_rule_obj = pool.get('account.tax.rule')
 
         if not vals.get('product'):
             return {}
@@ -1055,6 +1244,9 @@ class SaleLine(ModelSQL, ModelView):
                 self._get_context_sale_price(product,vals)):
             res['unit_price'] = product_obj.get_sale_price([product.id],
                     vals.get('quantity', 0))[product.id]
+            if res['unit_price']:
+                res['unit_price'] = res['unit_price'].quantize(
+                    Decimal(1) / 10 ** self.unit_price.digits[1])
         res['taxes'] = []
         pattern = self._get_tax_rule_pattern(party, vals)
         for tax in product.customer_taxes_used:
@@ -1089,7 +1281,7 @@ class SaleLine(ModelSQL, ModelView):
         return res
 
     def on_change_quantity(self, vals):
-        product_obj = self.pool.get('product.product')
+        product_obj = Pool().get('product.product')
 
         if not vals.get('product'):
             return {}
@@ -1101,13 +1293,16 @@ class SaleLine(ModelSQL, ModelView):
                 self._get_context_sale_price(product, vals)):
             res['unit_price'] = product_obj.get_sale_price([vals['product']],
                     vals.get('quantity', 0))[vals['product']]
+            if res['unit_price']:
+                res['unit_price'] = res['unit_price'].quantize(
+                    Decimal(1) / 10 ** self.unit_price.digits[1])
         return res
 
     def on_change_unit(self, vals):
         return self.on_change_quantity(vals)
 
     def on_change_with_amount(self, vals):
-        currency_obj = self.pool.get('currency.currency')
+        currency_obj = Pool().get('currency.currency')
         if vals.get('type') == 'line':
             currency = vals.get('_parent_sale.currency')
             if currency and isinstance(currency, (int, long)):
@@ -1120,7 +1315,7 @@ class SaleLine(ModelSQL, ModelView):
         return Decimal('0.0')
 
     def get_amount(self, ids, name):
-        currency_obj = self.pool.get('currency.currency')
+        currency_obj = Pool().get('currency.currency')
         res = {}
         for line in self.browse(ids):
             if line.type == 'line':
@@ -1149,8 +1344,8 @@ class SaleLine(ModelSQL, ModelView):
 
         :return: a list of invoice line values
         '''
-        uom_obj = self.pool.get('product.uom')
-        property_obj = self.pool.get('ir.property')
+        uom_obj = Pool().get('product.uom')
+        property_obj = Pool().get('ir.property')
 
         res = {}
         res['sequence'] = line.sequence
@@ -1160,7 +1355,9 @@ class SaleLine(ModelSQL, ModelView):
         if line.type != 'line':
             return [res]
 
-        if line.sale.invoice_method == 'order':
+        if (line.sale.invoice_method == 'order'
+                or not line.product
+                or line.product.type == 'service'):
             quantity = line.quantity
         else:
             quantity = 0.0
@@ -1180,7 +1377,7 @@ class SaleLine(ModelSQL, ModelView):
         res['quantity'] = quantity
 
         if res['quantity'] <= 0.0:
-            return None
+            return []
         res['unit'] = line.unit.id
         res['product'] = line.product.id
         res['unit_price'] = line.unit_price
@@ -1217,7 +1414,8 @@ class SaleLine(ModelSQL, ModelView):
 
         :return: a dictionary of values of move
         '''
-        uom_obj = self.pool.get('product.uom')
+        uom_obj = Pool().get('product.uom')
+        product_obj = Pool().get('product.product')
 
         res = {}
         if line.type != 'line':
@@ -1245,7 +1443,8 @@ class SaleLine(ModelSQL, ModelView):
         res['company'] = line.sale.company.id
         res['unit_price'] = line.unit_price
         res['currency'] = line.sale.currency.id
-        res['planned_date'] = line.sale.sale_date
+        res['planned_date'] = product_obj.compute_delivery_date(
+            line.product)
         return res
 
 SaleLine()
@@ -1313,30 +1512,36 @@ class Template(ModelSQL, ModelView):
     _name = 'product.template'
 
     salable = fields.Boolean('Salable', states={
-        'readonly': Not(Bool(Eval('active'))),
-        })
+            'readonly': ~Eval('active', True),
+            }, depends=['active'])
     sale_uom = fields.Many2One('product.uom', 'Sale UOM', states={
-        'readonly': Not(Bool(Eval('active'))),
-        'invisible': Not(Bool(Eval('salable'))),
-        'required': Bool(Eval('salable')),
-        }, domain=[
+            'readonly': ~Eval('active', True),
+            'invisible': ~Eval('salable', False),
+            'required': Eval('salable', False),
+            },
+        domain=[
             ('category', '=', (Eval('default_uom'), 'uom.category')),
-        ],
+            ],
         context={'category': (Eval('default_uom'), 'uom.category')},
-        on_change_with=['default_uom', 'sale_uom', 'salable'])
+        on_change_with=['default_uom', 'sale_uom', 'salable'],
+        depends=['active', 'salable', 'default_uom'])
+    delivery_time = fields.Integer('Delivery Time', states={
+            'readonly': ~Eval('active', True),
+            'invisible': ~Eval('salable', False),
+            },
+        depends=['active', 'salable'],
+        help='In number of days')
 
     def __init__(self):
         super(Template, self).__init__()
         self.account_revenue = copy.copy(self.account_revenue)
         self.account_revenue.states = copy.copy(self.account_revenue.states)
-        required = And(Not(Bool(Eval('account_category'))),
-                Bool(Eval('salable')))
+        required = ~Eval('account_category', False) & Eval('salable', False)
         if not self.account_revenue.states.get('required'):
             self.account_revenue.states['required'] = required
         else:
-            self.account_revenue.states['required'] = \
-                    Or(self.account_revenue.states['required'],
-                            required)
+            self.account_revenue.states['required'] = (
+                    self.account_revenue.states['required'] | required)
         if 'account_category' not in self.account_revenue.depends:
             self.account_revenue = copy.copy(self.account_revenue)
             self.account_revenue.depends = \
@@ -1353,7 +1558,7 @@ class Template(ModelSQL, ModelView):
         return True if Transaction().context.get('salable') else False
 
     def on_change_with_sale_uom(self, vals):
-        uom_obj = self.pool.get('product.uom')
+        uom_obj = Pool().get('product.uom')
         res = False
 
         if vals.get('default_uom'):
@@ -1384,10 +1589,11 @@ class Product(ModelSQL, ModelView):
             currency: the currency id for the returned price
         :return: a dictionary with for each product ids keys the computed price
         '''
-        uom_obj = self.pool.get('product.uom')
-        user_obj = self.pool.get('res.user')
-        currency_obj = self.pool.get('currency.currency')
-        date_obj = self.pool.get('ir.date')
+        pool = Pool()
+        uom_obj = pool.get('product.uom')
+        user_obj = pool.get('res.user')
+        currency_obj = pool.get('currency.currency')
+        date_obj = pool.get('ir.date')
 
         today = date_obj.today()
         res = {}
@@ -1414,9 +1620,19 @@ class Product(ModelSQL, ModelView):
                     with Transaction().set_context(date=date):
                         res[product.id] = currency_obj.compute(
                                 user2.company.currency.id, res[product.id],
-                                currency.id)
+                                currency.id, round=False)
         return res
 
+    def compute_delivery_date(self, product, date=None):
+        '''
+        Compute the delivery date for the Product at a the given date
+        '''
+        date_obj = Pool().get('ir.date')
+
+        if not date:
+            date = date_obj.today()
+        return date + datetime.timedelta(product.delivery_time)
+
 Product()
 
 
@@ -1431,8 +1647,8 @@ class ShipmentOut(ModelSQL, ModelView):
             })
 
     def write(self, ids, vals):
-        sale_obj = self.pool.get('sale.sale')
-        sale_line_obj = self.pool.get('sale.line')
+        sale_obj = Pool().get('sale.sale')
+        sale_line_obj = Pool().get('sale.line')
 
         res = super(ShipmentOut, self).write(ids, vals)
 
@@ -1470,9 +1686,10 @@ class Move(ModelSQL, ModelView):
     _name = 'stock.move'
 
     sale_line = fields.Many2One('sale.line', 'Sale Line', select=1,
-            states={
-                'readonly': Not(Equal(Eval('state'), 'draft')),
-            })
+        states={
+            'readonly': Eval('state') != 'draft',
+            },
+        depends=['state'])
     sale = fields.Function(fields.Many2One('sale.sale', 'Sale', select=1),
             'get_sale', searcher='search_sale')
     sale_exception_state = fields.Function(fields.Selection([
@@ -1482,7 +1699,7 @@ class Move(ModelSQL, ModelView):
         ], 'Exception State'), 'get_sale_exception_state')
 
     def get_sale(self, ids, name):
-        sale_obj = self.pool.get('sale.sale')
+        sale_obj = Pool().get('sale.sale')
 
         res = {}
         for move in self.browse(ids):
@@ -1506,8 +1723,8 @@ class Move(ModelSQL, ModelView):
         return res
 
     def write(self, ids, vals):
-        sale_obj = self.pool.get('sale.sale')
-        sale_line_obj = self.pool.get('sale.line')
+        sale_obj = Pool().get('sale.sale')
+        sale_line_obj = Pool().get('sale.line')
 
         res = super(Move, self).write(ids, vals)
         if 'state' in vals and vals['state'] in ('cancel',):
@@ -1526,8 +1743,8 @@ class Move(ModelSQL, ModelView):
         return res
 
     def delete(self, ids):
-        sale_obj = self.pool.get('sale.sale')
-        sale_line_obj = self.pool.get('sale.line')
+        sale_obj = Pool().get('sale.sale')
+        sale_line_obj = Pool().get('sale.line')
 
         if isinstance(ids, (int, long)):
             ids = [ids]
@@ -1569,7 +1786,7 @@ class Invoice(ModelSQL, ModelView):
             })
 
     def button_draft(self, ids):
-        sale_obj = self.pool.get('sale.sale')
+        sale_obj = Pool().get('sale.sale')
         sale_ids = sale_obj.search([
             ('invoices', 'in', ids),
             ])
@@ -1580,7 +1797,7 @@ class Invoice(ModelSQL, ModelView):
         return super(Invoice, self).button_draft(ids)
 
     def get_sale_exception_state(self, ids, name):
-        sale_obj = self.pool.get('sale.sale')
+        sale_obj = Pool().get('sale.sale')
         sale_ids = sale_obj.search([
             ('invoices', 'in', ids),
             ])
@@ -1628,9 +1845,10 @@ class OpenCustomer(Wizard):
     }
 
     def _action_open(self, datas):
-        model_data_obj = self.pool.get('ir.model.data')
-        act_window_obj = self.pool.get('ir.action.act_window')
-        wizard_obj = self.pool.get('ir.action.wizard')
+        pool = Pool()
+        model_data_obj = pool.get('ir.model.data')
+        act_window_obj = pool.get('ir.action.act_window')
+        wizard_obj = pool.get('ir.action.wizard')
         act_window_id = model_data_obj.get_id('party', 'act_party_form')
         res = act_window_obj.read(act_window_id)
         Transaction().cursor.execute("SELECT DISTINCT(party) FROM sale_sale")
@@ -1676,7 +1894,7 @@ class HandleShipmentExceptionAsk(ModelView):
         return self.default_domain_moves()
 
     def default_domain_moves(self):
-        sale_line_obj = self.pool.get('sale.line')
+        sale_line_obj = Pool().get('sale.line')
         active_id = Transaction().context.get('active_id')
         if not active_id:
             return []
@@ -1723,10 +1941,11 @@ class HandleShipmentException(Wizard):
     }
 
     def _handle_moves(self, data):
-        sale_obj = self.pool.get('sale.sale')
-        sale_line_obj = self.pool.get('sale.line')
-        move_obj = self.pool.get('stock.move')
-        shipment_obj = self.pool.get('stock.shipment.out')
+        pool = Pool()
+        sale_obj = pool.get('sale.sale')
+        sale_line_obj = pool.get('sale.line')
+        move_obj = pool.get('stock.move')
+        shipment_obj = pool.get('stock.shipment.out')
         to_recreate = data['form']['recreate_moves'][0][1]
         domain_moves = data['form']['domain_moves'][0][1]
 
@@ -1773,7 +1992,7 @@ class HandleInvoiceExceptionAsk(ModelView):
         return self.default_domain_invoices()
 
     def default_domain_invoices(self):
-        sale_obj = self.pool.get('sale.sale')
+        sale_obj = Pool().get('sale.sale')
         active_id = Transaction().context.get('active_id')
         if not active_id:
             return []
@@ -1816,8 +2035,8 @@ class HandleInvoiceException(Wizard):
     }
 
     def _handle_invoices(self, data):
-        sale_obj = self.pool.get('sale.sale')
-        invoice_obj = self.pool.get('account.invoice')
+        sale_obj = Pool().get('sale.sale')
+        invoice_obj = Pool().get('account.invoice')
         to_recreate = data['form']['recreate_invoices'][0][1]
         domain_invoices = data['form']['domain_invoices'][0][1]
 
diff --git a/sale.xml b/sale.xml
index 819138b..d4f45ff 100644
--- a/sale.xml
+++ b/sale.xml
@@ -3,18 +3,34 @@
 this repository contains the full copyright notices and license terms. -->
 <tryton>
     <data>
-        <menuitem name="Sale Management" id="menu_sale" sequence="5"/>
         <record model="res.group" id="group_sale">
-            <field name="name">Sale</field>
+            <field name="name">Sales</field>
         </record>
         <record model="res.group" id="group_sale_admin">
-            <field name="name">Sale Administrator</field>
+            <field name="name">Sales Administrator</field>
+        </record>
+        <record model="res.user-res.group" id="user_admin_group_sale">
+            <field name="user" ref="res.user_admin"/>
+            <field name="group" ref="group_sale"/>
         </record>
-        <record model="res.user" id="res.user_admin">
-            <field name="groups" eval="[('add', ref('group_sale')), ('add', ref('group_sale_admin'))]"/>
+        <record model="res.user-res.group" id="user_admin_group_sale_admin">
+            <field name="user" ref="res.user_admin"/>
+            <field name="group" ref="group_sale_admin"/>
         </record>
-        <record model="res.user" id="res.user_trigger">
-            <field name="groups" eval="[('add', ref('group_sale')), ('add', ref('group_sale_admin'))]"/>
+
+        <record model="res.user-res.group" id="user_trigger_group_sale">
+            <field name="user" ref="res.user_trigger"/>
+            <field name="group" ref="group_sale"/>
+        </record>
+        <record model="res.user-res.group" id="user_trigger_group_sale_admin">
+            <field name="user" ref="res.user_trigger"/>
+            <field name="group" ref="group_sale_admin"/>
+        </record>
+
+        <menuitem name="Sales" id="menu_sale" sequence="5"/>
+        <record model="ir.ui.menu-res.group" id="menu_sale_group_sale">
+            <field name="menu" ref="menu_sale"/>
+            <field name="group" ref="group_sale"/>
         </record>
 
         <record model="ir.action.wizard" id="wizard_shipment_handle_exception">
@@ -74,19 +90,19 @@ this repository contains the full copyright notices and license terms. -->
                                 <field name="invoice_state"/>
                                 <label name="shipment_state"/>
                                 <field name="shipment_state"/>
-                            </group>
-                            <group col="2" colspan="2" id="amount_state_buttons">
-                                <label name="untaxed_amount"/>
-                                <field name="untaxed_amount"/>
-                                <label name="tax_amount"/>
-                                <field name="tax_amount"/>
-                                <label name="total_amount"/>
-                                <field name="total_amount"/>
                                 <label name="state"/>
                                 <field name="state"/>
+                            </group>
+                            <group col="2" colspan="2" id="amount_buttons">
+                                <label name="untaxed_amount" xalign="1.0" xexpand="1"/>
+                                <field name="untaxed_amount" xalign="1.0" xexpand="0"/>
+                                <label name="tax_amount" xalign="1.0" xexpand="1"/>
+                                <field name="tax_amount" xalign="1.0" xexpand="0"/>
+                                <label name="total_amount" xalign="1.0" xexpand="1"/>
+                                <field name="total_amount" xalign="1.0" xexpand="0"/>
                                 <group col="6" colspan="2" id="buttons">
                                     <button name="cancel" string="Cancel"
-                                        states="{'invisible': Or(Equal(Eval('state'), 'cancel'), Not(In(Eval('state'), ['draft', 'quotation'])), Equal(Eval('invoice_state'), 'exception'), Equal(Eval('shipment_state'), 'exception')), 'readonly': Not(In(%(group_sale)d, Eval('groups', [])))}"
+                                        states="{'invisible': Or(Equal(Eval('state'), 'cancel'), And(Not(In(Eval('state'), ['draft', 'quotation'])), Not(Equal(Eval('invoice_state'), 'exception')), Not(Equal(Eval('shipment_state'), 'exception')))), 'readonly': Not(In(%(group_sale)d, Eval('groups', [])))}"
                                         icon="tryton-cancel"/>
                                     <button name="draft" string="Draft"
                                         states="{'invisible': Not(Equal(Eval('state'), 'quotation')), 'readonly': Not(In(%(group_sale)d, Eval('groups', [])))}"
@@ -122,27 +138,25 @@ this repository contains the full copyright notices and license terms. -->
                             <field name="comment" colspan="4" spell="Eval('party_lang')"/>
                         </page>
                         <page string="Invoices" id="invoices">
-                            <separator name="invoices" colspan="4"/>
                             <field name="invoices" colspan="4">
                                 <tree>
-                                  <field name="number" select="1"/>
-                                  <field name="reference" select="1"/>
-                                  <field name="invoice_date" select="2"/>
-                                  <field name="party" select="1"/>
-                                  <field name="currency" select="2"/>
-                                  <field name="untaxed_amount" select="2"/>
-                                  <field name="tax_amount" select="2"/>
-                                  <field name="total_amount" select="2"/>
-                                  <field name="state" select="2"/>
+                                  <field name="number"/>
+                                  <field name="reference"/>
+                                  <field name="invoice_date"/>
+                                  <field name="party"/>
+                                  <field name="currency"/>
+                                  <field name="untaxed_amount"/>
+                                  <field name="tax_amount"/>
+                                  <field name="total_amount"/>
+                                  <field name="state"/>
                                   <field name="sale_exception_state"/>
                                   <field name="amount_to_pay_today"/>
-                                  <field name="description" select="2"/>
+                                  <field name="description"/>
                                   <field name="currency_digits" tree_invisible="1"/>
                               </tree>
                             </field>
                         </page>
                         <page string="Shipments" id="shipments">
-                            <separator name="moves" colspan="4"/>
                             <field name="moves" colspan="4">
                                 <tree string="Moves">
                                     <field name="product"/>
@@ -155,7 +169,6 @@ this repository contains the full copyright notices and license terms. -->
                                     <field name="unit_digits" tree_invisible="1"/>
                                 </tree>
                             </field>
-                            <separator name="shipments" colspan="4"/>
                             <field name="shipments" colspan="4"/>
                         </page>
                     </notebook>
@@ -171,19 +184,19 @@ this repository contains the full copyright notices and license terms. -->
             <field name="arch" type="xml">
                 <![CDATA[
                 <tree string="Sales">
-                    <field name="reference" select="1"/>
-                    <field name="sale_date" select="1"/>
-                    <field name="party" select="1"/>
+                    <field name="reference"/>
+                    <field name="sale_date"/>
+                    <field name="party"/>
                     <field name="warehouse"/>
-                    <field name="currency" select="2"/>
-                    <field name="untaxed_amount" select="2"/>
-                    <field name="total_amount" select="2"/>
-                    <field name="state" select="2"/>
-                    <field name="invoice_state" select="2"/>
-                    <field name="shipment_state" select="2"/>
-                    <field name="description" select="2"/>
+                    <field name="currency"/>
+                    <field name="untaxed_amount"/>
+                    <field name="total_amount"/>
+                    <field name="state"/>
+                    <field name="invoice_state"/>
+                    <field name="shipment_state"/>
+                    <field name="description"/>
                     <field name="currency_digits" tree_invisible="1"/>
-                    <field name="create_date" tree_invisible="1" select="2"/>
+                    <field name="create_date" tree_invisible="1"/>
                 </tree>
                 ]]>
             </field>
@@ -194,17 +207,20 @@ this repository contains the full copyright notices and license terms. -->
             <field name="type">form</field>
             <field name="arch" type="xml">
                 <![CDATA[
-                <form string="Handle shipment Exception" col="1">
-                        <separator string="Choose move to recreate"
-                                   id="choose"/>
-                        <field name="recreate_moves">
-                          <tree string="Recreate Moves" fill="1">
-                              <field name="product"/>
-                              <field name="quantity"/>
-                              <field name="uom"/>
-                              <field name="unit_digits" tree_invisible="1"/>
-                          </tree>
-                        </field>
+                <form string="Handle shipment Exception" col="2">
+                    <image name="tryton-dialog-information" xexpand="0"
+                        xfill="0"/>
+                    <label string="Choose move to recreate"
+                        id="choose"
+                        yalign="0.0" xalign="0.0" xexpand="1"/>
+                    <field name="recreate_moves" colspan="2">
+                        <tree string="Recreate Moves" fill="1">
+                            <field name="product"/>
+                            <field name="quantity"/>
+                            <field name="uom"/>
+                            <field name="unit_digits" tree_invisible="1"/>
+                        </tree>
+                    </field>
                 </form>
                 ]]>
             </field>
@@ -215,10 +231,13 @@ this repository contains the full copyright notices and license terms. -->
             <field name="type">form</field>
             <field name="arch" type="xml">
                 <![CDATA[
-                <form string="Handle Invoice Exception" col="1">
-                    <separator string="Choose invoices to recreate"
-                               id="choose"/>
-                    <field name="recreate_invoices"/>
+                <form string="Handle Invoice Exception" col="2">
+                    <image name="tryton-dialog-information" xexpand="0"
+                        xfill="0"/>
+                    <label string="Choose invoices to recreate"
+                        id="choose"
+                        yalign="0.0" xalign="0.0" xexpand="1"/>
+                    <field name="recreate_invoices" colspan="2"/>
                 </form>
                 ]]>
             </field>
@@ -232,7 +251,7 @@ this repository contains the full copyright notices and license terms. -->
         <record model="ir.action.keyword"
                 id="act_open_shipment_keyword1">
             <field name="keyword">form_relate</field>
-            <field name="model">sale.sale,0</field>
+            <field name="model">sale.sale,-1</field>
             <field name="action" ref="act_shipment_form"/>
         </record>
         <record model="ir.action.act_window" id="act_invoice_form">
@@ -243,14 +262,14 @@ this repository contains the full copyright notices and license terms. -->
         <record model="ir.action.keyword"
                 id="act_open_invoice_keyword1">
             <field name="keyword">form_relate</field>
-            <field name="model">sale.sale,0</field>
+            <field name="model">sale.sale,-1</field>
             <field name="action" ref="act_invoice_form"/>
         </record>
 
         <record model="ir.action.act_window" id="act_sale_form">
             <field name="name">Sales</field>
             <field name="res_model">sale.sale</field>
-            <field name="search_value">{'create_date': ['between', Date(delta_years=-1)]}</field>
+            <field name="search_value">[('create_date', '>=', DateTime(hour=0, minute=0, second=0, microsecond=0, delta_years=-1))]</field>
         </record>
         <record model="ir.action.act_window.view" id="act_sale_form_view1">
             <field name="sequence" eval="10"/>
@@ -264,23 +283,10 @@ this repository contains the full copyright notices and license terms. -->
         </record>
         <menuitem parent="menu_sale" action="act_sale_form"
             id="menu_sale_form" sequence="10"/>
-
-        <record model="ir.action.act_window" id="act_sale_form_new">
-            <field name="name">New Sale</field>
-            <field name="res_model">sale.sale</field>
-        </record>
-        <record model="ir.action.act_window.view" id="act_sale_form_new_view1">
-            <field name="sequence" eval="20"/>
-            <field name="view" ref="sale_view_tree"/>
-            <field name="act_window" ref="act_sale_form_new"/>
-        </record>
-        <record model="ir.action.act_window.view" id="act_sale_form_new_view2">
-            <field name="sequence" eval="10"/>
-            <field name="view" ref="sale_view_form"/>
-            <field name="act_window" ref="act_sale_form_new"/>
+        <record model="ir.ui.menu-res.group" id="menu_sale_form_group_sale">
+            <field name="menu" ref="menu_sale_form"/>
+            <field name="group" ref="group_sale"/>
         </record>
-        <menuitem parent="menu_sale_form" action="act_sale_form_new"
-            id="menu_sale_form_new" sequence="10"/>
 
         <record model="ir.action.act_window" id="act_sale_form_draft">
             <field name="name">Draft Sales</field>
@@ -338,7 +344,7 @@ this repository contains the full copyright notices and license terms. -->
 
         <record model="ir.model.access" id="access_sale">
             <field name="model" search="[('model', '=', 'sale.sale')]"/>
-            <field name="perm_read" eval="True"/>
+            <field name="perm_read" eval="False"/>
             <field name="perm_write" eval="False"/>
             <field name="perm_create" eval="False"/>
             <field name="perm_delete" eval="False"/>
@@ -355,9 +361,18 @@ this repository contains the full copyright notices and license terms. -->
         <record model="ir.sequence.type" id="sequence_type_sale">
             <field name="name">Sale</field>
             <field name="code">sale.sale</field>
-            <field name="groups"
-                eval="[('add', ref('res.group_admin')), ('add', ref('group_sale_admin'))]"/>
         </record>
+        <record model="ir.sequence.type-res.group"
+            id="sequence_type_sale_group_admin">
+            <field name="sequence_type" ref="sequence_type_sale"/>
+            <field name="group" ref="res.group_admin"/>
+        </record>
+        <record model="ir.sequence.type-res.group"
+            id="sequence_type_sale_group_sale_admin">
+            <field name="sequence_type" ref="sequence_type_sale"/>
+            <field name="group" ref="group_sale_admin"/>
+        </record>
+
         <record model="ir.sequence" id="sequence_sale">
             <field name="name">Sale</field>
             <field name="code">sale.sale</field>
@@ -371,22 +386,19 @@ this repository contains the full copyright notices and license terms. -->
         <record model="workflow.activity" id="sale_activity_draft">
             <field name="name">Draft</field>
             <field name="workflow" ref="sale_workflow"/>
-            <field name="kind">function</field>
-            <field name="action">write({'state': 'draft'})</field>
+            <field name="method">wkf_draft</field>
             <field name="flow_start" eval="True"/>
         </record>
         <record model="workflow.activity" id="sale_activity_quotation">
             <field name="name">Quotation</field>
             <field name="workflow" ref="sale_workflow"/>
-            <field name="kind">function</field>
-            <field name="action">check_for_quotation()
set_reference()
write({'state': 'quotation'})</field>
+            <field name="method">wkf_quotation</field>
         </record>
         <record model="workflow.activity" id="sale_activity_confirmed">
             <field name="name">Confirmed</field>
             <field name="workflow" ref="sale_workflow"/>
             <field name="split_mode">AND</field>
-            <field name="kind">function</field>
-            <field name="action">write({'state': 'confirmed'})</field>
+            <field name="method">wkf_confirmed</field>
         </record>
         <record model="workflow.activity" id="sale_activity_invoice_method">
             <field name="name">Invoice Method</field>
@@ -396,20 +408,17 @@ this repository contains the full copyright notices and license terms. -->
         <record model="workflow.activity" id="sale_activity_waiting_invoice_sale">
             <field name="name">Waiting Invoice</field>
             <field name="workflow" ref="sale_workflow"/>
-            <field name="kind">function</field>
-            <field name="action">create_invoice()
write({'invoice_state': 'waiting'})</field>
+            <field name="method">wkf_waiting_invoice_sale</field>
         </record>
         <record model="workflow.activity" id="sale_activity_invoice_sale_exception">
             <field name="name">Invoice Exception</field>
             <field name="workflow" ref="sale_workflow"/>
-            <field name="kind">function</field>
-            <field name="action">write({'invoice_state': 'exception'})</field>
+            <field name="method">wkf_invoice_sale_exception</field>
         </record>
         <record model="workflow.activity" id="sale_activity_invoice_sale_done">
             <field name="name">Invoice Done</field>
             <field name="workflow" ref="sale_workflow"/>
-            <field name="kind">function</field>
-            <field name="action">write({'invoice_state': 'paid'})</field>
+            <field name="method">wkf_invoice_sale_done</field>
         </record>
         <record model="workflow.activity" id="sale_activity_shipment_invoice_method">
             <field name="name">Shipment Invoice Method</field>
@@ -419,26 +428,22 @@ this repository contains the full copyright notices and license terms. -->
         <record model="workflow.activity" id="sale_activity_shipment_invoice">
             <field name="name">Shipment Invoice</field>
             <field name="workflow" ref="sale_workflow"/>
-            <field name="kind">function</field>
-            <field name="action">create_shipment()</field>
+            <field name="method">wkf_shipment_invoice</field>
         </record>
         <record model="workflow.activity" id="sale_activity_waiting_shipment_invoice">
             <field name="name">Waiting Shipment Invoice</field>
             <field name="workflow" ref="sale_workflow"/>
-            <field name="kind">function</field>
-            <field name="action">write({'shipment_state': 'waiting'})
create_shipment()</field>
+            <field name="method">wkf_waiting_shipment_invoice</field>
         </record>
         <record model="workflow.activity" id="sale_activity_shipment_invoice_exception">
             <field name="name">Shipment Invoice Exception</field>
             <field name="workflow" ref="sale_workflow"/>
-            <field name="kind">function</field>
-            <field name="action">write({'shipment_state': 'exception'})</field>
+            <field name="method">wkf_shipment_invoice_exception</field>
         </record>
         <record model="workflow.activity" id="sale_activity_shipment_invoice_done">
             <field name="name">Shipment Invoice Done</field>
             <field name="workflow" ref="sale_workflow"/>
-            <field name="kind">function</field>
-            <field name="action">write({'shipment_state': 'sent'})</field>
+            <field name="method">wkf_shipment_invoice_done</field>
         </record>
         <record model="workflow.activity" id="sale_activity_shipment_invoice_method_done">
             <field name="name">Shipment Invoice Method Done</field>
@@ -455,20 +460,17 @@ this repository contains the full copyright notices and license terms. -->
         <record model="workflow.activity" id="sale_activity_shipment">
             <field name="name">Shipment</field>
             <field name="workflow" ref="sale_workflow"/>
-            <field name="kind">function</field>
-            <field name="action">create_shipment()</field>
+            <field name="method">wkf_shipment</field>
         </record>
         <record model="workflow.activity" id="sale_activity_waiting_shipment">
             <field name="name">Waiting Shipment</field>
             <field name="workflow" ref="sale_workflow"/>
-            <field name="kind">function</field>
-            <field name="action">write({'shipment_state': 'waiting'})
create_shipment()</field>
+            <field name="method">wkf_waiting_shipment</field>
         </record>
         <record model="workflow.activity" id="sale_activity_shipment_exception">
             <field name="name">Shipment Exception</field>
             <field name="workflow" ref="sale_workflow"/>
-            <field name="kind">function</field>
-            <field name="action">write({'shipment_state': 'exception'})</field>
+            <field name="method">wkf_shipment_exception</field>
         </record>
         <record model="workflow.activity" id="sale_activity_invoice_shipment_method">
             <field name="name">Invoice Shipment Method</field>
@@ -478,32 +480,27 @@ this repository contains the full copyright notices and license terms. -->
         <record model="workflow.activity" id="sale_activity_invoice_shipment">
             <field name="name">Invoice Shipment</field>
             <field name="workflow" ref="sale_workflow"/>
-            <field name="kind">function</field>
-            <field name="action">create_invoice()
write({'invoice_state': 'waiting'})</field>
+            <field name="method">wkf_invoice_shipment</field>
         </record>
         <record model="workflow.activity" id="sale_activity_waiting_invoice_shipment">
             <field name="name">Waiting Invoice Shipment</field>
             <field name="workflow" ref="sale_workflow"/>
-            <field name="kind">function</field>
-            <field name="action">write({'invoice_state': 'waiting', 'shipment_state': 'sent'})</field>
+            <field name="method">wkf_waiting_invoice_shipment</field>
         </record>
         <record model="workflow.activity" id="sale_activity_invoice_shipment_exception">
             <field name="name">Invoice Shipment Exception</field>
             <field name="workflow" ref="sale_workflow"/>
-            <field name="kind">function</field>
-            <field name="action">write({'invoice_state': 'exception'})</field>
+            <field name="method">wkf_invoice_shipment_exception</field>
         </record>
         <record model="workflow.activity" id="sale_activity_invoice_shipment_done">
             <field name="name">Invoice Shipment Done</field>
             <field name="workflow" ref="sale_workflow"/>
-            <field name="kind">function</field>
-            <field name="action">write({'invoice_state': 'paid'})</field>
+            <field name="method">wkf_invoice_shipment_done</field>
         </record>
         <record model="workflow.activity" id="sale_activity_invoice_shipment_method_done">
             <field name="name">Invoice Shipment Method Done</field>
             <field name="workflow" ref="sale_workflow"/>
-            <field name="kind">function</field>
-            <field name="action">write({'shipment_state': 'sent'})</field>
+            <field name="method">wkf_invoice_shipment_method_done</field>
         </record>
         <record model="workflow.activity" id="sale_activity_shipment_method_done">
             <field name="name">Shipment Method Done</field>
@@ -513,22 +510,20 @@ this repository contains the full copyright notices and license terms. -->
             <field name="name">Done</field>
             <field name="workflow" ref="sale_workflow"/>
             <field name="join_mode">AND</field>
-            <field name="kind">function</field>
-            <field name="action">write({'state': 'done'})</field>
+            <field name="method">wkf_done</field>
             <field name="flow_stop" eval="True"/>
         </record>
         <record model="workflow.activity" id="sale_activity_cancel">
             <field name="name">Canceled</field>
             <field name="workflow" ref="sale_workflow"/>
-            <field name="kind">function</field>
-            <field name="action">write({'state': 'cancel'})</field>
+            <field name="method">wkf_cancel</field>
             <field name="flow_stop" eval="True"/>
         </record>
 
         <record model="workflow.transition" id="sale_transition_draft_quotation">
             <field name="act_from" ref="sale_activity_draft"/>
             <field name="act_to" ref="sale_activity_quotation"/>
-            <field name="condition">bool(lines)</field>
+            <field name="condition">wkf_draft2quotation</field>
             <field name="signal">quotation</field>
             <field name="group" ref="group_sale"/>
         </record>
@@ -564,19 +559,20 @@ this repository contains the full copyright notices and license terms. -->
         <record model="workflow.transition" id="sale_transition_invoice_method_waiting_invoice_sale">
             <field name="act_from" ref="sale_activity_invoice_method"/>
             <field name="act_to" ref="sale_activity_waiting_invoice_sale"/>
-            <field name="condition">invoice_method == 'order'</field>
+            <field name="condition">wkf_invoice_method2waiting_invoice_sale</field>
         </record>
         <record model="workflow.transition" id="sale_transition_invoice_method_invoice_method_done">
             <field name="act_from" ref="sale_activity_invoice_method"/>
             <field name="act_to" ref="sale_activity_invoice_method_done"/>
-            <field name="condition">invoice_method != 'order'</field>
+            <field name="condition">wkf_invoice_method2invoice_method_done</field>
         </record>
         <record model="workflow.transition" id="sale_transition_waiting_invoice_sale_invoice_sale_exception">
             <field name="act_from" ref="sale_activity_waiting_invoice_sale"/>
             <field name="act_to" ref="sale_activity_invoice_sale_exception"/>
             <field name="trigger_model">account.invoice</field>
-            <field name="trigger_expr_id">[x.id for x in invoices]</field>
-            <field name="condition">invoice_exception</field>
+            <field name="trigger_ids">wkf_triggered_invoices</field>
+            <field
+                name="condition">wkf_waiting_invoice_sale2invoice_sale_exception</field>
         </record>
         <record model="workflow.transition" id="sale_transition_invoice_sale_exception_invoice_sale">
             <field name="act_from" ref="sale_activity_invoice_sale_exception"/>
@@ -594,8 +590,8 @@ this repository contains the full copyright notices and license terms. -->
             <field name="act_from" ref="sale_activity_waiting_invoice_sale"/>
             <field name="act_to" ref="sale_activity_invoice_sale_done"/>
             <field name="trigger_model">account.invoice</field>
-            <field name="trigger_expr_id">[x.id for x in invoices]</field>
-            <field name="condition">invoice_paid</field>
+            <field name="trigger_ids">wkf_triggered_invoices</field>
+            <field name="condition">wkf_waiting_invoice_sale2invoice_sale_done</field>
         </record>
         <record model="workflow.transition" id="sale_transition_invoice_sale_done">
             <field name="act_from" ref="sale_activity_invoice_sale_done"/>
@@ -604,12 +600,14 @@ this repository contains the full copyright notices and license terms. -->
         <record model="workflow.transition" id="sale_transition_shipment_invoice_method_shipment_invoice_method_done">
             <field name="act_from" ref="sale_activity_shipment_invoice_method"/>
             <field name="act_to" ref="sale_activity_shipment_invoice_method_done"/>
-            <field name="condition">shipment_method != 'invoice'</field>
+            <field
+                name="condition">wkf_shipment_invoice_method2shipment_invoice_method_done</field>
         </record>
         <record model="workflow.transition" id="sale_transition_shipment_invoice_method_shipment_invoice">
             <field name="act_from" ref="sale_activity_shipment_invoice_method"/>
             <field name="act_to" ref="sale_activity_shipment_invoice"/>
-            <field name="condition">shipment_method == 'invoice'</field>
+            <field
+                name="condition">wkf_shipment_invoice_method2shipment_invoice</field>
         </record>
         <record model="workflow.transition" id="sale_transition_shipment_invoice_waiting_shipment_invoice">
             <field name="act_from" ref="sale_activity_shipment_invoice"/>
@@ -619,8 +617,9 @@ this repository contains the full copyright notices and license terms. -->
             <field name="act_from" ref="sale_activity_waiting_shipment_invoice"/>
             <field name="act_to" ref="sale_activity_shipment_invoice_exception"/>
             <field name="trigger_model">stock.shipment.out</field>
-            <field name="trigger_expr_id">[x.id for x in shipments]</field>
-            <field name="condition">shipment_exception</field>
+            <field name="trigger_ids">wkf_triggered_shipments</field>
+            <field
+                name="condition">wkf_waiting_shipment_invoice2shipment_invoice_exception</field>
         </record>
         <record model="workflow.transition" id="sale_transition_shipment_invoice_exception_cancel">
             <field name="act_from" ref="sale_activity_shipment_invoice_exception"/>
@@ -638,8 +637,9 @@ this repository contains the full copyright notices and license terms. -->
             <field name="act_from" ref="sale_activity_waiting_shipment_invoice"/>
             <field name="act_to" ref="sale_activity_shipment_invoice_done"/>
             <field name="trigger_model">stock.shipment.out</field>
-            <field name="trigger_expr_id">[x.id for x in shipments]</field>
-            <field name="condition">shipment_done</field>
+            <field name="trigger_ids">wkf_triggered_shipments</field>
+            <field
+                name="condition">wkf_waiting_shipment_invoice2shipment_invoice_done</field>
         </record>
         <record model="workflow.transition" id="sale_transition_shipment_invoice_done_shipment_invoice_method_done">
             <field name="act_from" ref="sale_activity_shipment_invoice_done"/>
@@ -660,12 +660,12 @@ this repository contains the full copyright notices and license terms. -->
         <record model="workflow.transition" id="sale_transition_shipment_method_shipment_method_done">
             <field name="act_from" ref="sale_activity_shipment_method"/>
             <field name="act_to" ref="sale_activity_shipment_method_done"/>
-            <field name="condition">shipment_method != 'order'</field>
+            <field name="condition">wkf_shipment_method2shipment_method_done</field>
         </record>
         <record model="workflow.transition" id="sale_transition_shipment_method_shipment">
             <field name="act_from" ref="sale_activity_shipment_method"/>
             <field name="act_to" ref="sale_activity_shipment"/>
-            <field name="condition">shipment_method == 'order'</field>
+            <field name="condition">wkf_shipment_method2shipment</field>
         </record>
         <record model="workflow.transition" id="sale_transition_shipment_waiting_shipment">
             <field name="act_from" ref="sale_activity_shipment"/>
@@ -675,7 +675,7 @@ this repository contains the full copyright notices and license terms. -->
             <field name="act_from" ref="sale_activity_waiting_shipment"/>
             <field name="act_to" ref="sale_activity_shipment_exception"/>
             <field name="signal">shipment_update</field>
-            <field name="condition">shipment_exception</field>
+            <field name="condition">wkf_waiting_shipment2shipment_exception</field>
         </record>
         <record model="workflow.transition" id="sale_transition_shipment_exception_cancel">
             <field name="act_from" ref="sale_activity_shipment_exception"/>
@@ -693,44 +693,51 @@ this repository contains the full copyright notices and license terms. -->
             <field name="act_from" ref="sale_activity_waiting_shipment"/>
             <field name="act_to" ref="sale_activity_invoice_shipment_method"/>
             <field name="signal">shipment_update</field>
-            <field name="condition">not shipment_exception</field>
+            <field
+                name="condition">wkf_waiting_shipment2invoice_shipment_method</field>
         </record>
         <record model="workflow.transition" id="sale_transition_waiting_shipment_invoice_shipment_method2">
             <field name="act_from" ref="sale_activity_waiting_shipment"/>
             <field name="act_to" ref="sale_activity_invoice_shipment_method"/>
-            <field name="condition">shipment_done</field>
+            <field
+                name="condition">wkf_waiting_shipment2invoice_shipment_method_nosignal</field>
         </record>
         <record model="workflow.transition" id="sale_transition_invoice_shipment_method_invoice_shipment">
             <field name="act_from" ref="sale_activity_invoice_shipment_method"/>
             <field name="act_to" ref="sale_activity_invoice_shipment"/>
-            <field name="condition">invoice_method == 'shipment'</field>
+            <field
+                name="condition">wkf_invoice_shipment_method2invoice_shipment</field>
         </record>
         <record model="workflow.transition" id="sale_transition_invoice_shipment_method_invoice_shipment_method_done">
             <field name="act_from" ref="sale_activity_invoice_shipment_method"/>
             <field name="act_to" ref="sale_activity_invoice_shipment_method_done"/>
-            <field name="condition">invoice_method != 'shipment' and shipment_done</field>
+            <field
+                name="condition">wkf_invoice_shipment_method2invoice_shipment_method_done</field>
         </record>
         <record model="workflow.transition" id="sale_transition_invoice_shipment_method_waiting_shipment">
             <field name="act_from" ref="sale_activity_invoice_shipment_method"/>
             <field name="act_to" ref="sale_activity_waiting_shipment"/>
-            <field name="condition">invoice_method != 'shipment' and not shipment_done</field>
+            <field
+                name="condition">wkf_invoice_shipment_method2waiting_shipment</field>
         </record>
         <record model="workflow.transition" id="sale_transition_invoice_shipment_waiting_shipment">
             <field name="act_from" ref="sale_activity_invoice_shipment"/>
             <field name="act_to" ref="sale_activity_waiting_shipment"/>
-            <field name="condition">not shipment_done</field>
+            <field name="condition">wkf_invoice_shipment2waiting_shipment</field>
         </record>
         <record model="workflow.transition" id="sale_transition_invoice_shipment_waiting_invoice_shipment">
             <field name="act_from" ref="sale_activity_invoice_shipment"/>
             <field name="act_to" ref="sale_activity_waiting_invoice_shipment"/>
-            <field name="condition">shipment_done</field>
+            <field
+                name="condition">wkf_invoice_shipment2waiting_invoice_shipment</field>
         </record>
         <record model="workflow.transition" id="sale_transition_waiting_invoice_shipment_invoice_shipment_exception">
             <field name="act_from" ref="sale_activity_waiting_invoice_shipment"/>
             <field name="act_to" ref="sale_activity_invoice_shipment_exception"/>
             <field name="trigger_model">account.invoice</field>
-            <field name="trigger_expr_id">[x.id for x in invoices]</field>
-            <field name="condition">invoice_exception</field>
+            <field name="trigger_ids">wkf_triggered_invoices</field>
+            <field
+                name="condition">wkf_waiting_invoice_shipment2invoice_shipment_exception</field>
         </record>
         <record model="workflow.transition" id="sale_transition_invoice_shipment_exception_cancel">
             <field name="act_from" ref="sale_activity_invoice_shipment_exception"/>
@@ -748,8 +755,9 @@ this repository contains the full copyright notices and license terms. -->
             <field name="act_from" ref="sale_activity_waiting_invoice_shipment"/>
             <field name="act_to" ref="sale_activity_invoice_shipment_done"/>
             <field name="trigger_model">account.invoice</field>
-            <field name="trigger_expr_id">[x.id for x in invoices]</field>
-            <field name="condition">invoice_paid</field>
+            <field name="trigger_ids">wkf_triggered_invoices</field>
+            <field
+                name="condition">wkf_waiting_invoice_shipment2invoice_shipment_done</field>
         </record>
         <record model="workflow.transition" id="sale_transition_invoice_shipment_done_invoice_shipment_method_done">
             <field name="act_from" ref="sale_activity_invoice_shipment_done"/>
@@ -773,7 +781,7 @@ this repository contains the full copyright notices and license terms. -->
         </record>
         <record model="ir.action.keyword" id="report_sale_keyword">
             <field name="keyword">form_print</field>
-            <field name="model">sale.sale,0</field>
+            <field name="model">sale.sale,-1</field>
             <field name="action" ref="report_sale"/>
         </record>
 
@@ -794,14 +802,14 @@ this repository contains the full copyright notices and license terms. -->
                             <label name="product"/>
                             <field name="product">
                                 <tree string="Products">
-                                    <field name="name" select="1"/>
-                                    <field name="code" select="1"/>
-                                    <field name="list_price_uom" select="2"/>
-                                    <field name="cost_price_uom" select="2"/>
-                                    <field name="quantity" select="2"/>
-                                    <field name="forecast_quantity" select="2"/>
-                                    <field name="default_uom" select="2"/>
-                                    <field name="active" select="2"/>
+                                    <field name="name"/>
+                                    <field name="code"/>
+                                    <field name="list_price_uom"/>
+                                    <field name="cost_price_uom"/>
+                                    <field name="quantity"/>
+                                    <field name="forecast_quantity"/>
+                                    <field name="default_uom"/>
+                                    <field name="active"/>
                                 </tree>
                             </field>
                             <newline/>
@@ -816,7 +824,6 @@ this repository contains the full copyright notices and license terms. -->
                             <field name="unit_price"/>
                             <label name="amount"/>
                             <field name="amount"/>
-                            <separator name="taxes" colspan="4"/>
                             <field name="taxes" colspan="4"/>
                         </page>
                         <page string="Notes" id="notes">
@@ -836,13 +843,13 @@ this repository contains the full copyright notices and license terms. -->
             <field name="arch" type="xml">
                 <![CDATA[
                 <tree string="Sale Lines">
-                    <field name="sale" select="1"/>
-                    <field name="type" select="1"/>
-                    <field name="product" select="1"/>
-                    <field name="description" select="1"/>
-                    <field name="quantity" select="1"/>
-                    <field name="unit" select="2"/>
-                    <field name="unit_price" select="2"/>
+                    <field name="sale"/>
+                    <field name="type"/>
+                    <field name="product"/>
+                    <field name="description"/>
+                    <field name="quantity"/>
+                    <field name="unit"/>
+                    <field name="unit_price"/>
                     <field name="taxes"/>
                     <field name="amount"/>
                     <field name="unit_digits" tree_invisible="1"/>
@@ -853,7 +860,7 @@ this repository contains the full copyright notices and license terms. -->
 
         <record model="ir.model.access" id="access_sale_line">
             <field name="model" search="[('model', '=', 'sale.line')]"/>
-            <field name="perm_read" eval="True"/>
+            <field name="perm_read" eval="False"/>
             <field name="perm_write" eval="False"/>
             <field name="perm_create" eval="False"/>
             <field name="perm_delete" eval="False"/>
@@ -887,6 +894,8 @@ this repository contains the full copyright notices and license terms. -->
                             <field name="salable"/>
                             <label name="sale_uom"/>
                             <field name="sale_uom"/>
+                            <label name="delivery_time"/>
+                            <field name="delivery_time"/>
                         </page>
                     </xpath>
                 </data>
@@ -901,7 +910,7 @@ this repository contains the full copyright notices and license terms. -->
                 <data>
                     <xpath expr="/tree/field[@name="default_uom"]"
                         position="after">
-                        <field name="salable" select="2"/>
+                        <field name="salable"/>
                     </xpath>
                 </data>
                 ]]>
@@ -929,5 +938,41 @@ this repository contains the full copyright notices and license terms. -->
             <field name="rule_group" ref="rule_group_sale"/>
         </record>
 
+        <record model="ir.model.access" id="access_invoice_sale">
+            <field name="model" search="[('model', '=', 'account.invoice')]"/>
+            <field name="group" ref="group_sale"/>
+            <field name="perm_read" eval="True"/>
+            <field name="perm_write" eval="False"/>
+            <field name="perm_create" eval="False"/>
+            <field name="perm_delete" eval="False"/>
+        </record>
+
+        <record model="ir.model.access" id="access_invoice_line_sale">
+            <field name="model" search="[('model', '=', 'account.invoice.line')]"/>
+            <field name="group" ref="group_sale"/>
+            <field name="perm_read" eval="True"/>
+            <field name="perm_write" eval="False"/>
+            <field name="perm_create" eval="False"/>
+            <field name="perm_delete" eval="False"/>
+        </record>
+
+        <record model="ir.model.access" id="access_move_group_sale">
+            <field name="model" search="[('model', '=', 'stock.move')]"/>
+            <field name="group" ref="group_sale"/>
+            <field name="perm_read" eval="True"/>
+            <field name="perm_write" eval="False"/>
+            <field name="perm_create" eval="False"/>
+            <field name="perm_delete" eval="False"/>
+        </record>
+
+        <record model="ir.model.access" id="access_shipment_out_group_sale">
+            <field name="model" search="[('model', '=', 'stock.shipment.out')]"/>
+            <field name="group" ref="group_sale"/>
+            <field name="perm_read" eval="True"/>
+            <field name="perm_write" eval="False"/>
+            <field name="perm_create" eval="False"/>
+            <field name="perm_delete" eval="False"/>
+        </record>
+
     </data>
 </tryton>
diff --git a/setup.py b/setup.py
index af0ce68..721a34e 100644
--- a/setup.py
+++ b/setup.py
@@ -40,18 +40,20 @@ setup(name='trytond_sale',
     classifiers=[
         'Development Status :: 5 - Production/Stable',
         'Environment :: Plugins',
+        'Framework :: Tryton',
         'Intended Audience :: Developers',
         'Intended Audience :: Financial and Insurance Industry',
         'Intended Audience :: Legal Industry',
         'License :: OSI Approved :: GNU General Public License (GPL)',
         'Natural Language :: Bulgarian',
+        'Natural Language :: Czech',
         'Natural Language :: Dutch',
         'Natural Language :: English',
         'Natural Language :: French',
         'Natural Language :: German',
+        'Natural Language :: Russian',
         'Natural Language :: Spanish',
         'Operating System :: OS Independent',
-        'Programming Language :: Python :: 2.5',
         'Programming Language :: Python :: 2.6',
         'Programming Language :: Python :: 2.7',
         'Topic :: Office/Business',
diff --git a/tests/test_sale.py b/tests/test_sale.py
index b6d37b3..d68d1c6 100644
--- a/tests/test_sale.py
+++ b/tests/test_sale.py
@@ -10,7 +10,7 @@ if os.path.isdir(DIR):
 
 import unittest
 import trytond.tests.test_tryton
-from trytond.tests.test_tryton import test_view
+from trytond.tests.test_tryton import test_view, test_depends
 
 
 class SaleTestCase(unittest.TestCase):
@@ -27,6 +27,12 @@ class SaleTestCase(unittest.TestCase):
         '''
         test_view('sale')
 
+    def test0006depends(self):
+        '''
+        Test depends.
+        '''
+        test_depends()
+
 def suite():
     suite = trytond.tests.test_tryton.suite()
     suite.addTests(unittest.TestLoader().loadTestsFromTestCase(SaleTestCase))
diff --git a/trytond_sale.egg-info/PKG-INFO b/trytond_sale.egg-info/PKG-INFO
index 323ff5c..03bbc17 100644
--- a/trytond_sale.egg-info/PKG-INFO
+++ b/trytond_sale.egg-info/PKG-INFO
@@ -1,6 +1,6 @@
 Metadata-Version: 1.0
 Name: trytond-sale
-Version: 2.0.1
+Version: 2.2.0
 Summary: Define sale order.
 Add to product sale informations.
 Define the sale price as the list price.
@@ -20,23 +20,25 @@ Home-page: http://www.tryton.org/
 Author: B2CK
 Author-email: info at b2ck.com
 License: GPL-3
-Download-URL: http://downloads.tryton.org/2.0/
+Download-URL: http://downloads.tryton.org/2.2/
 Description: UNKNOWN
 Platform: UNKNOWN
 Classifier: Development Status :: 5 - Production/Stable
 Classifier: Environment :: Plugins
+Classifier: Framework :: Tryton
 Classifier: Intended Audience :: Developers
 Classifier: Intended Audience :: Financial and Insurance Industry
 Classifier: Intended Audience :: Legal Industry
 Classifier: License :: OSI Approved :: GNU General Public License (GPL)
 Classifier: Natural Language :: Bulgarian
+Classifier: Natural Language :: Czech
 Classifier: Natural Language :: Dutch
 Classifier: Natural Language :: English
 Classifier: Natural Language :: French
 Classifier: Natural Language :: German
+Classifier: Natural Language :: Russian
 Classifier: Natural Language :: Spanish
 Classifier: Operating System :: OS Independent
-Classifier: Programming Language :: Python :: 2.5
 Classifier: Programming Language :: Python :: 2.6
 Classifier: Programming Language :: Python :: 2.7
 Classifier: Topic :: Office/Business
diff --git a/trytond_sale.egg-info/SOURCES.txt b/trytond_sale.egg-info/SOURCES.txt
index 957d42f..80c27bb 100644
--- a/trytond_sale.egg-info/SOURCES.txt
+++ b/trytond_sale.egg-info/SOURCES.txt
@@ -5,13 +5,7 @@ LICENSE
 MANIFEST.in
 README
 TODO
-bg_BG.csv
 configuration.xml
-de_DE.csv
-es_CO.csv
-es_ES.csv
-fr_FR.csv
-nl_NL.csv
 party.xml
 sale.odt
 sale.xml
@@ -24,6 +18,14 @@ setup.py
 ./tests/__init__.py
 ./tests/test_sale.py
 doc/index.rst
+locale/bg_BG.po
+locale/cs_CZ.po
+locale/de_DE.po
+locale/es_CO.po
+locale/es_ES.po
+locale/fr_FR.po
+locale/nl_NL.po
+locale/ru_RU.po
 trytond_sale.egg-info/PKG-INFO
 trytond_sale.egg-info/SOURCES.txt
 trytond_sale.egg-info/dependency_links.txt
diff --git a/trytond_sale.egg-info/requires.txt b/trytond_sale.egg-info/requires.txt
index 7d8b694..e3b51f8 100644
--- a/trytond_sale.egg-info/requires.txt
+++ b/trytond_sale.egg-info/requires.txt
@@ -1,9 +1,9 @@
-trytond_company >= 2.0, < 2.1
-trytond_party >= 2.0, < 2.1
-trytond_stock >= 2.0, < 2.1
-trytond_account >= 2.0, < 2.1
-trytond_product >= 2.0, < 2.1
-trytond_account_invoice >= 2.0, < 2.1
-trytond_currency >= 2.0, < 2.1
-trytond_account_product >= 2.0, < 2.1
-trytond >= 2.0, < 2.1
\ No newline at end of file
+trytond_company >= 2.2, < 2.3
+trytond_party >= 2.2, < 2.3
+trytond_stock >= 2.2, < 2.3
+trytond_account >= 2.2, < 2.3
+trytond_product >= 2.2, < 2.3
+trytond_account_invoice >= 2.2, < 2.3
+trytond_currency >= 2.2, < 2.3
+trytond_account_product >= 2.2, < 2.3
+trytond >= 2.2, < 2.3
\ No newline at end of file
commit bd0dc139abf83abbfe0220f4256c754cb9ffb305
Author: Mathias Behrle <mathiasb at m9s.biz>
Date:   Fri Jul 22 12:27:00 2011 +0200

    Removing deprecated XB-Python-Version for dh_python2.

diff --git a/debian/control b/debian/control
index f524c1e..64d6b7f 100644
--- a/debian/control
+++ b/debian/control
@@ -20,7 +20,6 @@ Depends:
  tryton-modules-currency (>= 2.0), tryton-modules-party (>= 2.0),
  tryton-modules-product (>= 2.0), tryton-modules-stock (>= 2.0),
  python-pkg-resources
-XB-Python-Version: ${python:Versions}
 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 a62c93c9122ac334b3d4060dc8db33320f7fee68
Author: Mathias Behrle <mathiasb at m9s.biz>
Date:   Thu Jul 14 01:22:47 2011 +0200

    Releasing debian version 2.0.1-2.

diff --git a/debian/changelog b/debian/changelog
index 13c8578..96ea337 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -1,3 +1,17 @@
+tryton-modules-sale (2.0.1-2) unstable; urgency=low
+
+  [ Daniel Baumann ]
+  * Removing for new source package version obsoleted README.source file.
+  * Adding options for source package.
+  * Compacting copyright file.
+  * Not wrapping uploaders field, it does not exceed 80 chars.
+
+  [ Mathias Behrle ]
+  * Moving from deprecated python-support to dh_python2, thanks to
+    Charlie Smotherman <cjsmo at cableone.net> (Closes: #632809).
+
+ -- Mathias Behrle <mathiasb at m9s.biz>  Thu, 14 Jul 2011 01:22:18 +0200
+
 tryton-modules-sale (2.0.1-1) unstable; urgency=low
 
   * Merging upstream version 2.0.1.
commit 86a16181fb2b477f599594151eb562972078cfd4
Author: Mathias Behrle <mathiasb at m9s.biz>
Date:   Wed Jul 13 19:04:26 2011 +0200

    Moving from deprecated python-support to dh_python2, thanks to Charlie Smotherman <cjsmo at cableone.net> (Closes: #632809).

diff --git a/debian/control b/debian/control
index 71da19e..f524c1e 100644
--- a/debian/control
+++ b/debian/control
@@ -4,11 +4,12 @@ Priority: optional
 Maintainer: Debian Tryton Maintainers <tryton at lists.debian-maintainers.org>
 Uploaders: Daniel Baumann <daniel at debian.org>, Mathias Behrle <mathiasb at m9s.biz>
 Dm-Upload-Allowed: yes
-Build-Depends: debhelper (>= 8), python, python-setuptools, python-support
+Build-Depends: debhelper (>= 8), python (>= 2.6.6-3~), python-setuptools
 Standards-Version: 3.9.2
 Homepage: http://www.tryton.org/
 Vcs-Browser: http://git.debian-maintainers.org/?p=tryton/tryton-modules-sale.git
 Vcs-Git: git://git.debian-maintainers.org/git/tryton/tryton-modules-sale.git
+X-Python-Version: >= 2.5
 
 Package: tryton-modules-sale
 Architecture: all
diff --git a/debian/pycompat b/debian/pycompat
deleted file mode 100644
index 0cfbf08..0000000
--- a/debian/pycompat
+++ /dev/null
@@ -1 +0,0 @@
-2
diff --git a/debian/pyversions b/debian/pyversions
deleted file mode 100644
index b3dc41e..0000000
--- a/debian/pyversions
+++ /dev/null
@@ -1 +0,0 @@
-2.5-
diff --git a/debian/rules b/debian/rules
index 000210b..e32b791 100755
--- a/debian/rules
+++ b/debian/rules
@@ -1,4 +1,9 @@
 #!/usr/bin/make -f
 
 %:
-	dh ${@}
+	dh ${@} --with python2
+
+override_dh_auto_clean:
+	dh_auto_clean
+
+	rm -rf *.egg-info
commit b62b642e849b1a2a3043038d1732530935f8d757
Author: Daniel Baumann <daniel at debian.org>
Date:   Sun Jul 10 16:01:11 2011 +0200

    Not wrapping uploaders field, it does not exceed 80 chars.

diff --git a/debian/control b/debian/control
index de4fd09..71da19e 100644
--- a/debian/control
+++ b/debian/control
@@ -2,9 +2,7 @@ Source: tryton-modules-sale
 Section: python
 Priority: optional
 Maintainer: Debian Tryton Maintainers <tryton at lists.debian-maintainers.org>
-Uploaders:
- Daniel Baumann <daniel at debian.org>,
- Mathias Behrle <mathiasb at m9s.biz>
+Uploaders: Daniel Baumann <daniel at debian.org>, Mathias Behrle <mathiasb at m9s.biz>
 Dm-Upload-Allowed: yes
 Build-Depends: debhelper (>= 8), python, python-setuptools, python-support
 Standards-Version: 3.9.2
commit 67a9594d773f355a6e9901a3dc78804e460b88d0
Author: Daniel Baumann <daniel at debian.org>
Date:   Sun Jul 10 15:54:40 2011 +0200

    Compacting copyright file.

diff --git a/debian/copyright b/debian/copyright
index fc13eeb..b2d5d1a 100644
--- a/debian/copyright
+++ b/debian/copyright
@@ -1,8 +1,3 @@
-Upstream-Contact: Tryton project <tryton at googlegroups.com>
-Upstream-Homepage: http://downloads.tryton.org/
-Maintainer-Contact: Debian Tryton Maintainers <tryton at lists.debian-maintainers.org>
-Maintainer-Homepage: http://tryton.debian-maintainers.org/
-
 Files: *
 Copyright:
  (C) 2004-2008 Tiny SPRL
@@ -10,25 +5,12 @@ Copyright:
  (C) 2008-2011 Bertrand Chenal
  (C) 2008-2011 B2CK SPRL
 License: GPL-3+
- This program is free software: you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation, either version 3 of the License, or
- (at your option) any later version.
- .
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
- .
- You should have received a copy of the GNU General Public License
- along with this program. If not, see <http://www.gnu.org/licenses/>.
- .
- On Debian systems, the complete text of the GNU General Public License
- can be found in /usr/share/common-licenses/GPL-3 file.
 
 Files: debian/*
 Copyright: (C) 2009-2011 Daniel Baumann <daniel at debian.org>
 License: GPL-3+
+
+License: GPL-3+
  This program is free software: you can redistribute it and/or modify
  it under the terms of the GNU General Public License as published by
  the Free Software Foundation, either version 3 of the License, or
@@ -42,5 +24,5 @@ License: GPL-3+
  You should have received a copy of the GNU General Public License
  along with this program. If not, see <http://www.gnu.org/licenses/>.
  .
- On Debian systems, the complete text of the GNU General Public License
+ The complete text of the GNU General Public License
  can be found in /usr/share/common-licenses/GPL-3 file.
commit 4a89cd389eadcfa58755dfdf08dbe1bafbcfa9fa
Author: Daniel Baumann <daniel at debian.org>
Date:   Sun Jul 10 15:38:55 2011 +0200

    Adding options for source package.

diff --git a/debian/source/options b/debian/source/options
new file mode 100644
index 0000000..d053b65
--- /dev/null
+++ b/debian/source/options
@@ -0,0 +1,2 @@
+compression = gzip
+compression-level = 9
commit d4d0b031f6920933385998218968c555fe300c32
Author: Daniel Baumann <daniel at debian.org>
Date:   Sun Jul 10 15:38:03 2011 +0200

    Removing for new source package version obsoleted README.source file.

diff --git a/debian/README.source b/debian/README.source
deleted file mode 100644
index 18b6b24..0000000
--- a/debian/README.source
+++ /dev/null
@@ -1,37 +0,0 @@
-Package Repositories
---------------------
-
-Backports for the current stable debian distribution as well as snapshots of
-unreleased versions may be available in repositories listed on the maintainers
-homepage. The current URL of the maintainer homepage can be seen in
-debian/copyright.
-
-
-Source Access
--------------
-
-You can obtain the sources of this package with:
-
-  $ apt-get source ${PACKAGE}
-
-whereas '${PACKAGE}' has to be replaced with the actual name of the package.
-
-This package is maintained with the Git version control system. The current git
-source tree can be obtained with:
-
-  $ git clone ${GIT_URI}
-
-whereas '${GIT_URI}' has to be replaced with the actual URI for the Git
-repository. The current Git URI can be seen in debian/control in the extracted
-package sources.
-
-More information about Git can be found in the git-core package.
-
-This package may use the Quilt patch system to manage all modifications to the
-upstream source. Changes, if any, are stored in the source package as diffs in
-debian/diff and are applied during the build. Current modifications can be
-applied to the source tree with:
-
-  $ QUILT_PATCHES=debian/patches quilt push -a
-
-More information about Quilt can be found in the quilt package.
commit 24a51b70421bf0456c6789755c11d2ca56daceef
Author: Mathias Behrle <mathiasb at m9s.biz>
Date:   Sun Jun 5 13:34:25 2011 +0200

    Releasing debian version 2.0.1-1.

diff --git a/debian/changelog b/debian/changelog
index 7dcf916..13c8578 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -1,3 +1,9 @@
+tryton-modules-sale (2.0.1-1) unstable; urgency=low
+
+  * Merging upstream version 2.0.1.
+
+ -- Mathias Behrle <mathiasb at m9s.biz>  Sun, 05 Jun 2011 13:19:09 +0200
+
 tryton-modules-sale (2.0.0-1) unstable; urgency=low
 
   * Updating to standards version 3.9.2.
commit feb697801e9ee8ff55d780c5bb026071e515acad
Author: Mathias Behrle <mathiasb at m9s.biz>
Date:   Sun Jun 5 13:14:56 2011 +0200

    Merging upstream version 2.0.1.

diff --git a/CHANGELOG b/CHANGELOG
index d93ced8..afdc791 100644
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -1,3 +1,6 @@
+Version 2.0.1 - 2011-05-29
+* Bug fixes (see mercurial logs for details)
+
 Version 2.0.0 - 2011-04-27
 * Bug fixes (see mercurial logs for details)
 
diff --git a/PKG-INFO b/PKG-INFO
index a0d5d4f..be9d0d8 100644
--- a/PKG-INFO
+++ b/PKG-INFO
@@ -1,6 +1,6 @@
 Metadata-Version: 1.0
 Name: trytond_sale
-Version: 2.0.0
+Version: 2.0.1
 Summary: Define sale order.
 Add to product sale informations.
 Define the sale price as the list price.
diff --git a/__tryton__.py b/__tryton__.py
index f69594f..af032a1 100644
--- a/__tryton__.py
+++ b/__tryton__.py
@@ -8,7 +8,7 @@
     'name_es_ES': 'Venta',
     'name_fr_FR': 'Vente',
     'name_nl_NL': 'Verkoop',
-    'version': '2.0.0',
+    'version': '2.0.1',
     'author': 'B2CK',
     'email': 'info at b2ck.com',
     'website': 'http://www.tryton.org/',
diff --git a/sale.py b/sale.py
index 87589a7..da6d2cb 100644
--- a/sale.py
+++ b/sale.py
@@ -654,7 +654,7 @@ class Sale(ModelWorkflow, ModelSQL, ModelView):
 
         :param sale: the BrowseRecord of the sale
 
-        :return: a dictionary with invoice line as key
+        :return: a dictionary with invoiced sale line id as key
             and a list of invoice lines values as value
         '''
         line_obj = self.pool.get('sale.line')
@@ -722,12 +722,14 @@ class Sale(ModelWorkflow, ModelSQL, ModelView):
         with Transaction().set_user(0, set_context=True):
             invoice_id = invoice_obj.create(vals)
 
-        for line_id in invoice_lines:
-            for vals in invoice_lines[line_id]:
+        for line in sale.lines:
+            if line.id not in invoice_lines:
+                continue
+            for vals in invoice_lines[line.id]:
                 vals['invoice'] = invoice_id
                 with Transaction().set_user(0, set_context=True):
                     invoice_line_id = invoice_line_obj.create(vals)
-                sale_line_obj.write(line_id, {
+                sale_line_obj.write(line.id, {
                     'invoice_lines': [('add', invoice_line_id)],
                     })
 
diff --git a/trytond_sale.egg-info/PKG-INFO b/trytond_sale.egg-info/PKG-INFO
index cec4101..323ff5c 100644
--- a/trytond_sale.egg-info/PKG-INFO
+++ b/trytond_sale.egg-info/PKG-INFO
@@ -1,6 +1,6 @@
 Metadata-Version: 1.0
 Name: trytond-sale
-Version: 2.0.0
+Version: 2.0.1
 Summary: Define sale order.
 Add to product sale informations.
 Define the sale price as the list price.
commit 2e86d7e8198de53f0e6d7c322e89c0c3cc3aa938
Author: Mathias Behrle <mathiasb at m9s.biz>
Date:   Tue May 24 21:40:06 2011 +0200

    Releasing debian version 2.0.0-1.

diff --git a/debian/changelog b/debian/changelog
index 85f6f48..7dcf916 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -1,3 +1,11 @@
+tryton-modules-sale (2.0.0-1) unstable; urgency=low
+
+  * Updating to standards version 3.9.2.
+  * Merging upstream version 2.0.0.
+  * Updating versioned tryton depends to 2.0.
+
+ -- Mathias Behrle <mathiasb at m9s.biz>  Tue, 24 May 2011 21:36:18 +0200
+
 tryton-modules-sale (1.8.1-1) unstable; urgency=low
 
   * Changing my email address.
commit 9d4f30fdc29dd8a7cbc46d5026a1d6502b8dd562
Author: Mathias Behrle <mathiasb at m9s.biz>
Date:   Tue May 24 21:21:34 2011 +0200

    Updating versioned tryton depends to 2.0.

diff --git a/debian/control b/debian/control
index 16f6ce6..de4fd09 100644
--- a/debian/control
+++ b/debian/control
@@ -15,11 +15,11 @@ Vcs-Git: git://git.debian-maintainers.org/git/tryton/tryton-modules-sale.git
 Package: tryton-modules-sale
 Architecture: all
 Depends:
- ${misc:Depends}, ${python:Depends}, tryton-server (>= 1.8),
- tryton-modules-account (>= 1.8), tryton-modules-account-invoice (>= 1.8),
- tryton-modules-account-product (>= 1.8), tryton-modules-company (>= 1.8),
- tryton-modules-currency (>= 1.8), tryton-modules-party (>= 1.8),
- tryton-modules-product (>= 1.8), tryton-modules-stock (>= 1.8),
+ ${misc:Depends}, ${python:Depends}, tryton-server (>= 2.0),
+ tryton-modules-account (>= 2.0), tryton-modules-account-invoice (>= 2.0),
+ tryton-modules-account-product (>= 2.0), tryton-modules-company (>= 2.0),
+ tryton-modules-currency (>= 2.0), tryton-modules-party (>= 2.0),
+ tryton-modules-product (>= 2.0), tryton-modules-stock (>= 2.0),
  python-pkg-resources
 XB-Python-Version: ${python:Versions}
 Description: Tryton Application Platform (Sale Module)
commit abc8cfab38181a94eeabe4229bd6bec5341c0a30
Author: Mathias Behrle <mathiasb at m9s.biz>
Date:   Tue May 24 19:13:01 2011 +0200

    Merging upstream version 2.0.0.

diff --git a/CHANGELOG b/CHANGELOG
index 0d7fab5..d93ced8 100644
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -1,4 +1,4 @@
-Version 1.8.1 - 2011-02-13
+Version 2.0.0 - 2011-04-27
 * Bug fixes (see mercurial logs for details)
 
 Version 1.8.0 - 2010-11-01
diff --git a/COPYRIGHT b/COPYRIGHT
index 97eff54..a9feb41 100644
--- a/COPYRIGHT
+++ b/COPYRIGHT
@@ -1,7 +1,7 @@
-Copyright (C) 2004-2008 Tiny SPRL.
 Copyright (C) 2008-2011 Cédric Krier.
 Copyright (C) 2008-2011 Bertrand Chenal.
 Copyright (C) 2008-2011 B2CK SPRL.
+Copyright (C) 2004-2008 Tiny SPRL.
 
 This program is free software: you can redistribute it and/or modify
 it under the terms of the GNU General Public License as published by
diff --git a/PKG-INFO b/PKG-INFO
index a18f676..a0d5d4f 100644
--- a/PKG-INFO
+++ b/PKG-INFO
@@ -1,6 +1,6 @@
 Metadata-Version: 1.0
 Name: trytond_sale
-Version: 1.8.1
+Version: 2.0.0
 Summary: Define sale order.
 Add to product sale informations.
 Define the sale price as the list price.
@@ -20,7 +20,7 @@ Home-page: http://www.tryton.org/
 Author: B2CK
 Author-email: info at b2ck.com
 License: GPL-3
-Download-URL: http://downloads.tryton.org/1.8/
+Download-URL: http://downloads.tryton.org/2.0/
 Description: UNKNOWN
 Platform: UNKNOWN
 Classifier: Development Status :: 5 - Production/Stable
@@ -29,11 +29,15 @@ Classifier: Intended Audience :: Developers
 Classifier: Intended Audience :: Financial and Insurance Industry
 Classifier: Intended Audience :: Legal Industry
 Classifier: License :: OSI Approved :: GNU General Public License (GPL)
+Classifier: Natural Language :: Bulgarian
+Classifier: Natural Language :: Dutch
 Classifier: Natural Language :: English
 Classifier: Natural Language :: French
 Classifier: Natural Language :: German
 Classifier: Natural Language :: Spanish
 Classifier: Operating System :: OS Independent
-Classifier: Programming Language :: Python
+Classifier: Programming Language :: Python :: 2.5
+Classifier: Programming Language :: Python :: 2.6
+Classifier: Programming Language :: Python :: 2.7
 Classifier: Topic :: Office/Business
 Classifier: Topic :: Office/Business :: Financial :: Accounting
diff --git a/__init__.py b/__init__.py
index ba016cf..1c86637 100644
--- a/__init__.py
+++ b/__init__.py
@@ -3,3 +3,4 @@
 
 from sale import *
 from configuration import *
+from invoice import *
diff --git a/__tryton__.py b/__tryton__.py
index 0723671..f69594f 100644
--- a/__tryton__.py
+++ b/__tryton__.py
@@ -2,11 +2,13 @@
 #this repository contains the full copyright notices and license terms.
 {
     'name': 'Sale',
+    'name_bg_BG': 'Продажби',
     'name_de_DE': 'Verkauf',
     'name_es_CO': 'Ventas',
     'name_es_ES': 'Venta',
     'name_fr_FR': 'Vente',
-    'version': '1.8.1',
+    'name_nl_NL': 'Verkoop',
+    'version': '2.0.0',
     'author': 'B2CK',
     'email': 'info at b2ck.com',
     'website': 'http://www.tryton.org/',
@@ -25,6 +27,21 @@ With the possibilities:
         - On Order Confirmed
         - On Invoice Paid
 ''',
+    'description_bg_BG': ''' Задаване на поръчка за продажба.
+ - Добавяне на информация за продажба на продукт.
+ - Задаване на продажна цена като ценова листа.
+
+Със следните възможности:
+    - проследяване на състоянията на фактура и доставка от поръчката за продажба
+    - задаване на начини на фактуриране:
+        - Ръчно
+        - При потвърждаване на поръчката
+        - При изпращане
+    - задаване на начина на доставка:
+        - Ръчно
+        - При потвърждаване на поръчката
+        - При плащане на фактурата
+''',
     'description_de_DE': ''' - Dient der Erstellung von Verkaufsvorgängen (Entwurf, Angebot, Auftrag).
  - Fügt den Artikeln Einkaufsinformationen hinzu.
  - Erlaubt die Definition des Einkaufspreises als Listenpreis.
@@ -84,6 +101,21 @@ Avec la possibilité:
         - Sur confirmation de la commande
         - Au paiement de la facture
 ''',
+	'description_nl_NL': '''Verkoopmodule.
+Voegt verkoopinformatie toe aan producten.
+Zet de catalogusprijs als verkoopprijs.
+
+Biedt mogelijkheden tot:
+    - het volgen van de factuur en de aflevering vanuit de offerte.
+    - het instellen van de factuurafhandeling:
+        - Handmatig
+        - Bij opdrachtbevestiging
+        - Bij aflevering
+    - het instellen van de aflevering:
+        - Handmatig
+        - Bij opdrachtbevestiging
+        - Na betaling
+''',
     'depends': [
         'company',
         'party',
@@ -103,9 +135,11 @@ Avec la possibilité:
         'party.xml',
     ],
     'translation': [
+        'bg_BG.csv',
         'de_DE.csv',
         'es_CO.csv',
         'es_ES.csv',
         'fr_FR.csv',
+        'nl_NL.csv',
     ],
 }
diff --git a/bg_BG.csv b/bg_BG.csv
new file mode 100644
index 0000000..bc46695
--- /dev/null
+++ b/bg_BG.csv
@@ -0,0 +1,245 @@
+type,name,res_id,src,value,fuzzy
+error,account.invoice,0,You can not delete invoices that come from a sale!,Не може да изтриете фактура която идва от продажба!,0
+error,account.invoice,0,You cannot reset to draft an invoice generated by a sale.,Не може да прехвърляте в проект фактура генерирана при продажба.,0
+error,sale.line,0,"It misses an ""Account Revenue"" on product ""%s""!","Не е зададена ""Сметка за приходи"" за продукт ""%s""!",0
+error,sale.line,0,"It misses an ""account Revenue"" default property!","Няма е зададено свойство по подразбиране ""Сметка за приходи""!",0
+error,sale.line,0,The customer location is required!,Местонахождението на клиента е задължително!,0
+error,sale.sale,0,Invoice and Shipment addresses must be defined for the quotation.,Адрес за фактура и за доставка трябва да са зададени при запитване,0
+error,sale.sale,0,"It misses an ""Account Receivable"" on the party ""%s""!","Липсва ""Приходна сметка"" за партньор ""%s""!",0
+error,sale.sale,0,Wrong combination of method!,Грешна комбинация от методи!,0
+error,stock.shipment.out,0,You cannot reset to draft a move generated by a sale.,Не може да прехвърляте в проект движение генерирано при продажба.,0
+field,"account.invoice,sale_exception_state",0,Exception State,Състояние на грешка,0
+field,"account.invoice,sales",0,Sales,Продажби,0
+field,"account.invoice.line,sale_lines",0,Sale Lines,Редове от продажба,0
+field,"product.template,salable",0,Salable,Продажен,0
+field,"product.template,sale_uom",0,Sale UOM,Мер. ед. на продажба,0
+field,"sale.configuration,rec_name",0,Name,Име,0
+field,"sale.configuration,sale_invoice_method",0,Sale Invoice Method,Начин на фактурине на продажба,0
+field,"sale.configuration,sale_sequence",0,Sale Reference Sequence,Последователност за отпратка на продажба,0
+field,"sale.configuration,sale_shipment_method",0,Sale Shipment Method,Начин на фактуриране на продажба,0
+field,"sale.handle.invoice.exception.ask,domain_invoices",0,Domain Invoices,Фактури на домейн,0
+field,"sale.handle.invoice.exception.ask,recreate_invoices",0,Recreate Invoices,Наново създаване на фактури,0
+field,"sale.handle.shipment.exception.ask,domain_moves",0,Domain Moves,Движение на домейн,0
+field,"sale.handle.shipment.exception.ask,recreate_moves",0,Recreate Moves,Наново създаване на движения,0
+field,"sale.line,amount",0,Amount,Сума,0
+field,"sale.line,description",0,Description,Описание,0
+field,"sale.line,invoice_lines",0,Invoice Lines,Редове от фактура,0
+field,"sale.line,move_done",0,Moves Done,Направени движения,0
+field,"sale.line,move_exception",0,Moves Exception,Грешка при движение,0
+field,"sale.line,moves",0,Moves,Движения,0
+field,"sale.line,moves_ignored",0,Ignored Moves,Игнорирани движения,0
+field,"sale.line,moves_recreated",0,Recreated Moves,Наново създаване на движения,0
+field,"sale.line,note",0,Note,Бележка,0
+field,"sale.line,product",0,Product,Продукт,0
+field,"sale.line,quantity",0,Quantity,Количество,0
+field,"sale.line,rec_name",0,Name,Име,0
+field,"sale.line,sale",0,Sale,Продажба,0
+field,"sale.line,sequence",0,Sequence,Последователност,0
+field,"sale.line,taxes",0,Taxes,Данъци,0
+field,"sale.line,type",0,Type,Вид,0
+field,"sale.line,unit",0,Unit,Единица,0
+field,"sale.line,unit_digits",0,Unit Digits,Десетични единици,0
+field,"sale.line,unit_price",0,Unit Price,Единична цена,0
+field,"sale.line-account.invoice.line,invoice_line",0,Invoice Line,Ред от фактура,0
+field,"sale.line-account.invoice.line,rec_name",0,Name,Име,0
+field,"sale.line-account.invoice.line,sale_line",0,Sale Line,Ред от продажба,0
+field,"sale.line-account.tax,line",0,Sale Line,Ред от продажба,0
+field,"sale.line-account.tax,rec_name",0,Name,Име,0
+field,"sale.line-account.tax,tax",0,Tax,Данък,0
+field,"sale.line-ignored-stock.move,move",0,Move,Движение,0
+field,"sale.line-ignored-stock.move,rec_name",0,Name,Име,0
+field,"sale.line-ignored-stock.move,sale_line",0,Sale Line,Ред от продажба,0
+field,"sale.line-recreated-stock.move,move",0,Move,Движение,0
+field,"sale.line-recreated-stock.move,rec_name",0,Name,Име,0
+field,"sale.line-recreated-stock.move,sale_line",0,Sale Line,Ред от продажба,0
+field,"sale.sale,comment",0,Comment,Коментар,0
+field,"sale.sale,company",0,Company,Фирма,0
+field,"sale.sale,currency",0,Currency,Валута,0
+field,"sale.sale,currency_digits",0,Currency Digits,Цифри за валута,0
+field,"sale.sale,description",0,Description,Описание,0
+field,"sale.sale,invoice_address",0,Invoice Address,Адрес за фактура,0
+field,"sale.sale,invoice_exception",0,Invoices Exception,Грешка при фактури,0
+field,"sale.sale,invoice_method",0,Invoice Method,Начин на фактуриране,0
+field,"sale.sale,invoice_paid",0,Invoices Paid,Платени фактури,0
+field,"sale.sale,invoice_state",0,Invoice State,Състояние на фактура,0
+field,"sale.sale,invoices",0,Invoices,Фактури,0
+field,"sale.sale,invoices_ignored",0,Ignored Invoices,Игнорирани фактури,0
+field,"sale.sale,invoices_recreated",0,Recreated Invoices,Наново създадени на фактури,0
+field,"sale.sale,lines",0,Lines,Редове,0
+field,"sale.sale,moves",0,Moves,Движения,0
+field,"sale.sale,party",0,Party,Партньор,0
+field,"sale.sale,party_lang",0,Party Language,Език на партньор,0
+field,"sale.sale,payment_term",0,Payment Term,Условие за плащане,0
+field,"sale.sale,rec_name",0,Name,Име,0
+field,"sale.sale,reference",0,Reference,Отпратка,0
+field,"sale.sale,sale_date",0,Sale Date,Дата на продажба,0
+field,"sale.sale,shipment_address",0,Shipment Address,Адрес за доставка,0
+field,"sale.sale,shipment_done",0,Shipment Done,Направена пратка,0
+field,"sale.sale,shipment_exception",0,Shipments Exception,Грешки при пратка,0
+field,"sale.sale,shipment_method",0,Shipment Method,Начин на изпращане,0
+field,"sale.sale,shipment_state",0,Shipment State,Състояние на пратка,0
+field,"sale.sale,shipments",0,Shipments,Изпращания,0
+field,"sale.sale,state",0,State,Състояние,0
+field,"sale.sale,tax_amount",0,Tax,Данък,0
+field,"sale.sale,total_amount",0,Total,Общо,0
+field,"sale.sale,untaxed_amount",0,Untaxed,Необложен с данък,0
+field,"sale.sale,warehouse",0,Warehouse,Склад,0
+field,"sale.sale-account.invoice,invoice",0,Invoice,Фактура,0
+field,"sale.sale-account.invoice,rec_name",0,Name,Име,0
+field,"sale.sale-account.invoice,sale",0,Sale,Продажба,0
+field,"sale.sale-ignored-account.invoice,invoice",0,Invoice,Фактура,0
+field,"sale.sale-ignored-account.invoice,rec_name",0,Name,Име,0
+field,"sale.sale-ignored-account.invoice,sale",0,Sale,Продажба,0
+field,"sale.sale-recreated-account.invoice,invoice",0,Invoice,Фактура,0
+field,"sale.sale-recreated-account.invoice,rec_name",0,Name,Име,0
+field,"sale.sale-recreated-account.invoice,sale",0,Sale,Продажба,0
+field,"stock.move,sale",0,Sale,Продажба,0
+field,"stock.move,sale_exception_state",0,Exception State,Състояние на грешка,0
+field,"stock.move,sale_line",0,Sale Line,Ред от продажба,0
+help,"sale.handle.invoice.exception.ask,recreate_invoices",0,The selected invoices will be recreated. The other ones will be ignored.,Избраните фактури ще бъдат наново създадени. Останалите ще бъдат игнорирани.,0
+model,"ir.action,name",act_invoice_form,Invoices,Фактури,0
+model,"ir.action,name",act_open_customer,Parties associated to Sales,Партньори свързани с продажби,0
+model,"ir.action,name",act_sale_configuration_form,Sale Configuration,Конфигурация на продажба,0
+model,"ir.action,name",act_sale_form,Sales,Продажби,0
+model,"ir.action,name",act_sale_form2,Sales,Продажби,0
+model,"ir.action,name",act_sale_form_confirmed,Confirmed Sales,Потвърдени продажби,0
+model,"ir.action,name",act_sale_form_draft,Draft Sales,Проект на продажби,0
+model,"ir.action,name",act_sale_form_new,New Sale,Нова продажба,0
+model,"ir.action,name",act_sale_form_quotation,Quotation Sales,Продажби (запитвания) ,0
+model,"ir.action,name",act_shipment_form,Shipments,Изпращания,0
+model,"ir.action,name",report_sale,Sale,Продажба,0
+model,"ir.action,name",wizard_invoice_handle_exception,Handle Invoice Exception,Обработка на грешка към фактура,0
+model,"ir.action,name",wizard_shipment_handle_exception,Handle Shipment Exception,Обработка на грешки при изпращане,0
+model,"ir.sequence,name",sequence_sale,Sale,Продажба,0
+model,"ir.sequence.type,name",sequence_type_sale,Sale,Продажба,0
+model,"ir.ui.menu,name",menu_configuration,Configuration,Конфигурация,0
+model,"ir.ui.menu,name",menu_customer,Parties associated to Sales,Партньори свързани с продажби,0
+model,"ir.ui.menu,name",menu_sale,Sale Management,Управление на продажби,0
+model,"ir.ui.menu,name",menu_sale_configuration,Sale Configuration,Конфигурация на продажба,0
+model,"ir.ui.menu,name",menu_sale_form,Sales,Продажби,0
+model,"ir.ui.menu,name",menu_sale_form_confirmed,Confirmed Sales,Потвърдени продажби,0
+model,"ir.ui.menu,name",menu_sale_form_draft,Draft Sales,Проект на продажби,0
+model,"ir.ui.menu,name",menu_sale_form_new,New Sale,Нова продажба,0
+model,"ir.ui.menu,name",menu_sale_form_quotation,Quotation Sales,Продажби (запитвания) ,0
+model,"res.group,name",group_sale,Sale,Продажба,0
+model,"res.group,name",group_sale_admin,Sale Administrator,Отговорник продажби,0
+model,"sale.configuration,name",0,Sale Configuration,Конфигурация на продажба,0
+model,"sale.handle.invoice.exception.ask,name",0,Invoice Exception Ask,Запитване за грешка в фактура,0
+model,"sale.handle.shipment.exception.ask,name",0,Shipment Exception Ask,Запитване за грешка при пратка,0
+model,"sale.line,name",0,Sale Line,Ред от продажба,0
+model,"sale.line-account.invoice.line,name",0,Sale Line - Invoice Line,Ред от продажба - Ред от фактура,0
+model,"sale.line-account.tax,name",0,Sale Line - Tax,Ред от продажба - Данък,0
+model,"sale.line-ignored-stock.move,name",0,Sale Line - Ignored Move,Ред от продажба - Игнорирано движение,0
+model,"sale.line-recreated-stock.move,name",0,Sale Line - Recreated Move,Ред от продажба - Нановосъздадено движение,0
+model,"sale.sale,name",0,Sale,Продажба,0
+model,"sale.sale-account.invoice,name",0,Sale - Invoice,Продажба - фактура,0
+model,"sale.sale-ignored-account.invoice,name",0,Sale - Ignored Invoice,Продажба - Игнорирани фактури,0
+model,"sale.sale-recreated-account.invoice,name",0,Sale - Recreated Invoice,Продажба - Наново създадена фактура,0
+model,"workflow,name",sale_workflow,Sale workflow,Работен процес на продажба,0
+model,"workflow.activity,name",sale_activity_cancel,Canceled,Отказан,0
+model,"workflow.activity,name",sale_activity_confirmed,Confirmed,Потвърден,0
+model,"workflow.activity,name",sale_activity_done,Done,Приключен,0
+model,"workflow.activity,name",sale_activity_draft,Draft,Проект,0
+model,"workflow.activity,name",sale_activity_invoice_method,Invoice Method,Начин на фактуриране,0
+model,"workflow.activity,name",sale_activity_invoice_method_done,Invoice Method Done,Направен начин на фактуриране,0
+model,"workflow.activity,name",sale_activity_invoice_sale_done,Invoice Done,Направени фактури,0
+model,"workflow.activity,name",sale_activity_invoice_sale_exception,Invoice Exception,Грешка при фактура,0
+model,"workflow.activity,name",sale_activity_invoice_shipment,Invoice Shipment,Фактура за изпращане,0
+model,"workflow.activity,name",sale_activity_invoice_shipment_done,Invoice Shipment Done,Направено фактуриране на пратка,0
+model,"workflow.activity,name",sale_activity_invoice_shipment_exception,Invoice Shipment Exception,Грешка при фактуриране на пратка,0
+model,"workflow.activity,name",sale_activity_invoice_shipment_method,Invoice Shipment Method,Начин на фактуриране на пратка,0
+model,"workflow.activity,name",sale_activity_invoice_shipment_method_done,Invoice Shipment Method Done,Направено фактуриране на начина на изпращане,0
+model,"workflow.activity,name",sale_activity_quotation,Quotation,Запитване,0
+model,"workflow.activity,name",sale_activity_shipment,Shipment,Пратка,0
+model,"workflow.activity,name",sale_activity_shipment_exception,Shipment Exception,Грешка при пратка,0
+model,"workflow.activity,name",sale_activity_shipment_invoice,Shipment Invoice,Пратка с грешка,0
+model,"workflow.activity,name",sale_activity_shipment_invoice_done,Shipment Invoice Done,Направено фактуриране на пратка,0
+model,"workflow.activity,name",sale_activity_shipment_invoice_exception,Shipment Invoice Exception,Грешка при фактуриране на пратка,0
+model,"workflow.activity,name",sale_activity_shipment_invoice_method,Shipment Invoice Method,Начин на фактуриране на пратка,0
+model,"workflow.activity,name",sale_activity_shipment_invoice_method_done,Shipment Invoice Method Done,Направен начин на фактуриране на пратка,0
+model,"workflow.activity,name",sale_activity_shipment_method,Shipment Method,Начин на изпращане,0
+model,"workflow.activity,name",sale_activity_shipment_method_done,Shipment Method Done,Направен начин на изпращане,0
+model,"workflow.activity,name",sale_activity_waiting_invoice_sale,Waiting Invoice,Очакващи фактура,0
+model,"workflow.activity,name",sale_activity_waiting_invoice_shipment,Waiting Invoice Shipment,Изчакващи фактури за пратки,0
+model,"workflow.activity,name",sale_activity_waiting_shipment,Waiting Shipment,Очаква изпращане,0
+model,"workflow.activity,name",sale_activity_waiting_shipment_invoice,Waiting Shipment Invoice,Изчакващи фактури за пратки,0
+odt,sale.sale,0,Amount,Сума,0
+odt,sale.sale,0,Date:,Дата:,0
+odt,sale.sale,0,Description,Описание,0
+odt,sale.sale,0,Description:,Описание:,0
+odt,sale.sale,0,Draft Sale Order,Проект на поръчка за продажба,0
+odt,sale.sale,0,E-Mail:,E-Mail:,0
+odt,sale.sale,0,Phone:,Телефон:,0
+odt,sale.sale,0,Quantity,Количество,0
+odt,sale.sale,0,Quotation N°:,Запитване N°:,0
+odt,sale.sale,0,Sale Order N°:,Поръчка за продажба N°:,0
+odt,sale.sale,0,Taxes,Данъци,0
+odt,sale.sale,0,Taxes:,Данъци:,0
+odt,sale.sale,0,Total (excl. taxes):,Общо (без данъци):,0
+odt,sale.sale,0,Total:,Общо:,0
+odt,sale.sale,0,Unit Price,Единична цена,0
+odt,sale.sale,0,VAT:,ДДС:,0
+selection,"account.invoice,sale_exception_state",0,,,0
+selection,"account.invoice,sale_exception_state",0,Ignored,Игнорирано,0
+selection,"account.invoice,sale_exception_state",0,Recreated,Създаден наново,0
+selection,"sale.configuration,sale_invoice_method",0,Manual,Ръчно,0
+selection,"sale.configuration,sale_invoice_method",0,On Order Confirmed,При потвърждаване на поръчка,0
+selection,"sale.configuration,sale_invoice_method",0,On Shipment Sent,При изпращане на пратка,0
+selection,"sale.configuration,sale_shipment_method",0,Manual,Ръчно,0
+selection,"sale.configuration,sale_shipment_method",0,On Invoice Paid,При плащане на фактура,0
+selection,"sale.configuration,sale_shipment_method",0,On Order Confirmed,При потвърждаване на поръчка,0
+selection,"sale.line,type",0,Comment,Коментар,0
+selection,"sale.line,type",0,Line,Ред,0
+selection,"sale.line,type",0,Subtotal,Междинна сума,0
+selection,"sale.line,type",0,Title,Заглавие,0
+selection,"sale.sale,invoice_method",0,Manual,Ръчно,0
+selection,"sale.sale,invoice_method",0,On Order Confirmed,При потвърждаване на поръчка,0
+selection,"sale.sale,invoice_method",0,On Shipment Sent,При изпращане на пратка,0
+selection,"sale.sale,invoice_state",0,Exception,Грешка,0
+selection,"sale.sale,invoice_state",0,None,Няма,0
+selection,"sale.sale,invoice_state",0,Paid,Платен,0
+selection,"sale.sale,invoice_state",0,Waiting,Изчакващ,0
+selection,"sale.sale,shipment_method",0,Manual,Ръчно,0
+selection,"sale.sale,shipment_method",0,On Invoice Paid,При плащане на фактура,0
+selection,"sale.sale,shipment_method",0,On Order Confirmed,При потвърждаване на поръчка,0
+selection,"sale.sale,shipment_state",0,Exception,Грешка,0
+selection,"sale.sale,shipment_state",0,None,Няма,0
+selection,"sale.sale,shipment_state",0,Sent,Изпратен,0
+selection,"sale.sale,shipment_state",0,Waiting,Изчакващ,0
+selection,"sale.sale,state",0,Canceled,Отказан,0
+selection,"sale.sale,state",0,Confirmed,Потвърден,0
+selection,"sale.sale,state",0,Done,Приключен,0
+selection,"sale.sale,state",0,Draft,Проект,0
+selection,"sale.sale,state",0,Quotation,Запитване,0
+selection,"stock.move,sale_exception_state",0,,,0
+selection,"stock.move,sale_exception_state",0,Ignored,Игнорирано,0
+selection,"stock.move,sale_exception_state",0,Recreated,Създаден наново,0
+view,product.template,0,Customers,Клиенти,0
+view,sale.configuration,0,Sale Configuration,Конфигурация на продажба,0
+view,sale.handle.invoice.exception.ask,0,Choose invoices to recreate,Избор на фактури за ново създаване,0
+view,sale.handle.invoice.exception.ask,0,Handle Invoice Exception,Обработка на грешка към фактура,0
+view,sale.handle.shipment.exception.ask,0,Choose move to recreate,Избор на движение за ново създаване,0
+view,sale.handle.shipment.exception.ask,0,Handle shipment Exception,Обработване на грешка при изпращане,0
+view,sale.handle.shipment.exception.ask,0,Recreate Moves,Наново създаване на движения,0
+view,sale.line,0,General,Основен,0
+view,sale.line,0,Notes,Бележки,0
+view,sale.line,0,Products,Продукти,0
+view,sale.line,0,Sale Line,Ред от продажба,0
+view,sale.line,0,Sale Lines,Редове от продажба,0
+view,sale.sale,0,Cancel,Отказ,0
+view,sale.sale,0,Confirm,Потвърждаване,0
+view,sale.sale,0,Draft,Проект,0
+view,sale.sale,0,Handle Invoice Exception,Обработка на грешка към фактура,0
+view,sale.sale,0,Handle Shipment Exception,Обработване на грешка при изпращане,0
+view,sale.sale,0,Invoices,Фактури,0
+view,sale.sale,0,Lines,Редове,0
+view,sale.sale,0,Moves,Движения,0
+view,sale.sale,0,Other Info,Друга информация,0
+view,sale.sale,0,Quotation,Запитване,0
+view,sale.sale,0,Sale,Продажба,0
+view,sale.sale,0,Sales,Продажби,0
+view,sale.sale,0,Shipments,Изпращания,0
+wizard_button,"sale.handle.invoice.exception,init,end",0,Cancel,Отказ,0
+wizard_button,"sale.handle.invoice.exception,init,ok",0,Ok,Добре,0
+wizard_button,"sale.handle.shipment.exception,init,end",0,Cancel,Отказ,0
+wizard_button,"sale.handle.shipment.exception,init,ok",0,Ok,Добре,0
diff --git a/configuration.py b/configuration.py
index 1e6823a..c1dadce 100644
--- a/configuration.py
+++ b/configuration.py
@@ -1,7 +1,7 @@
 #This file is part of Tryton.  The COPYRIGHT file at the top level of
 #this repository contains the full copyright notices and license terms.
 from trytond.model import ModelView, ModelSQL, ModelSingleton, fields
-from trytond.pyson import Eval
+from trytond.pyson import Eval, Bool
 
 
 class Configuration(ModelSingleton, ModelSQL, ModelView):
@@ -14,5 +14,19 @@ class Configuration(ModelSingleton, ModelSQL, ModelView):
             ('company', 'in', [Eval('company'), False]),
             ('code', '=', 'sale.sale'),
         ], required=True))
+    sale_invoice_method = fields.Property(fields.Selection([
+        ('manual', 'Manual'),
+        ('order', 'On Order Confirmed'),
+        ('shipment', 'On Shipment Sent')
+    ], 'Sale Invoice Method', states={
+        'required': Bool(Eval('company')),
+    }))
+    sale_shipment_method = fields.Property(fields.Selection([
+        ('manual', 'Manual'),
+        ('order', 'On Order Confirmed'),
+        ('invoice', 'On Invoice Paid'),
+    ], 'Sale Shipment Method', states={
+        'required': Bool(Eval('company')),
+    }))
 
 Configuration()
diff --git a/configuration.xml b/configuration.xml
index 18c0e08..964c74b 100644
--- a/configuration.xml
+++ b/configuration.xml
@@ -15,6 +15,11 @@ this repository contains the full copyright notices and license terms. -->
                 <form string="Sale Configuration">
                     <label name="sale_sequence"/>
                     <field name="sale_sequence"/>
+                    <newline />
+                    <label name="sale_invoice_method" />
+                    <field name="sale_invoice_method" />
+                    <label name="sale_shipment_method" />
+                    <field name="sale_shipment_method" />
                 </form>
                 ]]>
             </field>
@@ -22,7 +27,6 @@ this repository contains the full copyright notices and license terms. -->
         <record model="ir.action.act_window" id="act_sale_configuration_form">
             <field name="name">Sale Configuration</field>
             <field name="res_model">sale.configuration</field>
-            <field name="view_type">form</field>
         </record>
         <record model="ir.action.act_window.view"
             id="act_sale_configuration_view1">
@@ -40,5 +44,17 @@ this repository contains the full copyright notices and license terms. -->
                 search="[('model.model', '=', 'sale.configuration'), ('name', '=', 'sale_sequence')]"/>
             <field name="value" eval="'ir.sequence,' + str(ref('sequence_sale'))"/>
         </record>
+        <record model="ir.property" id="property_sale_invoice_method">
+            <field name="name">sale_invoice_method</field>
+            <field name="field"
+                search="[('model.model', '=', 'sale.configuration'), ('name', '=', 'sale_invoice_method')]" />
+            <field name="value">,order</field>
+        </record>
+        <record model="ir.property" id="property_sale_shipment_method">
+            <field name="name">sale_shipment_method</field>
+            <field name="field"
+                search="[('model.model', '=', 'sale.configuration'), ('name', '=', 'sale_shipment_method')]" />
+            <field name="value">,order</field>
+        </record>
     </data>
 </tryton>
diff --git a/de_DE.csv b/de_DE.csv
index 09e24e3..b5c4c73 100644
--- a/de_DE.csv
+++ b/de_DE.csv
@@ -2,17 +2,21 @@ type,name,res_id,src,value,fuzzy
 error,account.invoice,0,You can not delete invoices that come from a sale!,Durch einen Verkauf generierte Rechnungen können nicht gelöscht werden!,0
 error,account.invoice,0,You cannot reset to draft an invoice generated by a sale.,Eine durch einen Verkauf generierte Rechnung kann nicht auf Entwurf zurückgesetzt werden.,0
 error,sale.line,0,"It misses an ""Account Revenue"" on product ""%s""!","Es ist kein Ertragskonto für Artikel ""%s"" definiert!",0
-error,sale.line,0,"It misses an ""account Revenue"" default property!",Es ist keine Standardeigenschaft für das Ertragsskonto definiert!,0
+error,sale.line,0,"It misses an ""account Revenue"" default property!",Es ist keine Standardeigenschaft für das Ertragskonto definiert!,0
 error,sale.line,0,The customer location is required!,Der Lagerort des Kunden muss eingegeben werden!,0
 error,sale.sale,0,Invoice and Shipment addresses must be defined for the quotation.,Rechnungs- und Lieferadresse müssen für das Angebot eingetragen sein!,0
 error,sale.sale,0,"It misses an ""Account Receivable"" on the party ""%s""!","Es ist kein Forderungskonto für Partei ""%s"" definiert!",0
 error,sale.sale,0,Wrong combination of method!,Ungültige Kombination von Methoden!,0
 error,stock.shipment.out,0,You cannot reset to draft a move generated by a sale.,Eine durch einen Verkauf generierte Bewegung kann nicht auf Entwurf zurückgesetzt werden.,0
 field,"account.invoice,sale_exception_state",0,Exception State,Vorbehalt Status,0
+field,"account.invoice,sales",0,Sales,Verkäufe,0
+field,"account.invoice.line,sale_lines",0,Sale Lines,Positionen Verkauf,0
 field,"product.template,salable",0,Salable,Verkäuflich,0
 field,"product.template,sale_uom",0,Sale UOM,Einheit Verkauf,0
 field,"sale.configuration,rec_name",0,Name,Name,0
+field,"sale.configuration,sale_invoice_method",0,Sale Invoice Method,Rechnungsstellung Verkauf,0
 field,"sale.configuration,sale_sequence",0,Sale Reference Sequence,Nummernkreis Verkauf,0
+field,"sale.configuration,sale_shipment_method",0,Sale Shipment Method,Liefermethode Verkauf,0
 field,"sale.handle.invoice.exception.ask,domain_invoices",0,Domain Invoices,Wertebereich Rechnungen (Domain),0
 field,"sale.handle.invoice.exception.ask,recreate_invoices",0,Recreate Invoices,Rechnungen nachbilden,0
 field,"sale.handle.shipment.exception.ask,domain_moves",0,Domain Moves,Wertebereich Bewegungen (Domain),0
@@ -98,10 +102,10 @@ model,"ir.action,name",act_open_customer,Parties associated to Sales,Parteien: V
 model,"ir.action,name",act_sale_configuration_form,Sale Configuration,Einstellungen Verkauf,0
 model,"ir.action,name",act_sale_form,Sales,Verkäufe,0
 model,"ir.action,name",act_sale_form2,Sales,Verkäufe,0
-model,"ir.action,name",act_sale_form_confirmed,Confirmed Sales,Aufträge (Verkäufe),0
-model,"ir.action,name",act_sale_form_draft,Draft Sales,Entwürfe (Verkäufe),0
+model,"ir.action,name",act_sale_form_confirmed,Confirmed Sales,Aufträge Verkäufe,0
+model,"ir.action,name",act_sale_form_draft,Draft Sales,Entwürfe Verkäufe,0
 model,"ir.action,name",act_sale_form_new,New Sale,Neuer Verkauf,0
-model,"ir.action,name",act_sale_form_quotation,Quotation Sales,Angebote (Verkäufe),0
+model,"ir.action,name",act_sale_form_quotation,Quotation Sales,Angebote Verkäufe,0
 model,"ir.action,name",act_shipment_form,Shipments,Lieferposten,0
 model,"ir.action,name",report_sale,Sale,Verkauf,0
 model,"ir.action,name",wizard_invoice_handle_exception,Handle Invoice Exception,Rechnungsvorbehalt bearbeiten,0
@@ -155,10 +159,10 @@ model,"workflow.activity,name",sale_activity_shipment_invoice_method,Shipment In
 model,"workflow.activity,name",sale_activity_shipment_invoice_method_done,Shipment Invoice Method Done,Lieferposten Rechnungsmethode erledigt,0
 model,"workflow.activity,name",sale_activity_shipment_method,Shipment Method,Liefermethode,0
 model,"workflow.activity,name",sale_activity_shipment_method_done,Shipment Method Done,Liefermethode erledigt,0
-model,"workflow.activity,name",sale_activity_waiting_invoice_sale,Waiting Invoice,Rechnung wartend,0
+model,"workflow.activity,name",sale_activity_waiting_invoice_sale,Waiting Invoice,Rechnung Wartend,0
 model,"workflow.activity,name",sale_activity_waiting_invoice_shipment,Waiting Invoice Shipment,Rechnung Lieferposten Wartend,0
-model,"workflow.activity,name",sale_activity_waiting_shipment,Waiting Shipment,Lieferposten wartend,0
-model,"workflow.activity,name",sale_activity_waiting_shipment_invoice,Waiting Shipment Invoice,Lieferposten Rechnung wartend,0
+model,"workflow.activity,name",sale_activity_waiting_shipment,Waiting Shipment,Lieferposten Wartend,0
+model,"workflow.activity,name",sale_activity_waiting_shipment_invoice,Waiting Shipment Invoice,Lieferposten Rechnung Wartend,0
 odt,sale.sale,0,Amount,Betrag,0
 odt,sale.sale,0,Date:,Datum:,0
 odt,sale.sale,0,Description,Bezeichnung,0
@@ -179,6 +183,12 @@ odt,sale.sale,0,VAT:,USt:,0
 selection,"account.invoice,sale_exception_state",0,,,0
 selection,"account.invoice,sale_exception_state",0,Ignored,Ignoriert,0
 selection,"account.invoice,sale_exception_state",0,Recreated,Nachgebildet,0
+selection,"sale.configuration,sale_invoice_method",0,Manual,Manuell,0
+selection,"sale.configuration,sale_invoice_method",0,On Order Confirmed,Bei Beauftragung,0
+selection,"sale.configuration,sale_invoice_method",0,On Shipment Sent,Bei Versand,0
+selection,"sale.configuration,sale_shipment_method",0,Manual,Manuell,0
+selection,"sale.configuration,sale_shipment_method",0,On Invoice Paid,Bei Bezahlung,0
+selection,"sale.configuration,sale_shipment_method",0,On Order Confirmed,Bei Beauftragung,0
 selection,"sale.line,type",0,Comment,Kommentar,0
 selection,"sale.line,type",0,Line,Position,0
 selection,"sale.line,type",0,Subtotal,Zwischensumme,0
diff --git a/fr_FR.csv b/fr_FR.csv
index 13830da..409ee5c 100644
--- a/fr_FR.csv
+++ b/fr_FR.csv
@@ -9,10 +9,14 @@ error,sale.sale,0,"It misses an ""Account Receivable"" on the party ""%s""!","Il
 error,sale.sale,0,Wrong combination of method!,Mauvaise combinaison de méthodes !,0
 error,stock.shipment.out,0,You cannot reset to draft a move generated by a sale.,Vous ne pouvez pas réinitialiser un mouvement généré par une vente.,0
 field,"account.invoice,sale_exception_state",0,Exception State,État d'exception,0
+field,"account.invoice,sales",0,Sales,Ventes,1
+field,"account.invoice.line,sale_lines",0,Sale Lines,Lignes de vente,1
 field,"product.template,salable",0,Salable,Vendable,0
 field,"product.template,sale_uom",0,Sale UOM,UDM de vente,0
 field,"sale.configuration,rec_name",0,Name,Nom,0
+field,"sale.configuration,sale_invoice_method",0,Sale Invoice Method,Facturation,0
 field,"sale.configuration,sale_sequence",0,Sale Reference Sequence,Séquence de référence de vente,0
+field,"sale.configuration,sale_shipment_method",0,Sale Shipment Method,Expédition,0
 field,"sale.handle.invoice.exception.ask,domain_invoices",0,Domain Invoices,Domaine des factures,0
 field,"sale.handle.invoice.exception.ask,recreate_invoices",0,Recreate Invoices,Recréer les factures,0
 field,"sale.handle.shipment.exception.ask,domain_moves",0,Domain Moves,Domaine des mouvements,0
@@ -179,6 +183,12 @@ odt,sale.sale,0,VAT:,TVA :,0
 selection,"account.invoice,sale_exception_state",0,,,0
 selection,"account.invoice,sale_exception_state",0,Ignored,Ignoré,0
 selection,"account.invoice,sale_exception_state",0,Recreated,Recréé,0
+selection,"sale.configuration,sale_invoice_method",0,Manual,Manuel,1
+selection,"sale.configuration,sale_invoice_method",0,On Order Confirmed,À la confirmation de la commande,1
+selection,"sale.configuration,sale_invoice_method",0,On Shipment Sent,À la livraison,1
+selection,"sale.configuration,sale_shipment_method",0,Manual,Manuel,1
+selection,"sale.configuration,sale_shipment_method",0,On Invoice Paid,Au paiement de la facture,1
+selection,"sale.configuration,sale_shipment_method",0,On Order Confirmed,À la confirmation de la commande,1
 selection,"sale.line,type",0,Comment,Commentaire,0
 selection,"sale.line,type",0,Line,Ligne,0
 selection,"sale.line,type",0,Subtotal,Sous-total,0
diff --git a/invoice.py b/invoice.py
new file mode 100644
index 0000000..447bcd0
--- /dev/null
+++ b/invoice.py
@@ -0,0 +1,21 @@
+#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 trytond.model import ModelView, ModelSQL, fields
+
+
+class Invoice(ModelSQL, ModelView):
+    _name = 'account.invoice'
+
+    sales = fields.Many2Many('sale.sale-account.invoice',
+            'invoice', 'sale', 'Sales', readonly=True)
+
+Invoice()
+
+
+class InvoiceLine(ModelSQL, ModelView):
+    _name = 'account.invoice.line'
+
+    sale_lines = fields.Many2Many('sale.line-account.invoice.line',
+            'invoice_line', 'sale_line', 'Sale Lines', readonly=True)
+
+InvoiceLine()
diff --git a/nl_NL.csv b/nl_NL.csv
new file mode 100644
index 0000000..1d065ac
--- /dev/null
+++ b/nl_NL.csv
@@ -0,0 +1,219 @@
+type,name,res_id,src,value,fuzzy
+error,account.invoice,0,You can not delete invoices that come from a sale!,U kunt geen facturen verwijderen die uit verkoop voortkomen!,0
+error,account.invoice,0,You cannot reset to draft an invoice generated by a sale.,U kunt een factuur die uit verkoop voortkomt niet terug zetten naar concept.,0
+error,sale.line,0,"It misses an ""Account Revenue"" on product ""%s""!","Grootboekrekening ""Opbrengst"" ontbreekt voor product ""%s""!",0
+error,sale.line,0,"It misses an ""account Revenue"" default property!","De standaard grootboekrekening ""Opbrengst"" ontbreekt!",0
+error,sale.line,0,The customer location is required!,De afleverlocatie is vereist!,0
+error,sale.sale,0,Invoice and Shipment addresses must be defined for the quotation.,Factuur- en afleveradres moeten gedefinieerd zijn voor de offerte.,0
+error,sale.sale,0,"It misses an ""Account Receivable"" on the party ""%s""!","Grootboekrekening ""Debiteuren"" ontbreekt voor relatie ""%s""!",0
+error,sale.sale,0,Wrong combination of method!,Verkeerde combinatie van afhandeling!,0
+error,stock.shipment.out,0,You cannot reset to draft a move generated by a sale.,U kunt een boeking die uit verkoop voortkomt niet terug zetten naar concept.,0
+field,"account.invoice,sale_exception_state",0,Exception State,Uitzonderingstoestand,0
+field,"product.template,salable",0,Salable,Verkoopbaar,0
+field,"product.template,sale_uom",0,Sale UOM,Maateenheid verkoop,0
+field,"sale.configuration,rec_name",0,Name,Naam,0
+field,"sale.configuration,sale_sequence",0,Sale Reference Sequence,Verkoopkenmerkreeks,0
+field,"sale.handle.invoice.exception.ask,domain_invoices",0,Domain Invoices,Domein facturen,0
+field,"sale.handle.invoice.exception.ask,recreate_invoices",0,Recreate Invoices,Facturen opnieuw aanmaken,0
+field,"sale.handle.shipment.exception.ask,domain_moves",0,Domain Moves,Domein boekingen,0
+field,"sale.handle.shipment.exception.ask,recreate_moves",0,Recreate Moves,Boekingen opnieuw aanmaken,0
+field,"sale.line,amount",0,Amount,Bedrag,0
+field,"sale.line,description",0,Description,Specificatie,0
+field,"sale.line,invoice_lines",0,Invoice Lines,Factuurregels,0
+field,"sale.line,move_done",0,Moves Done,Boekingen klaar,0
+field,"sale.line,move_exception",0,Moves Exception,Boekingen uitzondering,0
+field,"sale.line,moves",0,Moves,Boekingen,0
+field,"sale.line,moves_ignored",0,Ignored Moves,Genegeerde boekingen,0
+field,"sale.line,moves_recreated",0,Recreated Moves,Opnieuw aangemaakte boekingen,0
+field,"sale.line,note",0,Note,Aantekening,0
+field,"sale.line,product",0,Product,Product,0
+field,"sale.line,quantity",0,Quantity,Hoeveelheid,0
+field,"sale.line,rec_name",0,Name,Naam,0
+field,"sale.line,sale",0,Sale,Verkoop,0
+field,"sale.line,sequence",0,Sequence,Reeks,0
+field,"sale.line,taxes",0,Taxes,Belastingen,0
+field,"sale.line,type",0,Type,Type,0
+field,"sale.line,unit",0,Unit,Eenheid,0
+field,"sale.line,unit_digits",0,Unit Digits,Decimalen eenheid,0
+field,"sale.line,unit_price",0,Unit Price,Eenheidsprijs,0
+field,"sale.line-account.invoice.line,invoice_line",0,Invoice Line,Factuurregel,0
+field,"sale.line-account.invoice.line,rec_name",0,Name,Naam,0
+field,"sale.line-account.invoice.line,sale_line",0,Sale Line,Offerteregel,0
+field,"sale.line-account.tax,line",0,Sale Line,Offerteregel,0
+field,"sale.line-account.tax,rec_name",0,Name,Naam,0
+field,"sale.line-account.tax,tax",0,Tax,Belasting,0
+field,"sale.line-ignored-stock.move,move",0,Move,Boeking,0
+field,"sale.line-ignored-stock.move,rec_name",0,Name,Naam,0
+field,"sale.line-ignored-stock.move,sale_line",0,Sale Line,Offerteregel,0
+field,"sale.line-recreated-stock.move,move",0,Move,Boeking,0
+field,"sale.line-recreated-stock.move,rec_name",0,Name,Naam,0
+field,"sale.line-recreated-stock.move,sale_line",0,Sale Line,Offerteregel,0
+field,"sale.sale,comment",0,Comment,Opmerking,0
+field,"sale.sale,company",0,Company,Bedrijf,0
+field,"sale.sale,currency",0,Currency,Valuta,0
+field,"sale.sale,currency_digits",0,Currency Digits,Valuta decimalen,0
+field,"sale.sale,description",0,Description,Specificatie,0
+field,"sale.sale,invoice_address",0,Invoice Address,Factuuradres,0
+field,"sale.sale,invoice_exception",0,Invoices Exception,Facturen uitzondering,0
+field,"sale.sale,invoice_method",0,Invoice Method,Factuur afhandeling,0
+field,"sale.sale,invoice_paid",0,Invoices Paid,Facturen betaald,0
+field,"sale.sale,invoice_state",0,Invoice State,Factuur status,0
+field,"sale.sale,invoices",0,Invoices,Facturen,0
+field,"sale.sale,invoices_ignored",0,Ignored Invoices,Genegeerde facturen,0
+field,"sale.sale,invoices_recreated",0,Recreated Invoices,Opnieuw aangemaakte facturen,0
+field,"sale.sale,lines",0,Lines,Regels,0
+field,"sale.sale,moves",0,Moves,Boekingen,0
+field,"sale.sale,party",0,Party,Relatie,0
+field,"sale.sale,party_lang",0,Party Language,Taal relatie,0
+field,"sale.sale,payment_term",0,Payment Term,Betalingstermijn,0
+field,"sale.sale,rec_name",0,Name,Naam,0
+field,"sale.sale,reference",0,Reference,Referentie,0
+field,"sale.sale,sale_date",0,Sale Date,Verkoopdatum,0
+field,"sale.sale,shipment_address",0,Shipment Address,Afleveradres,0
+field,"sale.sale,shipment_done",0,Shipment Done,Afgeleverd,0
+field,"sale.sale,shipment_exception",0,Shipments Exception,Leveringen uitzonderingen,0
+field,"sale.sale,shipment_method",0,Shipment Method,Levering afhandeling,0
+field,"sale.sale,shipment_state",0,Shipment State,Levering status,0
+field,"sale.sale,shipments",0,Shipments,Leveringen,0
+field,"sale.sale,state",0,State,Status,0
+field,"sale.sale,tax_amount",0,Tax,Belasting,0
+field,"sale.sale,total_amount",0,Total,Totaal,0
+field,"sale.sale,untaxed_amount",0,Untaxed,Onbelast,0
+field,"sale.sale,warehouse",0,Warehouse,Magazijn,0
+field,"sale.sale-account.invoice,invoice",0,Invoice,Factuur,0
+field,"sale.sale-account.invoice,rec_name",0,Name,Naam,0
+field,"sale.sale-account.invoice,sale",0,Sale,Verkoop,0
+field,"sale.sale-ignored-account.invoice,invoice",0,Invoice,Factuur,0
+field,"sale.sale-ignored-account.invoice,rec_name",0,Name,Naam,0
+field,"sale.sale-ignored-account.invoice,sale",0,Sale,Verkoop,0
+field,"sale.sale-recreated-account.invoice,invoice",0,Invoice,Factuur,0
+field,"sale.sale-recreated-account.invoice,rec_name",0,Name,Naam,0
+field,"sale.sale-recreated-account.invoice,sale",0,Sale,Verkoop,0
+field,"stock.move,sale",0,Sale,Verkoop,0
+field,"stock.move,sale_exception_state",0,Exception State,Uitzonderingstoestand,0
+field,"stock.move,sale_line",0,Sale Line,Offerteregel,0
+help,"sale.handle.invoice.exception.ask,recreate_invoices",0,The selected invoices will be recreated. The other ones will be ignored.,De geselecteerde facturen worden opnieuw aangemaakt. De rest wordt genegeerd.,0
+model,"ir.action,name",act_invoice_form,Invoices,Facturen,0
+model,"ir.action,name",act_open_customer,Parties associated to Sales,Klanten,0
+model,"ir.action,name",act_sale_configuration_form,Sale Configuration,Verkoop instellingen,0
+model,"ir.action,name",act_sale_form,Sales,Verkoop,0
+model,"ir.action,name",act_sale_form2,Sales,Verkoop,0
+model,"ir.action,name",act_sale_form_confirmed,Confirmed Sales,Bevestigde offertes,0
+model,"ir.action,name",act_sale_form_draft,Draft Sales,Concept offertes,0
+model,"ir.action,name",act_sale_form_new,New Sale,Nieuwe verkoop,0
+model,"ir.action,name",act_sale_form_quotation,Quotation Sales,Uitstaande offertes,0
+model,"ir.action,name",act_shipment_form,Shipments,Leveringen,0
+model,"ir.action,name",report_sale,Sale,Verkoop,0
+model,"ir.action,name",wizard_invoice_handle_exception,Handle Invoice Exception,Factuuruitzondering afhandelen,0
+model,"ir.action,name",wizard_shipment_handle_exception,Handle Shipment Exception,Zendinguitzondering afhandelen,0
+model,"ir.sequence,name",sequence_sale,Sale,Verkoop,0
+model,"ir.sequence.type,name",sequence_type_sale,Sale,Verkoop,0
+model,"ir.ui.menu,name",menu_configuration,Configuration,Instellingen,0
+model,"ir.ui.menu,name",menu_customer,Parties associated to Sales,Klanten,0
+model,"ir.ui.menu,name",menu_sale,Sale Management,Verkoopbeheer,0
+model,"ir.ui.menu,name",menu_sale_configuration,Sale Configuration,Verkoop instellingen,0
+model,"ir.ui.menu,name",menu_sale_form,Sales,Verkoop,0
+model,"ir.ui.menu,name",menu_sale_form_confirmed,Confirmed Sales,Bevestigde offertes,0
+model,"ir.ui.menu,name",menu_sale_form_draft,Draft Sales,Concept offertes,0
+model,"ir.ui.menu,name",menu_sale_form_new,New Sale,Nieuwe offerte,0
+model,"ir.ui.menu,name",menu_sale_form_quotation,Quotation Sales,Uitstaande offertes,0
+model,"res.group,name",group_sale,Sale,Verkoop,0
+model,"res.group,name",group_sale_admin,Sale Administrator,Verkoop beheerder,0
+model,"sale.configuration,name",0,Sale Configuration,Verkoop instellingen,0
+model,"sale.handle.invoice.exception.ask,name",0,Invoice Exception Ask,Factuur uitzondering vragen,0
+model,"sale.handle.shipment.exception.ask,name",0,Shipment Exception Ask,Afleveren uitzondering vragen,0
+model,"sale.line,name",0,Sale Line,Offerteregel,0
+model,"sale.line-account.invoice.line,name",0,Sale Line - Invoice Line,Offerteregel - factuurregel,0
+model,"sale.line-account.tax,name",0,Sale Line - Tax,Offerteregel - belasting,0
+model,"sale.line-ignored-stock.move,name",0,Sale Line - Ignored Move,Offerteregel - genegeerde boeking,0
+model,"sale.line-recreated-stock.move,name",0,Sale Line - Recreated Move,Offerteregel - boeking opnieuw aanmaken,0
+model,"sale.sale,name",0,Sale,Verkoop,0
+model,"sale.sale-account.invoice,name",0,Sale - Invoice,Verkoop - factuur,0
+model,"sale.sale-ignored-account.invoice,name",0,Sale - Ignored Invoice,Verkoop - genereerde factuur,0
+model,"sale.sale-recreated-account.invoice,name",0,Sale - Recreated Invoice,Verkoop - factuur opnieuw aanmaken,0
+model,"workflow,name",sale_workflow,Sale workflow,Sjaboon verkoop,0
+model,"workflow.activity,name",sale_activity_cancel,Canceled,Geannuleerd,0
+model,"workflow.activity,name",sale_activity_confirmed,Confirmed,Bevestigd,0
+model,"workflow.activity,name",sale_activity_done,Done,Klaar,0
+model,"workflow.activity,name",sale_activity_draft,Draft,Concept,0
+model,"workflow.activity,name",sale_activity_invoice_method,Invoice Method,Factuur afhandeling,0
+model,"workflow.activity,name",sale_activity_invoice_method_done,Invoice Method Done,Factuur afhandeling klaar,0
+model,"workflow.activity,name",sale_activity_invoice_sale_done,Invoice Done,Factuur klaar,0
+model,"workflow.activity,name",sale_activity_invoice_sale_exception,Invoice Exception,Factuur uitzondering,0
+model,"workflow.activity,name",sale_activity_invoice_shipment,Invoice Shipment,Factuur zending,0
+model,"workflow.activity,name",sale_activity_invoice_shipment_done,Invoice Shipment Done,Factuur zending klaar,0
+model,"workflow.activity,name",sale_activity_invoice_shipment_exception,Invoice Shipment Exception,Factuur zending uitzondering,0
+model,"workflow.activity,name",sale_activity_invoice_shipment_method,Invoice Shipment Method,Factuur zending afhandeling,0
+model,"workflow.activity,name",sale_activity_invoice_shipment_method_done,Invoice Shipment Method Done,Factuur zending afhandeling klaar,0
+model,"workflow.activity,name",sale_activity_quotation,Quotation,Offerte,0
+model,"workflow.activity,name",sale_activity_shipment,Shipment,Afleveren,0
+model,"workflow.activity,name",sale_activity_shipment_exception,Shipment Exception,Afleveren uitzondering,0
+model,"workflow.activity,name",sale_activity_shipment_invoice,Shipment Invoice,Afleverfactuur,0
+model,"workflow.activity,name",sale_activity_shipment_invoice_done,Shipment Invoice Done,Afleverfactuur klaar,0
+model,"workflow.activity,name",sale_activity_shipment_invoice_exception,Shipment Invoice Exception,Afleverfactuur uitzondering,0
+model,"workflow.activity,name",sale_activity_shipment_invoice_method,Shipment Invoice Method,Afleverfactuur afhandeling,0
+model,"workflow.activity,name",sale_activity_shipment_invoice_method_done,Shipment Invoice Method Done,Afleverfactuur afhandeling klaar,0
+model,"workflow.activity,name",sale_activity_shipment_method,Shipment Method,Levering afhandeling,0
+model,"workflow.activity,name",sale_activity_shipment_method_done,Shipment Method Done,Levering afhandeling klaar,0
+model,"workflow.activity,name",sale_activity_waiting_invoice_sale,Waiting Invoice,Wacht op factuur,0
+model,"workflow.activity,name",sale_activity_waiting_invoice_shipment,Waiting Invoice Shipment,Wacht op factuur levering,0
+model,"workflow.activity,name",sale_activity_waiting_shipment,Waiting Shipment,Wacht op aflevering,0
+model,"workflow.activity,name",sale_activity_waiting_shipment_invoice,Waiting Shipment Invoice,Wacht op afleverfactuur,0
+selection,"account.invoice,sale_exception_state",0,,,0
+selection,"account.invoice,sale_exception_state",0,Ignored,Genegeerd,0
+selection,"account.invoice,sale_exception_state",0,Recreated,Opnieuw aangemaakt,0
+selection,"sale.line,type",0,Comment,Opmerking,0
+selection,"sale.line,type",0,Line,Regel,0
+selection,"sale.line,type",0,Subtotal,Subtotaal,0
+selection,"sale.line,type",0,Title,Titel,0
+selection,"sale.sale,invoice_method",0,Manual,Handmatig,0
+selection,"sale.sale,invoice_method",0,On Order Confirmed,Na opdrachtbevestiging,0
+selection,"sale.sale,invoice_method",0,On Shipment Sent,Na verzending,0
+selection,"sale.sale,invoice_state",0,Exception,Uitzondering,0
+selection,"sale.sale,invoice_state",0,None,Geen,0
+selection,"sale.sale,invoice_state",0,Paid,Betaald,0
+selection,"sale.sale,invoice_state",0,Waiting,In afwachting,0
+selection,"sale.sale,shipment_method",0,Manual,Handmatig,0
+selection,"sale.sale,shipment_method",0,On Invoice Paid,Na factuur betaald,0
+selection,"sale.sale,shipment_method",0,On Order Confirmed,Na opdrachtbevestiging,0
+selection,"sale.sale,shipment_state",0,Exception,Uitzondering,0
+selection,"sale.sale,shipment_state",0,None,Geen,0
+selection,"sale.sale,shipment_state",0,Sent,Verzonden,0
+selection,"sale.sale,shipment_state",0,Waiting,In afwachting,0
+selection,"sale.sale,state",0,Canceled,Geannuleerd,0
+selection,"sale.sale,state",0,Confirmed,Bevestigd,0
+selection,"sale.sale,state",0,Done,Klaar,0
+selection,"sale.sale,state",0,Draft,Concept,0
+selection,"sale.sale,state",0,Quotation,Offerte,0
+selection,"stock.move,sale_exception_state",0,,,0
+selection,"stock.move,sale_exception_state",0,Ignored,Genegeerd,0
+selection,"stock.move,sale_exception_state",0,Recreated,Opnieuw aangemaakt,0
+view,product.template,0,Customers,Klanten,0
+view,sale.configuration,0,Sale Configuration,Verkoop instellingen,0
+view,sale.handle.invoice.exception.ask,0,Choose invoices to recreate,Kies facturen om opnieuw aan te maken,0
+view,sale.handle.invoice.exception.ask,0,Handle Invoice Exception,Factuuruitzondering afhandelen,0
+view,sale.handle.shipment.exception.ask,0,Choose move to recreate,Kies boeking om opnieuw aan te maken,0
+view,sale.handle.shipment.exception.ask,0,Handle shipment Exception,Zendinguitzondering afhandelen,0
+view,sale.handle.shipment.exception.ask,0,Recreate Moves,Boekingen opnieuw aanmaken,0
+view,sale.line,0,General,Algemeen,0
+view,sale.line,0,Notes,Aantekeningen,0
+view,sale.line,0,Products,Producten,0
+view,sale.line,0,Sale Line,Offerteregel,0
+view,sale.line,0,Sale Lines,Offerteregels,0
+view,sale.sale,0,Cancel,Annuleren,0
+view,sale.sale,0,Confirm,Bevestig,0
+view,sale.sale,0,Draft,Concept,0
+view,sale.sale,0,Handle Invoice Exception,Factuuruitzondering afhandelen,0
+view,sale.sale,0,Handle Shipment Exception,Zendinguitzondering afhandelen,0
+view,sale.sale,0,Invoices,Facturen,0
+view,sale.sale,0,Lines,Regels,0
+view,sale.sale,0,Moves,Boekingen,0
+view,sale.sale,0,Other Info,Aanvullende informatie,0
+view,sale.sale,0,Quotation,Offerte,0
+view,sale.sale,0,Sale,Verkoop,0
+view,sale.sale,0,Sales,Verkoop,0
+view,sale.sale,0,Shipments,Leveringen,0
+wizard_button,"sale.handle.invoice.exception,init,end",0,Cancel,Annuleren,0
+wizard_button,"sale.handle.invoice.exception,init,ok",0,Ok,Oké,0
+wizard_button,"sale.handle.shipment.exception,init,end",0,Cancel,Annuleren,0
+wizard_button,"sale.handle.shipment.exception,init,ok",0,Ok,Oké,0
diff --git a/party.xml b/party.xml
index fc0f386..1be8b66 100644
--- a/party.xml
+++ b/party.xml
@@ -6,7 +6,6 @@ this repository contains the full copyright notices and license terms. -->
         <record model="ir.action.act_window" id="act_sale_form2">
             <field name="name">Sales</field>
             <field name="res_model">sale.sale</field>
-            <field name="view_type">form</field>
             <field name="domain">[("party", "=", Eval('active_id'))]</field>
         </record>
         <record model="ir.action.keyword"
diff --git a/sale.py b/sale.py
index f19dcec..87589a7 100644
--- a/sale.py
+++ b/sale.py
@@ -136,7 +136,7 @@ class Sale(ModelWorkflow, ModelSQL, ModelView):
             'wrong_method': 'Wrong combination of method!',
             'addresses_required': 'Invoice and Shipment addresses must be '
             'defined for the quotation.',
-            'missing_account_receivable': 'It misses ' 
+            'missing_account_receivable': 'It misses '
                     'an "Account Receivable" on the party "%s"!',
         })
 
@@ -209,13 +209,17 @@ class Sale(ModelWorkflow, ModelSQL, ModelView):
         return 2
 
     def default_invoice_method(self):
-        return 'order'
+        config_obj = self.pool.get('sale.configuration')
+        config = config_obj.browse(1)
+        return config.sale_invoice_method
 
     def default_invoice_state(self):
         return 'none'
 
     def default_shipment_method(self):
-        return 'order'
+        config_obj = self.pool.get('sale.configuration')
+        config = config_obj.browse(1)
+        return config.sale_shipment_method
 
     def default_shipment_state(self):
         return 'none'
@@ -231,9 +235,9 @@ class Sale(ModelWorkflow, ModelSQL, ModelView):
         }
         if vals.get('party'):
             party = party_obj.browse(vals['party'])
-            res['invoice_address'] = party_obj.address_get(party.id, 
+            res['invoice_address'] = party_obj.address_get(party.id,
                     type='invoice')
-            res['shipment_address'] = party_obj.address_get(party.id, 
+            res['shipment_address'] = party_obj.address_get(party.id,
                     type='delivery')
             if party.payment_term:
                 res['payment_term'] = party.payment_term.id
@@ -343,7 +347,7 @@ class Sale(ModelWorkflow, ModelSQL, ModelView):
                         taxes[key] += val['amount']
             if currency:
                 for key in taxes:
-                    res['tax_amount'] += currency_obj.round(currency, 
+                    res['tax_amount'] += currency_obj.round(currency,
                             taxes[key])
         if currency:
             res['untaxed_amount'] = currency_obj.round(currency,
@@ -979,7 +983,7 @@ class SaleLine(ModelSQL, ModelView):
                         and move.id not in skip_ids:
                     val = False
                     break
-                quantity -= uom_obj.compute_qty(move.uom, move.quantity, 
+                quantity -= uom_obj.compute_qty(move.uom, move.quantity,
                         line.unit)
             if val:
                 if quantity > 0.0:
@@ -1018,6 +1022,8 @@ class SaleLine(ModelSQL, ModelView):
             context['currency'] = vals['_parent_sale.currency']
         if vals.get('_parent_sale.party'):
             context['customer'] = vals['_parent_sale.party']
+        if vals.get('_parent_sale.sale_date'):
+            context['sale_date'] = vals['_parent_sale.sale_date']
         if vals.get('unit'):
             context['uom'] = vals['unit']
         else:
@@ -1045,20 +1051,20 @@ class SaleLine(ModelSQL, ModelView):
 
         with Transaction().set_context(
                 self._get_context_sale_price(product,vals)):
-            res['unit_price'] = product_obj.get_sale_price([product.id], 
+            res['unit_price'] = product_obj.get_sale_price([product.id],
                     vals.get('quantity', 0))[product.id]
         res['taxes'] = []
         pattern = self._get_tax_rule_pattern(party, vals)
         for tax in product.customer_taxes_used:
             if party and party.customer_tax_rule:
-                tax_ids = tax_rule_obj.apply(party.customer_tax_rule, tax, 
+                tax_ids = tax_rule_obj.apply(party.customer_tax_rule, tax,
                         pattern)
                 if tax_ids:
                     res['taxes'].extend(tax_ids)
                 continue
             res['taxes'].append(tax.id)
         if party and party.customer_tax_rule:
-            tax_ids = tax_rule_obj.apply(party.customer_tax_rule, False, 
+            tax_ids = tax_rule_obj.apply(party.customer_tax_rule, False,
                     pattern)
             if tax_ids:
                 res['taxes'].extend(tax_ids)
@@ -1091,7 +1097,7 @@ class SaleLine(ModelSQL, ModelView):
 
         with Transaction().set_context(
                 self._get_context_sale_price(product, vals)):
-            res['unit_price'] = product_obj.get_sale_price([vals['product']], 
+            res['unit_price'] = product_obj.get_sale_price([vals['product']],
                     vals.get('quantity', 0))[vals['product']]
         return res
 
@@ -1101,10 +1107,9 @@ class SaleLine(ModelSQL, ModelView):
     def on_change_with_amount(self, vals):
         currency_obj = self.pool.get('currency.currency')
         if vals.get('type') == 'line':
-            if isinstance(vals.get('_parent_sale.currency'), (int, long)):
+            currency = vals.get('_parent_sale.currency')
+            if currency and isinstance(currency, (int, long)):
                 currency = currency_obj.browse(vals['_parent_sale.currency'])
-            else:
-                currency = vals['_parent_sale.currency']
             amount = Decimal(str(vals.get('quantity') or '0.0')) * \
                     (vals.get('unit_price') or Decimal('0.0'))
             if currency:
@@ -1124,7 +1129,7 @@ class SaleLine(ModelSQL, ModelView):
                 for line2 in line.sale.lines:
                     if line2.type == 'line':
                         res[line.id] += currency_obj.round(line2.sale.currency,
-                                Decimal(str(line2.quantity)) * 
+                                Decimal(str(line2.quantity)) *
                                         line2.unit_price)
                     elif line2.type == 'subtotal':
                         if line.id == line2.id:
@@ -1159,16 +1164,16 @@ class SaleLine(ModelSQL, ModelView):
             quantity = 0.0
             for move in line.moves:
                 if move.state == 'done':
-                    quantity += uom_obj.compute_qty(move.uom, move.quantity, 
+                    quantity += uom_obj.compute_qty(move.uom, move.quantity,
                             line.unit)
 
         ignored_ids = set(
             l.id for i in line.sale.invoices_ignored for l in i.lines)
         for invoice_line in line.invoice_lines:
-            if ((invoice_lines.invoice and
+            if ((invoice_line.invoice and
                     invoice_line.invoice.state != 'cancel') or
                 invoice_line.id in ignored_ids):
-                quantity -= uom_obj.compute_qty(invoice_line.unit, 
+                quantity -= uom_obj.compute_qty(invoice_line.unit,
                         invoice_line.quantity, line.unit)
         res['quantity'] = quantity
 
@@ -1380,7 +1385,9 @@ class Product(ModelSQL, ModelView):
         uom_obj = self.pool.get('product.uom')
         user_obj = self.pool.get('res.user')
         currency_obj = self.pool.get('currency.currency')
+        date_obj = self.pool.get('ir.date')
 
+        today = date_obj.today()
         res = {}
 
         uom = None
@@ -1401,8 +1408,11 @@ class Product(ModelSQL, ModelView):
                         product.default_uom, res[product.id], uom)
             if currency and user2.company:
                 if user2.company.currency.id != currency.id:
-                    res[product.id] = currency_obj.compute(
-                            user2.company.currency, res[product.id], currency)
+                    date = Transaction().context.get('sale_date') or today
+                    with Transaction().set_context(date=date):
+                        res[product.id] = currency_obj.compute(
+                                user2.company.currency.id, res[product.id],
+                                currency.id)
         return res
 
 Product()
@@ -1592,7 +1602,7 @@ class Invoice(ModelSQL, ModelView):
             return True
         if isinstance(ids, (int, long)):
             ids = [ids]
-        Transaction().cursor.execute('SELECT id FROM sale_invoices_rel ' 
+        Transaction().cursor.execute('SELECT id FROM sale_invoices_rel '
                 'WHERE invoice IN (' + ','.join(('%s',) * len(ids)) + ')',
                 ids)
         if Transaction().cursor.fetchone():
diff --git a/sale.xml b/sale.xml
index c18bd9d..819138b 100644
--- a/sale.xml
+++ b/sale.xml
@@ -227,7 +227,6 @@ this repository contains the full copyright notices and license terms. -->
         <record model="ir.action.act_window" id="act_shipment_form">
             <field name="name">Shipments</field>
             <field name="res_model">stock.shipment.out</field>
-            <field name="view_type">form</field>
             <field name="domain">[("id", "in", Eval('shipments'))]</field>
         </record>
         <record model="ir.action.keyword"
@@ -239,7 +238,6 @@ this repository contains the full copyright notices and license terms. -->
         <record model="ir.action.act_window" id="act_invoice_form">
             <field name="name">Invoices</field>
             <field name="res_model">account.invoice</field>
-            <field name="view_type">form</field>
             <field name="domain">[("id", "in", Eval('invoices'))]</field>
         </record>
         <record model="ir.action.keyword"
@@ -252,7 +250,6 @@ this repository contains the full copyright notices and license terms. -->
         <record model="ir.action.act_window" id="act_sale_form">
             <field name="name">Sales</field>
             <field name="res_model">sale.sale</field>
-            <field name="view_type">form</field>
             <field name="search_value">{'create_date': ['between', Date(delta_years=-1)]}</field>
         </record>
         <record model="ir.action.act_window.view" id="act_sale_form_view1">
@@ -271,7 +268,6 @@ this repository contains the full copyright notices and license terms. -->
         <record model="ir.action.act_window" id="act_sale_form_new">
             <field name="name">New Sale</field>
             <field name="res_model">sale.sale</field>
-            <field name="view_type">form</field>
         </record>
         <record model="ir.action.act_window.view" id="act_sale_form_new_view1">
             <field name="sequence" eval="20"/>
@@ -289,7 +285,6 @@ this repository contains the full copyright notices and license terms. -->
         <record model="ir.action.act_window" id="act_sale_form_draft">
             <field name="name">Draft Sales</field>
             <field name="res_model">sale.sale</field>
-            <field name="view_type">form</field>
             <field name="domain">[('state', '=', 'draft')]</field>
         </record>
         <record model="ir.action.act_window.view" id="act_sale_form_draft_view1">
@@ -308,7 +303,6 @@ this repository contains the full copyright notices and license terms. -->
         <record model="ir.action.act_window" id="act_sale_form_quotation">
             <field name="name">Quotation Sales</field>
             <field name="res_model">sale.sale</field>
-            <field name="view_type">form</field>
             <field name="domain">[('state', '=', 'quotation')]</field>
         </record>
         <record model="ir.action.act_window.view" id="act_sale_form_quotation_view1">
@@ -327,7 +321,6 @@ this repository contains the full copyright notices and license terms. -->
         <record model="ir.action.act_window" id="act_sale_form_confirmed">
             <field name="name">Confirmed Sales</field>
             <field name="res_model">sale.sale</field>
-            <field name="view_type">form</field>
             <field name="domain">[('state', '=', 'confirmed')]</field>
         </record>
         <record model="ir.action.act_window.view" id="act_sale_form_confirmed_view1">
diff --git a/setup.py b/setup.py
index 4f2ce20..af0ce68 100644
--- a/setup.py
+++ b/setup.py
@@ -44,12 +44,16 @@ setup(name='trytond_sale',
         'Intended Audience :: Financial and Insurance Industry',
         'Intended Audience :: Legal Industry',
         'License :: OSI Approved :: GNU General Public License (GPL)',
+        'Natural Language :: Bulgarian',
+        'Natural Language :: Dutch',
         'Natural Language :: English',
         'Natural Language :: French',
         'Natural Language :: German',
         'Natural Language :: Spanish',
         'Operating System :: OS Independent',
-        'Programming Language :: Python',
+        'Programming Language :: Python :: 2.5',
+        'Programming Language :: Python :: 2.6',
+        'Programming Language :: Python :: 2.7',
         'Topic :: Office/Business',
         'Topic :: Office/Business :: Financial :: Accounting',
     ],
diff --git a/trytond_sale.egg-info/PKG-INFO b/trytond_sale.egg-info/PKG-INFO
index a111345..cec4101 100644
--- a/trytond_sale.egg-info/PKG-INFO
+++ b/trytond_sale.egg-info/PKG-INFO
@@ -1,6 +1,6 @@
 Metadata-Version: 1.0
 Name: trytond-sale
-Version: 1.8.1
+Version: 2.0.0
 Summary: Define sale order.
 Add to product sale informations.
 Define the sale price as the list price.
@@ -20,7 +20,7 @@ Home-page: http://www.tryton.org/
 Author: B2CK
 Author-email: info at b2ck.com
 License: GPL-3
-Download-URL: http://downloads.tryton.org/1.8/
+Download-URL: http://downloads.tryton.org/2.0/
 Description: UNKNOWN
 Platform: UNKNOWN
 Classifier: Development Status :: 5 - Production/Stable
@@ -29,11 +29,15 @@ Classifier: Intended Audience :: Developers
 Classifier: Intended Audience :: Financial and Insurance Industry
 Classifier: Intended Audience :: Legal Industry
 Classifier: License :: OSI Approved :: GNU General Public License (GPL)
+Classifier: Natural Language :: Bulgarian
+Classifier: Natural Language :: Dutch
 Classifier: Natural Language :: English
 Classifier: Natural Language :: French
 Classifier: Natural Language :: German
 Classifier: Natural Language :: Spanish
 Classifier: Operating System :: OS Independent
-Classifier: Programming Language :: Python
+Classifier: Programming Language :: Python :: 2.5
+Classifier: Programming Language :: Python :: 2.6
+Classifier: Programming Language :: Python :: 2.7
 Classifier: Topic :: Office/Business
 Classifier: Topic :: Office/Business :: Financial :: Accounting
diff --git a/trytond_sale.egg-info/SOURCES.txt b/trytond_sale.egg-info/SOURCES.txt
index 39f7bda..957d42f 100644
--- a/trytond_sale.egg-info/SOURCES.txt
+++ b/trytond_sale.egg-info/SOURCES.txt
@@ -5,11 +5,13 @@ LICENSE
 MANIFEST.in
 README
 TODO
+bg_BG.csv
 configuration.xml
 de_DE.csv
 es_CO.csv
 es_ES.csv
 fr_FR.csv
+nl_NL.csv
 party.xml
 sale.odt
 sale.xml
@@ -17,6 +19,7 @@ setup.py
 ./__init__.py
 ./__tryton__.py
 ./configuration.py
+./invoice.py
 ./sale.py
 ./tests/__init__.py
 ./tests/test_sale.py
diff --git a/trytond_sale.egg-info/requires.txt b/trytond_sale.egg-info/requires.txt
index df87b5a..7d8b694 100644
--- a/trytond_sale.egg-info/requires.txt
+++ b/trytond_sale.egg-info/requires.txt
@@ -1,9 +1,9 @@
-trytond_company >= 1.8, < 1.9
-trytond_party >= 1.8, < 1.9
-trytond_stock >= 1.8, < 1.9
-trytond_account >= 1.8, < 1.9
-trytond_product >= 1.8, < 1.9
-trytond_account_invoice >= 1.8, < 1.9
-trytond_currency >= 1.8, < 1.9
-trytond_account_product >= 1.8, < 1.9
-trytond >= 1.8, < 1.9
\ No newline at end of file
+trytond_company >= 2.0, < 2.1
+trytond_party >= 2.0, < 2.1
+trytond_stock >= 2.0, < 2.1
+trytond_account >= 2.0, < 2.1
+trytond_product >= 2.0, < 2.1
+trytond_account_invoice >= 2.0, < 2.1
+trytond_currency >= 2.0, < 2.1
+trytond_account_product >= 2.0, < 2.1
+trytond >= 2.0, < 2.1
\ No newline at end of file
commit 13b4836845eeab6fef8089c6dc9a6c30437e5fb0
Author: Mathias Behrle <mathiasb at m9s.biz>
Date:   Tue Apr 26 21:08:55 2011 +0200

    Updating to standards version 3.9.2.

diff --git a/debian/control b/debian/control
index 0b342c5..16f6ce6 100644
--- a/debian/control
+++ b/debian/control
@@ -7,7 +7,7 @@ Uploaders:
  Mathias Behrle <mathiasb at m9s.biz>
 Dm-Upload-Allowed: yes
 Build-Depends: debhelper (>= 8), python, python-setuptools, python-support
-Standards-Version: 3.9.1
+Standards-Version: 3.9.2
 Homepage: http://www.tryton.org/
 Vcs-Browser: http://git.debian-maintainers.org/?p=tryton/tryton-modules-sale.git
 Vcs-Git: git://git.debian-maintainers.org/git/tryton/tryton-modules-sale.git
commit c501a3b394ba8a0f7d993af0b090b8fb5058395f
Author: Mathias Behrle <mathiasb at m9s.biz>
Date:   Tue Feb 15 13:15:54 2011 +0100

    Releasing debian version 1.8.1-1.

diff --git a/debian/changelog b/debian/changelog
index 656249a..85f6f48 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -1,3 +1,12 @@
+tryton-modules-sale (1.8.1-1) unstable; urgency=low
+
+  * Changing my email address.
+  * Setting minimal Python version to 2.5.
+  * Merging upstream version 1.8.1.
+  * Updating Copyright.
+
+ -- Mathias Behrle <mathiasb at m9s.biz>  Tue, 15 Feb 2011 13:15:39 +0100
+
 tryton-modules-sale (1.8.0-1) experimental; urgency=low
 
   * Updating standards version to 3.9.0.
commit 2b5884536f5fc25bddfd9bd801fd12b355baf4b9
Author: Mathias Behrle <mathiasb at m9s.biz>
Date:   Tue Feb 15 12:38:45 2011 +0100

    Updating Copyright.

diff --git a/debian/copyright b/debian/copyright
index 6146982..fc13eeb 100644
--- a/debian/copyright
+++ b/debian/copyright
@@ -6,9 +6,9 @@ Maintainer-Homepage: http://tryton.debian-maintainers.org/
 Files: *
 Copyright:
  (C) 2004-2008 Tiny SPRL
- (C) 2008-2010 Cedric Krier
- (C) 2008-2010 Bertrand Chenal
- (C) 2008-2010 B2CK SPRL
+ (C) 2008-2011 Cedric Krier
+ (C) 2008-2011 Bertrand Chenal
+ (C) 2008-2011 B2CK SPRL
 License: GPL-3+
  This program is free software: you can redistribute it and/or modify
  it under the terms of the GNU General Public License as published by
@@ -27,7 +27,7 @@ License: GPL-3+
  can be found in /usr/share/common-licenses/GPL-3 file.
 
 Files: debian/*
-Copyright: (C) 2009-2010 Daniel Baumann <daniel at debian.org>
+Copyright: (C) 2009-2011 Daniel Baumann <daniel at debian.org>
 License: GPL-3+
  This program is free software: you can redistribute it and/or modify
  it under the terms of the GNU General Public License as published by
commit ef364c510df4196ccacd780cda36a9f1f42bb861
Author: Mathias Behrle <mathiasb at m9s.biz>
Date:   Tue Feb 15 11:46:28 2011 +0100

    Merging upstream version 1.8.1.

diff --git a/CHANGELOG b/CHANGELOG
index a7806e4..0d7fab5 100644
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -1,3 +1,6 @@
+Version 1.8.1 - 2011-02-13
+* Bug fixes (see mercurial logs for details)
+
 Version 1.8.0 - 2010-11-01
 * Bug fixes (see mercurial logs for details)
 
diff --git a/COPYRIGHT b/COPYRIGHT
index 94a43fb..97eff54 100644
--- a/COPYRIGHT
+++ b/COPYRIGHT
@@ -1,7 +1,7 @@
 Copyright (C) 2004-2008 Tiny SPRL.
-Copyright (C) 2008-2010 Cédric Krier.
-Copyright (C) 2008-2010 Bertrand Chenal.
-Copyright (C) 2008-2010 B2CK SPRL.
+Copyright (C) 2008-2011 Cédric Krier.
+Copyright (C) 2008-2011 Bertrand Chenal.
+Copyright (C) 2008-2011 B2CK SPRL.
 
 This program is free software: you can redistribute it and/or modify
 it under the terms of the GNU General Public License as published by
diff --git a/PKG-INFO b/PKG-INFO
index dab9e73..a18f676 100644
--- a/PKG-INFO
+++ b/PKG-INFO
@@ -1,6 +1,6 @@
 Metadata-Version: 1.0
 Name: trytond_sale
-Version: 1.8.0
+Version: 1.8.1
 Summary: Define sale order.
 Add to product sale informations.
 Define the sale price as the list price.
diff --git a/__tryton__.py b/__tryton__.py
index 8edec36..0723671 100644
--- a/__tryton__.py
+++ b/__tryton__.py
@@ -6,7 +6,7 @@
     'name_es_CO': 'Ventas',
     'name_es_ES': 'Venta',
     'name_fr_FR': 'Vente',
-    'version': '1.8.0',
+    'version': '1.8.1',
     'author': 'B2CK',
     'email': 'info at b2ck.com',
     'website': 'http://www.tryton.org/',
diff --git a/sale.py b/sale.py
index 4467680..f19dcec 100644
--- a/sale.py
+++ b/sale.py
@@ -1165,8 +1165,9 @@ class SaleLine(ModelSQL, ModelView):
         ignored_ids = set(
             l.id for i in line.sale.invoices_ignored for l in i.lines)
         for invoice_line in line.invoice_lines:
-            if invoice_line.invoice.state != 'cancel' or \
-                    invoice_line.id in ignored_ids:
+            if ((invoice_lines.invoice and
+                    invoice_line.invoice.state != 'cancel') or
+                invoice_line.id in ignored_ids):
                 quantity -= uom_obj.compute_qty(invoice_line.unit, 
                         invoice_line.quantity, line.unit)
         res['quantity'] = quantity
diff --git a/trytond_sale.egg-info/PKG-INFO b/trytond_sale.egg-info/PKG-INFO
index 75d21e2..a111345 100644
--- a/trytond_sale.egg-info/PKG-INFO
+++ b/trytond_sale.egg-info/PKG-INFO
@@ -1,6 +1,6 @@
 Metadata-Version: 1.0
 Name: trytond-sale
-Version: 1.8.0
+Version: 1.8.1
 Summary: Define sale order.
 Add to product sale informations.
 Define the sale price as the list price.
commit 204a53a1f97dd64eb4cc87d5388e2821a907653f
Author: Mathias Behrle <mathiasb at m9s.biz>
Date:   Sat Jan 15 17:27:20 2011 +0100

    Setting minimal Python version to 2.5.

diff --git a/debian/pyversions b/debian/pyversions
index 8b253bc..b3dc41e 100644
--- a/debian/pyversions
+++ b/debian/pyversions
@@ -1 +1 @@
-2.4-
+2.5-
commit 7c273473fbf603d389a747b78c92444f5a9eb404
Author: Mathias Behrle <mathiasb at m9s.biz>
Date:   Sat Nov 20 11:48:56 2010 +0100

    Changing my email address.

diff --git a/debian/control b/debian/control
index 2dac708..0b342c5 100644
--- a/debian/control
+++ b/debian/control
@@ -4,7 +4,7 @@ Priority: optional
 Maintainer: Debian Tryton Maintainers <tryton at lists.debian-maintainers.org>
 Uploaders:
  Daniel Baumann <daniel at debian.org>,
- Mathias Behrle <mathiasb at mbsolutions.selfip.biz>
+ Mathias Behrle <mathiasb at m9s.biz>
 Dm-Upload-Allowed: yes
 Build-Depends: debhelper (>= 8), python, python-setuptools, python-support
 Standards-Version: 3.9.1
commit 51e7332593a16531dd77a69cb265693dd91bbc45
Author: Daniel Baumann <daniel at debian.org>
Date:   Fri Nov 12 13:30:35 2010 +0100

    Releasing debian version 1.8.0-1.

diff --git a/debian/changelog b/debian/changelog
index e7d193a..656249a 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -1,3 +1,14 @@
+tryton-modules-sale (1.8.0-1) experimental; urgency=low
+
+  * Updating standards version to 3.9.0.
+  * Updating to debhelper version 8.
+  * Updating to standards version 3.9.1.
+  * Switching to source format 3.0 (quilt).
+  * Merging upstream version 1.8.0.
+  * Updating versioned tryton depends to 1.8.
+
+ -- Daniel Baumann <daniel at debian.org>  Fri, 12 Nov 2010 13:30:26 +0100
+
 tryton-modules-sale (1.6.0-1) unstable; urgency=low
 
   [ Daniel Baumann ]
commit 67a96bc380af97963ee4c299cb1adfccfbacdb5b
Author: Daniel Baumann <daniel at debian.org>
Date:   Thu Nov 4 20:16:01 2010 +0100

    Updating versioned tryton depends to 1.8.

diff --git a/debian/control b/debian/control
index fb3a403..2dac708 100644
--- a/debian/control
+++ b/debian/control
@@ -15,11 +15,11 @@ Vcs-Git: git://git.debian-maintainers.org/git/tryton/tryton-modules-sale.git
 Package: tryton-modules-sale
 Architecture: all
 Depends:
- ${misc:Depends}, ${python:Depends}, tryton-server (>= 1.6),
- tryton-modules-account (>= 1.6), tryton-modules-account-invoice (>= 1.6),
- tryton-modules-account-product (>= 1.6), tryton-modules-company (>= 1.6),
- tryton-modules-currency (>= 1.6), tryton-modules-party (>= 1.6),
- tryton-modules-product (>= 1.6), tryton-modules-stock (>= 1.6),
+ ${misc:Depends}, ${python:Depends}, tryton-server (>= 1.8),
+ tryton-modules-account (>= 1.8), tryton-modules-account-invoice (>= 1.8),
+ tryton-modules-account-product (>= 1.8), tryton-modules-company (>= 1.8),
+ tryton-modules-currency (>= 1.8), tryton-modules-party (>= 1.8),
+ tryton-modules-product (>= 1.8), tryton-modules-stock (>= 1.8),
  python-pkg-resources
 XB-Python-Version: ${python:Versions}
 Description: Tryton Application Platform (Sale Module)
commit ceb517b77da3d134cf392f8978ec9c2ab2ab907e
Author: Daniel Baumann <daniel at debian.org>
Date:   Thu Nov 4 20:13:25 2010 +0100

    Merging upstream version 1.8.0.

diff --git a/CHANGELOG b/CHANGELOG
index a812581..a7806e4 100644
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -1,3 +1,6 @@
+Version 1.8.0 - 2010-11-01
+* Bug fixes (see mercurial logs for details)
+
 Version 1.6.0 - 2010-05-13
 * Bug fixes (see mercurial logs for details)
 * Use a modelsingleton to define which sale sequence to use
diff --git a/INSTALL b/INSTALL
index 4b1b49a..a5b6fd2 100644
--- a/INSTALL
+++ b/INSTALL
@@ -4,7 +4,7 @@ Installing trytond_sale
 Prerequisites
 -------------
 
- * Python 2.4 or later (http://www.python.org/)
+ * Python 2.5 or later (http://www.python.org/)
  * trytond (http://www.tryton.org/)
  * trytond_company (http://www.tryton.org/)
  * trytond_party (http://www.tryton.org/)
diff --git a/PKG-INFO b/PKG-INFO
index 8e156a3..dab9e73 100644
--- a/PKG-INFO
+++ b/PKG-INFO
@@ -1,6 +1,6 @@
 Metadata-Version: 1.0
 Name: trytond_sale
-Version: 1.6.0
+Version: 1.8.0
 Summary: Define sale order.
 Add to product sale informations.
 Define the sale price as the list price.
@@ -20,7 +20,7 @@ Home-page: http://www.tryton.org/
 Author: B2CK
 Author-email: info at b2ck.com
 License: GPL-3
-Download-URL: http://downloads.tryton.org/1.6/
+Download-URL: http://downloads.tryton.org/1.8/
 Description: UNKNOWN
 Platform: UNKNOWN
 Classifier: Development Status :: 5 - Production/Stable
diff --git a/__tryton__.py b/__tryton__.py
index 7c963cc..8edec36 100644
--- a/__tryton__.py
+++ b/__tryton__.py
@@ -6,7 +6,7 @@
     'name_es_CO': 'Ventas',
     'name_es_ES': 'Venta',
     'name_fr_FR': 'Vente',
-    'version': '1.6.0',
+    'version': '1.8.0',
     'author': 'B2CK',
     'email': 'info at b2ck.com',
     'website': 'http://www.tryton.org/',
diff --git a/de_DE.csv b/de_DE.csv
index 5bfd748..09e24e3 100644
--- a/de_DE.csv
+++ b/de_DE.csv
@@ -1,8 +1,8 @@
 type,name,res_id,src,value,fuzzy
 error,account.invoice,0,You can not delete invoices that come from a sale!,Durch einen Verkauf generierte Rechnungen können nicht gelöscht werden!,0
 error,account.invoice,0,You cannot reset to draft an invoice generated by a sale.,Eine durch einen Verkauf generierte Rechnung kann nicht auf Entwurf zurückgesetzt werden.,0
-error,sale.line,0,"It misses an ""account Revenue"" default property!",Es ist keine Standardeigenschaft für das Ertragsskonto definiert!,0
 error,sale.line,0,"It misses an ""Account Revenue"" on product ""%s""!","Es ist kein Ertragskonto für Artikel ""%s"" definiert!",0
+error,sale.line,0,"It misses an ""account Revenue"" default property!",Es ist keine Standardeigenschaft für das Ertragsskonto definiert!,0
 error,sale.line,0,The customer location is required!,Der Lagerort des Kunden muss eingegeben werden!,0
 error,sale.sale,0,Invoice and Shipment addresses must be defined for the quotation.,Rechnungs- und Lieferadresse müssen für das Angebot eingetragen sein!,0
 error,sale.sale,0,"It misses an ""Account Receivable"" on the party ""%s""!","Es ist kein Forderungskonto für Partei ""%s"" definiert!",0
@@ -17,17 +17,8 @@ field,"sale.handle.invoice.exception.ask,domain_invoices",0,Domain Invoices,Wert
 field,"sale.handle.invoice.exception.ask,recreate_invoices",0,Recreate Invoices,Rechnungen nachbilden,0
 field,"sale.handle.shipment.exception.ask,domain_moves",0,Domain Moves,Wertebereich Bewegungen (Domain),0
 field,"sale.handle.shipment.exception.ask,recreate_moves",0,Recreate Moves,Bewegungen nachbilden,0
-field,"sale.line-account.invoice.line,invoice_line",0,Invoice Line,Rechnungsposition,0
-field,"sale.line-account.invoice.line,rec_name",0,Name,Name,0
-field,"sale.line-account.invoice.line,sale_line",0,Sale Line,Position Verkauf,0
-field,"sale.line-account.tax,line",0,Sale Line,Position Verkauf,0
-field,"sale.line-account.tax,rec_name",0,Name,Name,0
-field,"sale.line-account.tax,tax",0,Tax,Steuer,0
 field,"sale.line,amount",0,Amount,Betrag,0
 field,"sale.line,description",0,Description,Bezeichnung,0
-field,"sale.line-ignored-stock.move,move",0,Move,Bewegung,0
-field,"sale.line-ignored-stock.move,rec_name",0,Name,Name,0
-field,"sale.line-ignored-stock.move,sale_line",0,Sale Line,Position Verkauf,0
 field,"sale.line,invoice_lines",0,Invoice Lines,Rechnungspositionen,0
 field,"sale.line,move_done",0,Moves Done,Bewegungen erledigt,0
 field,"sale.line,move_exception",0,Moves Exception,Bewegungsvorbehalt,0
@@ -38,9 +29,6 @@ field,"sale.line,note",0,Note,Notiz,0
 field,"sale.line,product",0,Product,Artikel,0
 field,"sale.line,quantity",0,Quantity,Anzahl,0
 field,"sale.line,rec_name",0,Name,Name,0
-field,"sale.line-recreated-stock.move,move",0,Move,Bewegung,0
-field,"sale.line-recreated-stock.move,rec_name",0,Name,Name,0
-field,"sale.line-recreated-stock.move,sale_line",0,Sale Line,Position Verkauf,0
 field,"sale.line,sale",0,Sale,Verkauf,0
 field,"sale.line,sequence",0,Sequence,Reihenfolge,0
 field,"sale.line,taxes",0,Taxes,Steuern,0
@@ -48,97 +36,110 @@ field,"sale.line,type",0,Type,Typ,0
 field,"sale.line,unit",0,Unit,Einheit,0
 field,"sale.line,unit_digits",0,Unit Digits,Anzahl Stellen,0
 field,"sale.line,unit_price",0,Unit Price,Einzelpreis,0
-field,"sale.sale-account.invoice,invoice",0,Invoice,Rechnung,0
-field,"sale.sale-account.invoice,rec_name",0,Name,Name,0
-field,"sale.sale-account.invoice,sale",0,Sale,Verkauf,0
+field,"sale.line-account.invoice.line,invoice_line",0,Invoice Line,Rechnungsposition,0
+field,"sale.line-account.invoice.line,rec_name",0,Name,Name,0
+field,"sale.line-account.invoice.line,sale_line",0,Sale Line,Position Verkauf,0
+field,"sale.line-account.tax,line",0,Sale Line,Position Verkauf,0
+field,"sale.line-account.tax,rec_name",0,Name,Name,0
+field,"sale.line-account.tax,tax",0,Tax,Steuer,0
+field,"sale.line-ignored-stock.move,move",0,Move,Bewegung,0
+field,"sale.line-ignored-stock.move,rec_name",0,Name,Name,0
+field,"sale.line-ignored-stock.move,sale_line",0,Sale Line,Position Verkauf,0
+field,"sale.line-recreated-stock.move,move",0,Move,Bewegung,0
+field,"sale.line-recreated-stock.move,rec_name",0,Name,Name,0
+field,"sale.line-recreated-stock.move,sale_line",0,Sale Line,Position Verkauf,0
 field,"sale.sale,comment",0,Comment,Kommentar,0
 field,"sale.sale,company",0,Company,Unternehmen,0
 field,"sale.sale,currency",0,Currency,Währung,0
 field,"sale.sale,currency_digits",0,Currency Digits,Währung (signifikante Stellen),0
 field,"sale.sale,description",0,Description,Beschreibung,0
-field,"sale.sale-ignored-account.invoice,invoice",0,Invoice,Rechnung,0
-field,"sale.sale-ignored-account.invoice,rec_name",0,Name,Name,0
-field,"sale.sale-ignored-account.invoice,sale",0,Sale,Verkauf,0
 field,"sale.sale,invoice_address",0,Invoice Address,Rechnungsadresse,0
 field,"sale.sale,invoice_exception",0,Invoices Exception,Rechnungsvorbehalt,0
 field,"sale.sale,invoice_method",0,Invoice Method,Rechnungsstellung,0
 field,"sale.sale,invoice_paid",0,Invoices Paid,Bezahlte Rechnungen,0
+field,"sale.sale,invoice_state",0,Invoice State,Rechnungsstatus,0
 field,"sale.sale,invoices",0,Invoices,Rechnungen,0
 field,"sale.sale,invoices_ignored",0,Ignored Invoices,Ignorierte Rechnungen,0
 field,"sale.sale,invoices_recreated",0,Recreated Invoices,Nachgebildete Rechnungen,0
-field,"sale.sale,invoice_state",0,Invoice State,Rechnungsstatus,0
 field,"sale.sale,lines",0,Lines,Positionen,0
 field,"sale.sale,moves",0,Moves,Bewegungen,0
 field,"sale.sale,party",0,Party,Partei,0
 field,"sale.sale,party_lang",0,Party Language,Sprache Partei,0
 field,"sale.sale,payment_term",0,Payment Term,Zahlungsbedingung,0
 field,"sale.sale,rec_name",0,Name,Name,0
-field,"sale.sale-recreated-account.invoice,invoice",0,Invoice,Rechnung,0
-field,"sale.sale-recreated-account.invoice,rec_name",0,Name,Name,0
-field,"sale.sale-recreated-account.invoice,sale",0,Sale,Verkauf,0
 field,"sale.sale,reference",0,Reference,Beleg-Nr.,0
 field,"sale.sale,sale_date",0,Sale Date,Verkaufsdatum,0
 field,"sale.sale,shipment_address",0,Shipment Address,Lieferadresse,0
 field,"sale.sale,shipment_done",0,Shipment Done,Gepackt,0
 field,"sale.sale,shipment_exception",0,Shipments Exception,Lieferungsvorbehalt,0
 field,"sale.sale,shipment_method",0,Shipment Method,Liefermethode,0
-field,"sale.sale,shipments",0,Shipments,Lieferposten,0
 field,"sale.sale,shipment_state",0,Shipment State,Lieferstatus,0
+field,"sale.sale,shipments",0,Shipments,Lieferposten,0
 field,"sale.sale,state",0,State,Status,0
 field,"sale.sale,tax_amount",0,Tax,Steuer,0
 field,"sale.sale,total_amount",0,Total,Gesamt,0
 field,"sale.sale,untaxed_amount",0,Untaxed,Netto,0
 field,"sale.sale,warehouse",0,Warehouse,Warenlager,0
+field,"sale.sale-account.invoice,invoice",0,Invoice,Rechnung,0
+field,"sale.sale-account.invoice,rec_name",0,Name,Name,0
+field,"sale.sale-account.invoice,sale",0,Sale,Verkauf,0
+field,"sale.sale-ignored-account.invoice,invoice",0,Invoice,Rechnung,0
+field,"sale.sale-ignored-account.invoice,rec_name",0,Name,Name,0
+field,"sale.sale-ignored-account.invoice,sale",0,Sale,Verkauf,0
+field,"sale.sale-recreated-account.invoice,invoice",0,Invoice,Rechnung,0
+field,"sale.sale-recreated-account.invoice,rec_name",0,Name,Name,0
+field,"sale.sale-recreated-account.invoice,sale",0,Sale,Verkauf,0
 field,"stock.move,sale",0,Sale,Verkauf,0
 field,"stock.move,sale_exception_state",0,Exception State,Status Vorbehalt,0
 field,"stock.move,sale_line",0,Sale Line,Verkauf Position,0
 help,"sale.handle.invoice.exception.ask,recreate_invoices",0,The selected invoices will be recreated. The other ones will be ignored.,Die ausgewählten Rechnungen werden nachgebildet. Alle anderen werden ignoriert.,0
-model,"ir.action,name",act_sale_form_confirmed,Confirmed Sales,Aufträge (Verkäufe),0
-model,"ir.action,name",act_sale_form_draft,Draft Sales,Entwürfe (Verkäufe),0
-model,"ir.action,name",wizard_invoice_handle_exception,Handle Invoice Exception,Rechnungsvorbehalt bearbeiten,0
-model,"ir.action,name",wizard_shipment_handle_exception,Handle Shipment Exception,Liefervorbehalt bearbeiten,0
 model,"ir.action,name",act_invoice_form,Invoices,Rechnungsausgang,0
-model,"ir.action,name",act_sale_form_new,New Sale,Neuer Verkauf,0
 model,"ir.action,name",act_open_customer,Parties associated to Sales,Parteien: Verkäufen zugeordnet,0
-model,"ir.action,name",act_sale_form_quotation,Quotation Sales,Angebote (Verkäufe),0
-model,"ir.action,name",report_sale,Sale,Verkauf,0
 model,"ir.action,name",act_sale_configuration_form,Sale Configuration,Einstellungen Verkauf,0
 model,"ir.action,name",act_sale_form,Sales,Verkäufe,0
 model,"ir.action,name",act_sale_form2,Sales,Verkäufe,0
+model,"ir.action,name",act_sale_form_confirmed,Confirmed Sales,Aufträge (Verkäufe),0
+model,"ir.action,name",act_sale_form_draft,Draft Sales,Entwürfe (Verkäufe),0
+model,"ir.action,name",act_sale_form_new,New Sale,Neuer Verkauf,0
+model,"ir.action,name",act_sale_form_quotation,Quotation Sales,Angebote (Verkäufe),0
 model,"ir.action,name",act_shipment_form,Shipments,Lieferposten,0
+model,"ir.action,name",report_sale,Sale,Verkauf,0
+model,"ir.action,name",wizard_invoice_handle_exception,Handle Invoice Exception,Rechnungsvorbehalt bearbeiten,0
+model,"ir.action,name",wizard_shipment_handle_exception,Handle Shipment Exception,Liefervorbehalt bearbeiten,0
 model,"ir.sequence,name",sequence_sale,Sale,Verkauf,0
 model,"ir.sequence.type,name",sequence_type_sale,Sale,Verkauf,0
 model,"ir.ui.menu,name",menu_configuration,Configuration,Einstellungen,0
+model,"ir.ui.menu,name",menu_customer,Parties associated to Sales,Parteien: Verkäufen zugeordnet,0
+model,"ir.ui.menu,name",menu_sale,Sale Management,Verkauf,0
+model,"ir.ui.menu,name",menu_sale_configuration,Sale Configuration,Einstellungen Verkauf,0
+model,"ir.ui.menu,name",menu_sale_form,Sales,Verkäufe,0
 model,"ir.ui.menu,name",menu_sale_form_confirmed,Confirmed Sales,Aufträge (Verkäufe),0
 model,"ir.ui.menu,name",menu_sale_form_draft,Draft Sales,Entwürfe (Verkäufe),0
 model,"ir.ui.menu,name",menu_sale_form_new,New Sale,Neuer Verkauf,0
-model,"ir.ui.menu,name",menu_customer,Parties associated to Sales,Parteien: Verkäufen zugeordnet,0
 model,"ir.ui.menu,name",menu_sale_form_quotation,Quotation Sales,Angebote (Verkäufe),0
-model,"ir.ui.menu,name",menu_sale_configuration,Sale Configuration,Einstellungen Verkauf,0
-model,"ir.ui.menu,name",menu_sale,Sale Management,Verkauf,0
-model,"ir.ui.menu,name",menu_sale_form,Sales,Verkäufe,0
 model,"res.group,name",group_sale,Sale,Verkauf,0
 model,"res.group,name",group_sale_admin,Sale Administrator,Verkauf Administration,0
 model,"sale.configuration,name",0,Sale Configuration,Einstellungen Verkauf,0
 model,"sale.handle.invoice.exception.ask,name",0,Invoice Exception Ask,Rechnungsvorbehalt Nachfrage,0
 model,"sale.handle.shipment.exception.ask,name",0,Shipment Exception Ask,Nachfrage Liefervorbehalt,0
+model,"sale.line,name",0,Sale Line,Verkauf Position,0
 model,"sale.line-account.invoice.line,name",0,Sale Line - Invoice Line,Verkauf Position - Rechnung Zeile,0
 model,"sale.line-account.tax,name",0,Sale Line - Tax,Verkauf Position - Steuer,0
 model,"sale.line-ignored-stock.move,name",0,Sale Line - Ignored Move,Verkauf Position - Bewegung Ignoriert,0
-model,"sale.line,name",0,Sale Line,Verkauf Position,0
 model,"sale.line-recreated-stock.move,name",0,Sale Line - Recreated Move,Verkauf Position - Bewegung Nachgebildet,0
+model,"sale.sale,name",0,Sale,Verkauf,0
 model,"sale.sale-account.invoice,name",0,Sale - Invoice,Verkauf - Rechnung,0
 model,"sale.sale-ignored-account.invoice,name",0,Sale - Ignored Invoice,Verkauf - Rechnung Ignoriert,0
-model,"sale.sale,name",0,Sale,Verkauf,0
 model,"sale.sale-recreated-account.invoice,name",0,Sale - Recreated Invoice,Verkauf - Rechnung Nachgebildet,0
+model,"workflow,name",sale_workflow,Sale workflow,Workflow Verkauf,0
 model,"workflow.activity,name",sale_activity_cancel,Canceled,Annulliert,0
 model,"workflow.activity,name",sale_activity_confirmed,Confirmed,Beauftragt,0
 model,"workflow.activity,name",sale_activity_done,Done,Erledigt,0
 model,"workflow.activity,name",sale_activity_draft,Draft,Entwurf,0
-model,"workflow.activity,name",sale_activity_invoice_sale_done,Invoice Done,Rechnung erledigt,0
-model,"workflow.activity,name",sale_activity_invoice_sale_exception,Invoice Exception,Rechnungsvorbehalt,0
 model,"workflow.activity,name",sale_activity_invoice_method,Invoice Method,Rechnungsstellung,0
 model,"workflow.activity,name",sale_activity_invoice_method_done,Invoice Method Done,Rechnungsstellung erledigt,0
+model,"workflow.activity,name",sale_activity_invoice_sale_done,Invoice Done,Rechnung erledigt,0
+model,"workflow.activity,name",sale_activity_invoice_sale_exception,Invoice Exception,Rechnungsvorbehalt,0
 model,"workflow.activity,name",sale_activity_invoice_shipment,Invoice Shipment,Rechnung Lieferposten,0
 model,"workflow.activity,name",sale_activity_invoice_shipment_done,Invoice Shipment Done,Rechnung Lieferposten erledigt,0
 model,"workflow.activity,name",sale_activity_invoice_shipment_exception,Invoice Shipment Exception,Rechnung Lieferposten Vorbehalt,0
@@ -158,7 +159,6 @@ model,"workflow.activity,name",sale_activity_waiting_invoice_sale,Waiting Invoic
 model,"workflow.activity,name",sale_activity_waiting_invoice_shipment,Waiting Invoice Shipment,Rechnung Lieferposten Wartend,0
 model,"workflow.activity,name",sale_activity_waiting_shipment,Waiting Shipment,Lieferposten wartend,0
 model,"workflow.activity,name",sale_activity_waiting_shipment_invoice,Waiting Shipment Invoice,Lieferposten Rechnung wartend,0
-model,"workflow,name",sale_workflow,Sale workflow,Workflow Verkauf,0
 odt,sale.sale,0,Amount,Betrag,0
 odt,sale.sale,0,Date:,Datum:,0
 odt,sale.sale,0,Description,Bezeichnung,0
@@ -171,9 +171,10 @@ odt,sale.sale,0,Quotation N°:,Angebot Nr.:,0
 odt,sale.sale,0,Sale Order N°:,Auftrag Nr.:,0
 odt,sale.sale,0,Taxes,Steuern,0
 odt,sale.sale,0,Taxes:,Steuern:,0
-odt,sale.sale,0,Total:,Gesamt:,0
 odt,sale.sale,0,Total (excl. taxes):,Netto:,0
+odt,sale.sale,0,Total:,Gesamt:,0
 odt,sale.sale,0,Unit Price,Einzelpreis,0
+odt,sale.sale,0,VAT Number:,USt-ID-Nr.:,0
 odt,sale.sale,0,VAT:,USt:,0
 selection,"account.invoice,sale_exception_state",0,,,0
 selection,"account.invoice,sale_exception_state",0,Ignored,Ignoriert,0
diff --git a/fr_FR.csv b/fr_FR.csv
index 11fba76..13830da 100644
--- a/fr_FR.csv
+++ b/fr_FR.csv
@@ -1,8 +1,8 @@
 type,name,res_id,src,value,fuzzy
 error,account.invoice,0,You can not delete invoices that come from a sale!,Vous ne pouvez pas supprimer une facture qui provient d'une vente,0
 error,account.invoice,0,You cannot reset to draft an invoice generated by a sale.,Vous ne pouvez pas réinitialiser une facture générée par une vente.,0
-error,sale.line,0,"It misses an ""account Revenue"" default property!","il manque une propriété par défaut ""compte de produits"" !",0
 error,sale.line,0,"It misses an ""Account Revenue"" on product ""%s""!","Il manque un compte de produits sur le produit ""%s"" !",0
+error,sale.line,0,"It misses an ""account Revenue"" default property!","il manque une propriété par défaut ""compte de produits"" !",0
 error,sale.line,0,The customer location is required!,L'emplacement client est requis !,0
 error,sale.sale,0,Invoice and Shipment addresses must be defined for the quotation.,Les adresses de facturation et d'expédition sont requises pour le devis.,0
 error,sale.sale,0,"It misses an ""Account Receivable"" on the party ""%s""!","Il manque un compte à recevoir sur le tiers ""%s"" !",0
@@ -17,17 +17,8 @@ field,"sale.handle.invoice.exception.ask,domain_invoices",0,Domain Invoices,Doma
 field,"sale.handle.invoice.exception.ask,recreate_invoices",0,Recreate Invoices,Recréer les factures,0
 field,"sale.handle.shipment.exception.ask,domain_moves",0,Domain Moves,Domaine des mouvements,0
 field,"sale.handle.shipment.exception.ask,recreate_moves",0,Recreate Moves,Recréer les mouvements,0
-field,"sale.line-account.invoice.line,invoice_line",0,Invoice Line,Ligne de facture,0
-field,"sale.line-account.invoice.line,rec_name",0,Name,Nom,0
-field,"sale.line-account.invoice.line,sale_line",0,Sale Line,Ligne de vente,0
-field,"sale.line-account.tax,line",0,Sale Line,Ligne de vente,0
-field,"sale.line-account.tax,rec_name",0,Name,Nom,0
-field,"sale.line-account.tax,tax",0,Tax,Taxe,0
 field,"sale.line,amount",0,Amount,Montant,0
 field,"sale.line,description",0,Description,Description,0
-field,"sale.line-ignored-stock.move,move",0,Move,Mouvement,0
-field,"sale.line-ignored-stock.move,rec_name",0,Name,Nom,0
-field,"sale.line-ignored-stock.move,sale_line",0,Sale Line,Ligne de vente,0
 field,"sale.line,invoice_lines",0,Invoice Lines,Lignes de facture,0
 field,"sale.line,move_done",0,Moves Done,Mouvements effectués,0
 field,"sale.line,move_exception",0,Moves Exception,Mouvements en exception,0
@@ -38,9 +29,6 @@ field,"sale.line,note",0,Note,Note,0
 field,"sale.line,product",0,Product,Produit,0
 field,"sale.line,quantity",0,Quantity,Quantité,0
 field,"sale.line,rec_name",0,Name,Nom,0
-field,"sale.line-recreated-stock.move,move",0,Move,Mouvement,0
-field,"sale.line-recreated-stock.move,rec_name",0,Name,Nom,0
-field,"sale.line-recreated-stock.move,sale_line",0,Sale Line,Ligne de vente,0
 field,"sale.line,sale",0,Sale,Vente,0
 field,"sale.line,sequence",0,Sequence,Séquence,0
 field,"sale.line,taxes",0,Taxes,Taxes,0
@@ -48,97 +36,110 @@ field,"sale.line,type",0,Type,Type,0
 field,"sale.line,unit",0,Unit,Unité,0
 field,"sale.line,unit_digits",0,Unit Digits,Décimales de l'unité,0
 field,"sale.line,unit_price",0,Unit Price,Prix unitaire,0
-field,"sale.sale-account.invoice,invoice",0,Invoice,Facture,0
-field,"sale.sale-account.invoice,rec_name",0,Name,Nom,0
-field,"sale.sale-account.invoice,sale",0,Sale,Vente,0
+field,"sale.line-account.invoice.line,invoice_line",0,Invoice Line,Ligne de facture,0
+field,"sale.line-account.invoice.line,rec_name",0,Name,Nom,0
+field,"sale.line-account.invoice.line,sale_line",0,Sale Line,Ligne de vente,0
+field,"sale.line-account.tax,line",0,Sale Line,Ligne de vente,0
+field,"sale.line-account.tax,rec_name",0,Name,Nom,0
+field,"sale.line-account.tax,tax",0,Tax,Taxe,0
+field,"sale.line-ignored-stock.move,move",0,Move,Mouvement,0
+field,"sale.line-ignored-stock.move,rec_name",0,Name,Nom,0
+field,"sale.line-ignored-stock.move,sale_line",0,Sale Line,Ligne de vente,0
+field,"sale.line-recreated-stock.move,move",0,Move,Mouvement,0
+field,"sale.line-recreated-stock.move,rec_name",0,Name,Nom,0
+field,"sale.line-recreated-stock.move,sale_line",0,Sale Line,Ligne de vente,0
 field,"sale.sale,comment",0,Comment,Commentaire,0
 field,"sale.sale,company",0,Company,Companie,0
 field,"sale.sale,currency",0,Currency,Devise,0
 field,"sale.sale,currency_digits",0,Currency Digits,Décimales de la devise,0
 field,"sale.sale,description",0,Description,Description,0
-field,"sale.sale-ignored-account.invoice,invoice",0,Invoice,Facture,0
-field,"sale.sale-ignored-account.invoice,rec_name",0,Name,Nom,0
-field,"sale.sale-ignored-account.invoice,sale",0,Sale,Vente,0
 field,"sale.sale,invoice_address",0,Invoice Address,Adresse de facturation,0
 field,"sale.sale,invoice_exception",0,Invoices Exception,Factures en exception,0
 field,"sale.sale,invoice_method",0,Invoice Method,Méthode de facturation,0
 field,"sale.sale,invoice_paid",0,Invoices Paid,Factures payées,0
+field,"sale.sale,invoice_state",0,Invoice State,État de la factutre,0
 field,"sale.sale,invoices",0,Invoices,Factures,0
 field,"sale.sale,invoices_ignored",0,Ignored Invoices,Factures ignorées,0
 field,"sale.sale,invoices_recreated",0,Recreated Invoices,Factures recréées,0
-field,"sale.sale,invoice_state",0,Invoice State,État de la factutre,0
 field,"sale.sale,lines",0,Lines,Lignes,0
 field,"sale.sale,moves",0,Moves,Mouvements,0
 field,"sale.sale,party",0,Party,Tiers,0
 field,"sale.sale,party_lang",0,Party Language,Langue du tiers,0
 field,"sale.sale,payment_term",0,Payment Term,Conditions de paiement,0
 field,"sale.sale,rec_name",0,Name,Nom,0
-field,"sale.sale-recreated-account.invoice,invoice",0,Invoice,Facture,0
-field,"sale.sale-recreated-account.invoice,rec_name",0,Name,Nom,0
-field,"sale.sale-recreated-account.invoice,sale",0,Sale,Vente,0
 field,"sale.sale,reference",0,Reference,Référence,0
 field,"sale.sale,sale_date",0,Sale Date,Date de la vente,0
 field,"sale.sale,shipment_address",0,Shipment Address,Adresse de livraison,0
 field,"sale.sale,shipment_done",0,Shipment Done,Expédition effectuée,0
 field,"sale.sale,shipment_exception",0,Shipments Exception,Expéditions en exception,0
 field,"sale.sale,shipment_method",0,Shipment Method,Méthode de livraison,0
-field,"sale.sale,shipments",0,Shipments,Expédition,0
 field,"sale.sale,shipment_state",0,Shipment State,État de l'expédition,0
+field,"sale.sale,shipments",0,Shipments,Expédition,0
 field,"sale.sale,state",0,State,État,0
 field,"sale.sale,tax_amount",0,Tax,Taxe,0
 field,"sale.sale,total_amount",0,Total,Total,0
 field,"sale.sale,untaxed_amount",0,Untaxed,Non-taxé,0
 field,"sale.sale,warehouse",0,Warehouse,Entrepôt,0
+field,"sale.sale-account.invoice,invoice",0,Invoice,Facture,0
+field,"sale.sale-account.invoice,rec_name",0,Name,Nom,0
+field,"sale.sale-account.invoice,sale",0,Sale,Vente,0
+field,"sale.sale-ignored-account.invoice,invoice",0,Invoice,Facture,0
+field,"sale.sale-ignored-account.invoice,rec_name",0,Name,Nom,0
+field,"sale.sale-ignored-account.invoice,sale",0,Sale,Vente,0
+field,"sale.sale-recreated-account.invoice,invoice",0,Invoice,Facture,0
+field,"sale.sale-recreated-account.invoice,rec_name",0,Name,Nom,0
+field,"sale.sale-recreated-account.invoice,sale",0,Sale,Vente,0
 field,"stock.move,sale",0,Sale,Vente,0
 field,"stock.move,sale_exception_state",0,Exception State,État d'exception,0
 field,"stock.move,sale_line",0,Sale Line,Ligne de vente,0
 help,"sale.handle.invoice.exception.ask,recreate_invoices",0,The selected invoices will be recreated. The other ones will be ignored.,Les factures sélectionnées seront recréés. Les autres seront ignorées.,0
-model,"ir.action,name",act_sale_form_confirmed,Confirmed Sales,Ventes confirmées,0
-model,"ir.action,name",act_sale_form_draft,Draft Sales,Ventes brouillon,0
-model,"ir.action,name",wizard_invoice_handle_exception,Handle Invoice Exception,Gérer l'exception de facture,0
-model,"ir.action,name",wizard_shipment_handle_exception,Handle Shipment Exception,Gérer l'exception d'expédition,0
 model,"ir.action,name",act_invoice_form,Invoices,Factures,0
-model,"ir.action,name",act_sale_form_new,New Sale,Nouvelle vente,0
 model,"ir.action,name",act_open_customer,Parties associated to Sales,Tiers associés à des ventes,0
-model,"ir.action,name",act_sale_form_quotation,Quotation Sales,Devis,0
-model,"ir.action,name",report_sale,Sale,Vente,0
 model,"ir.action,name",act_sale_configuration_form,Sale Configuration,Configuration des ventes,0
 model,"ir.action,name",act_sale_form,Sales,Ventes,0
 model,"ir.action,name",act_sale_form2,Sales,Ventes,0
+model,"ir.action,name",act_sale_form_confirmed,Confirmed Sales,Ventes confirmées,0
+model,"ir.action,name",act_sale_form_draft,Draft Sales,Ventes brouillon,0
+model,"ir.action,name",act_sale_form_new,New Sale,Nouvelle vente,0
+model,"ir.action,name",act_sale_form_quotation,Quotation Sales,Devis,0
 model,"ir.action,name",act_shipment_form,Shipments,Expéditions,0
+model,"ir.action,name",report_sale,Sale,Vente,0
+model,"ir.action,name",wizard_invoice_handle_exception,Handle Invoice Exception,Gérer l'exception de facture,0
+model,"ir.action,name",wizard_shipment_handle_exception,Handle Shipment Exception,Gérer l'exception d'expédition,0
 model,"ir.sequence,name",sequence_sale,Sale,Vente,0
 model,"ir.sequence.type,name",sequence_type_sale,Sale,Vente,0
 model,"ir.ui.menu,name",menu_configuration,Configuration,Configuration,0
+model,"ir.ui.menu,name",menu_customer,Parties associated to Sales,Tiers associés à des ventes,0
+model,"ir.ui.menu,name",menu_sale,Sale Management,Gestion des ventes,0
+model,"ir.ui.menu,name",menu_sale_configuration,Sale Configuration,Configuration des ventes,0
+model,"ir.ui.menu,name",menu_sale_form,Sales,Ventes,0
 model,"ir.ui.menu,name",menu_sale_form_confirmed,Confirmed Sales,Ventes confirmées,0
 model,"ir.ui.menu,name",menu_sale_form_draft,Draft Sales,Ventes brouillons,0
 model,"ir.ui.menu,name",menu_sale_form_new,New Sale,Nouvelle vente,0
-model,"ir.ui.menu,name",menu_customer,Parties associated to Sales,Tiers associés à des ventes,0
 model,"ir.ui.menu,name",menu_sale_form_quotation,Quotation Sales,Devis,0
-model,"ir.ui.menu,name",menu_sale_configuration,Sale Configuration,Configuration des ventes,0
-model,"ir.ui.menu,name",menu_sale,Sale Management,Gestion des ventes,0
-model,"ir.ui.menu,name",menu_sale_form,Sales,Ventes,0
 model,"res.group,name",group_sale,Sale,Vente,0
 model,"res.group,name",group_sale_admin,Sale Administrator,Administrateur des ventes,0
-model,"sale.configuration,name",0,sale.configuration,,0
+model,"sale.configuration,name",0,Sale Configuration,Configuration des ventes,0
 model,"sale.handle.invoice.exception.ask,name",0,Invoice Exception Ask,Exception de facture - Demande,0
 model,"sale.handle.shipment.exception.ask,name",0,Shipment Exception Ask,Exception d'expédition - Demande,0
+model,"sale.line,name",0,Sale Line,Ligne de vente,0
 model,"sale.line-account.invoice.line,name",0,Sale Line - Invoice Line,Ligne de vente - Ligne de facture,0
 model,"sale.line-account.tax,name",0,Sale Line - Tax,Ligne de vente - Taxe,0
 model,"sale.line-ignored-stock.move,name",0,Sale Line - Ignored Move,Ligne de vente - Mouvement ignoré,0
-model,"sale.line,name",0,Sale Line,Ligne de vente,0
 model,"sale.line-recreated-stock.move,name",0,Sale Line - Recreated Move,Ligne de vente - Mouvement recréé,0
+model,"sale.sale,name",0,Sale,Vente,0
 model,"sale.sale-account.invoice,name",0,Sale - Invoice,Vente - Facture,0
 model,"sale.sale-ignored-account.invoice,name",0,Sale - Ignored Invoice,Vente - Facture Ignorée,0
-model,"sale.sale,name",0,Sale,Vente,0
 model,"sale.sale-recreated-account.invoice,name",0,Sale - Recreated Invoice,Vente - Facture recréée,0
+model,"workflow,name",sale_workflow,Sale workflow,Workflow de vente,0
 model,"workflow.activity,name",sale_activity_cancel,Canceled,Annulé,0
 model,"workflow.activity,name",sale_activity_confirmed,Confirmed,Confirmé,0
 model,"workflow.activity,name",sale_activity_done,Done,Fait,0
 model,"workflow.activity,name",sale_activity_draft,Draft,Brouillon,0
-model,"workflow.activity,name",sale_activity_invoice_sale_done,Invoice Done,Facture faite,0
-model,"workflow.activity,name",sale_activity_invoice_sale_exception,Invoice Exception,Facture en exception,0
 model,"workflow.activity,name",sale_activity_invoice_method,Invoice Method,Méthode de facturation,0
 model,"workflow.activity,name",sale_activity_invoice_method_done,Invoice Method Done,Méthode de facture faite,0
+model,"workflow.activity,name",sale_activity_invoice_sale_done,Invoice Done,Facture faite,0
+model,"workflow.activity,name",sale_activity_invoice_sale_exception,Invoice Exception,Facture en exception,0
 model,"workflow.activity,name",sale_activity_invoice_shipment,Invoice Shipment,Facture expédition,0
 model,"workflow.activity,name",sale_activity_invoice_shipment_done,Invoice Shipment Done,Facture expédition faite,0
 model,"workflow.activity,name",sale_activity_invoice_shipment_exception,Invoice Shipment Exception,Facture expédition en exception,0
@@ -158,7 +159,6 @@ model,"workflow.activity,name",sale_activity_waiting_invoice_sale,Waiting Invoic
 model,"workflow.activity,name",sale_activity_waiting_invoice_shipment,Waiting Invoice Shipment,Facture expédition en attente,0
 model,"workflow.activity,name",sale_activity_waiting_shipment,Waiting Shipment,Expédition en attente,0
 model,"workflow.activity,name",sale_activity_waiting_shipment_invoice,Waiting Shipment Invoice,Facture expédition en attente,0
-model,"workflow,name",sale_workflow,Sale workflow,Workflow de vente,0
 odt,sale.sale,0,Amount,Montant,0
 odt,sale.sale,0,Date:,Date :,0
 odt,sale.sale,0,Description,Description,0
@@ -171,9 +171,10 @@ odt,sale.sale,0,Quotation N°:,Devis N° :,0
 odt,sale.sale,0,Sale Order N°:,Bon de commande N° :,0
 odt,sale.sale,0,Taxes,Taxes,0
 odt,sale.sale,0,Taxes:,Taxes :,0
-odt,sale.sale,0,Total:,Total :,0
 odt,sale.sale,0,Total (excl. taxes):,Total (HT) :,0
+odt,sale.sale,0,Total:,Total :,0
 odt,sale.sale,0,Unit Price,Prix unitaire,0
+odt,sale.sale,0,VAT Number:,Numéro TVA :,0
 odt,sale.sale,0,VAT:,TVA :,0
 selection,"account.invoice,sale_exception_state",0,,,0
 selection,"account.invoice,sale_exception_state",0,Ignored,Ignoré,0
diff --git a/sale.py b/sale.py
index c201ed1..4467680 100644
--- a/sale.py
+++ b/sale.py
@@ -1,15 +1,15 @@
 #This file is part of Tryton.  The COPYRIGHT file at the top level of
 #this repository contains the full copyright notices and license terms.
-"Sale"
+from __future__ import with_statement
+import copy
+from decimal import Decimal
 from trytond.model import ModelWorkflow, ModelView, ModelSQL, fields
 from trytond.modules.company import CompanyReport
 from trytond.wizard import Wizard
 from trytond.backend import TableHandler
 from trytond.pyson import If, In, Eval, Get, Or, Not, Equal, Bool, And, \
         PYSONEncoder
-from decimal import Decimal
-import copy
-
+from trytond.transaction import Transaction
 
 class Sale(ModelWorkflow, ModelSQL, ModelView):
     'Sale'
@@ -46,7 +46,7 @@ class Sale(ModelWorkflow, ModelSQL, ModelView):
                 'readonly': Not(Equal(Eval('state'), 'draft')),
             })
     party = fields.Many2One('party.party', 'Party', change_default=True,
-            required=True, states={
+            required=True, select=1, states={
                 'readonly': Not(Equal(Eval('state'), 'draft')),
             }, on_change=['party', 'payment_term'])
     party_lang = fields.Function(fields.Char('Party Language',
@@ -136,20 +136,21 @@ class Sale(ModelWorkflow, ModelSQL, ModelView):
             'wrong_method': 'Wrong combination of method!',
             'addresses_required': 'Invoice and Shipment addresses must be '
             'defined for the quotation.',
-            'missing_account_receivable': 'It misses ' \
+            'missing_account_receivable': 'It misses ' 
                     'an "Account Receivable" on the party "%s"!',
         })
 
-    def init(self, cursor, module_name):
+    def init(self, module_name):
+        cursor = Transaction().cursor
         # Migration from 1.2: packing renamed into shipment
-        cursor.execute("UPDATE ir_model_data "\
-                "SET fs_id = REPLACE(fs_id, 'packing', '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'), "\
+        cursor.execute("UPDATE ir_model_field "
+                "SET relation = REPLACE(relation, 'packing', 'shipment'), "
                     "name = REPLACE(name, 'packing', 'shipment') "
-                "WHERE (relation like '%%packing%%' "\
+                "WHERE (relation like '%%packing%%' "
                     "OR name like '%%packing%%') AND module = %s",
                 (module_name,))
         table = TableHandler(cursor, self, module_name)
@@ -157,83 +158,69 @@ class Sale(ModelWorkflow, ModelSQL, ModelView):
         table.column_rename('packing_method', 'shipment_method')
         table.column_rename('packing_address', 'shipment_address')
 
-        super(Sale, self).init(cursor, module_name)
+        super(Sale, self).init(module_name)
 
         # Migration from 1.2
-        cursor.execute("UPDATE " + self._table + " "\
-                "SET invoice_method = 'shipment' "\
+        cursor.execute("UPDATE " + self._table + " "
+                "SET invoice_method = 'shipment' "
                 "WHERE invoice_method = 'packing'")
 
         # Add index on create_date
         table = TableHandler(cursor, self, module_name)
         table.index_action('create_date', action='add')
 
-    def default_payment_term(self, cursor, user, context=None):
+    def default_payment_term(self):
         payment_term_obj = self.pool.get('account.invoice.payment_term')
-        payment_term_ids = payment_term_obj.search(cursor, user,
-                self.payment_term.domain, context=context)
+        payment_term_ids = payment_term_obj.search(self.payment_term.domain)
         if len(payment_term_ids) == 1:
             return payment_term_ids[0]
         return False
 
-    def default_warehouse(self, cursor, user, context=None):
+    def default_warehouse(self):
         location_obj = self.pool.get('stock.location')
-        location_ids = location_obj.search(cursor, user,
-                self.warehouse.domain, context=context)
+        location_ids = location_obj.search(self.warehouse.domain)
         if len(location_ids) == 1:
             return location_ids[0]
         return False
 
-    def default_company(self, cursor, user, context=None):
-        if context is None:
-            context = {}
-        if context.get('company'):
-            return context['company']
-        return False
+    def default_company(self):
+        return Transaction().context.get('company') or False
 
-    def default_state(self, cursor, user, context=None):
+    def default_state(self):
         return 'draft'
 
-    def default_sale_date(self, cursor, user, context=None):
+    def default_sale_date(self):
         date_obj = self.pool.get('ir.date')
-        return date_obj.today(cursor, user, context=context)
+        return date_obj.today()
 
-    def default_currency(self, cursor, user, context=None):
+    def default_currency(self):
         company_obj = self.pool.get('company.company')
         currency_obj = self.pool.get('currency.currency')
-        if context is None:
-            context = {}
-        company = None
-        if context.get('company'):
-            company = company_obj.browse(cursor, user, context['company'],
-                    context=context)
-            return company.currency.id
+        company = Transaction().context.get('company')
+        if company:
+            return company_obj.browse(company).currency.id
         return False
 
-    def default_currency_digits(self, cursor, user, context=None):
+    def default_currency_digits(self):
         company_obj = self.pool.get('company.company')
-        if context is None:
-            context = {}
-        company = None
-        if context.get('company'):
-            company = company_obj.browse(cursor, user, context['company'],
-                    context=context)
-            return company.currency.digits
+        company = Transaction().context.get('company')
+        if company:
+            return company_obj.browse(company).currency.digits
         return 2
 
-    def default_invoice_method(self, cursor, user, context=None):
+    def default_invoice_method(self):
         return 'order'
 
-    def default_invoice_state(self, cursor, user, context=None):
+    def default_invoice_state(self):
         return 'none'
 
-    def default_shipment_method(self, cursor, user, context=None):
+    def default_shipment_method(self):
         return 'order'
 
-    def default_shipment_state(self, cursor, user, context=None):
+    def default_shipment_state(self):
         return 'none'
 
-    def on_change_party(self, cursor, user, vals, context=None):
+    def on_change_party(self, vals):
         party_obj = self.pool.get('party.party')
         address_obj = self.pool.get('party.address')
         payment_term_obj = self.pool.get('account.invoice.payment_term')
@@ -243,45 +230,39 @@ class Sale(ModelWorkflow, ModelSQL, ModelView):
             'payment_term': False,
         }
         if vals.get('party'):
-            party = party_obj.browse(cursor, user, vals['party'],
-                    context=context)
-            res['invoice_address'] = party_obj.address_get(cursor, user,
-                    party.id, type='invoice', context=context)
-            res['shipment_address'] = party_obj.address_get(cursor, user,
-                    party.id, type='delivery', context=context)
+            party = party_obj.browse(vals['party'])
+            res['invoice_address'] = party_obj.address_get(party.id, 
+                    type='invoice')
+            res['shipment_address'] = party_obj.address_get(party.id, 
+                    type='delivery')
             if party.payment_term:
                 res['payment_term'] = party.payment_term.id
 
         if res['invoice_address']:
-            res['invoice_address.rec_name'] = address_obj.browse(cursor, user,
-                    res['invoice_address'], context=context).rec_name
+            res['invoice_address.rec_name'] = address_obj.browse(
+                    res['invoice_address']).rec_name
         if res['shipment_address']:
-            res['shipment_address.rec_name'] = address_obj.browse(cursor, user,
-                    res['shipment_address'], context=context).rec_name
+            res['shipment_address.rec_name'] = address_obj.browse(
+                    res['shipment_address']).rec_name
         if not res['payment_term']:
-            res['payment_term'] = self.default_payment_term(cursor, user,
-                    context=context)
+            res['payment_term'] = self.default_payment_term()
         if res['payment_term']:
-            res['payment_term.rec_name'] = payment_term_obj.browse(cursor, user,
-                    res['payment_term'], context=context).rec_name
+            res['payment_term.rec_name'] = payment_term_obj.browse(
+                    res['payment_term']).rec_name
         return res
 
-    def on_change_with_currency_digits(self, cursor, user, vals, context=None):
+    def on_change_with_currency_digits(self, vals):
         currency_obj = self.pool.get('currency.currency')
         if vals.get('currency'):
-            currency = currency_obj.browse(cursor, user, vals['currency'],
-                    context=context)
+            currency = currency_obj.browse(vals['currency'])
             return currency.digits
         return 2
 
-    def get_currency_digits(self, cursor, user, sales, context=None):
+    def get_currency_digits(self, sales):
         '''
         Return the number of digits of the currency of each sales
 
-        :param cursor: the database cursor
-        :param user: the user id
         :param sales: a BrowseRecordList of puchases
-        :param context: the context
         :return: a dictionary with sale id as key and
             number of digits as value
         '''
@@ -290,13 +271,12 @@ class Sale(ModelWorkflow, ModelSQL, ModelView):
             res[sale.id] = sale.currency.digits
         return res
 
-    def get_tax_context(self, cursor, user, sale, context=None):
+    def get_tax_context(self, sale):
         party_obj = self.pool.get('party.party')
         res = {}
         if isinstance(sale, dict):
             if sale.get('party'):
-                party = party_obj.browse(cursor, user, sale['party'],
-                        context=context)
+                party = party_obj.browse(sale['party'])
                 if party.lang:
                     res['language'] = party.lang.code
         else:
@@ -304,24 +284,19 @@ class Sale(ModelWorkflow, ModelSQL, ModelView):
                 res['language'] = sale.party.lang.code
         return res
 
-    def on_change_with_party_lang(self, cursor, user, vals,
-            context=None):
+    def on_change_with_party_lang(self, vals):
         party_obj = self.pool.get('party.party')
         if vals.get('party'):
-            party = party_obj.browse(cursor, user, vals['party'],
-                    context=context)
+            party = party_obj.browse(vals['party'])
             if party.lang:
                 return party.lang.code
         return 'en_US'
 
-    def get_party_lang(self, cursor, user, sales, context=None):
+    def get_party_lang(self, sales):
         '''
         Return the code lang of the party for each sales
 
-        :param cursor: the database cursor
-        :param user: the user id
         :param sales: a BrowseRecordList of sales
-        :param context: the context
         :return: a dictionary with sale id as key and
             code lang as value
         '''
@@ -334,14 +309,11 @@ class Sale(ModelWorkflow, ModelSQL, ModelView):
         return res
 
 
-    def on_change_lines(self, cursor, user, vals, context=None):
+    def on_change_lines(self, vals):
         currency_obj = self.pool.get('currency.currency')
         tax_obj = self.pool.get('account.tax')
         invoice_obj = self.pool.get('account.invoice')
 
-        if context is None:
-            context = {}
-
         res = {
             'untaxed_amount': Decimal('0.0'),
             'tax_amount': Decimal('0.0'),
@@ -350,99 +322,80 @@ class Sale(ModelWorkflow, ModelSQL, ModelView):
 
         currency = None
         if vals.get('currency'):
-            currency = currency_obj.browse(cursor, user, vals['currency'],
-                    context=context)
+            currency = currency_obj.browse(vals['currency'])
 
         if vals.get('lines'):
-            ctx = context.copy()
-            ctx.update(self.get_tax_context(cursor, user, vals,
-                context=context))
             taxes = {}
             for line in vals['lines']:
                 if line.get('type', 'line') != 'line':
                     continue
                 res['untaxed_amount'] += line.get('amount', Decimal('0.0'))
-
-                for tax in tax_obj.compute(cursor, user, line.get('taxes', []),
-                        line.get('unit_price', Decimal('0.0')),
-                        line.get('quantity', 0.0), context=context):
-                    key, val = invoice_obj._compute_tax(cursor, user, tax,
-                            'out_invoice', context=context)
+                tax_list = ()
+                with Transaction().set_context(self.get_tax_context(vals)):
+                    tax_list = tax_obj.compute(line.get('taxes', []),
+                            line.get('unit_price', Decimal('0.0')),
+                            line.get('quantity', 0.0))
+                for tax in tax_list:
+                    key, val = invoice_obj._compute_tax(tax,'out_invoice')
                     if not key in taxes:
                         taxes[key] = val['amount']
                     else:
                         taxes[key] += val['amount']
             if currency:
                 for key in taxes:
-                    res['tax_amount'] += currency_obj.round(cursor, user,
-                            currency, taxes[key])
+                    res['tax_amount'] += currency_obj.round(currency, 
+                            taxes[key])
         if currency:
-            res['untaxed_amount'] = currency_obj.round(cursor, user, currency,
+            res['untaxed_amount'] = currency_obj.round(currency,
                     res['untaxed_amount'])
-            res['tax_amount'] = currency_obj.round(cursor, user, currency,
+            res['tax_amount'] = currency_obj.round(currency,
                     res['tax_amount'])
         res['total_amount'] = res['untaxed_amount'] + res['tax_amount']
         if currency:
-            res['total_amount'] = currency_obj.round(cursor, user, currency,
+            res['total_amount'] = currency_obj.round(currency,
                     res['total_amount'])
         return res
 
-    def get_function_fields(self, cursor, user, ids, names, context=None):
+    def get_function_fields(self, ids, names):
         '''
         Function to compute function fields for sale ids
 
-        :param cursor: the database cursor
-        :param user: the user id
         :param ids: the ids of the sales
         :param names: the list of field name to compute
-        :param context: the context
         :return: a dictionary with all field names as key and
             a dictionary as value with id as key
         '''
         res = {}
-        sales = self.browse(cursor, user, ids, context=context)
+        sales = self.browse(ids)
         if 'currency_digits' in names:
-            res['currency_digits'] = self.get_currency_digits(cursor, user,
-                    sales, context=context)
+            res['currency_digits'] = self.get_currency_digits(sales)
         if 'party_lang' in names:
-            res['party_lang'] = self.get_party_lang(cursor, user, sales,
-                    context=context)
+            res['party_lang'] = self.get_party_lang(sales)
         if 'untaxed_amount' in names:
-            res['untaxed_amount'] = self.get_untaxed_amount(cursor, user,
-                    sales, context=context)
+            res['untaxed_amount'] = self.get_untaxed_amount(sales)
         if 'tax_amount' in names:
-            res['tax_amount'] = self.get_tax_amount(cursor, user, sales,
-                    context=context)
+            res['tax_amount'] = self.get_tax_amount(sales)
         if 'total_amount' in names:
-            res['total_amount'] = self.get_total_amount(cursor, user, sales,
-                    context=context)
+            res['total_amount'] = self.get_total_amount(sales)
         if 'invoice_paid' in names:
-            res['invoice_paid'] = self.get_invoice_paid(cursor, user, sales,
-                    context=context)
+            res['invoice_paid'] = self.get_invoice_paid(sales)
         if 'invoice_exception' in names:
-            res['invoice_exception'] = self.get_invoice_exception(cursor, user,
-                    sales, context=context)
+            res['invoice_exception'] = self.get_invoice_exception(sales)
         if 'shipments' in names:
-            res['shipments'] = self.get_shipments(cursor, user, sales,
-                    context=context)
+            res['shipments'] = self.get_shipments(sales)
         if 'moves' in names:
-            res['moves'] = self.get_moves(cursor, user, sales, context=context)
+            res['moves'] = self.get_moves(sales)
         if 'shipment_done' in names:
-            res['shipment_done'] = self.get_shipment_done(cursor, user, sales,
-                    context=context)
+            res['shipment_done'] = self.get_shipment_done(sales)
         if 'shipment_exception' in names:
-            res['shipment_exception'] = self.get_shipment_exception(cursor, user,
-                    sales, context=context)
+            res['shipment_exception'] = self.get_shipment_exception(sales)
         return res
 
-    def get_untaxed_amount(self, cursor, user, sales, context=None):
+    def get_untaxed_amount(self, sales):
         '''
         Compute the untaxed amount for each sales
 
-        :param cursor: the database cursor
-        :param user: the user id
         :param sales: a BrowseRecordList of sales
-        :param context: the context
         :return: a dictionary with sale id as key and
             untaxed amount as value
         '''
@@ -454,18 +407,14 @@ class Sale(ModelWorkflow, ModelSQL, ModelView):
                 if line.type != 'line':
                     continue
                 res[sale.id] += line.amount
-            res[sale.id] = currency_obj.round(cursor, user, sale.currency,
-                    res[sale.id])
+            res[sale.id] = currency_obj.round(sale.currency, res[sale.id])
         return res
 
-    def get_tax_amount(self, cursor, user, sales, context=None):
+    def get_tax_amount(self, sales):
         '''
         Compute tax amount for each sales
 
-        :param cursor: the database cursor
-        :param user: the user id
         :param sales: a BrowseRecordList of sales
-        :param context: the context
         :return: a dictionary with sale id as key and
             tax amount as value
         '''
@@ -473,65 +422,52 @@ class Sale(ModelWorkflow, ModelSQL, ModelView):
         tax_obj = self.pool.get('account.tax')
         invoice_obj = self.pool.get('account.invoice')
 
-        if context is None:
-            context = {}
         res = {}
         for sale in sales:
-            ctx = context.copy()
-            ctx.update(self.get_tax_context(cursor, user, sale,
-                context=context))
             res.setdefault(sale.id, Decimal('0.0'))
             taxes = {}
             for line in sale.lines:
                 if line.type != 'line':
                     continue
                 # Don't round on each line to handle rounding error
-                for tax in tax_obj.compute(cursor, user,
-                        [t.id for t in line.taxes], line.unit_price,
-                        line.quantity, context=ctx):
-                    key, val = invoice_obj._compute_tax(cursor, user, tax,
-                            'out_invoice', context=context)
+                tax_list = ()
+                with Transaction().set_context(self.get_tax_context(sale)):
+                    tax_list = tax_obj.compute(
+                            [t.id for t in line.taxes], line.unit_price,
+                            line.quantity)
+                for tax in tax_list:
+                    key, val = invoice_obj._compute_tax(tax, 'out_invoice')
                     if not key in taxes:
                         taxes[key] = val['amount']
                     else:
                         taxes[key] += val['amount']
             for key in taxes:
-                res[sale.id] += currency_obj.round(cursor, user,
-                        sale.currency, taxes[key])
-            res[sale.id] = currency_obj.round(cursor, user, sale.currency,
-                    res[sale.id])
+                res[sale.id] += currency_obj.round(sale.currency, taxes[key])
+            res[sale.id] = currency_obj.round(sale.currency, res[sale.id])
         return res
 
-    def get_total_amount(self, cursor, user, sales, context=None):
+    def get_total_amount(self, sales):
         '''
         Return the total amount of each sales
 
-        :param cursor: the database cursor
-        :param user: the user id
         :param sales: a BrowseRecordList of sales
-        :param context: the context
         :return: a dictionary with sale id as key and
             total amount as value
         '''
         currency_obj = self.pool.get('currency.currency')
         res = {}
-        untaxed_amounts = self.get_untaxed_amount(cursor, user, sales,
-                context=context)
-        tax_amounts = self.get_tax_amount(cursor, user, sales,
-                context=context)
+        untaxed_amounts = self.get_untaxed_amount(sales)
+        tax_amounts = self.get_tax_amount(sales)
         for sale in sales:
-            res[sale.id] = currency_obj.round(cursor, user, sale.currency,
+            res[sale.id] = currency_obj.round(sale.currency,
                     untaxed_amounts[sale.id] + tax_amounts[sale.id])
         return res
 
-    def get_invoice_paid(self, cursor, user, sales, context=None):
+    def get_invoice_paid(self, sales):
         '''
         Return if all invoices have been paid for each sales
 
-        :param cursor: the database cursor
-        :param user: the user id
         :param sales: a BrowseRecordList of sales
-        :param context: the context
         :return: a dictionary with sale id as key and
             a boolean as value
         '''
@@ -548,14 +484,11 @@ class Sale(ModelWorkflow, ModelSQL, ModelView):
             res[sale.id] = val
         return res
 
-    def get_invoice_exception(self, cursor, user, sales, context=None):
+    def get_invoice_exception(self, sales):
         '''
         Return if there is an invoice exception for each sales
 
-        :param cursor: the database cursor
-        :param user: the user id
         :param sales: a BrowseRecordList of sales
-        :param context: the context
         :return: a dictionary with sale id as key and
             a boolean as value
         '''
@@ -572,14 +505,11 @@ class Sale(ModelWorkflow, ModelSQL, ModelView):
             res[sale.id] = val
         return res
 
-    def get_shipments(self, cursor, user, sales, context=None):
+    def get_shipments(self, sales):
         '''
         Return shipment_out ids for each sales
 
-        :param cursor: the database cursor
-        :param user: the user id
         :param sales: a BrowseRecordList of sales
-        :param context: the context
         :return: a dictionary with sale id as key and
             a list of shipment_out id as value
         '''
@@ -593,14 +523,11 @@ class Sale(ModelWorkflow, ModelSQL, ModelView):
                             res[sale.id].append(move.shipment_out.id)
         return res
 
-    def get_moves(self, cursor, user, sales, context=None):
+    def get_moves(self, sales):
         '''
         Return move ids for each sales
 
-        :param cursor: the database cursor
-        :param user: the user id
         :param sales: a BrowseRecordList of sales
-        :param context: the context
         :return: a dictionary with sale id as key and
             a list of move ids as value
         '''
@@ -611,14 +538,11 @@ class Sale(ModelWorkflow, ModelSQL, ModelView):
                 res[sale.id].extend([x.id for x in line.moves])
         return res
 
-    def get_shipment_done(self, cursor, user, sales, context=None):
+    def get_shipment_done(self, sales):
         '''
         Return if all the shipments have been done for each sales
 
-        :param cursor: the database cursor
-        :param user: the user id
         :param sales: a BrowseRecordList of sales
-        :param context: the context
         :return: a dictionary with sale id as key and
             a boolean as value
         '''
@@ -632,14 +556,11 @@ class Sale(ModelWorkflow, ModelSQL, ModelView):
             res[sale.id] = val
         return res
 
-    def get_shipment_exception(self, cursor, user, sales, context=None):
+    def get_shipment_exception(self, sales):
         '''
         Return if there is a shipment exception for each sales
 
-        :param cursor: the database cursor
-        :param user: the user id
         :param sales: a BrowseRecordList of sales
-        :param context: the context
         :return: a dictionary with sale id as key and
             a boolean as value
         '''
@@ -653,11 +574,11 @@ class Sale(ModelWorkflow, ModelSQL, ModelView):
             res[sale.id] = val
         return res
 
-    def check_method(self, cursor, user, ids):
+    def check_method(self, ids):
         '''
         Check the methods.
         '''
-        for sale in self.browse(cursor, user, ids):
+        for sale in self.browse(ids):
             if sale.invoice_method == 'shipment' \
                     and sale.shipment_method in ('invoice', 'manual'):
                 return False
@@ -666,23 +587,23 @@ class Sale(ModelWorkflow, ModelSQL, ModelView):
                 return False
         return True
 
-    def get_rec_name(self, cursor, user, ids, name, context=None):
+    def get_rec_name(self, ids, name):
         if not ids:
             return []
         res = {}
-        for sale in self.browse(cursor, user, ids, context=context):
+        for sale in self.browse(ids):
             res[sale.id] = sale.reference or str(sale.id) \
                     + ' - ' + sale.party.rec_name
         return res
 
-    def search_rec_name(self, cursor, user, name, clause, context=None):
+    def search_rec_name(self, name, clause):
         names = clause[2].split(' - ', 1)
         res = [('reference', clause[1], names[0])]
         if len(names) != 1 and names[1]:
             res.append(('party', clause[1], names[1]))
         return res
 
-    def copy(self, cursor, user, ids, default=None, context=None):
+    def copy(self, ids, default=None):
         if default is None:
             default = {}
         default = default.copy()
@@ -692,50 +613,42 @@ class Sale(ModelWorkflow, ModelSQL, ModelView):
         default['invoices'] = False
         default['invoices_ignored'] = False
         default['shipment_state'] = 'none'
-        return super(Sale, self).copy(cursor, user, ids, default=default,
-                context=context)
+        return super(Sale, self).copy(ids, default=default)
 
-    def check_for_quotation(self, cursor, user, sale_id, context=None):
-        sale = self.browse(cursor, user, sale_id, context=context)
+    def check_for_quotation(self, sale_id):
+        sale = self.browse(sale_id)
         if not sale.invoice_address or not sale.shipment_address:
-            self.raise_user_error(cursor, 'addresses_required', context=context)
+            self.raise_user_error('addresses_required')
         return True
 
-    def set_reference(self, cursor, user, sale_id, context=None):
+    def set_reference(self, sale_id):
         '''
         Fill the reference field with the sale sequence
 
-        :param cursor: the database cursor
-        :param user: the user id
         :param sale_id: the id of the sale
-        :param context: the context
 
         :return: True if succeed
         '''
         sequence_obj = self.pool.get('ir.sequence')
         config_obj = self.pool.get('sale.configuration')
 
-        sale = self.browse(cursor, user, sale_id, context=context)
+        sale = self.browse(sale_id)
 
         if sale.reference:
             return True
 
-        config = config_obj.browse(cursor, user, 1, context=context)
-        reference = sequence_obj.get_id(cursor, user, config.sale_sequence.id,
-                context=context)
-        self.write(cursor, user, sale_id, {
+        config = config_obj.browse(1)
+        reference = sequence_obj.get_id(config.sale_sequence.id)
+        self.write(sale_id, {
             'reference': reference,
-            }, context=context)
+            })
         return True
 
-    def _get_invoice_line_sale_line(self, cursor, user, sale, context=None):
+    def _get_invoice_line_sale_line(self, sale):
         '''
         Return invoice line values for each sale lines
 
-        :param cursor: the database cursor
-        :param user: the user id
         :param sale: the BrowseRecord of the sale
-        :param context: the context
 
         :return: a dictionary with invoice line as key
             and a list of invoice lines values as value
@@ -743,29 +656,25 @@ class Sale(ModelWorkflow, ModelSQL, ModelView):
         line_obj = self.pool.get('sale.line')
         res = {}
         for line in sale.lines:
-            val = line_obj.get_invoice_line(cursor, user, line,
-                    context=context)
+            val = line_obj.get_invoice_line(line)
             if val:
                 res[line.id] = val
         return res
 
-    def _get_invoice_sale(self, cursor, user, sale, context=None):
+    def _get_invoice_sale(self, sale):
         '''
         Return invoice values for sale
 
-        :param cursor: the database cursor
-        :param user: the user id
         :param sale: the BrowseRecord of the sale
-        :param context: the context
 
         :return: a dictionary with invoice fields as key and
             invoice values as value
         '''
         journal_obj = self.pool.get('account.journal')
 
-        journal_id = journal_obj.search(cursor, user, [
+        journal_id = journal_obj.search([
             ('type', '=', 'revenue'),
-            ], limit=1, context=context)
+            ], limit=1)
         if journal_id:
             journal_id = journal_id[0]
 
@@ -782,14 +691,11 @@ class Sale(ModelWorkflow, ModelSQL, ModelView):
             }
         return res
 
-    def create_invoice(self, cursor, user, sale_id, context=None):
+    def create_invoice(self, sale_id):
         '''
         Create an invoice for the sale
 
-        :param cursor: the database cursor
-        :param user: the user id
         :param sale_id: the sale id
-        :param context: the context
 
         :return: the created invoice id or None
         '''
@@ -797,69 +703,59 @@ class Sale(ModelWorkflow, ModelSQL, ModelView):
         invoice_line_obj = self.pool.get('account.invoice.line')
         sale_line_obj = self.pool.get('sale.line')
 
-        if context is None:
-            context = {}
-
-        sale = self.browse(cursor, user, sale_id, context=context)
+        sale = self.browse(sale_id)
 
         if not sale.party.account_receivable:
-            self.raise_user_error(cursor, 'missing_account_receivable',
-                    error_args=(sale.party.rec_name,), context=context)
+            self.raise_user_error('missing_account_receivable',
+                    error_args=(sale.party.rec_name,))
 
-        invoice_lines = self._get_invoice_line_sale_line(cursor, user, sale,
-                context=context)
+        invoice_lines = self._get_invoice_line_sale_line(sale)
         if not invoice_lines:
             return
 
 
-        ctx = context.copy()
-        ctx['user'] = user
-        vals = self._get_invoice_sale(cursor, user, sale, context=context)
-        invoice_id = invoice_obj.create(cursor, 0, vals, context=ctx)
+        vals = self._get_invoice_sale(sale)
+        with Transaction().set_user(0, set_context=True):
+            invoice_id = invoice_obj.create(vals)
 
         for line_id in invoice_lines:
             for vals in invoice_lines[line_id]:
                 vals['invoice'] = invoice_id
-                invoice_line_id = invoice_line_obj.create(cursor, 0, vals,
-                        context=ctx)
-                sale_line_obj.write(cursor, user, line_id, {
+                with Transaction().set_user(0, set_context=True):
+                    invoice_line_id = invoice_line_obj.create(vals)
+                sale_line_obj.write(line_id, {
                     'invoice_lines': [('add', invoice_line_id)],
-                    }, context=context)
+                    })
 
-        invoice_obj.update_taxes(cursor, 0, [invoice_id], context=ctx)
+        with Transaction().set_user(0, set_context=True):
+            invoice_obj.update_taxes([invoice_id])
 
-        self.write(cursor, user, sale_id, {
+        self.write(sale_id, {
             'invoices': [('add', invoice_id)],
-        }, context=context)
+        })
         return invoice_id
 
-    def _get_move_sale_line(self, cursor, user, sale, context=None):
+    def _get_move_sale_line(self, sale):
         '''
         Return a dictionary of move values for each sale lines
 
-        :param cursor: the database cursor
-        :param user: the user id
         :param sale: the BrowseRecord of the sale
-        :param context: the context
 
         :return: a dictionary with move as key and move values as value
         '''
         line_obj = self.pool.get('sale.line')
         res = {}
         for line in sale.lines:
-            val = line_obj.get_move(cursor, user, line, context=context)
+            val = line_obj.get_move(line)
             if val:
                 res[line.id] = val
         return res
 
-    def create_shipment(self, cursor, user, sale_id, context=None):
+    def create_shipment(self, sale_id):
         '''
         Create a shipment for the sale
 
-        :param cursor: the database cursor
-        :param user: the user id
         :param sale_id: the sale id
-        :param context: the context
 
         :return: the created shipment id or None
         '''
@@ -867,35 +763,30 @@ class Sale(ModelWorkflow, ModelSQL, ModelView):
         move_obj = self.pool.get('stock.move')
         sale_line_obj = self.pool.get('sale.line')
 
-        if context is None:
-            context = {}
+        sale = self.browse(sale_id)
 
-        sale = self.browse(cursor, user, sale_id, context=context)
-
-        moves = self._get_move_sale_line(cursor, user, sale, context=context)
+        moves = self._get_move_sale_line(sale)
         if not moves:
             return
 
-        ctx = context.copy()
-        ctx['user'] = user
-        shipment_id = shipment_obj.create(cursor, 0, {
-            'planned_date': sale.sale_date,
-            'customer': sale.party.id,
-            'delivery_address': sale.shipment_address.id,
-            'reference': sale.reference,
-            'warehouse': sale.warehouse.id,
-        }, context=ctx)
-
-        for line_id in moves:
-            vals = moves[line_id]
-            vals['shipment_out'] = shipment_id
-            move_id = move_obj.create(cursor, 0, vals, context=ctx)
-            sale_line_obj.write(cursor, 0, line_id, {
-                'moves': [('add', move_id)],
-                }, context=ctx)
-        shipment_obj.workflow_trigger_validate(cursor, 0, shipment_id,
-                'waiting', context=ctx)
-        return shipment_id
+        with Transaction().set_user(0, set_context=True):
+            shipment_id = shipment_obj.create({
+                'planned_date': sale.sale_date,
+                'customer': sale.party.id,
+                'delivery_address': sale.shipment_address.id,
+                'reference': sale.reference,
+                'warehouse': sale.warehouse.id,
+            })
+
+            for line_id in moves:
+                vals = moves[line_id]
+                vals['shipment_out'] = shipment_id
+                move_id = move_obj.create(vals)
+                sale_line_obj.write(line_id, {
+                    'moves': [('add', move_id)],
+                })
+                shipment_obj.workflow_trigger_validate(shipment_id, 'waiting')
+            return shipment_id
 
 Sale()
 
@@ -1028,52 +919,51 @@ class SaleLine(ModelSQL, ModelView):
         self._order.insert(0, ('sequence', 'ASC'))
         self._error_messages.update({
             'customer_location_required': 'The customer location is required!',
-            'missing_account_revenue': 'It misses ' \
+            'missing_account_revenue': 'It misses '
                     'an "Account Revenue" on product "%s"!',
-            'missing_account_revenue_property': 'It misses ' \
+            'missing_account_revenue_property': 'It misses '
                     'an "account Revenue" default property!',
             })
 
-    def init(self, cursor, module_name):
-        super(SaleLine, self).init(cursor, module_name)
+    def init(self, module_name):
+        super(SaleLine, self).init(module_name)
+        cursor = Transaction().cursor
         table = TableHandler(cursor, self, module_name)
 
         # Migration from 1.0 comment change into note
         if table.column_exist('comment'):
-            cursor.execute('UPDATE "' + self._table + '" ' \
-                    'SET note = comment')
+            cursor.execute('UPDATE "' + self._table + '" SET note = comment')
             table.drop_column('comment', exception=True)
 
-    def default_type(self, cursor, user, context=None):
+    def default_type(self):
         return 'line'
 
-    def default_quantity(self, cursor, user, context=None):
+    def default_quantity(self):
         return 0.0
 
-    def default_unit_price(self, cursor, user, context=None):
+    def default_unit_price(self):
         return Decimal('0.0')
 
-    def on_change_with_unit_digits(self, cursor, user, vals, context=None):
+    def on_change_with_unit_digits(self, vals):
         uom_obj = self.pool.get('product.uom')
         if vals.get('unit'):
-            uom = uom_obj.browse(cursor, user, vals['unit'],
-                    context=context)
+            uom = uom_obj.browse(vals['unit'])
             return uom.digits
         return 2
 
-    def get_unit_digits(self, cursor, user, ids, name, context=None):
+    def get_unit_digits(self, ids, name):
         res = {}
-        for line in self.browse(cursor, user, ids, context=context):
+        for line in self.browse(ids):
             if line.unit:
                 res[line.id] = line.unit.digits
             else:
                 res[line.id] = 2
         return res
 
-    def get_move_done(self, cursor, user, ids, name, context=None):
+    def get_move_done(self, ids, name):
         uom_obj = self.pool.get('product.uom')
         res = {}
-        for line in self.browse(cursor, user, ids, context=context):
+        for line in self.browse(ids):
             val = True
             if not line.product:
                 res[line.id] = True
@@ -1089,17 +979,17 @@ class SaleLine(ModelSQL, ModelView):
                         and move.id not in skip_ids:
                     val = False
                     break
-                quantity -= uom_obj.compute_qty(cursor, user, move.uom,
-                        move.quantity, line.unit, context=context)
+                quantity -= uom_obj.compute_qty(move.uom, move.quantity, 
+                        line.unit)
             if val:
                 if quantity > 0.0:
                     val = False
             res[line.id] = val
         return res
 
-    def get_move_exception(self, cursor, user, ids, name, context=None):
+    def get_move_exception(self, ids, name):
         res = {}
-        for line in self.browse(cursor, user, ids, context=context):
+        for line in self.browse(ids):
             val = False
             skip_ids = set(x.id for x in line.moves_ignored)
             skip_ids.update(x.id for x in line.moves_recreated)
@@ -1111,84 +1001,71 @@ class SaleLine(ModelSQL, ModelView):
             res[line.id] = val
         return res
 
-    def _get_tax_rule_pattern(self, cursor, user, party, vals, context=None):
+    def _get_tax_rule_pattern(self, party, vals):
         '''
         Get tax rule pattern
 
-        :param cursor: the database cursor
-        :param user: the user id
         :param party: the BrowseRecord of the party
         :param vals: a dictionary with value from on_change
-        :param context: the context
         :return: a dictionary to use as pattern for tax rule
         '''
         res = {}
         return res
 
-    def _get_context_sale_price(self, cursor, user, product, vals,
-            context=None):
-        if context is None:
-            context = {}
-        ctx2 = context.copy()
+    def _get_context_sale_price(self, product, vals):
+        context = {}
         if vals.get('_parent_sale.currency'):
-            ctx2['currency'] = vals['_parent_sale.currency']
+            context['currency'] = vals['_parent_sale.currency']
         if vals.get('_parent_sale.party'):
-            ctx2['customer'] = vals['_parent_sale.party']
+            context['customer'] = vals['_parent_sale.party']
         if vals.get('unit'):
-            ctx2['uom'] = vals['unit']
+            context['uom'] = vals['unit']
         else:
-            ctx2['uom'] = product.sale_uom.id
-        return ctx2
+            context['uom'] = product.sale_uom.id
+        return context
 
-    def on_change_product(self, cursor, user, vals, context=None):
+    def on_change_product(self, vals):
         party_obj = self.pool.get('party.party')
         product_obj = self.pool.get('product.product')
         uom_obj = self.pool.get('product.uom')
         tax_rule_obj = self.pool.get('account.tax.rule')
 
-        if context is None:
-            context = {}
         if not vals.get('product'):
             return {}
         res = {}
 
-        ctx = context.copy()
         party = None
+        party_context = {}
         if vals.get('_parent_sale.party'):
-            party = party_obj.browse(cursor, user, vals['_parent_sale.party'],
-                    context=context)
+            party = party_obj.browse(vals['_parent_sale.party'])
             if party.lang:
-                ctx['language'] = party.lang.code
+                party_context['language'] = party.lang.code
 
-        product = product_obj.browse(cursor, user, vals['product'],
-                context=context)
+        product = product_obj.browse(vals['product'])
 
-        ctx2 = self._get_context_sale_price(cursor, user, product, vals,
-                context=context)
-        res['unit_price'] = product_obj.get_sale_price(cursor, user,
-                [product.id], vals.get('quantity', 0), context=ctx2)[product.id]
+        with Transaction().set_context(
+                self._get_context_sale_price(product,vals)):
+            res['unit_price'] = product_obj.get_sale_price([product.id], 
+                    vals.get('quantity', 0))[product.id]
         res['taxes'] = []
-        pattern = self._get_tax_rule_pattern(cursor, user, party,
-                vals, context=context)
+        pattern = self._get_tax_rule_pattern(party, vals)
         for tax in product.customer_taxes_used:
             if party and party.customer_tax_rule:
-                tax_ids = tax_rule_obj.apply(cursor, user,
-                        party.customer_tax_rule, tax, pattern,
-                        context=context)
+                tax_ids = tax_rule_obj.apply(party.customer_tax_rule, tax, 
+                        pattern)
                 if tax_ids:
                     res['taxes'].extend(tax_ids)
                 continue
             res['taxes'].append(tax.id)
         if party and party.customer_tax_rule:
-            tax_ids = tax_rule_obj.apply(cursor, user,
-                    party.customer_tax_rule, False, pattern,
-                    context=context)
+            tax_ids = tax_rule_obj.apply(party.customer_tax_rule, False, 
+                    pattern)
             if tax_ids:
                 res['taxes'].extend(tax_ids)
 
         if not vals.get('description'):
-            res['description'] = product_obj.browse(cursor, user, product.id,
-                    context=ctx).rec_name
+            with Transaction().set_context(party_context):
+                res['description'] = product_obj.browse(product.id).rec_name
 
         category = product.sale_uom.category
         if not vals.get('unit') \
@@ -1200,62 +1077,55 @@ class SaleLine(ModelSQL, ModelView):
         vals = vals.copy()
         vals['unit_price'] = res['unit_price']
         vals['type'] = 'line'
-        res['amount'] = self.on_change_with_amount(cursor, user, vals,
-                context=context)
+        res['amount'] = self.on_change_with_amount(vals)
         return res
 
-    def on_change_quantity(self, cursor, user, vals, context=None):
+    def on_change_quantity(self, vals):
         product_obj = self.pool.get('product.product')
 
-        if context is None:
-            context = {}
         if not vals.get('product'):
             return {}
         res = {}
 
-        product = product_obj.browse(cursor, user, vals['product'],
-                context=context)
+        product = product_obj.browse(vals['product'])
 
-        ctx2 = self._get_context_sale_price(cursor, user, product, vals,
-                context=context)
-        res['unit_price'] = product_obj.get_sale_price(cursor, user,
-                [vals['product']], vals.get('quantity', 0),
-                context=ctx2)[vals['product']]
+        with Transaction().set_context(
+                self._get_context_sale_price(product, vals)):
+            res['unit_price'] = product_obj.get_sale_price([vals['product']], 
+                    vals.get('quantity', 0))[vals['product']]
         return res
 
-    def on_change_unit(self, cursor, user, vals, context=None):
-        return self.on_change_quantity(cursor, user, vals, context=context)
+    def on_change_unit(self, vals):
+        return self.on_change_quantity(vals)
 
-    def on_change_with_amount(self, cursor, user, vals, context=None):
+    def on_change_with_amount(self, vals):
         currency_obj = self.pool.get('currency.currency')
         if vals.get('type') == 'line':
             if isinstance(vals.get('_parent_sale.currency'), (int, long)):
-                currency = currency_obj.browse(cursor, user,
-                        vals['_parent_sale.currency'], context=context)
+                currency = currency_obj.browse(vals['_parent_sale.currency'])
             else:
                 currency = vals['_parent_sale.currency']
             amount = Decimal(str(vals.get('quantity') or '0.0')) * \
                     (vals.get('unit_price') or Decimal('0.0'))
             if currency:
-                return currency_obj.round(cursor, user, currency, amount)
+                return currency_obj.round(currency, amount)
             return amount
         return Decimal('0.0')
 
-    def get_amount(self, cursor, user, ids, name, context=None):
+    def get_amount(self, ids, name):
         currency_obj = self.pool.get('currency.currency')
         res = {}
-        for line in self.browse(cursor, user, ids, context=context):
+        for line in self.browse(ids):
             if line.type == 'line':
-                res[line.id] = currency_obj.round(cursor, user,
-                        line.sale.currency,
+                res[line.id] = currency_obj.round(line.sale.currency,
                         Decimal(str(line.quantity)) * line.unit_price)
             elif line.type == 'subtotal':
                 res[line.id] = Decimal('0.0')
                 for line2 in line.sale.lines:
                     if line2.type == 'line':
-                        res[line.id] += currency_obj.round(cursor, user,
-                                line2.sale.currency,
-                                Decimal(str(line2.quantity)) * line2.unit_price)
+                        res[line.id] += currency_obj.round(line2.sale.currency,
+                                Decimal(str(line2.quantity)) * 
+                                        line2.unit_price)
                     elif line2.type == 'subtotal':
                         if line.id == line2.id:
                             break
@@ -1264,14 +1134,11 @@ class SaleLine(ModelSQL, ModelView):
                 res[line.id] = Decimal('0.0')
         return res
 
-    def get_invoice_line(self, cursor, user, line, context=None):
+    def get_invoice_line(self, line):
         '''
         Return invoice line values for sale line
 
-        :param cursor: the database cursor
-        :param user: the user id
         :param line: the BrowseRecord of the line
-        :param context: the context
 
         :return: a list of invoice line values
         '''
@@ -1292,17 +1159,16 @@ class SaleLine(ModelSQL, ModelView):
             quantity = 0.0
             for move in line.moves:
                 if move.state == 'done':
-                    quantity += uom_obj.compute_qty(cursor, user, move.uom,
-                            move.quantity, line.unit, context=context)
+                    quantity += uom_obj.compute_qty(move.uom, move.quantity, 
+                            line.unit)
 
         ignored_ids = set(
             l.id for i in line.sale.invoices_ignored for l in i.lines)
         for invoice_line in line.invoice_lines:
             if invoice_line.invoice.state != 'cancel' or \
                     invoice_line.id in ignored_ids:
-                quantity -= uom_obj.compute_qty(
-                    cursor, user, invoice_line.unit, invoice_line.quantity,
-                    line.unit, context=context)
+                quantity -= uom_obj.compute_qty(invoice_line.unit, 
+                        invoice_line.quantity, line.unit)
         res['quantity'] = quantity
 
         if res['quantity'] <= 0.0:
@@ -1314,20 +1180,18 @@ class SaleLine(ModelSQL, ModelView):
         if line.product:
             res['account'] = line.product.account_revenue_used.id
             if not res['account']:
-                self.raise_user_error(cursor, 'missing_account_revenue',
-                        error_args=(line.product.rec_name,), context=context)
+                self.raise_user_error('missing_account_revenue',
+                        error_args=(line.product.rec_name,))
         else:
             for model in ('product.template', 'product.category'):
-                res['account'] = property_obj.get(cursor, user,
-                        'account_revenue', model, context=context)
+                res['account'] = property_obj.get('account_revenue', model)
                 if res['account']:
                     break
             if not res['account']:
-                self.raise_user_error(cursor,
-                        'missing_account_revenue_property', context=context)
+                self.raise_user_error('missing_account_revenue_property')
         return [res]
 
-    def copy(self, cursor, user, ids, default=None, context=None):
+    def copy(self, ids, default=None):
         if default is None:
             default = {}
         default = default.copy()
@@ -1335,17 +1199,13 @@ class SaleLine(ModelSQL, ModelView):
         default['moves_ignored'] = False
         default['moves_recreated'] = False
         default['invoice_lines'] = False
-        return super(SaleLine, self).copy(cursor, user, ids,
-                default=default, context=context)
+        return super(SaleLine, self).copy(ids, default=default)
 
-    def get_move(self, cursor, user, line, context=None):
+    def get_move(self, line):
         '''
         Return move values for the sale line
 
-        :param cursor: the database cursor
-        :param user: the user id
         :param line: the BrowseRecord of the line
-        :param context: the context
 
         :return: a dictionary of values of move
         '''
@@ -1362,13 +1222,12 @@ class SaleLine(ModelSQL, ModelView):
         quantity = line.quantity
         for move in line.moves:
             if move.id not in skip_ids:
-                quantity -= uom_obj.compute_qty(cursor, user, move.uom,
-                        move.quantity, line.unit, context=context)
+                quantity -= uom_obj.compute_qty(move.uom, move.quantity,
+                        line.unit)
         if quantity <= 0.0:
             return
         if not line.sale.party.customer_location:
-            self.raise_user_error(cursor, 'customer_location_required',
-                    context=context)
+            self.raise_user_error('customer_location_required')
         res['quantity'] = quantity
         res['uom'] = line.unit.id
         res['product'] = line.product.id
@@ -1482,23 +1341,17 @@ class Template(ModelSQL, ModelView):
             self.account_revenue.depends.append('salable')
         self._reset_columns()
 
-    def default_salable(self, cursor, user, context=None):
-        if context is None:
-            context = {}
-        if context.get('salable'):
-            return True
-        return False
+    def default_salable(self):
+        return True if Transaction().context.get('salable') else False
 
-    def on_change_with_sale_uom(self, cursor, user, vals, context=None):
+    def on_change_with_sale_uom(self, vals):
         uom_obj = self.pool.get('product.uom')
         res = False
 
         if vals.get('default_uom'):
-            default_uom = uom_obj.browse(cursor, user, vals['default_uom'],
-                    context=context)
+            default_uom = uom_obj.browse(vals['default_uom'])
             if vals.get('sale_uom'):
-                sale_uom = uom_obj.browse(cursor, user, vals['sale_uom'],
-                        context=context)
+                sale_uom = uom_obj.browse(vals['sale_uom'])
                 if default_uom.category.id == sale_uom.category.id:
                     res = sale_uom.id
                 else:
@@ -1513,15 +1366,12 @@ Template()
 class Product(ModelSQL, ModelView):
     _name = 'product.product'
 
-    def get_sale_price(self, cursor, user, ids, quantity=0, context=None):
+    def get_sale_price(self, ids, quantity=0):
         '''
         Return the sale price for product ids.
 
-        :param cursor: the database cursor
-        :param user: the user id
         :param ids: the product ids
         :param quantity: the quantity of the products
-        :param context: the context that can have as keys:
             uom: the unit of measure
             currency: the currency id for the returned price
         :return: a dictionary with for each product ids keys the computed price
@@ -1530,34 +1380,28 @@ class Product(ModelSQL, ModelView):
         user_obj = self.pool.get('res.user')
         currency_obj = self.pool.get('currency.currency')
 
-        if context is None:
-            context = {}
-
         res = {}
 
         uom = None
-        if context.get('uom'):
-            uom = uom_obj.browse(cursor, user, context['uom'],
-                    context=context)
+        if Transaction().context.get('uom'):
+            uom = uom_obj.browse(Transaction().context.get('uom'))
 
         currency = None
-        if context.get('currency'):
-            currency = currency_obj.browse(cursor, user, context['currency'],
-                    context=context)
+        if Transaction().context.get('currency'):
+            currency = currency_obj.browse(
+                    Transaction().context.get('currency'))
 
-        user2 = user_obj.browse(cursor, user, user, context=context)
+        user2 = user_obj.browse(Transaction().user)
 
-        for product in self.browse(cursor, user, ids, context=context):
+        for product in self.browse(ids):
             res[product.id] = product.list_price
             if uom:
-                res[product.id] = uom_obj.compute_price(cursor, user,
-                        product.default_uom, res[product.id], uom,
-                        context=context)
+                res[product.id] = uom_obj.compute_price(
+                        product.default_uom, res[product.id], uom)
             if currency and user2.company:
                 if user2.company.currency.id != currency.id:
-                    res[product.id] = currency_obj.compute(cursor, user,
-                            user2.company.currency, res[product.id],
-                            currency, context=context)
+                    res[product.id] = currency_obj.compute(
+                            user2.company.currency, res[product.id], currency)
         return res
 
 Product()
@@ -1569,46 +1413,42 @@ class ShipmentOut(ModelSQL, ModelView):
     def __init__(self):
         super(ShipmentOut, self).__init__()
         self._error_messages.update({
-                'reset_move': 'You cannot reset to draft a move generated '\
+                'reset_move': 'You cannot reset to draft a move generated '
                     'by a sale.',
             })
 
-    def write(self, cursor, user, ids, vals, context=None):
+    def write(self, ids, vals):
         sale_obj = self.pool.get('sale.sale')
         sale_line_obj = self.pool.get('sale.line')
 
-        res = super(ShipmentOut, self).write(cursor, user, ids, vals,
-                context=context)
+        res = super(ShipmentOut, self).write(ids, vals)
 
         if 'state' in vals and vals['state'] in ('done', 'cancel'):
             sale_ids = []
             move_ids = []
             if isinstance(ids, (int, long)):
                 ids = [ids]
-            for shipment in self.browse(cursor, user, ids, context=context):
+            for shipment in self.browse(ids):
                 move_ids.extend([x.id for x in shipment.outgoing_moves])
 
-            sale_line_ids = sale_line_obj.search(cursor, user, [
+            sale_line_ids = sale_line_obj.search([
                 ('moves', 'in', move_ids),
-                ], context=context)
+                ])
             if sale_line_ids:
-                for sale_line in sale_line_obj.browse(cursor, user,
-                        sale_line_ids, context=context):
+                for sale_line in sale_line_obj.browse(sale_line_ids):
                     if sale_line.sale.id not in sale_ids:
                         sale_ids.append(sale_line.sale.id)
 
-            sale_obj.workflow_trigger_validate(cursor, user, sale_ids,
-                    'shipment_update', context=context)
+            sale_obj.workflow_trigger_validate(sale_ids, 'shipment_update')
         return res
 
-    def button_draft(self, cursor, user, ids, context=None):
-        for shipment in self.browse(cursor, user, ids, context=context):
+    def button_draft(self, ids):
+        for shipment in self.browse(ids):
             for move in shipment.outgoing_moves:
                 if move.state == 'cancel' and move.sale_line:
-                    self.raise_user_error(cursor, 'reset_move')
+                    self.raise_user_error('reset_move')
 
-        return super(ShipmentOut, self).button_draft(
-            cursor, user, ids, context=context)
+        return super(ShipmentOut, self).button_draft(ids)
 
 ShipmentOut()
 
@@ -1628,22 +1468,22 @@ class Move(ModelSQL, ModelView):
         ('recreated', 'Recreated'),
         ], 'Exception State'), 'get_sale_exception_state')
 
-    def get_sale(self, cursor, user, ids, name, context=None):
+    def get_sale(self, ids, name):
         sale_obj = self.pool.get('sale.sale')
 
         res = {}
-        for move in self.browse(cursor, user, ids, context=context):
+        for move in self.browse(ids):
             res[move.id] = False
             if move.sale_line:
                 res[move.id] = move.sale_line.sale.id
         return res
 
-    def search_sale(self, cursor, user, name, clause, context=None):
+    def search_sale(self, name, clause):
         return [('sale_line.' + name,) + clause[1:]]
 
-    def get_sale_exception_state(self, cursor, user, ids, name, context=None):
+    def get_sale_exception_state(self, ids, name):
         res = {}.fromkeys(ids, '')
-        for move in self.browse(cursor, user, ids, context=context):
+        for move in self.browse(ids):
             if not move.sale_line:
                 continue
             if move.id in (x.id for x in move.sale_line.moves_recreated):
@@ -1652,29 +1492,27 @@ class Move(ModelSQL, ModelView):
                 res[move.id] = 'ignored'
         return res
 
-    def write(self, cursor, user, ids, vals, context=None):
+    def write(self, ids, vals):
         sale_obj = self.pool.get('sale.sale')
         sale_line_obj = self.pool.get('sale.line')
 
-        res = super(Move, self).write(cursor, user, ids, vals,
-                context=context)
+        res = super(Move, self).write(ids, vals)
         if 'state' in vals and vals['state'] in ('cancel',):
             if isinstance(ids, (int, long)):
                 ids = [ids]
             sale_ids = set()
-            sale_line_ids = sale_line_obj.search(cursor, user, [
+            sale_line_ids = sale_line_obj.search([
                 ('moves', 'in', ids),
-                ], context=context)
+                ])
             if sale_line_ids:
-                for sale_line in sale_line_obj.browse(cursor, user,
-                        sale_line_ids, context=context):
+                for sale_line in sale_line_obj.browse(sale_line_ids):
                     sale_ids.add(sale_line.sale.id)
             if sale_ids:
-                sale_obj.workflow_trigger_validate(cursor, user, list(sale_ids),
-                        'shipment_update', context=context)
+                sale_obj.workflow_trigger_validate(list(sale_ids),
+                        'shipment_update')
         return res
 
-    def delete(self, cursor, user, ids, context=None):
+    def delete(self, ids):
         sale_obj = self.pool.get('sale.sale')
         sale_line_obj = self.pool.get('sale.line')
 
@@ -1682,19 +1520,18 @@ class Move(ModelSQL, ModelView):
             ids = [ids]
 
         sale_ids = set()
-        sale_line_ids = sale_line_obj.search(cursor, user, [
+        sale_line_ids = sale_line_obj.search([
             ('moves', 'in', ids),
-            ], context=context)
+            ])
 
-        res = super(Move, self).delete(cursor, user, ids, context=context)
+        res = super(Move, self).delete(ids)
 
         if sale_line_ids:
-            for sale_line in sale_line_obj.browse(cursor, user,
-                    sale_line_ids, context=context):
+            for sale_line in sale_line_obj.browse(sale_line_ids):
                 sale_ids.add(sale_line.sale.id)
             if sale_ids:
-                sale_obj.workflow_trigger_validate(cursor, user, list(sale_ids),
-                        'shipment_update', context=context)
+                sale_obj.workflow_trigger_validate(list(sale_ids),
+                        'shipment_update')
         return res
 
 Move()
@@ -1712,36 +1549,36 @@ class Invoice(ModelSQL, ModelView):
     def __init__(self):
         super(Invoice, self).__init__()
         self._error_messages.update({
-            'delete_sale_invoice': 'You can not delete invoices ' \
+            'delete_sale_invoice': 'You can not delete invoices '
                     'that come from a sale!',
-            'reset_invoice_sale': 'You cannot reset to draft ' \
+            'reset_invoice_sale': 'You cannot reset to draft '
                     'an invoice generated by a sale.',
             })
 
-    def button_draft(self, cursor, user, ids, context=None):
+    def button_draft(self, ids):
         sale_obj = self.pool.get('sale.sale')
-        sale_ids = sale_obj.search(
-            cursor, user, [('invoices', 'in', ids)], context=context)
+        sale_ids = sale_obj.search([
+            ('invoices', 'in', ids),
+            ])
 
         if sale_ids:
-            self.raise_user_error(cursor, 'reset_invoice_sale')
+            self.raise_user_error('reset_invoice_sale')
 
-        return super(Invoice, self).button_draft(
-            cursor, user, ids, context=context)
+        return super(Invoice, self).button_draft(ids)
 
-    def get_sale_exception_state(self, cursor, user, ids, name, context=None):
+    def get_sale_exception_state(self, ids, name):
         sale_obj = self.pool.get('sale.sale')
-        sale_ids = sale_obj.search(
-            cursor, user, [('invoices', 'in', ids)], context=context)
+        sale_ids = sale_obj.search([
+            ('invoices', 'in', ids),
+            ])
 
-        sales = sale_obj.browse(
-            cursor, user, sale_ids, context=context)
+        sales = sale_obj.browse(sale_ids)
 
         recreated_ids = tuple(i.id for p in sales for i in p.invoices_recreated)
         ignored_ids = tuple(i.id for p in sales for i in p.invoices_ignored)
 
         res = {}.fromkeys(ids, '')
-        for invoice in self.browse(cursor, user, ids, context=context):
+        for invoice in self.browse(ids):
             if invoice.id in recreated_ids:
                 res[invoice.id] = 'recreated'
             elif invoice.id in ignored_ids:
@@ -1749,19 +1586,17 @@ class Invoice(ModelSQL, ModelView):
 
         return res
 
-    def delete(self, cursor, user, ids, context=None):
+    def delete(self, ids):
         if not ids:
             return True
         if isinstance(ids, (int, long)):
             ids = [ids]
-        cursor.execute('SELECT id FROM sale_invoices_rel ' \
+        Transaction().cursor.execute('SELECT id FROM sale_invoices_rel ' 
                 'WHERE invoice IN (' + ','.join(('%s',) * len(ids)) + ')',
                 ids)
-        if cursor.fetchone():
-            self.raise_user_error(cursor, 'delete_sale_invoice',
-                    context=context)
-        return super(Invoice, self).delete(cursor, user, ids,
-                context=context)
+        if Transaction().cursor.fetchone():
+            self.raise_user_error('delete_sale_invoice')
+        return super(Invoice, self).delete(ids)
 
 Invoice()
 
@@ -1779,27 +1614,24 @@ class OpenCustomer(Wizard):
         },
     }
 
-    def _action_open(self, cursor, user, datas, context=None):
+    def _action_open(self, datas):
         model_data_obj = self.pool.get('ir.model.data')
         act_window_obj = self.pool.get('ir.action.act_window')
         wizard_obj = self.pool.get('ir.action.wizard')
-        act_window_id = model_data_obj.get_id(cursor, user, 'party',
-                'act_party_form', context=context)
-        res = act_window_obj.read(cursor, user, act_window_id, context=context)
-        cursor.execute("SELECT DISTINCT(party) FROM sale_sale")
-        customer_ids = [line[0] for line in cursor.fetchall()]
+        act_window_id = model_data_obj.get_id('party', 'act_party_form')
+        res = act_window_obj.read(act_window_id)
+        Transaction().cursor.execute("SELECT DISTINCT(party) FROM sale_sale")
+        customer_ids = [line[0] for line in Transaction().cursor.fetchall()]
         res['pyson_domain'] = PYSONEncoder().encode(
                 [('id', 'in', customer_ids)])
 
-        model_data_ids = model_data_obj.search(cursor, user, [
+        model_data_ids = model_data_obj.search([
             ('fs_id', '=', 'act_open_customer'),
             ('module', '=', 'sale'),
             ('inherit', '=', False),
-            ], limit=1, context=context)
-        model_data = model_data_obj.browse(cursor, user, model_data_ids[0],
-                context=context)
-        wizard = wizard_obj.browse(cursor, user, model_data.db_id,
-                context=context)
+            ], limit=1)
+        model_data = model_data_obj.browse(model_data_ids[0])
+        wizard = wizard_obj.browse(model_data.db_id)
 
         res['name'] = wizard.name
         return res
@@ -1818,27 +1650,28 @@ class HandleShipmentExceptionAsk(ModelView):
     domain_moves = fields.Many2Many(
         'stock.move', None, None, 'Domain Moves')
 
-    def init(self, cursor, module_name):
+    def init(self, module_name):
+        cursor = Transaction().cursor
         # Migration from 1.2: packing renamed into shipment
-        cursor.execute("UPDATE ir_model "\
-                "SET model = REPLACE(model, 'packing', 'shipment') "\
+        cursor.execute("UPDATE ir_model "
+                "SET model = REPLACE(model, 'packing', 'shipment') "
                 "WHERE model like '%%packing%%' AND module = %s",
                 (module_name,))
-        super(HandleShipmentExceptionAsk, self).init(cursor, module_name)
+        super(HandleShipmentExceptionAsk, self).init(module_name)
 
-    def default_recreate_moves(self, cursor, user, context=None):
-        return self.default_domain_moves(cursor, user, context=context)
+    def default_recreate_moves(self):
+        return self.default_domain_moves()
 
-    def default_domain_moves(self, cursor, user, context=None):
+    def default_domain_moves(self):
         sale_line_obj = self.pool.get('sale.line')
-        active_id = context and context.get('active_id')
+        active_id = Transaction().context.get('active_id')
         if not active_id:
             return []
 
-        line_ids = sale_line_obj.search(
-            cursor, user, [('sale', '=', active_id)],
-            context=context)
-        lines = sale_line_obj.browse(cursor, user, line_ids, context=context)
+        line_ids = sale_line_obj.search([
+            ('sale', '=', active_id),
+            ])
+        lines = sale_line_obj.browse(line_ids)
 
         domain_moves = []
         for line in lines:
@@ -1876,7 +1709,7 @@ class HandleShipmentException(Wizard):
         },
     }
 
-    def _handle_moves(self, cursor, user, data, context=None):
+    def _handle_moves(self, data):
         sale_obj = self.pool.get('sale.sale')
         sale_line_obj = self.pool.get('sale.line')
         move_obj = self.pool.get('stock.move')
@@ -1884,7 +1717,7 @@ class HandleShipmentException(Wizard):
         to_recreate = data['form']['recreate_moves'][0][1]
         domain_moves = data['form']['domain_moves'][0][1]
 
-        sale = sale_obj.browse(cursor, user, data['id'], context=context)
+        sale = sale_obj.browse(data['id'])
 
         for line in sale.lines:
             moves_ignored = []
@@ -1899,14 +1732,12 @@ class HandleShipmentException(Wizard):
                 else:
                     moves_ignored.append(move.id)
 
-            sale_line_obj.write(
-                cursor, user, line.id,
-                {'moves_ignored': [('add', moves_ignored)],
-                 'moves_recreated': [('add', moves_recreated)]},
-                context=context)
+            sale_line_obj.write(line.id,{
+                'moves_ignored': [('add', moves_ignored)],
+                'moves_recreated': [('add', moves_recreated)],
+                })
 
-        sale_obj.workflow_trigger_validate(cursor, user, data['id'],
-                'shipment_ok', context=context)
+        sale_obj.workflow_trigger_validate(data['id'], 'shipment_ok')
 
 HandleShipmentException()
 
@@ -1920,22 +1751,21 @@ class HandleInvoiceExceptionAsk(ModelView):
         'account.invoice', None, None, 'Recreate Invoices',
         domain=[('id', 'in', Eval('domain_invoices'))],
         depends=['domain_invoices'],
-        help='The selected invoices will be recreated. '\
+        help='The selected invoices will be recreated. '
             'The other ones will be ignored.')
     domain_invoices = fields.Many2Many(
         'account.invoice', None, None, 'Domain Invoices')
 
-    def default_recreate_invoices(self, cursor, user, context=None):
-        return self.default_domain_invoices(cursor, user, context=context)
+    def default_recreate_invoices(self):
+        return self.default_domain_invoices()
 
-    def default_domain_invoices(self, cursor, user, context=None):
+    def default_domain_invoices(self):
         sale_obj = self.pool.get('sale.sale')
-        active_id = context and context.get('active_id')
+        active_id = Transaction().context.get('active_id')
         if not active_id:
             return []
 
-        sale = sale_obj.browse(
-            cursor, user, active_id, context=context)
+        sale = sale_obj.browse(active_id)
         skip_ids = set(x.id for x in sale.invoices_ignored)
         skip_ids.update(x.id for x in sale.invoices_recreated)
         domain_invoices = []
@@ -1972,13 +1802,13 @@ class HandleInvoiceException(Wizard):
         },
     }
 
-    def _handle_invoices(self, cursor, user, data, context=None):
+    def _handle_invoices(self, data):
         sale_obj = self.pool.get('sale.sale')
         invoice_obj = self.pool.get('account.invoice')
         to_recreate = data['form']['recreate_invoices'][0][1]
         domain_invoices = data['form']['domain_invoices'][0][1]
 
-        sale = sale_obj.browse(cursor, user, data['id'], context=context)
+        sale = sale_obj.browse(data['id'])
 
         skip_ids = set(x.id for x in sale.invoices_ignored)
         skip_ids.update(x.id for x in sale.invoices_recreated)
@@ -1992,14 +1822,11 @@ class HandleInvoiceException(Wizard):
             else:
                 invoices_ignored.append(invoice.id)
 
-        sale_obj.write(
-            cursor, user, sale.id,
-            {'invoices_ignored': [('add', invoices_ignored)],
-             'invoices_recreated': [('add', invoices_recreated)],
-             },
-            context=context)
+        sale_obj.write(sale.id,{
+            'invoices_ignored': [('add', invoices_ignored)],
+            'invoices_recreated': [('add', invoices_recreated)],
+             })
 
-        sale_obj.workflow_trigger_validate(cursor, user, data['id'],
-                'invoice_ok', context=context)
+        sale_obj.workflow_trigger_validate(data['id'], 'invoice_ok')
 
 HandleInvoiceException()
diff --git a/sale.xml b/sale.xml
index 27d6d5e..c18bd9d 100644
--- a/sale.xml
+++ b/sale.xml
@@ -13,6 +13,9 @@ this repository contains the full copyright notices and license terms. -->
         <record model="res.user" id="res.user_admin">
             <field name="groups" eval="[('add', ref('group_sale')), ('add', ref('group_sale_admin'))]"/>
         </record>
+        <record model="res.user" id="res.user_trigger">
+            <field name="groups" eval="[('add', ref('group_sale')), ('add', ref('group_sale_admin'))]"/>
+        </record>
 
         <record model="ir.action.wizard" id="wizard_shipment_handle_exception">
             <field name="name">Handle Shipment Exception</field>
diff --git a/tests/test_sale.py b/tests/test_sale.py
index 5de7cac..b6d37b3 100644
--- a/tests/test_sale.py
+++ b/tests/test_sale.py
@@ -25,7 +25,7 @@ class SaleTestCase(unittest.TestCase):
         '''
         Test views.
         '''
-        self.assertRaises(Exception, test_view('sale'))
+        test_view('sale')
 
 def suite():
     suite = trytond.tests.test_tryton.suite()
diff --git a/trytond_sale.egg-info/PKG-INFO b/trytond_sale.egg-info/PKG-INFO
index 728f0f8..75d21e2 100644
--- a/trytond_sale.egg-info/PKG-INFO
+++ b/trytond_sale.egg-info/PKG-INFO
@@ -1,6 +1,6 @@
 Metadata-Version: 1.0
 Name: trytond-sale
-Version: 1.6.0
+Version: 1.8.0
 Summary: Define sale order.
 Add to product sale informations.
 Define the sale price as the list price.
@@ -20,7 +20,7 @@ Home-page: http://www.tryton.org/
 Author: B2CK
 Author-email: info at b2ck.com
 License: GPL-3
-Download-URL: http://downloads.tryton.org/1.6/
+Download-URL: http://downloads.tryton.org/1.8/
 Description: UNKNOWN
 Platform: UNKNOWN
 Classifier: Development Status :: 5 - Production/Stable
diff --git a/trytond_sale.egg-info/requires.txt b/trytond_sale.egg-info/requires.txt
index 917bf70..df87b5a 100644
--- a/trytond_sale.egg-info/requires.txt
+++ b/trytond_sale.egg-info/requires.txt
@@ -1,9 +1,9 @@
-trytond_company >= 1.6, < 1.7
-trytond_party >= 1.6, < 1.7
-trytond_stock >= 1.6, < 1.7
-trytond_account >= 1.6, < 1.7
-trytond_product >= 1.6, < 1.7
-trytond_account_invoice >= 1.6, < 1.7
-trytond_currency >= 1.6, < 1.7
-trytond_account_product >= 1.6, < 1.7
-trytond >= 1.6, < 1.7
\ No newline at end of file
+trytond_company >= 1.8, < 1.9
+trytond_party >= 1.8, < 1.9
+trytond_stock >= 1.8, < 1.9
+trytond_account >= 1.8, < 1.9
+trytond_product >= 1.8, < 1.9
+trytond_account_invoice >= 1.8, < 1.9
+trytond_currency >= 1.8, < 1.9
+trytond_account_product >= 1.8, < 1.9
+trytond >= 1.8, < 1.9
\ No newline at end of file
commit 46ff3ca73134bb0386d7aefd11f6ced02b9e9ef8
Author: Daniel Baumann <daniel at debian.org>
Date:   Tue Nov 2 14:27:20 2010 +0100

    Switching to source format 3.0 (quilt).

diff --git a/debian/source/format b/debian/source/format
index d3827e7..163aaf8 100644
--- a/debian/source/format
+++ b/debian/source/format
@@ -1 +1 @@
-1.0
+3.0 (quilt)
commit ce073d503717cd03f1fbf6d0df9c73857842727b
Author: Daniel Baumann <daniel at debian.org>
Date:   Thu Sep 30 01:05:33 2010 +0200

    Updating to standards version 3.9.1.

diff --git a/debian/control b/debian/control
index ebfad32..fb3a403 100644
--- a/debian/control
+++ b/debian/control
@@ -7,7 +7,7 @@ Uploaders:
  Mathias Behrle <mathiasb at mbsolutions.selfip.biz>
 Dm-Upload-Allowed: yes
 Build-Depends: debhelper (>= 8), python, python-setuptools, python-support
-Standards-Version: 3.9.0
+Standards-Version: 3.9.1
 Homepage: http://www.tryton.org/
 Vcs-Browser: http://git.debian-maintainers.org/?p=tryton/tryton-modules-sale.git
 Vcs-Git: git://git.debian-maintainers.org/git/tryton/tryton-modules-sale.git
commit 607f32995d7ade0281ed6647c9fb7d1beaec07ce
Author: Daniel Baumann <daniel at debian.org>
Date:   Thu Sep 30 01:04:05 2010 +0200

    Updating to debhelper version 8.

diff --git a/debian/compat b/debian/compat
index 7f8f011..45a4fb7 100644
--- a/debian/compat
+++ b/debian/compat
@@ -1 +1 @@
-7
+8
diff --git a/debian/control b/debian/control
index 51f93c3..ebfad32 100644
--- a/debian/control
+++ b/debian/control
@@ -6,7 +6,7 @@ Uploaders:
  Daniel Baumann <daniel at debian.org>,
  Mathias Behrle <mathiasb at mbsolutions.selfip.biz>
 Dm-Upload-Allowed: yes
-Build-Depends: debhelper (>= 7), python, python-setuptools, python-support
+Build-Depends: debhelper (>= 8), python, python-setuptools, python-support
 Standards-Version: 3.9.0
 Homepage: http://www.tryton.org/
 Vcs-Browser: http://git.debian-maintainers.org/?p=tryton/tryton-modules-sale.git
commit dcca8b9ae7245e5e5c18a0e214ee4352b9651ec1
Author: Daniel Baumann <daniel at debian.org>
Date:   Mon Jun 28 20:35:30 2010 +0200

    Updating standards version to 3.9.0.

diff --git a/debian/control b/debian/control
index 709f158..51f93c3 100644
--- a/debian/control
+++ b/debian/control
@@ -7,7 +7,7 @@ Uploaders:
  Mathias Behrle <mathiasb at mbsolutions.selfip.biz>
 Dm-Upload-Allowed: yes
 Build-Depends: debhelper (>= 7), python, python-setuptools, python-support
-Standards-Version: 3.8.4
+Standards-Version: 3.9.0
 Homepage: http://www.tryton.org/
 Vcs-Browser: http://git.debian-maintainers.org/?p=tryton/tryton-modules-sale.git
 Vcs-Git: git://git.debian-maintainers.org/git/tryton/tryton-modules-sale.git
commit 315741f2bf90e0171175f24f6384a2153c086fc1
Author: Mathias Behrle <mathiasb at mbsolutions.selfip.biz>
Date:   Thu May 13 12:24:33 2010 +0200

    Releasing debian version 1.6.0-1.

diff --git a/debian/changelog b/debian/changelog
index 23f2866..e7d193a 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -1,3 +1,15 @@
+tryton-modules-sale (1.6.0-1) unstable; urgency=low
+
+  [ Daniel Baumann ]
+  * Adding Dm-Upload-Allowed in control in preparation for Mathias.
+
+  [ Mathias Behrle ]
+  * Merging upstream version 1.6.0.
+  * Updating copyright.
+  * Updating depends.
+
+ -- Mathias Behrle <mathiasb at mbsolutions.selfip.biz>  Thu, 13 May 2010 12:24:22 +0200
+
 tryton-modules-sale (1.4.2-2) unstable; urgency=low
 
   [ Daniel Baumann ]
commit ba1713f6a272709c29351c3e81a8e1a10e453ebf
Author: Mathias Behrle <mathiasb at mbsolutions.selfip.biz>
Date:   Thu May 13 12:24:14 2010 +0200

    Updating depends.

diff --git a/debian/control b/debian/control
index 77b8dc8..709f158 100644
--- a/debian/control
+++ b/debian/control
@@ -15,11 +15,11 @@ Vcs-Git: git://git.debian-maintainers.org/git/tryton/tryton-modules-sale.git
 Package: tryton-modules-sale
 Architecture: all
 Depends:
- ${misc:Depends}, ${python:Depends}, tryton-server (>= 1.4),
- tryton-modules-account (>= 1.4), tryton-modules-account-invoice (>= 1.4),
- tryton-modules-account-product (>= 1.4), tryton-modules-company (>= 1.4),
- tryton-modules-currency (>= 1.4), tryton-modules-party (>= 1.4),
- tryton-modules-product (>= 1.4), tryton-modules-stock (>= 1.4),
+ ${misc:Depends}, ${python:Depends}, tryton-server (>= 1.6),
+ tryton-modules-account (>= 1.6), tryton-modules-account-invoice (>= 1.6),
+ tryton-modules-account-product (>= 1.6), tryton-modules-company (>= 1.6),
+ tryton-modules-currency (>= 1.6), tryton-modules-party (>= 1.6),
+ tryton-modules-product (>= 1.6), tryton-modules-stock (>= 1.6),
  python-pkg-resources
 XB-Python-Version: ${python:Versions}
 Description: Tryton Application Platform (Sale Module)
commit f6510a5d3d0d1c27e9dc6743823d68676438eb5b
Author: Mathias Behrle <mathiasb at mbsolutions.selfip.biz>
Date:   Thu May 13 12:24:11 2010 +0200

    Updating copyright.

diff --git a/debian/copyright b/debian/copyright
index 9a3e6c5..6146982 100644
--- a/debian/copyright
+++ b/debian/copyright
@@ -6,9 +6,9 @@ Maintainer-Homepage: http://tryton.debian-maintainers.org/
 Files: *
 Copyright:
  (C) 2004-2008 Tiny SPRL
- (C) 2008-2009 Cedric Krier
- (C) 2008-2009 Bertrand Chenal
- (C) 2008-2009 B2CK SPRL
+ (C) 2008-2010 Cedric Krier
+ (C) 2008-2010 Bertrand Chenal
+ (C) 2008-2010 B2CK SPRL
 License: GPL-3+
  This program is free software: you can redistribute it and/or modify
  it under the terms of the GNU General Public License as published by
commit 1d59b8b0b4d8f488ac5153def4f2dee07849e475
Author: Mathias Behrle <mathiasb at mbsolutions.selfip.biz>
Date:   Thu May 13 11:29:46 2010 +0200

    Merging upstream version 1.6.0.

diff --git a/CHANGELOG b/CHANGELOG
index 0d17f00..a812581 100644
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -1,8 +1,7 @@
-Version 1.4.2 - 2010-02-17
-* Some bug fixes (see mercurial logs for details)
-
-Version 1.4.1 - 2009-11-24
-* Some bug fixes (see mercurial logs for details)
+Version 1.6.0 - 2010-05-13
+* Bug fixes (see mercurial logs for details)
+* Use a modelsingleton to define which sale sequence to use
+* Add default search value on sale
 
 Version 1.4.0 - 2009-10-19
 * Bug fixes (see mercurial logs for details)
diff --git a/MANIFEST.in b/MANIFEST.in
index b2a140e..dcb2afa 100644
--- a/MANIFEST.in
+++ b/MANIFEST.in
@@ -7,5 +7,4 @@ include LICENSE
 include *.xml
 include *.odt
 include *.csv
-include tests/*
 include doc/*
diff --git a/PKG-INFO b/PKG-INFO
index 4f75cc8..8e156a3 100644
--- a/PKG-INFO
+++ b/PKG-INFO
@@ -1,6 +1,6 @@
 Metadata-Version: 1.0
 Name: trytond_sale
-Version: 1.4.2
+Version: 1.6.0
 Summary: Define sale order.
 Add to product sale informations.
 Define the sale price as the list price.
@@ -20,7 +20,7 @@ Home-page: http://www.tryton.org/
 Author: B2CK
 Author-email: info at b2ck.com
 License: GPL-3
-Download-URL: http://downloads.tryton.org/1.4/
+Download-URL: http://downloads.tryton.org/1.6/
 Description: UNKNOWN
 Platform: UNKNOWN
 Classifier: Development Status :: 5 - Production/Stable
diff --git a/__init__.py b/__init__.py
index 3c25009..ba016cf 100644
--- a/__init__.py
+++ b/__init__.py
@@ -2,3 +2,4 @@
 #this repository contains the full copyright notices and license terms.
 
 from sale import *
+from configuration import *
diff --git a/__tryton__.py b/__tryton__.py
index ce69276..7c963cc 100644
--- a/__tryton__.py
+++ b/__tryton__.py
@@ -6,11 +6,10 @@
     'name_es_CO': 'Ventas',
     'name_es_ES': 'Venta',
     'name_fr_FR': 'Vente',
-    'version': '1.4.2',
+    'version': '1.6.0',
     'author': 'B2CK',
     'email': 'info at b2ck.com',
     'website': 'http://www.tryton.org/',
-    'category': 'Sale',
     'description': '''Define sale order.
 Add to product sale informations.
 Define the sale price as the list price.
@@ -100,6 +99,7 @@ Avec la possibilité:
     ],
     'xml': [
         'sale.xml',
+        'configuration.xml',
         'party.xml',
     ],
     'translation': [
diff --git a/configuration.py b/configuration.py
new file mode 100644
index 0000000..1e6823a
--- /dev/null
+++ b/configuration.py
@@ -0,0 +1,18 @@
+#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 trytond.model import ModelView, ModelSQL, ModelSingleton, fields
+from trytond.pyson import Eval
+
+
+class Configuration(ModelSingleton, ModelSQL, ModelView):
+    'Sale Configuration'
+    _name = 'sale.configuration'
+    _description = __doc__
+
+    sale_sequence = fields.Property(fields.Many2One('ir.sequence',
+        'Sale Reference Sequence', domain=[
+            ('company', 'in', [Eval('company'), False]),
+            ('code', '=', 'sale.sale'),
+        ], required=True))
+
+Configuration()
diff --git a/configuration.xml b/configuration.xml
new file mode 100644
index 0000000..18c0e08
--- /dev/null
+++ b/configuration.xml
@@ -0,0 +1,44 @@
+<?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. -->
+<tryton>
+    <data>
+        <menuitem name="Configuration" parent="menu_sale"
+            id="menu_configuration" groups="group_sale_admin"
+            sequence="0" icon="tryton-preferences"/>
+
+        <record model="ir.ui.view" id="sale_configuration_view_form">
+            <field name="model">sale.configuration</field>
+            <field name="type">form</field>
+            <field name="arch" type="xml">
+                <![CDATA[
+                <form string="Sale Configuration">
+                    <label name="sale_sequence"/>
+                    <field name="sale_sequence"/>
+                </form>
+                ]]>
+            </field>
+        </record>
+        <record model="ir.action.act_window" id="act_sale_configuration_form">
+            <field name="name">Sale Configuration</field>
+            <field name="res_model">sale.configuration</field>
+            <field name="view_type">form</field>
+        </record>
+        <record model="ir.action.act_window.view"
+            id="act_sale_configuration_view1">
+            <field name="sequence" eval="1"/>
+            <field name="view" ref="sale_configuration_view_form"/>
+            <field name="act_window" ref="act_sale_configuration_form"/>
+        </record>
+        <menuitem parent="menu_configuration"
+            action="act_sale_configuration_form"
+            id="menu_sale_configuration" icon="tryton-list"/>
+
+        <record model="ir.property" id="property_sale_sequence">
+            <field name="name">sale_sequence</field>
+            <field name="field"
+                search="[('model.model', '=', 'sale.configuration'), ('name', '=', 'sale_sequence')]"/>
+            <field name="value" eval="'ir.sequence,' + str(ref('sequence_sale'))"/>
+        </record>
+    </data>
+</tryton>
diff --git a/de_DE.csv b/de_DE.csv
index 419822d..5bfd748 100644
--- a/de_DE.csv
+++ b/de_DE.csv
@@ -11,9 +11,11 @@ error,stock.shipment.out,0,You cannot reset to draft a move generated by a sale.
 field,"account.invoice,sale_exception_state",0,Exception State,Vorbehalt Status,0
 field,"product.template,salable",0,Salable,Verkäuflich,0
 field,"product.template,sale_uom",0,Sale UOM,Einheit Verkauf,0
-field,"sale.handle.invoice.exception.ask,domain_invoices",0,Domain Invoices,Domain Rechnungen,0
+field,"sale.configuration,rec_name",0,Name,Name,0
+field,"sale.configuration,sale_sequence",0,Sale Reference Sequence,Nummernkreis Verkauf,0
+field,"sale.handle.invoice.exception.ask,domain_invoices",0,Domain Invoices,Wertebereich Rechnungen (Domain),0
 field,"sale.handle.invoice.exception.ask,recreate_invoices",0,Recreate Invoices,Rechnungen nachbilden,0
-field,"sale.handle.shipment.exception.ask,domain_moves",0,Domain Moves,Domain Bewegungen,0
+field,"sale.handle.shipment.exception.ask,domain_moves",0,Domain Moves,Wertebereich Bewegungen (Domain),0
 field,"sale.handle.shipment.exception.ask,recreate_moves",0,Recreate Moves,Bewegungen nachbilden,0
 field,"sale.line-account.invoice.line,invoice_line",0,Invoice Line,Rechnungsposition,0
 field,"sale.line-account.invoice.line,rec_name",0,Name,Name,0
@@ -40,7 +42,7 @@ field,"sale.line-recreated-stock.move,move",0,Move,Bewegung,0
 field,"sale.line-recreated-stock.move,rec_name",0,Name,Name,0
 field,"sale.line-recreated-stock.move,sale_line",0,Sale Line,Position Verkauf,0
 field,"sale.line,sale",0,Sale,Verkauf,0
-field,"sale.line,sequence",0,Sequence,Sequenz,0
+field,"sale.line,sequence",0,Sequence,Reihenfolge,0
 field,"sale.line,taxes",0,Taxes,Steuern,0
 field,"sale.line,type",0,Type,Typ,0
 field,"sale.line,unit",0,Unit,Einheit,0
@@ -67,12 +69,6 @@ field,"sale.sale,invoices_recreated",0,Recreated Invoices,Nachgebildete Rechnung
 field,"sale.sale,invoice_state",0,Invoice State,Rechnungsstatus,0
 field,"sale.sale,lines",0,Lines,Positionen,0
 field,"sale.sale,moves",0,Moves,Bewegungen,0
-field,"sale.sale,shipment_address",0,Shipment Address,Lieferadresse,0
-field,"sale.sale,shipment_done",0,Shipment Done,Gepackt,0
-field,"sale.sale,shipment_exception",0,Shipments Exception,Lieferungsvorbehalt,0
-field,"sale.sale,shipment_method",0,Shipment Method,Liefermethode,0
-field,"sale.sale,shipments",0,Shipments,Lieferposten,0
-field,"sale.sale,shipment_state",0,Shipment State,Lieferstatus,0
 field,"sale.sale,party",0,Party,Partei,0
 field,"sale.sale,party_lang",0,Party Language,Sprache Partei,0
 field,"sale.sale,payment_term",0,Payment Term,Zahlungsbedingung,0
@@ -80,8 +76,14 @@ field,"sale.sale,rec_name",0,Name,Name,0
 field,"sale.sale-recreated-account.invoice,invoice",0,Invoice,Rechnung,0
 field,"sale.sale-recreated-account.invoice,rec_name",0,Name,Name,0
 field,"sale.sale-recreated-account.invoice,sale",0,Sale,Verkauf,0
-field,"sale.sale,reference",0,Reference,Referenz,0
+field,"sale.sale,reference",0,Reference,Beleg-Nr.,0
 field,"sale.sale,sale_date",0,Sale Date,Verkaufsdatum,0
+field,"sale.sale,shipment_address",0,Shipment Address,Lieferadresse,0
+field,"sale.sale,shipment_done",0,Shipment Done,Gepackt,0
+field,"sale.sale,shipment_exception",0,Shipments Exception,Lieferungsvorbehalt,0
+field,"sale.sale,shipment_method",0,Shipment Method,Liefermethode,0
+field,"sale.sale,shipments",0,Shipments,Lieferposten,0
+field,"sale.sale,shipment_state",0,Shipment State,Lieferstatus,0
 field,"sale.sale,state",0,State,Status,0
 field,"sale.sale,tax_amount",0,Tax,Steuer,0
 field,"sale.sale,total_amount",0,Total,Gesamt,0
@@ -89,7 +91,7 @@ field,"sale.sale,untaxed_amount",0,Untaxed,Netto,0
 field,"sale.sale,warehouse",0,Warehouse,Warenlager,0
 field,"stock.move,sale",0,Sale,Verkauf,0
 field,"stock.move,sale_exception_state",0,Exception State,Status Vorbehalt,0
-field,"stock.move,sale_line",0,,,0
+field,"stock.move,sale_line",0,Sale Line,Verkauf Position,0
 help,"sale.handle.invoice.exception.ask,recreate_invoices",0,The selected invoices will be recreated. The other ones will be ignored.,Die ausgewählten Rechnungen werden nachgebildet. Alle anderen werden ignoriert.,0
 model,"ir.action,name",act_sale_form_confirmed,Confirmed Sales,Aufträge (Verkäufe),0
 model,"ir.action,name",act_sale_form_draft,Draft Sales,Entwürfe (Verkäufe),0
@@ -99,20 +101,25 @@ model,"ir.action,name",act_invoice_form,Invoices,Rechnungsausgang,0
 model,"ir.action,name",act_sale_form_new,New Sale,Neuer Verkauf,0
 model,"ir.action,name",act_open_customer,Parties associated to Sales,Parteien: Verkäufen zugeordnet,0
 model,"ir.action,name",act_sale_form_quotation,Quotation Sales,Angebote (Verkäufe),0
-model,"ir.action,name",report_sale,Sale,Verkauf drucken,0
+model,"ir.action,name",report_sale,Sale,Verkauf,0
+model,"ir.action,name",act_sale_configuration_form,Sale Configuration,Einstellungen Verkauf,0
 model,"ir.action,name",act_sale_form,Sales,Verkäufe,0
 model,"ir.action,name",act_sale_form2,Sales,Verkäufe,0
 model,"ir.action,name",act_shipment_form,Shipments,Lieferposten,0
 model,"ir.sequence,name",sequence_sale,Sale,Verkauf,0
 model,"ir.sequence.type,name",sequence_type_sale,Sale,Verkauf,0
+model,"ir.ui.menu,name",menu_configuration,Configuration,Einstellungen,0
 model,"ir.ui.menu,name",menu_sale_form_confirmed,Confirmed Sales,Aufträge (Verkäufe),0
 model,"ir.ui.menu,name",menu_sale_form_draft,Draft Sales,Entwürfe (Verkäufe),0
 model,"ir.ui.menu,name",menu_sale_form_new,New Sale,Neuer Verkauf,0
 model,"ir.ui.menu,name",menu_customer,Parties associated to Sales,Parteien: Verkäufen zugeordnet,0
 model,"ir.ui.menu,name",menu_sale_form_quotation,Quotation Sales,Angebote (Verkäufe),0
+model,"ir.ui.menu,name",menu_sale_configuration,Sale Configuration,Einstellungen Verkauf,0
 model,"ir.ui.menu,name",menu_sale,Sale Management,Verkauf,0
 model,"ir.ui.menu,name",menu_sale_form,Sales,Verkäufe,0
 model,"res.group,name",group_sale,Sale,Verkauf,0
+model,"res.group,name",group_sale_admin,Sale Administrator,Verkauf Administration,0
+model,"sale.configuration,name",0,Sale Configuration,Einstellungen Verkauf,0
 model,"sale.handle.invoice.exception.ask,name",0,Invoice Exception Ask,Rechnungsvorbehalt Nachfrage,0
 model,"sale.handle.shipment.exception.ask,name",0,Shipment Exception Ask,Nachfrage Liefervorbehalt,0
 model,"sale.line-account.invoice.line,name",0,Sale Line - Invoice Line,Verkauf Position - Rechnung Zeile,0
@@ -199,6 +206,7 @@ selection,"stock.move,sale_exception_state",0,Ignored,Ignoriert,0
 selection,"stock.move,sale_exception_state",0,Recreated,Nachgebildet,0
 view,product.product,0,Customers,Kunden,0
 view,product.template,0,Customers,Kunden,0
+view,sale.configuration,0,Sale Configuration,Einstellungen Verkauf,0
 view,sale.handle.invoice.exception.ask,0,Choose invoices to duplicate,Auswahl Rechnungen für Duplizierung,0
 view,sale.handle.invoice.exception.ask,0,Choose invoices to recreate,Rechnungen zum Nachbilden auswählen,0
 view,sale.handle.invoice.exception.ask,0,Handle Invoice Exception,Rechnungsvorbehalt bearbeiten,0
diff --git a/es_CO.csv b/es_CO.csv
index f7d5705..ab0b87d 100644
--- a/es_CO.csv
+++ b/es_CO.csv
@@ -11,6 +11,8 @@ error,stock.shipment.out,0,You cannot reset to draft a move generated by a sale.
 field,"account.invoice,sale_exception_state",0,Exception State,Estado de Excepción,0
 field,"product.template,salable",0,Salable,De fácil venta,0
 field,"product.template,sale_uom",0,Sale UOM,UdM de Venta,0
+field,"sale.configuration,rec_name",0,Name,Nombre de Contacto,1
+field,"sale.configuration,sale_sequence",0,Sale Reference Sequence,,0
 field,"sale.handle.invoice.exception.ask,domain_invoices",0,Domain Invoices,Rango de facturas,0
 field,"sale.handle.invoice.exception.ask,recreate_invoices",0,Recreate Invoices,Rehacer factura,0
 field,"sale.handle.shipment.exception.ask,domain_moves",0,Domain Moves,Rango de movimientos,0
@@ -67,12 +69,6 @@ field,"sale.sale,invoices_recreated",0,Recreated Invoices,Rehacer facturas,0
 field,"sale.sale,invoice_state",0,Invoice State,Estado de Factura,0
 field,"sale.sale,lines",0,Lines,Líneas,0
 field,"sale.sale,moves",0,Moves,Movimientos,0
-field,"sale.sale,shipment_address",0,Shipment Address,Dirección de envío,0
-field,"sale.sale,shipment_done",0,Shipment Done,Envío Finalizado,0
-field,"sale.sale,shipment_exception",0,Shipments Exception,Excepción de Envíos,0
-field,"sale.sale,shipment_method",0,Shipment Method,Método de Envío,0
-field,"sale.sale,shipments",0,Shipments,Envíos,0
-field,"sale.sale,shipment_state",0,Shipment State,Estado de Envío,0
 field,"sale.sale,party",0,Party,Tercero,0
 field,"sale.sale,party_lang",0,Party Language,Idioma del Tercero,0
 field,"sale.sale,payment_term",0,Payment Term,Término de Pago,0
@@ -82,6 +78,12 @@ field,"sale.sale-recreated-account.invoice,rec_name",0,Name,Nombre,0
 field,"sale.sale-recreated-account.invoice,sale",0,Sale,Ventas,0
 field,"sale.sale,reference",0,Reference,Referencia,0
 field,"sale.sale,sale_date",0,Sale Date,Fecha de Venta,0
+field,"sale.sale,shipment_address",0,Shipment Address,Dirección de envío,0
+field,"sale.sale,shipment_done",0,Shipment Done,Envío Finalizado,0
+field,"sale.sale,shipment_exception",0,Shipments Exception,Excepción de Envíos,0
+field,"sale.sale,shipment_method",0,Shipment Method,Método de Envío,0
+field,"sale.sale,shipments",0,Shipments,Envíos,0
+field,"sale.sale,shipment_state",0,Shipment State,Estado de Envío,0
 field,"sale.sale,state",0,State,Estado,0
 field,"sale.sale,tax_amount",0,Tax,Impuesto,0
 field,"sale.sale,total_amount",0,Total,Total,0
@@ -100,19 +102,24 @@ model,"ir.action,name",act_sale_form_new,New Sale,Nueva venta,0
 model,"ir.action,name",act_open_customer,Parties associated to Sales,Terceros asociados a Ventas,0
 model,"ir.action,name",act_sale_form_quotation,Quotation Sales,Ventas Cotizadas,0
 model,"ir.action,name",report_sale,Sale,Venta,0
+model,"ir.action,name",act_sale_configuration_form,Sale Configuration,,0
 model,"ir.action,name",act_sale_form,Sales,Ventas,0
 model,"ir.action,name",act_sale_form2,Sales,Ventas,0
 model,"ir.action,name",act_shipment_form,Shipments,Envíos,0
 model,"ir.sequence,name",sequence_sale,Sale,Venta,0
 model,"ir.sequence.type,name",sequence_type_sale,Sale,Venta,0
+model,"ir.ui.menu,name",menu_configuration,Configuration,Configuración,1
 model,"ir.ui.menu,name",menu_sale_form_confirmed,Confirmed Sales,Ventas Confirmadas,0
 model,"ir.ui.menu,name",menu_sale_form_draft,Draft Sales,Ventas en Borrador,0
 model,"ir.ui.menu,name",menu_sale_form_new,New Sale,Nueva venta,0
 model,"ir.ui.menu,name",menu_customer,Parties associated to Sales,Terceros asociados a Ventas,0
 model,"ir.ui.menu,name",menu_sale_form_quotation,Quotation Sales,Ventas Cotizadas,0
+model,"ir.ui.menu,name",menu_sale_configuration,Sale Configuration,,0
 model,"ir.ui.menu,name",menu_sale,Sale Management,Gestión de Ventas,0
 model,"ir.ui.menu,name",menu_sale_form,Sales,Ventas,0
 model,"res.group,name",group_sale,Sale,Venta,0
+model,"res.group,name",group_sale_admin,Sale Administrator,,0
+model,"sale.configuration,name",0,sale.configuration,,0
 model,"sale.handle.invoice.exception.ask,name",0,Invoice Exception Ask,Pregunta de Excepción de Factura,0
 model,"sale.handle.shipment.exception.ask,name",0,Shipment Exception Ask,Pregunta de Excepción de Envío,0
 model,"sale.line-account.invoice.line,name",0,Sale Line - Invoice Line,Línea de Venta - Línea de Factura,0
@@ -167,7 +174,7 @@ odt,sale.sale,0,Taxes:,Impuestos:,0
 odt,sale.sale,0,Total:,Total:,0
 odt,sale.sale,0,Total (excl. taxes):,Total (sin impuestos):,0
 odt,sale.sale,0,Unit Price,Precio Unitario,0
-odt,sale.sale,0,VAT:,IVA:,0
+odt,sale.sale,0,VAT:,NIT:,0
 selection,"account.invoice,sale_exception_state",0,,,0
 selection,"account.invoice,sale_exception_state",0,Ignored,Ignorado,0
 selection,"account.invoice,sale_exception_state",0,Recreated,Rehecho,0
@@ -199,6 +206,7 @@ selection,"stock.move,sale_exception_state",0,Ignored,Ignore,0
 selection,"stock.move,sale_exception_state",0,Recreated,Rehacer,0
 view,product.product,0,Customers,Clientes,0
 view,product.template,0,Customers,Clientes,0
+view,sale.configuration,0,Sale Configuration,,0
 view,sale.handle.invoice.exception.ask,0,Choose invoices to recreate,Escoja una factura a rehacer,0
 view,sale.handle.invoice.exception.ask,0,Handle Invoice Exception,Tratar Excepción de factura,0
 view,sale.handle.shipment.exception.ask,0,Choose move to recreate,Escoja un movimiento a rehacer,0
diff --git a/fr_FR.csv b/fr_FR.csv
index d638d75..11fba76 100644
--- a/fr_FR.csv
+++ b/fr_FR.csv
@@ -11,6 +11,8 @@ error,stock.shipment.out,0,You cannot reset to draft a move generated by a sale.
 field,"account.invoice,sale_exception_state",0,Exception State,État d'exception,0
 field,"product.template,salable",0,Salable,Vendable,0
 field,"product.template,sale_uom",0,Sale UOM,UDM de vente,0
+field,"sale.configuration,rec_name",0,Name,Nom,0
+field,"sale.configuration,sale_sequence",0,Sale Reference Sequence,Séquence de référence de vente,0
 field,"sale.handle.invoice.exception.ask,domain_invoices",0,Domain Invoices,Domaine des factures,0
 field,"sale.handle.invoice.exception.ask,recreate_invoices",0,Recreate Invoices,Recréer les factures,0
 field,"sale.handle.shipment.exception.ask,domain_moves",0,Domain Moves,Domaine des mouvements,0
@@ -89,7 +91,7 @@ field,"sale.sale,untaxed_amount",0,Untaxed,Non-taxé,0
 field,"sale.sale,warehouse",0,Warehouse,Entrepôt,0
 field,"stock.move,sale",0,Sale,Vente,0
 field,"stock.move,sale_exception_state",0,Exception State,État d'exception,0
-field,"stock.move,sale_line",0,,,0
+field,"stock.move,sale_line",0,Sale Line,Ligne de vente,0
 help,"sale.handle.invoice.exception.ask,recreate_invoices",0,The selected invoices will be recreated. The other ones will be ignored.,Les factures sélectionnées seront recréés. Les autres seront ignorées.,0
 model,"ir.action,name",act_sale_form_confirmed,Confirmed Sales,Ventes confirmées,0
 model,"ir.action,name",act_sale_form_draft,Draft Sales,Ventes brouillon,0
@@ -100,19 +102,24 @@ model,"ir.action,name",act_sale_form_new,New Sale,Nouvelle vente,0
 model,"ir.action,name",act_open_customer,Parties associated to Sales,Tiers associés à des ventes,0
 model,"ir.action,name",act_sale_form_quotation,Quotation Sales,Devis,0
 model,"ir.action,name",report_sale,Sale,Vente,0
+model,"ir.action,name",act_sale_configuration_form,Sale Configuration,Configuration des ventes,0
 model,"ir.action,name",act_sale_form,Sales,Ventes,0
 model,"ir.action,name",act_sale_form2,Sales,Ventes,0
 model,"ir.action,name",act_shipment_form,Shipments,Expéditions,0
 model,"ir.sequence,name",sequence_sale,Sale,Vente,0
 model,"ir.sequence.type,name",sequence_type_sale,Sale,Vente,0
+model,"ir.ui.menu,name",menu_configuration,Configuration,Configuration,0
 model,"ir.ui.menu,name",menu_sale_form_confirmed,Confirmed Sales,Ventes confirmées,0
 model,"ir.ui.menu,name",menu_sale_form_draft,Draft Sales,Ventes brouillons,0
 model,"ir.ui.menu,name",menu_sale_form_new,New Sale,Nouvelle vente,0
 model,"ir.ui.menu,name",menu_customer,Parties associated to Sales,Tiers associés à des ventes,0
 model,"ir.ui.menu,name",menu_sale_form_quotation,Quotation Sales,Devis,0
+model,"ir.ui.menu,name",menu_sale_configuration,Sale Configuration,Configuration des ventes,0
 model,"ir.ui.menu,name",menu_sale,Sale Management,Gestion des ventes,0
 model,"ir.ui.menu,name",menu_sale_form,Sales,Ventes,0
 model,"res.group,name",group_sale,Sale,Vente,0
+model,"res.group,name",group_sale_admin,Sale Administrator,Administrateur des ventes,0
+model,"sale.configuration,name",0,sale.configuration,,0
 model,"sale.handle.invoice.exception.ask,name",0,Invoice Exception Ask,Exception de facture - Demande,0
 model,"sale.handle.shipment.exception.ask,name",0,Shipment Exception Ask,Exception d'expédition - Demande,0
 model,"sale.line-account.invoice.line,name",0,Sale Line - Invoice Line,Ligne de vente - Ligne de facture,0
@@ -199,6 +206,7 @@ selection,"stock.move,sale_exception_state",0,Ignored,Ignoré,0
 selection,"stock.move,sale_exception_state",0,Recreated,Recréé,0
 view,product.product,0,Customers,Clients,0
 view,product.template,0,Customers,Clients,0
+view,sale.configuration,0,Sale Configuration,Configuration des ventes,0
 view,sale.handle.invoice.exception.ask,0,Choose invoices to recreate,Choisir les factures à recréer,0
 view,sale.handle.invoice.exception.ask,0,Handle Invoice Exception,Gérer l'exception de facture,0
 view,sale.handle.shipment.exception.ask,0,Choose move to recreate,Choisir le mouvement à recréer,0
diff --git a/party.xml b/party.xml
index 61e4325..fc0f386 100644
--- a/party.xml
+++ b/party.xml
@@ -7,7 +7,7 @@ this repository contains the full copyright notices and license terms. -->
             <field name="name">Sales</field>
             <field name="res_model">sale.sale</field>
             <field name="view_type">form</field>
-            <field name="domain">[("party", "=", active_id)]</field>
+            <field name="domain">[("party", "=", Eval('active_id'))]</field>
         </record>
         <record model="ir.action.keyword"
                 id="act_open_sale_keyword1">
diff --git a/sale.py b/sale.py
index 776cb5f..c201ed1 100644
--- a/sale.py
+++ b/sale.py
@@ -1,10 +1,12 @@
-#This file is part of Tryton.  The COPYRIGHT file at the top level
-#of this repository contains the full copyright notices and license terms.
+#This file is part of Tryton.  The COPYRIGHT file at the top level of
+#this repository contains the full copyright notices and license terms.
 "Sale"
 from trytond.model import ModelWorkflow, ModelView, ModelSQL, fields
 from trytond.modules.company import CompanyReport
 from trytond.wizard import Wizard
 from trytond.backend import TableHandler
+from trytond.pyson import If, In, Eval, Get, Or, Not, Equal, Bool, And, \
+        PYSONEncoder
 from decimal import Decimal
 import copy
 
@@ -17,13 +19,17 @@ class Sale(ModelWorkflow, ModelSQL, ModelView):
 
     company = fields.Many2One('company.company', 'Company', required=True,
             states={
-                'readonly': "state != 'draft' or bool(lines)",
-            }, domain=["('id', 'company' in context and '=' or '!=', " \
-                    "context.get('company', 0))"])
+                'readonly': Or(Not(Equal(Eval('state'), 'draft')),
+                    Bool(Eval('lines'))),
+            }, domain=[
+                ('id', If(In('company', Eval('context', {})), '=', '!='),
+                    Get(Eval('context', {}), 'company', 0)),
+            ])
     reference = fields.Char('Reference', readonly=True, select=1)
-    description = fields.Char('Description', states={
-        'readonly': "state != 'draft'",
-        })
+    description = fields.Char('Description',
+            states={
+                'readonly': Not(Equal(Eval('state'), 'draft')),
+            })
     state = fields.Selection([
         ('draft', 'Draft'),
         ('quotation', 'Quotation'),
@@ -31,53 +37,55 @@ class Sale(ModelWorkflow, ModelSQL, ModelView):
         ('done', 'Done'),
         ('cancel', 'Canceled'),
     ], 'State', readonly=True, required=True)
-    sale_date = fields.Date('Sale Date', required=True, states={
-        'readonly': "state != 'draft'",
-        })
+    sale_date = fields.Date('Sale Date', required=True,
+            states={
+                'readonly': Not(Equal(Eval('state'), 'draft')),
+            })
     payment_term = fields.Many2One('account.invoice.payment_term',
             'Payment Term', required=True, states={
-                'readonly': "state != 'draft'",
+                'readonly': Not(Equal(Eval('state'), 'draft')),
             })
     party = fields.Many2One('party.party', 'Party', change_default=True,
             required=True, states={
-                'readonly': "state != 'draft'",
+                'readonly': Not(Equal(Eval('state'), 'draft')),
             }, on_change=['party', 'payment_term'])
-    party_lang = fields.Function('get_function_fields', type='char',
-            string='Party Language', on_change_with=['party'])
+    party_lang = fields.Function(fields.Char('Party Language',
+        on_change_with=['party']), 'get_function_fields')
     invoice_address = fields.Many2One('party.address', 'Invoice Address',
-            domain=["('party', '=', party)"], states={
-                'readonly': "state != 'draft'",
+            domain=[('party', '=', Eval('party'))], states={
+                'readonly': Not(Equal(Eval('state'), 'draft')),
             })
     shipment_address = fields.Many2One('party.address', 'Shipment Address',
-            domain=["('party', '=', party)"], states={
-                'readonly': "state != 'draft'",
+            domain=[('party', '=', Eval('party'))], states={
+                'readonly': Not(Equal(Eval('state'), 'draft')),
             })
     warehouse = fields.Many2One('stock.location', 'Warehouse',
             domain=[('type', '=', 'warehouse')], required=True, states={
-                'readonly': "state != 'draft'",
+                'readonly': Not(Equal(Eval('state'), 'draft')),
             })
     currency = fields.Many2One('currency.currency', 'Currency', required=True,
         states={
-            'readonly': "state != 'draft' or (bool(lines) and bool(currency))",
+            'readonly': Or(Not(Equal(Eval('state'), 'draft')),
+                And(Bool(Eval('lines')), Bool(Eval('currency')))),
         })
-    currency_digits = fields.Function('get_function_fields', type='integer',
-            string='Currency Digits', on_change_with=['currency'])
+    currency_digits = fields.Function(fields.Integer('Currency Digits',
+        on_change_with=['currency']), 'get_function_fields')
     lines = fields.One2Many('sale.line', 'sale', 'Lines', states={
-        'readonly': "state != 'draft'",
+        'readonly': Not(Equal(Eval('state'), 'draft')),
         }, on_change=['lines', 'currency', 'party'])
     comment = fields.Text('Comment')
-    untaxed_amount = fields.Function('get_function_fields', type='numeric',
-            digits="(16, currency_digits)", string='Untaxed')
-    tax_amount = fields.Function('get_function_fields', type='numeric',
-            digits="(16, currency_digits)", string='Tax')
-    total_amount = fields.Function('get_function_fields', type='numeric',
-            digits="(16, currency_digits)", string='Total')
+    untaxed_amount = fields.Function(fields.Numeric('Untaxed',
+        digits=(16, Eval('currency_digits', 2))), 'get_function_fields')
+    tax_amount = fields.Function(fields.Numeric('Tax',
+        digits=(16, Eval('currency_digits', 2))), 'get_function_fields')
+    total_amount = fields.Function(fields.Numeric('Total',
+        digits=(16, Eval('currency_digits', 2))), 'get_function_fields')
     invoice_method = fields.Selection([
         ('manual', 'Manual'),
         ('order', 'On Order Confirmed'),
         ('shipment', 'On Shipment Sent'),
     ], 'Invoice Method', required=True, states={
-        'readonly': "state != 'draft'",
+        'readonly': Not(Equal(Eval('state'), 'draft')),
         })
     invoice_state = fields.Selection([
         ('none', 'None'),
@@ -91,16 +99,16 @@ class Sale(ModelWorkflow, ModelSQL, ModelView):
             'sale', 'invoice', 'Ignored Invoices', readonly=True)
     invoices_recreated = fields.Many2Many('sale.sale-recreated-account.invoice',
             'sale', 'invoice', 'Recreated Invoices', readonly=True)
-    invoice_paid = fields.Function('get_function_fields', type='boolean',
-            string='Invoices Paid')
-    invoice_exception = fields.Function('get_function_fields', type='boolean',
-            string='Invoices Exception')
+    invoice_paid = fields.Function(fields.Boolean('Invoices Paid'),
+            'get_function_fields')
+    invoice_exception = fields.Function(fields.Boolean('Invoices Exception'),
+            'get_function_fields')
     shipment_method = fields.Selection([
         ('manual', 'Manual'),
         ('order', 'On Order Confirmed'),
         ('invoice', 'On Invoice Paid'),
     ], 'Shipment Method', required=True, states={
-        'readonly': "state != 'draft'",
+        'readonly': Not(Equal(Eval('state'), 'draft')),
         })
     shipment_state = fields.Selection([
         ('none', 'None'),
@@ -108,14 +116,14 @@ class Sale(ModelWorkflow, ModelSQL, ModelView):
         ('sent', 'Sent'),
         ('exception', 'Exception'),
     ], 'Shipment State', readonly=True, required=True)
-    shipments = fields.Function('get_function_fields', type='many2many',
-            relation='stock.shipment.out', string='Shipments')
-    moves = fields.Function('get_function_fields', type='many2many',
-            relation='stock.move', string='Moves')
-    shipment_done = fields.Function('get_function_fields', type='boolean',
-            string='Shipment Done')
-    shipment_exception = fields.Function('get_function_fields', type='boolean',
-            string='Shipments Exception')
+    shipments = fields.Function(fields.One2Many('stock.shipment.out', None,
+        'Shipments'), 'get_function_fields')
+    moves = fields.Function(fields.One2Many('stock.move', None, 'Moves'),
+            'get_function_fields')
+    shipment_done = fields.Function(fields.Boolean('Shipment Done'),
+            'get_function_fields')
+    shipment_exception = fields.Function(fields.Boolean('Shipments Exception'),
+            'get_function_fields')
 
     def __init__(self):
         super(Sale, self).__init__()
@@ -156,6 +164,10 @@ class Sale(ModelWorkflow, ModelSQL, ModelView):
                 "SET invoice_method = 'shipment' "\
                 "WHERE invoice_method = 'packing'")
 
+        # Add index on create_date
+        table = TableHandler(cursor, self, module_name)
+        table.index_action('create_date', action='add')
+
     def default_payment_term(self, cursor, user, context=None):
         payment_term_obj = self.pool.get('account.invoice.payment_term')
         payment_term_ids = payment_term_obj.search(cursor, user,
@@ -173,7 +185,6 @@ class Sale(ModelWorkflow, ModelSQL, ModelView):
         return False
 
     def default_company(self, cursor, user, context=None):
-        company_obj = self.pool.get('company.company')
         if context is None:
             context = {}
         if context.get('company'):
@@ -222,7 +233,7 @@ class Sale(ModelWorkflow, ModelSQL, ModelView):
     def default_shipment_state(self, cursor, user, context=None):
         return 'none'
 
-    def on_change_party(self, cursor, user, ids, vals, context=None):
+    def on_change_party(self, cursor, user, vals, context=None):
         party_obj = self.pool.get('party.party')
         address_obj = self.pool.get('party.address')
         payment_term_obj = self.pool.get('account.invoice.payment_term')
@@ -255,8 +266,7 @@ class Sale(ModelWorkflow, ModelSQL, ModelView):
                     res['payment_term'], context=context).rec_name
         return res
 
-    def on_change_with_currency_digits(self, cursor, user, ids, vals,
-            context=None):
+    def on_change_with_currency_digits(self, cursor, user, vals, context=None):
         currency_obj = self.pool.get('currency.currency')
         if vals.get('currency'):
             currency = currency_obj.browse(cursor, user, vals['currency'],
@@ -294,7 +304,7 @@ class Sale(ModelWorkflow, ModelSQL, ModelView):
                 res['language'] = sale.party.lang.code
         return res
 
-    def on_change_with_party_lang(self, cursor, user, ids, vals,
+    def on_change_with_party_lang(self, cursor, user, vals,
             context=None):
         party_obj = self.pool.get('party.party')
         if vals.get('party'):
@@ -324,7 +334,7 @@ class Sale(ModelWorkflow, ModelSQL, ModelView):
         return res
 
 
-    def on_change_lines(self, cursor, user, ids, vals, context=None):
+    def on_change_lines(self, cursor, user, vals, context=None):
         currency_obj = self.pool.get('currency.currency')
         tax_obj = self.pool.get('account.tax')
         invoice_obj = self.pool.get('account.invoice')
@@ -377,7 +387,7 @@ class Sale(ModelWorkflow, ModelSQL, ModelView):
                     res['total_amount'])
         return res
 
-    def get_function_fields(self, cursor, user, ids, names, args, context=None):
+    def get_function_fields(self, cursor, user, ids, names, context=None):
         '''
         Function to compute function fields for sale ids
 
@@ -385,7 +395,6 @@ class Sale(ModelWorkflow, ModelSQL, ModelView):
         :param user: the user id
         :param ids: the ids of the sales
         :param names: the list of field name to compute
-        :param args: optional argument
         :param context: the context
         :return: a dictionary with all field names as key and
             a dictionary as value with id as key
@@ -657,7 +666,7 @@ class Sale(ModelWorkflow, ModelSQL, ModelView):
                 return False
         return True
 
-    def get_rec_name(self, cursor, user, ids, name, arg, context=None):
+    def get_rec_name(self, cursor, user, ids, name, context=None):
         if not ids:
             return []
         res = {}
@@ -666,16 +675,12 @@ class Sale(ModelWorkflow, ModelSQL, ModelView):
                     + ' - ' + sale.party.rec_name
         return res
 
-    def search_rec_name(self, cursor, user, name, args, context=None):
-        args2 = []
-        i = 0
-        while i < len(args):
-            names = args[i][2].split(' - ', 1)
-            args2.append(('reference', args[i][1], names[0]))
-            if len(names) != 1 and names[1]:
-                args2.append(('party', args[i][1], names[1]))
-            i += 1
-        return args2
+    def search_rec_name(self, cursor, user, name, clause, context=None):
+        names = clause[2].split(' - ', 1)
+        res = [('reference', clause[1], names[0])]
+        if len(names) != 1 and names[1]:
+            res.append(('party', clause[1], names[1]))
+        return res
 
     def copy(self, cursor, user, ids, default=None, context=None):
         if default is None:
@@ -708,13 +713,15 @@ class Sale(ModelWorkflow, ModelSQL, ModelView):
         :return: True if succeed
         '''
         sequence_obj = self.pool.get('ir.sequence')
+        config_obj = self.pool.get('sale.configuration')
 
         sale = self.browse(cursor, user, sale_id, context=context)
 
         if sale.reference:
             return True
 
-        reference = sequence_obj.get(cursor, user, 'sale.sale',
+        config = config_obj.browse(cursor, user, 1, context=context)
+        reference = sequence_obj.get_id(cursor, user, config.sale_sequence.id,
                 context=context)
         self.write(cursor, user, sale_id, {
             'reference': reference,
@@ -947,55 +954,62 @@ class SaleLine(ModelSQL, ModelView):
         ('comment', 'Comment'),
         ], 'Type', select=1, required=True)
     quantity = fields.Float('Quantity',
-            digits="(16, unit_digits)",
+            digits=(16, Eval('unit_digits', 2)),
             states={
-                'invisible': "type != 'line'",
-                'required': "type == 'line'",
-                'readonly': "not globals().get('_parent_sale')",
+                'invisible': Not(Equal(Eval('type'), 'line')),
+                'required': Equal(Eval('type'), 'line'),
+                'readonly': Not(Bool(Eval('_parent_sale'))),
             }, on_change=['product', 'quantity', 'unit',
                 '_parent_sale.currency', '_parent_sale.party'])
     unit = fields.Many2One('product.uom', 'Unit',
             states={
-                'required': "product",
-                'invisible': "type != 'line'",
-                'readonly': "not globals().get('_parent_sale')",
-            }, domain=["('category', '=', " \
-                    "(product, 'product.default_uom.category'))"],
-            context="{'category': (product, 'product.default_uom.category')}",
+                'required': Bool(Eval('product')),
+                'invisible': Not(Equal(Eval('type'), 'line')),
+                'readonly': Not(Bool(Eval('_parent_sale'))),
+            }, domain=[
+                ('category', '=',
+                    (Eval('product'), 'product.default_uom.category')),
+            ],
+            context={
+                'category': (Eval('product'), 'product.default_uom.category'),
+            },
             on_change=['product', 'quantity', 'unit', '_parent_sale.currency',
                 '_parent_sale.party'])
-    unit_digits = fields.Function('get_unit_digits', type='integer',
-            string='Unit Digits', on_change_with=['unit'])
+    unit_digits = fields.Function(fields.Integer('Unit Digits',
+        on_change_with=['unit']), 'get_unit_digits')
     product = fields.Many2One('product.product', 'Product',
             domain=[('salable', '=', True)],
             states={
-                'invisible': "type != 'line'",
-                'readonly': "not globals().get('_parent_sale')",
+                'invisible': Not(Equal(Eval('type'), 'line')),
+                'readonly': Not(Bool(Eval('_parent_sale'))),
             }, on_change=['product', 'unit', 'quantity', 'description',
                 '_parent_sale.party', '_parent_sale.currency'],
-            context="{'locations': " \
-                        "_parent_sale.warehouse and [_parent_sale.warehouse] " \
-                        "or False, " \
-                    "'stock_date_end': _parent_sale.sale_date, " \
-                    "'salable': True, " \
-                    "'stock_skip_warehouse': True}")
+            context={
+                'locations': If(Bool(Get(Eval('_parent_sale', {}),
+                    'warehouse')),
+                    [Get(Eval('_parent_sale', {}), 'warehouse')],
+                    []),
+                'stock_date_end': Get(Eval('_parent_sale', {}), 'sale_date'),
+                'salable': True,
+                'stock_skip_warehouse': True,
+            })
     unit_price = fields.Numeric('Unit Price', digits=(16, 4),
             states={
-                'invisible': "type != 'line'",
-                'required': "type == 'line'",
+                'invisible': Not(Equal(Eval('type'), 'line')),
+                'required': Equal(Eval('type'), 'line'),
             })
-    amount = fields.Function('get_amount', type='numeric', string='Amount',
-            digits="(16, _parent_sale.currency_digits)",
-            states={
-                'invisible': "type not in ('line', 'subtotal')",
-                'readonly': "not globals().get('_parent_sale')",
-            }, on_change_with=['type', 'quantity', 'unit_price',
-                '_parent_sale.currency'])
+    amount = fields.Function(fields.Numeric('Amount',
+        digits=(16, Get(Eval('_parent_sale', {}), 'currency_digits', 2)),
+        states={
+            'invisible': Not(In(Eval('type'), ['line', 'subtotal'])),
+            'readonly': Not(Bool(Eval('_parent_sale'))),
+        }, on_change_with=['type', 'quantity', 'unit_price',
+            '_parent_sale.currency']), 'get_amount')
     description = fields.Text('Description', size=None, required=True)
     note = fields.Text('Note')
     taxes = fields.Many2Many('sale.line-account.tax', 'line', 'tax', 'Taxes',
             domain=[('parent', '=', False)], states={
-                'invisible': "type != 'line'",
+                'invisible': Not(Equal(Eval('type'), 'line')),
             })
     invoice_lines = fields.Many2Many('sale.line-account.invoice.line',
             'sale_line', 'invoice_line', 'Invoice Lines', readonly=True)
@@ -1005,10 +1019,9 @@ class SaleLine(ModelSQL, ModelView):
             'sale_line', 'move', 'Ignored Moves', readonly=True)
     moves_recreated = fields.Many2Many('sale.line-recreated-stock.move',
             'sale_line', 'move', 'Recreated Moves', readonly=True)
-    move_done = fields.Function('get_move_done', type='boolean',
-            string='Moves Done')
-    move_exception = fields.Function('get_move_exception', type='boolean',
-            string='Moves Exception')
+    move_done = fields.Function(fields.Boolean('Moves Done'), 'get_move_done')
+    move_exception = fields.Function(fields.Boolean('Moves Exception'),
+            'get_move_exception')
 
     def __init__(self):
         super(SaleLine, self).__init__()
@@ -1040,8 +1053,7 @@ class SaleLine(ModelSQL, ModelView):
     def default_unit_price(self, cursor, user, context=None):
         return Decimal('0.0')
 
-    def on_change_with_unit_digits(self, cursor, user, ids, vals,
-            context=None):
+    def on_change_with_unit_digits(self, cursor, user, vals, context=None):
         uom_obj = self.pool.get('product.uom')
         if vals.get('unit'):
             uom = uom_obj.browse(cursor, user, vals['unit'],
@@ -1049,7 +1061,7 @@ class SaleLine(ModelSQL, ModelView):
             return uom.digits
         return 2
 
-    def get_unit_digits(self, cursor, user, ids, name, arg, context=None):
+    def get_unit_digits(self, cursor, user, ids, name, context=None):
         res = {}
         for line in self.browse(cursor, user, ids, context=context):
             if line.unit:
@@ -1058,7 +1070,7 @@ class SaleLine(ModelSQL, ModelView):
                 res[line.id] = 2
         return res
 
-    def get_move_done(self, cursor, user, ids, name, args, context=None):
+    def get_move_done(self, cursor, user, ids, name, context=None):
         uom_obj = self.pool.get('product.uom')
         res = {}
         for line in self.browse(cursor, user, ids, context=context):
@@ -1085,7 +1097,7 @@ class SaleLine(ModelSQL, ModelView):
             res[line.id] = val
         return res
 
-    def get_move_exception(self, cursor, user, ids, name, args, context=None):
+    def get_move_exception(self, cursor, user, ids, name, context=None):
         res = {}
         for line in self.browse(cursor, user, ids, context=context):
             val = False
@@ -1128,7 +1140,7 @@ class SaleLine(ModelSQL, ModelView):
             ctx2['uom'] = product.sale_uom.id
         return ctx2
 
-    def on_change_product(self, cursor, user, ids, vals, context=None):
+    def on_change_product(self, cursor, user, vals, context=None):
         party_obj = self.pool.get('party.party')
         product_obj = self.pool.get('product.product')
         uom_obj = self.pool.get('product.uom')
@@ -1188,11 +1200,11 @@ class SaleLine(ModelSQL, ModelView):
         vals = vals.copy()
         vals['unit_price'] = res['unit_price']
         vals['type'] = 'line'
-        res['amount'] = self.on_change_with_amount(cursor, user, ids,
-                vals, context=context)
+        res['amount'] = self.on_change_with_amount(cursor, user, vals,
+                context=context)
         return res
 
-    def on_change_quantity(self, cursor, user, ids, vals, context=None):
+    def on_change_quantity(self, cursor, user, vals, context=None):
         product_obj = self.pool.get('product.product')
 
         if context is None:
@@ -1211,10 +1223,10 @@ class SaleLine(ModelSQL, ModelView):
                 context=ctx2)[vals['product']]
         return res
 
-    def on_change_unit(self, cursor, user, ids, vals, context=None):
-        return self.on_change_quantity(cursor, user, ids, vals, context=context)
+    def on_change_unit(self, cursor, user, vals, context=None):
+        return self.on_change_quantity(cursor, user, vals, context=context)
 
-    def on_change_with_amount(self, cursor, user, ids, vals, context=None):
+    def on_change_with_amount(self, cursor, user, vals, context=None):
         currency_obj = self.pool.get('currency.currency')
         if vals.get('type') == 'line':
             if isinstance(vals.get('_parent_sale.currency'), (int, long)):
@@ -1229,7 +1241,7 @@ class SaleLine(ModelSQL, ModelView):
             return amount
         return Decimal('0.0')
 
-    def get_amount(self, cursor, user, ids, name, arg, context=None):
+    def get_amount(self, cursor, user, ids, name, context=None):
         currency_obj = self.pool.get('currency.currency')
         res = {}
         for line in self.browse(cursor, user, ids, context=context):
@@ -1434,29 +1446,30 @@ class Template(ModelSQL, ModelView):
     _name = 'product.template'
 
     salable = fields.Boolean('Salable', states={
-        'readonly': "active == False",
+        'readonly': Not(Bool(Eval('active'))),
         })
     sale_uom = fields.Many2One('product.uom', 'Sale UOM', states={
-        'readonly': "active == False",
-        'invisible': "not salable",
-        'required': "salable",
-        }, domain=["('category', '=', (default_uom, 'uom.category'))"],
-        context="{'category': (default_uom, 'uom.category')}",
+        'readonly': Not(Bool(Eval('active'))),
+        'invisible': Not(Bool(Eval('salable'))),
+        'required': Bool(Eval('salable')),
+        }, domain=[
+            ('category', '=', (Eval('default_uom'), 'uom.category')),
+        ],
+        context={'category': (Eval('default_uom'), 'uom.category')},
         on_change_with=['default_uom', 'sale_uom', 'salable'])
 
     def __init__(self):
         super(Template, self).__init__()
-        if 'not bool(account_category) and bool(salable)' not in \
-                self.account_revenue.states.get('required', ''):
-            self.account_revenue = copy.copy(self.account_revenue)
-            self.account_revenue.states = copy.copy(self.account_revenue.states)
-            if not self.account_revenue.states.get('required'):
-                self.account_revenue.states['required'] = \
-                        "not bool(account_category) and bool(salable)"
-            else:
-                self.account_revenue.states['required'] = '(' + \
-                        self.account_revenue.states['required'] + ') ' \
-                        'or (not bool(account_category) and bool(salable))'
+        self.account_revenue = copy.copy(self.account_revenue)
+        self.account_revenue.states = copy.copy(self.account_revenue.states)
+        required = And(Not(Bool(Eval('account_category'))),
+                Bool(Eval('salable')))
+        if not self.account_revenue.states.get('required'):
+            self.account_revenue.states['required'] = required
+        else:
+            self.account_revenue.states['required'] = \
+                    Or(self.account_revenue.states['required'],
+                            required)
         if 'account_category' not in self.account_revenue.depends:
             self.account_revenue = copy.copy(self.account_revenue)
             self.account_revenue.depends = \
@@ -1476,7 +1489,7 @@ class Template(ModelSQL, ModelView):
             return True
         return False
 
-    def on_change_with_sale_uom(self, cursor, user, ids, vals, context=None):
+    def on_change_with_sale_uom(self, cursor, user, vals, context=None):
         uom_obj = self.pool.get('product.uom')
         res = False
 
@@ -1500,11 +1513,6 @@ Template()
 class Product(ModelSQL, ModelView):
     _name = 'product.product'
 
-    def on_change_with_sale_uom(self, cursor, user, ids, vals, context=None):
-        template_obj = self.pool.get('product.template')
-        return template_obj.on_change_with_sale_uom(cursor, user, ids, vals,
-                context=context)
-
     def get_sale_price(self, cursor, user, ids, quantity=0, context=None):
         '''
         Return the sale price for product ids.
@@ -1608,21 +1616,19 @@ ShipmentOut()
 class Move(ModelSQL, ModelView):
     _name = 'stock.move'
 
-    sale_line = fields.Many2One('sale.line', select=1,
+    sale_line = fields.Many2One('sale.line', 'Sale Line', select=1,
             states={
-                'readonly': "state != 'draft'",
+                'readonly': Not(Equal(Eval('state'), 'draft')),
             })
-    sale = fields.Function('get_sale', type='many2one',
-            relation='sale.sale', string='Sale',
-            fnct_search='search_sale', select=1)
-    sale_exception_state = fields.Function('get_sale_exception_state',
-            type='selection',
-            selection=[('', ''),
-                       ('ignored', 'Ignored'),
-                       ('recreated', 'Recreated')],
-            string='Exception State')
-
-    def get_sale(self, cursor, user, ids, name, arg, context=None):
+    sale = fields.Function(fields.Many2One('sale.sale', 'Sale', select=1),
+            'get_sale', searcher='search_sale')
+    sale_exception_state = fields.Function(fields.Selection([
+        ('', ''),
+        ('ignored', 'Ignored'),
+        ('recreated', 'Recreated'),
+        ], 'Exception State'), 'get_sale_exception_state')
+
+    def get_sale(self, cursor, user, ids, name, context=None):
         sale_obj = self.pool.get('sale.sale')
 
         res = {}
@@ -1632,17 +1638,10 @@ class Move(ModelSQL, ModelView):
                 res[move.id] = move.sale_line.sale.id
         return res
 
-    def search_sale(self, cursor, user, name, args, context=None):
-        args2 = []
-        i = 0
-        while i < len(args):
-            field = args[i][0]
-            args2.append(('sale_line.' + field, args[i][1], args[i][2]))
-            i += 1
-        return args2
-
-    def get_sale_exception_state(self, cursor, user, ids, name, arg,
-                                 context=None):
+    def search_sale(self, cursor, user, name, clause, context=None):
+        return [('sale_line.' + name,) + clause[1:]]
+
+    def get_sale_exception_state(self, cursor, user, ids, name, context=None):
         res = {}.fromkeys(ids, '')
         for move in self.browse(cursor, user, ids, context=context):
             if not move.sale_line:
@@ -1704,12 +1703,11 @@ Move()
 class Invoice(ModelSQL, ModelView):
     _name = 'account.invoice'
 
-    sale_exception_state = fields.Function('get_sale_exception_state',
-            type='selection',
-            selection=[('', ''),
-                       ('ignored', 'Ignored'),
-                       ('recreated', 'Recreated')],
-            string='Exception State')
+    sale_exception_state = fields.Function(fields.Selection([
+        ('', ''),
+        ('ignored', 'Ignored'),
+        ('recreated', 'Recreated'),
+        ], 'Exception State'), 'get_sale_exception_state')
 
     def __init__(self):
         super(Invoice, self).__init__()
@@ -1731,8 +1729,7 @@ class Invoice(ModelSQL, ModelView):
         return super(Invoice, self).button_draft(
             cursor, user, ids, context=context)
 
-    def get_sale_exception_state(self, cursor, user, ids, name, arg,
-                                 context=None):
+    def get_sale_exception_state(self, cursor, user, ids, name, context=None):
         sale_obj = self.pool.get('sale.sale')
         sale_ids = sale_obj.search(
             cursor, user, [('invoices', 'in', ids)], context=context)
@@ -1786,19 +1783,13 @@ class OpenCustomer(Wizard):
         model_data_obj = self.pool.get('ir.model.data')
         act_window_obj = self.pool.get('ir.action.act_window')
         wizard_obj = self.pool.get('ir.action.wizard')
-
-        model_data_ids = model_data_obj.search(cursor, user, [
-            ('fs_id', '=', 'act_party_form'),
-            ('module', '=', 'party'),
-            ('inherit', '=', False),
-            ], limit=1, context=context)
-        model_data = model_data_obj.browse(cursor, user, model_data_ids[0],
-                context=context)
-        res = act_window_obj.read(cursor, user, model_data.db_id,
-                context=context)
+        act_window_id = model_data_obj.get_id(cursor, user, 'party',
+                'act_party_form', context=context)
+        res = act_window_obj.read(cursor, user, act_window_id, context=context)
         cursor.execute("SELECT DISTINCT(party) FROM sale_sale")
         customer_ids = [line[0] for line in cursor.fetchall()]
-        res['domain'] = str([('id', 'in', customer_ids)])
+        res['pyson_domain'] = PYSONEncoder().encode(
+                [('id', 'in', customer_ids)])
 
         model_data_ids = model_data_obj.search(cursor, user, [
             ('fs_id', '=', 'act_open_customer'),
@@ -1823,7 +1814,7 @@ class HandleShipmentExceptionAsk(ModelView):
 
     recreate_moves = fields.Many2Many(
         'stock.move', None, None, 'Recreate Moves',
-        domain=["('id', 'in', domain_moves)"], depends=['domain_moves'])
+        domain=[('id', 'in', Eval('domain_moves'))], depends=['domain_moves'])
     domain_moves = fields.Many2Many(
         'stock.move', None, None, 'Domain Moves')
 
@@ -1927,7 +1918,8 @@ class HandleInvoiceExceptionAsk(ModelView):
 
     recreate_invoices = fields.Many2Many(
         'account.invoice', None, None, 'Recreate Invoices',
-        domain=["('id', 'in', domain_invoices)"], depends=['domain_invoices'],
+        domain=[('id', 'in', Eval('domain_invoices'))],
+        depends=['domain_invoices'],
         help='The selected invoices will be recreated. '\
             'The other ones will be ignored.')
     domain_invoices = fields.Many2Many(
diff --git a/sale.xml b/sale.xml
index 6c035ec..27d6d5e 100644
--- a/sale.xml
+++ b/sale.xml
@@ -7,8 +7,11 @@ this repository contains the full copyright notices and license terms. -->
         <record model="res.group" id="group_sale">
             <field name="name">Sale</field>
         </record>
+        <record model="res.group" id="group_sale_admin">
+            <field name="name">Sale Administrator</field>
+        </record>
         <record model="res.user" id="res.user_admin">
-            <field name="groups" eval="[('add', ref('group_sale'))]"/>
+            <field name="groups" eval="[('add', ref('group_sale')), ('add', ref('group_sale_admin'))]"/>
         </record>
 
         <record model="ir.action.wizard" id="wizard_shipment_handle_exception">
@@ -80,26 +83,26 @@ this repository contains the full copyright notices and license terms. -->
                                 <field name="state"/>
                                 <group col="6" colspan="2" id="buttons">
                                     <button name="cancel" string="Cancel"
-                                        states="{'invisible': '''state == 'cancel' or not ((state in ('draft', 'quotation')) or (invoice_state == 'exception') or (shipment_state == 'exception'))''', 'readonly': '''%(group_sale)d not in groups'''}"
+                                        states="{'invisible': Or(Equal(Eval('state'), 'cancel'), Not(In(Eval('state'), ['draft', 'quotation'])), Equal(Eval('invoice_state'), 'exception'), Equal(Eval('shipment_state'), 'exception')), 'readonly': Not(In(%(group_sale)d, Eval('groups', [])))}"
                                         icon="tryton-cancel"/>
                                     <button name="draft" string="Draft"
-                                        states="{'invisible': '''state != 'quotation' ''', 'readonly': '''%(group_sale)d not in groups'''}"
+                                        states="{'invisible': Not(Equal(Eval('state'), 'quotation')), 'readonly': Not(In(%(group_sale)d, Eval('groups', [])))}"
                                         icon="tryton-go-previous"/>
                                     <button name="quotation" string="Quotation"
-                                        states="{'invisible': '''state != 'draft' ''', 'readonly': '''(not bool(lines)) or %(group_sale)d not in groups'''}"
+                                        states="{'invisible': Not(Equal(Eval('state'), 'draft')), 'readonly': Or(Not(Bool(Eval('lines'))), Not(In(%(group_sale)d, Eval('groups', []))))}"
                                         icon="tryton-go-next"/>
                                     <button name="%(wizard_invoice_handle_exception)d"
                                             string="Handle Invoice Exception"
                                             type="action"
-                                            states="{'invisible': '''invoice_state != 'exception' or state == 'cancel' ''', 'readonly': '''%(group_sale)d not in groups'''}"
+                                            states="{'invisible': Or(Not(Equal(Eval('invoice_state'), 'exception')), Equal(Eval('state'), 'cancel')), 'readonly': Not(In(%(group_sale)d, Eval('groups', [])))}"
                                             icon="tryton-go-next"/>
                                     <button name="%(wizard_shipment_handle_exception)d"
                                             type="action"
                                             string="Handle Shipment Exception"
-                                            states="{'invisible': '''shipment_state != 'exception' or state == 'cancel' ''', 'readonly': '''%(group_sale)d not in groups'''}"
+                                            states="{'invisible': Or(Not(Equal(Eval('shipment_state'), 'exception')), Equal(Eval('state'), 'cancel')), 'readonly': Not(In(%(group_sale)d, Eval('groups', [])))}"
                                             icon="tryton-go-next"/>
                                     <button name="confirm" string="Confirm"
-                                        states="{'invisible': '''state != 'quotation' ''', 'readonly': '''%(group_sale)d not in groups'''}"
+                                        states="{'invisible': Not(Equal(Eval('state'), 'quotation')), 'readonly': Not(In(%(group_sale)d, Eval('groups', [])))}"
                                         icon="tryton-go-next"/>
                                 </group>
                             </group>
@@ -113,7 +116,7 @@ this repository contains the full copyright notices and license terms. -->
                             <label name="shipment_method"/>
                             <field name="shipment_method"/>
                             <separator name="comment" colspan="4"/>
-                            <field name="comment" colspan="4" spell="party_lang"/>
+                            <field name="comment" colspan="4" spell="Eval('party_lang')"/>
                         </page>
                         <page string="Invoices" id="invoices">
                             <separator name="invoices" colspan="4"/>
@@ -177,6 +180,7 @@ this repository contains the full copyright notices and license terms. -->
                     <field name="shipment_state" select="2"/>
                     <field name="description" select="2"/>
                     <field name="currency_digits" tree_invisible="1"/>
+                    <field name="create_date" tree_invisible="1" select="2"/>
                 </tree>
                 ]]>
             </field>
@@ -221,7 +225,7 @@ this repository contains the full copyright notices and license terms. -->
             <field name="name">Shipments</field>
             <field name="res_model">stock.shipment.out</field>
             <field name="view_type">form</field>
-            <field name="domain">[("id", "in", shipments)]</field>
+            <field name="domain">[("id", "in", Eval('shipments'))]</field>
         </record>
         <record model="ir.action.keyword"
                 id="act_open_shipment_keyword1">
@@ -233,7 +237,7 @@ this repository contains the full copyright notices and license terms. -->
             <field name="name">Invoices</field>
             <field name="res_model">account.invoice</field>
             <field name="view_type">form</field>
-            <field name="domain">[("id", "in", invoices)]</field>
+            <field name="domain">[("id", "in", Eval('invoices'))]</field>
         </record>
         <record model="ir.action.keyword"
                 id="act_open_invoice_keyword1">
@@ -246,6 +250,7 @@ this repository contains the full copyright notices and license terms. -->
             <field name="name">Sales</field>
             <field name="res_model">sale.sale</field>
             <field name="view_type">form</field>
+            <field name="search_value">{'create_date': ['between', Date(delta_years=-1)]}</field>
         </record>
         <record model="ir.action.act_window.view" id="act_sale_form_view1">
             <field name="sequence" eval="10"/>
@@ -258,7 +263,7 @@ this repository contains the full copyright notices and license terms. -->
             <field name="act_window" ref="act_sale_form"/>
         </record>
         <menuitem parent="menu_sale" action="act_sale_form"
-            id="menu_sale_form"/>
+            id="menu_sale_form" sequence="10"/>
 
         <record model="ir.action.act_window" id="act_sale_form_new">
             <field name="name">New Sale</field>
@@ -354,6 +359,8 @@ this repository contains the full copyright notices and license terms. -->
         <record model="ir.sequence.type" id="sequence_type_sale">
             <field name="name">Sale</field>
             <field name="code">sale.sale</field>
+            <field name="groups"
+                eval="[('add', ref('res.group_admin')), ('add', ref('group_sale_admin'))]"/>
         </record>
         <record model="ir.sequence" id="sequence_sale">
             <field name="name">Sale</field>
@@ -804,7 +811,7 @@ this repository contains the full copyright notices and license terms. -->
                             <newline/>
                             <label name="description"/>
                             <field name="description" colspan="3"
-                                spell="_parent_sale.party_lang"/>
+                                spell="Get(Eval('_parent_sale', {}), 'party_lang')"/>
                             <label name="quantity"/>
                             <field name="quantity"/>
                             <label name="unit"/>
@@ -819,7 +826,7 @@ this repository contains the full copyright notices and license terms. -->
                         <page string="Notes" id="notes">
                             <separator name="note" colspan="4"/>
                             <field name="note" colspan="4"
-                                spell="_parent_sale.party_lang"/>
+                                spell="Get(Eval('_parent_sale', {}), 'party_lang')"/>
                         </page>
                     </notebook>
                     <field name="unit_digits" invisible="1" colspan="4"/>
@@ -878,7 +885,7 @@ this repository contains the full copyright notices and license terms. -->
                     <xpath expr="/form/notebook/page[@id="general"]"
                         position="after">
                         <page string="Customers"
-                            states="{'invisible': '''not salable'''}"
+                            states="{'invisible': Not(Bool(Eval('salable')))}"
                             id="customers">
                             <label name="salable"/>
                             <field name="salable"/>
diff --git a/setup.py b/setup.py
index f888cd3..4f2ce20 100644
--- a/setup.py
+++ b/setup.py
@@ -2,19 +2,22 @@
 #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 setuptools import setup, find_packages
+from setuptools import setup
 import re
 
-info = eval(file('__tryton__.py').read())
+info = eval(open('__tryton__.py').read())
+major_version, minor_version, _ = info.get('version', '0.0.1').split('.', 2)
+major_version = int(major_version)
+minor_version = int(minor_version)
 
 requires = []
 for dep in info.get('depends', []):
     if not re.match(r'(ir|res|workflow|webdav)(\W|$)', dep):
-        requires.append('trytond_' + dep)
-
-major_version, minor_version, _ = info.get('version', '0.0.1').split('.', 2)
-requires.append('trytond >= %s.%s' % (major_version, minor_version))
-requires.append('trytond < %s.%s' % (major_version, int(minor_version) + 1))
+        requires.append('trytond_%s >= %s.%s, < %s.%s' %
+                (dep, major_version, minor_version, major_version,
+                    minor_version + 1))
+requires.append('trytond >= %s.%s, < %s.%s' %
+        (major_version, minor_version, major_version, minor_version + 1))
 
 setup(name='trytond_sale',
     version=info.get('version', '0.0.1'),
@@ -27,6 +30,7 @@ setup(name='trytond_sale',
     package_dir={'trytond.modules.sale': '.'},
     packages=[
         'trytond.modules.sale',
+        'trytond.modules.sale.tests',
     ],
     package_data={
         'trytond.modules.sale': info.get('xml', []) \
@@ -56,4 +60,6 @@ setup(name='trytond_sale',
     [trytond.modules]
     sale = trytond.modules.sale
     """,
+    test_suite='tests',
+    test_loader='trytond.test_loader:Loader',
 )
diff --git a/tests/__init__.py b/tests/__init__.py
index 7d658b3..df19c77 100644
--- a/tests/__init__.py
+++ b/tests/__init__.py
@@ -1,4 +1,4 @@
 #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 test_sale import *
+from test_sale import suite
diff --git a/tests/test_sale.py b/tests/test_sale.py
index 8cf71b3..5de7cac 100644
--- a/tests/test_sale.py
+++ b/tests/test_sale.py
@@ -10,7 +10,7 @@ if os.path.isdir(DIR):
 
 import unittest
 import trytond.tests.test_tryton
-from trytond.tests.test_tryton import RPCProxy, CONTEXT, SOCK, test_view
+from trytond.tests.test_tryton import test_view
 
 
 class SaleTestCase(unittest.TestCase):
@@ -28,11 +28,9 @@ class SaleTestCase(unittest.TestCase):
         self.assertRaises(Exception, test_view('sale'))
 
 def suite():
-    return unittest.TestLoader().loadTestsFromTestCase(SaleTestCase)
+    suite = trytond.tests.test_tryton.suite()
+    suite.addTests(unittest.TestLoader().loadTestsFromTestCase(SaleTestCase))
+    return suite
 
 if __name__ == '__main__':
-    suiteTrytond = trytond.tests.test_tryton.suite()
-    suiteSale = suite()
-    alltests = unittest.TestSuite([suiteTrytond, suiteSale])
-    unittest.TextTestRunner(verbosity=2).run(alltests)
-    SOCK.disconnect()
+    unittest.TextTestRunner(verbosity=2).run(suite())
diff --git a/trytond_sale.egg-info/PKG-INFO b/trytond_sale.egg-info/PKG-INFO
index f5d3238..728f0f8 100644
--- a/trytond_sale.egg-info/PKG-INFO
+++ b/trytond_sale.egg-info/PKG-INFO
@@ -1,6 +1,6 @@
 Metadata-Version: 1.0
 Name: trytond-sale
-Version: 1.4.2
+Version: 1.6.0
 Summary: Define sale order.
 Add to product sale informations.
 Define the sale price as the list price.
@@ -20,7 +20,7 @@ Home-page: http://www.tryton.org/
 Author: B2CK
 Author-email: info at b2ck.com
 License: GPL-3
-Download-URL: http://downloads.tryton.org/1.4/
+Download-URL: http://downloads.tryton.org/1.6/
 Description: UNKNOWN
 Platform: UNKNOWN
 Classifier: Development Status :: 5 - Production/Stable
diff --git a/trytond_sale.egg-info/SOURCES.txt b/trytond_sale.egg-info/SOURCES.txt
index b621800..39f7bda 100644
--- a/trytond_sale.egg-info/SOURCES.txt
+++ b/trytond_sale.egg-info/SOURCES.txt
@@ -5,6 +5,7 @@ LICENSE
 MANIFEST.in
 README
 TODO
+configuration.xml
 de_DE.csv
 es_CO.csv
 es_ES.csv
@@ -15,10 +16,11 @@ sale.xml
 setup.py
 ./__init__.py
 ./__tryton__.py
+./configuration.py
 ./sale.py
+./tests/__init__.py
+./tests/test_sale.py
 doc/index.rst
-tests/__init__.py
-tests/test_sale.py
 trytond_sale.egg-info/PKG-INFO
 trytond_sale.egg-info/SOURCES.txt
 trytond_sale.egg-info/dependency_links.txt
diff --git a/trytond_sale.egg-info/requires.txt b/trytond_sale.egg-info/requires.txt
index 8bba34c..917bf70 100644
--- a/trytond_sale.egg-info/requires.txt
+++ b/trytond_sale.egg-info/requires.txt
@@ -1,10 +1,9 @@
-trytond_company
-trytond_party
-trytond_stock
-trytond_account
-trytond_product
-trytond_account_invoice
-trytond_currency
-trytond_account_product
-trytond >= 1.4
-trytond < 1.5
\ No newline at end of file
+trytond_company >= 1.6, < 1.7
+trytond_party >= 1.6, < 1.7
+trytond_stock >= 1.6, < 1.7
+trytond_account >= 1.6, < 1.7
+trytond_product >= 1.6, < 1.7
+trytond_account_invoice >= 1.6, < 1.7
+trytond_currency >= 1.6, < 1.7
+trytond_account_product >= 1.6, < 1.7
+trytond >= 1.6, < 1.7
\ No newline at end of file
commit 0ef58e29e8b554e5d4a5338248bad4fdb023f9f8
Author: Daniel Baumann <daniel at debian.org>
Date:   Fri Apr 9 14:31:33 2010 +0200

    Adding Dm-Upload-Allowed in control in preparation for Mathias.

diff --git a/debian/control b/debian/control
index 5047307..77b8dc8 100644
--- a/debian/control
+++ b/debian/control
@@ -5,6 +5,7 @@ Maintainer: Debian Tryton Maintainers <tryton at lists.debian-maintainers.org>
 Uploaders:
  Daniel Baumann <daniel at debian.org>,
  Mathias Behrle <mathiasb at mbsolutions.selfip.biz>
+Dm-Upload-Allowed: yes
 Build-Depends: debhelper (>= 7), python, python-setuptools, python-support
 Standards-Version: 3.8.4
 Homepage: http://www.tryton.org/
commit 5e5dbb31e633e786108e638d36c5dc9cc21d26d4
Author: Daniel Baumann <daniel at debian.org>
Date:   Wed Apr 7 00:15:17 2010 +0200

    Releasing debian version 1.4.2-2.

diff --git a/debian/changelog b/debian/changelog
index da8c517..23f2866 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -1,3 +1,13 @@
+tryton-modules-sale (1.4.2-2) unstable; urgency=low
+
+  [ Daniel Baumann ]
+  * Correcting spelling error in package long-description.
+
+  [ Mathias Behrle ]
+  * Updating package long description.
+
+ -- Daniel Baumann <daniel at debian.org>  Wed, 07 Apr 2010 00:15:11 +0200
+
 tryton-modules-sale (1.4.2-1) unstable; urgency=low
 
   * Updating year in copyright file.
commit dbb57d1a9642d04c4bbcba2d369406b06efe6bf6
Author: Mathias Behrle <mathiasb at mbsolutions.selfip.biz>
Date:   Tue Mar 30 12:18:47 2010 +0200

    Updating package long description.

diff --git a/debian/control b/debian/control
index 6a4f6d1..5047307 100644
--- a/debian/control
+++ b/debian/control
@@ -26,11 +26,11 @@ Description: Tryton Application Platform (Sale Module)
  and using PostgreSQL as database engine. It is the core base of a complete
  business solution.
  .
- This module the possibility to define sale orders, to add sale information to
- products, and to define the sale price as the list price.
+ This module provides the possibility to define sale orders, to add sale
+ information to products, and to define the sale price as the list price.
  .
  With the possibilities:
  .
-  * to follow invoice and packing states from the sale order.
-  * to define invoice method: Manual, On Order Confirmed, On packing Sent.
-  * to define packing method: Manual, On Order Confirmed, On Invoice Paid.
+  * to follow invoice and shipment states from the sale order.
+  * to define invoice method: Manual, On Order Confirmed, On Shipment Sent.
+  * to define shipment method: Manual, On Order Confirmed, On Invoice Paid.
commit 481c59dd09351f6c2c824a07781eb229b3b3c649
Author: Daniel Baumann <daniel at debian.org>
Date:   Thu Mar 25 08:48:49 2010 +0100

    Correcting spelling error in package long-description.

diff --git a/debian/control b/debian/control
index b1b7085..6a4f6d1 100644
--- a/debian/control
+++ b/debian/control
@@ -26,7 +26,7 @@ Description: Tryton Application Platform (Sale Module)
  and using PostgreSQL as database engine. It is the core base of a complete
  business solution.
  .
- This module the possibility to define sale orders, to add sale informations to
+ This module the possibility to define sale orders, to add sale information to
  products, and to define the sale price as the list price.
  .
  With the possibilities:
commit 3354dae60a0e291bacc2073042f799000d8fa528
Author: Daniel Baumann <daniel at debian.org>
Date:   Sat Feb 20 10:52:15 2010 +0100

    Releasing debian version 1.4.2-1.

diff --git a/debian/changelog b/debian/changelog
index 12e9622..da8c517 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -1,3 +1,12 @@
+tryton-modules-sale (1.4.2-1) unstable; urgency=low
+
+  * Updating year in copyright file.
+  * Removing unneeded python-all-dev from build-depends.
+  * Updating to standards 3.8.4.
+  * Merging upstream version 1.4.2.
+
+ -- Daniel Baumann <daniel at debian.org>  Sat, 20 Feb 2010 10:52:09 +0100
+
 tryton-modules-sale (1.4.1-1) unstable; urgency=low
 
   * Making depends versioned for tryton 1.4.
commit 1ac1e9299038a27ad0bd5088f4e1f608b35c923a
Author: Daniel Baumann <daniel at debian.org>
Date:   Sat Feb 20 10:51:38 2010 +0100

    Merging upstream version 1.4.2.

diff --git a/CHANGELOG b/CHANGELOG
index 5fddd5b..0d17f00 100644
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -1,3 +1,6 @@
+Version 1.4.2 - 2010-02-17
+* Some bug fixes (see mercurial logs for details)
+
 Version 1.4.1 - 2009-11-24
 * Some bug fixes (see mercurial logs for details)
 
diff --git a/COPYRIGHT b/COPYRIGHT
index da277a9..94a43fb 100644
--- a/COPYRIGHT
+++ b/COPYRIGHT
@@ -1,7 +1,7 @@
 Copyright (C) 2004-2008 Tiny SPRL.
-Copyright (C) 2008-2009 Cédric Krier.
-Copyright (C) 2008-2009 Bertrand Chenal.
-Copyright (C) 2008-2009 B2CK SPRL.
+Copyright (C) 2008-2010 Cédric Krier.
+Copyright (C) 2008-2010 Bertrand Chenal.
+Copyright (C) 2008-2010 B2CK SPRL.
 
 This program is free software: you can redistribute it and/or modify
 it under the terms of the GNU General Public License as published by
diff --git a/PKG-INFO b/PKG-INFO
index 0c73f47..4f75cc8 100644
--- a/PKG-INFO
+++ b/PKG-INFO
@@ -1,6 +1,6 @@
 Metadata-Version: 1.0
 Name: trytond_sale
-Version: 1.4.1
+Version: 1.4.2
 Summary: Define sale order.
 Add to product sale informations.
 Define the sale price as the list price.
diff --git a/__tryton__.py b/__tryton__.py
index 676b2be..ce69276 100644
--- a/__tryton__.py
+++ b/__tryton__.py
@@ -6,7 +6,7 @@
     'name_es_CO': 'Ventas',
     'name_es_ES': 'Venta',
     'name_fr_FR': 'Vente',
-    'version': '1.4.1',
+    'version': '1.4.2',
     'author': 'B2CK',
     'email': 'info at b2ck.com',
     'website': 'http://www.tryton.org/',
diff --git a/sale.py b/sale.py
index 5d1e74b..776cb5f 100644
--- a/sale.py
+++ b/sale.py
@@ -883,9 +883,9 @@ class Sale(ModelWorkflow, ModelSQL, ModelView):
             vals = moves[line_id]
             vals['shipment_out'] = shipment_id
             move_id = move_obj.create(cursor, 0, vals, context=ctx)
-            sale_line_obj.write(cursor, user, line_id, {
+            sale_line_obj.write(cursor, 0, line_id, {
                 'moves': [('add', move_id)],
-                }, context=context)
+                }, context=ctx)
         shipment_obj.workflow_trigger_validate(cursor, 0, shipment_id,
                 'waiting', context=ctx)
         return shipment_id
diff --git a/trytond_sale.egg-info/PKG-INFO b/trytond_sale.egg-info/PKG-INFO
index 37dc92e..f5d3238 100644
--- a/trytond_sale.egg-info/PKG-INFO
+++ b/trytond_sale.egg-info/PKG-INFO
@@ -1,6 +1,6 @@
 Metadata-Version: 1.0
 Name: trytond-sale
-Version: 1.4.1
+Version: 1.4.2
 Summary: Define sale order.
 Add to product sale informations.
 Define the sale price as the list price.
commit 2d001661034ba754a8ea3e84862e3fb5d60271c1
Author: Daniel Baumann <daniel at debian.org>
Date:   Thu Jan 28 07:53:22 2010 +0100

    Updating to standards 3.8.4.

diff --git a/debian/control b/debian/control
index 55ea37c..b1b7085 100644
--- a/debian/control
+++ b/debian/control
@@ -6,7 +6,7 @@ Uploaders:
  Daniel Baumann <daniel at debian.org>,
  Mathias Behrle <mathiasb at mbsolutions.selfip.biz>
 Build-Depends: debhelper (>= 7), python, python-setuptools, python-support
-Standards-Version: 3.8.3
+Standards-Version: 3.8.4
 Homepage: http://www.tryton.org/
 Vcs-Browser: http://git.debian-maintainers.org/?p=tryton/tryton-modules-sale.git
 Vcs-Git: git://git.debian-maintainers.org/git/tryton/tryton-modules-sale.git
commit f287100bddd8cec453c79f9e8df232022a069a67
Author: Daniel Baumann <daniel at debian.org>
Date:   Mon Jan 25 10:12:28 2010 +0100

    Removing unneeded python-all-dev from build-depends.

diff --git a/debian/control b/debian/control
index 79ab1bb..55ea37c 100644
--- a/debian/control
+++ b/debian/control
@@ -5,8 +5,7 @@ Maintainer: Debian Tryton Maintainers <tryton at lists.debian-maintainers.org>
 Uploaders:
  Daniel Baumann <daniel at debian.org>,
  Mathias Behrle <mathiasb at mbsolutions.selfip.biz>
-Build-Depends:
- debhelper (>= 7), python, python-all-dev, python-setuptools, python-support
+Build-Depends: debhelper (>= 7), python, python-setuptools, python-support
 Standards-Version: 3.8.3
 Homepage: http://www.tryton.org/
 Vcs-Browser: http://git.debian-maintainers.org/?p=tryton/tryton-modules-sale.git
commit 5f345f87b19f8384e02fa8e424e684305ff48fb5
Author: Daniel Baumann <daniel at debian.org>
Date:   Sat Jan 2 11:35:36 2010 +0100

    Updating year in copyright file.

diff --git a/debian/copyright b/debian/copyright
index b18de59..9a3e6c5 100644
--- a/debian/copyright
+++ b/debian/copyright
@@ -27,7 +27,7 @@ License: GPL-3+
  can be found in /usr/share/common-licenses/GPL-3 file.
 
 Files: debian/*
-Copyright: (C) 2009 Daniel Baumann <daniel at debian.org>
+Copyright: (C) 2009-2010 Daniel Baumann <daniel at debian.org>
 License: GPL-3+
  This program is free software: you can redistribute it and/or modify
  it under the terms of the GNU General Public License as published by
commit 83b3e9b73b5eb0b2abd9992544089af19b58e107
Author: Daniel Baumann <daniel at debian.org>
Date:   Wed Nov 25 13:21:38 2009 +0100

    Releasing debian version 1.4.1-1.

diff --git a/debian/changelog b/debian/changelog
index c775682..12e9622 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -1,3 +1,12 @@
+tryton-modules-sale (1.4.1-1) unstable; urgency=low
+
+  * Making depends versioned for tryton 1.4.
+  * Merging upstream version 1.4.1.
+  * Updating README.source.
+  * Adding explicit debian source version 1.0 until switch to 3.0.
+
+ -- Daniel Baumann <daniel at debian.org>  Wed, 25 Nov 2009 13:21:31 +0100
+
 tryton-modules-sale (1.4.0-1) unstable; urgency=low
 
   * Merging upstream version 1.4.0.
commit 45e0b832e88ef984a8b736ef34fa3284682cb2f3
Author: Daniel Baumann <daniel at debian.org>
Date:   Wed Nov 25 13:20:55 2009 +0100

    Adding explicit debian source version 1.0 until switch to 3.0.

diff --git a/debian/source/format b/debian/source/format
new file mode 100644
index 0000000..d3827e7
--- /dev/null
+++ b/debian/source/format
@@ -0,0 +1 @@
+1.0
commit e1a55ee53d66a4b12d4b4bee7ec002d33d882a68
Author: Daniel Baumann <daniel at debian.org>
Date:   Wed Nov 25 13:20:48 2009 +0100

    Updating README.source.

diff --git a/debian/README.source b/debian/README.source
index dcc7ba3..18b6b24 100644
--- a/debian/README.source
+++ b/debian/README.source
@@ -32,6 +32,6 @@ upstream source. Changes, if any, are stored in the source package as diffs in
 debian/diff and are applied during the build. Current modifications can be
 applied to the source tree with:
 
-  $ quilt push -a
+  $ QUILT_PATCHES=debian/patches quilt push -a
 
 More information about Quilt can be found in the quilt package.
commit 366c748c6840ea03748449befc7345a4fcf6baf3
Author: Daniel Baumann <daniel at debian.org>
Date:   Wed Nov 25 13:20:37 2009 +0100

    Merging upstream version 1.4.1.

diff --git a/CHANGELOG b/CHANGELOG
index fa9582a..5fddd5b 100644
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -1,3 +1,6 @@
+Version 1.4.1 - 2009-11-24
+* Some bug fixes (see mercurial logs for details)
+
 Version 1.4.0 - 2009-10-19
 * Bug fixes (see mercurial logs for details)
 
diff --git a/PKG-INFO b/PKG-INFO
index b3a3e9e..0c73f47 100644
--- a/PKG-INFO
+++ b/PKG-INFO
@@ -1,6 +1,6 @@
 Metadata-Version: 1.0
 Name: trytond_sale
-Version: 1.4.0
+Version: 1.4.1
 Summary: Define sale order.
 Add to product sale informations.
 Define the sale price as the list price.
diff --git a/__tryton__.py b/__tryton__.py
index 0a4c6e7..676b2be 100644
--- a/__tryton__.py
+++ b/__tryton__.py
@@ -6,7 +6,7 @@
     'name_es_CO': 'Ventas',
     'name_es_ES': 'Venta',
     'name_fr_FR': 'Vente',
-    'version': '1.4.0',
+    'version': '1.4.1',
     'author': 'B2CK',
     'email': 'info at b2ck.com',
     'website': 'http://www.tryton.org/',
diff --git a/sale.py b/sale.py
index 3412024..5d1e74b 100644
--- a/sale.py
+++ b/sale.py
@@ -18,7 +18,8 @@ class Sale(ModelWorkflow, ModelSQL, ModelView):
     company = fields.Many2One('company.company', 'Company', required=True,
             states={
                 'readonly': "state != 'draft' or bool(lines)",
-            }, domain=["('id', '=', context.get('company', 0))"])
+            }, domain=["('id', 'company' in context and '=' or '!=', " \
+                    "context.get('company', 0))"])
     reference = fields.Char('Reference', readonly=True, select=1)
     description = fields.Char('Description', states={
         'readonly': "state != 'draft'",
diff --git a/trytond_sale.egg-info/PKG-INFO b/trytond_sale.egg-info/PKG-INFO
index 4b33ab6..37dc92e 100644
--- a/trytond_sale.egg-info/PKG-INFO
+++ b/trytond_sale.egg-info/PKG-INFO
@@ -1,6 +1,6 @@
 Metadata-Version: 1.0
 Name: trytond-sale
-Version: 1.4.0
+Version: 1.4.1
 Summary: Define sale order.
 Add to product sale informations.
 Define the sale price as the list price.
commit f824e722b1dcc16ff042ae8781cc52ac5dd603df
Author: Daniel Baumann <daniel at debian.org>
Date:   Wed Nov 4 12:22:20 2009 +0100

    Making depends versioned for tryton 1.4.

diff --git a/debian/control b/debian/control
index e37701f..79ab1bb 100644
--- a/debian/control
+++ b/debian/control
@@ -15,10 +15,12 @@ Vcs-Git: git://git.debian-maintainers.org/git/tryton/tryton-modules-sale.git
 Package: tryton-modules-sale
 Architecture: all
 Depends:
- ${misc:Depends}, ${python:Depends}, tryton-server, tryton-modules-account,
- tryton-modules-account-invoice, tryton-modules-account-product,
- tryton-modules-company, tryton-modules-currency, tryton-modules-party,
- tryton-modules-product, tryton-modules-stock, python-pkg-resources
+ ${misc:Depends}, ${python:Depends}, tryton-server (>= 1.4),
+ tryton-modules-account (>= 1.4), tryton-modules-account-invoice (>= 1.4),
+ tryton-modules-account-product (>= 1.4), tryton-modules-company (>= 1.4),
+ tryton-modules-currency (>= 1.4), tryton-modules-party (>= 1.4),
+ tryton-modules-product (>= 1.4), tryton-modules-stock (>= 1.4),
+ python-pkg-resources
 XB-Python-Version: ${python:Versions}
 Description: Tryton Application Platform (Sale Module)
  Tryton is a high-level general purpose application platform written in Python
commit d58a20240676949465d7b57e4a57e1fa9f5439e0
Author: Daniel Baumann <daniel at debian.org>
Date:   Mon Oct 19 22:35:03 2009 +0200

    Releasing debian version 1.4.0-1.

diff --git a/debian/changelog b/debian/changelog
index c55012a..c775682 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -1,3 +1,9 @@
+tryton-modules-sale (1.4.0-1) unstable; urgency=low
+
+  * Merging upstream version 1.4.0.
+
+ -- Daniel Baumann <daniel at debian.org>  Mon, 19 Oct 2009 22:34:54 +0200
+
 tryton-modules-sale (1.2.1-4) unstable; urgency=low
 
   * Updating to standards version 3.8.3.
commit 1e6daf533fc3024856a80dccc5b6199e9a7836cf
Author: Daniel Baumann <daniel at debian.org>
Date:   Mon Oct 19 22:34:40 2009 +0200

    Merging upstream version 1.4.0.

diff --git a/CHANGELOG b/CHANGELOG
index 6d89320..fa9582a 100644
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -1,5 +1,5 @@
-Version 1.2.1 - 2009-07-07
-* Some bug fixes (see mercurial logs for details)
+Version 1.4.0 - 2009-10-19
+* Bug fixes (see mercurial logs for details)
 
 Version 1.2.0 - 2009-04-20
 * Bug fixes (see mercurial logs for details)
diff --git a/INSTALL b/INSTALL
index f40e3b8..4b1b49a 100644
--- a/INSTALL
+++ b/INSTALL
@@ -5,7 +5,7 @@ Prerequisites
 -------------
 
  * Python 2.4 or later (http://www.python.org/)
- * trytond 1.1.x (http://www.tryton.org/)
+ * trytond (http://www.tryton.org/)
  * trytond_company (http://www.tryton.org/)
  * trytond_party (http://www.tryton.org/)
  * trytond_stock (http://www.tryton.org/)
diff --git a/MANIFEST.in b/MANIFEST.in
index 5343ad8..b2a140e 100644
--- a/MANIFEST.in
+++ b/MANIFEST.in
@@ -7,3 +7,5 @@ include LICENSE
 include *.xml
 include *.odt
 include *.csv
+include tests/*
+include doc/*
diff --git a/PKG-INFO b/PKG-INFO
index beba15a..b3a3e9e 100644
--- a/PKG-INFO
+++ b/PKG-INFO
@@ -1,17 +1,17 @@
 Metadata-Version: 1.0
 Name: trytond_sale
-Version: 1.2.1
+Version: 1.4.0
 Summary: Define sale order.
 Add to product sale informations.
 Define the sale price as the list price.
 
 With the possibilities:
-    - to follow invoice and packing states from the sale order.
+    - to follow invoice and shipment states from the sale order.
     - to define invoice method:
         - Manual
         - On Order Confirmed
-        - On packing Sent
-    - to define packing method:
+        - On shipment Sent
+    - to define shipment method:
         - Manual
         - On Order Confirmed
         - On Invoice Paid
@@ -20,7 +20,7 @@ Home-page: http://www.tryton.org/
 Author: B2CK
 Author-email: info at b2ck.com
 License: GPL-3
-Download-URL: http://downloads.tryton.org/1.2/
+Download-URL: http://downloads.tryton.org/1.4/
 Description: UNKNOWN
 Platform: UNKNOWN
 Classifier: Development Status :: 5 - Production/Stable
diff --git a/__init__.py b/__init__.py
index 335e3a6..3c25009 100644
--- a/__init__.py
+++ b/__init__.py
@@ -1,3 +1,4 @@
-#This file is part of Tryton.  The COPYRIGHT file at the top level of this repository contains the full copyright notices and license terms.
+#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 sale import *
diff --git a/__tryton__.py b/__tryton__.py
index e1087fa..0a4c6e7 100644
--- a/__tryton__.py
+++ b/__tryton__.py
@@ -4,9 +4,9 @@
     'name': 'Sale',
     'name_de_DE': 'Verkauf',
     'name_es_CO': 'Ventas',
-    'name_es_ES': 'Ventas',
+    'name_es_ES': 'Venta',
     'name_fr_FR': 'Vente',
-    'version': '1.2.1',
+    'version': '1.4.0',
     'author': 'B2CK',
     'email': 'info at b2ck.com',
     'website': 'http://www.tryton.org/',
@@ -16,12 +16,12 @@ Add to product sale informations.
 Define the sale price as the list price.
 
 With the possibilities:
-    - to follow invoice and packing states from the sale order.
+    - to follow invoice and shipment states from the sale order.
     - to define invoice method:
         - Manual
         - On Order Confirmed
-        - On packing Sent
-    - to define packing method:
+        - On shipment Sent
+    - to define shipment method:
         - Manual
         - On Order Confirmed
         - On Invoice Paid
@@ -56,34 +56,34 @@ Ermöglicht:
         - Al Confirmar la Orden
         - Contra el Pago de la Factura
 ''',
-    'description_es_ES': ''' - Define la orden de Ventas.
- - Se añade al producto la información de ventas.
- - Definición del precio de venta y el precio de lista.
+    'description_es_ES': '''Define orden de venta.
+ - Añade a los productos información de ventas.
+ - Define el precio de venta como el precio de lista.
 
- - Con las posibilidades de:
-    - seguir los estados de facturación y empaque desde la orden de venta.
+ - Con la posibilidad de:
+    - seguir los estados de facturación y envio desde la orden de venta.
     - definir el método de facturación:
         - Manual
-        - Al Confirmar la Orden
-        - Al Envío del Paquete
-    - definir el método de empaque:
+        - A la confirmación de la orden
+        - Al enviarlo
+    - definir el método de envio:
         - Manual
-        - Al Confirmar la Orden
-        - Contra el Pago de la Factura
+        - Al confirmar la orden
+        - Al pagar la factura
 ''',
     'description_fr_FR': '''Défini l'ordre de vente.
-Ajoute au produit les information de vente.
+Ajoute au produit les informations de vente.
 
 Avec la possibilité:
-    ' de suivre l'état de la facture et du colisage depuis l'ordre de vente
-    ' de choisir entre plusieurs méthodes de facturation:
-        ' Manuelle
-        ' Sur confirmation de la commande
-        ' À la livraison
-    ' de choisir entre plusieurs méthodes de colisage:
-        ' Manuel
-        ' Sur confirmation de la commande
-        ' Au paiement de la facture
+    - de suivre l'état de la facture et du colisage depuis l'ordre de vente
+    - de choisir entre plusieurs méthodes de facturation:
+        - Manuelle
+        - Sur confirmation de la commande
+        - À la livraison
+    - de choisir entre plusieurs méthodes de colisage:
+        - Manuelle
+        - Sur confirmation de la commande
+        - Au paiement de la facture
 ''',
     'depends': [
         'company',
diff --git a/de_DE.csv b/de_DE.csv
index 40880cb..419822d 100644
--- a/de_DE.csv
+++ b/de_DE.csv
@@ -1,20 +1,20 @@
 type,name,res_id,src,value,fuzzy
 error,account.invoice,0,You can not delete invoices that come from a sale!,Durch einen Verkauf generierte Rechnungen können nicht gelöscht werden!,0
 error,account.invoice,0,You cannot reset to draft an invoice generated by a sale.,Eine durch einen Verkauf generierte Rechnung kann nicht auf Entwurf zurückgesetzt werden.,0
-error,sale.line,0,"It misses an ""account Revenue"" default property!",Es ist keine Standardeigenschaft für das Erlöskonto definiert!,0
-error,sale.line,0,"It misses an ""Account Revenue"" on product ""%s""!","Es ist kein Erlöskonto für Artikel ""%s"" definiert!",0
+error,sale.line,0,"It misses an ""account Revenue"" default property!",Es ist keine Standardeigenschaft für das Ertragsskonto definiert!,0
+error,sale.line,0,"It misses an ""Account Revenue"" on product ""%s""!","Es ist kein Ertragskonto für Artikel ""%s"" definiert!",0
 error,sale.line,0,The customer location is required!,Der Lagerort des Kunden muss eingegeben werden!,0
 error,sale.sale,0,Invoice and Shipment addresses must be defined for the quotation.,Rechnungs- und Lieferadresse müssen für das Angebot eingetragen sein!,0
 error,sale.sale,0,"It misses an ""Account Receivable"" on the party ""%s""!","Es ist kein Forderungskonto für Partei ""%s"" definiert!",0
 error,sale.sale,0,Wrong combination of method!,Ungültige Kombination von Methoden!,0
-error,stock.packing.out,0,You cannot reset to draft a move generated by a sale.,Eine durch einen Verkauf generierte Bewegung kann nicht auf Entwurf zurückgesetzt werden.,0
+error,stock.shipment.out,0,You cannot reset to draft a move generated by a sale.,Eine durch einen Verkauf generierte Bewegung kann nicht auf Entwurf zurückgesetzt werden.,0
 field,"account.invoice,sale_exception_state",0,Exception State,Vorbehalt Status,0
 field,"product.template,salable",0,Salable,Verkäuflich,0
 field,"product.template,sale_uom",0,Sale UOM,Einheit Verkauf,0
 field,"sale.handle.invoice.exception.ask,domain_invoices",0,Domain Invoices,Domain Rechnungen,0
 field,"sale.handle.invoice.exception.ask,recreate_invoices",0,Recreate Invoices,Rechnungen nachbilden,0
-field,"sale.handle.packing.exception.ask,domain_moves",0,Domain Moves,Domain Bewegungen,0
-field,"sale.handle.packing.exception.ask,recreate_moves",0,Recreate Moves,Bewegungen nachbilden,0
+field,"sale.handle.shipment.exception.ask,domain_moves",0,Domain Moves,Domain Bewegungen,0
+field,"sale.handle.shipment.exception.ask,recreate_moves",0,Recreate Moves,Bewegungen nachbilden,0
 field,"sale.line-account.invoice.line,invoice_line",0,Invoice Line,Rechnungsposition,0
 field,"sale.line-account.invoice.line,rec_name",0,Name,Name,0
 field,"sale.line-account.invoice.line,sale_line",0,Sale Line,Position Verkauf,0
@@ -67,12 +67,12 @@ field,"sale.sale,invoices_recreated",0,Recreated Invoices,Nachgebildete Rechnung
 field,"sale.sale,invoice_state",0,Invoice State,Rechnungsstatus,0
 field,"sale.sale,lines",0,Lines,Positionen,0
 field,"sale.sale,moves",0,Moves,Bewegungen,0
-field,"sale.sale,packing_address",0,Shipment Address,Lieferadresse,0
-field,"sale.sale,packing_done",0,Shipment Done,Gepackt,0
-field,"sale.sale,packing_exception",0,Shipments Exception,Lieferungsvorbehalt,0
-field,"sale.sale,packing_method",0,Shipment Method,Liefermethode,0
-field,"sale.sale,packings",0,Shipments,Lieferposten,0
-field,"sale.sale,packing_state",0,Shipment State,Lieferstatus,0
+field,"sale.sale,shipment_address",0,Shipment Address,Lieferadresse,0
+field,"sale.sale,shipment_done",0,Shipment Done,Gepackt,0
+field,"sale.sale,shipment_exception",0,Shipments Exception,Lieferungsvorbehalt,0
+field,"sale.sale,shipment_method",0,Shipment Method,Liefermethode,0
+field,"sale.sale,shipments",0,Shipments,Lieferposten,0
+field,"sale.sale,shipment_state",0,Shipment State,Lieferstatus,0
 field,"sale.sale,party",0,Party,Partei,0
 field,"sale.sale,party_lang",0,Party Language,Sprache Partei,0
 field,"sale.sale,payment_term",0,Payment Term,Zahlungsbedingung,0
@@ -94,7 +94,7 @@ help,"sale.handle.invoice.exception.ask,recreate_invoices",0,The selected invoic
 model,"ir.action,name",act_sale_form_confirmed,Confirmed Sales,Aufträge (Verkäufe),0
 model,"ir.action,name",act_sale_form_draft,Draft Sales,Entwürfe (Verkäufe),0
 model,"ir.action,name",wizard_invoice_handle_exception,Handle Invoice Exception,Rechnungsvorbehalt bearbeiten,0
-model,"ir.action,name",wizard_packing_handle_exception,Handle Shipment Exception,Liefervorbehalt bearbeiten,0
+model,"ir.action,name",wizard_shipment_handle_exception,Handle Shipment Exception,Liefervorbehalt bearbeiten,0
 model,"ir.action,name",act_invoice_form,Invoices,Rechnungsausgang,0
 model,"ir.action,name",act_sale_form_new,New Sale,Neuer Verkauf,0
 model,"ir.action,name",act_open_customer,Parties associated to Sales,Parteien: Verkäufen zugeordnet,0
@@ -102,7 +102,7 @@ model,"ir.action,name",act_sale_form_quotation,Quotation Sales,Angebote (Verkäu
 model,"ir.action,name",report_sale,Sale,Verkauf drucken,0
 model,"ir.action,name",act_sale_form,Sales,Verkäufe,0
 model,"ir.action,name",act_sale_form2,Sales,Verkäufe,0
-model,"ir.action,name",act_packing_form,Shipments,Lieferposten,0
+model,"ir.action,name",act_shipment_form,Shipments,Lieferposten,0
 model,"ir.sequence,name",sequence_sale,Sale,Verkauf,0
 model,"ir.sequence.type,name",sequence_type_sale,Sale,Verkauf,0
 model,"ir.ui.menu,name",menu_sale_form_confirmed,Confirmed Sales,Aufträge (Verkäufe),0
@@ -114,7 +114,7 @@ model,"ir.ui.menu,name",menu_sale,Sale Management,Verkauf,0
 model,"ir.ui.menu,name",menu_sale_form,Sales,Verkäufe,0
 model,"res.group,name",group_sale,Sale,Verkauf,0
 model,"sale.handle.invoice.exception.ask,name",0,Invoice Exception Ask,Rechnungsvorbehalt Nachfrage,0
-model,"sale.handle.packing.exception.ask,name",0,Shipment Exception Ask,Nachfrage Liefervorbehalt,0
+model,"sale.handle.shipment.exception.ask,name",0,Shipment Exception Ask,Nachfrage Liefervorbehalt,0
 model,"sale.line-account.invoice.line,name",0,Sale Line - Invoice Line,Verkauf Position - Rechnung Zeile,0
 model,"sale.line-account.tax,name",0,Sale Line - Tax,Verkauf Position - Steuer,0
 model,"sale.line-ignored-stock.move,name",0,Sale Line - Ignored Move,Verkauf Position - Bewegung Ignoriert,0
@@ -132,25 +132,25 @@ model,"workflow.activity,name",sale_activity_invoice_sale_done,Invoice Done,Rech
 model,"workflow.activity,name",sale_activity_invoice_sale_exception,Invoice Exception,Rechnungsvorbehalt,0
 model,"workflow.activity,name",sale_activity_invoice_method,Invoice Method,Rechnungsstellung,0
 model,"workflow.activity,name",sale_activity_invoice_method_done,Invoice Method Done,Rechnungsstellung erledigt,0
-model,"workflow.activity,name",sale_activity_invoice_packing,Invoice Shipment,Rechnung Lieferposten,0
-model,"workflow.activity,name",sale_activity_invoice_packing_done,Invoice Shipment Done,Rechnung Lieferposten erledigt,0
-model,"workflow.activity,name",sale_activity_invoice_packing_exception,Invoice Shipment Exception,Rechnung Lieferposten Vorbehalt,0
-model,"workflow.activity,name",sale_activity_invoice_packing_method,Invoice Shipment Method,Rechnung Liefermethode,0
-model,"workflow.activity,name",sale_activity_invoice_packing_method_done,Invoice Shipment Method Done,Rechnung Liefermethode erledigt,0
+model,"workflow.activity,name",sale_activity_invoice_shipment,Invoice Shipment,Rechnung Lieferposten,0
+model,"workflow.activity,name",sale_activity_invoice_shipment_done,Invoice Shipment Done,Rechnung Lieferposten erledigt,0
+model,"workflow.activity,name",sale_activity_invoice_shipment_exception,Invoice Shipment Exception,Rechnung Lieferposten Vorbehalt,0
+model,"workflow.activity,name",sale_activity_invoice_shipment_method,Invoice Shipment Method,Rechnung Liefermethode,0
+model,"workflow.activity,name",sale_activity_invoice_shipment_method_done,Invoice Shipment Method Done,Rechnung Liefermethode erledigt,0
 model,"workflow.activity,name",sale_activity_quotation,Quotation,Angebot,0
-model,"workflow.activity,name",sale_activity_packing,Shipment,Lieferposten,0
-model,"workflow.activity,name",sale_activity_packing_exception,Shipment Exception,Lieferposten Vorbehalt,0
-model,"workflow.activity,name",sale_activity_packing_invoice,Shipment Invoice,Lieferposten Rechnung,0
-model,"workflow.activity,name",sale_activity_packing_invoice_done,Shipment Invoice Done,Lieferposten Rechnung erledigt,0
-model,"workflow.activity,name",sale_activity_packing_invoice_exception,Shipment Invoice Exception,Lieferposten Rechnung Vorbehalt,0
-model,"workflow.activity,name",sale_activity_packing_invoice_method,Shipment Invoice Method,Lieferposten Rechnungsmethode,0
-model,"workflow.activity,name",sale_activity_packing_invoice_method_done,Shipment Invoice Method Done,Lieferposten Rechnungsmethode erledigt,0
-model,"workflow.activity,name",sale_activity_packing_method,Shipment Method,Liefermethode,0
-model,"workflow.activity,name",sale_activity_packing_method_done,Shipment Method Done,Liefermethode erledigt,0
+model,"workflow.activity,name",sale_activity_shipment,Shipment,Lieferposten,0
+model,"workflow.activity,name",sale_activity_shipment_exception,Shipment Exception,Lieferposten Vorbehalt,0
+model,"workflow.activity,name",sale_activity_shipment_invoice,Shipment Invoice,Lieferposten Rechnung,0
+model,"workflow.activity,name",sale_activity_shipment_invoice_done,Shipment Invoice Done,Lieferposten Rechnung erledigt,0
+model,"workflow.activity,name",sale_activity_shipment_invoice_exception,Shipment Invoice Exception,Lieferposten Rechnung Vorbehalt,0
+model,"workflow.activity,name",sale_activity_shipment_invoice_method,Shipment Invoice Method,Lieferposten Rechnungsmethode,0
+model,"workflow.activity,name",sale_activity_shipment_invoice_method_done,Shipment Invoice Method Done,Lieferposten Rechnungsmethode erledigt,0
+model,"workflow.activity,name",sale_activity_shipment_method,Shipment Method,Liefermethode,0
+model,"workflow.activity,name",sale_activity_shipment_method_done,Shipment Method Done,Liefermethode erledigt,0
 model,"workflow.activity,name",sale_activity_waiting_invoice_sale,Waiting Invoice,Rechnung wartend,0
-model,"workflow.activity,name",sale_activity_waiting_invoice_packing,Waiting Invoice Shipment,Rechnung Lieferposten Wartend,0
-model,"workflow.activity,name",sale_activity_waiting_packing,Waiting Shipment,Lieferposten wartend,0
-model,"workflow.activity,name",sale_activity_waiting_packing_invoice,Waiting Shipment Invoice,Lieferposten Rechnung wartend,0
+model,"workflow.activity,name",sale_activity_waiting_invoice_shipment,Waiting Invoice Shipment,Rechnung Lieferposten Wartend,0
+model,"workflow.activity,name",sale_activity_waiting_shipment,Waiting Shipment,Lieferposten wartend,0
+model,"workflow.activity,name",sale_activity_waiting_shipment_invoice,Waiting Shipment Invoice,Lieferposten Rechnung wartend,0
 model,"workflow,name",sale_workflow,Sale workflow,Workflow Verkauf,0
 odt,sale.sale,0,Amount,Betrag,0
 odt,sale.sale,0,Date:,Datum:,0
@@ -182,13 +182,13 @@ selection,"sale.sale,invoice_state",0,Exception,Vorbehalt,0
 selection,"sale.sale,invoice_state",0,None,Kein,0
 selection,"sale.sale,invoice_state",0,Paid,Bezahlt,0
 selection,"sale.sale,invoice_state",0,Waiting,Wartend,0
-selection,"sale.sale,packing_method",0,Manual,Manuell,0
-selection,"sale.sale,packing_method",0,On Invoice Paid,Bei Bezahlung,0
-selection,"sale.sale,packing_method",0,On Order Confirmed,Bei Beauftragung,0
-selection,"sale.sale,packing_state",0,Exception,Vorbehalt,0
-selection,"sale.sale,packing_state",0,None,Kein,0
-selection,"sale.sale,packing_state",0,Sent,Gesendet,0
-selection,"sale.sale,packing_state",0,Waiting,Wartend,0
+selection,"sale.sale,shipment_method",0,Manual,Manuell,0
+selection,"sale.sale,shipment_method",0,On Invoice Paid,Bei Bezahlung,0
+selection,"sale.sale,shipment_method",0,On Order Confirmed,Bei Beauftragung,0
+selection,"sale.sale,shipment_state",0,Exception,Vorbehalt,0
+selection,"sale.sale,shipment_state",0,None,Kein,0
+selection,"sale.sale,shipment_state",0,Sent,Gesendet,0
+selection,"sale.sale,shipment_state",0,Waiting,Wartend,0
 selection,"sale.sale,state",0,Canceled,Annulliert,0
 selection,"sale.sale,state",0,Confirmed,Beauftragt,0
 selection,"sale.sale,state",0,Done,Erledigt,0
@@ -202,11 +202,11 @@ view,product.template,0,Customers,Kunden,0
 view,sale.handle.invoice.exception.ask,0,Choose invoices to duplicate,Auswahl Rechnungen für Duplizierung,0
 view,sale.handle.invoice.exception.ask,0,Choose invoices to recreate,Rechnungen zum Nachbilden auswählen,0
 view,sale.handle.invoice.exception.ask,0,Handle Invoice Exception,Rechnungsvorbehalt bearbeiten,0
-view,sale.handle.packing.exception.ask,0,Choose move to duplicate,Auswahl Bewegungen für Duplizierung,0
-view,sale.handle.packing.exception.ask,0,Choose move to recreate,Bewegungen zum Nachbilden auswählen,0
-view,sale.handle.packing.exception.ask,0,Duplicate Moves,Bewegungen duplizieren,0
-view,sale.handle.packing.exception.ask,0,Handle packing Exception,Liefervorbehalt bearbeiten,0
-view,sale.handle.packing.exception.ask,0,Recreate Moves,Bewegungen nachbilden,0
+view,sale.handle.shipment.exception.ask,0,Choose move to duplicate,Auswahl Bewegungen für Duplizierung,0
+view,sale.handle.shipment.exception.ask,0,Choose move to recreate,Bewegungen zum Nachbilden auswählen,0
+view,sale.handle.shipment.exception.ask,0,Duplicate Moves,Bewegungen duplizieren,0
+view,sale.handle.shipment.exception.ask,0,Handle shipment Exception,Liefervorbehalt bearbeiten,0
+view,sale.handle.shipment.exception.ask,0,Recreate Moves,Bewegungen nachbilden,0
 view,sale.line,0,General,Allgemein,0
 view,sale.line,0,Notes,Notizen,0
 view,sale.line,0,Products,Artikel,0
@@ -216,20 +216,17 @@ view,sale.sale,0,Cancel,Annullieren,0
 view,sale.sale,0,Confirm,Bestätigen,0
 view,sale.sale,0,Draft,Entwurf,0
 view,sale.sale,0,Handle Invoice Exception,Rechnungsvorbehalt bearbeiten,0
-view,sale.sale,0,Handle Packing Exception,Liefervorbehalt bearbeiten,0
 view,sale.sale,0,Handle Shipment Exception,Liefervorbehalt bearbeiten,0
 view,sale.sale,0,Ignore Invoice Exception,Rechnungsvorbehalt ignorieren,0
-view,sale.sale,0,Ignore Packing Exception,Verpackungsvorbehalt ignorieren,0
 view,sale.sale,0,Invoices,Rechnungen,0
 view,sale.sale,0,Lines,Positionen,0
 view,sale.sale,0,Moves,Bewegungen,0
 view,sale.sale,0,Other Info,Sonstiges,0
-view,sale.sale,0,Packings,Lieferposten,0
 view,sale.sale,0,Quotation,Angebot,0
 view,sale.sale,0,Sale,Verkauf,0
 view,sale.sale,0,Sales,Verkäufe,0
 view,sale.sale,0,Shipments,Lieferposten,0
 wizard_button,"sale.handle.invoice.exception,init,end",0,Cancel,Abbrechen,0
 wizard_button,"sale.handle.invoice.exception,init,ok",0,Ok,OK,0
-wizard_button,"sale.handle.packing.exception,init,end",0,Cancel,Abbrechen,0
-wizard_button,"sale.handle.packing.exception,init,ok",0,Ok,OK,0
+wizard_button,"sale.handle.shipment.exception,init,end",0,Cancel,Abbrechen,0
+wizard_button,"sale.handle.shipment.exception,init,ok",0,Ok,OK,0
diff --git a/doc/index.rst b/doc/index.rst
new file mode 100644
index 0000000..8e0f960
--- /dev/null
+++ b/doc/index.rst
@@ -0,0 +1,81 @@
+Sale Module
+###########
+
+The sale module defines the Sale model.
+
+
+Sale
+****
+
+The sale is mainly defined by a party to which the products will be
+sold and a list of sale lines, each one containing a product and a
+quantity. Here is the extensive list of the fields, most of them are
+optional or completed with sensible default values:
+
+- Party: The customer.
+- Invoice Address: The invoice address of the customer.
+- Shipment Address: The address where the shipment will be sent.
+- Description: An optional description for the order.
+- Reference: The internal reference of the sale (will be generated
+  automatically on confirmation).
+- Sale Date: The date the sale is made.
+- Payment Term: Define which payment term will be use for the future
+  invoice.
+- Warehouse: Define the warehouse from which the goods will be sent.
+- Currency: define the currency to use for this sale. All product
+  prices will be computed accordingly.
+- Sale Lines:
+
+  - Type: The type of the line. The default value is *Line* which
+    means that the current sale line contains the fields defined
+    hereunder. The other values of Type (*Comment*, *Subtotal*,
+    *Title*) are used to add extra lines that will appear on the
+    report, thus allowing to easily customise it.
+  - Sequence: Allow to order lines. The value of this field is also
+    updated with a drag and drop between the lines.
+  - Product: An optional reference to the product to sale.
+  - Description: The description of the product to sale.
+  - Quantity: The quantity to sale.
+  - Unit: The unit of measure in which is expressed the quantity.
+  - Unit Price: The unit price of the product expressed in the
+    currency of the sale.
+  - Amount: The amount of the current line (Unit Price multiplied by
+    Quantity).
+  - Taxes: The list of taxes that will be applied to the current line.
+
+- Invoice State: The state of the invoice related to the sale.
+- Shipment State: The state of the shipment related to the sale.
+- Untaxed: The untaxed amount.
+- Tax: The tax amount.
+- Total: The total amount.
+- State: The state of the sale. May take one of the following
+  values: Draft, Quotation, Confirmed, Cancelled.
+- Company: The company which issue the sale order.
+- Invoice Method: May take one of the following values:
+
+  - On Order Confirmed: The invoice is created when the sale order is
+    confirmed.
+  - On Shipment Sent: The invoice is created when the shipment is sent
+    and will contains the shipped quantities. If there are several
+    shipments for the same sale, several invoices will be created.
+  - Manual: Tryton doesn't create any invoice automatically.
+
+- Shipment Method: May take one of the following values:
+
+  - On Order Confirmed: The customer shipment is created when the sale
+    order is confirmed.
+  - On Invoice Paid: The customer shipment is created when the invoice
+    is paid.
+  - Manual: Tryton doesn't create any shipment automatically.
+
+  One should note that choosing *On Shipment Sent* for the Invoice
+  Method and *On Invoice Paid* for the Shipment Method is an invalid
+  combination.
+
+- Comments: A text fields to add custom comments.
+- Invoices: The list of related invoices.
+- Moves: The list of related stock moves.
+- Shipments: The list of related shipments.
+
+The *Sale* report allow to print the sale orders or to send
+them by mail.
diff --git a/es_CO.csv b/es_CO.csv
index 93e9374..f7d5705 100644
--- a/es_CO.csv
+++ b/es_CO.csv
@@ -7,14 +7,14 @@ error,sale.line,0,The customer location is required!,Es indispensable el lugar d
 error,sale.sale,0,Invoice and Shipment addresses must be defined for the quotation.,Factura y dirección de Envío debe ser definida por el presupuesto.,0
 error,sale.sale,0,"It misses an ""Account Receivable"" on the party ""%s""!","Falta una ""cuenta de ingresos"" en la partida ""%s""!",0
 error,sale.sale,0,Wrong combination of method!,Combinación o método erróneos!,0
-error,stock.packing.out,0,You cannot reset to draft a move generated by a sale.,No puede regresar a borrador un movimiento generado por una venta.,0
+error,stock.shipment.out,0,You cannot reset to draft a move generated by a sale.,No puede regresar a borrador un movimiento generado por una venta.,0
 field,"account.invoice,sale_exception_state",0,Exception State,Estado de Excepción,0
 field,"product.template,salable",0,Salable,De fácil venta,0
 field,"product.template,sale_uom",0,Sale UOM,UdM de Venta,0
 field,"sale.handle.invoice.exception.ask,domain_invoices",0,Domain Invoices,Rango de facturas,0
 field,"sale.handle.invoice.exception.ask,recreate_invoices",0,Recreate Invoices,Rehacer factura,0
-field,"sale.handle.packing.exception.ask,domain_moves",0,Domain Moves,Rango de movimientos,0
-field,"sale.handle.packing.exception.ask,recreate_moves",0,Recreate Moves,Rehacer movimientos,0
+field,"sale.handle.shipment.exception.ask,domain_moves",0,Domain Moves,Rango de movimientos,0
+field,"sale.handle.shipment.exception.ask,recreate_moves",0,Recreate Moves,Rehacer movimientos,0
 field,"sale.line-account.invoice.line,invoice_line",0,Invoice Line,Línea de Factura,0
 field,"sale.line-account.invoice.line,rec_name",0,Name,Nombre,0
 field,"sale.line-account.invoice.line,sale_line",0,Sale Line,Línea de Venta,0
@@ -67,12 +67,12 @@ field,"sale.sale,invoices_recreated",0,Recreated Invoices,Rehacer facturas,0
 field,"sale.sale,invoice_state",0,Invoice State,Estado de Factura,0
 field,"sale.sale,lines",0,Lines,Líneas,0
 field,"sale.sale,moves",0,Moves,Movimientos,0
-field,"sale.sale,packing_address",0,Shipment Address,Dirección de envío,0
-field,"sale.sale,packing_done",0,Shipment Done,Envío Finalizado,0
-field,"sale.sale,packing_exception",0,Shipments Exception,Excepción de Envíos,0
-field,"sale.sale,packing_method",0,Shipment Method,Método de Envío,0
-field,"sale.sale,packings",0,Shipments,Envíos,0
-field,"sale.sale,packing_state",0,Shipment State,Estado de Envío,0
+field,"sale.sale,shipment_address",0,Shipment Address,Dirección de envío,0
+field,"sale.sale,shipment_done",0,Shipment Done,Envío Finalizado,0
+field,"sale.sale,shipment_exception",0,Shipments Exception,Excepción de Envíos,0
+field,"sale.sale,shipment_method",0,Shipment Method,Método de Envío,0
+field,"sale.sale,shipments",0,Shipments,Envíos,0
+field,"sale.sale,shipment_state",0,Shipment State,Estado de Envío,0
 field,"sale.sale,party",0,Party,Tercero,0
 field,"sale.sale,party_lang",0,Party Language,Idioma del Tercero,0
 field,"sale.sale,payment_term",0,Payment Term,Término de Pago,0
@@ -93,8 +93,8 @@ field,"stock.move,sale_line",0,,,0
 help,"sale.handle.invoice.exception.ask,recreate_invoices",0,The selected invoices will be recreated. The other ones will be ignored.,La factura seleccionada será recreada. Las otras serán ignoradas.,0
 model,"ir.action,name",act_sale_form_confirmed,Confirmed Sales,Ventas Confirmadas,0
 model,"ir.action,name",act_sale_form_draft,Draft Sales,Ventas en Borrador,0
-model,"ir.action,name",wizard_invoice_handle_exception,Handle Invoice Exception,Excepción de manejo de factura,0
-model,"ir.action,name",wizard_packing_handle_exception,Handle Shipment Exception,Excepción de manejo de envío,0
+model,"ir.action,name",wizard_invoice_handle_exception,Handle Invoice Exception,Tratar Excepción de factura,0
+model,"ir.action,name",wizard_shipment_handle_exception,Handle Shipment Exception,Tratar Excepción de Envío,0
 model,"ir.action,name",act_invoice_form,Invoices,Facturas,0
 model,"ir.action,name",act_sale_form_new,New Sale,Nueva venta,0
 model,"ir.action,name",act_open_customer,Parties associated to Sales,Terceros asociados a Ventas,0
@@ -102,7 +102,7 @@ model,"ir.action,name",act_sale_form_quotation,Quotation Sales,Ventas Cotizadas,
 model,"ir.action,name",report_sale,Sale,Venta,0
 model,"ir.action,name",act_sale_form,Sales,Ventas,0
 model,"ir.action,name",act_sale_form2,Sales,Ventas,0
-model,"ir.action,name",act_packing_form,Shipments,Envíos,0
+model,"ir.action,name",act_shipment_form,Shipments,Envíos,0
 model,"ir.sequence,name",sequence_sale,Sale,Venta,0
 model,"ir.sequence.type,name",sequence_type_sale,Sale,Venta,0
 model,"ir.ui.menu,name",menu_sale_form_confirmed,Confirmed Sales,Ventas Confirmadas,0
@@ -114,7 +114,7 @@ model,"ir.ui.menu,name",menu_sale,Sale Management,Gestión de Ventas,0
 model,"ir.ui.menu,name",menu_sale_form,Sales,Ventas,0
 model,"res.group,name",group_sale,Sale,Venta,0
 model,"sale.handle.invoice.exception.ask,name",0,Invoice Exception Ask,Pregunta de Excepción de Factura,0
-model,"sale.handle.packing.exception.ask,name",0,Shipment Exception Ask,Pregunta de Excepción de Envío,0
+model,"sale.handle.shipment.exception.ask,name",0,Shipment Exception Ask,Pregunta de Excepción de Envío,0
 model,"sale.line-account.invoice.line,name",0,Sale Line - Invoice Line,Línea de Venta - Línea de Factura,0
 model,"sale.line-account.tax,name",0,Sale Line - Tax,Línea de Venta - Impuesto,0
 model,"sale.line-ignored-stock.move,name",0,Sale Line - Ignored Move,Línea de Venta - Movimiento Ignorado,0
@@ -132,25 +132,25 @@ model,"workflow.activity,name",sale_activity_invoice_sale_done,Invoice Done,Fact
 model,"workflow.activity,name",sale_activity_invoice_sale_exception,Invoice Exception,Excepción de Factura,0
 model,"workflow.activity,name",sale_activity_invoice_method,Invoice Method,Método de Facturación,0
 model,"workflow.activity,name",sale_activity_invoice_method_done,Invoice Method Done,Método de Factura Concluido,0
-model,"workflow.activity,name",sale_activity_invoice_packing,Invoice Shipment,Envío de Factura,0
-model,"workflow.activity,name",sale_activity_invoice_packing_done,Invoice Shipment Done,Envío de Factura Concluido,0
-model,"workflow.activity,name",sale_activity_invoice_packing_exception,Invoice Shipment Exception,Excepción de Envío de Factura,0
-model,"workflow.activity,name",sale_activity_invoice_packing_method,Invoice Shipment Method,Método de Envío de Factura,0
-model,"workflow.activity,name",sale_activity_invoice_packing_method_done,Invoice Shipment Method Done,Método de Envío de Factura Concluido,0
+model,"workflow.activity,name",sale_activity_invoice_shipment,Invoice Shipment,Envío de Factura,0
+model,"workflow.activity,name",sale_activity_invoice_shipment_done,Invoice Shipment Done,Envío de Factura Concluido,0
+model,"workflow.activity,name",sale_activity_invoice_shipment_exception,Invoice Shipment Exception,Excepción de Envío de Factura,0
+model,"workflow.activity,name",sale_activity_invoice_shipment_method,Invoice Shipment Method,Método de Envío de Factura,0
+model,"workflow.activity,name",sale_activity_invoice_shipment_method_done,Invoice Shipment Method Done,Método de Envío de Factura Concluido,0
 model,"workflow.activity,name",sale_activity_quotation,Quotation,Cotización,0
-model,"workflow.activity,name",sale_activity_packing,Shipment,Envío,0
-model,"workflow.activity,name",sale_activity_packing_exception,Shipment Exception,Excepción de Envío,0
-model,"workflow.activity,name",sale_activity_packing_invoice,Shipment Invoice,Envío de Factura,0
-model,"workflow.activity,name",sale_activity_packing_invoice_done,Shipment Invoice Done,Envío de Factura Concluido,0
-model,"workflow.activity,name",sale_activity_packing_invoice_exception,Shipment Invoice Exception,Excepción de Envío de Factura,0
-model,"workflow.activity,name",sale_activity_packing_invoice_method,Shipment Invoice Method,Método Envío de Factura,0
-model,"workflow.activity,name",sale_activity_packing_invoice_method_done,Shipment Invoice Method Done,Método de Envío de Factura Concluido,0
-model,"workflow.activity,name",sale_activity_packing_method,Shipment Method,Método de Envío,0
-model,"workflow.activity,name",sale_activity_packing_method_done,Shipment Method Done,Método de Envío Concluido,0
+model,"workflow.activity,name",sale_activity_shipment,Shipment,Envío,0
+model,"workflow.activity,name",sale_activity_shipment_exception,Shipment Exception,Excepción de Envío,0
+model,"workflow.activity,name",sale_activity_shipment_invoice,Shipment Invoice,Envío de Factura,0
+model,"workflow.activity,name",sale_activity_shipment_invoice_done,Shipment Invoice Done,Envío de Factura Concluido,0
+model,"workflow.activity,name",sale_activity_shipment_invoice_exception,Shipment Invoice Exception,Excepción de Envío de Factura,0
+model,"workflow.activity,name",sale_activity_shipment_invoice_method,Shipment Invoice Method,Método Envío de Factura,0
+model,"workflow.activity,name",sale_activity_shipment_invoice_method_done,Shipment Invoice Method Done,Método de Envío de Factura Concluido,0
+model,"workflow.activity,name",sale_activity_shipment_method,Shipment Method,Método de Envío,0
+model,"workflow.activity,name",sale_activity_shipment_method_done,Shipment Method Done,Método de Envío Concluido,0
 model,"workflow.activity,name",sale_activity_waiting_invoice_sale,Waiting Invoice,Esperando Factura,0
-model,"workflow.activity,name",sale_activity_waiting_invoice_packing,Waiting Invoice Shipment,Esperando Envío de Factura,0
-model,"workflow.activity,name",sale_activity_waiting_packing,Waiting Shipment,Esperando Envío,0
-model,"workflow.activity,name",sale_activity_waiting_packing_invoice,Waiting Shipment Invoice,Esperando Envío de Factura,0
+model,"workflow.activity,name",sale_activity_waiting_invoice_shipment,Waiting Invoice Shipment,Esperando Envío de Factura,0
+model,"workflow.activity,name",sale_activity_waiting_shipment,Waiting Shipment,Esperando Envío,0
+model,"workflow.activity,name",sale_activity_waiting_shipment_invoice,Waiting Shipment Invoice,Esperando Envío de Factura,0
 model,"workflow,name",sale_workflow,Sale workflow,Flujo de Trabajo de Ventas,0
 odt,sale.sale,0,Amount,Cantidad,0
 odt,sale.sale,0,Date:,Fecha:,0
@@ -167,7 +167,7 @@ odt,sale.sale,0,Taxes:,Impuestos:,0
 odt,sale.sale,0,Total:,Total:,0
 odt,sale.sale,0,Total (excl. taxes):,Total (sin impuestos):,0
 odt,sale.sale,0,Unit Price,Precio Unitario,0
-odt,sale.sale,0,VAT:,VAT:,0
+odt,sale.sale,0,VAT:,IVA:,0
 selection,"account.invoice,sale_exception_state",0,,,0
 selection,"account.invoice,sale_exception_state",0,Ignored,Ignorado,0
 selection,"account.invoice,sale_exception_state",0,Recreated,Rehecho,0
@@ -182,13 +182,13 @@ selection,"sale.sale,invoice_state",0,Exception,Excepción,0
 selection,"sale.sale,invoice_state",0,None,Ninguno,0
 selection,"sale.sale,invoice_state",0,Paid,Pagado,0
 selection,"sale.sale,invoice_state",0,Waiting,En Espera,0
-selection,"sale.sale,packing_method",0,Manual,Manual,0
-selection,"sale.sale,packing_method",0,On Invoice Paid,Al Pagar,0
-selection,"sale.sale,packing_method",0,On Order Confirmed,Al Confirmar la Orden,0
-selection,"sale.sale,packing_state",0,Exception,Excepción,0
-selection,"sale.sale,packing_state",0,None,Ninguno,0
-selection,"sale.sale,packing_state",0,Sent,Enviado,0
-selection,"sale.sale,packing_state",0,Waiting,En Espera,0
+selection,"sale.sale,shipment_method",0,Manual,Manual,0
+selection,"sale.sale,shipment_method",0,On Invoice Paid,Al Pagar,0
+selection,"sale.sale,shipment_method",0,On Order Confirmed,Al Confirmar la Orden,0
+selection,"sale.sale,shipment_state",0,Exception,Excepción,0
+selection,"sale.sale,shipment_state",0,None,Ninguno,0
+selection,"sale.sale,shipment_state",0,Sent,Enviado,0
+selection,"sale.sale,shipment_state",0,Waiting,En Espera,0
 selection,"sale.sale,state",0,Canceled,Cancelado,0
 selection,"sale.sale,state",0,Confirmed,Confirmado,0
 selection,"sale.sale,state",0,Done,Hecho,0
@@ -200,10 +200,10 @@ selection,"stock.move,sale_exception_state",0,Recreated,Rehacer,0
 view,product.product,0,Customers,Clientes,0
 view,product.template,0,Customers,Clientes,0
 view,sale.handle.invoice.exception.ask,0,Choose invoices to recreate,Escoja una factura a rehacer,0
-view,sale.handle.invoice.exception.ask,0,Handle Invoice Exception,Excepción de Manejo de Factura,0
-view,sale.handle.packing.exception.ask,0,Choose move to recreate,Escoja un movimiento a rehacer,0
-view,sale.handle.packing.exception.ask,0,Handle packing Exception,Maneje Excepciones de empaquetado,0
-view,sale.handle.packing.exception.ask,0,Recreate Moves,Recrear movimientos,0
+view,sale.handle.invoice.exception.ask,0,Handle Invoice Exception,Tratar Excepción de factura,0
+view,sale.handle.shipment.exception.ask,0,Choose move to recreate,Escoja un movimiento a rehacer,0
+view,sale.handle.shipment.exception.ask,0,Handle shipment Exception,Maneje Excepciones de empaquetado,0
+view,sale.handle.shipment.exception.ask,0,Recreate Moves,Recrear movimientos,0
 view,sale.line,0,General,General,0
 view,sale.line,0,Notes,Notas,0
 view,sale.line,0,Products,Productos,0
@@ -215,17 +215,15 @@ view,sale.sale,0,Draft,Borrador,0
 view,sale.sale,0,Handle Invoice Exception,Excepción que maneja factura,0
 view,sale.sale,0,Handle Shipment Exception,Excepción que maneja envío,0
 view,sale.sale,0,Ignore Invoice Exception,Ignorar excepción en Factura,0
-view,sale.sale,0,Ignore Packing Exception,Ignorar excepción en Empaque,0
 view,sale.sale,0,Invoices,Facturas,0
 view,sale.sale,0,Lines,Líneas,0
 view,sale.sale,0,Moves,Movimientos,0
 view,sale.sale,0,Other Info,Información Adicional,0
-view,sale.sale,0,Packings,Empaques,0
 view,sale.sale,0,Quotation,Cotización,0
 view,sale.sale,0,Sale,Venta,0
 view,sale.sale,0,Sales,Ventas,0
 view,sale.sale,0,Shipments,Empaques,0
 wizard_button,"sale.handle.invoice.exception,init,end",0,Cancel,Cancelar,0
 wizard_button,"sale.handle.invoice.exception,init,ok",0,Ok,Aceptar,0
-wizard_button,"sale.handle.packing.exception,init,end",0,Cancel,Cancelar,0
-wizard_button,"sale.handle.packing.exception,init,ok",0,Ok,Aceptar,0
+wizard_button,"sale.handle.shipment.exception,init,end",0,Cancel,Cancelar,0
+wizard_button,"sale.handle.shipment.exception,init,ok",0,Ok,Aceptar,0
diff --git a/es_ES.csv b/es_ES.csv
index 5604b77..6e13270 100644
--- a/es_ES.csv
+++ b/es_ES.csv
@@ -1,5 +1,5 @@
 type,name,res_id,src,value,fuzzy
-error,account.invoice,0,You can not delete invoices that come from a sale!,No puede borrar facturas provinientes de una venta,0
+error,account.invoice,0,You can not delete invoices that come from a sale!,No puede borrar facturas que provienen de una venta,0
 error,account.invoice,0,You cannot reset to draft an invoice generated by a sale.,No puede restablecer a borrador una factura generada por una venta.,0
 error,sale.line,0,"It misses an ""account Revenue"" default property!",Falta una propiedad predeterminada de «cuenta de ingresos»,0
 error,sale.line,0,"It misses an ""Account Revenue"" on product ""%s""!",Falta una «cuenta de ingresos» en el producto «%s»,0
@@ -7,14 +7,14 @@ error,sale.line,0,The customer location is required!,Se necesita la ubicación d
 error,sale.sale,0,Invoice and Shipment addresses must be defined for the quotation.,Las direcciones de facturación y de envío debe ser definida para el presupuesto.,0
 error,sale.sale,0,"It misses an ""Account Receivable"" on the party ""%s""!",Falta una «cuenta de ingresos» en el tercero «%s»,0
 error,sale.sale,0,Wrong combination of method!,Combinación inválida de métodos,0
-error,stock.packing.out,0,You cannot reset to draft a move generated by a sale.,No puede restablecer a borrador un movimiento generado por una venta.,0
+error,stock.shipment.out,0,You cannot reset to draft a move generated by a sale.,No puede restablecer a borrador un movimiento generado por una venta.,0
 field,"account.invoice,sale_exception_state",0,Exception State,Estado de excepción,0
 field,"product.template,salable",0,Salable,Vendible,0
 field,"product.template,sale_uom",0,Sale UOM,UdM de venta,0
 field,"sale.handle.invoice.exception.ask,domain_invoices",0,Domain Invoices,Facturas del dominio,0
 field,"sale.handle.invoice.exception.ask,recreate_invoices",0,Recreate Invoices,Rehacer facturas,0
-field,"sale.handle.packing.exception.ask,domain_moves",0,Domain Moves,Movimientos de dominio,0
-field,"sale.handle.packing.exception.ask,recreate_moves",0,Recreate Moves,Rehacer movimientos,0
+field,"sale.handle.shipment.exception.ask,domain_moves",0,Domain Moves,Movimientos de dominio,0
+field,"sale.handle.shipment.exception.ask,recreate_moves",0,Recreate Moves,Rehacer movimientos,0
 field,"sale.line-account.invoice.line,invoice_line",0,Invoice Line,Línea de factura,0
 field,"sale.line-account.invoice.line,rec_name",0,Name,Nombre,0
 field,"sale.line-account.invoice.line,sale_line",0,Sale Line,Línea de venta,0
@@ -27,7 +27,7 @@ field,"sale.line-ignored-stock.move,move",0,Move,Movimiento,0
 field,"sale.line-ignored-stock.move,rec_name",0,Name,Nombre,0
 field,"sale.line-ignored-stock.move,sale_line",0,Sale Line,Línea de venta,0
 field,"sale.line,invoice_lines",0,Invoice Lines,Líneas de factura,0
-field,"sale.line,move_done",0,Moves Done,Movimientos hechos,0
+field,"sale.line,move_done",0,Moves Done,Movimientos terminados,0
 field,"sale.line,move_exception",0,Moves Exception,Exepción de movimientos,0
 field,"sale.line,moves",0,Moves,Movimientos,0
 field,"sale.line,moves_ignored",0,Ignored Moves,Movimientos ignorados,0
@@ -67,12 +67,6 @@ field,"sale.sale,invoices_recreated",0,Recreated Invoices,Rehacer facturas,0
 field,"sale.sale,invoice_state",0,Invoice State,Estado de factura,0
 field,"sale.sale,lines",0,Lines,Líneas,0
 field,"sale.sale,moves",0,Moves,Movimientos,0
-field,"sale.sale,packing_address",0,Shipment Address,Dirección de envío,0
-field,"sale.sale,packing_done",0,Shipment Done,Envío realizado,0
-field,"sale.sale,packing_exception",0,Shipments Exception,Excepción de envíos,0
-field,"sale.sale,packing_method",0,Shipment Method,Método de envío,0
-field,"sale.sale,packings",0,Shipments,Envíos,0
-field,"sale.sale,packing_state",0,Shipment State,Estado de envío,0
 field,"sale.sale,party",0,Party,Tercero,0
 field,"sale.sale,party_lang",0,Party Language,Idioma del tercero,0
 field,"sale.sale,payment_term",0,Payment Term,Término de pago,0
@@ -82,6 +76,12 @@ field,"sale.sale-recreated-account.invoice,rec_name",0,Name,Nombre,0
 field,"sale.sale-recreated-account.invoice,sale",0,Sale,Venta,0
 field,"sale.sale,reference",0,Reference,Referencia,0
 field,"sale.sale,sale_date",0,Sale Date,Fecha de venta,0
+field,"sale.sale,shipment_address",0,Shipment Address,Dirección de envío,0
+field,"sale.sale,shipment_done",0,Shipment Done,Envío terminado,0
+field,"sale.sale,shipment_exception",0,Shipments Exception,Excepción de envíos,0
+field,"sale.sale,shipment_method",0,Shipment Method,Método de envío,0
+field,"sale.sale,shipments",0,Shipments,Envíos,0
+field,"sale.sale,shipment_state",0,Shipment State,Estado de envío,0
 field,"sale.sale,state",0,State,Estado,0
 field,"sale.sale,tax_amount",0,Tax,Impuesto,0
 field,"sale.sale,total_amount",0,Total,Total,0
@@ -94,7 +94,7 @@ help,"sale.handle.invoice.exception.ask,recreate_invoices",0,The selected invoic
 model,"ir.action,name",act_sale_form_confirmed,Confirmed Sales,Ventas confirmadas,0
 model,"ir.action,name",act_sale_form_draft,Draft Sales,Ventas en borrador,0
 model,"ir.action,name",wizard_invoice_handle_exception,Handle Invoice Exception,Gestionar excepción de factura,0
-model,"ir.action,name",wizard_packing_handle_exception,Handle Shipment Exception,Gestionar excepción de envio,0
+model,"ir.action,name",wizard_shipment_handle_exception,Handle Shipment Exception,Gestionar excepción de envio,0
 model,"ir.action,name",act_invoice_form,Invoices,Facturas,0
 model,"ir.action,name",act_sale_form_new,New Sale,Nueva venta,0
 model,"ir.action,name",act_open_customer,Parties associated to Sales,Terceros asociados a ventas,0
@@ -102,7 +102,7 @@ model,"ir.action,name",act_sale_form_quotation,Quotation Sales,Ventas presupuest
 model,"ir.action,name",report_sale,Sale,Venta,0
 model,"ir.action,name",act_sale_form,Sales,Ventas,0
 model,"ir.action,name",act_sale_form2,Sales,Ventas,0
-model,"ir.action,name",act_packing_form,Shipments,Envíos,0
+model,"ir.action,name",act_shipment_form,Shipments,Envíos,0
 model,"ir.sequence,name",sequence_sale,Sale,Venta,0
 model,"ir.sequence.type,name",sequence_type_sale,Sale,Venta,0
 model,"ir.ui.menu,name",menu_sale_form_confirmed,Confirmed Sales,Ventas confirmadas,0
@@ -113,8 +113,8 @@ model,"ir.ui.menu,name",menu_sale_form_quotation,Quotation Sales,Ventas presupue
 model,"ir.ui.menu,name",menu_sale,Sale Management,Gestión de ventas,0
 model,"ir.ui.menu,name",menu_sale_form,Sales,Ventas,0
 model,"res.group,name",group_sale,Sale,Venta,0
-model,"sale.handle.invoice.exception.ask,name",0,Invoice Exception Ask,,0
-model,"sale.handle.packing.exception.ask,name",0,Shipment Exception Ask,,0
+model,"sale.handle.invoice.exception.ask,name",0,Invoice Exception Ask,Factura de excepcion - Petición,0
+model,"sale.handle.shipment.exception.ask,name",0,Shipment Exception Ask,Envio de excepcion - Petición,0
 model,"sale.line-account.invoice.line,name",0,Sale Line - Invoice Line,Línea de venta - Línea de factura,0
 model,"sale.line-account.tax,name",0,Sale Line - Tax,Línea de venta - Impuesto,0
 model,"sale.line-ignored-stock.move,name",0,Sale Line - Ignored Move,Línea de venta - Movimiento ignorado,0
@@ -126,31 +126,31 @@ model,"sale.sale,name",0,Sale,Venta,0
 model,"sale.sale-recreated-account.invoice,name",0,Sale - Recreated Invoice,Venta - Factura recreada,0
 model,"workflow.activity,name",sale_activity_cancel,Canceled,Cancelado,0
 model,"workflow.activity,name",sale_activity_confirmed,Confirmed,Confirmado,0
-model,"workflow.activity,name",sale_activity_done,Done,Hecho,0
+model,"workflow.activity,name",sale_activity_done,Done,Terminado,0
 model,"workflow.activity,name",sale_activity_draft,Draft,Borrador,0
-model,"workflow.activity,name",sale_activity_invoice_sale_done,Invoice Done,Factura hecha,0
+model,"workflow.activity,name",sale_activity_invoice_sale_done,Invoice Done,Factura terminada,0
 model,"workflow.activity,name",sale_activity_invoice_sale_exception,Invoice Exception,Excepción de factura,0
 model,"workflow.activity,name",sale_activity_invoice_method,Invoice Method,Método de facturación,0
-model,"workflow.activity,name",sale_activity_invoice_method_done,Invoice Method Done,Método de factura hecho,0
-model,"workflow.activity,name",sale_activity_invoice_packing,Invoice Shipment,Envío de factura,0
-model,"workflow.activity,name",sale_activity_invoice_packing_done,Invoice Shipment Done,Envío de factura realizado,0
-model,"workflow.activity,name",sale_activity_invoice_packing_exception,Invoice Shipment Exception,Excepción de envío de factura,0
-model,"workflow.activity,name",sale_activity_invoice_packing_method,Invoice Shipment Method,Método de envío de factura,0
-model,"workflow.activity,name",sale_activity_invoice_packing_method_done,Invoice Shipment Method Done,Método de envío de factura concluido,0
+model,"workflow.activity,name",sale_activity_invoice_method_done,Invoice Method Done,Método de factura terminado,0
+model,"workflow.activity,name",sale_activity_invoice_shipment,Invoice Shipment,Envío de factura,0
+model,"workflow.activity,name",sale_activity_invoice_shipment_done,Invoice Shipment Done,Envío de factura terminado,0
+model,"workflow.activity,name",sale_activity_invoice_shipment_exception,Invoice Shipment Exception,Excepción de envío de factura,0
+model,"workflow.activity,name",sale_activity_invoice_shipment_method,Invoice Shipment Method,Método de envío de factura,0
+model,"workflow.activity,name",sale_activity_invoice_shipment_method_done,Invoice Shipment Method Done,Método de envío de factura terminado,0
 model,"workflow.activity,name",sale_activity_quotation,Quotation,Presupuesto,0
-model,"workflow.activity,name",sale_activity_packing,Shipment,Envío,0
-model,"workflow.activity,name",sale_activity_packing_exception,Shipment Exception,Excepción de envío,0
-model,"workflow.activity,name",sale_activity_packing_invoice,Shipment Invoice,Envío de factura,0
-model,"workflow.activity,name",sale_activity_packing_invoice_done,Shipment Invoice Done,Envío de factura concluido,0
-model,"workflow.activity,name",sale_activity_packing_invoice_exception,Shipment Invoice Exception,Excepción de envío de factura,0
-model,"workflow.activity,name",sale_activity_packing_invoice_method,Shipment Invoice Method,Método de envío de factura,0
-model,"workflow.activity,name",sale_activity_packing_invoice_method_done,Shipment Invoice Method Done,Método de envío de factura concluido,0
-model,"workflow.activity,name",sale_activity_packing_method,Shipment Method,Método de envío,0
-model,"workflow.activity,name",sale_activity_packing_method_done,Shipment Method Done,Método de envío concluido,0
+model,"workflow.activity,name",sale_activity_shipment,Shipment,Envío,0
+model,"workflow.activity,name",sale_activity_shipment_exception,Shipment Exception,Excepción de envío,0
+model,"workflow.activity,name",sale_activity_shipment_invoice,Shipment Invoice,Envío de factura,0
+model,"workflow.activity,name",sale_activity_shipment_invoice_done,Shipment Invoice Done,Envío de factura terminado,0
+model,"workflow.activity,name",sale_activity_shipment_invoice_exception,Shipment Invoice Exception,Excepción de envío de factura,0
+model,"workflow.activity,name",sale_activity_shipment_invoice_method,Shipment Invoice Method,Método de envío de factura,0
+model,"workflow.activity,name",sale_activity_shipment_invoice_method_done,Shipment Invoice Method Done,Método de envío de factura terminado,0
+model,"workflow.activity,name",sale_activity_shipment_method,Shipment Method,Método de envío,0
+model,"workflow.activity,name",sale_activity_shipment_method_done,Shipment Method Done,Método de envío terminado,0
 model,"workflow.activity,name",sale_activity_waiting_invoice_sale,Waiting Invoice,Esperando factura,0
-model,"workflow.activity,name",sale_activity_waiting_invoice_packing,Waiting Invoice Shipment,Esperando Envío de Factura,0
-model,"workflow.activity,name",sale_activity_waiting_packing,Waiting Shipment,Esperando Envío,0
-model,"workflow.activity,name",sale_activity_waiting_packing_invoice,Waiting Shipment Invoice,Esperando Envío de Factura,0
+model,"workflow.activity,name",sale_activity_waiting_invoice_shipment,Waiting Invoice Shipment,Esperando Envío de Factura,0
+model,"workflow.activity,name",sale_activity_waiting_shipment,Waiting Shipment,Esperando Envío,0
+model,"workflow.activity,name",sale_activity_waiting_shipment_invoice,Waiting Shipment Invoice,Esperando Envío de Factura,0
 model,"workflow,name",sale_workflow,Sale workflow,Flujo de Trabajo de Ventas,0
 odt,sale.sale,0,Amount,Cantidad,0
 odt,sale.sale,0,Date:,Fecha:,0
@@ -167,7 +167,7 @@ odt,sale.sale,0,Taxes:,Impuestos:,0
 odt,sale.sale,0,Total:,Total:,0
 odt,sale.sale,0,Total (excl. taxes):,Total (sin impuestos):,0
 odt,sale.sale,0,Unit Price,Precio unitario,0
-odt,sale.sale,0,VAT:,IVA:,0
+odt,sale.sale,0,VAT:,NIF:,0
 selection,"account.invoice,sale_exception_state",0,,,0
 selection,"account.invoice,sale_exception_state",0,Ignored,Ignorado,0
 selection,"account.invoice,sale_exception_state",0,Recreated,Rehecho,0
@@ -177,33 +177,33 @@ selection,"sale.line,type",0,Subtotal,Subtotal,0
 selection,"sale.line,type",0,Title,Título,0
 selection,"sale.sale,invoice_method",0,Manual,Manual,0
 selection,"sale.sale,invoice_method",0,On Order Confirmed,Al confirmar la orden,0
-selection,"sale.sale,invoice_method",0,On Shipment Sent,Enviado,0
+selection,"sale.sale,invoice_method",0,On Shipment Sent,Al Enviarlo,0
 selection,"sale.sale,invoice_state",0,Exception,Excepción,0
 selection,"sale.sale,invoice_state",0,None,Ninguno,0
 selection,"sale.sale,invoice_state",0,Paid,Pagado,0
 selection,"sale.sale,invoice_state",0,Waiting,En espera,0
-selection,"sale.sale,packing_method",0,Manual,Manual,0
-selection,"sale.sale,packing_method",0,On Invoice Paid,Al pagar la factura,0
-selection,"sale.sale,packing_method",0,On Order Confirmed,Al confirmar la orden,0
-selection,"sale.sale,packing_state",0,Exception,Excepción,0
-selection,"sale.sale,packing_state",0,None,Ninguno,0
-selection,"sale.sale,packing_state",0,Sent,Enviado,0
-selection,"sale.sale,packing_state",0,Waiting,En espera,0
+selection,"sale.sale,shipment_method",0,Manual,Manual,0
+selection,"sale.sale,shipment_method",0,On Invoice Paid,Al pagar la factura,0
+selection,"sale.sale,shipment_method",0,On Order Confirmed,Al confirmar la orden,0
+selection,"sale.sale,shipment_state",0,Exception,Excepción,0
+selection,"sale.sale,shipment_state",0,None,Ninguno,0
+selection,"sale.sale,shipment_state",0,Sent,Enviado,0
+selection,"sale.sale,shipment_state",0,Waiting,En espera,0
 selection,"sale.sale,state",0,Canceled,Cancelado,0
 selection,"sale.sale,state",0,Confirmed,Confirmado,0
-selection,"sale.sale,state",0,Done,Hecho,0
+selection,"sale.sale,state",0,Done,Terminada,0
 selection,"sale.sale,state",0,Draft,Borrador,0
 selection,"sale.sale,state",0,Quotation,Presupuesto,0
 selection,"stock.move,sale_exception_state",0,,,0
-selection,"stock.move,sale_exception_state",0,Ignored,Ignore,0
+selection,"stock.move,sale_exception_state",0,Ignored,Ignorado,0
 selection,"stock.move,sale_exception_state",0,Recreated,Rehacer,0
 view,product.product,0,Customers,Clientes,0
 view,product.template,0,Customers,Clientes,0
 view,sale.handle.invoice.exception.ask,0,Choose invoices to recreate,Escoja una factura a rehacer,0
-view,sale.handle.invoice.exception.ask,0,Handle Invoice Exception,Excepción de Manejo de Factura,0
-view,sale.handle.packing.exception.ask,0,Choose move to recreate,Escoja un movimiento a rehacer,0
-view,sale.handle.packing.exception.ask,0,Handle packing Exception,Maneje Excepciones de empaquetado,0
-view,sale.handle.packing.exception.ask,0,Recreate Moves,Recrear movimientos,0
+view,sale.handle.invoice.exception.ask,0,Handle Invoice Exception,Excepción de manejo de factura,0
+view,sale.handle.shipment.exception.ask,0,Choose move to recreate,Escoja un movimiento a rehacer,0
+view,sale.handle.shipment.exception.ask,0,Handle shipment Exception,Manejar excepción de envio,0
+view,sale.handle.shipment.exception.ask,0,Recreate Moves,Recrear movimientos,0
 view,sale.line,0,General,General,0
 view,sale.line,0,Notes,Notas,0
 view,sale.line,0,Products,Productos,0
@@ -212,20 +212,18 @@ view,sale.line,0,Sale Lines,Líneas de venta,0
 view,sale.sale,0,Cancel,Cancelar,0
 view,sale.sale,0,Confirm,Confirmar,0
 view,sale.sale,0,Draft,Borrador,0
-view,sale.sale,0,Handle Invoice Exception,Excepción que maneja factura,0
-view,sale.sale,0,Handle Shipment Exception,Excepción que maneja envío,0
-view,sale.sale,0,Ignore Invoice Exception,Ignorar excepción en Factura,0
-view,sale.sale,0,Ignore Packing Exception,Ignorar excepción en Empaque,0
+view,sale.sale,0,Handle Invoice Exception,Manejar excepción de factura,0
+view,sale.sale,0,Handle Shipment Exception,Manejar excepción de envio,0
+view,sale.sale,0,Ignore Invoice Exception,Ignorar excepción de factura,0
 view,sale.sale,0,Invoices,Facturas,0
 view,sale.sale,0,Lines,Líneas,0
 view,sale.sale,0,Moves,Movimientos,0
 view,sale.sale,0,Other Info,Información adicional,0
-view,sale.sale,0,Packings,Empaques,0
 view,sale.sale,0,Quotation,Presupuesto,0
 view,sale.sale,0,Sale,Venta,0
 view,sale.sale,0,Sales,Ventas,0
-view,sale.sale,0,Shipments,Empaques,0
+view,sale.sale,0,Shipments,Envios,0
 wizard_button,"sale.handle.invoice.exception,init,end",0,Cancel,Cancelar,0
 wizard_button,"sale.handle.invoice.exception,init,ok",0,Ok,Aceptar,0
-wizard_button,"sale.handle.packing.exception,init,end",0,Cancel,Cancelar,0
-wizard_button,"sale.handle.packing.exception,init,ok",0,Ok,Aceptar,0
+wizard_button,"sale.handle.shipment.exception,init,end",0,Cancel,Cancelar,0
+wizard_button,"sale.handle.shipment.exception,init,ok",0,Ok,Aceptar,0
diff --git a/fr_FR.csv b/fr_FR.csv
index 2bf8d00..d638d75 100644
--- a/fr_FR.csv
+++ b/fr_FR.csv
@@ -1,20 +1,20 @@
 type,name,res_id,src,value,fuzzy
 error,account.invoice,0,You can not delete invoices that come from a sale!,Vous ne pouvez pas supprimer une facture qui provient d'une vente,0
 error,account.invoice,0,You cannot reset to draft an invoice generated by a sale.,Vous ne pouvez pas réinitialiser une facture générée par une vente.,0
-error,sale.line,0,"It misses an ""account Revenue"" default property!","il manque une propriété par défaut ""compte de revenu"" !",0
-error,sale.line,0,"It misses an ""Account Revenue"" on product ""%s""!","Il manque un compte de revenu sur le produit ""%s"" !",0
+error,sale.line,0,"It misses an ""account Revenue"" default property!","il manque une propriété par défaut ""compte de produits"" !",0
+error,sale.line,0,"It misses an ""Account Revenue"" on product ""%s""!","Il manque un compte de produits sur le produit ""%s"" !",0
 error,sale.line,0,The customer location is required!,L'emplacement client est requis !,0
 error,sale.sale,0,Invoice and Shipment addresses must be defined for the quotation.,Les adresses de facturation et d'expédition sont requises pour le devis.,0
-error,sale.sale,0,"It misses an ""Account Receivable"" on the party ""%s""!","Il manque un compte de revenu sur le tiers ""%s"" !",0
+error,sale.sale,0,"It misses an ""Account Receivable"" on the party ""%s""!","Il manque un compte à recevoir sur le tiers ""%s"" !",0
 error,sale.sale,0,Wrong combination of method!,Mauvaise combinaison de méthodes !,0
-error,stock.packing.out,0,You cannot reset to draft a move generated by a sale.,Vous ne pouvez pas réinitialiser un mouvement généré par une vente.,0
+error,stock.shipment.out,0,You cannot reset to draft a move generated by a sale.,Vous ne pouvez pas réinitialiser un mouvement généré par une vente.,0
 field,"account.invoice,sale_exception_state",0,Exception State,État d'exception,0
 field,"product.template,salable",0,Salable,Vendable,0
 field,"product.template,sale_uom",0,Sale UOM,UDM de vente,0
 field,"sale.handle.invoice.exception.ask,domain_invoices",0,Domain Invoices,Domaine des factures,0
 field,"sale.handle.invoice.exception.ask,recreate_invoices",0,Recreate Invoices,Recréer les factures,0
-field,"sale.handle.packing.exception.ask,domain_moves",0,Domain Moves,Domaine des mouvements,0
-field,"sale.handle.packing.exception.ask,recreate_moves",0,Recreate Moves,Recréer les mouvements,0
+field,"sale.handle.shipment.exception.ask,domain_moves",0,Domain Moves,Domaine des mouvements,0
+field,"sale.handle.shipment.exception.ask,recreate_moves",0,Recreate Moves,Recréer les mouvements,0
 field,"sale.line-account.invoice.line,invoice_line",0,Invoice Line,Ligne de facture,0
 field,"sale.line-account.invoice.line,rec_name",0,Name,Nom,0
 field,"sale.line-account.invoice.line,sale_line",0,Sale Line,Ligne de vente,0
@@ -67,12 +67,6 @@ field,"sale.sale,invoices_recreated",0,Recreated Invoices,Factures recréées,0
 field,"sale.sale,invoice_state",0,Invoice State,État de la factutre,0
 field,"sale.sale,lines",0,Lines,Lignes,0
 field,"sale.sale,moves",0,Moves,Mouvements,0
-field,"sale.sale,packing_address",0,Shipment Address,Adresse de livraison,0
-field,"sale.sale,packing_done",0,Shipment Done,Expédition effectuée,0
-field,"sale.sale,packing_exception",0,Shipments Exception,Expéditions en exception,0
-field,"sale.sale,packing_method",0,Shipment Method,Méthode de livraison,0
-field,"sale.sale,packings",0,Shipments,Expédition,0
-field,"sale.sale,packing_state",0,Shipment State,État de l'expédition,0
 field,"sale.sale,party",0,Party,Tiers,0
 field,"sale.sale,party_lang",0,Party Language,Langue du tiers,0
 field,"sale.sale,payment_term",0,Payment Term,Conditions de paiement,0
@@ -82,6 +76,12 @@ field,"sale.sale-recreated-account.invoice,rec_name",0,Name,Nom,0
 field,"sale.sale-recreated-account.invoice,sale",0,Sale,Vente,0
 field,"sale.sale,reference",0,Reference,Référence,0
 field,"sale.sale,sale_date",0,Sale Date,Date de la vente,0
+field,"sale.sale,shipment_address",0,Shipment Address,Adresse de livraison,0
+field,"sale.sale,shipment_done",0,Shipment Done,Expédition effectuée,0
+field,"sale.sale,shipment_exception",0,Shipments Exception,Expéditions en exception,0
+field,"sale.sale,shipment_method",0,Shipment Method,Méthode de livraison,0
+field,"sale.sale,shipments",0,Shipments,Expédition,0
+field,"sale.sale,shipment_state",0,Shipment State,État de l'expédition,0
 field,"sale.sale,state",0,State,État,0
 field,"sale.sale,tax_amount",0,Tax,Taxe,0
 field,"sale.sale,total_amount",0,Total,Total,0
@@ -94,7 +94,7 @@ help,"sale.handle.invoice.exception.ask,recreate_invoices",0,The selected invoic
 model,"ir.action,name",act_sale_form_confirmed,Confirmed Sales,Ventes confirmées,0
 model,"ir.action,name",act_sale_form_draft,Draft Sales,Ventes brouillon,0
 model,"ir.action,name",wizard_invoice_handle_exception,Handle Invoice Exception,Gérer l'exception de facture,0
-model,"ir.action,name",wizard_packing_handle_exception,Handle Shipment Exception,Gérer l'exception d'expédition,0
+model,"ir.action,name",wizard_shipment_handle_exception,Handle Shipment Exception,Gérer l'exception d'expédition,0
 model,"ir.action,name",act_invoice_form,Invoices,Factures,0
 model,"ir.action,name",act_sale_form_new,New Sale,Nouvelle vente,0
 model,"ir.action,name",act_open_customer,Parties associated to Sales,Tiers associés à des ventes,0
@@ -102,7 +102,7 @@ model,"ir.action,name",act_sale_form_quotation,Quotation Sales,Devis,0
 model,"ir.action,name",report_sale,Sale,Vente,0
 model,"ir.action,name",act_sale_form,Sales,Ventes,0
 model,"ir.action,name",act_sale_form2,Sales,Ventes,0
-model,"ir.action,name",act_packing_form,Shipments,Expéditions,0
+model,"ir.action,name",act_shipment_form,Shipments,Expéditions,0
 model,"ir.sequence,name",sequence_sale,Sale,Vente,0
 model,"ir.sequence.type,name",sequence_type_sale,Sale,Vente,0
 model,"ir.ui.menu,name",menu_sale_form_confirmed,Confirmed Sales,Ventes confirmées,0
@@ -114,7 +114,7 @@ model,"ir.ui.menu,name",menu_sale,Sale Management,Gestion des ventes,0
 model,"ir.ui.menu,name",menu_sale_form,Sales,Ventes,0
 model,"res.group,name",group_sale,Sale,Vente,0
 model,"sale.handle.invoice.exception.ask,name",0,Invoice Exception Ask,Exception de facture - Demande,0
-model,"sale.handle.packing.exception.ask,name",0,Shipment Exception Ask,Exception d'expédition - Demande,0
+model,"sale.handle.shipment.exception.ask,name",0,Shipment Exception Ask,Exception d'expédition - Demande,0
 model,"sale.line-account.invoice.line,name",0,Sale Line - Invoice Line,Ligne de vente - Ligne de facture,0
 model,"sale.line-account.tax,name",0,Sale Line - Tax,Ligne de vente - Taxe,0
 model,"sale.line-ignored-stock.move,name",0,Sale Line - Ignored Move,Ligne de vente - Mouvement ignoré,0
@@ -132,25 +132,25 @@ model,"workflow.activity,name",sale_activity_invoice_sale_done,Invoice Done,Fact
 model,"workflow.activity,name",sale_activity_invoice_sale_exception,Invoice Exception,Facture en exception,0
 model,"workflow.activity,name",sale_activity_invoice_method,Invoice Method,Méthode de facturation,0
 model,"workflow.activity,name",sale_activity_invoice_method_done,Invoice Method Done,Méthode de facture faite,0
-model,"workflow.activity,name",sale_activity_invoice_packing,Invoice Shipment,Facture expédition,0
-model,"workflow.activity,name",sale_activity_invoice_packing_done,Invoice Shipment Done,Facture expédition faite,0
-model,"workflow.activity,name",sale_activity_invoice_packing_exception,Invoice Shipment Exception,Facture expédition en exception,0
-model,"workflow.activity,name",sale_activity_invoice_packing_method,Invoice Shipment Method,Méthode facture expédition,0
-model,"workflow.activity,name",sale_activity_invoice_packing_method_done,Invoice Shipment Method Done,Méthode facture expédition faite,0
+model,"workflow.activity,name",sale_activity_invoice_shipment,Invoice Shipment,Facture expédition,0
+model,"workflow.activity,name",sale_activity_invoice_shipment_done,Invoice Shipment Done,Facture expédition faite,0
+model,"workflow.activity,name",sale_activity_invoice_shipment_exception,Invoice Shipment Exception,Facture expédition en exception,0
+model,"workflow.activity,name",sale_activity_invoice_shipment_method,Invoice Shipment Method,Méthode facture expédition,0
+model,"workflow.activity,name",sale_activity_invoice_shipment_method_done,Invoice Shipment Method Done,Méthode facture expédition faite,0
 model,"workflow.activity,name",sale_activity_quotation,Quotation,Devis,0
-model,"workflow.activity,name",sale_activity_packing,Shipment,Expédition,0
-model,"workflow.activity,name",sale_activity_packing_exception,Shipment Exception,Expédition en exception,0
-model,"workflow.activity,name",sale_activity_packing_invoice,Shipment Invoice,Facture expédition,0
-model,"workflow.activity,name",sale_activity_packing_invoice_done,Shipment Invoice Done,Facture expédition faite,0
-model,"workflow.activity,name",sale_activity_packing_invoice_exception,Shipment Invoice Exception,Facture expédition en exception,0
-model,"workflow.activity,name",sale_activity_packing_invoice_method,Shipment Invoice Method,Méthode facture expédition,0
-model,"workflow.activity,name",sale_activity_packing_invoice_method_done,Shipment Invoice Method Done,Méthode facture expédition faite,0
-model,"workflow.activity,name",sale_activity_packing_method,Shipment Method,Méthode d'expédition,0
-model,"workflow.activity,name",sale_activity_packing_method_done,Shipment Method Done,Méthode d'expédition faite,0
+model,"workflow.activity,name",sale_activity_shipment,Shipment,Expédition,0
+model,"workflow.activity,name",sale_activity_shipment_exception,Shipment Exception,Expédition en exception,0
+model,"workflow.activity,name",sale_activity_shipment_invoice,Shipment Invoice,Facture expédition,0
+model,"workflow.activity,name",sale_activity_shipment_invoice_done,Shipment Invoice Done,Facture expédition faite,0
+model,"workflow.activity,name",sale_activity_shipment_invoice_exception,Shipment Invoice Exception,Facture expédition en exception,0
+model,"workflow.activity,name",sale_activity_shipment_invoice_method,Shipment Invoice Method,Méthode facture expédition,0
+model,"workflow.activity,name",sale_activity_shipment_invoice_method_done,Shipment Invoice Method Done,Méthode facture expédition faite,0
+model,"workflow.activity,name",sale_activity_shipment_method,Shipment Method,Méthode d'expédition,0
+model,"workflow.activity,name",sale_activity_shipment_method_done,Shipment Method Done,Méthode d'expédition faite,0
 model,"workflow.activity,name",sale_activity_waiting_invoice_sale,Waiting Invoice,Facture en attente,0
-model,"workflow.activity,name",sale_activity_waiting_invoice_packing,Waiting Invoice Shipment,Facture expédition en attente,0
-model,"workflow.activity,name",sale_activity_waiting_packing,Waiting Shipment,Expédition en attente,0
-model,"workflow.activity,name",sale_activity_waiting_packing_invoice,Waiting Shipment Invoice,Facture expédition en attente,0
+model,"workflow.activity,name",sale_activity_waiting_invoice_shipment,Waiting Invoice Shipment,Facture expédition en attente,0
+model,"workflow.activity,name",sale_activity_waiting_shipment,Waiting Shipment,Expédition en attente,0
+model,"workflow.activity,name",sale_activity_waiting_shipment_invoice,Waiting Shipment Invoice,Facture expédition en attente,0
 model,"workflow,name",sale_workflow,Sale workflow,Workflow de vente,0
 odt,sale.sale,0,Amount,Montant,0
 odt,sale.sale,0,Date:,Date :,0
@@ -177,18 +177,18 @@ selection,"sale.line,type",0,Subtotal,Sous-total,0
 selection,"sale.line,type",0,Title,Titre,0
 selection,"sale.sale,invoice_method",0,Manual,Manuel,0
 selection,"sale.sale,invoice_method",0,On Order Confirmed,A la confirmation de la commande,0
-selection,"sale.sale,invoice_method",0,On Shipment Sent,A la livraison,0
+selection,"sale.sale,invoice_method",0,On Shipment Sent,À la livraison,0
 selection,"sale.sale,invoice_state",0,Exception,Exception,0
 selection,"sale.sale,invoice_state",0,None,Aucun,0
 selection,"sale.sale,invoice_state",0,Paid,Payé,0
 selection,"sale.sale,invoice_state",0,Waiting,En attente,0
-selection,"sale.sale,packing_method",0,Manual,Manuel,0
-selection,"sale.sale,packing_method",0,On Invoice Paid,Au paiement de la facture,0
-selection,"sale.sale,packing_method",0,On Order Confirmed,À la confirmation de la commande,0
-selection,"sale.sale,packing_state",0,Exception,Exception,0
-selection,"sale.sale,packing_state",0,None,Aucun,0
-selection,"sale.sale,packing_state",0,Sent,Envoyé,0
-selection,"sale.sale,packing_state",0,Waiting,En attente,0
+selection,"sale.sale,shipment_method",0,Manual,Manuel,0
+selection,"sale.sale,shipment_method",0,On Invoice Paid,Au paiement de la facture,0
+selection,"sale.sale,shipment_method",0,On Order Confirmed,À la confirmation de la commande,0
+selection,"sale.sale,shipment_state",0,Exception,Exception,0
+selection,"sale.sale,shipment_state",0,None,Aucun,0
+selection,"sale.sale,shipment_state",0,Sent,Envoyé,0
+selection,"sale.sale,shipment_state",0,Waiting,En attente,0
 selection,"sale.sale,state",0,Canceled,Annulé,0
 selection,"sale.sale,state",0,Confirmed,Confirmé,0
 selection,"sale.sale,state",0,Done,Fait,0
@@ -201,9 +201,9 @@ view,product.product,0,Customers,Clients,0
 view,product.template,0,Customers,Clients,0
 view,sale.handle.invoice.exception.ask,0,Choose invoices to recreate,Choisir les factures à recréer,0
 view,sale.handle.invoice.exception.ask,0,Handle Invoice Exception,Gérer l'exception de facture,0
-view,sale.handle.packing.exception.ask,0,Choose move to recreate,Choisir le mouvement à recréer,0
-view,sale.handle.packing.exception.ask,0,Handle packing Exception,Gérer l'exception d'expédition,0
-view,sale.handle.packing.exception.ask,0,Recreate Moves,Recréer les mouvements,0
+view,sale.handle.shipment.exception.ask,0,Choose move to recreate,Choisir le mouvement à recréer,0
+view,sale.handle.shipment.exception.ask,0,Handle shipment Exception,Gérer l'exception d'expédition,0
+view,sale.handle.shipment.exception.ask,0,Recreate Moves,Recréer les mouvements,0
 view,sale.line,0,General,Général,0
 view,sale.line,0,Notes,Notes,0
 view,sale.line,0,Products,produits,0
@@ -226,5 +226,5 @@ view,sale.sale,0,Sales,Ventes,0
 view,sale.sale,0,Shipments,Expéditions,0
 wizard_button,"sale.handle.invoice.exception,init,end",0,Cancel,Annuler,0
 wizard_button,"sale.handle.invoice.exception,init,ok",0,Ok,Ok,0
-wizard_button,"sale.handle.packing.exception,init,end",0,Cancel,Annuler,0
-wizard_button,"sale.handle.packing.exception,init,ok",0,Ok,Ok,0
+wizard_button,"sale.handle.shipment.exception,init,end",0,Cancel,Annuler,0
+wizard_button,"sale.handle.shipment.exception,init,ok",0,Ok,Ok,0
diff --git a/sale.py b/sale.py
index f9ed5b2..3412024 100644
--- a/sale.py
+++ b/sale.py
@@ -2,10 +2,11 @@
 #of this repository contains the full copyright notices and license terms.
 "Sale"
 from trytond.model import ModelWorkflow, ModelView, ModelSQL, fields
-from trytond.report import CompanyReport
+from trytond.modules.company import CompanyReport
 from trytond.wizard import Wizard
 from trytond.backend import TableHandler
 from decimal import Decimal
+import copy
 
 
 class Sale(ModelWorkflow, ModelSQL, ModelView):
@@ -17,7 +18,7 @@ class Sale(ModelWorkflow, ModelSQL, ModelView):
     company = fields.Many2One('company.company', 'Company', required=True,
             states={
                 'readonly': "state != 'draft' or bool(lines)",
-            }, domain="[('id', '=', context.get('company', 0))]")
+            }, domain=["('id', '=', context.get('company', 0))"])
     reference = fields.Char('Reference', readonly=True, select=1)
     description = fields.Char('Description', states={
         'readonly': "state != 'draft'",
@@ -43,11 +44,11 @@ class Sale(ModelWorkflow, ModelSQL, ModelView):
     party_lang = fields.Function('get_function_fields', type='char',
             string='Party Language', on_change_with=['party'])
     invoice_address = fields.Many2One('party.address', 'Invoice Address',
-            domain="[('party', '=', party)]", states={
+            domain=["('party', '=', party)"], states={
                 'readonly': "state != 'draft'",
             })
-    packing_address = fields.Many2One('party.address', 'Shipment Address',
-            domain="[('party', '=', party)]", states={
+    shipment_address = fields.Many2One('party.address', 'Shipment Address',
+            domain=["('party', '=', party)"], states={
                 'readonly': "state != 'draft'",
             })
     warehouse = fields.Many2One('stock.location', 'Warehouse',
@@ -73,7 +74,7 @@ class Sale(ModelWorkflow, ModelSQL, ModelView):
     invoice_method = fields.Selection([
         ('manual', 'Manual'),
         ('order', 'On Order Confirmed'),
-        ('packing', 'On Shipment Sent'),
+        ('shipment', 'On Shipment Sent'),
     ], 'Invoice Method', required=True, states={
         'readonly': "state != 'draft'",
         })
@@ -93,26 +94,26 @@ class Sale(ModelWorkflow, ModelSQL, ModelView):
             string='Invoices Paid')
     invoice_exception = fields.Function('get_function_fields', type='boolean',
             string='Invoices Exception')
-    packing_method = fields.Selection([
+    shipment_method = fields.Selection([
         ('manual', 'Manual'),
         ('order', 'On Order Confirmed'),
         ('invoice', 'On Invoice Paid'),
     ], 'Shipment Method', required=True, states={
         'readonly': "state != 'draft'",
         })
-    packing_state = fields.Selection([
+    shipment_state = fields.Selection([
         ('none', 'None'),
         ('waiting', 'Waiting'),
         ('sent', 'Sent'),
         ('exception', 'Exception'),
     ], 'Shipment State', readonly=True, required=True)
-    packings = fields.Function('get_function_fields', type='many2many',
-            relation='stock.packing.out', string='Shipments')
+    shipments = fields.Function('get_function_fields', type='many2many',
+            relation='stock.shipment.out', string='Shipments')
     moves = fields.Function('get_function_fields', type='many2many',
             relation='stock.move', string='Moves')
-    packing_done = fields.Function('get_function_fields', type='boolean',
+    shipment_done = fields.Function('get_function_fields', type='boolean',
             string='Shipment Done')
-    packing_exception = fields.Function('get_function_fields', type='boolean',
+    shipment_exception = fields.Function('get_function_fields', type='boolean',
             string='Shipments Exception')
 
     def __init__(self):
@@ -130,6 +131,30 @@ class Sale(ModelWorkflow, ModelSQL, ModelView):
                     'an "Account Receivable" on the party "%s"!',
         })
 
+    def init(self, cursor, module_name):
+        # 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,))
+        table = TableHandler(cursor, self, module_name)
+        table.column_rename('packing_state', 'shipment_state')
+        table.column_rename('packing_method', 'shipment_method')
+        table.column_rename('packing_address', 'shipment_address')
+
+        super(Sale, self).init(cursor, module_name)
+
+        # Migration from 1.2
+        cursor.execute("UPDATE " + self._table + " "\
+                "SET invoice_method = 'shipment' "\
+                "WHERE invoice_method = 'packing'")
+
     def default_payment_term(self, cursor, user, context=None):
         payment_term_obj = self.pool.get('account.invoice.payment_term')
         payment_term_ids = payment_term_obj.search(cursor, user,
@@ -190,10 +215,10 @@ class Sale(ModelWorkflow, ModelSQL, ModelView):
     def default_invoice_state(self, cursor, user, context=None):
         return 'none'
 
-    def default_packing_method(self, cursor, user, context=None):
+    def default_shipment_method(self, cursor, user, context=None):
         return 'order'
 
-    def default_packing_state(self, cursor, user, context=None):
+    def default_shipment_state(self, cursor, user, context=None):
         return 'none'
 
     def on_change_party(self, cursor, user, ids, vals, context=None):
@@ -202,7 +227,7 @@ class Sale(ModelWorkflow, ModelSQL, ModelView):
         payment_term_obj = self.pool.get('account.invoice.payment_term')
         res = {
             'invoice_address': False,
-            'packing_address': False,
+            'shipment_address': False,
             'payment_term': False,
         }
         if vals.get('party'):
@@ -210,7 +235,7 @@ class Sale(ModelWorkflow, ModelSQL, ModelView):
                     context=context)
             res['invoice_address'] = party_obj.address_get(cursor, user,
                     party.id, type='invoice', context=context)
-            res['packing_address'] = party_obj.address_get(cursor, user,
+            res['shipment_address'] = party_obj.address_get(cursor, user,
                     party.id, type='delivery', context=context)
             if party.payment_term:
                 res['payment_term'] = party.payment_term.id
@@ -218,9 +243,9 @@ class Sale(ModelWorkflow, ModelSQL, ModelView):
         if res['invoice_address']:
             res['invoice_address.rec_name'] = address_obj.browse(cursor, user,
                     res['invoice_address'], context=context).rec_name
-        if res['packing_address']:
-            res['packing_address.rec_name'] = address_obj.browse(cursor, user,
-                    res['packing_address'], context=context).rec_name
+        if res['shipment_address']:
+            res['shipment_address.rec_name'] = address_obj.browse(cursor, user,
+                    res['shipment_address'], context=context).rec_name
         if not res['payment_term']:
             res['payment_term'] = self.default_payment_term(cursor, user,
                     context=context)
@@ -387,16 +412,16 @@ class Sale(ModelWorkflow, ModelSQL, ModelView):
         if 'invoice_exception' in names:
             res['invoice_exception'] = self.get_invoice_exception(cursor, user,
                     sales, context=context)
-        if 'packings' in names:
-            res['packings'] = self.get_packings(cursor, user, sales,
+        if 'shipments' in names:
+            res['shipments'] = self.get_shipments(cursor, user, sales,
                     context=context)
         if 'moves' in names:
             res['moves'] = self.get_moves(cursor, user, sales, context=context)
-        if 'packing_done' in names:
-            res['packing_done'] = self.get_packing_done(cursor, user, sales,
+        if 'shipment_done' in names:
+            res['shipment_done'] = self.get_shipment_done(cursor, user, sales,
                     context=context)
-        if 'packing_exception' in names:
-            res['packing_exception'] = self.get_packing_exception(cursor, user,
+        if 'shipment_exception' in names:
+            res['shipment_exception'] = self.get_shipment_exception(cursor, user,
                     sales, context=context)
         return res
 
@@ -537,25 +562,25 @@ class Sale(ModelWorkflow, ModelSQL, ModelView):
             res[sale.id] = val
         return res
 
-    def get_packings(self, cursor, user, sales, context=None):
+    def get_shipments(self, cursor, user, sales, context=None):
         '''
-        Return packing_out ids for each sales
+        Return shipment_out ids for each sales
 
         :param cursor: the database cursor
         :param user: the user id
         :param sales: a BrowseRecordList of sales
         :param context: the context
         :return: a dictionary with sale id as key and
-            a list of packing_out id as value
+            a list of shipment_out id as value
         '''
         res = {}
         for sale in sales:
             res[sale.id] = []
             for line in sale.lines:
                 for move in line.moves:
-                    if move.packing_out:
-                        if move.packing_out.id not in res[sale.id]:
-                            res[sale.id].append(move.packing_out.id)
+                    if move.shipment_out:
+                        if move.shipment_out.id not in res[sale.id]:
+                            res[sale.id].append(move.shipment_out.id)
         return res
 
     def get_moves(self, cursor, user, sales, context=None):
@@ -576,9 +601,9 @@ class Sale(ModelWorkflow, ModelSQL, ModelView):
                 res[sale.id].extend([x.id for x in line.moves])
         return res
 
-    def get_packing_done(self, cursor, user, sales, context=None):
+    def get_shipment_done(self, cursor, user, sales, context=None):
         '''
-        Return if all the packings have been done for each sales
+        Return if all the shipments have been done for each sales
 
         :param cursor: the database cursor
         :param user: the user id
@@ -597,9 +622,9 @@ class Sale(ModelWorkflow, ModelSQL, ModelView):
             res[sale.id] = val
         return res
 
-    def get_packing_exception(self, cursor, user, sales, context=None):
+    def get_shipment_exception(self, cursor, user, sales, context=None):
         '''
-        Return if there is a packing exception for each sales
+        Return if there is a shipment exception for each sales
 
         :param cursor: the database cursor
         :param user: the user id
@@ -623,11 +648,11 @@ class Sale(ModelWorkflow, ModelSQL, ModelView):
         Check the methods.
         '''
         for sale in self.browse(cursor, user, ids):
-            if sale.invoice_method == 'packing' \
-                    and sale.packing_method in ('invoice', 'manual'):
+            if sale.invoice_method == 'shipment' \
+                    and sale.shipment_method in ('invoice', 'manual'):
                 return False
-            if sale.packing_method == 'invoice' \
-                    and sale.invoice_method in ('packing', 'manual'):
+            if sale.shipment_method == 'invoice' \
+                    and sale.invoice_method in ('shipment', 'manual'):
                 return False
         return True
 
@@ -660,13 +685,13 @@ class Sale(ModelWorkflow, ModelSQL, ModelView):
         default['invoice_state'] = 'none'
         default['invoices'] = False
         default['invoices_ignored'] = False
-        default['packing_state'] = 'none'
+        default['shipment_state'] = 'none'
         return super(Sale, self).copy(cursor, user, ids, default=default,
                 context=context)
 
     def check_for_quotation(self, cursor, user, sale_id, context=None):
         sale = self.browse(cursor, user, sale_id, context=context)
-        if not sale.invoice_address or not sale.packing_address:
+        if not sale.invoice_address or not sale.shipment_address:
             self.raise_user_error(cursor, 'addresses_required', context=context)
         return True
 
@@ -716,6 +741,39 @@ class Sale(ModelWorkflow, ModelSQL, ModelView):
                 res[line.id] = val
         return res
 
+    def _get_invoice_sale(self, cursor, user, sale, context=None):
+        '''
+        Return invoice values for sale
+
+        :param cursor: the database cursor
+        :param user: the user id
+        :param sale: the BrowseRecord of the sale
+        :param context: the context
+
+        :return: a dictionary with invoice fields as key and
+            invoice values as value
+        '''
+        journal_obj = self.pool.get('account.journal')
+
+        journal_id = journal_obj.search(cursor, user, [
+            ('type', '=', 'revenue'),
+            ], limit=1, context=context)
+        if journal_id:
+            journal_id = journal_id[0]
+
+        res = {
+            'company': sale.company.id,
+            'type': 'out_invoice',
+            'reference': sale.reference,
+            'journal': journal_id,
+            'party': sale.party.id,
+            'invoice_address': sale.invoice_address.id,
+            'currency': sale.currency.id,
+            'account': sale.party.account_receivable.id,
+            'payment_term': sale.payment_term.id,
+            }
+        return res
+
     def create_invoice(self, cursor, user, sale_id, context=None):
         '''
         Create an invoice for the sale
@@ -728,7 +786,6 @@ class Sale(ModelWorkflow, ModelSQL, ModelView):
         :return: the created invoice id or None
         '''
         invoice_obj = self.pool.get('account.invoice')
-        journal_obj = self.pool.get('account.journal')
         invoice_line_obj = self.pool.get('account.invoice.line')
         sale_line_obj = self.pool.get('sale.line')
 
@@ -746,25 +803,11 @@ class Sale(ModelWorkflow, ModelSQL, ModelView):
         if not invoice_lines:
             return
 
-        journal_id = journal_obj.search(cursor, user, [
-            ('type', '=', 'revenue'),
-            ], limit=1, context=context)
-        if journal_id:
-            journal_id = journal_id[0]
 
         ctx = context.copy()
         ctx['user'] = user
-        invoice_id = invoice_obj.create(cursor, 0, {
-            'company': sale.company.id,
-            'type': 'out_invoice',
-            'reference': sale.reference,
-            'journal': journal_id,
-            'party': sale.party.id,
-            'invoice_address': sale.invoice_address.id,
-            'currency': sale.currency.id,
-            'account': sale.party.account_receivable.id,
-            'payment_term': sale.payment_term.id,
-        }, context=ctx)
+        vals = self._get_invoice_sale(cursor, user, sale, context=context)
+        invoice_id = invoice_obj.create(cursor, 0, vals, context=ctx)
 
         for line_id in invoice_lines:
             for vals in invoice_lines[line_id]:
@@ -801,18 +844,18 @@ class Sale(ModelWorkflow, ModelSQL, ModelView):
                 res[line.id] = val
         return res
 
-    def create_packing(self, cursor, user, sale_id, context=None):
+    def create_shipment(self, cursor, user, sale_id, context=None):
         '''
-        Create a packing for the sale
+        Create a shipment for the sale
 
         :param cursor: the database cursor
         :param user: the user id
         :param sale_id: the sale id
         :param context: the context
 
-        :return: the created packing id or None
+        :return: the created shipment id or None
         '''
-        packing_obj = self.pool.get('stock.packing.out')
+        shipment_obj = self.pool.get('stock.shipment.out')
         move_obj = self.pool.get('stock.move')
         sale_line_obj = self.pool.get('sale.line')
 
@@ -827,24 +870,24 @@ class Sale(ModelWorkflow, ModelSQL, ModelView):
 
         ctx = context.copy()
         ctx['user'] = user
-        packing_id = packing_obj.create(cursor, 0, {
+        shipment_id = shipment_obj.create(cursor, 0, {
             'planned_date': sale.sale_date,
             'customer': sale.party.id,
-            'delivery_address': sale.packing_address.id,
+            'delivery_address': sale.shipment_address.id,
             'reference': sale.reference,
             'warehouse': sale.warehouse.id,
         }, context=ctx)
 
         for line_id in moves:
             vals = moves[line_id]
-            vals['packing_out'] = packing_id
+            vals['shipment_out'] = shipment_id
             move_id = move_obj.create(cursor, 0, vals, context=ctx)
             sale_line_obj.write(cursor, user, line_id, {
                 'moves': [('add', move_id)],
                 }, context=context)
-        packing_obj.workflow_trigger_validate(cursor, 0, packing_id,
+        shipment_obj.workflow_trigger_validate(cursor, 0, shipment_id,
                 'waiting', context=ctx)
-        return packing_id
+        return shipment_id
 
 Sale()
 
@@ -915,8 +958,8 @@ class SaleLine(ModelSQL, ModelView):
                 'required': "product",
                 'invisible': "type != 'line'",
                 'readonly': "not globals().get('_parent_sale')",
-            }, domain="[('category', '=', " \
-                    "(product, 'product.default_uom.category'))]",
+            }, domain=["('category', '=', " \
+                    "(product, 'product.default_uom.category'))"],
             context="{'category': (product, 'product.default_uom.category')}",
             on_change=['product', 'quantity', 'unit', '_parent_sale.currency',
                 '_parent_sale.party'])
@@ -1069,6 +1112,21 @@ class SaleLine(ModelSQL, ModelView):
         res = {}
         return res
 
+    def _get_context_sale_price(self, cursor, user, product, vals,
+            context=None):
+        if context is None:
+            context = {}
+        ctx2 = context.copy()
+        if vals.get('_parent_sale.currency'):
+            ctx2['currency'] = vals['_parent_sale.currency']
+        if vals.get('_parent_sale.party'):
+            ctx2['customer'] = vals['_parent_sale.party']
+        if vals.get('unit'):
+            ctx2['uom'] = vals['unit']
+        else:
+            ctx2['uom'] = product.sale_uom.id
+        return ctx2
+
     def on_change_product(self, cursor, user, ids, vals, context=None):
         party_obj = self.pool.get('party.party')
         product_obj = self.pool.get('product.product')
@@ -1092,15 +1150,8 @@ class SaleLine(ModelSQL, ModelView):
         product = product_obj.browse(cursor, user, vals['product'],
                 context=context)
 
-        ctx2 = context.copy()
-        if vals.get('_parent_sale.currency'):
-            ctx2['currency'] = vals['_parent_sale.currency']
-        if vals.get('_parent_sale.party'):
-            ctx2['customer'] = vals['_parent_sale.party']
-        if vals.get('unit'):
-            ctx2['uom'] = vals['unit']
-        else:
-            ctx2['uom'] = product.sale_uom.id
+        ctx2 = self._get_context_sale_price(cursor, user, product, vals,
+                context=context)
         res['unit_price'] = product_obj.get_sale_price(cursor, user,
                 [product.id], vals.get('quantity', 0), context=ctx2)[product.id]
         res['taxes'] = []
@@ -1152,13 +1203,8 @@ class SaleLine(ModelSQL, ModelView):
         product = product_obj.browse(cursor, user, vals['product'],
                 context=context)
 
-        ctx2 = context.copy()
-        if vals.get('_parent_sale.currency'):
-            ctx2['currency'] = vals['_parent_sale.currency']
-        if vals.get('_parent_sale.party'):
-            ctx2['customer'] = vals['_parent_sale.party']
-        if vals.get('unit'):
-            ctx2['uom'] = vals['unit']
+        ctx2 = self._get_context_sale_price(cursor, user, product, vals,
+                context=context)
         res['unit_price'] = product_obj.get_sale_price(cursor, user,
                 [vals['product']], vals.get('quantity', 0),
                 context=ctx2)[vals['product']]
@@ -1393,10 +1439,34 @@ class Template(ModelSQL, ModelView):
         'readonly': "active == False",
         'invisible': "not salable",
         'required': "salable",
-        }, domain="[('category', '=', " \
-                "(default_uom, 'uom.category'))]",
+        }, domain=["('category', '=', (default_uom, 'uom.category'))"],
         context="{'category': (default_uom, 'uom.category')}",
-        on_change_with=['default_uom', 'sale_uom'])
+        on_change_with=['default_uom', 'sale_uom', 'salable'])
+
+    def __init__(self):
+        super(Template, self).__init__()
+        if 'not bool(account_category) and bool(salable)' not in \
+                self.account_revenue.states.get('required', ''):
+            self.account_revenue = copy.copy(self.account_revenue)
+            self.account_revenue.states = copy.copy(self.account_revenue.states)
+            if not self.account_revenue.states.get('required'):
+                self.account_revenue.states['required'] = \
+                        "not bool(account_category) and bool(salable)"
+            else:
+                self.account_revenue.states['required'] = '(' + \
+                        self.account_revenue.states['required'] + ') ' \
+                        'or (not bool(account_category) and bool(salable))'
+        if 'account_category' not in self.account_revenue.depends:
+            self.account_revenue = copy.copy(self.account_revenue)
+            self.account_revenue.depends = \
+                    copy.copy(self.account_revenue.depends)
+            self.account_revenue.depends.append('account_category')
+        if 'salable' not in self.account_revenue.depends:
+            self.account_revenue = copy.copy(self.account_revenue)
+            self.account_revenue.depends = \
+                    copy.copy(self.account_revenue.depends)
+            self.account_revenue.depends.append('salable')
+        self._reset_columns()
 
     def default_salable(self, cursor, user, context=None):
         if context is None:
@@ -1484,11 +1554,11 @@ class Product(ModelSQL, ModelView):
 Product()
 
 
-class PackingOut(ModelSQL, ModelView):
-    _name = 'stock.packing.out'
+class ShipmentOut(ModelSQL, ModelView):
+    _name = 'stock.shipment.out'
 
     def __init__(self):
-        super(PackingOut, self).__init__()
+        super(ShipmentOut, self).__init__()
         self._error_messages.update({
                 'reset_move': 'You cannot reset to draft a move generated '\
                     'by a sale.',
@@ -1498,7 +1568,7 @@ class PackingOut(ModelSQL, ModelView):
         sale_obj = self.pool.get('sale.sale')
         sale_line_obj = self.pool.get('sale.line')
 
-        res = super(PackingOut, self).write(cursor, user, ids, vals,
+        res = super(ShipmentOut, self).write(cursor, user, ids, vals,
                 context=context)
 
         if 'state' in vals and vals['state'] in ('done', 'cancel'):
@@ -1506,8 +1576,8 @@ class PackingOut(ModelSQL, ModelView):
             move_ids = []
             if isinstance(ids, (int, long)):
                 ids = [ids]
-            for packing in self.browse(cursor, user, ids, context=context):
-                move_ids.extend([x.id for x in packing.outgoing_moves])
+            for shipment in self.browse(cursor, user, ids, context=context):
+                move_ids.extend([x.id for x in shipment.outgoing_moves])
 
             sale_line_ids = sale_line_obj.search(cursor, user, [
                 ('moves', 'in', move_ids),
@@ -1519,19 +1589,19 @@ class PackingOut(ModelSQL, ModelView):
                         sale_ids.append(sale_line.sale.id)
 
             sale_obj.workflow_trigger_validate(cursor, user, sale_ids,
-                    'packing_update', context=context)
+                    'shipment_update', context=context)
         return res
 
     def button_draft(self, cursor, user, ids, context=None):
-        for packing in self.browse(cursor, user, ids, context=context):
-            for move in packing.outgoing_moves:
+        for shipment in self.browse(cursor, user, ids, context=context):
+            for move in shipment.outgoing_moves:
                 if move.state == 'cancel' and move.sale_line:
                     self.raise_user_error(cursor, 'reset_move')
 
-        return super(PackingOut, self).button_draft(
+        return super(ShipmentOut, self).button_draft(
             cursor, user, ids, context=context)
 
-PackingOut()
+ShipmentOut()
 
 
 class Move(ModelSQL, ModelView):
@@ -1601,7 +1671,7 @@ class Move(ModelSQL, ModelView):
                     sale_ids.add(sale_line.sale.id)
             if sale_ids:
                 sale_obj.workflow_trigger_validate(cursor, user, list(sale_ids),
-                        'packing_update', context=context)
+                        'shipment_update', context=context)
         return res
 
     def delete(self, cursor, user, ids, context=None):
@@ -1624,7 +1694,7 @@ class Move(ModelSQL, ModelView):
                 sale_ids.add(sale_line.sale.id)
             if sale_ids:
                 sale_obj.workflow_trigger_validate(cursor, user, list(sale_ids),
-                        'packing_update', context=context)
+                        'shipment_update', context=context)
         return res
 
 Move()
@@ -1687,9 +1757,9 @@ class Invoice(ModelSQL, ModelView):
         if isinstance(ids, (int, long)):
             ids = [ids]
         cursor.execute('SELECT id FROM sale_invoices_rel ' \
-                'WHERE invoice IN (' + ','.join(['%s' for x in ids]) + ')',
+                'WHERE invoice IN (' + ','.join(('%s',) * len(ids)) + ')',
                 ids)
-        if cursor.rowcount:
+        if cursor.fetchone():
             self.raise_user_error(cursor, 'delete_sale_invoice',
                     context=context)
         return super(Invoice, self).delete(cursor, user, ids,
@@ -1745,17 +1815,25 @@ class OpenCustomer(Wizard):
 OpenCustomer()
 
 
-class HandlePackingExceptionAsk(ModelView):
+class HandleShipmentExceptionAsk(ModelView):
     'Shipment Exception Ask'
-    _name = 'sale.handle.packing.exception.ask'
+    _name = 'sale.handle.shipment.exception.ask'
     _description = __doc__
 
     recreate_moves = fields.Many2Many(
         'stock.move', None, None, 'Recreate Moves',
-        domain="[('id', 'in', domain_moves)]", depends=['domain_moves'])
+        domain=["('id', 'in', domain_moves)"], depends=['domain_moves'])
     domain_moves = fields.Many2Many(
         'stock.move', None, None, 'Domain Moves')
 
+    def init(self, cursor, module_name):
+        # 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,))
+        super(HandleShipmentExceptionAsk, self).init(cursor, module_name)
+
     def default_recreate_moves(self, cursor, user, context=None):
         return self.default_domain_moves(cursor, user, context=context)
 
@@ -1780,17 +1858,17 @@ class HandlePackingExceptionAsk(ModelView):
 
         return domain_moves
 
-HandlePackingExceptionAsk()
+HandleShipmentExceptionAsk()
 
-class HandlePackingException(Wizard):
+class HandleShipmentException(Wizard):
     'Handle Shipment Exception'
-    _name = 'sale.handle.packing.exception'
+    _name = 'sale.handle.shipment.exception'
     states = {
         'init': {
             'actions': [],
             'result': {
                 'type': 'form',
-                'object': 'sale.handle.packing.exception.ask',
+                'object': 'sale.handle.shipment.exception.ask',
                 'state': [
                     ('end', 'Cancel', 'tryton-cancel'),
                     ('ok', 'Ok', 'tryton-ok', True),
@@ -1810,7 +1888,7 @@ class HandlePackingException(Wizard):
         sale_obj = self.pool.get('sale.sale')
         sale_line_obj = self.pool.get('sale.line')
         move_obj = self.pool.get('stock.move')
-        packing_obj = self.pool.get('stock.packing.out')
+        shipment_obj = self.pool.get('stock.shipment.out')
         to_recreate = data['form']['recreate_moves'][0][1]
         domain_moves = data['form']['domain_moves'][0][1]
 
@@ -1836,9 +1914,9 @@ class HandlePackingException(Wizard):
                 context=context)
 
         sale_obj.workflow_trigger_validate(cursor, user, data['id'],
-                'packing_ok', context=context)
+                'shipment_ok', context=context)
 
-HandlePackingException()
+HandleShipmentException()
 
 
 class HandleInvoiceExceptionAsk(ModelView):
@@ -1848,7 +1926,7 @@ class HandleInvoiceExceptionAsk(ModelView):
 
     recreate_invoices = fields.Many2Many(
         'account.invoice', None, None, 'Recreate Invoices',
-        domain="[('id', 'in', domain_invoices)]", depends=['domain_invoices'],
+        domain=["('id', 'in', domain_invoices)"], depends=['domain_invoices'],
         help='The selected invoices will be recreated. '\
             'The other ones will be ignored.')
     domain_invoices = fields.Many2Many(
diff --git a/sale.xml b/sale.xml
index d277bab..6c035ec 100644
--- a/sale.xml
+++ b/sale.xml
@@ -11,9 +11,9 @@ this repository contains the full copyright notices and license terms. -->
             <field name="groups" eval="[('add', ref('group_sale'))]"/>
         </record>
 
-        <record model="ir.action.wizard" id="wizard_packing_handle_exception">
+        <record model="ir.action.wizard" id="wizard_shipment_handle_exception">
             <field name="name">Handle Shipment Exception</field>
-            <field name="wiz_name">sale.handle.packing.exception</field>
+            <field name="wiz_name">sale.handle.shipment.exception</field>
             <field name="model">sale.sale</field>
         </record>
 
@@ -33,8 +33,8 @@ this repository contains the full copyright notices and license terms. -->
                     <field name="party"/>
                     <label name="invoice_address"/>
                     <field name="invoice_address"/>
-                    <label name="packing_address"/>
-                    <field name="packing_address"/>
+                    <label name="shipment_address"/>
+                    <field name="shipment_address"/>
                     <label name="description"/>
                     <field name="description" colspan="3"/>
                     <label name="reference"/>
@@ -66,8 +66,8 @@ this repository contains the full copyright notices and license terms. -->
                             <group col="2" colspan="2" id="states">
                                 <label name="invoice_state"/>
                                 <field name="invoice_state"/>
-                                <label name="packing_state"/>
-                                <field name="packing_state"/>
+                                <label name="shipment_state"/>
+                                <field name="shipment_state"/>
                             </group>
                             <group col="2" colspan="2" id="amount_state_buttons">
                                 <label name="untaxed_amount"/>
@@ -80,7 +80,7 @@ this repository contains the full copyright notices and license terms. -->
                                 <field name="state"/>
                                 <group col="6" colspan="2" id="buttons">
                                     <button name="cancel" string="Cancel"
-                                        states="{'invisible': '''not ((state in ('draft', 'quotation')) or (invoice_state == 'exception') or (packing_state == 'exception')) ''', 'readonly': '''%(group_sale)d not in groups'''}"
+                                        states="{'invisible': '''state == 'cancel' or not ((state in ('draft', 'quotation')) or (invoice_state == 'exception') or (shipment_state == 'exception'))''', 'readonly': '''%(group_sale)d not in groups'''}"
                                         icon="tryton-cancel"/>
                                     <button name="draft" string="Draft"
                                         states="{'invisible': '''state != 'quotation' ''', 'readonly': '''%(group_sale)d not in groups'''}"
@@ -93,10 +93,10 @@ this repository contains the full copyright notices and license terms. -->
                                             type="action"
                                             states="{'invisible': '''invoice_state != 'exception' or state == 'cancel' ''', 'readonly': '''%(group_sale)d not in groups'''}"
                                             icon="tryton-go-next"/>
-                                    <button name="%(wizard_packing_handle_exception)d"
+                                    <button name="%(wizard_shipment_handle_exception)d"
                                             type="action"
                                             string="Handle Shipment Exception"
-                                            states="{'invisible': '''packing_state != 'exception' or state == 'cancel' ''', 'readonly': '''%(group_sale)d not in groups'''}"
+                                            states="{'invisible': '''shipment_state != 'exception' or state == 'cancel' ''', 'readonly': '''%(group_sale)d not in groups'''}"
                                             icon="tryton-go-next"/>
                                     <button name="confirm" string="Confirm"
                                         states="{'invisible': '''state != 'quotation' ''', 'readonly': '''%(group_sale)d not in groups'''}"
@@ -110,8 +110,8 @@ this repository contains the full copyright notices and license terms. -->
                             <newline/>
                             <label name="invoice_method"/>
                             <field name="invoice_method"/>
-                            <label name="packing_method"/>
-                            <field name="packing_method"/>
+                            <label name="shipment_method"/>
+                            <field name="shipment_method"/>
                             <separator name="comment" colspan="4"/>
                             <field name="comment" colspan="4" spell="party_lang"/>
                         </page>
@@ -135,7 +135,7 @@ this repository contains the full copyright notices and license terms. -->
                               </tree>
                             </field>
                         </page>
-                        <page string="Shipments" id="packings">
+                        <page string="Shipments" id="shipments">
                             <separator name="moves" colspan="4"/>
                             <field name="moves" colspan="4">
                                 <tree string="Moves">
@@ -149,8 +149,8 @@ this repository contains the full copyright notices and license terms. -->
                                     <field name="unit_digits" tree_invisible="1"/>
                                 </tree>
                             </field>
-                            <separator name="packings" colspan="4"/>
-                            <field name="packings" colspan="4"/>
+                            <separator name="shipments" colspan="4"/>
+                            <field name="shipments" colspan="4"/>
                         </page>
                     </notebook>
                     <field name="currency_digits" invisible="1" colspan="6"/>
@@ -174,7 +174,7 @@ this repository contains the full copyright notices and license terms. -->
                     <field name="total_amount" select="2"/>
                     <field name="state" select="2"/>
                     <field name="invoice_state" select="2"/>
-                    <field name="packing_state" select="2"/>
+                    <field name="shipment_state" select="2"/>
                     <field name="description" select="2"/>
                     <field name="currency_digits" tree_invisible="1"/>
                 </tree>
@@ -182,12 +182,12 @@ this repository contains the full copyright notices and license terms. -->
             </field>
         </record>
 
-        <record model="ir.ui.view" id="handle_packing_exception_view_form">
-            <field name="model">sale.handle.packing.exception.ask</field>
+        <record model="ir.ui.view" id="handle_shipment_exception_view_form">
+            <field name="model">sale.handle.shipment.exception.ask</field>
             <field name="type">form</field>
             <field name="arch" type="xml">
                 <![CDATA[
-                <form string="Handle packing Exception" col="1">
+                <form string="Handle shipment Exception" col="1">
                         <separator string="Choose move to recreate"
                                    id="choose"/>
                         <field name="recreate_moves">
@@ -217,17 +217,17 @@ this repository contains the full copyright notices and license terms. -->
             </field>
         </record>
 
-        <record model="ir.action.act_window" id="act_packing_form">
+        <record model="ir.action.act_window" id="act_shipment_form">
             <field name="name">Shipments</field>
-            <field name="res_model">stock.packing.out</field>
+            <field name="res_model">stock.shipment.out</field>
             <field name="view_type">form</field>
-            <field name="domain">[("id", "in", packings)]</field>
+            <field name="domain">[("id", "in", shipments)]</field>
         </record>
         <record model="ir.action.keyword"
-                id="act_open_packing_keyword1">
+                id="act_open_shipment_keyword1">
             <field name="keyword">form_relate</field>
             <field name="model">sale.sale,0</field>
-            <field name="action" ref="act_packing_form"/>
+            <field name="action" ref="act_shipment_form"/>
         </record>
         <record model="ir.action.act_window" id="act_invoice_form">
             <field name="name">Invoices</field>
@@ -362,7 +362,7 @@ this repository contains the full copyright notices and license terms. -->
 
         <record model="workflow" id="sale_workflow">
             <field name="name">Sale workflow</field>
-            <field name="osv">sale.sale</field>
+            <field name="model">sale.sale</field>
             <field name="on_create" eval="True"/>
         </record>
         <record model="workflow.activity" id="sale_activity_draft">
@@ -408,36 +408,36 @@ this repository contains the full copyright notices and license terms. -->
             <field name="kind">function</field>
             <field name="action">write({'invoice_state': 'paid'})</field>
         </record>
-        <record model="workflow.activity" id="sale_activity_packing_invoice_method">
+        <record model="workflow.activity" id="sale_activity_shipment_invoice_method">
             <field name="name">Shipment Invoice Method</field>
             <field name="workflow" ref="sale_workflow"/>
             <field name="split_mode">OR</field>
         </record>
-        <record model="workflow.activity" id="sale_activity_packing_invoice">
+        <record model="workflow.activity" id="sale_activity_shipment_invoice">
             <field name="name">Shipment Invoice</field>
             <field name="workflow" ref="sale_workflow"/>
             <field name="kind">function</field>
-            <field name="action">create_packing()</field>
+            <field name="action">create_shipment()</field>
         </record>
-        <record model="workflow.activity" id="sale_activity_waiting_packing_invoice">
+        <record model="workflow.activity" id="sale_activity_waiting_shipment_invoice">
             <field name="name">Waiting Shipment Invoice</field>
             <field name="workflow" ref="sale_workflow"/>
             <field name="kind">function</field>
-            <field name="action">write({'packing_state': 'waiting'})
create_packing()</field>
+            <field name="action">write({'shipment_state': 'waiting'})
create_shipment()</field>
         </record>
-        <record model="workflow.activity" id="sale_activity_packing_invoice_exception">
+        <record model="workflow.activity" id="sale_activity_shipment_invoice_exception">
             <field name="name">Shipment Invoice Exception</field>
             <field name="workflow" ref="sale_workflow"/>
             <field name="kind">function</field>
-            <field name="action">write({'packing_state': 'exception'})</field>
+            <field name="action">write({'shipment_state': 'exception'})</field>
         </record>
-        <record model="workflow.activity" id="sale_activity_packing_invoice_done">
+        <record model="workflow.activity" id="sale_activity_shipment_invoice_done">
             <field name="name">Shipment Invoice Done</field>
             <field name="workflow" ref="sale_workflow"/>
             <field name="kind">function</field>
-            <field name="action">write({'packing_state': 'sent'})</field>
+            <field name="action">write({'shipment_state': 'sent'})</field>
         </record>
-        <record model="workflow.activity" id="sale_activity_packing_invoice_method_done">
+        <record model="workflow.activity" id="sale_activity_shipment_invoice_method_done">
             <field name="name">Shipment Invoice Method Done</field>
             <field name="workflow" ref="sale_workflow"/>
         </record>
@@ -445,64 +445,64 @@ this repository contains the full copyright notices and license terms. -->
             <field name="name">Invoice Method Done</field>
             <field name="workflow" ref="sale_workflow"/>
         </record>
-        <record model="workflow.activity" id="sale_activity_packing_method">
+        <record model="workflow.activity" id="sale_activity_shipment_method">
             <field name="name">Shipment Method</field>
             <field name="workflow" ref="sale_workflow"/>
         </record>
-        <record model="workflow.activity" id="sale_activity_packing">
+        <record model="workflow.activity" id="sale_activity_shipment">
             <field name="name">Shipment</field>
             <field name="workflow" ref="sale_workflow"/>
             <field name="kind">function</field>
-            <field name="action">create_packing()</field>
+            <field name="action">create_shipment()</field>
         </record>
-        <record model="workflow.activity" id="sale_activity_waiting_packing">
+        <record model="workflow.activity" id="sale_activity_waiting_shipment">
             <field name="name">Waiting Shipment</field>
             <field name="workflow" ref="sale_workflow"/>
             <field name="kind">function</field>
-            <field name="action">write({'packing_state': 'waiting'})
create_packing()</field>
+            <field name="action">write({'shipment_state': 'waiting'})
create_shipment()</field>
         </record>
-        <record model="workflow.activity" id="sale_activity_packing_exception">
+        <record model="workflow.activity" id="sale_activity_shipment_exception">
             <field name="name">Shipment Exception</field>
             <field name="workflow" ref="sale_workflow"/>
             <field name="kind">function</field>
-            <field name="action">write({'packing_state': 'exception'})</field>
+            <field name="action">write({'shipment_state': 'exception'})</field>
         </record>
-        <record model="workflow.activity" id="sale_activity_invoice_packing_method">
+        <record model="workflow.activity" id="sale_activity_invoice_shipment_method">
             <field name="name">Invoice Shipment Method</field>
             <field name="workflow" ref="sale_workflow"/>
             <field name="split_mode">OR</field>
         </record>
-        <record model="workflow.activity" id="sale_activity_invoice_packing">
+        <record model="workflow.activity" id="sale_activity_invoice_shipment">
             <field name="name">Invoice Shipment</field>
             <field name="workflow" ref="sale_workflow"/>
             <field name="kind">function</field>
             <field name="action">create_invoice()
write({'invoice_state': 'waiting'})</field>
         </record>
-        <record model="workflow.activity" id="sale_activity_waiting_invoice_packing">
+        <record model="workflow.activity" id="sale_activity_waiting_invoice_shipment">
             <field name="name">Waiting Invoice Shipment</field>
             <field name="workflow" ref="sale_workflow"/>
             <field name="kind">function</field>
-            <field name="action">write({'invoice_state': 'waiting', 'packing_state': 'sent'})</field>
+            <field name="action">write({'invoice_state': 'waiting', 'shipment_state': 'sent'})</field>
         </record>
-        <record model="workflow.activity" id="sale_activity_invoice_packing_exception">
+        <record model="workflow.activity" id="sale_activity_invoice_shipment_exception">
             <field name="name">Invoice Shipment Exception</field>
             <field name="workflow" ref="sale_workflow"/>
             <field name="kind">function</field>
             <field name="action">write({'invoice_state': 'exception'})</field>
         </record>
-        <record model="workflow.activity" id="sale_activity_invoice_packing_done">
+        <record model="workflow.activity" id="sale_activity_invoice_shipment_done">
             <field name="name">Invoice Shipment Done</field>
             <field name="workflow" ref="sale_workflow"/>
             <field name="kind">function</field>
             <field name="action">write({'invoice_state': 'paid'})</field>
         </record>
-        <record model="workflow.activity" id="sale_activity_invoice_packing_method_done">
+        <record model="workflow.activity" id="sale_activity_invoice_shipment_method_done">
             <field name="name">Invoice Shipment Method Done</field>
             <field name="workflow" ref="sale_workflow"/>
             <field name="kind">function</field>
-            <field name="action">write({'packing_state': 'sent'})</field>
+            <field name="action">write({'shipment_state': 'sent'})</field>
         </record>
-        <record model="workflow.activity" id="sale_activity_packing_method_done">
+        <record model="workflow.activity" id="sale_activity_shipment_method_done">
             <field name="name">Shipment Method Done</field>
             <field name="workflow" ref="sale_workflow"/>
         </record>
@@ -571,7 +571,7 @@ this repository contains the full copyright notices and license terms. -->
         <record model="workflow.transition" id="sale_transition_waiting_invoice_sale_invoice_sale_exception">
             <field name="act_from" ref="sale_activity_waiting_invoice_sale"/>
             <field name="act_to" ref="sale_activity_invoice_sale_exception"/>
-            <field name="trigger_model">accont.invoice</field>
+            <field name="trigger_model">account.invoice</field>
             <field name="trigger_expr_id">[x.id for x in invoices]</field>
             <field name="condition">invoice_exception</field>
         </record>
@@ -596,168 +596,168 @@ this repository contains the full copyright notices and license terms. -->
         </record>
         <record model="workflow.transition" id="sale_transition_invoice_sale_done">
             <field name="act_from" ref="sale_activity_invoice_sale_done"/>
-            <field name="act_to" ref="sale_activity_packing_invoice_method"/>
-        </record>
-        <record model="workflow.transition" id="sale_transition_packing_invoice_method_packing_invoice_method_done">
-            <field name="act_from" ref="sale_activity_packing_invoice_method"/>
-            <field name="act_to" ref="sale_activity_packing_invoice_method_done"/>
-            <field name="condition">packing_method != 'invoice'</field>
-        </record>
-        <record model="workflow.transition" id="sale_transition_packing_invoice_method_packing_invoice">
-            <field name="act_from" ref="sale_activity_packing_invoice_method"/>
-            <field name="act_to" ref="sale_activity_packing_invoice"/>
-            <field name="condition">packing_method == 'invoice'</field>
-        </record>
-        <record model="workflow.transition" id="sale_transition_packing_invoice_waiting_packing_invoice">
-            <field name="act_from" ref="sale_activity_packing_invoice"/>
-            <field name="act_to" ref="sale_activity_waiting_packing_invoice"/>
-        </record>
-        <record model="workflow.transition" id="sale_transition_packing_invoice_packing_invoice_exception">
-            <field name="act_from" ref="sale_activity_waiting_packing_invoice"/>
-            <field name="act_to" ref="sale_activity_packing_invoice_exception"/>
-            <field name="trigger_model">stock.packing.out</field>
-            <field name="trigger_expr_id">[x.id for x in packings]</field>
-            <field name="condition">packing_exception</field>
-        </record>
-        <record model="workflow.transition" id="sale_transition_packing_invoice_exception_cancel">
-            <field name="act_from" ref="sale_activity_packing_invoice_exception"/>
+            <field name="act_to" ref="sale_activity_shipment_invoice_method"/>
+        </record>
+        <record model="workflow.transition" id="sale_transition_shipment_invoice_method_shipment_invoice_method_done">
+            <field name="act_from" ref="sale_activity_shipment_invoice_method"/>
+            <field name="act_to" ref="sale_activity_shipment_invoice_method_done"/>
+            <field name="condition">shipment_method != 'invoice'</field>
+        </record>
+        <record model="workflow.transition" id="sale_transition_shipment_invoice_method_shipment_invoice">
+            <field name="act_from" ref="sale_activity_shipment_invoice_method"/>
+            <field name="act_to" ref="sale_activity_shipment_invoice"/>
+            <field name="condition">shipment_method == 'invoice'</field>
+        </record>
+        <record model="workflow.transition" id="sale_transition_shipment_invoice_waiting_shipment_invoice">
+            <field name="act_from" ref="sale_activity_shipment_invoice"/>
+            <field name="act_to" ref="sale_activity_waiting_shipment_invoice"/>
+        </record>
+        <record model="workflow.transition" id="sale_transition_shipment_invoice_shipment_invoice_exception">
+            <field name="act_from" ref="sale_activity_waiting_shipment_invoice"/>
+            <field name="act_to" ref="sale_activity_shipment_invoice_exception"/>
+            <field name="trigger_model">stock.shipment.out</field>
+            <field name="trigger_expr_id">[x.id for x in shipments]</field>
+            <field name="condition">shipment_exception</field>
+        </record>
+        <record model="workflow.transition" id="sale_transition_shipment_invoice_exception_cancel">
+            <field name="act_from" ref="sale_activity_shipment_invoice_exception"/>
             <field name="act_to" ref="sale_activity_cancel"/>
             <field name="signal">cancel</field>
             <field name="group" ref="group_sale"/>
         </record>
-        <record model="workflow.transition" id="sale_transition_packing_invoice_exception_waiting_packing_invoice">
-            <field name="act_from" ref="sale_activity_packing_invoice_exception"/>
-            <field name="act_to" ref="sale_activity_waiting_packing_invoice"/>
-            <field name="signal">packing_ok</field>
+        <record model="workflow.transition" id="sale_transition_shipment_invoice_exception_waiting_shipment_invoice">
+            <field name="act_from" ref="sale_activity_shipment_invoice_exception"/>
+            <field name="act_to" ref="sale_activity_waiting_shipment_invoice"/>
+            <field name="signal">shipment_ok</field>
             <field name="group" ref="group_sale"/>
         </record>
-        <record model="workflow.transition" id="sale_transition_packing_waiting_packing_invoice_packing_invoice_done">
-            <field name="act_from" ref="sale_activity_waiting_packing_invoice"/>
-            <field name="act_to" ref="sale_activity_packing_invoice_done"/>
-            <field name="trigger_model">stock.packing.out</field>
-            <field name="trigger_expr_id">[x.id for x in packings]</field>
-            <field name="condition">packing_done</field>
+        <record model="workflow.transition" id="sale_transition_shipment_waiting_shipment_invoice_shipment_invoice_done">
+            <field name="act_from" ref="sale_activity_waiting_shipment_invoice"/>
+            <field name="act_to" ref="sale_activity_shipment_invoice_done"/>
+            <field name="trigger_model">stock.shipment.out</field>
+            <field name="trigger_expr_id">[x.id for x in shipments]</field>
+            <field name="condition">shipment_done</field>
         </record>
-        <record model="workflow.transition" id="sale_transition_packing_invoice_done_packing_invoice_method_done">
-            <field name="act_from" ref="sale_activity_packing_invoice_done"/>
-            <field name="act_to" ref="sale_activity_packing_invoice_method_done"/>
+        <record model="workflow.transition" id="sale_transition_shipment_invoice_done_shipment_invoice_method_done">
+            <field name="act_from" ref="sale_activity_shipment_invoice_done"/>
+            <field name="act_to" ref="sale_activity_shipment_invoice_method_done"/>
         </record>
-        <record model="workflow.transition" id="sale_transition_packing_invoice_method_done_invoice_method_done">
-            <field name="act_from" ref="sale_activity_packing_invoice_method_done"/>
+        <record model="workflow.transition" id="sale_transition_shipment_invoice_method_done_invoice_method_done">
+            <field name="act_from" ref="sale_activity_shipment_invoice_method_done"/>
             <field name="act_to" ref="sale_activity_invoice_method_done"/>
         </record>
         <record model="workflow.transition" id="sale_transition_invoice_method_done_done">
             <field name="act_from" ref="sale_activity_invoice_method_done"/>
             <field name="act_to" ref="sale_activity_done"/>
         </record>
-        <record model="workflow.transition" id="sale_transition_confirmed_packing_method">
+        <record model="workflow.transition" id="sale_transition_confirmed_shipment_method">
             <field name="act_from" ref="sale_activity_confirmed"/>
-            <field name="act_to" ref="sale_activity_packing_method"/>
-        </record>
-        <record model="workflow.transition" id="sale_transition_packing_method_packing_method_done">
-            <field name="act_from" ref="sale_activity_packing_method"/>
-            <field name="act_to" ref="sale_activity_packing_method_done"/>
-            <field name="condition">packing_method != 'order'</field>
-        </record>
-        <record model="workflow.transition" id="sale_transition_packing_method_packing">
-            <field name="act_from" ref="sale_activity_packing_method"/>
-            <field name="act_to" ref="sale_activity_packing"/>
-            <field name="condition">packing_method == 'order'</field>
-        </record>
-        <record model="workflow.transition" id="sale_transition_packing_waiting_packing">
-            <field name="act_from" ref="sale_activity_packing"/>
-            <field name="act_to" ref="sale_activity_waiting_packing"/>
-        </record>
-        <record model="workflow.transition" id="sale_transition_waiting_packing_packing_exception">
-            <field name="act_from" ref="sale_activity_waiting_packing"/>
-            <field name="act_to" ref="sale_activity_packing_exception"/>
-            <field name="signal">packing_update</field>
-            <field name="condition">packing_exception</field>
-        </record>
-        <record model="workflow.transition" id="sale_transition_packing_exception_cancel">
-            <field name="act_from" ref="sale_activity_packing_exception"/>
+            <field name="act_to" ref="sale_activity_shipment_method"/>
+        </record>
+        <record model="workflow.transition" id="sale_transition_shipment_method_shipment_method_done">
+            <field name="act_from" ref="sale_activity_shipment_method"/>
+            <field name="act_to" ref="sale_activity_shipment_method_done"/>
+            <field name="condition">shipment_method != 'order'</field>
+        </record>
+        <record model="workflow.transition" id="sale_transition_shipment_method_shipment">
+            <field name="act_from" ref="sale_activity_shipment_method"/>
+            <field name="act_to" ref="sale_activity_shipment"/>
+            <field name="condition">shipment_method == 'order'</field>
+        </record>
+        <record model="workflow.transition" id="sale_transition_shipment_waiting_shipment">
+            <field name="act_from" ref="sale_activity_shipment"/>
+            <field name="act_to" ref="sale_activity_waiting_shipment"/>
+        </record>
+        <record model="workflow.transition" id="sale_transition_waiting_shipment_shipment_exception">
+            <field name="act_from" ref="sale_activity_waiting_shipment"/>
+            <field name="act_to" ref="sale_activity_shipment_exception"/>
+            <field name="signal">shipment_update</field>
+            <field name="condition">shipment_exception</field>
+        </record>
+        <record model="workflow.transition" id="sale_transition_shipment_exception_cancel">
+            <field name="act_from" ref="sale_activity_shipment_exception"/>
             <field name="act_to" ref="sale_activity_cancel"/>
             <field name="signal">cancel</field>
             <field name="group" ref="group_sale"/>
         </record>
-        <record model="workflow.transition" id="sale_transition_packing_exception_waiting_packing">
-            <field name="act_from" ref="sale_activity_packing_exception"/>
-            <field name="act_to" ref="sale_activity_waiting_packing"/>
-            <field name="signal">packing_ok</field>
+        <record model="workflow.transition" id="sale_transition_shipment_exception_waiting_shipment">
+            <field name="act_from" ref="sale_activity_shipment_exception"/>
+            <field name="act_to" ref="sale_activity_waiting_shipment"/>
+            <field name="signal">shipment_ok</field>
             <field name="group" ref="group_sale"/>
         </record>
-        <record model="workflow.transition" id="sale_transition_waiting_packing_invoice_packing_method">
-            <field name="act_from" ref="sale_activity_waiting_packing"/>
-            <field name="act_to" ref="sale_activity_invoice_packing_method"/>
-            <field name="signal">packing_update</field>
-            <field name="condition">not packing_exception</field>
-        </record>
-        <record model="workflow.transition" id="sale_transition_waiting_packing_invoice_packing_method2">
-            <field name="act_from" ref="sale_activity_waiting_packing"/>
-            <field name="act_to" ref="sale_activity_invoice_packing_method"/>
-            <field name="condition">packing_done</field>
-        </record>
-        <record model="workflow.transition" id="sale_transition_invoice_packing_method_invoice_packing">
-            <field name="act_from" ref="sale_activity_invoice_packing_method"/>
-            <field name="act_to" ref="sale_activity_invoice_packing"/>
-            <field name="condition">invoice_method == 'packing'</field>
-        </record>
-        <record model="workflow.transition" id="sale_transition_invoice_packing_method_invoice_packing_method_done">
-            <field name="act_from" ref="sale_activity_invoice_packing_method"/>
-            <field name="act_to" ref="sale_activity_invoice_packing_method_done"/>
-            <field name="condition">invoice_method != 'packing' and packing_done</field>
-        </record>
-        <record model="workflow.transition" id="sale_transition_invoice_packing_method_waiting_packing">
-            <field name="act_from" ref="sale_activity_invoice_packing_method"/>
-            <field name="act_to" ref="sale_activity_waiting_packing"/>
-            <field name="condition">invoice_method != 'packing' and not packing_done</field>
-        </record>
-        <record model="workflow.transition" id="sale_transition_invoice_packing_waiting_packing">
-            <field name="act_from" ref="sale_activity_invoice_packing"/>
-            <field name="act_to" ref="sale_activity_waiting_packing"/>
-            <field name="condition">not packing_done</field>
-        </record>
-        <record model="workflow.transition" id="sale_transition_invoice_packing_waiting_invoice_packing">
-            <field name="act_from" ref="sale_activity_invoice_packing"/>
-            <field name="act_to" ref="sale_activity_waiting_invoice_packing"/>
-            <field name="condition">packing_done</field>
-        </record>
-        <record model="workflow.transition" id="sale_transition_waiting_invoice_packing_invoice_packing_exception">
-            <field name="act_from" ref="sale_activity_waiting_invoice_packing"/>
-            <field name="act_to" ref="sale_activity_invoice_packing_exception"/>
+        <record model="workflow.transition" id="sale_transition_waiting_shipment_invoice_shipment_method">
+            <field name="act_from" ref="sale_activity_waiting_shipment"/>
+            <field name="act_to" ref="sale_activity_invoice_shipment_method"/>
+            <field name="signal">shipment_update</field>
+            <field name="condition">not shipment_exception</field>
+        </record>
+        <record model="workflow.transition" id="sale_transition_waiting_shipment_invoice_shipment_method2">
+            <field name="act_from" ref="sale_activity_waiting_shipment"/>
+            <field name="act_to" ref="sale_activity_invoice_shipment_method"/>
+            <field name="condition">shipment_done</field>
+        </record>
+        <record model="workflow.transition" id="sale_transition_invoice_shipment_method_invoice_shipment">
+            <field name="act_from" ref="sale_activity_invoice_shipment_method"/>
+            <field name="act_to" ref="sale_activity_invoice_shipment"/>
+            <field name="condition">invoice_method == 'shipment'</field>
+        </record>
+        <record model="workflow.transition" id="sale_transition_invoice_shipment_method_invoice_shipment_method_done">
+            <field name="act_from" ref="sale_activity_invoice_shipment_method"/>
+            <field name="act_to" ref="sale_activity_invoice_shipment_method_done"/>
+            <field name="condition">invoice_method != 'shipment' and shipment_done</field>
+        </record>
+        <record model="workflow.transition" id="sale_transition_invoice_shipment_method_waiting_shipment">
+            <field name="act_from" ref="sale_activity_invoice_shipment_method"/>
+            <field name="act_to" ref="sale_activity_waiting_shipment"/>
+            <field name="condition">invoice_method != 'shipment' and not shipment_done</field>
+        </record>
+        <record model="workflow.transition" id="sale_transition_invoice_shipment_waiting_shipment">
+            <field name="act_from" ref="sale_activity_invoice_shipment"/>
+            <field name="act_to" ref="sale_activity_waiting_shipment"/>
+            <field name="condition">not shipment_done</field>
+        </record>
+        <record model="workflow.transition" id="sale_transition_invoice_shipment_waiting_invoice_shipment">
+            <field name="act_from" ref="sale_activity_invoice_shipment"/>
+            <field name="act_to" ref="sale_activity_waiting_invoice_shipment"/>
+            <field name="condition">shipment_done</field>
+        </record>
+        <record model="workflow.transition" id="sale_transition_waiting_invoice_shipment_invoice_shipment_exception">
+            <field name="act_from" ref="sale_activity_waiting_invoice_shipment"/>
+            <field name="act_to" ref="sale_activity_invoice_shipment_exception"/>
             <field name="trigger_model">account.invoice</field>
             <field name="trigger_expr_id">[x.id for x in invoices]</field>
             <field name="condition">invoice_exception</field>
         </record>
-        <record model="workflow.transition" id="sale_transition_invoice_packing_exception_cancel">
-            <field name="act_from" ref="sale_activity_invoice_packing_exception"/>
+        <record model="workflow.transition" id="sale_transition_invoice_shipment_exception_cancel">
+            <field name="act_from" ref="sale_activity_invoice_shipment_exception"/>
             <field name="act_to" ref="sale_activity_cancel"/>
             <field name="signal">cancel</field>
             <field name="group" ref="group_sale"/>
         </record>
-        <record model="workflow.transition" id="sale_transition_invoice_packing_exception_waiting_invoice_packing">
-            <field name="act_from" ref="sale_activity_invoice_packing_exception"/>
-            <field name="act_to" ref="sale_activity_waiting_invoice_packing"/>
+        <record model="workflow.transition" id="sale_transition_invoice_shipment_exception_waiting_invoice_shipment">
+            <field name="act_from" ref="sale_activity_invoice_shipment_exception"/>
+            <field name="act_to" ref="sale_activity_waiting_invoice_shipment"/>
             <field name="signal">invoice_ok</field>
             <field name="group" ref="group_sale"/>
         </record>
-        <record model="workflow.transition" id="sale_transition_waiting_invoice_packing_invoice_packing_done">
-            <field name="act_from" ref="sale_activity_waiting_invoice_packing"/>
-            <field name="act_to" ref="sale_activity_invoice_packing_done"/>
+        <record model="workflow.transition" id="sale_transition_waiting_invoice_shipment_invoice_shipment_done">
+            <field name="act_from" ref="sale_activity_waiting_invoice_shipment"/>
+            <field name="act_to" ref="sale_activity_invoice_shipment_done"/>
             <field name="trigger_model">account.invoice</field>
             <field name="trigger_expr_id">[x.id for x in invoices]</field>
             <field name="condition">invoice_paid</field>
         </record>
-        <record model="workflow.transition" id="sale_transition_invoice_packing_done_invoice_packing_method_done">
-            <field name="act_from" ref="sale_activity_invoice_packing_done"/>
-            <field name="act_to" ref="sale_activity_invoice_packing_method_done"/>
+        <record model="workflow.transition" id="sale_transition_invoice_shipment_done_invoice_shipment_method_done">
+            <field name="act_from" ref="sale_activity_invoice_shipment_done"/>
+            <field name="act_to" ref="sale_activity_invoice_shipment_method_done"/>
         </record>
-        <record model="workflow.transition" id="sale_transition_invoice_packing_method_done_packing_method_done">
-            <field name="act_from" ref="sale_activity_invoice_packing_method_done"/>
-            <field name="act_to" ref="sale_activity_packing_method_done"/>
+        <record model="workflow.transition" id="sale_transition_invoice_shipment_method_done_shipment_method_done">
+            <field name="act_from" ref="sale_activity_invoice_shipment_method_done"/>
+            <field name="act_to" ref="sale_activity_shipment_method_done"/>
         </record>
-        <record model="workflow.transition" id="sale_transition_packing_method_done_done">
-            <field name="act_from" ref="sale_activity_packing_method_done"/>
+        <record model="workflow.transition" id="sale_transition_shipment_method_done_done">
+            <field name="act_from" ref="sale_activity_shipment_method_done"/>
             <field name="act_to" ref="sale_activity_done"/>
         </record>
 
diff --git a/setup.py b/setup.py
index 7c97b73..f888cd3 100644
--- a/setup.py
+++ b/setup.py
@@ -9,17 +9,12 @@ info = eval(file('__tryton__.py').read())
 
 requires = []
 for dep in info.get('depends', []):
-    match = re.compile(
-            '(ir|res|workflow|webdav)((\s|$|<|>|<=|>=|==|!=).*?$)').match(dep)
-    if match:
-        continue
-    else:
-        dep = 'trytond_' + dep
-    requires.append(dep)
+    if not re.match(r'(ir|res|workflow|webdav)(\W|$)', dep):
+        requires.append('trytond_' + dep)
 
 major_version, minor_version, _ = info.get('version', '0.0.1').split('.', 2)
 requires.append('trytond >= %s.%s' % (major_version, minor_version))
-requires.append('trytond < %s.%s' % (major_version, str(int(minor_version) + 1)))
+requires.append('trytond < %s.%s' % (major_version, int(minor_version) + 1))
 
 setup(name='trytond_sale',
     version=info.get('version', '0.0.1'),
diff --git a/tests/__init__.py b/tests/__init__.py
new file mode 100644
index 0000000..7d658b3
--- /dev/null
+++ b/tests/__init__.py
@@ -0,0 +1,4 @@
+#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 test_sale import *
diff --git a/tests/test_sale.py b/tests/test_sale.py
new file mode 100644
index 0000000..8cf71b3
--- /dev/null
+++ b/tests/test_sale.py
@@ -0,0 +1,38 @@
+#!/usr/bin/env python
+#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 sys, os
+DIR = os.path.abspath(os.path.normpath(os.path.join(__file__,
+    '..', '..', '..', '..', '..', 'trytond')))
+if os.path.isdir(DIR):
+    sys.path.insert(0, os.path.dirname(DIR))
+
+import unittest
+import trytond.tests.test_tryton
+from trytond.tests.test_tryton import RPCProxy, CONTEXT, SOCK, test_view
+
+
+class SaleTestCase(unittest.TestCase):
+    '''
+    Test Sale module.
+    '''
+
+    def setUp(self):
+        trytond.tests.test_tryton.install_module('sale')
+
+    def test0005views(self):
+        '''
+        Test views.
+        '''
+        self.assertRaises(Exception, test_view('sale'))
+
+def suite():
+    return unittest.TestLoader().loadTestsFromTestCase(SaleTestCase)
+
+if __name__ == '__main__':
+    suiteTrytond = trytond.tests.test_tryton.suite()
+    suiteSale = suite()
+    alltests = unittest.TestSuite([suiteTrytond, suiteSale])
+    unittest.TextTestRunner(verbosity=2).run(alltests)
+    SOCK.disconnect()
diff --git a/trytond_sale.egg-info/PKG-INFO b/trytond_sale.egg-info/PKG-INFO
index 2644741..4b33ab6 100644
--- a/trytond_sale.egg-info/PKG-INFO
+++ b/trytond_sale.egg-info/PKG-INFO
@@ -1,17 +1,17 @@
 Metadata-Version: 1.0
 Name: trytond-sale
-Version: 1.2.1
+Version: 1.4.0
 Summary: Define sale order.
 Add to product sale informations.
 Define the sale price as the list price.
 
 With the possibilities:
-    - to follow invoice and packing states from the sale order.
+    - to follow invoice and shipment states from the sale order.
     - to define invoice method:
         - Manual
         - On Order Confirmed
-        - On packing Sent
-    - to define packing method:
+        - On shipment Sent
+    - to define shipment method:
         - Manual
         - On Order Confirmed
         - On Invoice Paid
@@ -20,7 +20,7 @@ Home-page: http://www.tryton.org/
 Author: B2CK
 Author-email: info at b2ck.com
 License: GPL-3
-Download-URL: http://downloads.tryton.org/1.2/
+Download-URL: http://downloads.tryton.org/1.4/
 Description: UNKNOWN
 Platform: UNKNOWN
 Classifier: Development Status :: 5 - Production/Stable
diff --git a/trytond_sale.egg-info/SOURCES.txt b/trytond_sale.egg-info/SOURCES.txt
index febe848..b621800 100644
--- a/trytond_sale.egg-info/SOURCES.txt
+++ b/trytond_sale.egg-info/SOURCES.txt
@@ -16,6 +16,9 @@ setup.py
 ./__init__.py
 ./__tryton__.py
 ./sale.py
+doc/index.rst
+tests/__init__.py
+tests/test_sale.py
 trytond_sale.egg-info/PKG-INFO
 trytond_sale.egg-info/SOURCES.txt
 trytond_sale.egg-info/dependency_links.txt
diff --git a/trytond_sale.egg-info/requires.txt b/trytond_sale.egg-info/requires.txt
index fbf666b..8bba34c 100644
--- a/trytond_sale.egg-info/requires.txt
+++ b/trytond_sale.egg-info/requires.txt
@@ -6,5 +6,5 @@ trytond_product
 trytond_account_invoice
 trytond_currency
 trytond_account_product
-trytond >= 1.2
-trytond < 1.3
\ No newline at end of file
+trytond >= 1.4
+trytond < 1.5
\ No newline at end of file
commit 02d5f8de7ed3b9acab6085327857ca22fbe5cceb
Author: Daniel Baumann <daniel at debian.org>
Date:   Sat Sep 5 09:42:33 2009 +0200

    Releasing debian version 1.2.1-4.

diff --git a/debian/changelog b/debian/changelog
index 62baedd..c55012a 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -1,3 +1,14 @@
+tryton-modules-sale (1.2.1-4) unstable; urgency=low
+
+  * Updating to standards version 3.8.3.
+  * Adding maintainer homepage field to control.
+  * Adding README.source.
+  * Moving maintainer homepage field to copyright.
+  * Updating README.source.
+  * Using ascii only characters in copyright.
+
+ -- Daniel Baumann <daniel at debian.org>  Sat, 05 Sep 2009 09:42:30 +0200
+
 tryton-modules-sale (1.2.1-3) unstable; urgency=low
 
   * Updating maintainer field.
commit f2174c7c3366773b905b47b10b4cb42e9002c0a0
Author: Daniel Baumann <daniel at debian.org>
Date:   Sat Sep 5 09:34:33 2009 +0200

    Using ascii only characters in copyright.

diff --git a/debian/copyright b/debian/copyright
index 0308b4e..b18de59 100644
--- a/debian/copyright
+++ b/debian/copyright
@@ -6,7 +6,7 @@ Maintainer-Homepage: http://tryton.debian-maintainers.org/
 Files: *
 Copyright:
  (C) 2004-2008 Tiny SPRL
- (C) 2008-2009 Cédric Krier
+ (C) 2008-2009 Cedric Krier
  (C) 2008-2009 Bertrand Chenal
  (C) 2008-2009 B2CK SPRL
 License: GPL-3+
commit a6241465289c67a81b469ef732a4b95da04e00b3
Author: Daniel Baumann <daniel at debian.org>
Date:   Sat Sep 5 09:31:18 2009 +0200

    Updating README.source.

diff --git a/debian/README.source b/debian/README.source
index 259f923..dcc7ba3 100644
--- a/debian/README.source
+++ b/debian/README.source
@@ -4,7 +4,7 @@ Package Repositories
 Backports for the current stable debian distribution as well as snapshots of
 unreleased versions may be available in repositories listed on the maintainers
 homepage. The current URL of the maintainer homepage can be seen in
-debian/control.
+debian/copyright.
 
 
 Source Access
commit 05d8806388ca84c94e985c7bf9ee3ecea011949a
Author: Daniel Baumann <daniel at debian.org>
Date:   Sat Sep 5 09:28:23 2009 +0200

    Moving maintainer homepage field to copyright.

diff --git a/debian/control b/debian/control
index 28c715c..e37701f 100644
--- a/debian/control
+++ b/debian/control
@@ -11,7 +11,6 @@ Standards-Version: 3.8.3
 Homepage: http://www.tryton.org/
 Vcs-Browser: http://git.debian-maintainers.org/?p=tryton/tryton-modules-sale.git
 Vcs-Git: git://git.debian-maintainers.org/git/tryton/tryton-modules-sale.git
-XSBC-Maintainer-Homepage: http://tryton.debian-maintainers.org/
 
 Package: tryton-modules-sale
 Architecture: all
diff --git a/debian/copyright b/debian/copyright
index fceabb1..0308b4e 100644
--- a/debian/copyright
+++ b/debian/copyright
@@ -1,5 +1,7 @@
-Author: Tryton Project <http://www.tryton.org/>
-Download: http://www.tryton.org/downloads.html
+Upstream-Contact: Tryton project <tryton at googlegroups.com>
+Upstream-Homepage: http://downloads.tryton.org/
+Maintainer-Contact: Debian Tryton Maintainers <tryton at lists.debian-maintainers.org>
+Maintainer-Homepage: http://tryton.debian-maintainers.org/
 
 Files: *
 Copyright:
commit b3713290b1f539341f2c670265a0bb67c1e3106c
Author: Daniel Baumann <daniel at debian.org>
Date:   Tue Aug 25 08:18:34 2009 +0200

    Adding README.source.

diff --git a/debian/README.source b/debian/README.source
new file mode 100644
index 0000000..259f923
--- /dev/null
+++ b/debian/README.source
@@ -0,0 +1,37 @@
+Package Repositories
+--------------------
+
+Backports for the current stable debian distribution as well as snapshots of
+unreleased versions may be available in repositories listed on the maintainers
+homepage. The current URL of the maintainer homepage can be seen in
+debian/control.
+
+
+Source Access
+-------------
+
+You can obtain the sources of this package with:
+
+  $ apt-get source ${PACKAGE}
+
+whereas '${PACKAGE}' has to be replaced with the actual name of the package.
+
+This package is maintained with the Git version control system. The current git
+source tree can be obtained with:
+
+  $ git clone ${GIT_URI}
+
+whereas '${GIT_URI}' has to be replaced with the actual URI for the Git
+repository. The current Git URI can be seen in debian/control in the extracted
+package sources.
+
+More information about Git can be found in the git-core package.
+
+This package may use the Quilt patch system to manage all modifications to the
+upstream source. Changes, if any, are stored in the source package as diffs in
+debian/diff and are applied during the build. Current modifications can be
+applied to the source tree with:
+
+  $ quilt push -a
+
+More information about Quilt can be found in the quilt package.
commit b0044193ec0566f089906f52946be9630d7635f6
Author: Daniel Baumann <daniel at debian.org>
Date:   Mon Aug 24 17:50:05 2009 +0200

    Adding maintainer homepage field to control.

diff --git a/debian/control b/debian/control
index e37701f..28c715c 100644
--- a/debian/control
+++ b/debian/control
@@ -11,6 +11,7 @@ Standards-Version: 3.8.3
 Homepage: http://www.tryton.org/
 Vcs-Browser: http://git.debian-maintainers.org/?p=tryton/tryton-modules-sale.git
 Vcs-Git: git://git.debian-maintainers.org/git/tryton/tryton-modules-sale.git
+XSBC-Maintainer-Homepage: http://tryton.debian-maintainers.org/
 
 Package: tryton-modules-sale
 Architecture: all
commit ba091278492b44bdcfe5fa62cb46fe82af0db188
Author: Daniel Baumann <daniel at debian.org>
Date:   Sun Aug 16 10:13:31 2009 +0200

    Updating to standards version 3.8.3.

diff --git a/debian/control b/debian/control
index 172e4e0..e37701f 100644
--- a/debian/control
+++ b/debian/control
@@ -7,7 +7,7 @@ Uploaders:
  Mathias Behrle <mathiasb at mbsolutions.selfip.biz>
 Build-Depends:
  debhelper (>= 7), python, python-all-dev, python-setuptools, python-support
-Standards-Version: 3.8.2
+Standards-Version: 3.8.3
 Homepage: http://www.tryton.org/
 Vcs-Browser: http://git.debian-maintainers.org/?p=tryton/tryton-modules-sale.git
 Vcs-Git: git://git.debian-maintainers.org/git/tryton/tryton-modules-sale.git
commit 16acc3852b8c22746f23491756732caa365cdce7
Author: Daniel Baumann <daniel at debian.org>
Date:   Mon Aug 10 20:23:52 2009 +0200

    Releasing debian version 1.2.1-3.

diff --git a/debian/changelog b/debian/changelog
index 42d7bb5..62baedd 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -1,3 +1,11 @@
+tryton-modules-sale (1.2.1-3) unstable; urgency=low
+
+  * Updating maintainer field.
+  * Updating vcs fields.
+  * Wrapping lines in control.
+
+ -- Daniel Baumann <daniel at debian.org>  Mon, 10 Aug 2009 20:23:50 +0200
+
 tryton-modules-sale (1.2.1-2) unstable; urgency=low
 
   * Minimizing rules file.
commit 0392f14e95c5103ae02e4e6d7c7bf7eb7a0d300f
Author: Daniel Baumann <daniel at debian.org>
Date:   Mon Aug 10 20:23:47 2009 +0200

    Wrapping lines in control.

diff --git a/debian/control b/debian/control
index 8a6e94c..172e4e0 100644
--- a/debian/control
+++ b/debian/control
@@ -2,7 +2,9 @@ Source: tryton-modules-sale
 Section: python
 Priority: optional
 Maintainer: Debian Tryton Maintainers <tryton at lists.debian-maintainers.org>
-Uploaders: Daniel Baumann <daniel at debian.org>, Mathias Behrle <mathiasb at mbsolutions.selfip.biz>
+Uploaders:
+ Daniel Baumann <daniel at debian.org>,
+ Mathias Behrle <mathiasb at mbsolutions.selfip.biz>
 Build-Depends:
  debhelper (>= 7), python, python-all-dev, python-setuptools, python-support
 Standards-Version: 3.8.2
commit 3a5d560b948a38c122c683af8bca5da12165ad5f
Author: Daniel Baumann <daniel at debian.org>
Date:   Sat Aug 8 23:26:50 2009 +0200

    Updating vcs fields.

diff --git a/debian/control b/debian/control
index b8335a9..8a6e94c 100644
--- a/debian/control
+++ b/debian/control
@@ -7,8 +7,8 @@ Build-Depends:
  debhelper (>= 7), python, python-all-dev, python-setuptools, python-support
 Standards-Version: 3.8.2
 Homepage: http://www.tryton.org/
-Vcs-Browser: http://git.debian.net/?p=debian/tryton-modules-sale.git
-Vcs-Git: git://git.debian.net/git/debian/tryton-modules-sale.git
+Vcs-Browser: http://git.debian-maintainers.org/?p=tryton/tryton-modules-sale.git
+Vcs-Git: git://git.debian-maintainers.org/git/tryton/tryton-modules-sale.git
 
 Package: tryton-modules-sale
 Architecture: all
commit f4386f31815e348b3d37c311c6f34798376c538d
Author: Daniel Baumann <daniel at debian.org>
Date:   Sat Aug 8 23:19:30 2009 +0200

    Updating maintainer field.

diff --git a/debian/control b/debian/control
index 01cb309..b8335a9 100644
--- a/debian/control
+++ b/debian/control
@@ -1,8 +1,8 @@
 Source: tryton-modules-sale
 Section: python
 Priority: optional
-Maintainer: Daniel Baumann <daniel at debian.org>
-Uploaders: Mathias Behrle <mathiasb at mbsolutions.selfip.biz>
+Maintainer: Debian Tryton Maintainers <tryton at lists.debian-maintainers.org>
+Uploaders: Daniel Baumann <daniel at debian.org>, Mathias Behrle <mathiasb at mbsolutions.selfip.biz>
 Build-Depends:
  debhelper (>= 7), python, python-all-dev, python-setuptools, python-support
 Standards-Version: 3.8.2
commit c86e31049633a54f5176034f356556ab435911f8
Author: Daniel Baumann <daniel at debian.org>
Date:   Sun Jul 26 20:45:12 2009 +0200

    Releasing debian version 1.2.1-2.

diff --git a/debian/changelog b/debian/changelog
index c53857b..42d7bb5 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -1,3 +1,9 @@
+tryton-modules-sale (1.2.1-2) unstable; urgency=low
+
+  * Minimizing rules file.
+
+ -- Daniel Baumann <daniel at debian.org>  Sun, 26 Jul 2009 20:45:11 +0200
+
 tryton-modules-sale (1.2.1-1) unstable; urgency=low
 
   * Updating package to standards version 3.8.2.
commit e4151b120fb8009caf316abd5ed399febd33689c
Author: Daniel Baumann <daniel at debian.org>
Date:   Sun Jul 26 20:45:08 2009 +0200

    Minimizing rules file.

diff --git a/debian/rules b/debian/rules
index 9feebca..000210b 100755
--- a/debian/rules
+++ b/debian/rules
@@ -1,41 +1,4 @@
 #!/usr/bin/make -f
 
-clean:
-	dh_testdir
-	dh_testroot
-	rm -f build-stamp
-
-	python setup.py clean
-	rm -rf dist build trytond_sale.egg-info
-
-	dh_clean
-
-build:
-
-install:
-	dh_testdir
-	dh_testroot
-	dh_prep
-
-	python setup.py install --single-version-externally-managed --root=$(CURDIR)/debian/tryton-modules-sale --install-lib /usr/share/python-support/tryton-modules-sale
-
-	find debian/tryton-modules-sale -type f -name "*.pyc" | xargs rm -f
-
-binary: binary-indep
-
-binary-arch:
-
-binary-indep: install
-	dh_testdir
-	dh_testroot
-	dh_installchangelogs CHANGELOG
-	dh_installdocs
-	dh_pysupport
-	dh_compress
-	dh_fixperms
-	dh_installdeb
-	dh_gencontrol
-	dh_md5sums
-	dh_builddeb
-
-.PHONY: clean build install binary binary-arch binary-indep
+%:
+	dh ${@}
commit f23d229d660e74c9939736cb87ec2b96f817881b
Author: Daniel Baumann <daniel at debian.org>
Date:   Fri Jul 10 14:18:58 2009 +0200

    Releasing debian version 1.2.1-1.

diff --git a/debian/changelog b/debian/changelog
index 8fb19b9..c53857b 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -1,3 +1,10 @@
+tryton-modules-sale (1.2.1-1) unstable; urgency=low
+
+  * Updating package to standards version 3.8.2.
+  * Merging upstream version 1.2.1.
+
+ -- Daniel Baumann <daniel at debian.org>  Fri, 10 Jul 2009 14:18:50 +0200
+
 tryton-modules-sale (1.2.0-1) unstable; urgency=low
 
   [ Daniel Baumann ]
commit ef7a1996e097290d62b0efaf16ad0fbbbd39b148
Author: Daniel Baumann <daniel at debian.org>
Date:   Fri Jul 10 14:18:43 2009 +0200

    Merging upstream version 1.2.1.

diff --git a/CHANGELOG b/CHANGELOG
index 7d38f3e..6d89320 100644
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -1,3 +1,6 @@
+Version 1.2.1 - 2009-07-07
+* Some bug fixes (see mercurial logs for details)
+
 Version 1.2.0 - 2009-04-20
 * Bug fixes (see mercurial logs for details)
 * Add buttons to handle invoice and packing exceptions
diff --git a/PKG-INFO b/PKG-INFO
index f0e2473..beba15a 100644
--- a/PKG-INFO
+++ b/PKG-INFO
@@ -1,6 +1,6 @@
 Metadata-Version: 1.0
 Name: trytond_sale
-Version: 1.2.0
+Version: 1.2.1
 Summary: Define sale order.
 Add to product sale informations.
 Define the sale price as the list price.
diff --git a/__tryton__.py b/__tryton__.py
index ed2d278..e1087fa 100644
--- a/__tryton__.py
+++ b/__tryton__.py
@@ -6,7 +6,7 @@
     'name_es_CO': 'Ventas',
     'name_es_ES': 'Ventas',
     'name_fr_FR': 'Vente',
-    'version': '1.2.0',
+    'version': '1.2.1',
     'author': 'B2CK',
     'email': 'info at b2ck.com',
     'website': 'http://www.tryton.org/',
diff --git a/sale.py b/sale.py
index cc107af..f9ed5b2 100644
--- a/sale.py
+++ b/sale.py
@@ -301,6 +301,7 @@ class Sale(ModelWorkflow, ModelSQL, ModelView):
     def on_change_lines(self, cursor, user, ids, vals, context=None):
         currency_obj = self.pool.get('currency.currency')
         tax_obj = self.pool.get('account.tax')
+        invoice_obj = self.pool.get('account.invoice')
 
         if context is None:
             context = {}
@@ -320,6 +321,7 @@ class Sale(ModelWorkflow, ModelSQL, ModelView):
             ctx = context.copy()
             ctx.update(self.get_tax_context(cursor, user, vals,
                 context=context))
+            taxes = {}
             for line in vals['lines']:
                 if line.get('type', 'line') != 'line':
                     continue
@@ -328,7 +330,16 @@ class Sale(ModelWorkflow, ModelSQL, ModelView):
                 for tax in tax_obj.compute(cursor, user, line.get('taxes', []),
                         line.get('unit_price', Decimal('0.0')),
                         line.get('quantity', 0.0), context=context):
-                    res['tax_amount'] += tax['amount']
+                    key, val = invoice_obj._compute_tax(cursor, user, tax,
+                            'out_invoice', context=context)
+                    if not key in taxes:
+                        taxes[key] = val['amount']
+                    else:
+                        taxes[key] += val['amount']
+            if currency:
+                for key in taxes:
+                    res['tax_amount'] += currency_obj.round(cursor, user,
+                            currency, taxes[key])
         if currency:
             res['untaxed_amount'] = currency_obj.round(cursor, user, currency,
                     res['untaxed_amount'])
@@ -425,6 +436,8 @@ class Sale(ModelWorkflow, ModelSQL, ModelView):
         '''
         currency_obj = self.pool.get('currency.currency')
         tax_obj = self.pool.get('account.tax')
+        invoice_obj = self.pool.get('account.invoice')
+
         if context is None:
             context = {}
         res = {}
@@ -433,6 +446,7 @@ class Sale(ModelWorkflow, ModelSQL, ModelView):
             ctx.update(self.get_tax_context(cursor, user, sale,
                 context=context))
             res.setdefault(sale.id, Decimal('0.0'))
+            taxes = {}
             for line in sale.lines:
                 if line.type != 'line':
                     continue
@@ -440,7 +454,15 @@ class Sale(ModelWorkflow, ModelSQL, ModelView):
                 for tax in tax_obj.compute(cursor, user,
                         [t.id for t in line.taxes], line.unit_price,
                         line.quantity, context=ctx):
-                    res[sale.id] += tax['amount']
+                    key, val = invoice_obj._compute_tax(cursor, user, tax,
+                            'out_invoice', context=context)
+                    if not key in taxes:
+                        taxes[key] = val['amount']
+                    else:
+                        taxes[key] += val['amount']
+            for key in taxes:
+                res[sale.id] += currency_obj.round(cursor, user,
+                        sale.currency, taxes[key])
             res[sale.id] = currency_obj.round(cursor, user, sale.currency,
                     res[sale.id])
         return res
diff --git a/trytond_sale.egg-info/PKG-INFO b/trytond_sale.egg-info/PKG-INFO
index d767451..2644741 100644
--- a/trytond_sale.egg-info/PKG-INFO
+++ b/trytond_sale.egg-info/PKG-INFO
@@ -1,6 +1,6 @@
 Metadata-Version: 1.0
 Name: trytond-sale
-Version: 1.2.0
+Version: 1.2.1
 Summary: Define sale order.
 Add to product sale informations.
 Define the sale price as the list price.
commit 9ec35aae4e0666b67d923425a688062f3c2bf76c
Author: Daniel Baumann <daniel at debian.org>
Date:   Fri Jul 10 14:09:16 2009 +0200

    Updating package to standards version 3.8.2.

diff --git a/debian/control b/debian/control
index b7fd6f2..01cb309 100644
--- a/debian/control
+++ b/debian/control
@@ -5,7 +5,7 @@ Maintainer: Daniel Baumann <daniel at debian.org>
 Uploaders: Mathias Behrle <mathiasb at mbsolutions.selfip.biz>
 Build-Depends:
  debhelper (>= 7), python, python-all-dev, python-setuptools, python-support
-Standards-Version: 3.8.1
+Standards-Version: 3.8.2
 Homepage: http://www.tryton.org/
 Vcs-Browser: http://git.debian.net/?p=debian/tryton-modules-sale.git
 Vcs-Git: git://git.debian.net/git/debian/tryton-modules-sale.git
commit 380446fd51a28ce50fd014b72b583a3fbc774e7f
Author: Daniel Baumann <daniel at debian.org>
Date:   Tue Apr 21 20:54:34 2009 +0200

    Releasing debian version 1.2.0-1.

diff --git a/debian/changelog b/debian/changelog
index 1e210e7..8fb19b9 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -1,3 +1,19 @@
+tryton-modules-sale (1.2.0-1) unstable; urgency=low
+
+  [ Daniel Baumann ]
+  * Merging upstream version 1.2.0.
+  * Tidy rules file.
+  * Updating copyright file for new upstream release.
+  * Including TODO file in docs.
+
+  [ Mathias Behrle ]
+  * Updating application and package description.
+
+  [ Daniel Baumann ]
+  * Correcting wrapping of control file.
+
+ -- Daniel Baumann <daniel at debian.org>  Tue, 21 Apr 2009 20:54:00 +0200
+
 tryton-modules-sale (1.0.2-2) unstable; urgency=low
 
   * Adding Mathias to uploaders.
commit dffa952d91d91ce34c566da70abb068bcc8dfc02
Author: Daniel Baumann <daniel at debian.org>
Date:   Tue Apr 21 20:54:20 2009 +0200

    Correcting wrapping of control file.

diff --git a/debian/control b/debian/control
index 296f961..b7fd6f2 100644
--- a/debian/control
+++ b/debian/control
@@ -3,7 +3,8 @@ Section: python
 Priority: optional
 Maintainer: Daniel Baumann <daniel at debian.org>
 Uploaders: Mathias Behrle <mathiasb at mbsolutions.selfip.biz>
-Build-Depends: debhelper (>= 7), python, python-all-dev, python-setuptools, python-support
+Build-Depends:
+ debhelper (>= 7), python, python-all-dev, python-setuptools, python-support
 Standards-Version: 3.8.1
 Homepage: http://www.tryton.org/
 Vcs-Browser: http://git.debian.net/?p=debian/tryton-modules-sale.git
@@ -11,14 +12,19 @@ Vcs-Git: git://git.debian.net/git/debian/tryton-modules-sale.git
 
 Package: tryton-modules-sale
 Architecture: all
-Depends: ${misc:Depends}, ${python:Depends}, tryton-server, tryton-modules-account, tryton-modules-account-invoice, tryton-modules-account-product, tryton-modules-company, tryton-modules-currency, tryton-modules-party, tryton-modules-product, tryton-modules-stock, python-pkg-resources
+Depends:
+ ${misc:Depends}, ${python:Depends}, tryton-server, tryton-modules-account,
+ tryton-modules-account-invoice, tryton-modules-account-product,
+ tryton-modules-company, tryton-modules-currency, tryton-modules-party,
+ tryton-modules-product, tryton-modules-stock, python-pkg-resources
 XB-Python-Version: ${python:Versions}
 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 business solution.
+ and using PostgreSQL as database engine. It is the core base of a complete
+ business solution.
  .
- This module the possibility to define sale orders, to add sale informations to products,
- and to define the sale price as the list price.
+ This module the possibility to define sale orders, to add sale informations to
+ products, and to define the sale price as the list price.
  .
  With the possibilities:
  .
commit a134f9db1b41322ce05736d4b3303c44faf30afb
Author: Mathias Behrle <mathiasb at mbsolutions.selfip.biz>
Date:   Tue Apr 21 17:41:47 2009 +0200

    Updating application and package description.

diff --git a/debian/control b/debian/control
index 6a7fdbf..296f961 100644
--- a/debian/control
+++ b/debian/control
@@ -15,10 +15,10 @@ Depends: ${misc:Depends}, ${python:Depends}, tryton-server, tryton-modules-accou
 XB-Python-Version: ${python:Versions}
 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 an ERP.
+ and using PostgreSQL as database engine. It is the core base of a complete business solution.
  .
- This module defines sale order, adds to product sale informations, and defines
- the sale price as the list price.
+ This module the possibility to define sale orders, to add sale informations to products,
+ and to define the sale price as the list price.
  .
  With the possibilities:
  .
commit 115941de0204147f1a43d927563fc8fca3dc0d57
Author: Daniel Baumann <daniel at debian.org>
Date:   Tue Apr 21 11:54:41 2009 +0200

    Including TODO file in docs.

diff --git a/debian/tryton-modules-sale.docs b/debian/tryton-modules-sale.docs
new file mode 100644
index 0000000..1333ed7
--- /dev/null
+++ b/debian/tryton-modules-sale.docs
@@ -0,0 +1 @@
+TODO
commit 978592464fa5450b353521c32848475575992f73
Author: Daniel Baumann <daniel at debian.org>
Date:   Tue Apr 21 11:46:34 2009 +0200

    Updating copyright file for new upstream release.

diff --git a/debian/copyright b/debian/copyright
index 0088eff..fceabb1 100644
--- a/debian/copyright
+++ b/debian/copyright
@@ -4,9 +4,9 @@ Download: http://www.tryton.org/downloads.html
 Files: *
 Copyright:
  (C) 2004-2008 Tiny SPRL
- (C) 2008 Cedric Krier
- (C) 2008 Bertrand Chenal
- (C) 2008 B2CK SPRL
+ (C) 2008-2009 Cédric Krier
+ (C) 2008-2009 Bertrand Chenal
+ (C) 2008-2009 B2CK SPRL
 License: GPL-3+
  This program is free software: you can redistribute it and/or modify
  it under the terms of the GNU General Public License as published by
commit 1a12b5c32dc9dae785a898ad99401741d09acaff
Author: Daniel Baumann <daniel at debian.org>
Date:   Tue Apr 21 11:35:54 2009 +0200

    Tidy rules file.

diff --git a/debian/rules b/debian/rules
index 1541359..9feebca 100755
--- a/debian/rules
+++ b/debian/rules
@@ -16,7 +16,6 @@ install:
 	dh_testdir
 	dh_testroot
 	dh_prep
-	dh_installdirs
 
 	python setup.py install --single-version-externally-managed --root=$(CURDIR)/debian/tryton-modules-sale --install-lib /usr/share/python-support/tryton-modules-sale
 
commit 63dad65078f4db3242705a30a692dc550b3c7df7
Author: Daniel Baumann <daniel at debian.org>
Date:   Tue Apr 21 10:42:48 2009 +0200

    Merging upstream version 1.2.0.

diff --git a/CHANGELOG b/CHANGELOG
index bf8a718..7d38f3e 100644
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -1,7 +1,6 @@
-Version 1.0.2 - 2009-01-06
-* Some bug fixes (see mercurial logs for details)
-
-Version 1.0.1 - 2008-12-01
+Version 1.2.0 - 2009-04-20
+* Bug fixes (see mercurial logs for details)
+* Add buttons to handle invoice and packing exceptions
 * Allow egg installation
 
 Version 1.0.0 - 2008-11-17
diff --git a/COPYRIGHT b/COPYRIGHT
index 37fef2d..da277a9 100644
--- a/COPYRIGHT
+++ b/COPYRIGHT
@@ -1,7 +1,7 @@
 Copyright (C) 2004-2008 Tiny SPRL.
-Copyright (C) 2008 Cédric Krier.
-Copyright (C) 2008 Bertrand Chenal.
-Copyright (C) 2008 B2CK SPRL.
+Copyright (C) 2008-2009 Cédric Krier.
+Copyright (C) 2008-2009 Bertrand Chenal.
+Copyright (C) 2008-2009 B2CK SPRL.
 
 This program is free software: you can redistribute it and/or modify
 it under the terms of the GNU General Public License as published by
diff --git a/INSTALL b/INSTALL
index 1824916..f40e3b8 100644
--- a/INSTALL
+++ b/INSTALL
@@ -5,7 +5,7 @@ Prerequisites
 -------------
 
  * Python 2.4 or later (http://www.python.org/)
- * trytond 0.0.x (http://www.tryton.org/)
+ * trytond 1.1.x (http://www.tryton.org/)
  * trytond_company (http://www.tryton.org/)
  * trytond_party (http://www.tryton.org/)
  * trytond_stock (http://www.tryton.org/)
@@ -18,7 +18,7 @@ Prerequisites
 Installation
 ------------
 
-Once you've downloaded and unpacked a trytond_sale source release, enter the
+Once you've downloaded and unpacked the trytond_sale source release, enter the
 directory where the archive was unpacked, and run:
 
     python setup.py install
diff --git a/PKG-INFO b/PKG-INFO
index 3fcc54a..f0e2473 100644
--- a/PKG-INFO
+++ b/PKG-INFO
@@ -1,6 +1,6 @@
 Metadata-Version: 1.0
 Name: trytond_sale
-Version: 1.0.2
+Version: 1.2.0
 Summary: Define sale order.
 Add to product sale informations.
 Define the sale price as the list price.
@@ -20,7 +20,7 @@ Home-page: http://www.tryton.org/
 Author: B2CK
 Author-email: info at b2ck.com
 License: GPL-3
-Download-URL: http://downloads.tryton.org/1.0/
+Download-URL: http://downloads.tryton.org/1.2/
 Description: UNKNOWN
 Platform: UNKNOWN
 Classifier: Development Status :: 5 - Production/Stable
diff --git a/TODO b/TODO
index fac542d..d686abe 100644
--- a/TODO
+++ b/TODO
@@ -1,4 +1,2 @@
-- Add button to recreate packing when in exception
-- Add button to recreate invoice when in exception
-- Add form_relate from party to party's sales
 - Add historization of quotation
+- Cancel draft moves and draft invoice when canceling sale order
diff --git a/__tryton__.py b/__tryton__.py
index 5bd8b94..ed2d278 100644
--- a/__tryton__.py
+++ b/__tryton__.py
@@ -3,9 +3,10 @@
 {
     'name': 'Sale',
     'name_de_DE': 'Verkauf',
-    'name_fr_FR': 'Vente',
+    'name_es_CO': 'Ventas',
     'name_es_ES': 'Ventas',
-    'version': '1.0.2',
+    'name_fr_FR': 'Vente',
+    'version': '1.2.0',
     'author': 'B2CK',
     'email': 'info at b2ck.com',
     'website': 'http://www.tryton.org/',
@@ -40,19 +41,20 @@ Ermöglicht:
         - Nach Auftragsbestätigung
         - Nach Bezahlung
 ''',
-    'description_fr_FR': '''Défini l'ordre de vente.
-Ajoute au produit les information de vente.
+    'description_es_CO': ''' - Define la orden de Ventas.
+ - Se añade al producto la información de ventas.
+ - Definición del precio de venta y el precio de lista.
 
-Avec la possibilité:
-    ' de suivre l'état de la facture et du colisage depuis l'ordre de vente
-    ' de choisir entre plusieurs méthodes de facturation:
-        ' Manuelle
-        ' Sur confirmation de la commande
-        ' À la livraison
-    ' de choisir entre plusieurs méthodes de colisage:
-        ' Manuel
-        ' Sur confirmation de la commande
-        ' Au paiement de la facture
+ - Con las posibilidades de:
+    - seguir los estados de facturación y empaque desde la orden de venta.
+    - definir el método de facturación:
+        - Manual
+        - Al Confirmar la Orden
+        - Al Envío del Paquete
+    - definir el método de empaque:
+        - Manual
+        - Al Confirmar la Orden
+        - Contra el Pago de la Factura
 ''',
     'description_es_ES': ''' - Define la orden de Ventas.
  - Se añade al producto la información de ventas.
@@ -69,6 +71,20 @@ Avec la possibilité:
         - Al Confirmar la Orden
         - Contra el Pago de la Factura
 ''',
+    'description_fr_FR': '''Défini l'ordre de vente.
+Ajoute au produit les information de vente.
+
+Avec la possibilité:
+    ' de suivre l'état de la facture et du colisage depuis l'ordre de vente
+    ' de choisir entre plusieurs méthodes de facturation:
+        ' Manuelle
+        ' Sur confirmation de la commande
+        ' À la livraison
+    ' de choisir entre plusieurs méthodes de colisage:
+        ' Manuel
+        ' Sur confirmation de la commande
+        ' Au paiement de la facture
+''',
     'depends': [
         'company',
         'party',
@@ -84,9 +100,11 @@ Avec la possibilité:
     ],
     'xml': [
         'sale.xml',
+        'party.xml',
     ],
     'translation': [
         'de_DE.csv',
+        'es_CO.csv',
         'es_ES.csv',
         'fr_FR.csv',
     ],
diff --git a/de_DE.csv b/de_DE.csv
index 916bab5..40880cb 100644
--- a/de_DE.csv
+++ b/de_DE.csv
@@ -1,21 +1,44 @@
 type,name,res_id,src,value,fuzzy
-error,account.invoice,0,You can not delete invoices that comes from a sale!,Aus einem Verkauf stammende Rechnungen können nicht gelöscht werden!,0
-error,sale.line,0,"It miss an ""account_revenue"" default property!","Es ist keine allgemeine Eigenschaft ""Konto Ertrag"" definiert",0
+error,account.invoice,0,You can not delete invoices that come from a sale!,Durch einen Verkauf generierte Rechnungen können nicht gelöscht werden!,0
+error,account.invoice,0,You cannot reset to draft an invoice generated by a sale.,Eine durch einen Verkauf generierte Rechnung kann nicht auf Entwurf zurückgesetzt werden.,0
+error,sale.line,0,"It misses an ""account Revenue"" default property!",Es ist keine Standardeigenschaft für das Erlöskonto definiert!,0
+error,sale.line,0,"It misses an ""Account Revenue"" on product ""%s""!","Es ist kein Erlöskonto für Artikel ""%s"" definiert!",0
 error,sale.line,0,The customer location is required!,Der Lagerort des Kunden muss eingegeben werden!,0
-error,sale.sale,0,Invoice and Packing addresses must be defined for the quotation.,Rechnungs- und Lieferadresse müssen für das Angebot angegeben werden.,0
+error,sale.sale,0,Invoice and Shipment addresses must be defined for the quotation.,Rechnungs- und Lieferadresse müssen für das Angebot eingetragen sein!,0
+error,sale.sale,0,"It misses an ""Account Receivable"" on the party ""%s""!","Es ist kein Forderungskonto für Partei ""%s"" definiert!",0
 error,sale.sale,0,Wrong combination of method!,Ungültige Kombination von Methoden!,0
+error,stock.packing.out,0,You cannot reset to draft a move generated by a sale.,Eine durch einen Verkauf generierte Bewegung kann nicht auf Entwurf zurückgesetzt werden.,0
+field,"account.invoice,sale_exception_state",0,Exception State,Vorbehalt Status,0
 field,"product.template,salable",0,Salable,Verkäuflich,0
 field,"product.template,sale_uom",0,Sale UOM,Einheit Verkauf,0
+field,"sale.handle.invoice.exception.ask,domain_invoices",0,Domain Invoices,Domain Rechnungen,0
+field,"sale.handle.invoice.exception.ask,recreate_invoices",0,Recreate Invoices,Rechnungen nachbilden,0
+field,"sale.handle.packing.exception.ask,domain_moves",0,Domain Moves,Domain Bewegungen,0
+field,"sale.handle.packing.exception.ask,recreate_moves",0,Recreate Moves,Bewegungen nachbilden,0
+field,"sale.line-account.invoice.line,invoice_line",0,Invoice Line,Rechnungsposition,0
+field,"sale.line-account.invoice.line,rec_name",0,Name,Name,0
+field,"sale.line-account.invoice.line,sale_line",0,Sale Line,Position Verkauf,0
+field,"sale.line-account.tax,line",0,Sale Line,Position Verkauf,0
+field,"sale.line-account.tax,rec_name",0,Name,Name,0
+field,"sale.line-account.tax,tax",0,Tax,Steuer,0
 field,"sale.line,amount",0,Amount,Betrag,0
-field,"sale.line,comment",0,Comment,Kommentar,0
 field,"sale.line,description",0,Description,Bezeichnung,0
+field,"sale.line-ignored-stock.move,move",0,Move,Bewegung,0
+field,"sale.line-ignored-stock.move,rec_name",0,Name,Name,0
+field,"sale.line-ignored-stock.move,sale_line",0,Sale Line,Position Verkauf,0
 field,"sale.line,invoice_lines",0,Invoice Lines,Rechnungspositionen,0
 field,"sale.line,move_done",0,Moves Done,Bewegungen erledigt,0
 field,"sale.line,move_exception",0,Moves Exception,Bewegungsvorbehalt,0
 field,"sale.line,moves",0,Moves,Bewegungen,0
-field,"sale.line,moves_ignored",0,Moves Ignored,Ignorierte Bewegungen,0
+field,"sale.line,moves_ignored",0,Ignored Moves,Ignorierte Bewegungen,0
+field,"sale.line,moves_recreated",0,Recreated Moves,Nachgebildete Bewegungen,0
+field,"sale.line,note",0,Note,Notiz,0
 field,"sale.line,product",0,Product,Artikel,0
-field,"sale.line,quantity",0,Quantity,Menge,0
+field,"sale.line,quantity",0,Quantity,Anzahl,0
+field,"sale.line,rec_name",0,Name,Name,0
+field,"sale.line-recreated-stock.move,move",0,Move,Bewegung,0
+field,"sale.line-recreated-stock.move,rec_name",0,Name,Name,0
+field,"sale.line-recreated-stock.move,sale_line",0,Sale Line,Position Verkauf,0
 field,"sale.line,sale",0,Sale,Verkauf,0
 field,"sale.line,sequence",0,Sequence,Sequenz,0
 field,"sale.line,taxes",0,Taxes,Steuern,0
@@ -23,30 +46,40 @@ field,"sale.line,type",0,Type,Typ,0
 field,"sale.line,unit",0,Unit,Einheit,0
 field,"sale.line,unit_digits",0,Unit Digits,Anzahl Stellen,0
 field,"sale.line,unit_price",0,Unit Price,Einzelpreis,0
+field,"sale.sale-account.invoice,invoice",0,Invoice,Rechnung,0
+field,"sale.sale-account.invoice,rec_name",0,Name,Name,0
+field,"sale.sale-account.invoice,sale",0,Sale,Verkauf,0
 field,"sale.sale,comment",0,Comment,Kommentar,0
 field,"sale.sale,company",0,Company,Unternehmen,0
-field,"sale.sale,contact_address",0,Contact Address,Kontaktadresse,0
 field,"sale.sale,currency",0,Currency,Währung,0
 field,"sale.sale,currency_digits",0,Currency Digits,Währung (signifikante Stellen),0
 field,"sale.sale,description",0,Description,Beschreibung,0
+field,"sale.sale-ignored-account.invoice,invoice",0,Invoice,Rechnung,0
+field,"sale.sale-ignored-account.invoice,rec_name",0,Name,Name,0
+field,"sale.sale-ignored-account.invoice,sale",0,Sale,Verkauf,0
 field,"sale.sale,invoice_address",0,Invoice Address,Rechnungsadresse,0
 field,"sale.sale,invoice_exception",0,Invoices Exception,Rechnungsvorbehalt,0
 field,"sale.sale,invoice_method",0,Invoice Method,Rechnungsstellung,0
 field,"sale.sale,invoice_paid",0,Invoices Paid,Bezahlte Rechnungen,0
 field,"sale.sale,invoices",0,Invoices,Rechnungen,0
-field,"sale.sale,invoices_ignored",0,Invoices Ignored,Ignorierte Rechnungen,0
+field,"sale.sale,invoices_ignored",0,Ignored Invoices,Ignorierte Rechnungen,0
+field,"sale.sale,invoices_recreated",0,Recreated Invoices,Nachgebildete Rechnungen,0
 field,"sale.sale,invoice_state",0,Invoice State,Rechnungsstatus,0
 field,"sale.sale,lines",0,Lines,Positionen,0
 field,"sale.sale,moves",0,Moves,Bewegungen,0
-field,"sale.sale,packing_address",0,Packing Address,Lieferadresse,0
-field,"sale.sale,packing_done",0,Packing Done,Lieferschein erledigt,0
-field,"sale.sale,packing_exception",0,Packings Exception,Lieferungsvorbehalt,0
-field,"sale.sale,packing_method",0,Packing Method,Liefermethode,0
-field,"sale.sale,packings",0,Packings,Lieferscheine,0
-field,"sale.sale,packing_state",0,Packing State,Lieferstatus,0
+field,"sale.sale,packing_address",0,Shipment Address,Lieferadresse,0
+field,"sale.sale,packing_done",0,Shipment Done,Gepackt,0
+field,"sale.sale,packing_exception",0,Shipments Exception,Lieferungsvorbehalt,0
+field,"sale.sale,packing_method",0,Shipment Method,Liefermethode,0
+field,"sale.sale,packings",0,Shipments,Lieferposten,0
+field,"sale.sale,packing_state",0,Shipment State,Lieferstatus,0
 field,"sale.sale,party",0,Party,Partei,0
 field,"sale.sale,party_lang",0,Party Language,Sprache Partei,0
 field,"sale.sale,payment_term",0,Payment Term,Zahlungsbedingung,0
+field,"sale.sale,rec_name",0,Name,Name,0
+field,"sale.sale-recreated-account.invoice,invoice",0,Invoice,Rechnung,0
+field,"sale.sale-recreated-account.invoice,rec_name",0,Name,Name,0
+field,"sale.sale-recreated-account.invoice,sale",0,Sale,Verkauf,0
 field,"sale.sale,reference",0,Reference,Referenz,0
 field,"sale.sale,sale_date",0,Sale Date,Verkaufsdatum,0
 field,"sale.sale,state",0,State,Status,0
@@ -55,71 +88,96 @@ field,"sale.sale,total_amount",0,Total,Gesamt,0
 field,"sale.sale,untaxed_amount",0,Untaxed,Netto,0
 field,"sale.sale,warehouse",0,Warehouse,Warenlager,0
 field,"stock.move,sale",0,Sale,Verkauf,0
-field,"stock.move,sale_line",0,unknown,unbekannt,0
+field,"stock.move,sale_exception_state",0,Exception State,Status Vorbehalt,0
+field,"stock.move,sale_line",0,,,0
+help,"sale.handle.invoice.exception.ask,recreate_invoices",0,The selected invoices will be recreated. The other ones will be ignored.,Die ausgewählten Rechnungen werden nachgebildet. Alle anderen werden ignoriert.,0
 model,"ir.action,name",act_sale_form_confirmed,Confirmed Sales,Aufträge (Verkäufe),0
 model,"ir.action,name",act_sale_form_draft,Draft Sales,Entwürfe (Verkäufe),0
+model,"ir.action,name",wizard_invoice_handle_exception,Handle Invoice Exception,Rechnungsvorbehalt bearbeiten,0
+model,"ir.action,name",wizard_packing_handle_exception,Handle Shipment Exception,Liefervorbehalt bearbeiten,0
+model,"ir.action,name",act_invoice_form,Invoices,Rechnungsausgang,0
+model,"ir.action,name",act_sale_form_new,New Sale,Neuer Verkauf,0
+model,"ir.action,name",act_open_customer,Parties associated to Sales,Parteien: Verkäufen zugeordnet,0
 model,"ir.action,name",act_sale_form_quotation,Quotation Sales,Angebote (Verkäufe),0
 model,"ir.action,name",report_sale,Sale,Verkauf drucken,0
 model,"ir.action,name",act_sale_form,Sales,Verkäufe,0
+model,"ir.action,name",act_sale_form2,Sales,Verkäufe,0
+model,"ir.action,name",act_packing_form,Shipments,Lieferposten,0
 model,"ir.sequence,name",sequence_sale,Sale,Verkauf,0
 model,"ir.sequence.type,name",sequence_type_sale,Sale,Verkauf,0
 model,"ir.ui.menu,name",menu_sale_form_confirmed,Confirmed Sales,Aufträge (Verkäufe),0
 model,"ir.ui.menu,name",menu_sale_form_draft,Draft Sales,Entwürfe (Verkäufe),0
+model,"ir.ui.menu,name",menu_sale_form_new,New Sale,Neuer Verkauf,0
+model,"ir.ui.menu,name",menu_customer,Parties associated to Sales,Parteien: Verkäufen zugeordnet,0
 model,"ir.ui.menu,name",menu_sale_form_quotation,Quotation Sales,Angebote (Verkäufe),0
 model,"ir.ui.menu,name",menu_sale,Sale Management,Verkauf,0
-model,"ir.ui.menu,name",menu_sale_form,Sales,Verkauf,0
+model,"ir.ui.menu,name",menu_sale_form,Sales,Verkäufe,0
 model,"res.group,name",group_sale,Sale,Verkauf,0
-model,"workflow.activity,name",sale_activity_cancel,Cancel,Abbrechen,0
+model,"sale.handle.invoice.exception.ask,name",0,Invoice Exception Ask,Rechnungsvorbehalt Nachfrage,0
+model,"sale.handle.packing.exception.ask,name",0,Shipment Exception Ask,Nachfrage Liefervorbehalt,0
+model,"sale.line-account.invoice.line,name",0,Sale Line - Invoice Line,Verkauf Position - Rechnung Zeile,0
+model,"sale.line-account.tax,name",0,Sale Line - Tax,Verkauf Position - Steuer,0
+model,"sale.line-ignored-stock.move,name",0,Sale Line - Ignored Move,Verkauf Position - Bewegung Ignoriert,0
+model,"sale.line,name",0,Sale Line,Verkauf Position,0
+model,"sale.line-recreated-stock.move,name",0,Sale Line - Recreated Move,Verkauf Position - Bewegung Nachgebildet,0
+model,"sale.sale-account.invoice,name",0,Sale - Invoice,Verkauf - Rechnung,0
+model,"sale.sale-ignored-account.invoice,name",0,Sale - Ignored Invoice,Verkauf - Rechnung Ignoriert,0
+model,"sale.sale,name",0,Sale,Verkauf,0
+model,"sale.sale-recreated-account.invoice,name",0,Sale - Recreated Invoice,Verkauf - Rechnung Nachgebildet,0
+model,"workflow.activity,name",sale_activity_cancel,Canceled,Annulliert,0
 model,"workflow.activity,name",sale_activity_confirmed,Confirmed,Beauftragt,0
 model,"workflow.activity,name",sale_activity_done,Done,Erledigt,0
 model,"workflow.activity,name",sale_activity_draft,Draft,Entwurf,0
-model,"workflow.activity,name",sale_activity_invoice_sale,Invoice,Rechnung,0
 model,"workflow.activity,name",sale_activity_invoice_sale_done,Invoice Done,Rechnung erledigt,0
 model,"workflow.activity,name",sale_activity_invoice_sale_exception,Invoice Exception,Rechnungsvorbehalt,0
 model,"workflow.activity,name",sale_activity_invoice_method,Invoice Method,Rechnungsstellung,0
 model,"workflow.activity,name",sale_activity_invoice_method_done,Invoice Method Done,Rechnungsstellung erledigt,0
-model,"workflow.activity,name",sale_activity_invoice_packing,Invoice Packing,Lieferschein Rechnung,0
-model,"workflow.activity,name",sale_activity_invoice_packing_done,Invoice Packing Done,Lieferschein Rechnung erledigt,0
-model,"workflow.activity,name",sale_activity_invoice_packing_exception,Invoice Packing Exception,Lieferschein Rechnung Vorbehalt,0
-model,"workflow.activity,name",sale_activity_invoice_packing_method,Invoice Packing Method,Lieferschein Rechnungsstellung,0
-model,"workflow.activity,name",sale_activity_invoice_packing_method_done,Invoice Packing Method Done,Lieferschein Rechnungsstellung erledigt,0
-model,"workflow.activity,name",sale_activity_packing,Packing,Lieferschein,0
-model,"workflow.activity,name",sale_activity_packing_exception,Packing Exception,Lieferschein Vorbehalt,0
-model,"workflow.activity,name",sale_activity_packing_invoice,Packing Invoice,Lieferschein Rechnung,0
-model,"workflow.activity,name",sale_activity_packing_invoice_done,Packing Invoice Done,Lieferschein Rechnung erledigt,0
-model,"workflow.activity,name",sale_activity_packing_invoice_exception,Packing Invoice Exception,Lieferschein Rechnung Vorbehalt,0
-model,"workflow.activity,name",sale_activity_packing_invoice_method,Packing Invoice Method,Lieferschein Rechnungsstellung,0
-model,"workflow.activity,name",sale_activity_packing_invoice_method_done,Packing Invoice Method Done,Lieferschein Rechnungsstellung erledigt,0
-model,"workflow.activity,name",sale_activity_packing_method,Packing Method,Liefermethode,0
-model,"workflow.activity,name",sale_activity_packing_method_done,Packing Method Done,Liefermethode erledigt,0
+model,"workflow.activity,name",sale_activity_invoice_packing,Invoice Shipment,Rechnung Lieferposten,0
+model,"workflow.activity,name",sale_activity_invoice_packing_done,Invoice Shipment Done,Rechnung Lieferposten erledigt,0
+model,"workflow.activity,name",sale_activity_invoice_packing_exception,Invoice Shipment Exception,Rechnung Lieferposten Vorbehalt,0
+model,"workflow.activity,name",sale_activity_invoice_packing_method,Invoice Shipment Method,Rechnung Liefermethode,0
+model,"workflow.activity,name",sale_activity_invoice_packing_method_done,Invoice Shipment Method Done,Rechnung Liefermethode erledigt,0
 model,"workflow.activity,name",sale_activity_quotation,Quotation,Angebot,0
+model,"workflow.activity,name",sale_activity_packing,Shipment,Lieferposten,0
+model,"workflow.activity,name",sale_activity_packing_exception,Shipment Exception,Lieferposten Vorbehalt,0
+model,"workflow.activity,name",sale_activity_packing_invoice,Shipment Invoice,Lieferposten Rechnung,0
+model,"workflow.activity,name",sale_activity_packing_invoice_done,Shipment Invoice Done,Lieferposten Rechnung erledigt,0
+model,"workflow.activity,name",sale_activity_packing_invoice_exception,Shipment Invoice Exception,Lieferposten Rechnung Vorbehalt,0
+model,"workflow.activity,name",sale_activity_packing_invoice_method,Shipment Invoice Method,Lieferposten Rechnungsmethode,0
+model,"workflow.activity,name",sale_activity_packing_invoice_method_done,Shipment Invoice Method Done,Lieferposten Rechnungsmethode erledigt,0
+model,"workflow.activity,name",sale_activity_packing_method,Shipment Method,Liefermethode,0
+model,"workflow.activity,name",sale_activity_packing_method_done,Shipment Method Done,Liefermethode erledigt,0
 model,"workflow.activity,name",sale_activity_waiting_invoice_sale,Waiting Invoice,Rechnung wartend,0
-model,"workflow.activity,name",sale_activity_waiting_invoice_packing,Waiting Invoice Packing,Rechnung Lieferschein wartend,0
-model,"workflow.activity,name",sale_activity_waiting_packing,Waiting Packing,Lieferschein wartend,0
-model,"workflow.activity,name",sale_activity_waiting_packing_invoice,Waiting Packing Invoice,Lieferschein Rechnung wartend,0
+model,"workflow.activity,name",sale_activity_waiting_invoice_packing,Waiting Invoice Shipment,Rechnung Lieferposten Wartend,0
+model,"workflow.activity,name",sale_activity_waiting_packing,Waiting Shipment,Lieferposten wartend,0
+model,"workflow.activity,name",sale_activity_waiting_packing_invoice,Waiting Shipment Invoice,Lieferposten Rechnung wartend,0
 model,"workflow,name",sale_workflow,Sale workflow,Workflow Verkauf,0
 odt,sale.sale,0,Amount,Betrag,0
 odt,sale.sale,0,Date:,Datum:,0
 odt,sale.sale,0,Description,Bezeichnung,0
 odt,sale.sale,0,Description:,Bezeichnung:,0
-odt,sale.sale,0,Draft Sale Order,Auftragsentwurf,0
+odt,sale.sale,0,Draft Sale Order,Auftrag (Entwurf),0
 odt,sale.sale,0,E-Mail:,E-Mail:,0
 odt,sale.sale,0,Phone:,Telefon:,0
-odt,sale.sale,0,Quantity,Menge,0
+odt,sale.sale,0,Quantity,Anzahl,0
 odt,sale.sale,0,Quotation N°:,Angebot Nr.:,0
-odt,sale.sale,0,Sale Order N°:,Verkaufsauftrag Nr.:,0
+odt,sale.sale,0,Sale Order N°:,Auftrag Nr.:,0
 odt,sale.sale,0,Taxes,Steuern,0
 odt,sale.sale,0,Taxes:,Steuern:,0
 odt,sale.sale,0,Total:,Gesamt:,0
 odt,sale.sale,0,Total (excl. taxes):,Netto:,0
 odt,sale.sale,0,Unit Price,Einzelpreis,0
 odt,sale.sale,0,VAT:,USt:,0
+selection,"account.invoice,sale_exception_state",0,,,0
+selection,"account.invoice,sale_exception_state",0,Ignored,Ignoriert,0
+selection,"account.invoice,sale_exception_state",0,Recreated,Nachgebildet,0
+selection,"sale.line,type",0,Comment,Kommentar,0
 selection,"sale.line,type",0,Line,Position,0
 selection,"sale.line,type",0,Subtotal,Zwischensumme,0
 selection,"sale.line,type",0,Title,Überschrift,0
 selection,"sale.sale,invoice_method",0,Manual,Manuell,0
 selection,"sale.sale,invoice_method",0,On Order Confirmed,Bei Beauftragung,0
-selection,"sale.sale,invoice_method",0,On Packing Sent,Bei Versand,0
+selection,"sale.sale,invoice_method",0,On Shipment Sent,Bei Versand,0
 selection,"sale.sale,invoice_state",0,Exception,Vorbehalt,0
 selection,"sale.sale,invoice_state",0,None,Kein,0
 selection,"sale.sale,invoice_state",0,Paid,Bezahlt,0
@@ -131,24 +189,47 @@ selection,"sale.sale,packing_state",0,Exception,Vorbehalt,0
 selection,"sale.sale,packing_state",0,None,Kein,0
 selection,"sale.sale,packing_state",0,Sent,Gesendet,0
 selection,"sale.sale,packing_state",0,Waiting,Wartend,0
-selection,"sale.sale,state",0,Cancel,Abbrechen,0
+selection,"sale.sale,state",0,Canceled,Annulliert,0
 selection,"sale.sale,state",0,Confirmed,Beauftragt,0
 selection,"sale.sale,state",0,Done,Erledigt,0
 selection,"sale.sale,state",0,Draft,Entwurf,0
 selection,"sale.sale,state",0,Quotation,Angebot,0
+selection,"stock.move,sale_exception_state",0,,,0
+selection,"stock.move,sale_exception_state",0,Ignored,Ignoriert,0
+selection,"stock.move,sale_exception_state",0,Recreated,Nachgebildet,0
 view,product.product,0,Customers,Kunden,0
+view,product.template,0,Customers,Kunden,0
+view,sale.handle.invoice.exception.ask,0,Choose invoices to duplicate,Auswahl Rechnungen für Duplizierung,0
+view,sale.handle.invoice.exception.ask,0,Choose invoices to recreate,Rechnungen zum Nachbilden auswählen,0
+view,sale.handle.invoice.exception.ask,0,Handle Invoice Exception,Rechnungsvorbehalt bearbeiten,0
+view,sale.handle.packing.exception.ask,0,Choose move to duplicate,Auswahl Bewegungen für Duplizierung,0
+view,sale.handle.packing.exception.ask,0,Choose move to recreate,Bewegungen zum Nachbilden auswählen,0
+view,sale.handle.packing.exception.ask,0,Duplicate Moves,Bewegungen duplizieren,0
+view,sale.handle.packing.exception.ask,0,Handle packing Exception,Liefervorbehalt bearbeiten,0
+view,sale.handle.packing.exception.ask,0,Recreate Moves,Bewegungen nachbilden,0
+view,sale.line,0,General,Allgemein,0
+view,sale.line,0,Notes,Notizen,0
 view,sale.line,0,Products,Artikel,0
 view,sale.line,0,Sale Line,Position Verkauf,0
 view,sale.line,0,Sale Lines,Positionen Verkauf,0
-view,sale.sale,0,Cancel,Abbrechen,0
-view,sale.sale,0,Confirm,Beauftragen,0
+view,sale.sale,0,Cancel,Annullieren,0
+view,sale.sale,0,Confirm,Bestätigen,0
 view,sale.sale,0,Draft,Entwurf,0
+view,sale.sale,0,Handle Invoice Exception,Rechnungsvorbehalt bearbeiten,0
+view,sale.sale,0,Handle Packing Exception,Liefervorbehalt bearbeiten,0
+view,sale.sale,0,Handle Shipment Exception,Liefervorbehalt bearbeiten,0
 view,sale.sale,0,Ignore Invoice Exception,Rechnungsvorbehalt ignorieren,0
 view,sale.sale,0,Ignore Packing Exception,Verpackungsvorbehalt ignorieren,0
 view,sale.sale,0,Invoices,Rechnungen,0
 view,sale.sale,0,Lines,Positionen,0
+view,sale.sale,0,Moves,Bewegungen,0
 view,sale.sale,0,Other Info,Sonstiges,0
-view,sale.sale,0,Packings,Lieferscheine,0
+view,sale.sale,0,Packings,Lieferposten,0
 view,sale.sale,0,Quotation,Angebot,0
 view,sale.sale,0,Sale,Verkauf,0
 view,sale.sale,0,Sales,Verkäufe,0
+view,sale.sale,0,Shipments,Lieferposten,0
+wizard_button,"sale.handle.invoice.exception,init,end",0,Cancel,Abbrechen,0
+wizard_button,"sale.handle.invoice.exception,init,ok",0,Ok,OK,0
+wizard_button,"sale.handle.packing.exception,init,end",0,Cancel,Abbrechen,0
+wizard_button,"sale.handle.packing.exception,init,ok",0,Ok,OK,0
diff --git a/es_CO.csv b/es_CO.csv
new file mode 100644
index 0000000..93e9374
--- /dev/null
+++ b/es_CO.csv
@@ -0,0 +1,231 @@
+type,name,res_id,src,value,fuzzy
+error,account.invoice,0,You can not delete invoices that come from a sale!,No puede borrar la factura proveniente de una venta!,0
+error,account.invoice,0,You cannot reset to draft an invoice generated by a sale.,No puede regresar a borrador una factura generada por una venta.,0
+error,sale.line,0,"It misses an ""account Revenue"" default property!","¡Hace falta una propiedad predeterminada de ""cuenta de ganancias""!",0
+error,sale.line,0,"It misses an ""Account Revenue"" on product ""%s""!","Falta un ""cuenta de ingresos"" para el producto ""%s""!",0
+error,sale.line,0,The customer location is required!,Es indispensable el lugar del cliente!,0
+error,sale.sale,0,Invoice and Shipment addresses must be defined for the quotation.,Factura y dirección de Envío debe ser definida por el presupuesto.,0
+error,sale.sale,0,"It misses an ""Account Receivable"" on the party ""%s""!","Falta una ""cuenta de ingresos"" en la partida ""%s""!",0
+error,sale.sale,0,Wrong combination of method!,Combinación o método erróneos!,0
+error,stock.packing.out,0,You cannot reset to draft a move generated by a sale.,No puede regresar a borrador un movimiento generado por una venta.,0
+field,"account.invoice,sale_exception_state",0,Exception State,Estado de Excepción,0
+field,"product.template,salable",0,Salable,De fácil venta,0
+field,"product.template,sale_uom",0,Sale UOM,UdM de Venta,0
+field,"sale.handle.invoice.exception.ask,domain_invoices",0,Domain Invoices,Rango de facturas,0
+field,"sale.handle.invoice.exception.ask,recreate_invoices",0,Recreate Invoices,Rehacer factura,0
+field,"sale.handle.packing.exception.ask,domain_moves",0,Domain Moves,Rango de movimientos,0
+field,"sale.handle.packing.exception.ask,recreate_moves",0,Recreate Moves,Rehacer movimientos,0
+field,"sale.line-account.invoice.line,invoice_line",0,Invoice Line,Línea de Factura,0
+field,"sale.line-account.invoice.line,rec_name",0,Name,Nombre,0
+field,"sale.line-account.invoice.line,sale_line",0,Sale Line,Línea de Venta,0
+field,"sale.line-account.tax,line",0,Sale Line,Línea de Venta,0
+field,"sale.line-account.tax,rec_name",0,Name,Nombre,0
+field,"sale.line-account.tax,tax",0,Tax,Impuesto,0
+field,"sale.line,amount",0,Amount,Cantidad,0
+field,"sale.line,description",0,Description,Descripción,0
+field,"sale.line-ignored-stock.move,move",0,Move,Movimiento,0
+field,"sale.line-ignored-stock.move,rec_name",0,Name,Nombre,0
+field,"sale.line-ignored-stock.move,sale_line",0,Sale Line,Línea de Venta,0
+field,"sale.line,invoice_lines",0,Invoice Lines,Líneas de Factura,0
+field,"sale.line,move_done",0,Moves Done,Movimientos Hechos,0
+field,"sale.line,move_exception",0,Moves Exception,Exepción de Movimientos,0
+field,"sale.line,moves",0,Moves,Movimientos,0
+field,"sale.line,moves_ignored",0,Ignored Moves,Movimientos Ignorados,0
+field,"sale.line,moves_recreated",0,Recreated Moves,Rehacer Movimientos,0
+field,"sale.line,note",0,Note,Nota,0
+field,"sale.line,product",0,Product,Producto,0
+field,"sale.line,quantity",0,Quantity,Cantidad,0
+field,"sale.line,rec_name",0,Name,Nombre,0
+field,"sale.line-recreated-stock.move,move",0,Move,Movimiento,0
+field,"sale.line-recreated-stock.move,rec_name",0,Name,Nombre,0
+field,"sale.line-recreated-stock.move,sale_line",0,Sale Line,Línea de Venta,0
+field,"sale.line,sale",0,Sale,Venta,0
+field,"sale.line,sequence",0,Sequence,Secuencia,0
+field,"sale.line,taxes",0,Taxes,Impuestos,0
+field,"sale.line,type",0,Type,Tipo,0
+field,"sale.line,unit",0,Unit,Unidad,0
+field,"sale.line,unit_digits",0,Unit Digits,Dígitos de Unidad,0
+field,"sale.line,unit_price",0,Unit Price,Precio Unitario,0
+field,"sale.sale-account.invoice,invoice",0,Invoice,Factura,0
+field,"sale.sale-account.invoice,rec_name",0,Name,Nombre,0
+field,"sale.sale-account.invoice,sale",0,Sale,Ventas,0
+field,"sale.sale,comment",0,Comment,Comentario,0
+field,"sale.sale,company",0,Company,Compañía,0
+field,"sale.sale,currency",0,Currency,Moneda,0
+field,"sale.sale,currency_digits",0,Currency Digits,Dígitos de Moneda,0
+field,"sale.sale,description",0,Description,Descripción,0
+field,"sale.sale-ignored-account.invoice,invoice",0,Invoice,Factura,0
+field,"sale.sale-ignored-account.invoice,rec_name",0,Name,Nombre,0
+field,"sale.sale-ignored-account.invoice,sale",0,Sale,Ventas,0
+field,"sale.sale,invoice_address",0,Invoice Address,Dirección de Facturación,0
+field,"sale.sale,invoice_exception",0,Invoices Exception,Excepción de Facturación,0
+field,"sale.sale,invoice_method",0,Invoice Method,Método de Facturación,0
+field,"sale.sale,invoice_paid",0,Invoices Paid,Facturas Pagadas,0
+field,"sale.sale,invoices",0,Invoices,Facturas,0
+field,"sale.sale,invoices_ignored",0,Ignored Invoices,Facturas Ignoradas,0
+field,"sale.sale,invoices_recreated",0,Recreated Invoices,Rehacer facturas,0
+field,"sale.sale,invoice_state",0,Invoice State,Estado de Factura,0
+field,"sale.sale,lines",0,Lines,Líneas,0
+field,"sale.sale,moves",0,Moves,Movimientos,0
+field,"sale.sale,packing_address",0,Shipment Address,Dirección de envío,0
+field,"sale.sale,packing_done",0,Shipment Done,Envío Finalizado,0
+field,"sale.sale,packing_exception",0,Shipments Exception,Excepción de Envíos,0
+field,"sale.sale,packing_method",0,Shipment Method,Método de Envío,0
+field,"sale.sale,packings",0,Shipments,Envíos,0
+field,"sale.sale,packing_state",0,Shipment State,Estado de Envío,0
+field,"sale.sale,party",0,Party,Tercero,0
+field,"sale.sale,party_lang",0,Party Language,Idioma del Tercero,0
+field,"sale.sale,payment_term",0,Payment Term,Término de Pago,0
+field,"sale.sale,rec_name",0,Name,Nombre,0
+field,"sale.sale-recreated-account.invoice,invoice",0,Invoice,Factura,0
+field,"sale.sale-recreated-account.invoice,rec_name",0,Name,Nombre,0
+field,"sale.sale-recreated-account.invoice,sale",0,Sale,Ventas,0
+field,"sale.sale,reference",0,Reference,Referencia,0
+field,"sale.sale,sale_date",0,Sale Date,Fecha de Venta,0
+field,"sale.sale,state",0,State,Estado,0
+field,"sale.sale,tax_amount",0,Tax,Impuesto,0
+field,"sale.sale,total_amount",0,Total,Total,0
+field,"sale.sale,untaxed_amount",0,Untaxed,Sin Impuesto,0
+field,"sale.sale,warehouse",0,Warehouse,Depósito,0
+field,"stock.move,sale",0,Sale,Venta,0
+field,"stock.move,sale_exception_state",0,Exception State,Estado Excepción,0
+field,"stock.move,sale_line",0,,,0
+help,"sale.handle.invoice.exception.ask,recreate_invoices",0,The selected invoices will be recreated. The other ones will be ignored.,La factura seleccionada será recreada. Las otras serán ignoradas.,0
+model,"ir.action,name",act_sale_form_confirmed,Confirmed Sales,Ventas Confirmadas,0
+model,"ir.action,name",act_sale_form_draft,Draft Sales,Ventas en Borrador,0
+model,"ir.action,name",wizard_invoice_handle_exception,Handle Invoice Exception,Excepción de manejo de factura,0
+model,"ir.action,name",wizard_packing_handle_exception,Handle Shipment Exception,Excepción de manejo de envío,0
+model,"ir.action,name",act_invoice_form,Invoices,Facturas,0
+model,"ir.action,name",act_sale_form_new,New Sale,Nueva venta,0
+model,"ir.action,name",act_open_customer,Parties associated to Sales,Terceros asociados a Ventas,0
+model,"ir.action,name",act_sale_form_quotation,Quotation Sales,Ventas Cotizadas,0
+model,"ir.action,name",report_sale,Sale,Venta,0
+model,"ir.action,name",act_sale_form,Sales,Ventas,0
+model,"ir.action,name",act_sale_form2,Sales,Ventas,0
+model,"ir.action,name",act_packing_form,Shipments,Envíos,0
+model,"ir.sequence,name",sequence_sale,Sale,Venta,0
+model,"ir.sequence.type,name",sequence_type_sale,Sale,Venta,0
+model,"ir.ui.menu,name",menu_sale_form_confirmed,Confirmed Sales,Ventas Confirmadas,0
+model,"ir.ui.menu,name",menu_sale_form_draft,Draft Sales,Ventas en Borrador,0
+model,"ir.ui.menu,name",menu_sale_form_new,New Sale,Nueva venta,0
+model,"ir.ui.menu,name",menu_customer,Parties associated to Sales,Terceros asociados a Ventas,0
+model,"ir.ui.menu,name",menu_sale_form_quotation,Quotation Sales,Ventas Cotizadas,0
+model,"ir.ui.menu,name",menu_sale,Sale Management,Gestión de Ventas,0
+model,"ir.ui.menu,name",menu_sale_form,Sales,Ventas,0
+model,"res.group,name",group_sale,Sale,Venta,0
+model,"sale.handle.invoice.exception.ask,name",0,Invoice Exception Ask,Pregunta de Excepción de Factura,0
+model,"sale.handle.packing.exception.ask,name",0,Shipment Exception Ask,Pregunta de Excepción de Envío,0
+model,"sale.line-account.invoice.line,name",0,Sale Line - Invoice Line,Línea de Venta - Línea de Factura,0
+model,"sale.line-account.tax,name",0,Sale Line - Tax,Línea de Venta - Impuesto,0
+model,"sale.line-ignored-stock.move,name",0,Sale Line - Ignored Move,Línea de Venta - Movimiento Ignorado,0
+model,"sale.line,name",0,Sale Line,Línea de Venta,0
+model,"sale.line-recreated-stock.move,name",0,Sale Line - Recreated Move,Línea de Venta - Movimiento Recreado,0
+model,"sale.sale-account.invoice,name",0,Sale - Invoice,Venta - Factura,0
+model,"sale.sale-ignored-account.invoice,name",0,Sale - Ignored Invoice,Venta - Factura Ignorada,0
+model,"sale.sale,name",0,Sale,Ventas,0
+model,"sale.sale-recreated-account.invoice,name",0,Sale - Recreated Invoice,Venta - Factura Recreada,0
+model,"workflow.activity,name",sale_activity_cancel,Canceled,Cancelado,0
+model,"workflow.activity,name",sale_activity_confirmed,Confirmed,Confirmado,0
+model,"workflow.activity,name",sale_activity_done,Done,Hecho,0
+model,"workflow.activity,name",sale_activity_draft,Draft,Borrador,0
+model,"workflow.activity,name",sale_activity_invoice_sale_done,Invoice Done,Factura Hecha,0
+model,"workflow.activity,name",sale_activity_invoice_sale_exception,Invoice Exception,Excepción de Factura,0
+model,"workflow.activity,name",sale_activity_invoice_method,Invoice Method,Método de Facturación,0
+model,"workflow.activity,name",sale_activity_invoice_method_done,Invoice Method Done,Método de Factura Concluido,0
+model,"workflow.activity,name",sale_activity_invoice_packing,Invoice Shipment,Envío de Factura,0
+model,"workflow.activity,name",sale_activity_invoice_packing_done,Invoice Shipment Done,Envío de Factura Concluido,0
+model,"workflow.activity,name",sale_activity_invoice_packing_exception,Invoice Shipment Exception,Excepción de Envío de Factura,0
+model,"workflow.activity,name",sale_activity_invoice_packing_method,Invoice Shipment Method,Método de Envío de Factura,0
+model,"workflow.activity,name",sale_activity_invoice_packing_method_done,Invoice Shipment Method Done,Método de Envío de Factura Concluido,0
+model,"workflow.activity,name",sale_activity_quotation,Quotation,Cotización,0
+model,"workflow.activity,name",sale_activity_packing,Shipment,Envío,0
+model,"workflow.activity,name",sale_activity_packing_exception,Shipment Exception,Excepción de Envío,0
+model,"workflow.activity,name",sale_activity_packing_invoice,Shipment Invoice,Envío de Factura,0
+model,"workflow.activity,name",sale_activity_packing_invoice_done,Shipment Invoice Done,Envío de Factura Concluido,0
+model,"workflow.activity,name",sale_activity_packing_invoice_exception,Shipment Invoice Exception,Excepción de Envío de Factura,0
+model,"workflow.activity,name",sale_activity_packing_invoice_method,Shipment Invoice Method,Método Envío de Factura,0
+model,"workflow.activity,name",sale_activity_packing_invoice_method_done,Shipment Invoice Method Done,Método de Envío de Factura Concluido,0
+model,"workflow.activity,name",sale_activity_packing_method,Shipment Method,Método de Envío,0
+model,"workflow.activity,name",sale_activity_packing_method_done,Shipment Method Done,Método de Envío Concluido,0
+model,"workflow.activity,name",sale_activity_waiting_invoice_sale,Waiting Invoice,Esperando Factura,0
+model,"workflow.activity,name",sale_activity_waiting_invoice_packing,Waiting Invoice Shipment,Esperando Envío de Factura,0
+model,"workflow.activity,name",sale_activity_waiting_packing,Waiting Shipment,Esperando Envío,0
+model,"workflow.activity,name",sale_activity_waiting_packing_invoice,Waiting Shipment Invoice,Esperando Envío de Factura,0
+model,"workflow,name",sale_workflow,Sale workflow,Flujo de Trabajo de Ventas,0
+odt,sale.sale,0,Amount,Cantidad,0
+odt,sale.sale,0,Date:,Fecha:,0
+odt,sale.sale,0,Description,Descripción,0
+odt,sale.sale,0,Description:,Descripción:,0
+odt,sale.sale,0,Draft Sale Order,Orden de Venta en Borrador,0
+odt,sale.sale,0,E-Mail:,Correo electrónico:,0
+odt,sale.sale,0,Phone:,Teléfono:,0
+odt,sale.sale,0,Quantity,Cantidad,0
+odt,sale.sale,0,Quotation N°:,Cotización Nº:,0
+odt,sale.sale,0,Sale Order N°:,Orden de Venta Nº:,0
+odt,sale.sale,0,Taxes,Impuestos,0
+odt,sale.sale,0,Taxes:,Impuestos:,0
+odt,sale.sale,0,Total:,Total:,0
+odt,sale.sale,0,Total (excl. taxes):,Total (sin impuestos):,0
+odt,sale.sale,0,Unit Price,Precio Unitario,0
+odt,sale.sale,0,VAT:,VAT:,0
+selection,"account.invoice,sale_exception_state",0,,,0
+selection,"account.invoice,sale_exception_state",0,Ignored,Ignorado,0
+selection,"account.invoice,sale_exception_state",0,Recreated,Rehecho,0
+selection,"sale.line,type",0,Comment,Comentario,0
+selection,"sale.line,type",0,Line,Línea,0
+selection,"sale.line,type",0,Subtotal,Subtotal,0
+selection,"sale.line,type",0,Title,Título,0
+selection,"sale.sale,invoice_method",0,Manual,Manual,0
+selection,"sale.sale,invoice_method",0,On Order Confirmed,Al Confirmar la Orden,0
+selection,"sale.sale,invoice_method",0,On Shipment Sent,Enviado,0
+selection,"sale.sale,invoice_state",0,Exception,Excepción,0
+selection,"sale.sale,invoice_state",0,None,Ninguno,0
+selection,"sale.sale,invoice_state",0,Paid,Pagado,0
+selection,"sale.sale,invoice_state",0,Waiting,En Espera,0
+selection,"sale.sale,packing_method",0,Manual,Manual,0
+selection,"sale.sale,packing_method",0,On Invoice Paid,Al Pagar,0
+selection,"sale.sale,packing_method",0,On Order Confirmed,Al Confirmar la Orden,0
+selection,"sale.sale,packing_state",0,Exception,Excepción,0
+selection,"sale.sale,packing_state",0,None,Ninguno,0
+selection,"sale.sale,packing_state",0,Sent,Enviado,0
+selection,"sale.sale,packing_state",0,Waiting,En Espera,0
+selection,"sale.sale,state",0,Canceled,Cancelado,0
+selection,"sale.sale,state",0,Confirmed,Confirmado,0
+selection,"sale.sale,state",0,Done,Hecho,0
+selection,"sale.sale,state",0,Draft,Borrador,0
+selection,"sale.sale,state",0,Quotation,Cotización,0
+selection,"stock.move,sale_exception_state",0,,,0
+selection,"stock.move,sale_exception_state",0,Ignored,Ignore,0
+selection,"stock.move,sale_exception_state",0,Recreated,Rehacer,0
+view,product.product,0,Customers,Clientes,0
+view,product.template,0,Customers,Clientes,0
+view,sale.handle.invoice.exception.ask,0,Choose invoices to recreate,Escoja una factura a rehacer,0
+view,sale.handle.invoice.exception.ask,0,Handle Invoice Exception,Excepción de Manejo de Factura,0
+view,sale.handle.packing.exception.ask,0,Choose move to recreate,Escoja un movimiento a rehacer,0
+view,sale.handle.packing.exception.ask,0,Handle packing Exception,Maneje Excepciones de empaquetado,0
+view,sale.handle.packing.exception.ask,0,Recreate Moves,Recrear movimientos,0
+view,sale.line,0,General,General,0
+view,sale.line,0,Notes,Notas,0
+view,sale.line,0,Products,Productos,0
+view,sale.line,0,Sale Line,Línea de Venta,0
+view,sale.line,0,Sale Lines,Líneas de Venta,0
+view,sale.sale,0,Cancel,Cancelar,0
+view,sale.sale,0,Confirm,Confirmar,0
+view,sale.sale,0,Draft,Borrador,0
+view,sale.sale,0,Handle Invoice Exception,Excepción que maneja factura,0
+view,sale.sale,0,Handle Shipment Exception,Excepción que maneja envío,0
+view,sale.sale,0,Ignore Invoice Exception,Ignorar excepción en Factura,0
+view,sale.sale,0,Ignore Packing Exception,Ignorar excepción en Empaque,0
+view,sale.sale,0,Invoices,Facturas,0
+view,sale.sale,0,Lines,Líneas,0
+view,sale.sale,0,Moves,Movimientos,0
+view,sale.sale,0,Other Info,Información Adicional,0
+view,sale.sale,0,Packings,Empaques,0
+view,sale.sale,0,Quotation,Cotización,0
+view,sale.sale,0,Sale,Venta,0
+view,sale.sale,0,Sales,Ventas,0
+view,sale.sale,0,Shipments,Empaques,0
+wizard_button,"sale.handle.invoice.exception,init,end",0,Cancel,Cancelar,0
+wizard_button,"sale.handle.invoice.exception,init,ok",0,Ok,Aceptar,0
+wizard_button,"sale.handle.packing.exception,init,end",0,Cancel,Cancelar,0
+wizard_button,"sale.handle.packing.exception,init,ok",0,Ok,Aceptar,0
diff --git a/es_ES.csv b/es_ES.csv
index 00407ac..5604b77 100644
--- a/es_ES.csv
+++ b/es_ES.csv
@@ -1,120 +1,231 @@
 type,name,res_id,src,value,fuzzy
-error,account.invoice,0,You can not delete invoices that comes from a sale!,No puede borrar facturas que provenientes de una venta!,0
-error,sale.line,0,"It miss an ""account_revenue"" default property!","Hace falta una propiedad predeterminada de ""cuenta_de_ganancias""!",0
-error,sale.line,0,The customer location is required!,Es indispensable el lugar del cliente!,0
-error,sale.sale,0,Wrong combination of method!,Combinación o método erróneos!,0
-field,"product.template,salable",0,Salable,De fácil venta,0
-field,"product.template,sale_uom",0,Sale UOM,UdM de Venta,0
+error,account.invoice,0,You can not delete invoices that come from a sale!,No puede borrar facturas provinientes de una venta,0
+error,account.invoice,0,You cannot reset to draft an invoice generated by a sale.,No puede restablecer a borrador una factura generada por una venta.,0
+error,sale.line,0,"It misses an ""account Revenue"" default property!",Falta una propiedad predeterminada de «cuenta de ingresos»,0
+error,sale.line,0,"It misses an ""Account Revenue"" on product ""%s""!",Falta una «cuenta de ingresos» en el producto «%s»,0
+error,sale.line,0,The customer location is required!,Se necesita la ubicación del cliente,0
+error,sale.sale,0,Invoice and Shipment addresses must be defined for the quotation.,Las direcciones de facturación y de envío debe ser definida para el presupuesto.,0
+error,sale.sale,0,"It misses an ""Account Receivable"" on the party ""%s""!",Falta una «cuenta de ingresos» en el tercero «%s»,0
+error,sale.sale,0,Wrong combination of method!,Combinación inválida de métodos,0
+error,stock.packing.out,0,You cannot reset to draft a move generated by a sale.,No puede restablecer a borrador un movimiento generado por una venta.,0
+field,"account.invoice,sale_exception_state",0,Exception State,Estado de excepción,0
+field,"product.template,salable",0,Salable,Vendible,0
+field,"product.template,sale_uom",0,Sale UOM,UdM de venta,0
+field,"sale.handle.invoice.exception.ask,domain_invoices",0,Domain Invoices,Facturas del dominio,0
+field,"sale.handle.invoice.exception.ask,recreate_invoices",0,Recreate Invoices,Rehacer facturas,0
+field,"sale.handle.packing.exception.ask,domain_moves",0,Domain Moves,Movimientos de dominio,0
+field,"sale.handle.packing.exception.ask,recreate_moves",0,Recreate Moves,Rehacer movimientos,0
+field,"sale.line-account.invoice.line,invoice_line",0,Invoice Line,Línea de factura,0
+field,"sale.line-account.invoice.line,rec_name",0,Name,Nombre,0
+field,"sale.line-account.invoice.line,sale_line",0,Sale Line,Línea de venta,0
+field,"sale.line-account.tax,line",0,Sale Line,Línea de venta,0
+field,"sale.line-account.tax,rec_name",0,Name,Nombre,0
+field,"sale.line-account.tax,tax",0,Tax,Impuesto,0
 field,"sale.line,amount",0,Amount,Cantidad,0
-field,"sale.line,comment",0,Comment,Comentario,0
 field,"sale.line,description",0,Description,Descripción,0
-field,"sale.line,invoice_lines",0,Invoice Lines,Líneas de Factura,0
-field,"sale.line,move_done",0,Moves Done,Movimientos Hechos,0
-field,"sale.line,move_exception",0,Moves Exception,Exepción de Movimientos,0
+field,"sale.line-ignored-stock.move,move",0,Move,Movimiento,0
+field,"sale.line-ignored-stock.move,rec_name",0,Name,Nombre,0
+field,"sale.line-ignored-stock.move,sale_line",0,Sale Line,Línea de venta,0
+field,"sale.line,invoice_lines",0,Invoice Lines,Líneas de factura,0
+field,"sale.line,move_done",0,Moves Done,Movimientos hechos,0
+field,"sale.line,move_exception",0,Moves Exception,Exepción de movimientos,0
 field,"sale.line,moves",0,Moves,Movimientos,0
-field,"sale.line,moves_ignored",0,Moves Ignored,Movimientos Ignorados,0
+field,"sale.line,moves_ignored",0,Ignored Moves,Movimientos ignorados,0
+field,"sale.line,moves_recreated",0,Recreated Moves,Rehacer movimientos,0
+field,"sale.line,note",0,Note,Nota,0
 field,"sale.line,product",0,Product,Producto,0
 field,"sale.line,quantity",0,Quantity,Cantidad,0
+field,"sale.line,rec_name",0,Name,Nombre,0
+field,"sale.line-recreated-stock.move,move",0,Move,Movimiento,0
+field,"sale.line-recreated-stock.move,rec_name",0,Name,Nombre,0
+field,"sale.line-recreated-stock.move,sale_line",0,Sale Line,Línea de venta,0
 field,"sale.line,sale",0,Sale,Venta,0
 field,"sale.line,sequence",0,Sequence,Secuencia,0
 field,"sale.line,taxes",0,Taxes,Impuestos,0
 field,"sale.line,type",0,Type,Tipo,0
 field,"sale.line,unit",0,Unit,Unidad,0
-field,"sale.line,unit_digits",0,Unit Digits,Dígitos de Unidad,0
-field,"sale.line,unit_price",0,Unit Price,Precio Unitario,0
+field,"sale.line,unit_digits",0,Unit Digits,Dígitos de la unidad,0
+field,"sale.line,unit_price",0,Unit Price,Precio unitario,0
+field,"sale.sale-account.invoice,invoice",0,Invoice,Factura,0
+field,"sale.sale-account.invoice,rec_name",0,Name,Nombre,0
+field,"sale.sale-account.invoice,sale",0,Sale,Venta,0
 field,"sale.sale,comment",0,Comment,Comentario,0
-field,"sale.sale,company",0,Company,Compañía,0
-field,"sale.sale,contact_address",0,Contact Address,Dirección de Contacto,0
-field,"sale.sale,currency",0,Currency,Moneda,0
-field,"sale.sale,currency_digits",0,Currency Digits,Dígitos de Moneda,0
+field,"sale.sale,company",0,Company,Empresa,0
+field,"sale.sale,currency",0,Currency,Divisa,0
+field,"sale.sale,currency_digits",0,Currency Digits,Dígitos de la divisa,0
 field,"sale.sale,description",0,Description,Descripción,0
-field,"sale.sale,invoice_address",0,Invoice Address,Dirección de Facturación,0
-field,"sale.sale,invoice_exception",0,Invoices Exception,Excepción de Facturación,0
-field,"sale.sale,invoice_method",0,Invoice Method,Método de Facturación,0
-field,"sale.sale,invoice_paid",0,Invoices Paid,Facturas Pagadas,0
+field,"sale.sale-ignored-account.invoice,invoice",0,Invoice,Factura,0
+field,"sale.sale-ignored-account.invoice,rec_name",0,Name,Nombre,0
+field,"sale.sale-ignored-account.invoice,sale",0,Sale,Venta,0
+field,"sale.sale,invoice_address",0,Invoice Address,Dirección de facturación,0
+field,"sale.sale,invoice_exception",0,Invoices Exception,Excepción de facturación,0
+field,"sale.sale,invoice_method",0,Invoice Method,Método de facturación,0
+field,"sale.sale,invoice_paid",0,Invoices Paid,Facturas pagadas,0
 field,"sale.sale,invoices",0,Invoices,Facturas,0
-field,"sale.sale,invoices_ignored",0,Invoices Ignored,Facturas Ignoradas,0
-field,"sale.sale,invoice_state",0,Invoice State,Estado de Factura,0
+field,"sale.sale,invoices_ignored",0,Ignored Invoices,Facturas ignoradas,0
+field,"sale.sale,invoices_recreated",0,Recreated Invoices,Rehacer facturas,0
+field,"sale.sale,invoice_state",0,Invoice State,Estado de factura,0
 field,"sale.sale,lines",0,Lines,Líneas,0
 field,"sale.sale,moves",0,Moves,Movimientos,0
-field,"sale.sale,packing_address",0,Packing Address,Dirección de empaque,0
-field,"sale.sale,packing_done",0,Packing Done,Empacado Finalizado,0
-field,"sale.sale,packing_exception",0,Packings Exception,Excepción de Empaques,0
-field,"sale.sale,packing_method",0,Packing Method,Método de Empacado,0
-field,"sale.sale,packings",0,Packings,Empaques,0
-field,"sale.sale,packing_state",0,Packing State,Estado de Empaque,0
+field,"sale.sale,packing_address",0,Shipment Address,Dirección de envío,0
+field,"sale.sale,packing_done",0,Shipment Done,Envío realizado,0
+field,"sale.sale,packing_exception",0,Shipments Exception,Excepción de envíos,0
+field,"sale.sale,packing_method",0,Shipment Method,Método de envío,0
+field,"sale.sale,packings",0,Shipments,Envíos,0
+field,"sale.sale,packing_state",0,Shipment State,Estado de envío,0
 field,"sale.sale,party",0,Party,Tercero,0
-field,"sale.sale,party_lang",0,Party Language,Idioma del Tercero,0
-field,"sale.sale,payment_term",0,Payment Term,Término de Pago,0
+field,"sale.sale,party_lang",0,Party Language,Idioma del tercero,0
+field,"sale.sale,payment_term",0,Payment Term,Término de pago,0
+field,"sale.sale,rec_name",0,Name,Nombre,0
+field,"sale.sale-recreated-account.invoice,invoice",0,Invoice,Factura,0
+field,"sale.sale-recreated-account.invoice,rec_name",0,Name,Nombre,0
+field,"sale.sale-recreated-account.invoice,sale",0,Sale,Venta,0
 field,"sale.sale,reference",0,Reference,Referencia,0
-field,"sale.sale,sale_date",0,Sale Date,Fecha de Venta,0
+field,"sale.sale,sale_date",0,Sale Date,Fecha de venta,0
 field,"sale.sale,state",0,State,Estado,0
 field,"sale.sale,tax_amount",0,Tax,Impuesto,0
 field,"sale.sale,total_amount",0,Total,Total,0
-field,"sale.sale,untaxed_amount",0,Untaxed,Sin Impuesto,0
-field,"sale.sale,warehouse",0,Warehouse,Depósito,0
+field,"sale.sale,untaxed_amount",0,Untaxed,Sin impuesto,0
+field,"sale.sale,warehouse",0,Warehouse,Almacén,0
 field,"stock.move,sale",0,Sale,Venta,0
-field,"stock.move,sale_line",0,unknown,desconocido,0
-model,"ir.action,name",act_sale_form_confirmed,Confirmed Sales,Ventas Confirmadas,0
-model,"ir.action,name",act_sale_form_draft,Draft Sales,Ventas en Borrador,0
-model,"ir.action,name",act_sale_form_quotation,Quotation Sales,Ventas Cotizadas,0
+field,"stock.move,sale_exception_state",0,Exception State,Estado excepción,0
+field,"stock.move,sale_line",0,,,0
+help,"sale.handle.invoice.exception.ask,recreate_invoices",0,The selected invoices will be recreated. The other ones will be ignored.,Las facturas seleccionadas seran recreadas. Las otras serán ignoradas.,0
+model,"ir.action,name",act_sale_form_confirmed,Confirmed Sales,Ventas confirmadas,0
+model,"ir.action,name",act_sale_form_draft,Draft Sales,Ventas en borrador,0
+model,"ir.action,name",wizard_invoice_handle_exception,Handle Invoice Exception,Gestionar excepción de factura,0
+model,"ir.action,name",wizard_packing_handle_exception,Handle Shipment Exception,Gestionar excepción de envio,0
+model,"ir.action,name",act_invoice_form,Invoices,Facturas,0
+model,"ir.action,name",act_sale_form_new,New Sale,Nueva venta,0
+model,"ir.action,name",act_open_customer,Parties associated to Sales,Terceros asociados a ventas,0
+model,"ir.action,name",act_sale_form_quotation,Quotation Sales,Ventas presupuestadas,0
 model,"ir.action,name",report_sale,Sale,Venta,0
 model,"ir.action,name",act_sale_form,Sales,Ventas,0
-model,"ir.ui.menu,name",menu_sale_form_confirmed,Confirmed Sales,Ventas Confirmadas,0
-model,"ir.ui.menu,name",menu_sale_form_draft,Draft Sales,Ventas en Borrador,0
-model,"ir.ui.menu,name",menu_sale_form_quotation,Quotation Sales,Ventas Cotizadas,0
-model,"ir.ui.menu,name",menu_sale,Sale Management,Gestión de Ventas,0
+model,"ir.action,name",act_sale_form2,Sales,Ventas,0
+model,"ir.action,name",act_packing_form,Shipments,Envíos,0
+model,"ir.sequence,name",sequence_sale,Sale,Venta,0
+model,"ir.sequence.type,name",sequence_type_sale,Sale,Venta,0
+model,"ir.ui.menu,name",menu_sale_form_confirmed,Confirmed Sales,Ventas confirmadas,0
+model,"ir.ui.menu,name",menu_sale_form_draft,Draft Sales,Ventas en borrador,0
+model,"ir.ui.menu,name",menu_sale_form_new,New Sale,Nueva venta,0
+model,"ir.ui.menu,name",menu_customer,Parties associated to Sales,Terceros asociados a ventas,0
+model,"ir.ui.menu,name",menu_sale_form_quotation,Quotation Sales,Ventas presupuestadas,0
+model,"ir.ui.menu,name",menu_sale,Sale Management,Gestión de ventas,0
 model,"ir.ui.menu,name",menu_sale_form,Sales,Ventas,0
+model,"res.group,name",group_sale,Sale,Venta,0
+model,"sale.handle.invoice.exception.ask,name",0,Invoice Exception Ask,,0
+model,"sale.handle.packing.exception.ask,name",0,Shipment Exception Ask,,0
+model,"sale.line-account.invoice.line,name",0,Sale Line - Invoice Line,Línea de venta - Línea de factura,0
+model,"sale.line-account.tax,name",0,Sale Line - Tax,Línea de venta - Impuesto,0
+model,"sale.line-ignored-stock.move,name",0,Sale Line - Ignored Move,Línea de venta - Movimiento ignorado,0
+model,"sale.line,name",0,Sale Line,Línea de venta,0
+model,"sale.line-recreated-stock.move,name",0,Sale Line - Recreated Move,Línea de venta - Movimiento recreado,0
+model,"sale.sale-account.invoice,name",0,Sale - Invoice,Venta - Factura,0
+model,"sale.sale-ignored-account.invoice,name",0,Sale - Ignored Invoice,Venta - Factura ignorada,0
+model,"sale.sale,name",0,Sale,Venta,0
+model,"sale.sale-recreated-account.invoice,name",0,Sale - Recreated Invoice,Venta - Factura recreada,0
+model,"workflow.activity,name",sale_activity_cancel,Canceled,Cancelado,0
+model,"workflow.activity,name",sale_activity_confirmed,Confirmed,Confirmado,0
+model,"workflow.activity,name",sale_activity_done,Done,Hecho,0
+model,"workflow.activity,name",sale_activity_draft,Draft,Borrador,0
+model,"workflow.activity,name",sale_activity_invoice_sale_done,Invoice Done,Factura hecha,0
+model,"workflow.activity,name",sale_activity_invoice_sale_exception,Invoice Exception,Excepción de factura,0
+model,"workflow.activity,name",sale_activity_invoice_method,Invoice Method,Método de facturación,0
+model,"workflow.activity,name",sale_activity_invoice_method_done,Invoice Method Done,Método de factura hecho,0
+model,"workflow.activity,name",sale_activity_invoice_packing,Invoice Shipment,Envío de factura,0
+model,"workflow.activity,name",sale_activity_invoice_packing_done,Invoice Shipment Done,Envío de factura realizado,0
+model,"workflow.activity,name",sale_activity_invoice_packing_exception,Invoice Shipment Exception,Excepción de envío de factura,0
+model,"workflow.activity,name",sale_activity_invoice_packing_method,Invoice Shipment Method,Método de envío de factura,0
+model,"workflow.activity,name",sale_activity_invoice_packing_method_done,Invoice Shipment Method Done,Método de envío de factura concluido,0
+model,"workflow.activity,name",sale_activity_quotation,Quotation,Presupuesto,0
+model,"workflow.activity,name",sale_activity_packing,Shipment,Envío,0
+model,"workflow.activity,name",sale_activity_packing_exception,Shipment Exception,Excepción de envío,0
+model,"workflow.activity,name",sale_activity_packing_invoice,Shipment Invoice,Envío de factura,0
+model,"workflow.activity,name",sale_activity_packing_invoice_done,Shipment Invoice Done,Envío de factura concluido,0
+model,"workflow.activity,name",sale_activity_packing_invoice_exception,Shipment Invoice Exception,Excepción de envío de factura,0
+model,"workflow.activity,name",sale_activity_packing_invoice_method,Shipment Invoice Method,Método de envío de factura,0
+model,"workflow.activity,name",sale_activity_packing_invoice_method_done,Shipment Invoice Method Done,Método de envío de factura concluido,0
+model,"workflow.activity,name",sale_activity_packing_method,Shipment Method,Método de envío,0
+model,"workflow.activity,name",sale_activity_packing_method_done,Shipment Method Done,Método de envío concluido,0
+model,"workflow.activity,name",sale_activity_waiting_invoice_sale,Waiting Invoice,Esperando factura,0
+model,"workflow.activity,name",sale_activity_waiting_invoice_packing,Waiting Invoice Shipment,Esperando Envío de Factura,0
+model,"workflow.activity,name",sale_activity_waiting_packing,Waiting Shipment,Esperando Envío,0
+model,"workflow.activity,name",sale_activity_waiting_packing_invoice,Waiting Shipment Invoice,Esperando Envío de Factura,0
+model,"workflow,name",sale_workflow,Sale workflow,Flujo de Trabajo de Ventas,0
 odt,sale.sale,0,Amount,Cantidad,0
 odt,sale.sale,0,Date:,Fecha:,0
 odt,sale.sale,0,Description,Descripción,0
 odt,sale.sale,0,Description:,Descripción:,0
-odt,sale.sale,0,Draft Sale Order,Orden de Venta en Borrador,0
+odt,sale.sale,0,Draft Sale Order,Orden de venta en borrador,0
 odt,sale.sale,0,E-Mail:,Correo electrónico:,0
 odt,sale.sale,0,Phone:,Teléfono:,0
 odt,sale.sale,0,Quantity,Cantidad,0
-odt,sale.sale,0,Quotation N°:,Cotización Nº:,0
-odt,sale.sale,0,Sale Order N°:,Orden de Venta Nº:,0
+odt,sale.sale,0,Quotation N°:,Presupuesto Nº:,0
+odt,sale.sale,0,Sale Order N°:,Orden de venta Nº:,0
 odt,sale.sale,0,Taxes,Impuestos,0
 odt,sale.sale,0,Taxes:,Impuestos:,0
 odt,sale.sale,0,Total:,Total:,0
 odt,sale.sale,0,Total (excl. taxes):,Total (sin impuestos):,0
-odt,sale.sale,0,Unit Price,Precio Unitario,0
-odt,sale.sale,0,VAT:,VAT:,0
+odt,sale.sale,0,Unit Price,Precio unitario,0
+odt,sale.sale,0,VAT:,IVA:,0
+selection,"account.invoice,sale_exception_state",0,,,0
+selection,"account.invoice,sale_exception_state",0,Ignored,Ignorado,0
+selection,"account.invoice,sale_exception_state",0,Recreated,Rehecho,0
+selection,"sale.line,type",0,Comment,Comentario,0
 selection,"sale.line,type",0,Line,Línea,0
 selection,"sale.line,type",0,Subtotal,Subtotal,0
 selection,"sale.line,type",0,Title,Título,0
 selection,"sale.sale,invoice_method",0,Manual,Manual,0
-selection,"sale.sale,invoice_method",0,On Order Confirmed,Al Confirmar la Orden,0
-selection,"sale.sale,invoice_method",0,On Packing Sent,Al enviar el Empaque,0
+selection,"sale.sale,invoice_method",0,On Order Confirmed,Al confirmar la orden,0
+selection,"sale.sale,invoice_method",0,On Shipment Sent,Enviado,0
 selection,"sale.sale,invoice_state",0,Exception,Excepción,0
 selection,"sale.sale,invoice_state",0,None,Ninguno,0
 selection,"sale.sale,invoice_state",0,Paid,Pagado,0
-selection,"sale.sale,invoice_state",0,Waiting,En Espera,0
+selection,"sale.sale,invoice_state",0,Waiting,En espera,0
 selection,"sale.sale,packing_method",0,Manual,Manual,0
-selection,"sale.sale,packing_method",0,On Invoice Paid,Al Pagar,0
-selection,"sale.sale,packing_method",0,On Order Confirmed,Al Confirmar la Orden,0
+selection,"sale.sale,packing_method",0,On Invoice Paid,Al pagar la factura,0
+selection,"sale.sale,packing_method",0,On Order Confirmed,Al confirmar la orden,0
 selection,"sale.sale,packing_state",0,Exception,Excepción,0
 selection,"sale.sale,packing_state",0,None,Ninguno,0
 selection,"sale.sale,packing_state",0,Sent,Enviado,0
-selection,"sale.sale,packing_state",0,Waiting,En Espera,0
-selection,"sale.sale,state",0,Cancel,Cancelar,0
+selection,"sale.sale,packing_state",0,Waiting,En espera,0
+selection,"sale.sale,state",0,Canceled,Cancelado,0
 selection,"sale.sale,state",0,Confirmed,Confirmado,0
 selection,"sale.sale,state",0,Done,Hecho,0
 selection,"sale.sale,state",0,Draft,Borrador,0
-selection,"sale.sale,state",0,Quotation,Cotización,0
+selection,"sale.sale,state",0,Quotation,Presupuesto,0
+selection,"stock.move,sale_exception_state",0,,,0
+selection,"stock.move,sale_exception_state",0,Ignored,Ignore,0
+selection,"stock.move,sale_exception_state",0,Recreated,Rehacer,0
 view,product.product,0,Customers,Clientes,0
-view,sale.line,0,Sale Line,Línea de Venta,0
-view,sale.line,0,Sale Lines,Líneas de Venta,0
+view,product.template,0,Customers,Clientes,0
+view,sale.handle.invoice.exception.ask,0,Choose invoices to recreate,Escoja una factura a rehacer,0
+view,sale.handle.invoice.exception.ask,0,Handle Invoice Exception,Excepción de Manejo de Factura,0
+view,sale.handle.packing.exception.ask,0,Choose move to recreate,Escoja un movimiento a rehacer,0
+view,sale.handle.packing.exception.ask,0,Handle packing Exception,Maneje Excepciones de empaquetado,0
+view,sale.handle.packing.exception.ask,0,Recreate Moves,Recrear movimientos,0
+view,sale.line,0,General,General,0
+view,sale.line,0,Notes,Notas,0
+view,sale.line,0,Products,Productos,0
+view,sale.line,0,Sale Line,Línea de venta,0
+view,sale.line,0,Sale Lines,Líneas de venta,0
 view,sale.sale,0,Cancel,Cancelar,0
 view,sale.sale,0,Confirm,Confirmar,0
 view,sale.sale,0,Draft,Borrador,0
+view,sale.sale,0,Handle Invoice Exception,Excepción que maneja factura,0
+view,sale.sale,0,Handle Shipment Exception,Excepción que maneja envío,0
 view,sale.sale,0,Ignore Invoice Exception,Ignorar excepción en Factura,0
 view,sale.sale,0,Ignore Packing Exception,Ignorar excepción en Empaque,0
 view,sale.sale,0,Invoices,Facturas,0
 view,sale.sale,0,Lines,Líneas,0
-view,sale.sale,0,Other Info,Información Adicional,0
+view,sale.sale,0,Moves,Movimientos,0
+view,sale.sale,0,Other Info,Información adicional,0
 view,sale.sale,0,Packings,Empaques,0
-view,sale.sale,0,Quotation,Cotización,0
+view,sale.sale,0,Quotation,Presupuesto,0
 view,sale.sale,0,Sale,Venta,0
 view,sale.sale,0,Sales,Ventas,0
+view,sale.sale,0,Shipments,Empaques,0
+wizard_button,"sale.handle.invoice.exception,init,end",0,Cancel,Cancelar,0
+wizard_button,"sale.handle.invoice.exception,init,ok",0,Ok,Aceptar,0
+wizard_button,"sale.handle.packing.exception,init,end",0,Cancel,Cancelar,0
+wizard_button,"sale.handle.packing.exception,init,ok",0,Ok,Aceptar,0
diff --git a/fr_FR.csv b/fr_FR.csv
index 67dd64a..2bf8d00 100644
--- a/fr_FR.csv
+++ b/fr_FR.csv
@@ -1,21 +1,44 @@
 type,name,res_id,src,value,fuzzy
-error,account.invoice,0,You can not delete invoices that comes from a sale!,Vous ne pouvez pas supprimer des factures provenant d'une vente !,0
-error,sale.line,0,"It miss an ""account_revenue"" default property!","Il manque une propriété""account_expense""",0
+error,account.invoice,0,You can not delete invoices that come from a sale!,Vous ne pouvez pas supprimer une facture qui provient d'une vente,0
+error,account.invoice,0,You cannot reset to draft an invoice generated by a sale.,Vous ne pouvez pas réinitialiser une facture générée par une vente.,0
+error,sale.line,0,"It misses an ""account Revenue"" default property!","il manque une propriété par défaut ""compte de revenu"" !",0
+error,sale.line,0,"It misses an ""Account Revenue"" on product ""%s""!","Il manque un compte de revenu sur le produit ""%s"" !",0
 error,sale.line,0,The customer location is required!,L'emplacement client est requis !,0
-error,sale.sale,0,Invoice and Packing addresses must be defined for the quotation.,Les adresses de facturation de de colisage sont requises pour le devis.,0
+error,sale.sale,0,Invoice and Shipment addresses must be defined for the quotation.,Les adresses de facturation et d'expédition sont requises pour le devis.,0
+error,sale.sale,0,"It misses an ""Account Receivable"" on the party ""%s""!","Il manque un compte de revenu sur le tiers ""%s"" !",0
 error,sale.sale,0,Wrong combination of method!,Mauvaise combinaison de méthodes !,0
+error,stock.packing.out,0,You cannot reset to draft a move generated by a sale.,Vous ne pouvez pas réinitialiser un mouvement généré par une vente.,0
+field,"account.invoice,sale_exception_state",0,Exception State,État d'exception,0
 field,"product.template,salable",0,Salable,Vendable,0
 field,"product.template,sale_uom",0,Sale UOM,UDM de vente,0
-field,"sale.line,amount",0,Amount,Montatn,0
-field,"sale.line,comment",0,Comment,Commentaire,0
+field,"sale.handle.invoice.exception.ask,domain_invoices",0,Domain Invoices,Domaine des factures,0
+field,"sale.handle.invoice.exception.ask,recreate_invoices",0,Recreate Invoices,Recréer les factures,0
+field,"sale.handle.packing.exception.ask,domain_moves",0,Domain Moves,Domaine des mouvements,0
+field,"sale.handle.packing.exception.ask,recreate_moves",0,Recreate Moves,Recréer les mouvements,0
+field,"sale.line-account.invoice.line,invoice_line",0,Invoice Line,Ligne de facture,0
+field,"sale.line-account.invoice.line,rec_name",0,Name,Nom,0
+field,"sale.line-account.invoice.line,sale_line",0,Sale Line,Ligne de vente,0
+field,"sale.line-account.tax,line",0,Sale Line,Ligne de vente,0
+field,"sale.line-account.tax,rec_name",0,Name,Nom,0
+field,"sale.line-account.tax,tax",0,Tax,Taxe,0
+field,"sale.line,amount",0,Amount,Montant,0
 field,"sale.line,description",0,Description,Description,0
+field,"sale.line-ignored-stock.move,move",0,Move,Mouvement,0
+field,"sale.line-ignored-stock.move,rec_name",0,Name,Nom,0
+field,"sale.line-ignored-stock.move,sale_line",0,Sale Line,Ligne de vente,0
 field,"sale.line,invoice_lines",0,Invoice Lines,Lignes de facture,0
 field,"sale.line,move_done",0,Moves Done,Mouvements effectués,0
 field,"sale.line,move_exception",0,Moves Exception,Mouvements en exception,0
 field,"sale.line,moves",0,Moves,Mouvements,0
-field,"sale.line,moves_ignored",0,Moves Ignored,Mouvements ignorés,0
+field,"sale.line,moves_ignored",0,Ignored Moves,Mouvements ignorés,0
+field,"sale.line,moves_recreated",0,Recreated Moves,Mouvements recréés,0
+field,"sale.line,note",0,Note,Note,0
 field,"sale.line,product",0,Product,Produit,0
 field,"sale.line,quantity",0,Quantity,Quantité,0
+field,"sale.line,rec_name",0,Name,Nom,0
+field,"sale.line-recreated-stock.move,move",0,Move,Mouvement,0
+field,"sale.line-recreated-stock.move,rec_name",0,Name,Nom,0
+field,"sale.line-recreated-stock.move,sale_line",0,Sale Line,Ligne de vente,0
 field,"sale.line,sale",0,Sale,Vente,0
 field,"sale.line,sequence",0,Sequence,Séquence,0
 field,"sale.line,taxes",0,Taxes,Taxes,0
@@ -23,30 +46,40 @@ field,"sale.line,type",0,Type,Type,0
 field,"sale.line,unit",0,Unit,Unité,0
 field,"sale.line,unit_digits",0,Unit Digits,Décimales de l'unité,0
 field,"sale.line,unit_price",0,Unit Price,Prix unitaire,0
+field,"sale.sale-account.invoice,invoice",0,Invoice,Facture,0
+field,"sale.sale-account.invoice,rec_name",0,Name,Nom,0
+field,"sale.sale-account.invoice,sale",0,Sale,Vente,0
 field,"sale.sale,comment",0,Comment,Commentaire,0
 field,"sale.sale,company",0,Company,Companie,0
-field,"sale.sale,contact_address",0,Contact Address,Adresse de contact,0
 field,"sale.sale,currency",0,Currency,Devise,0
 field,"sale.sale,currency_digits",0,Currency Digits,Décimales de la devise,0
 field,"sale.sale,description",0,Description,Description,0
+field,"sale.sale-ignored-account.invoice,invoice",0,Invoice,Facture,0
+field,"sale.sale-ignored-account.invoice,rec_name",0,Name,Nom,0
+field,"sale.sale-ignored-account.invoice,sale",0,Sale,Vente,0
 field,"sale.sale,invoice_address",0,Invoice Address,Adresse de facturation,0
 field,"sale.sale,invoice_exception",0,Invoices Exception,Factures en exception,0
 field,"sale.sale,invoice_method",0,Invoice Method,Méthode de facturation,0
 field,"sale.sale,invoice_paid",0,Invoices Paid,Factures payées,0
 field,"sale.sale,invoices",0,Invoices,Factures,0
-field,"sale.sale,invoices_ignored",0,Invoices Ignored,Factures ignorées,0
+field,"sale.sale,invoices_ignored",0,Ignored Invoices,Factures ignorées,0
+field,"sale.sale,invoices_recreated",0,Recreated Invoices,Factures recréées,0
 field,"sale.sale,invoice_state",0,Invoice State,État de la factutre,0
 field,"sale.sale,lines",0,Lines,Lignes,0
 field,"sale.sale,moves",0,Moves,Mouvements,0
-field,"sale.sale,packing_address",0,Packing Address,Adresse de livraison,0
-field,"sale.sale,packing_done",0,Packing Done,Colisage effectué,0
-field,"sale.sale,packing_exception",0,Packings Exception,Colisages en exception,0
-field,"sale.sale,packing_method",0,Packing Method,Méthode de livraison,0
-field,"sale.sale,packings",0,Packings,Colisages,0
-field,"sale.sale,packing_state",0,Packing State,État du colisage,0
+field,"sale.sale,packing_address",0,Shipment Address,Adresse de livraison,0
+field,"sale.sale,packing_done",0,Shipment Done,Expédition effectuée,0
+field,"sale.sale,packing_exception",0,Shipments Exception,Expéditions en exception,0
+field,"sale.sale,packing_method",0,Shipment Method,Méthode de livraison,0
+field,"sale.sale,packings",0,Shipments,Expédition,0
+field,"sale.sale,packing_state",0,Shipment State,État de l'expédition,0
 field,"sale.sale,party",0,Party,Tiers,0
 field,"sale.sale,party_lang",0,Party Language,Langue du tiers,0
-field,"sale.sale,payment_term",0,Payment Term,Condition de paiement,0
+field,"sale.sale,payment_term",0,Payment Term,Conditions de paiement,0
+field,"sale.sale,rec_name",0,Name,Nom,0
+field,"sale.sale-recreated-account.invoice,invoice",0,Invoice,Facture,0
+field,"sale.sale-recreated-account.invoice,rec_name",0,Name,Nom,0
+field,"sale.sale-recreated-account.invoice,sale",0,Sale,Vente,0
 field,"sale.sale,reference",0,Reference,Référence,0
 field,"sale.sale,sale_date",0,Sale Date,Date de la vente,0
 field,"sale.sale,state",0,State,État,0
@@ -55,55 +88,96 @@ field,"sale.sale,total_amount",0,Total,Total,0
 field,"sale.sale,untaxed_amount",0,Untaxed,Non-taxé,0
 field,"sale.sale,warehouse",0,Warehouse,Entrepôt,0
 field,"stock.move,sale",0,Sale,Vente,0
-field,"stock.move,sale_line",0,unknown,inconnu,0
+field,"stock.move,sale_exception_state",0,Exception State,État d'exception,0
+field,"stock.move,sale_line",0,,,0
+help,"sale.handle.invoice.exception.ask,recreate_invoices",0,The selected invoices will be recreated. The other ones will be ignored.,Les factures sélectionnées seront recréés. Les autres seront ignorées.,0
 model,"ir.action,name",act_sale_form_confirmed,Confirmed Sales,Ventes confirmées,0
 model,"ir.action,name",act_sale_form_draft,Draft Sales,Ventes brouillon,0
+model,"ir.action,name",wizard_invoice_handle_exception,Handle Invoice Exception,Gérer l'exception de facture,0
+model,"ir.action,name",wizard_packing_handle_exception,Handle Shipment Exception,Gérer l'exception d'expédition,0
+model,"ir.action,name",act_invoice_form,Invoices,Factures,0
+model,"ir.action,name",act_sale_form_new,New Sale,Nouvelle vente,0
+model,"ir.action,name",act_open_customer,Parties associated to Sales,Tiers associés à des ventes,0
 model,"ir.action,name",act_sale_form_quotation,Quotation Sales,Devis,0
 model,"ir.action,name",report_sale,Sale,Vente,0
 model,"ir.action,name",act_sale_form,Sales,Ventes,0
+model,"ir.action,name",act_sale_form2,Sales,Ventes,0
+model,"ir.action,name",act_packing_form,Shipments,Expéditions,0
 model,"ir.sequence,name",sequence_sale,Sale,Vente,0
 model,"ir.sequence.type,name",sequence_type_sale,Sale,Vente,0
 model,"ir.ui.menu,name",menu_sale_form_confirmed,Confirmed Sales,Ventes confirmées,0
 model,"ir.ui.menu,name",menu_sale_form_draft,Draft Sales,Ventes brouillons,0
+model,"ir.ui.menu,name",menu_sale_form_new,New Sale,Nouvelle vente,0
+model,"ir.ui.menu,name",menu_customer,Parties associated to Sales,Tiers associés à des ventes,0
 model,"ir.ui.menu,name",menu_sale_form_quotation,Quotation Sales,Devis,0
 model,"ir.ui.menu,name",menu_sale,Sale Management,Gestion des ventes,0
 model,"ir.ui.menu,name",menu_sale_form,Sales,Ventes,0
 model,"res.group,name",group_sale,Sale,Vente,0
-model,"workflow.activity,name",sale_activity_cancel,Cancel,Annulé,0
+model,"sale.handle.invoice.exception.ask,name",0,Invoice Exception Ask,Exception de facture - Demande,0
+model,"sale.handle.packing.exception.ask,name",0,Shipment Exception Ask,Exception d'expédition - Demande,0
+model,"sale.line-account.invoice.line,name",0,Sale Line - Invoice Line,Ligne de vente - Ligne de facture,0
+model,"sale.line-account.tax,name",0,Sale Line - Tax,Ligne de vente - Taxe,0
+model,"sale.line-ignored-stock.move,name",0,Sale Line - Ignored Move,Ligne de vente - Mouvement ignoré,0
+model,"sale.line,name",0,Sale Line,Ligne de vente,0
+model,"sale.line-recreated-stock.move,name",0,Sale Line - Recreated Move,Ligne de vente - Mouvement recréé,0
+model,"sale.sale-account.invoice,name",0,Sale - Invoice,Vente - Facture,0
+model,"sale.sale-ignored-account.invoice,name",0,Sale - Ignored Invoice,Vente - Facture Ignorée,0
+model,"sale.sale,name",0,Sale,Vente,0
+model,"sale.sale-recreated-account.invoice,name",0,Sale - Recreated Invoice,Vente - Facture recréée,0
+model,"workflow.activity,name",sale_activity_cancel,Canceled,Annulé,0
 model,"workflow.activity,name",sale_activity_confirmed,Confirmed,Confirmé,0
 model,"workflow.activity,name",sale_activity_done,Done,Fait,0
 model,"workflow.activity,name",sale_activity_draft,Draft,Brouillon,0
-model,"workflow.activity,name",sale_activity_invoice_sale,Invoice,Facture,0
 model,"workflow.activity,name",sale_activity_invoice_sale_done,Invoice Done,Facture faite,0
 model,"workflow.activity,name",sale_activity_invoice_sale_exception,Invoice Exception,Facture en exception,0
 model,"workflow.activity,name",sale_activity_invoice_method,Invoice Method,Méthode de facturation,0
 model,"workflow.activity,name",sale_activity_invoice_method_done,Invoice Method Done,Méthode de facture faite,0
-model,"workflow.activity,name",sale_activity_invoice_packing,Invoice Packing,Facture colisage,0
-model,"workflow.activity,name",sale_activity_invoice_packing_done,Invoice Packing Done,Facture colisage faite,0
-model,"workflow.activity,name",sale_activity_invoice_packing_exception,Invoice Packing Exception,Facture colisage en exception,0
-model,"workflow.activity,name",sale_activity_invoice_packing_method,Invoice Packing Method,Méthode facture colisage,0
-model,"workflow.activity,name",sale_activity_invoice_packing_method_done,Invoice Packing Method Done,Méthode facture colisage faite,0
-model,"workflow.activity,name",sale_activity_packing,Packing,Colisage,0
-model,"workflow.activity,name",sale_activity_packing_exception,Packing Exception,Colisage en exception,0
-model,"workflow.activity,name",sale_activity_packing_invoice,Packing Invoice,Facture colisage,0
-model,"workflow.activity,name",sale_activity_packing_invoice_done,Packing Invoice Done,Facture colisage faite,0
-model,"workflow.activity,name",sale_activity_packing_invoice_exception,Packing Invoice Exception,Facture colisage en exception,0
-model,"workflow.activity,name",sale_activity_packing_invoice_method,Packing Invoice Method,Méthode facture colisage,0
-model,"workflow.activity,name",sale_activity_packing_invoice_method_done,Packing Invoice Method Done,Méthode facture colisage faite,0
-model,"workflow.activity,name",sale_activity_packing_method,Packing Method,Méthode de colisage,0
-model,"workflow.activity,name",sale_activity_packing_method_done,Packing Method Done,Méthode de colisage faite,0
+model,"workflow.activity,name",sale_activity_invoice_packing,Invoice Shipment,Facture expédition,0
+model,"workflow.activity,name",sale_activity_invoice_packing_done,Invoice Shipment Done,Facture expédition faite,0
+model,"workflow.activity,name",sale_activity_invoice_packing_exception,Invoice Shipment Exception,Facture expédition en exception,0
+model,"workflow.activity,name",sale_activity_invoice_packing_method,Invoice Shipment Method,Méthode facture expédition,0
+model,"workflow.activity,name",sale_activity_invoice_packing_method_done,Invoice Shipment Method Done,Méthode facture expédition faite,0
 model,"workflow.activity,name",sale_activity_quotation,Quotation,Devis,0
+model,"workflow.activity,name",sale_activity_packing,Shipment,Expédition,0
+model,"workflow.activity,name",sale_activity_packing_exception,Shipment Exception,Expédition en exception,0
+model,"workflow.activity,name",sale_activity_packing_invoice,Shipment Invoice,Facture expédition,0
+model,"workflow.activity,name",sale_activity_packing_invoice_done,Shipment Invoice Done,Facture expédition faite,0
+model,"workflow.activity,name",sale_activity_packing_invoice_exception,Shipment Invoice Exception,Facture expédition en exception,0
+model,"workflow.activity,name",sale_activity_packing_invoice_method,Shipment Invoice Method,Méthode facture expédition,0
+model,"workflow.activity,name",sale_activity_packing_invoice_method_done,Shipment Invoice Method Done,Méthode facture expédition faite,0
+model,"workflow.activity,name",sale_activity_packing_method,Shipment Method,Méthode d'expédition,0
+model,"workflow.activity,name",sale_activity_packing_method_done,Shipment Method Done,Méthode d'expédition faite,0
 model,"workflow.activity,name",sale_activity_waiting_invoice_sale,Waiting Invoice,Facture en attente,0
-model,"workflow.activity,name",sale_activity_waiting_invoice_packing,Waiting Invoice Packing,Facture colisage en attente,0
-model,"workflow.activity,name",sale_activity_waiting_packing,Waiting Packing,Colisage en attente,0
-model,"workflow.activity,name",sale_activity_waiting_packing_invoice,Waiting Packing Invoice,Facture colisage en attente,0
+model,"workflow.activity,name",sale_activity_waiting_invoice_packing,Waiting Invoice Shipment,Facture expédition en attente,0
+model,"workflow.activity,name",sale_activity_waiting_packing,Waiting Shipment,Expédition en attente,0
+model,"workflow.activity,name",sale_activity_waiting_packing_invoice,Waiting Shipment Invoice,Facture expédition en attente,0
 model,"workflow,name",sale_workflow,Sale workflow,Workflow de vente,0
+odt,sale.sale,0,Amount,Montant,0
+odt,sale.sale,0,Date:,Date :,0
+odt,sale.sale,0,Description,Description,0
+odt,sale.sale,0,Description:,Description :,0
+odt,sale.sale,0,Draft Sale Order,Bon de commande brouillon,0
+odt,sale.sale,0,E-Mail:,E-Mail :,0
+odt,sale.sale,0,Phone:,Téléphone :,0
+odt,sale.sale,0,Quantity,Quantité,0
+odt,sale.sale,0,Quotation N°:,Devis N° :,0
+odt,sale.sale,0,Sale Order N°:,Bon de commande N° :,0
+odt,sale.sale,0,Taxes,Taxes,0
+odt,sale.sale,0,Taxes:,Taxes :,0
+odt,sale.sale,0,Total:,Total :,0
+odt,sale.sale,0,Total (excl. taxes):,Total (HT) :,0
+odt,sale.sale,0,Unit Price,Prix unitaire,0
+odt,sale.sale,0,VAT:,TVA :,0
+selection,"account.invoice,sale_exception_state",0,,,0
+selection,"account.invoice,sale_exception_state",0,Ignored,Ignoré,0
+selection,"account.invoice,sale_exception_state",0,Recreated,Recréé,0
+selection,"sale.line,type",0,Comment,Commentaire,0
 selection,"sale.line,type",0,Line,Ligne,0
 selection,"sale.line,type",0,Subtotal,Sous-total,0
 selection,"sale.line,type",0,Title,Titre,0
 selection,"sale.sale,invoice_method",0,Manual,Manuel,0
-selection,"sale.sale,invoice_method",0,On Order Confirmed,À la confirmation de la commande,0
-selection,"sale.sale,invoice_method",0,On Packing Sent,À la livraison,0
+selection,"sale.sale,invoice_method",0,On Order Confirmed,A la confirmation de la commande,0
+selection,"sale.sale,invoice_method",0,On Shipment Sent,A la livraison,0
 selection,"sale.sale,invoice_state",0,Exception,Exception,0
 selection,"sale.sale,invoice_state",0,None,Aucun,0
 selection,"sale.sale,invoice_state",0,Paid,Payé,0
@@ -115,24 +189,42 @@ selection,"sale.sale,packing_state",0,Exception,Exception,0
 selection,"sale.sale,packing_state",0,None,Aucun,0
 selection,"sale.sale,packing_state",0,Sent,Envoyé,0
 selection,"sale.sale,packing_state",0,Waiting,En attente,0
-selection,"sale.sale,state",0,Cancel,Annulé,0
+selection,"sale.sale,state",0,Canceled,Annulé,0
 selection,"sale.sale,state",0,Confirmed,Confirmé,0
 selection,"sale.sale,state",0,Done,Fait,0
 selection,"sale.sale,state",0,Draft,Brouillon,0
 selection,"sale.sale,state",0,Quotation,Devis,0
+selection,"stock.move,sale_exception_state",0,,,0
+selection,"stock.move,sale_exception_state",0,Ignored,Ignoré,0
+selection,"stock.move,sale_exception_state",0,Recreated,Recréé,0
 view,product.product,0,Customers,Clients,0
+view,product.template,0,Customers,Clients,0
+view,sale.handle.invoice.exception.ask,0,Choose invoices to recreate,Choisir les factures à recréer,0
+view,sale.handle.invoice.exception.ask,0,Handle Invoice Exception,Gérer l'exception de facture,0
+view,sale.handle.packing.exception.ask,0,Choose move to recreate,Choisir le mouvement à recréer,0
+view,sale.handle.packing.exception.ask,0,Handle packing Exception,Gérer l'exception d'expédition,0
+view,sale.handle.packing.exception.ask,0,Recreate Moves,Recréer les mouvements,0
+view,sale.line,0,General,Général,0
+view,sale.line,0,Notes,Notes,0
 view,sale.line,0,Products,produits,0
 view,sale.line,0,Sale Line,Ligne de vente,0
 view,sale.line,0,Sale Lines,Lignes de vente,0
 view,sale.sale,0,Cancel,Annuler,0
 view,sale.sale,0,Confirm,Confirmer,0
 view,sale.sale,0,Draft,Brouillon,0
+view,sale.sale,0,Handle Invoice Exception,Gérer l'exception de facture,0
+view,sale.sale,0,Handle Shipment Exception,Gérer l'exception d'expédition,0
 view,sale.sale,0,Ignore Invoice Exception,Ignorer l'exception de facturation ,0
-view,sale.sale,0,Ignore Packing Exception,Ignorer l'exception de livraison,0
+view,sale.sale,0,Ignore Shipment Exception,Ignorer l'exception de livraison,0
 view,sale.sale,0,Invoices,Factures,0
 view,sale.sale,0,Lines,Lignes,0
+view,sale.sale,0,Moves,Mouvements,0
 view,sale.sale,0,Other Info,Autre informations,0
-view,sale.sale,0,Packings,Colisages,0
 view,sale.sale,0,Quotation,Devis,0
 view,sale.sale,0,Sale,Vente,0
 view,sale.sale,0,Sales,Ventes,0
+view,sale.sale,0,Shipments,Expéditions,0
+wizard_button,"sale.handle.invoice.exception,init,end",0,Cancel,Annuler,0
+wizard_button,"sale.handle.invoice.exception,init,ok",0,Ok,Ok,0
+wizard_button,"sale.handle.packing.exception,init,end",0,Cancel,Annuler,0
+wizard_button,"sale.handle.packing.exception,init,ok",0,Ok,Ok,0
diff --git a/party.xml b/party.xml
new file mode 100644
index 0000000..61e4325
--- /dev/null
+++ b/party.xml
@@ -0,0 +1,20 @@
+<?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. -->
+<tryton>
+    <data>
+        <record model="ir.action.act_window" id="act_sale_form2">
+            <field name="name">Sales</field>
+            <field name="res_model">sale.sale</field>
+            <field name="view_type">form</field>
+            <field name="domain">[("party", "=", active_id)]</field>
+        </record>
+        <record model="ir.action.keyword"
+                id="act_open_sale_keyword1">
+            <field name="keyword">form_relate</field>
+            <field name="model">party.party,0</field>
+            <field name="action" ref="act_sale_form2"/>
+        </record>
+
+    </data>
+</tryton>
diff --git a/sale.odt b/sale.odt
index 1667524..63e8db8 100644
Binary files a/sale.odt and b/sale.odt differ
diff --git a/sale.py b/sale.py
index da328a7..cc107af 100644
--- a/sale.py
+++ b/sale.py
@@ -1,14 +1,14 @@
 #This file is part of Tryton.  The COPYRIGHT file at the top level
 #of this repository contains the full copyright notices and license terms.
 "Sale"
-
-from trytond.osv import fields, OSV
-from decimal import Decimal
-from trytond.netsvc import LocalService
+from trytond.model import ModelWorkflow, ModelView, ModelSQL, fields
 from trytond.report import CompanyReport
+from trytond.wizard import Wizard
+from trytond.backend import TableHandler
+from decimal import Decimal
 
 
-class Sale(OSV):
+class Sale(ModelWorkflow, ModelSQL, ModelView):
     'Sale'
     _name = 'sale.sale'
     _rec_name = 'reference'
@@ -17,7 +17,7 @@ class Sale(OSV):
     company = fields.Many2One('company.company', 'Company', required=True,
             states={
                 'readonly': "state != 'draft' or bool(lines)",
-            })
+            }, domain="[('id', '=', context.get('company', 0))]")
     reference = fields.Char('Reference', readonly=True, select=1)
     description = fields.Char('Description', states={
         'readonly': "state != 'draft'",
@@ -27,7 +27,7 @@ class Sale(OSV):
         ('quotation', 'Quotation'),
         ('confirmed', 'Confirmed'),
         ('done', 'Done'),
-        ('cancel', 'Cancel'),
+        ('cancel', 'Canceled'),
     ], 'State', readonly=True, required=True)
     sale_date = fields.Date('Sale Date', required=True, states={
         'readonly': "state != 'draft'",
@@ -46,7 +46,7 @@ class Sale(OSV):
             domain="[('party', '=', party)]", states={
                 'readonly': "state != 'draft'",
             })
-    packing_address = fields.Many2One('party.address', 'Packing Address',
+    packing_address = fields.Many2One('party.address', 'Shipment Address',
             domain="[('party', '=', party)]", states={
                 'readonly': "state != 'draft'",
             })
@@ -73,7 +73,7 @@ class Sale(OSV):
     invoice_method = fields.Selection([
         ('manual', 'Manual'),
         ('order', 'On Order Confirmed'),
-        ('packing', 'On Packing Sent'),
+        ('packing', 'On Shipment Sent'),
     ], 'Invoice Method', required=True, states={
         'readonly': "state != 'draft'",
         })
@@ -83,11 +83,12 @@ class Sale(OSV):
         ('paid', 'Paid'),
         ('exception', 'Exception'),
     ], 'Invoice State', readonly=True, required=True)
-    invoices = fields.Many2Many('account.invoice', 'sale_invoices_rel',
+    invoices = fields.Many2Many('sale.sale-account.invoice',
             'sale', 'invoice', 'Invoices', readonly=True)
-    invoices_ignored = fields.Many2Many('account.invoice',
-            'sale_invoice_ignored_rel', 'sale', 'invoice',
-            'Invoices Ignored', readonly=True)
+    invoices_ignored = fields.Many2Many('sale.sale-ignored-account.invoice',
+            'sale', 'invoice', 'Ignored Invoices', readonly=True)
+    invoices_recreated = fields.Many2Many('sale.sale-recreated-account.invoice',
+            'sale', 'invoice', 'Recreated Invoices', readonly=True)
     invoice_paid = fields.Function('get_function_fields', type='boolean',
             string='Invoices Paid')
     invoice_exception = fields.Function('get_function_fields', type='boolean',
@@ -96,7 +97,7 @@ class Sale(OSV):
         ('manual', 'Manual'),
         ('order', 'On Order Confirmed'),
         ('invoice', 'On Invoice Paid'),
-    ], 'Packing Method', required=True, states={
+    ], 'Shipment Method', required=True, states={
         'readonly': "state != 'draft'",
         })
     packing_state = fields.Selection([
@@ -104,43 +105,45 @@ class Sale(OSV):
         ('waiting', 'Waiting'),
         ('sent', 'Sent'),
         ('exception', 'Exception'),
-    ], 'Packing State', readonly=True, required=True)
+    ], 'Shipment State', readonly=True, required=True)
     packings = fields.Function('get_function_fields', type='many2many',
-            relation='stock.packing.out', string='Packings')
+            relation='stock.packing.out', string='Shipments')
     moves = fields.Function('get_function_fields', type='many2many',
             relation='stock.move', string='Moves')
     packing_done = fields.Function('get_function_fields', type='boolean',
-            string='Packing Done')
+            string='Shipment Done')
     packing_exception = fields.Function('get_function_fields', type='boolean',
-            string='Packings Exception')
+            string='Shipments Exception')
 
     def __init__(self):
         super(Sale, self).__init__()
+        self._order[0] = ('sale_date', 'DESC')
+        self._order[0] = ('id', 'DESC')
         self._constraints += [
             ('check_method', 'wrong_method')
         ]
         self._error_messages.update({
             'wrong_method': 'Wrong combination of method!',
-            'addresses_required': 'Invoice and Packing addresses must be '
+            'addresses_required': 'Invoice and Shipment addresses must be '
             'defined for the quotation.',
+            'missing_account_receivable': 'It misses ' \
+                    'an "Account Receivable" on the party "%s"!',
         })
 
     def default_payment_term(self, cursor, user, context=None):
         payment_term_obj = self.pool.get('account.invoice.payment_term')
         payment_term_ids = payment_term_obj.search(cursor, user,
-                self.payment_term._domain, context=context)
+                self.payment_term.domain, context=context)
         if len(payment_term_ids) == 1:
-            return payment_term_obj.name_get(cursor, user, payment_term_ids,
-                    context=context)[0]
+            return payment_term_ids[0]
         return False
 
     def default_warehouse(self, cursor, user, context=None):
         location_obj = self.pool.get('stock.location')
         location_ids = location_obj.search(cursor, user,
-                self.warehouse._domain, context=context)
+                self.warehouse.domain, context=context)
         if len(location_ids) == 1:
-            return location_obj.name_get(cursor, user, location_ids,
-                    context=context)[0]
+            return location_ids[0]
         return False
 
     def default_company(self, cursor, user, context=None):
@@ -148,8 +151,7 @@ class Sale(OSV):
         if context is None:
             context = {}
         if context.get('company'):
-            return company_obj.name_get(cursor, user, context['company'],
-                    context=context)[0]
+            return context['company']
         return False
 
     def default_state(self, cursor, user, context=None):
@@ -168,8 +170,7 @@ class Sale(OSV):
         if context.get('company'):
             company = company_obj.browse(cursor, user, context['company'],
                     context=context)
-            return currency_obj.name_get(cursor, user, company.currency.id,
-                    context=context)[0]
+            return company.currency.id
         return False
 
     def default_currency_digits(self, cursor, user, context=None):
@@ -215,17 +216,17 @@ class Sale(OSV):
                 res['payment_term'] = party.payment_term.id
 
         if res['invoice_address']:
-            res['invoice_address'] = address_obj.name_get(cursor, user,
-                    res['invoice_address'], context=context)[0]
+            res['invoice_address.rec_name'] = address_obj.browse(cursor, user,
+                    res['invoice_address'], context=context).rec_name
         if res['packing_address']:
-            res['packing_address'] = address_obj.name_get(cursor, user,
-                    res['packing_address'], context=context)[0]
-        if res['payment_term']:
-            res['payment_term'] = payment_term_obj.name_get(cursor, user,
-                    res['payment_term'], context=context)[0]
-        else:
+            res['packing_address.rec_name'] = address_obj.browse(cursor, user,
+                    res['packing_address'], context=context).rec_name
+        if not res['payment_term']:
             res['payment_term'] = self.default_payment_term(cursor, user,
                     context=context)
+        if res['payment_term']:
+            res['payment_term.rec_name'] = payment_term_obj.browse(cursor, user,
+                    res['payment_term'], context=context).rec_name
         return res
 
     def on_change_with_currency_digits(self, cursor, user, ids, vals,
@@ -480,10 +481,11 @@ class Sale(OSV):
         res = {}
         for sale in sales:
             val = True
-            ignored_ids = [x.id for x in sale.invoices_ignored]
+            skip_ids = set(x.id for x in sale.invoices_ignored)
+            skip_ids.update(x.id for x in sale.invoices_recreated)
             for invoice in sale.invoices:
                 if invoice.state != 'paid' \
-                        and invoice.id not in ignored_ids:
+                        and invoice.id not in skip_ids:
                     val = False
                     break
             res[sale.id] = val
@@ -503,10 +505,11 @@ class Sale(OSV):
         res = {}
         for sale in sales:
             val = False
-            ignored_ids = [x.id for x in sale.invoices_ignored]
+            skip_ids = set(x.id for x in sale.invoices_ignored)
+            skip_ids.update(x.id for x in sale.invoices_recreated)
             for invoice in sale.invoices:
                 if invoice.state == 'cancel' \
-                        and invoice.id not in ignored_ids:
+                        and invoice.id not in skip_ids:
                     val = True
                     break
             res[sale.id] = val
@@ -606,32 +609,27 @@ class Sale(OSV):
                 return False
         return True
 
-    def name_get(self, cursor, user, ids, context=None):
+    def get_rec_name(self, cursor, user, ids, name, arg, context=None):
         if not ids:
             return []
-        if isinstance(ids, (int, long)):
-            ids = [ids]
-        res = []
+        res = {}
         for sale in self.browse(cursor, user, ids, context=context):
-            res.append((sale.id, sale.reference or str(sale.id) \
-                    + ' ' + sale.party.name))
+            res[sale.id] = sale.reference or str(sale.id) \
+                    + ' - ' + sale.party.rec_name
         return res
 
-    def name_search(self, cursor, user, name='', args=None, operator='ilike',
-            context=None, limit=None):
-        if args is None:
-            args = []
-        if name:
-            ids = self.search(cursor, user,
-                    [('reference', operator, name)] + args, limit=limit,
-                    context=context)
-        if not ids:
-            ids = self.search(cursor, user, [('party', operator, name)] + args,
-                    limit=limit, context=context)
-        res = self.name_get(cursor, user, ids, context=context)
-        return res
+    def search_rec_name(self, cursor, user, name, args, context=None):
+        args2 = []
+        i = 0
+        while i < len(args):
+            names = args[i][2].split(' - ', 1)
+            args2.append(('reference', args[i][1], names[0]))
+            if len(names) != 1 and names[1]:
+                args2.append(('party', args[i][1], names[1]))
+            i += 1
+        return args2
 
-    def copy(self, cursor, user, sale_id, default=None, context=None):
+    def copy(self, cursor, user, ids, default=None, context=None):
         if default is None:
             default = {}
         default = default.copy()
@@ -641,7 +639,7 @@ class Sale(OSV):
         default['invoices'] = False
         default['invoices_ignored'] = False
         default['packing_state'] = 'none'
-        return super(Sale, self).copy(cursor, user, sale_id, default=default,
+        return super(Sale, self).copy(cursor, user, ids, default=default,
                 context=context)
 
     def check_for_quotation(self, cursor, user, sale_id, context=None):
@@ -668,7 +666,8 @@ class Sale(OSV):
         if sale.reference:
             return True
 
-        reference = sequence_obj.get(cursor, user, 'sale.sale')
+        reference = sequence_obj.get(cursor, user, 'sale.sale',
+                context=context)
         self.write(cursor, user, sale_id, {
             'reference': reference,
             }, context=context)
@@ -716,6 +715,10 @@ class Sale(OSV):
 
         sale = self.browse(cursor, user, sale_id, context=context)
 
+        if not sale.party.account_receivable:
+            self.raise_user_error(cursor, 'missing_account_receivable',
+                    error_args=(sale.party.rec_name,), context=context)
+
         invoice_lines = self._get_invoice_line_sale_line(cursor, user, sale,
                 context=context)
         if not invoice_lines:
@@ -757,17 +760,6 @@ class Sale(OSV):
         }, context=context)
         return invoice_id
 
-    def ignore_invoice_exception(self, cursor, user, sale_id, context=None):
-        sale = self.browse(cursor, user, sale_id, context=context)
-        invoice_ids = []
-        for invoice in sale.invoices:
-            if invoice.state == 'cancel':
-                invoice_ids.append(invoice.id)
-        if invoice_ids:
-            self.write(cursor, user, sale_id, {
-                'invoices_ignored': [('add', x) for x in invoice_ids],
-            }, context=context)
-
     def _get_move_sale_line(self, cursor, user, sale, context=None):
         '''
         Return a dictionary of move values for each sale lines
@@ -801,7 +793,6 @@ class Sale(OSV):
         packing_obj = self.pool.get('stock.packing.out')
         move_obj = self.pool.get('stock.move')
         sale_line_obj = self.pool.get('sale.line')
-        workflow_service = LocalService('workflow')
 
         if context is None:
             context = {}
@@ -820,7 +811,6 @@ class Sale(OSV):
             'delivery_address': sale.packing_address.id,
             'reference': sale.reference,
             'warehouse': sale.warehouse.id,
-            'customer_location': sale.party.customer_location.id,
         }, context=ctx)
 
         for line_id in moves:
@@ -830,21 +820,53 @@ class Sale(OSV):
             sale_line_obj.write(cursor, user, line_id, {
                 'moves': [('add', move_id)],
                 }, context=context)
-        workflow_service.trg_validate(0, 'stock.packing.out', packing_id,
-                'waiting', cursor, context=ctx)
+        packing_obj.workflow_trigger_validate(cursor, 0, packing_id,
+                'waiting', context=ctx)
         return packing_id
 
-    def ignore_packing_exception(self, cursor, user, sale_id, context=None):
-        line_obj = self.pool.get('sale.line')
+Sale()
 
-        sale = self.browse(cursor, user, sale_id, context=context)
-        for line in sale.lines:
-            line_obj.ignore_move_exception(cursor, user, line, context=context)
 
-Sale()
+class SaleInvoice(ModelSQL):
+    'Sale - Invoice'
+    _name = 'sale.sale-account.invoice'
+    _table = 'sale_invoices_rel'
+    _description = __doc__
+    sale = fields.Many2One('sale.sale', 'Sale', ondelete='CASCADE', select=1,
+            required=True)
+    invoice = fields.Many2One('account.invoice', 'Invoice',
+            ondelete='RESTRICT', select=1, required=True)
+
+SaleInvoice()
+
+
+class SaleIgnoredInvoice(ModelSQL):
+    'Sale - Ignored Invoice'
+    _name = 'sale.sale-ignored-account.invoice'
+    _table = 'sale_invoice_ignored_rel'
+    _description = __doc__
+    sale = fields.Many2One('sale.sale', 'Sale', ondelete='CASCADE', select=1,
+            required=True)
+    invoice = fields.Many2One('account.invoice', 'Invoice',
+            ondelete='RESTRICT', select=1, required=True)
+
+SaleIgnoredInvoice()
+
+
+class SaleRecreatedInvoice(ModelSQL):
+    'Sale - Recreated Invoice'
+    _name = 'sale.sale-recreated-account.invoice'
+    _table = 'sale_invoice_recreated_rel'
+    _description = __doc__
+    sale = fields.Many2One('sale.sale', 'Sale', ondelete='CASCADE', select=1,
+            required=True)
+    invoice = fields.Many2One('account.invoice', 'Invoice',
+            ondelete='RESTRICT', select=1, required=True)
+
+SaleRecreatedInvoice()
 
 
-class SaleLine(OSV):
+class SaleLine(ModelSQL, ModelView):
     'Sale Line'
     _name = 'sale.line'
     _rec_name = 'description'
@@ -856,18 +878,21 @@ class SaleLine(OSV):
         ('line', 'Line'),
         ('subtotal', 'Subtotal'),
         ('title', 'Title'),
+        ('comment', 'Comment'),
         ], 'Type', select=1, required=True)
     quantity = fields.Float('Quantity',
             digits="(16, unit_digits)",
             states={
                 'invisible': "type != 'line'",
                 'required': "type == 'line'",
+                'readonly': "not globals().get('_parent_sale')",
             }, on_change=['product', 'quantity', 'unit',
                 '_parent_sale.currency', '_parent_sale.party'])
     unit = fields.Many2One('product.uom', 'Unit',
             states={
                 'required': "product",
                 'invisible': "type != 'line'",
+                'readonly': "not globals().get('_parent_sale')",
             }, domain="[('category', '=', " \
                     "(product, 'product.default_uom.category'))]",
             context="{'category': (product, 'product.default_uom.category')}",
@@ -879,11 +904,15 @@ class SaleLine(OSV):
             domain=[('salable', '=', True)],
             states={
                 'invisible': "type != 'line'",
+                'readonly': "not globals().get('_parent_sale')",
             }, on_change=['product', 'unit', 'quantity', 'description',
                 '_parent_sale.party', '_parent_sale.currency'],
-            context="{'locations': [_parent_sale.warehouse], " \
+            context="{'locations': " \
+                        "_parent_sale.warehouse and [_parent_sale.warehouse] " \
+                        "or False, " \
                     "'stock_date_end': _parent_sale.sale_date, " \
-                    "'salable': True}")
+                    "'salable': True, " \
+                    "'stock_skip_warehouse': True}")
     unit_price = fields.Numeric('Unit Price', digits=(16, 4),
             states={
                 'invisible': "type != 'line'",
@@ -893,25 +922,23 @@ class SaleLine(OSV):
             digits="(16, _parent_sale.currency_digits)",
             states={
                 'invisible': "type not in ('line', 'subtotal')",
+                'readonly': "not globals().get('_parent_sale')",
             }, on_change_with=['type', 'quantity', 'unit_price',
                 '_parent_sale.currency'])
-    description = fields.Char('Description', size=None, required=True)
-    comment = fields.Text('Comment',
-            states={
-                'invisible': "type != 'line'",
-            })
-    taxes = fields.Many2Many('account.tax', 'sale_line_account_tax',
-            'line', 'tax', 'Taxes', domain=[('parent', '=', False)],
-            states={
+    description = fields.Text('Description', size=None, required=True)
+    note = fields.Text('Note')
+    taxes = fields.Many2Many('sale.line-account.tax', 'line', 'tax', 'Taxes',
+            domain=[('parent', '=', False)], states={
                 'invisible': "type != 'line'",
             })
-    invoice_lines = fields.Many2Many('account.invoice.line',
-            'sale_line_invoice_lines_rel', 'sale_line', 'invoice_line',
-            'Invoice Lines', readonly=True)
+    invoice_lines = fields.Many2Many('sale.line-account.invoice.line',
+            'sale_line', 'invoice_line', 'Invoice Lines', readonly=True)
     moves = fields.One2Many('stock.move', 'sale_line', 'Moves',
             readonly=True, select=1)
-    moves_ignored = fields.Many2Many('stock.move', 'sale_line_moves_ignored_rel',
-            'sale_line', 'move', 'Moves Ignored', readonly=True)
+    moves_ignored = fields.Many2Many('sale.line-ignored-stock.move',
+            'sale_line', 'move', 'Ignored Moves', readonly=True)
+    moves_recreated = fields.Many2Many('sale.line-recreated-stock.move',
+            'sale_line', 'move', 'Recreated Moves', readonly=True)
     move_done = fields.Function('get_move_done', type='boolean',
             string='Moves Done')
     move_exception = fields.Function('get_move_exception', type='boolean',
@@ -921,11 +948,23 @@ class SaleLine(OSV):
         super(SaleLine, self).__init__()
         self._order.insert(0, ('sequence', 'ASC'))
         self._error_messages.update({
-            'missing_account_revenue': 'It miss ' \
-                    'an "account_revenue" default property!',
             'customer_location_required': 'The customer location is required!',
+            'missing_account_revenue': 'It misses ' \
+                    'an "Account Revenue" on product "%s"!',
+            'missing_account_revenue_property': 'It misses ' \
+                    'an "account Revenue" default property!',
             })
 
+    def init(self, cursor, module_name):
+        super(SaleLine, self).init(cursor, module_name)
+        table = TableHandler(cursor, self, module_name)
+
+        # Migration from 1.0 comment change into note
+        if table.column_exist('comment'):
+            cursor.execute('UPDATE "' + self._table + '" ' \
+                    'SET note = comment')
+            table.drop_column('comment', exception=True)
+
     def default_type(self, cursor, user, context=None):
         return 'line'
 
@@ -964,11 +1003,12 @@ class SaleLine(OSV):
             if line.product.type == 'service':
                 res[line.id] = True
                 continue
-            ignored_ids = [x.id for x in line.moves_ignored]
+            skip_ids = set(x.id for x in line.moves_ignored)
+            skip_ids.update(x.id for x in line.moves_recreated)
             quantity = line.quantity
             for move in line.moves:
                 if move.state != 'done' \
-                        and move.id not in ignored_ids:
+                        and move.id not in skip_ids:
                     val = False
                     break
                 quantity -= uom_obj.compute_qty(cursor, user, move.uom,
@@ -983,19 +1023,35 @@ class SaleLine(OSV):
         res = {}
         for line in self.browse(cursor, user, ids, context=context):
             val = False
-            ignored_ids = [x.id for x in line.moves_ignored]
+            skip_ids = set(x.id for x in line.moves_ignored)
+            skip_ids.update(x.id for x in line.moves_recreated)
             for move in line.moves:
                 if move.state == 'cancel' \
-                        and move.id not in ignored_ids:
+                        and move.id not in skip_ids:
                     val = True
                     break
             res[line.id] = val
         return res
 
+    def _get_tax_rule_pattern(self, cursor, user, party, vals, context=None):
+        '''
+        Get tax rule pattern
+
+        :param cursor: the database cursor
+        :param user: the user id
+        :param party: the BrowseRecord of the party
+        :param vals: a dictionary with value from on_change
+        :param context: the context
+        :return: a dictionary to use as pattern for tax rule
+        '''
+        res = {}
+        return res
+
     def on_change_product(self, cursor, user, ids, vals, context=None):
         party_obj = self.pool.get('party.party')
         product_obj = self.pool.get('product.product')
         uom_obj = self.pool.get('product.uom')
+        tax_rule_obj = self.pool.get('account.tax.rule')
 
         if context is None:
             context = {}
@@ -1026,25 +1082,40 @@ class SaleLine(OSV):
         res['unit_price'] = product_obj.get_sale_price(cursor, user,
                 [product.id], vals.get('quantity', 0), context=ctx2)[product.id]
         res['taxes'] = []
+        pattern = self._get_tax_rule_pattern(cursor, user, party,
+                vals, context=context)
         for tax in product.customer_taxes_used:
-            if party:
-                if 'customer_' + tax.group.code in party_obj._columns \
-                        and party['customer_' + tax.group.code]:
-                    res['taxes'].append(
-                            party['customer_' + tax.group.code].id)
-                    continue
+            if party and party.customer_tax_rule:
+                tax_ids = tax_rule_obj.apply(cursor, user,
+                        party.customer_tax_rule, tax, pattern,
+                        context=context)
+                if tax_ids:
+                    res['taxes'].extend(tax_ids)
+                continue
             res['taxes'].append(tax.id)
+        if party and party.customer_tax_rule:
+            tax_ids = tax_rule_obj.apply(cursor, user,
+                    party.customer_tax_rule, False, pattern,
+                    context=context)
+            if tax_ids:
+                res['taxes'].extend(tax_ids)
 
         if not vals.get('description'):
-            res['description'] = product_obj.name_get(cursor, user, product.id,
-                    context=ctx)[0][1]
+            res['description'] = product_obj.browse(cursor, user, product.id,
+                    context=ctx).rec_name
 
         category = product.sale_uom.category
         if not vals.get('unit') \
                 or vals.get('unit') not in [x.id for x in category.uoms]:
-            res['unit'] = uom_obj.name_get(cursor, user, product.sale_uom.id,
-                    context=context)[0]
+            res['unit'] = product.sale_uom.id
+            res['unit.rec_name'] = product.sale_uom.rec_name
             res['unit_digits'] = product.sale_uom.digits
+
+        vals = vals.copy()
+        vals['unit_price'] = res['unit_price']
+        vals['type'] = 'line'
+        res['amount'] = self.on_change_with_amount(cursor, user, ids,
+                vals, context=context)
         return res
 
     def on_change_quantity(self, cursor, user, ids, vals, context=None):
@@ -1130,21 +1201,29 @@ class SaleLine(OSV):
         res['sequence'] = line.sequence
         res['type'] = line.type
         res['description'] = line.description
+        res['note'] = line.note
         if line.type != 'line':
             return [res]
+
         if line.sale.invoice_method == 'order':
-            res['quantity'] = line.quantity
+            quantity = line.quantity
         else:
             quantity = 0.0
             for move in line.moves:
                 if move.state == 'done':
                     quantity += uom_obj.compute_qty(cursor, user, move.uom,
                             move.quantity, line.unit, context=context)
-            for invoice_line in line.invoice_lines:
-                quantity -= uom_obj.compute_qty(cursor, user,
-                        invoice_line.unit, invoice_line.quantity, line.unit,
-                        context=context)
-            res['quantity'] = quantity
+
+        ignored_ids = set(
+            l.id for i in line.sale.invoices_ignored for l in i.lines)
+        for invoice_line in line.invoice_lines:
+            if invoice_line.invoice.state != 'cancel' or \
+                    invoice_line.id in ignored_ids:
+                quantity -= uom_obj.compute_qty(
+                    cursor, user, invoice_line.unit, invoice_line.quantity,
+                    line.unit, context=context)
+        res['quantity'] = quantity
+
         if res['quantity'] <= 0.0:
             return None
         res['unit'] = line.unit.id
@@ -1153,6 +1232,9 @@ class SaleLine(OSV):
         res['taxes'] = [('set', [x.id for x in line.taxes])]
         if line.product:
             res['account'] = line.product.account_revenue_used.id
+            if not res['account']:
+                self.raise_user_error(cursor, 'missing_account_revenue',
+                        error_args=(line.product.rec_name,), context=context)
         else:
             for model in ('product.template', 'product.category'):
                 res['account'] = property_obj.get(cursor, user,
@@ -1160,18 +1242,19 @@ class SaleLine(OSV):
                 if res['account']:
                     break
             if not res['account']:
-                self.raise_user_error(cursor, 'missing_account_revenue',
-                        context=context)
+                self.raise_user_error(cursor,
+                        'missing_account_revenue_property', context=context)
         return [res]
 
-    def copy(self, cursor, user, line_id, default=None, context=None):
+    def copy(self, cursor, user, ids, default=None, context=None):
         if default is None:
             default = {}
         default = default.copy()
         default['moves'] = False
         default['moves_ignored'] = False
+        default['moves_recreated'] = False
         default['invoice_lines'] = False
-        return super(SaleLine, self).copy(cursor, user, line_id,
+        return super(SaleLine, self).copy(cursor, user, ids,
                 default=default, context=context)
 
     def get_move(self, cursor, user, line, context=None):
@@ -1194,10 +1277,12 @@ class SaleLine(OSV):
             return
         if line.product.type == 'service':
             return
+        skip_ids = set(x.id for x in line.moves_recreated)
         quantity = line.quantity
         for move in line.moves:
-            quantity -= uom_obj.compute_qty(cursor, user, move.uom,
-                    move.quantity, line.unit, context=context)
+            if move.id not in skip_ids:
+                quantity -= uom_obj.compute_qty(cursor, user, move.uom,
+                        move.quantity, line.unit, context=context)
         if quantity <= 0.0:
             return
         if not line.sale.party.customer_location:
@@ -1215,26 +1300,68 @@ class SaleLine(OSV):
         res['planned_date'] = line.sale.sale_date
         return res
 
-    def ignore_move_exception(self, cursor, user, line, context=None):
-        move_ids = []
-        for move in line.moves:
-            if move.state == 'cancel':
-                move_ids.append(move.id)
-        if move_ids:
-            self.write(cursor, user, line.id, {
-                'moves_ignored': [('add', x) for x in move_ids],
-            }, context=context)
-
 SaleLine()
 
 
+class SaleLineTax(ModelSQL):
+    'Sale Line - Tax'
+    _name = 'sale.line-account.tax'
+    _table = 'sale_line_account_tax'
+    _description = __doc__
+    line = fields.Many2One('sale.line', 'Sale Line', ondelete='CASCADE',
+            select=1, required=True)
+    tax = fields.Many2One('account.tax', 'Tax', ondelete='RESTRICT',
+            select=1, required=True)
+
+SaleLineTax()
+
+
+class SaleLineInvoiceLine(ModelSQL):
+    'Sale Line - Invoice Line'
+    _name = 'sale.line-account.invoice.line'
+    _table = 'sale_line_invoice_lines_rel'
+    _description = __doc__
+    sale_line = fields.Many2One('sale.line', 'Sale Line', ondelete='CASCADE',
+            select=1, required=True)
+    invoice_line = fields.Many2One('account.invoice.line', 'Invoice Line',
+            ondelete='RESTRICT', select=1, required=True)
+
+SaleLineInvoiceLine()
+
+
+class SaleLineIgnoredMove(ModelSQL):
+    'Sale Line - Ignored Move'
+    _name = 'sale.line-ignored-stock.move'
+    _table = 'sale_line_moves_ignored_rel'
+    _description = __doc__
+    sale_line = fields.Many2One('sale.line', 'Sale Line', ondelete='CASCADE',
+            select=1, required=True)
+    move = fields.Many2One('stock.move', 'Move', ondelete='RESTRICT',
+            select=1, required=True)
+
+SaleLineIgnoredMove()
+
+
+class SaleLineRecreatedMove(ModelSQL):
+    'Sale Line - Recreated Move'
+    _name = 'sale.line-recreated-stock.move'
+    _table = 'sale_line_moves_recreated_rel'
+    _description = __doc__
+    sale_line = fields.Many2One('sale.line', 'Sale Line', ondelete='CASCADE',
+            select=1, required=True)
+    move = fields.Many2One('stock.move', 'Move', ondelete='RESTRICT',
+            select=1, required=True)
+
+SaleLineRecreatedMove()
+
+
 class SaleReport(CompanyReport):
     _name = 'sale.sale'
 
 SaleReport()
 
 
-class Template(OSV):
+class Template(ModelSQL, ModelView):
     _name = 'product.template'
 
     salable = fields.Boolean('Salable', states={
@@ -1272,14 +1399,12 @@ class Template(OSV):
                     res = default_uom.id
             else:
                 res = default_uom.id
-        if res:
-            res = uom_obj.name_get(cursor, user, res, context=context)[0]
         return res
 
 Template()
 
 
-class Product(OSV):
+class Product(ModelSQL, ModelView):
     _name = 'product.product'
 
     def on_change_with_sale_uom(self, cursor, user, ids, vals, context=None):
@@ -1337,11 +1462,18 @@ class Product(OSV):
 Product()
 
 
-class PackingOut(OSV):
+class PackingOut(ModelSQL, ModelView):
     _name = 'stock.packing.out'
 
+    def __init__(self):
+        super(PackingOut, self).__init__()
+        self._error_messages.update({
+                'reset_move': 'You cannot reset to draft a move generated '\
+                    'by a sale.',
+            })
+
     def write(self, cursor, user, ids, vals, context=None):
-        workflow_service = LocalService('workflow')
+        sale_obj = self.pool.get('sale.sale')
         sale_line_obj = self.pool.get('sale.line')
 
         res = super(PackingOut, self).write(cursor, user, ids, vals,
@@ -1364,15 +1496,23 @@ class PackingOut(OSV):
                     if sale_line.sale.id not in sale_ids:
                         sale_ids.append(sale_line.sale.id)
 
-            for sale_id in sale_ids:
-                workflow_service.trg_validate(user, 'sale.sale', sale_id,
-                        'packing_update', cursor, context=context)
+            sale_obj.workflow_trigger_validate(cursor, user, sale_ids,
+                    'packing_update', context=context)
         return res
 
+    def button_draft(self, cursor, user, ids, context=None):
+        for packing in self.browse(cursor, user, ids, context=context):
+            for move in packing.outgoing_moves:
+                if move.state == 'cancel' and move.sale_line:
+                    self.raise_user_error(cursor, 'reset_move')
+
+        return super(PackingOut, self).button_draft(
+            cursor, user, ids, context=context)
+
 PackingOut()
 
 
-class Move(OSV):
+class Move(ModelSQL, ModelView):
     _name = 'stock.move'
 
     sale_line = fields.Many2One('sale.line', select=1,
@@ -1382,6 +1522,12 @@ class Move(OSV):
     sale = fields.Function('get_sale', type='many2one',
             relation='sale.sale', string='Sale',
             fnct_search='search_sale', select=1)
+    sale_exception_state = fields.Function('get_sale_exception_state',
+            type='selection',
+            selection=[('', ''),
+                       ('ignored', 'Ignored'),
+                       ('recreated', 'Recreated')],
+            string='Exception State')
 
     def get_sale(self, cursor, user, ids, name, arg, context=None):
         sale_obj = self.pool.get('sale.sale')
@@ -1391,17 +1537,6 @@ class Move(OSV):
             res[move.id] = False
             if move.sale_line:
                 res[move.id] = move.sale_line.sale.id
-
-        sale_names = {}
-        for sale_id , sale_name in sale_obj.name_get(cursor, user,
-                [x for x in res.values() if x], context=context):
-            sale_names[sale_id] = sale_name
-
-        for i in res.keys():
-            if res[i] and res[i] in sale_names:
-                res[i] = (res[i], sale_names[res[i]])
-            else:
-                res[i] = False
         return res
 
     def search_sale(self, cursor, user, name, args, context=None):
@@ -1413,40 +1548,117 @@ class Move(OSV):
             i += 1
         return args2
 
+    def get_sale_exception_state(self, cursor, user, ids, name, arg,
+                                 context=None):
+        res = {}.fromkeys(ids, '')
+        for move in self.browse(cursor, user, ids, context=context):
+            if not move.sale_line:
+                continue
+            if move.id in (x.id for x in move.sale_line.moves_recreated):
+                res[move.id] = 'recreated'
+            if move.id in (x.id for x in move.sale_line.moves_ignored):
+                res[move.id] = 'ignored'
+        return res
+
     def write(self, cursor, user, ids, vals, context=None):
-        workflow_service = LocalService('workflow')
+        sale_obj = self.pool.get('sale.sale')
         sale_line_obj = self.pool.get('sale.line')
 
         res = super(Move, self).write(cursor, user, ids, vals,
                 context=context)
         if 'state' in vals and vals['state'] in ('cancel',):
-            sale_ids = []
+            if isinstance(ids, (int, long)):
+                ids = [ids]
+            sale_ids = set()
             sale_line_ids = sale_line_obj.search(cursor, user, [
                 ('moves', 'in', ids),
                 ], context=context)
             if sale_line_ids:
                 for sale_line in sale_line_obj.browse(cursor, user,
                         sale_line_ids, context=context):
-                    if sale_line.sale.id not in sale_ids:
-                        sale_ids.append(sale_line.sale.id)
-            for sale_id in sale_ids:
-                workflow_service.trg_validate(user, 'sale.sale',
-                        sale_id, 'packing_update', cursor, context=context)
+                    sale_ids.add(sale_line.sale.id)
+            if sale_ids:
+                sale_obj.workflow_trigger_validate(cursor, user, list(sale_ids),
+                        'packing_update', context=context)
+        return res
+
+    def delete(self, cursor, user, ids, context=None):
+        sale_obj = self.pool.get('sale.sale')
+        sale_line_obj = self.pool.get('sale.line')
+
+        if isinstance(ids, (int, long)):
+            ids = [ids]
+
+        sale_ids = set()
+        sale_line_ids = sale_line_obj.search(cursor, user, [
+            ('moves', 'in', ids),
+            ], context=context)
+
+        res = super(Move, self).delete(cursor, user, ids, context=context)
+
+        if sale_line_ids:
+            for sale_line in sale_line_obj.browse(cursor, user,
+                    sale_line_ids, context=context):
+                sale_ids.add(sale_line.sale.id)
+            if sale_ids:
+                sale_obj.workflow_trigger_validate(cursor, user, list(sale_ids),
+                        'packing_update', context=context)
         return res
 
 Move()
 
 
-class Invoice(OSV):
+class Invoice(ModelSQL, ModelView):
     _name = 'account.invoice'
 
+    sale_exception_state = fields.Function('get_sale_exception_state',
+            type='selection',
+            selection=[('', ''),
+                       ('ignored', 'Ignored'),
+                       ('recreated', 'Recreated')],
+            string='Exception State')
+
     def __init__(self):
         super(Invoice, self).__init__()
         self._error_messages.update({
             'delete_sale_invoice': 'You can not delete invoices ' \
-                    'that comes from a sale!',
+                    'that come from a sale!',
+            'reset_invoice_sale': 'You cannot reset to draft ' \
+                    'an invoice generated by a sale.',
             })
 
+    def button_draft(self, cursor, user, ids, context=None):
+        sale_obj = self.pool.get('sale.sale')
+        sale_ids = sale_obj.search(
+            cursor, user, [('invoices', 'in', ids)], context=context)
+
+        if sale_ids:
+            self.raise_user_error(cursor, 'reset_invoice_sale')
+
+        return super(Invoice, self).button_draft(
+            cursor, user, ids, context=context)
+
+    def get_sale_exception_state(self, cursor, user, ids, name, arg,
+                                 context=None):
+        sale_obj = self.pool.get('sale.sale')
+        sale_ids = sale_obj.search(
+            cursor, user, [('invoices', 'in', ids)], context=context)
+
+        sales = sale_obj.browse(
+            cursor, user, sale_ids, context=context)
+
+        recreated_ids = tuple(i.id for p in sales for i in p.invoices_recreated)
+        ignored_ids = tuple(i.id for p in sales for i in p.invoices_ignored)
+
+        res = {}.fromkeys(ids, '')
+        for invoice in self.browse(cursor, user, ids, context=context):
+            if invoice.id in recreated_ids:
+                res[invoice.id] = 'recreated'
+            elif invoice.id in ignored_ids:
+                res[invoice.id] = 'ignored'
+
+        return res
+
     def delete(self, cursor, user, ids, context=None):
         if not ids:
             return True
@@ -1462,3 +1674,239 @@ class Invoice(OSV):
                 context=context)
 
 Invoice()
+
+
+class OpenCustomer(Wizard):
+    'Open Customers'
+    _name = 'sale.open_customer'
+    states = {
+        'init': {
+            'result': {
+                'type': 'action',
+                'action': '_action_open',
+                'state': 'end',
+            },
+        },
+    }
+
+    def _action_open(self, cursor, user, datas, context=None):
+        model_data_obj = self.pool.get('ir.model.data')
+        act_window_obj = self.pool.get('ir.action.act_window')
+        wizard_obj = self.pool.get('ir.action.wizard')
+
+        model_data_ids = model_data_obj.search(cursor, user, [
+            ('fs_id', '=', 'act_party_form'),
+            ('module', '=', 'party'),
+            ('inherit', '=', False),
+            ], limit=1, context=context)
+        model_data = model_data_obj.browse(cursor, user, model_data_ids[0],
+                context=context)
+        res = act_window_obj.read(cursor, user, model_data.db_id,
+                context=context)
+        cursor.execute("SELECT DISTINCT(party) FROM sale_sale")
+        customer_ids = [line[0] for line in cursor.fetchall()]
+        res['domain'] = str([('id', 'in', customer_ids)])
+
+        model_data_ids = model_data_obj.search(cursor, user, [
+            ('fs_id', '=', 'act_open_customer'),
+            ('module', '=', 'sale'),
+            ('inherit', '=', False),
+            ], limit=1, context=context)
+        model_data = model_data_obj.browse(cursor, user, model_data_ids[0],
+                context=context)
+        wizard = wizard_obj.browse(cursor, user, model_data.db_id,
+                context=context)
+
+        res['name'] = wizard.name
+        return res
+
+OpenCustomer()
+
+
+class HandlePackingExceptionAsk(ModelView):
+    'Shipment Exception Ask'
+    _name = 'sale.handle.packing.exception.ask'
+    _description = __doc__
+
+    recreate_moves = fields.Many2Many(
+        'stock.move', None, None, 'Recreate Moves',
+        domain="[('id', 'in', domain_moves)]", depends=['domain_moves'])
+    domain_moves = fields.Many2Many(
+        'stock.move', None, None, 'Domain Moves')
+
+    def default_recreate_moves(self, cursor, user, context=None):
+        return self.default_domain_moves(cursor, user, context=context)
+
+    def default_domain_moves(self, cursor, user, context=None):
+        sale_line_obj = self.pool.get('sale.line')
+        active_id = context and context.get('active_id')
+        if not active_id:
+            return []
+
+        line_ids = sale_line_obj.search(
+            cursor, user, [('sale', '=', active_id)],
+            context=context)
+        lines = sale_line_obj.browse(cursor, user, line_ids, context=context)
+
+        domain_moves = []
+        for line in lines:
+            skip_ids = set(x.id for x in line.moves_ignored)
+            skip_ids.update(x.id for x in line.moves_recreated)
+            for move in line.moves:
+                if move.state == 'cancel' and move.id not in skip_ids:
+                    domain_moves.append(move.id)
+
+        return domain_moves
+
+HandlePackingExceptionAsk()
+
+class HandlePackingException(Wizard):
+    'Handle Shipment Exception'
+    _name = 'sale.handle.packing.exception'
+    states = {
+        'init': {
+            'actions': [],
+            'result': {
+                'type': 'form',
+                'object': 'sale.handle.packing.exception.ask',
+                'state': [
+                    ('end', 'Cancel', 'tryton-cancel'),
+                    ('ok', 'Ok', 'tryton-ok', True),
+                ],
+            },
+        },
+        'ok': {
+            'result': {
+                'type': 'action',
+                'action': '_handle_moves',
+                'state': 'end',
+            },
+        },
+    }
+
+    def _handle_moves(self, cursor, user, data, context=None):
+        sale_obj = self.pool.get('sale.sale')
+        sale_line_obj = self.pool.get('sale.line')
+        move_obj = self.pool.get('stock.move')
+        packing_obj = self.pool.get('stock.packing.out')
+        to_recreate = data['form']['recreate_moves'][0][1]
+        domain_moves = data['form']['domain_moves'][0][1]
+
+        sale = sale_obj.browse(cursor, user, data['id'], context=context)
+
+        for line in sale.lines:
+            moves_ignored = []
+            moves_recreated = []
+            skip_ids = set(x.id for x in line.moves_ignored)
+            skip_ids.update(x.id for x in line.moves_recreated)
+            for move in line.moves:
+                if move.id not in domain_moves or move.id in skip_ids:
+                    continue
+                if move.id in to_recreate:
+                    moves_recreated.append(move.id)
+                else:
+                    moves_ignored.append(move.id)
+
+            sale_line_obj.write(
+                cursor, user, line.id,
+                {'moves_ignored': [('add', moves_ignored)],
+                 'moves_recreated': [('add', moves_recreated)]},
+                context=context)
+
+        sale_obj.workflow_trigger_validate(cursor, user, data['id'],
+                'packing_ok', context=context)
+
+HandlePackingException()
+
+
+class HandleInvoiceExceptionAsk(ModelView):
+    'Invoice Exception Ask'
+    _name = 'sale.handle.invoice.exception.ask'
+    _description = __doc__
+
+    recreate_invoices = fields.Many2Many(
+        'account.invoice', None, None, 'Recreate Invoices',
+        domain="[('id', 'in', domain_invoices)]", depends=['domain_invoices'],
+        help='The selected invoices will be recreated. '\
+            'The other ones will be ignored.')
+    domain_invoices = fields.Many2Many(
+        'account.invoice', None, None, 'Domain Invoices')
+
+    def default_recreate_invoices(self, cursor, user, context=None):
+        return self.default_domain_invoices(cursor, user, context=context)
+
+    def default_domain_invoices(self, cursor, user, context=None):
+        sale_obj = self.pool.get('sale.sale')
+        active_id = context and context.get('active_id')
+        if not active_id:
+            return []
+
+        sale = sale_obj.browse(
+            cursor, user, active_id, context=context)
+        skip_ids = set(x.id for x in sale.invoices_ignored)
+        skip_ids.update(x.id for x in sale.invoices_recreated)
+        domain_invoices = []
+        for invoice in sale.invoices:
+            if invoice.state == 'cancel' and invoice.id not in skip_ids:
+                domain_invoices.append(invoice.id)
+
+        return domain_invoices
+
+HandleInvoiceExceptionAsk()
+
+
+class HandleInvoiceException(Wizard):
+    'Handle Invoice Exception'
+    _name = 'sale.handle.invoice.exception'
+    states = {
+        'init': {
+            'actions': [],
+            'result': {
+                'type': 'form',
+                'object': 'sale.handle.invoice.exception.ask',
+                'state': [
+                    ('end', 'Cancel', 'tryton-cancel'),
+                    ('ok', 'Ok', 'tryton-ok', True),
+                ],
+            },
+        },
+        'ok': {
+            'result': {
+                'type': 'action',
+                'action': '_handle_invoices',
+                'state': 'end',
+            },
+        },
+    }
+
+    def _handle_invoices(self, cursor, user, data, context=None):
+        sale_obj = self.pool.get('sale.sale')
+        invoice_obj = self.pool.get('account.invoice')
+        to_recreate = data['form']['recreate_invoices'][0][1]
+        domain_invoices = data['form']['domain_invoices'][0][1]
+
+        sale = sale_obj.browse(cursor, user, data['id'], context=context)
+
+        skip_ids = set(x.id for x in sale.invoices_ignored)
+        skip_ids.update(x.id for x in sale.invoices_recreated)
+        invoices_ignored = []
+        invoices_recreated = []
+        for invoice in sale.invoices:
+            if invoice.id not in domain_invoices or invoice.id in skip_ids:
+                continue
+            if invoice.id in to_recreate:
+                invoices_recreated.append(invoice.id)
+            else:
+                invoices_ignored.append(invoice.id)
+
+        sale_obj.write(
+            cursor, user, sale.id,
+            {'invoices_ignored': [('add', invoices_ignored)],
+             'invoices_recreated': [('add', invoices_recreated)],
+             },
+            context=context)
+
+        sale_obj.workflow_trigger_validate(cursor, user, data['id'],
+                'invoice_ok', context=context)
+
+HandleInvoiceException()
diff --git a/sale.xml b/sale.xml
index af6ac31..d277bab 100644
--- a/sale.xml
+++ b/sale.xml
@@ -1,5 +1,6 @@
 <?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. -->
+<!-- This file is part of Tryton.  The COPYRIGHT file at the top level of
+this repository contains the full copyright notices and license terms. -->
 <tryton>
     <data>
         <menuitem name="Sale Management" id="menu_sale" sequence="5"/>
@@ -10,6 +11,18 @@
             <field name="groups" eval="[('add', ref('group_sale'))]"/>
         </record>
 
+        <record model="ir.action.wizard" id="wizard_packing_handle_exception">
+            <field name="name">Handle Shipment Exception</field>
+            <field name="wiz_name">sale.handle.packing.exception</field>
+            <field name="model">sale.sale</field>
+        </record>
+
+        <record model="ir.action.wizard" id="wizard_invoice_handle_exception">
+            <field name="name">Handle Invoice Exception</field>
+            <field name="wiz_name">sale.handle.invoice.exception</field>
+            <field name="model">sale.sale</field>
+        </record>
+
         <record model="ir.ui.view" id="sale_view_form">
             <field name="model">sale.sale</field>
             <field name="type">form</field>
@@ -27,7 +40,7 @@
                     <label name="reference"/>
                     <field name="reference"/>
                     <notebook colspan="6">
-                        <page string="Sale">
+                        <page string="Sale" id="sale">
                             <label name="sale_date"/>
                             <field name="sale_date"/>
                             <label name="payment_term"/>
@@ -50,13 +63,13 @@
                                     <field name="unit_digits" tree_invisible="1"/>
                                 </tree>
                             </field>
-                            <group col="2" colspan="2">
+                            <group col="2" colspan="2" id="states">
                                 <label name="invoice_state"/>
                                 <field name="invoice_state"/>
                                 <label name="packing_state"/>
                                 <field name="packing_state"/>
                             </group>
-                            <group col="2" colspan="2">
+                            <group col="2" colspan="2" id="amount_state_buttons">
                                 <label name="untaxed_amount"/>
                                 <field name="untaxed_amount"/>
                                 <label name="tax_amount"/>
@@ -65,29 +78,33 @@
                                 <field name="total_amount"/>
                                 <label name="state"/>
                                 <field name="state"/>
-                                <group col="6" colspan="2">
+                                <group col="6" colspan="2" id="buttons">
                                     <button name="cancel" string="Cancel"
                                         states="{'invisible': '''not ((state in ('draft', 'quotation')) or (invoice_state == 'exception') or (packing_state == 'exception')) ''', 'readonly': '''%(group_sale)d not in groups'''}"
                                         icon="tryton-cancel"/>
                                     <button name="draft" string="Draft"
                                         states="{'invisible': '''state != 'quotation' ''', 'readonly': '''%(group_sale)d not in groups'''}"
-                                        icon="tryton-clear"/>
+                                        icon="tryton-go-previous"/>
                                     <button name="quotation" string="Quotation"
-                                        states="{'invisible': '''state != 'draft' ''', 'readonly': '''%(group_sale)d not in groups'''}"
-                                        icon="tryton-go-next"/>
-                                    <button name="invoice_ok" string="Ignore Invoice Exception"
-                                        states="{'invisible': '''invoice_state != 'exception' or state == 'cancel' ''', 'readonly': '''%(group_sale)d not in groups'''}"
-                                        icon="tryton-go-next"/>
-                                    <button name="packing_ok" string="Ignore Packing Exception"
-                                        states="{'invisible': '''packing_state != 'exception' or state == 'cancel' ''', 'readonly': '''%(group_sale)d not in groups'''}"
+                                        states="{'invisible': '''state != 'draft' ''', 'readonly': '''(not bool(lines)) or %(group_sale)d not in groups'''}"
                                         icon="tryton-go-next"/>
+                                    <button name="%(wizard_invoice_handle_exception)d"
+                                            string="Handle Invoice Exception"
+                                            type="action"
+                                            states="{'invisible': '''invoice_state != 'exception' or state == 'cancel' ''', 'readonly': '''%(group_sale)d not in groups'''}"
+                                            icon="tryton-go-next"/>
+                                    <button name="%(wizard_packing_handle_exception)d"
+                                            type="action"
+                                            string="Handle Shipment Exception"
+                                            states="{'invisible': '''packing_state != 'exception' or state == 'cancel' ''', 'readonly': '''%(group_sale)d not in groups'''}"
+                                            icon="tryton-go-next"/>
                                     <button name="confirm" string="Confirm"
                                         states="{'invisible': '''state != 'quotation' ''', 'readonly': '''%(group_sale)d not in groups'''}"
                                         icon="tryton-go-next"/>
                                 </group>
                             </group>
                         </page>
-                        <page string="Other Info">
+                        <page string="Other Info" id="other">
                             <label name="company"/>
                             <field name="company"/>
                             <newline/>
@@ -98,12 +115,42 @@
                             <separator name="comment" colspan="4"/>
                             <field name="comment" colspan="4" spell="party_lang"/>
                         </page>
-                        <page string="Invoices">
-                            <field name="invoices" colspan="4" widget="one2many"/>
+                        <page string="Invoices" id="invoices">
+                            <separator name="invoices" colspan="4"/>
+                            <field name="invoices" colspan="4">
+                                <tree>
+                                  <field name="number" select="1"/>
+                                  <field name="reference" select="1"/>
+                                  <field name="invoice_date" select="2"/>
+                                  <field name="party" select="1"/>
+                                  <field name="currency" select="2"/>
+                                  <field name="untaxed_amount" select="2"/>
+                                  <field name="tax_amount" select="2"/>
+                                  <field name="total_amount" select="2"/>
+                                  <field name="state" select="2"/>
+                                  <field name="sale_exception_state"/>
+                                  <field name="amount_to_pay_today"/>
+                                  <field name="description" select="2"/>
+                                  <field name="currency_digits" tree_invisible="1"/>
+                              </tree>
+                            </field>
                         </page>
-                        <page string="Packings">
-                            <field name="packings" colspan="4" widget="one2many"/>
-                            <field name="moves" colspan="4" widget="one2many"/>
+                        <page string="Shipments" id="packings">
+                            <separator name="moves" colspan="4"/>
+                            <field name="moves" colspan="4">
+                                <tree string="Moves">
+                                    <field name="product"/>
+                                    <field name="from_location"/>
+                                    <field name="to_location"/>
+                                    <field name="quantity"/>
+                                    <field name="uom"/>
+                                    <field name="state"/>
+                                    <field name="sale_exception_state"/>
+                                    <field name="unit_digits" tree_invisible="1"/>
+                                </tree>
+                            </field>
+                            <separator name="packings" colspan="4"/>
+                            <field name="packings" colspan="4"/>
                         </page>
                     </notebook>
                     <field name="currency_digits" invisible="1" colspan="6"/>
@@ -135,6 +182,66 @@
             </field>
         </record>
 
+        <record model="ir.ui.view" id="handle_packing_exception_view_form">
+            <field name="model">sale.handle.packing.exception.ask</field>
+            <field name="type">form</field>
+            <field name="arch" type="xml">
+                <![CDATA[
+                <form string="Handle packing Exception" col="1">
+                        <separator string="Choose move to recreate"
+                                   id="choose"/>
+                        <field name="recreate_moves">
+                          <tree string="Recreate Moves" fill="1">
+                              <field name="product"/>
+                              <field name="quantity"/>
+                              <field name="uom"/>
+                              <field name="unit_digits" tree_invisible="1"/>
+                          </tree>
+                        </field>
+                </form>
+                ]]>
+            </field>
+        </record>
+
+        <record model="ir.ui.view" id="handle_invoice_exception_view_form">
+            <field name="model">sale.handle.invoice.exception.ask</field>
+            <field name="type">form</field>
+            <field name="arch" type="xml">
+                <![CDATA[
+                <form string="Handle Invoice Exception" col="1">
+                    <separator string="Choose invoices to recreate"
+                               id="choose"/>
+                    <field name="recreate_invoices"/>
+                </form>
+                ]]>
+            </field>
+        </record>
+
+        <record model="ir.action.act_window" id="act_packing_form">
+            <field name="name">Shipments</field>
+            <field name="res_model">stock.packing.out</field>
+            <field name="view_type">form</field>
+            <field name="domain">[("id", "in", packings)]</field>
+        </record>
+        <record model="ir.action.keyword"
+                id="act_open_packing_keyword1">
+            <field name="keyword">form_relate</field>
+            <field name="model">sale.sale,0</field>
+            <field name="action" ref="act_packing_form"/>
+        </record>
+        <record model="ir.action.act_window" id="act_invoice_form">
+            <field name="name">Invoices</field>
+            <field name="res_model">account.invoice</field>
+            <field name="view_type">form</field>
+            <field name="domain">[("id", "in", invoices)]</field>
+        </record>
+        <record model="ir.action.keyword"
+                id="act_open_invoice_keyword1">
+            <field name="keyword">form_relate</field>
+            <field name="model">sale.sale,0</field>
+            <field name="action" ref="act_invoice_form"/>
+        </record>
+
         <record model="ir.action.act_window" id="act_sale_form">
             <field name="name">Sales</field>
             <field name="res_model">sale.sale</field>
@@ -153,6 +260,24 @@
         <menuitem parent="menu_sale" action="act_sale_form"
             id="menu_sale_form"/>
 
+        <record model="ir.action.act_window" id="act_sale_form_new">
+            <field name="name">New Sale</field>
+            <field name="res_model">sale.sale</field>
+            <field name="view_type">form</field>
+        </record>
+        <record model="ir.action.act_window.view" id="act_sale_form_new_view1">
+            <field name="sequence" eval="20"/>
+            <field name="view" ref="sale_view_tree"/>
+            <field name="act_window" ref="act_sale_form_new"/>
+        </record>
+        <record model="ir.action.act_window.view" id="act_sale_form_new_view2">
+            <field name="sequence" eval="10"/>
+            <field name="view" ref="sale_view_form"/>
+            <field name="act_window" ref="act_sale_form_new"/>
+        </record>
+        <menuitem parent="menu_sale_form" action="act_sale_form_new"
+            id="menu_sale_form_new" sequence="10"/>
+
         <record model="ir.action.act_window" id="act_sale_form_draft">
             <field name="name">Draft Sales</field>
             <field name="res_model">sale.sale</field>
@@ -170,7 +295,7 @@
             <field name="act_window" ref="act_sale_form_draft"/>
         </record>
         <menuitem parent="menu_sale_form" action="act_sale_form_draft"
-            id="menu_sale_form_draft"/>
+            id="menu_sale_form_draft" sequence="20"/>
 
         <record model="ir.action.act_window" id="act_sale_form_quotation">
             <field name="name">Quotation Sales</field>
@@ -189,7 +314,7 @@
             <field name="act_window" ref="act_sale_form_quotation"/>
         </record>
         <menuitem parent="menu_sale_form" action="act_sale_form_quotation"
-            id="menu_sale_form_quotation"/>
+            id="menu_sale_form_quotation" sequence="30"/>
 
         <record model="ir.action.act_window" id="act_sale_form_confirmed">
             <field name="name">Confirmed Sales</field>
@@ -208,7 +333,7 @@
             <field name="act_window" ref="act_sale_form_confirmed"/>
         </record>
         <menuitem parent="menu_sale_form" action="act_sale_form_confirmed"
-            id="menu_sale_form_confirmed"/>
+            id="menu_sale_form_confirmed" sequence="40"/>
 
         <record model="ir.model.access" id="access_sale">
             <field name="model" search="[('model', '=', 'sale.sale')]"/>
@@ -265,17 +390,11 @@
             <field name="workflow" ref="sale_workflow"/>
             <field name="split_mode">OR</field>
         </record>
-        <record model="workflow.activity" id="sale_activity_invoice_sale">
-            <field name="name">Invoice</field>
-            <field name="workflow" ref="sale_workflow"/>
-            <field name="kind">function</field>
-            <field name="action">create_invoice()
write({'invoice_state': 'waiting'})</field>
-        </record>
         <record model="workflow.activity" id="sale_activity_waiting_invoice_sale">
             <field name="name">Waiting Invoice</field>
             <field name="workflow" ref="sale_workflow"/>
             <field name="kind">function</field>
-            <field name="action">write({'invoice_state': 'waiting'})
ignore_invoice_exception()</field>
+            <field name="action">create_invoice()
write({'invoice_state': 'waiting'})</field>
         </record>
         <record model="workflow.activity" id="sale_activity_invoice_sale_exception">
             <field name="name">Invoice Exception</field>
@@ -290,36 +409,36 @@
             <field name="action">write({'invoice_state': 'paid'})</field>
         </record>
         <record model="workflow.activity" id="sale_activity_packing_invoice_method">
-            <field name="name">Packing Invoice Method</field>
+            <field name="name">Shipment Invoice Method</field>
             <field name="workflow" ref="sale_workflow"/>
             <field name="split_mode">OR</field>
         </record>
         <record model="workflow.activity" id="sale_activity_packing_invoice">
-            <field name="name">Packing Invoice</field>
+            <field name="name">Shipment Invoice</field>
             <field name="workflow" ref="sale_workflow"/>
             <field name="kind">function</field>
             <field name="action">create_packing()</field>
         </record>
         <record model="workflow.activity" id="sale_activity_waiting_packing_invoice">
-            <field name="name">Waiting Packing Invoice</field>
+            <field name="name">Waiting Shipment Invoice</field>
             <field name="workflow" ref="sale_workflow"/>
             <field name="kind">function</field>
-            <field name="action">write({'packing_state': 'waiting'})
ignore_packing_exception
create_packing()</field>
+            <field name="action">write({'packing_state': 'waiting'})
create_packing()</field>
         </record>
         <record model="workflow.activity" id="sale_activity_packing_invoice_exception">
-            <field name="name">Packing Invoice Exception</field>
+            <field name="name">Shipment Invoice Exception</field>
             <field name="workflow" ref="sale_workflow"/>
             <field name="kind">function</field>
             <field name="action">write({'packing_state': 'exception'})</field>
         </record>
         <record model="workflow.activity" id="sale_activity_packing_invoice_done">
-            <field name="name">Packing Invoice Done</field>
+            <field name="name">Shipment Invoice Done</field>
             <field name="workflow" ref="sale_workflow"/>
             <field name="kind">function</field>
             <field name="action">write({'packing_state': 'sent'})</field>
         </record>
         <record model="workflow.activity" id="sale_activity_packing_invoice_method_done">
-            <field name="name">Packing Invoice Method Done</field>
+            <field name="name">Shipment Invoice Method Done</field>
             <field name="workflow" ref="sale_workflow"/>
         </record>
         <record model="workflow.activity" id="sale_activity_invoice_method_done">
@@ -327,64 +446,64 @@
             <field name="workflow" ref="sale_workflow"/>
         </record>
         <record model="workflow.activity" id="sale_activity_packing_method">
-            <field name="name">Packing Method</field>
+            <field name="name">Shipment Method</field>
             <field name="workflow" ref="sale_workflow"/>
         </record>
         <record model="workflow.activity" id="sale_activity_packing">
-            <field name="name">Packing</field>
+            <field name="name">Shipment</field>
             <field name="workflow" ref="sale_workflow"/>
             <field name="kind">function</field>
             <field name="action">create_packing()</field>
         </record>
         <record model="workflow.activity" id="sale_activity_waiting_packing">
-            <field name="name">Waiting Packing</field>
+            <field name="name">Waiting Shipment</field>
             <field name="workflow" ref="sale_workflow"/>
             <field name="kind">function</field>
-            <field name="action">write({'packing_state': 'waiting'})
ignore_packing_exception()
create_packing()</field>
+            <field name="action">write({'packing_state': 'waiting'})
create_packing()</field>
         </record>
         <record model="workflow.activity" id="sale_activity_packing_exception">
-            <field name="name">Packing Exception</field>
+            <field name="name">Shipment Exception</field>
             <field name="workflow" ref="sale_workflow"/>
             <field name="kind">function</field>
             <field name="action">write({'packing_state': 'exception'})</field>
         </record>
         <record model="workflow.activity" id="sale_activity_invoice_packing_method">
-            <field name="name">Invoice Packing Method</field>
+            <field name="name">Invoice Shipment Method</field>
             <field name="workflow" ref="sale_workflow"/>
             <field name="split_mode">OR</field>
         </record>
         <record model="workflow.activity" id="sale_activity_invoice_packing">
-            <field name="name">Invoice Packing</field>
+            <field name="name">Invoice Shipment</field>
             <field name="workflow" ref="sale_workflow"/>
             <field name="kind">function</field>
             <field name="action">create_invoice()
write({'invoice_state': 'waiting'})</field>
         </record>
         <record model="workflow.activity" id="sale_activity_waiting_invoice_packing">
-            <field name="name">Waiting Invoice Packing</field>
+            <field name="name">Waiting Invoice Shipment</field>
             <field name="workflow" ref="sale_workflow"/>
             <field name="kind">function</field>
-            <field name="action">write({'invoice_state': 'waiting', 'packing_state': 'sent'})
ignore_invoice_exception()</field>
+            <field name="action">write({'invoice_state': 'waiting', 'packing_state': 'sent'})</field>
         </record>
         <record model="workflow.activity" id="sale_activity_invoice_packing_exception">
-            <field name="name">Invoice Packing Exception</field>
+            <field name="name">Invoice Shipment Exception</field>
             <field name="workflow" ref="sale_workflow"/>
             <field name="kind">function</field>
             <field name="action">write({'invoice_state': 'exception'})</field>
         </record>
         <record model="workflow.activity" id="sale_activity_invoice_packing_done">
-            <field name="name">Invoice Packing Done</field>
+            <field name="name">Invoice Shipment Done</field>
             <field name="workflow" ref="sale_workflow"/>
             <field name="kind">function</field>
             <field name="action">write({'invoice_state': 'paid'})</field>
         </record>
         <record model="workflow.activity" id="sale_activity_invoice_packing_method_done">
-            <field name="name">Invoice Packing Method Done</field>
+            <field name="name">Invoice Shipment Method Done</field>
             <field name="workflow" ref="sale_workflow"/>
             <field name="kind">function</field>
             <field name="action">write({'packing_state': 'sent'})</field>
         </record>
         <record model="workflow.activity" id="sale_activity_packing_method_done">
-            <field name="name">Packing Method Done</field>
+            <field name="name">Shipment Method Done</field>
             <field name="workflow" ref="sale_workflow"/>
         </record>
         <record model="workflow.activity" id="sale_activity_done">
@@ -396,7 +515,7 @@
             <field name="flow_stop" eval="True"/>
         </record>
         <record model="workflow.activity" id="sale_activity_cancel">
-            <field name="name">Cancel</field>
+            <field name="name">Canceled</field>
             <field name="workflow" ref="sale_workflow"/>
             <field name="kind">function</field>
             <field name="action">write({'state': 'cancel'})</field>
@@ -406,6 +525,7 @@
         <record model="workflow.transition" id="sale_transition_draft_quotation">
             <field name="act_from" ref="sale_activity_draft"/>
             <field name="act_to" ref="sale_activity_quotation"/>
+            <field name="condition">bool(lines)</field>
             <field name="signal">quotation</field>
             <field name="group" ref="group_sale"/>
         </record>
@@ -438,9 +558,9 @@
             <field name="act_to" ref="sale_activity_invoice_method"/>
         </record>
 
-        <record model="workflow.transition" id="sale_transition_invoice_method_invoice_sale">
+        <record model="workflow.transition" id="sale_transition_invoice_method_waiting_invoice_sale">
             <field name="act_from" ref="sale_activity_invoice_method"/>
-            <field name="act_to" ref="sale_activity_invoice_sale"/>
+            <field name="act_to" ref="sale_activity_waiting_invoice_sale"/>
             <field name="condition">invoice_method == 'order'</field>
         </record>
         <record model="workflow.transition" id="sale_transition_invoice_method_invoice_method_done">
@@ -448,10 +568,6 @@
             <field name="act_to" ref="sale_activity_invoice_method_done"/>
             <field name="condition">invoice_method != 'order'</field>
         </record>
-        <record model="workflow.transition" id="sale_transition_invoice_sale_waiting_invoice_sale">
-            <field name="act_from" ref="sale_activity_invoice_sale"/>
-            <field name="act_to" ref="sale_activity_waiting_invoice_sale"/>
-        </record>
         <record model="workflow.transition" id="sale_transition_waiting_invoice_sale_invoice_sale_exception">
             <field name="act_from" ref="sale_activity_waiting_invoice_sale"/>
             <field name="act_to" ref="sale_activity_invoice_sale_exception"/>
@@ -666,39 +782,47 @@
                 <form string="Sale Line" cursor="product">
                     <label name="sale"/>
                     <field name="sale" colspan="3"/>
-                    <label name="type"/>
-                    <field name="type"/>
-                    <label name="sequence"/>
-                    <field name="sequence"/>
-                    <label name="product"/>
-                    <field name="product">
-                        <tree string="Products">
-                            <field name="name" select="1"/>
-                            <field name="code" select="1"/>
-                            <field name="list_price_uom" select="2"/>
-                            <field name="cost_price_uom" select="2"/>
-                            <field name="quantity" select="2"/>
-                            <field name="forecast_quantity" select="2"/>
-                            <field name="default_uom" select="2"/>
-                            <field name="active" select="2"/>
-                        </tree>
-                    </field>
-                    <newline/>
-                    <label name="description"/>
-                    <field name="description" colspan="3"/>
-                    <label name="quantity"/>
-                    <field name="quantity"/>
-                    <label name="unit"/>
-                    <field name="unit"/>
-                    <label name="unit_price"/>
-                    <field name="unit_price"/>
-                    <label name="amount"/>
-                    <field name="amount"/>
-                    <separator name="taxes" colspan="4"/>
-                    <field name="taxes" colspan="4"/>
-                    <separator name="comment" colspan="4"/>
-                    <field name="comment" colspan="4" spell="_parent_sale.party_lang"/>
-                    <field name="unit_digits" invisible="1"/>
+                    <notebook colspan="4">
+                        <page string="General" id="general">
+                            <label name="type"/>
+                            <field name="type"/>
+                            <label name="sequence"/>
+                            <field name="sequence"/>
+                            <label name="product"/>
+                            <field name="product">
+                                <tree string="Products">
+                                    <field name="name" select="1"/>
+                                    <field name="code" select="1"/>
+                                    <field name="list_price_uom" select="2"/>
+                                    <field name="cost_price_uom" select="2"/>
+                                    <field name="quantity" select="2"/>
+                                    <field name="forecast_quantity" select="2"/>
+                                    <field name="default_uom" select="2"/>
+                                    <field name="active" select="2"/>
+                                </tree>
+                            </field>
+                            <newline/>
+                            <label name="description"/>
+                            <field name="description" colspan="3"
+                                spell="_parent_sale.party_lang"/>
+                            <label name="quantity"/>
+                            <field name="quantity"/>
+                            <label name="unit"/>
+                            <field name="unit"/>
+                            <label name="unit_price"/>
+                            <field name="unit_price"/>
+                            <label name="amount"/>
+                            <field name="amount"/>
+                            <separator name="taxes" colspan="4"/>
+                            <field name="taxes" colspan="4"/>
+                        </page>
+                        <page string="Notes" id="notes">
+                            <separator name="note" colspan="4"/>
+                            <field name="note" colspan="4"
+                                spell="_parent_sale.party_lang"/>
+                        </page>
+                    </notebook>
+                    <field name="unit_digits" invisible="1" colspan="4"/>
                 </form>
                 ]]>
             </field>
@@ -740,21 +864,22 @@
             <field name="perm_delete" eval="True"/>
         </record>
 
-        <record model="ir.ui.view" id="product_view_form">
-            <field name="model">product.product</field>
-            <field name="inherit" ref="product.product_view_form"/>
+        <record model="ir.ui.view" id="template_view_form">
+            <field name="model">product.template</field>
+            <field name="inherit" ref="product.template_view_form"/>
             <field name="arch" type="xml">
                 <![CDATA[
                 <data>
-                    <xpath expr="/form/notebook/page/separator[@name="description"]"
-                        position="before">
+                    <xpath expr="/form/notebook/page[@id="general"]/field[@name="cost_price_method"]"
+                        position="after">
                         <label name="salable"/>
                         <field name="salable"/>
                     </xpath>
-                    <xpath expr="/form/notebook/page[@string="General"]"
+                    <xpath expr="/form/notebook/page[@id="general"]"
                         position="after">
                         <page string="Customers"
-                            states="{'invisible': '''not salable'''}">
+                            states="{'invisible': '''not salable'''}"
+                            id="customers">
                             <label name="salable"/>
                             <field name="salable"/>
                             <label name="sale_uom"/>
@@ -765,9 +890,9 @@
                 ]]>
             </field>
         </record>
-        <record model="ir.ui.view" id="product_view_tree">
-            <field name="model">product.product</field>
-            <field name="inherit" ref="product.product_view_tree"/>
+        <record model="ir.ui.view" id="template_view_tree">
+            <field name="model">product.template</field>
+            <field name="inherit" ref="product.template_view_tree"/>
             <field name="arch" type="xml">
                 <![CDATA[
                 <data>
@@ -780,5 +905,26 @@
             </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>
+        </record>
+        <menuitem name="Parties associated to Sales"
+            parent="party.menu_party_form"
+            action="act_open_customer"
+            icon="tryton-list"
+            id="menu_customer"/>
+
+        <record model="ir.rule.group" id="rule_group_sale">
+            <field name="model" search="[('model', '=', 'sale.sale')]"/>
+            <field name="global_p" eval="True"/>
+        </record>
+        <record model="ir.rule" id="rule_sale1">
+            <field name="field" search="[('name', '=', 'company'), ('model.model', '=', 'sale.sale')]"/>
+            <field name="operator">=</field>
+            <field name="operand">User/Current Company</field>
+            <field name="rule_group" ref="rule_group_sale"/>
+        </record>
+
     </data>
 </tryton>
diff --git a/trytond_sale.egg-info/PKG-INFO b/trytond_sale.egg-info/PKG-INFO
index 42807bf..d767451 100644
--- a/trytond_sale.egg-info/PKG-INFO
+++ b/trytond_sale.egg-info/PKG-INFO
@@ -1,6 +1,6 @@
 Metadata-Version: 1.0
 Name: trytond-sale
-Version: 1.0.2
+Version: 1.2.0
 Summary: Define sale order.
 Add to product sale informations.
 Define the sale price as the list price.
@@ -20,7 +20,7 @@ Home-page: http://www.tryton.org/
 Author: B2CK
 Author-email: info at b2ck.com
 License: GPL-3
-Download-URL: http://downloads.tryton.org/1.0/
+Download-URL: http://downloads.tryton.org/1.2/
 Description: UNKNOWN
 Platform: UNKNOWN
 Classifier: Development Status :: 5 - Production/Stable
diff --git a/trytond_sale.egg-info/SOURCES.txt b/trytond_sale.egg-info/SOURCES.txt
index d83373e..febe848 100644
--- a/trytond_sale.egg-info/SOURCES.txt
+++ b/trytond_sale.egg-info/SOURCES.txt
@@ -6,8 +6,10 @@ MANIFEST.in
 README
 TODO
 de_DE.csv
+es_CO.csv
 es_ES.csv
 fr_FR.csv
+party.xml
 sale.odt
 sale.xml
 setup.py
diff --git a/trytond_sale.egg-info/requires.txt b/trytond_sale.egg-info/requires.txt
index 3fb0c72..fbf666b 100644
--- a/trytond_sale.egg-info/requires.txt
+++ b/trytond_sale.egg-info/requires.txt
@@ -6,5 +6,5 @@ trytond_product
 trytond_account_invoice
 trytond_currency
 trytond_account_product
-trytond >= 1.0
-trytond < 1.1
\ No newline at end of file
+trytond >= 1.2
+trytond < 1.3
\ No newline at end of file
commit b011744b130f77ca66a013755e4eb5b4c7f816d1
Author: Daniel Baumann <daniel at debian.org>
Date:   Sat Mar 28 16:35:14 2009 +0100

    Releasing debian version 1.0.2-2.

diff --git a/debian/changelog b/debian/changelog
index f0d08ca..1e210e7 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -1,3 +1,9 @@
+tryton-modules-sale (1.0.2-2) unstable; urgency=low
+
+  * Adding Mathias to uploaders.
+
+ -- Daniel Baumann <daniel at debian.org>  Sat, 28 Mar 2009 16:35:00 +0100
+
 tryton-modules-sale (1.0.2-1) unstable; urgency=low
 
   * Merging upstream version 1.0.2.
commit cf5dec9bef5475d7c835d07649f028f28932a037
Author: Daniel Baumann <daniel at debian.org>
Date:   Sat Mar 28 16:13:22 2009 +0100

    Adding Mathias to uploaders.

diff --git a/debian/control b/debian/control
index 14850aa..6a7fdbf 100644
--- a/debian/control
+++ b/debian/control
@@ -2,6 +2,7 @@ Source: tryton-modules-sale
 Section: python
 Priority: optional
 Maintainer: Daniel Baumann <daniel at debian.org>
+Uploaders: Mathias Behrle <mathiasb at mbsolutions.selfip.biz>
 Build-Depends: debhelper (>= 7), python, python-all-dev, python-setuptools, python-support
 Standards-Version: 3.8.1
 Homepage: http://www.tryton.org/
commit 00f6396294491d2b48c8a38c491fa35a80d371f5
Author: Daniel Baumann <daniel at debian.org>
Date:   Mon Mar 23 07:17:11 2009 +0100

    Releasing debian version 1.0.2-1.

diff --git a/debian/changelog b/debian/changelog
index 3b9282a..f0d08ca 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -1,3 +1,9 @@
+tryton-modules-sale (1.0.2-1) unstable; urgency=low
+
+  * Merging upstream version 1.0.2.
+
+ -- Daniel Baumann <daniel at debian.org>  Mon, 23 Mar 2009 07:16:00 +0100
+
 tryton-modules-sale (1.0.1-1) unstable; urgency=low
 
   * Merging upstream version 1.0.1.
commit 1efacff51a3c1f7c266f7a5aa594904e54928ff6
Author: Daniel Baumann <daniel at debian.org>
Date:   Mon Mar 23 07:16:32 2009 +0100

    Merging upstream version 1.0.2.

diff --git a/CHANGELOG b/CHANGELOG
index 9801fce..bf8a718 100644
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -1,3 +1,6 @@
+Version 1.0.2 - 2009-01-06
+* Some bug fixes (see mercurial logs for details)
+
 Version 1.0.1 - 2008-12-01
 * Allow egg installation
 
diff --git a/PKG-INFO b/PKG-INFO
index 3ae40ad..3fcc54a 100644
--- a/PKG-INFO
+++ b/PKG-INFO
@@ -1,6 +1,6 @@
 Metadata-Version: 1.0
 Name: trytond_sale
-Version: 1.0.1
+Version: 1.0.2
 Summary: Define sale order.
 Add to product sale informations.
 Define the sale price as the list price.
diff --git a/__tryton__.py b/__tryton__.py
index edb7661..5bd8b94 100644
--- a/__tryton__.py
+++ b/__tryton__.py
@@ -5,7 +5,7 @@
     'name_de_DE': 'Verkauf',
     'name_fr_FR': 'Vente',
     'name_es_ES': 'Ventas',
-    'version': '1.0.1',
+    'version': '1.0.2',
     'author': 'B2CK',
     'email': 'info at b2ck.com',
     'website': 'http://www.tryton.org/',
diff --git a/sale.py b/sale.py
index 5db64c4..da328a7 100644
--- a/sale.py
+++ b/sale.py
@@ -882,7 +882,8 @@ class SaleLine(OSV):
             }, on_change=['product', 'unit', 'quantity', 'description',
                 '_parent_sale.party', '_parent_sale.currency'],
             context="{'locations': [_parent_sale.warehouse], " \
-                    "'stock_date_end': _parent_sale.sale_date}")
+                    "'stock_date_end': _parent_sale.sale_date, " \
+                    "'salable': True}")
     unit_price = fields.Numeric('Unit Price', digits=(16, 4),
             states={
                 'invisible': "type != 'line'",
@@ -1249,6 +1250,10 @@ class Template(OSV):
         on_change_with=['default_uom', 'sale_uom'])
 
     def default_salable(self, cursor, user, context=None):
+        if context is None:
+            context = {}
+        if context.get('salable'):
+            return True
         return False
 
     def on_change_with_sale_uom(self, cursor, user, ids, vals, context=None):
@@ -1322,7 +1327,7 @@ class Product(OSV):
                 res[product.id] = uom_obj.compute_price(cursor, user,
                         product.default_uom, res[product.id], uom,
                         context=context)
-            if currency:
+            if currency and user2.company:
                 if user2.company.currency.id != currency.id:
                     res[product.id] = currency_obj.compute(cursor, user,
                             user2.company.currency, res[product.id],
diff --git a/trytond_sale.egg-info/PKG-INFO b/trytond_sale.egg-info/PKG-INFO
index 00448e3..42807bf 100644
--- a/trytond_sale.egg-info/PKG-INFO
+++ b/trytond_sale.egg-info/PKG-INFO
@@ -1,6 +1,6 @@
 Metadata-Version: 1.0
 Name: trytond-sale
-Version: 1.0.1
+Version: 1.0.2
 Summary: Define sale order.
 Add to product sale informations.
 Define the sale price as the list price.
commit 3e990e34dc4ddb5aeecd455c380f40fa91732582
Author: Daniel Baumann <daniel at debian.org>
Date:   Sun Mar 22 23:27:46 2009 +0100

    Releasing debian version 1.0.1-1.

diff --git a/debian/changelog b/debian/changelog
index 075ec04..3b9282a 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -1,3 +1,11 @@
+tryton-modules-sale (1.0.1-1) unstable; urgency=low
+
+  * Merging upstream version 1.0.1.
+  * Updating standards to 3.8.1.
+  * Making package arch all as it should be (Closes: #520806).
+
+ -- Daniel Baumann <daniel at debian.org>  Sun, 22 Mar 2009 23:27:00 +0100
+
 tryton-modules-sale (1.0.0-1) unstable; urgency=low
 
   * Initial release (Closes: #506095).
commit 57c05be0e04301c9a54b7ac9573524424f7d6819
Author: Daniel Baumann <daniel at debian.org>
Date:   Sun Mar 22 23:27:22 2009 +0100

    Making package arch all as it should be (Closes: #520806).

diff --git a/debian/control b/debian/control
index c525b2a..14850aa 100644
--- a/debian/control
+++ b/debian/control
@@ -9,7 +9,7 @@ Vcs-Browser: http://git.debian.net/?p=debian/tryton-modules-sale.git
 Vcs-Git: git://git.debian.net/git/debian/tryton-modules-sale.git
 
 Package: tryton-modules-sale
-Architecture: any
+Architecture: all
 Depends: ${misc:Depends}, ${python:Depends}, tryton-server, tryton-modules-account, tryton-modules-account-invoice, tryton-modules-account-product, tryton-modules-company, tryton-modules-currency, tryton-modules-party, tryton-modules-product, tryton-modules-stock, python-pkg-resources
 XB-Python-Version: ${python:Versions}
 Description: Tryton Application Platform (Sale Module)
commit 2fa633933c5e6cd3af1c64a363d07d2796cf70c4
Author: Daniel Baumann <daniel at debian.org>
Date:   Sun Mar 22 23:26:30 2009 +0100

    Updating standards to 3.8.1.

diff --git a/debian/control b/debian/control
index 77662fb..c525b2a 100644
--- a/debian/control
+++ b/debian/control
@@ -3,7 +3,7 @@ Section: python
 Priority: optional
 Maintainer: Daniel Baumann <daniel at debian.org>
 Build-Depends: debhelper (>= 7), python, python-all-dev, python-setuptools, python-support
-Standards-Version: 3.8.0
+Standards-Version: 3.8.1
 Homepage: http://www.tryton.org/
 Vcs-Browser: http://git.debian.net/?p=debian/tryton-modules-sale.git
 Vcs-Git: git://git.debian.net/git/debian/tryton-modules-sale.git
commit 9d585024823ea4868afa7ff99831fbc80db257e9
Author: Daniel Baumann <daniel at debian.org>
Date:   Wed Jan 28 14:17:47 2009 +0100

    Merging upstream version 1.0.1.

diff --git a/CHANGELOG b/CHANGELOG
index eacaaef..9801fce 100644
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -1,2 +1,5 @@
+Version 1.0.1 - 2008-12-01
+* Allow egg installation
+
 Version 1.0.0 - 2008-11-17
 * Initial release
diff --git a/PKG-INFO b/PKG-INFO
index de2c729..3ae40ad 100644
--- a/PKG-INFO
+++ b/PKG-INFO
@@ -1,6 +1,6 @@
 Metadata-Version: 1.0
 Name: trytond_sale
-Version: 1.0.0
+Version: 1.0.1
 Summary: Define sale order.
 Add to product sale informations.
 Define the sale price as the list price.
@@ -20,6 +20,7 @@ Home-page: http://www.tryton.org/
 Author: B2CK
 Author-email: info at b2ck.com
 License: GPL-3
+Download-URL: http://downloads.tryton.org/1.0/
 Description: UNKNOWN
 Platform: UNKNOWN
 Classifier: Development Status :: 5 - Production/Stable
diff --git a/__tryton__.py b/__tryton__.py
index 017281c..edb7661 100644
--- a/__tryton__.py
+++ b/__tryton__.py
@@ -5,7 +5,7 @@
     'name_de_DE': 'Verkauf',
     'name_fr_FR': 'Vente',
     'name_es_ES': 'Ventas',
-    'version': '1.0.0',
+    'version': '1.0.1',
     'author': 'B2CK',
     'email': 'info at b2ck.com',
     'website': 'http://www.tryton.org/',
diff --git a/sale.py b/sale.py
index 4b9a2af..5db64c4 100644
--- a/sale.py
+++ b/sale.py
@@ -211,8 +211,8 @@ class Sale(OSV):
                     party.id, type='invoice', context=context)
             res['packing_address'] = party_obj.address_get(cursor, user,
                     party.id, type='delivery', context=context)
-            if party.supplier_payment_term:
-                res['payment_term'] = party.supplier_payment_term.id
+            if party.payment_term:
+                res['payment_term'] = party.payment_term.id
 
         if res['invoice_address']:
             res['invoice_address'] = address_obj.name_get(cursor, user,
diff --git a/setup.py b/setup.py
index 8407943..7c97b73 100644
--- a/setup.py
+++ b/setup.py
@@ -27,6 +27,8 @@ setup(name='trytond_sale',
     author=info.get('author', ''),
     author_email=info.get('email', ''),
     url=info.get('website', ''),
+    download_url="http://downloads.tryton.org/" + \
+            info.get('version', '0.0.1').rsplit('.', 1)[0] + '/',
     package_dir={'trytond.modules.sale': '.'},
     packages=[
         'trytond.modules.sale',
@@ -54,4 +56,9 @@ setup(name='trytond_sale',
     ],
     license='GPL-3',
     install_requires=requires,
+    zip_safe=False,
+    entry_points="""
+    [trytond.modules]
+    sale = trytond.modules.sale
+    """,
 )
diff --git a/trytond_sale.egg-info/PKG-INFO b/trytond_sale.egg-info/PKG-INFO
index 20fe90b..00448e3 100644
--- a/trytond_sale.egg-info/PKG-INFO
+++ b/trytond_sale.egg-info/PKG-INFO
@@ -1,6 +1,6 @@
 Metadata-Version: 1.0
 Name: trytond-sale
-Version: 1.0.0
+Version: 1.0.1
 Summary: Define sale order.
 Add to product sale informations.
 Define the sale price as the list price.
@@ -20,6 +20,7 @@ Home-page: http://www.tryton.org/
 Author: B2CK
 Author-email: info at b2ck.com
 License: GPL-3
+Download-URL: http://downloads.tryton.org/1.0/
 Description: UNKNOWN
 Platform: UNKNOWN
 Classifier: Development Status :: 5 - Production/Stable
diff --git a/trytond_sale.egg-info/SOURCES.txt b/trytond_sale.egg-info/SOURCES.txt
index 1ae3f50..d83373e 100644
--- a/trytond_sale.egg-info/SOURCES.txt
+++ b/trytond_sale.egg-info/SOURCES.txt
@@ -17,5 +17,7 @@ setup.py
 trytond_sale.egg-info/PKG-INFO
 trytond_sale.egg-info/SOURCES.txt
 trytond_sale.egg-info/dependency_links.txt
+trytond_sale.egg-info/entry_points.txt
+trytond_sale.egg-info/not-zip-safe
 trytond_sale.egg-info/requires.txt
 trytond_sale.egg-info/top_level.txt
\ No newline at end of file
diff --git a/trytond_sale.egg-info/entry_points.txt b/trytond_sale.egg-info/entry_points.txt
new file mode 100644
index 0000000..b60e6eb
--- /dev/null
+++ b/trytond_sale.egg-info/entry_points.txt
@@ -0,0 +1,4 @@
+
+    [trytond.modules]
+    sale = trytond.modules.sale
+    
\ No newline at end of file
diff --git a/trytond_sale.egg-info/not-zip-safe b/trytond_sale.egg-info/not-zip-safe
new file mode 100644
index 0000000..8b13789
--- /dev/null
+++ b/trytond_sale.egg-info/not-zip-safe
@@ -0,0 +1 @@
+
commit bab15ac2a3c3c12158cd985c793f6e51821d915f
Author: Daniel Baumann <daniel at debian.org>
Date:   Tue Nov 18 13:05:56 2008 +0100

    Adding debian version 1.0.0-1.

diff --git a/CHANGELOG b/CHANGELOG
new file mode 100644
index 0000000..eacaaef
--- /dev/null
+++ b/CHANGELOG
@@ -0,0 +1,2 @@
+Version 1.0.0 - 2008-11-17
+* Initial release
diff --git a/COPYRIGHT b/COPYRIGHT
new file mode 100644
index 0000000..37fef2d
--- /dev/null
+++ b/COPYRIGHT
@@ -0,0 +1,17 @@
+Copyright (C) 2004-2008 Tiny SPRL.
+Copyright (C) 2008 Cédric Krier.
+Copyright (C) 2008 Bertrand Chenal.
+Copyright (C) 2008 B2CK SPRL.
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program.  If not, see <http://www.gnu.org/licenses/>.
diff --git a/INSTALL b/INSTALL
new file mode 100644
index 0000000..1824916
--- /dev/null
+++ b/INSTALL
@@ -0,0 +1,37 @@
+Installing trytond_sale
+=======================
+
+Prerequisites
+-------------
+
+ * Python 2.4 or later (http://www.python.org/)
+ * trytond 0.0.x (http://www.tryton.org/)
+ * trytond_company (http://www.tryton.org/)
+ * trytond_party (http://www.tryton.org/)
+ * trytond_stock (http://www.tryton.org/)
+ * trytond_account (http://www.tryton.org/)
+ * trytond_product (http://www.tryton.org/)
+ * trytond_account_invoice (http://www.tryton.org/)
+ * trytond_currency (http://www.tryton.org/)
+ * trytond_account_product (http://www.tryton.org/)
+
+Installation
+------------
+
+Once you've downloaded and unpacked a trytond_sale source release, enter the
+directory where the archive was unpacked, and run:
+
+    python setup.py install
+
+Note that you may need administrator/root privileges for this step, as
+this command will by default attempt to install module to the Python
+site-packages directory on your system.
+
+For advanced options, please refer to the easy_install and/or the distutils
+documentation:
+
+  http://peak.telecommunity.com/DevCenter/EasyInstall
+  http://docs.python.org/inst/inst.html
+
+To use without installation, extract the archive into ``trytond/modules`` with
+the directory name sale.
diff --git a/LICENSE b/LICENSE
new file mode 100644
index 0000000..94a9ed0
--- /dev/null
+++ b/LICENSE
@@ -0,0 +1,674 @@
+                    GNU GENERAL PUBLIC LICENSE
+                       Version 3, 29 June 2007
+
+ Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+                            Preamble
+
+  The GNU General Public License is a free, copyleft license for
+software and other kinds of works.
+
+  The licenses for most software and other practical works are designed
+to take away your freedom to share and change the works.  By contrast,
+the GNU General Public License is intended to guarantee your freedom to
+share and change all versions of a program--to make sure it remains free
+software for all its users.  We, the Free Software Foundation, use the
+GNU General Public License for most of our software; it applies also to
+any other work released this way by its authors.  You can apply it to
+your programs, too.
+
+  When we speak of free software, we are referring to freedom, not
+price.  Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+them if you wish), that you receive source code or can get it if you
+want it, that you can change the software or use pieces of it in new
+free programs, and that you know you can do these things.
+
+  To protect your rights, we need to prevent others from denying you
+these rights or asking you to surrender the rights.  Therefore, you have
+certain responsibilities if you distribute copies of the software, or if
+you modify it: responsibilities to respect the freedom of others.
+
+  For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must pass on to the recipients the same
+freedoms that you received.  You must make sure that they, too, receive
+or can get the source code.  And you must show them these terms so they
+know their rights.
+
+  Developers that use the GNU GPL protect your rights with two steps:
+(1) assert copyright on the software, and (2) offer you this License
+giving you legal permission to copy, distribute and/or modify it.
+
+  For the developers' and authors' protection, the GPL clearly explains
+that there is no warranty for this free software.  For both users' and
+authors' sake, the GPL requires that modified versions be marked as
+changed, so that their problems will not be attributed erroneously to
+authors of previous versions.
+
+  Some devices are designed to deny users access to install or run
+modified versions of the software inside them, although the manufacturer
+can do so.  This is fundamentally incompatible with the aim of
+protecting users' freedom to change the software.  The systematic
+pattern of such abuse occurs in the area of products for individuals to
+use, which is precisely where it is most unacceptable.  Therefore, we
+have designed this version of the GPL to prohibit the practice for those
+products.  If such problems arise substantially in other domains, we
+stand ready to extend this provision to those domains in future versions
+of the GPL, as needed to protect the freedom of users.
+
+  Finally, every program is threatened constantly by software patents.
+States should not allow patents to restrict development and use of
+software on general-purpose computers, but in those that do, we wish to
+avoid the special danger that patents applied to a free program could
+make it effectively proprietary.  To prevent this, the GPL assures that
+patents cannot be used to render the program non-free.
+
+  The precise terms and conditions for copying, distribution and
+modification follow.
+
+                       TERMS AND CONDITIONS
+
+  0. Definitions.
+
+  "This License" refers to version 3 of the GNU General Public License.
+
+  "Copyright" also means copyright-like laws that apply to other kinds of
+works, such as semiconductor masks.
+
+  "The Program" refers to any copyrightable work licensed under this
+License.  Each licensee is addressed as "you".  "Licensees" and
+"recipients" may be individuals or organizations.
+
+  To "modify" a work means to copy from or adapt all or part of the work
+in a fashion requiring copyright permission, other than the making of an
+exact copy.  The resulting work is called a "modified version" of the
+earlier work or a work "based on" the earlier work.
+
+  A "covered work" means either the unmodified Program or a work based
+on the Program.
+
+  To "propagate" a work means to do anything with it that, without
+permission, would make you directly or secondarily liable for
+infringement under applicable copyright law, except executing it on a
+computer or modifying a private copy.  Propagation includes copying,
+distribution (with or without modification), making available to the
+public, and in some countries other activities as well.
+
+  To "convey" a work means any kind of propagation that enables other
+parties to make or receive copies.  Mere interaction with a user through
+a computer network, with no transfer of a copy, is not conveying.
+
+  An interactive user interface displays "Appropriate Legal Notices"
+to the extent that it includes a convenient and prominently visible
+feature that (1) displays an appropriate copyright notice, and (2)
+tells the user that there is no warranty for the work (except to the
+extent that warranties are provided), that licensees may convey the
+work under this License, and how to view a copy of this License.  If
+the interface presents a list of user commands or options, such as a
+menu, a prominent item in the list meets this criterion.
+
+  1. Source Code.
+
+  The "source code" for a work means the preferred form of the work
+for making modifications to it.  "Object code" means any non-source
+form of a work.
+
+  A "Standard Interface" means an interface that either is an official
+standard defined by a recognized standards body, or, in the case of
+interfaces specified for a particular programming language, one that
+is widely used among developers working in that language.
+
+  The "System Libraries" of an executable work include anything, other
+than the work as a whole, that (a) is included in the normal form of
+packaging a Major Component, but which is not part of that Major
+Component, and (b) serves only to enable use of the work with that
+Major Component, or to implement a Standard Interface for which an
+implementation is available to the public in source code form.  A
+"Major Component", in this context, means a major essential component
+(kernel, window system, and so on) of the specific operating system
+(if any) on which the executable work runs, or a compiler used to
+produce the work, or an object code interpreter used to run it.
+
+  The "Corresponding Source" for a work in object code form means all
+the source code needed to generate, install, and (for an executable
+work) run the object code and to modify the work, including scripts to
+control those activities.  However, it does not include the work's
+System Libraries, or general-purpose tools or generally available free
+programs which are used unmodified in performing those activities but
+which are not part of the work.  For example, Corresponding Source
+includes interface definition files associated with source files for
+the work, and the source code for shared libraries and dynamically
+linked subprograms that the work is specifically designed to require,
+such as by intimate data communication or control flow between those
+subprograms and other parts of the work.
+
+  The Corresponding Source need not include anything that users
+can regenerate automatically from other parts of the Corresponding
+Source.
+
+  The Corresponding Source for a work in source code form is that
+same work.
+
+  2. Basic Permissions.
+
+  All rights granted under this License are granted for the term of
+copyright on the Program, and are irrevocable provided the stated
+conditions are met.  This License explicitly affirms your unlimited
+permission to run the unmodified Program.  The output from running a
+covered work is covered by this License only if the output, given its
+content, constitutes a covered work.  This License acknowledges your
+rights of fair use or other equivalent, as provided by copyright law.
+
+  You may make, run and propagate covered works that you do not
+convey, without conditions so long as your license otherwise remains
+in force.  You may convey covered works to others for the sole purpose
+of having them make modifications exclusively for you, or provide you
+with facilities for running those works, provided that you comply with
+the terms of this License in conveying all material for which you do
+not control copyright.  Those thus making or running the covered works
+for you must do so exclusively on your behalf, under your direction
+and control, on terms that prohibit them from making any copies of
+your copyrighted material outside their relationship with you.
+
+  Conveying under any other circumstances is permitted solely under
+the conditions stated below.  Sublicensing is not allowed; section 10
+makes it unnecessary.
+
+  3. Protecting Users' Legal Rights From Anti-Circumvention Law.
+
+  No covered work shall be deemed part of an effective technological
+measure under any applicable law fulfilling obligations under article
+11 of the WIPO copyright treaty adopted on 20 December 1996, or
+similar laws prohibiting or restricting circumvention of such
+measures.
+
+  When you convey a covered work, you waive any legal power to forbid
+circumvention of technological measures to the extent such circumvention
+is effected by exercising rights under this License with respect to
+the covered work, and you disclaim any intention to limit operation or
+modification of the work as a means of enforcing, against the work's
+users, your or third parties' legal rights to forbid circumvention of
+technological measures.
+
+  4. Conveying Verbatim Copies.
+
+  You may convey verbatim copies of the Program's source code as you
+receive it, in any medium, provided that you conspicuously and
+appropriately publish on each copy an appropriate copyright notice;
+keep intact all notices stating that this License and any
+non-permissive terms added in accord with section 7 apply to the code;
+keep intact all notices of the absence of any warranty; and give all
+recipients a copy of this License along with the Program.
+
+  You may charge any price or no price for each copy that you convey,
+and you may offer support or warranty protection for a fee.
+
+  5. Conveying Modified Source Versions.
+
+  You may convey a work based on the Program, or the modifications to
+produce it from the Program, in the form of source code under the
+terms of section 4, provided that you also meet all of these conditions:
+
+    a) The work must carry prominent notices stating that you modified
+    it, and giving a relevant date.
+
+    b) The work must carry prominent notices stating that it is
+    released under this License and any conditions added under section
+    7.  This requirement modifies the requirement in section 4 to
+    "keep intact all notices".
+
+    c) You must license the entire work, as a whole, under this
+    License to anyone who comes into possession of a copy.  This
+    License will therefore apply, along with any applicable section 7
+    additional terms, to the whole of the work, and all its parts,
+    regardless of how they are packaged.  This License gives no
+    permission to license the work in any other way, but it does not
+    invalidate such permission if you have separately received it.
+
+    d) If the work has interactive user interfaces, each must display
+    Appropriate Legal Notices; however, if the Program has interactive
+    interfaces that do not display Appropriate Legal Notices, your
+    work need not make them do so.
+
+  A compilation of a covered work with other separate and independent
+works, which are not by their nature extensions of the covered work,
+and which are not combined with it such as to form a larger program,
+in or on a volume of a storage or distribution medium, is called an
+"aggregate" if the compilation and its resulting copyright are not
+used to limit the access or legal rights of the compilation's users
+beyond what the individual works permit.  Inclusion of a covered work
+in an aggregate does not cause this License to apply to the other
+parts of the aggregate.
+
+  6. Conveying Non-Source Forms.
+
+  You may convey a covered work in object code form under the terms
+of sections 4 and 5, provided that you also convey the
+machine-readable Corresponding Source under the terms of this License,
+in one of these ways:
+
+    a) Convey the object code in, or embodied in, a physical product
+    (including a physical distribution medium), accompanied by the
+    Corresponding Source fixed on a durable physical medium
+    customarily used for software interchange.
+
+    b) Convey the object code in, or embodied in, a physical product
+    (including a physical distribution medium), accompanied by a
+    written offer, valid for at least three years and valid for as
+    long as you offer spare parts or customer support for that product
+    model, to give anyone who possesses the object code either (1) a
+    copy of the Corresponding Source for all the software in the
+    product that is covered by this License, on a durable physical
+    medium customarily used for software interchange, for a price no
+    more than your reasonable cost of physically performing this
+    conveying of source, or (2) access to copy the
+    Corresponding Source from a network server at no charge.
+
+    c) Convey individual copies of the object code with a copy of the
+    written offer to provide the Corresponding Source.  This
+    alternative is allowed only occasionally and noncommercially, and
+    only if you received the object code with such an offer, in accord
+    with subsection 6b.
+
+    d) Convey the object code by offering access from a designated
+    place (gratis or for a charge), and offer equivalent access to the
+    Corresponding Source in the same way through the same place at no
+    further charge.  You need not require recipients to copy the
+    Corresponding Source along with the object code.  If the place to
+    copy the object code is a network server, the Corresponding Source
+    may be on a different server (operated by you or a third party)
+    that supports equivalent copying facilities, provided you maintain
+    clear directions next to the object code saying where to find the
+    Corresponding Source.  Regardless of what server hosts the
+    Corresponding Source, you remain obligated to ensure that it is
+    available for as long as needed to satisfy these requirements.
+
+    e) Convey the object code using peer-to-peer transmission, provided
+    you inform other peers where the object code and Corresponding
+    Source of the work are being offered to the general public at no
+    charge under subsection 6d.
+
+  A separable portion of the object code, whose source code is excluded
+from the Corresponding Source as a System Library, need not be
+included in conveying the object code work.
+
+  A "User Product" is either (1) a "consumer product", which means any
+tangible personal property which is normally used for personal, family,
+or household purposes, or (2) anything designed or sold for incorporation
+into a dwelling.  In determining whether a product is a consumer product,
+doubtful cases shall be resolved in favor of coverage.  For a particular
+product received by a particular user, "normally used" refers to a
+typical or common use of that class of product, regardless of the status
+of the particular user or of the way in which the particular user
+actually uses, or expects or is expected to use, the product.  A product
+is a consumer product regardless of whether the product has substantial
+commercial, industrial or non-consumer uses, unless such uses represent
+the only significant mode of use of the product.
+
+  "Installation Information" for a User Product means any methods,
+procedures, authorization keys, or other information required to install
+and execute modified versions of a covered work in that User Product from
+a modified version of its Corresponding Source.  The information must
+suffice to ensure that the continued functioning of the modified object
+code is in no case prevented or interfered with solely because
+modification has been made.
+
+  If you convey an object code work under this section in, or with, or
+specifically for use in, a User Product, and the conveying occurs as
+part of a transaction in which the right of possession and use of the
+User Product is transferred to the recipient in perpetuity or for a
+fixed term (regardless of how the transaction is characterized), the
+Corresponding Source conveyed under this section must be accompanied
+by the Installation Information.  But this requirement does not apply
+if neither you nor any third party retains the ability to install
+modified object code on the User Product (for example, the work has
+been installed in ROM).
+
+  The requirement to provide Installation Information does not include a
+requirement to continue to provide support service, warranty, or updates
+for a work that has been modified or installed by the recipient, or for
+the User Product in which it has been modified or installed.  Access to a
+network may be denied when the modification itself materially and
+adversely affects the operation of the network or violates the rules and
+protocols for communication across the network.
+
+  Corresponding Source conveyed, and Installation Information provided,
+in accord with this section must be in a format that is publicly
+documented (and with an implementation available to the public in
+source code form), and must require no special password or key for
+unpacking, reading or copying.
+
+  7. Additional Terms.
+
+  "Additional permissions" are terms that supplement the terms of this
+License by making exceptions from one or more of its conditions.
+Additional permissions that are applicable to the entire Program shall
+be treated as though they were included in this License, to the extent
+that they are valid under applicable law.  If additional permissions
+apply only to part of the Program, that part may be used separately
+under those permissions, but the entire Program remains governed by
+this License without regard to the additional permissions.
+
+  When you convey a copy of a covered work, you may at your option
+remove any additional permissions from that copy, or from any part of
+it.  (Additional permissions may be written to require their own
+removal in certain cases when you modify the work.)  You may place
+additional permissions on material, added by you to a covered work,
+for which you have or can give appropriate copyright permission.
+
+  Notwithstanding any other provision of this License, for material you
+add to a covered work, you may (if authorized by the copyright holders of
+that material) supplement the terms of this License with terms:
+
+    a) Disclaiming warranty or limiting liability differently from the
+    terms of sections 15 and 16 of this License; or
+
+    b) Requiring preservation of specified reasonable legal notices or
+    author attributions in that material or in the Appropriate Legal
+    Notices displayed by works containing it; or
+
+    c) Prohibiting misrepresentation of the origin of that material, or
+    requiring that modified versions of such material be marked in
+    reasonable ways as different from the original version; or
+
+    d) Limiting the use for publicity purposes of names of licensors or
+    authors of the material; or
+
+    e) Declining to grant rights under trademark law for use of some
+    trade names, trademarks, or service marks; or
+
+    f) Requiring indemnification of licensors and authors of that
+    material by anyone who conveys the material (or modified versions of
+    it) with contractual assumptions of liability to the recipient, for
+    any liability that these contractual assumptions directly impose on
+    those licensors and authors.
+
+  All other non-permissive additional terms are considered "further
+restrictions" within the meaning of section 10.  If the Program as you
+received it, or any part of it, contains a notice stating that it is
+governed by this License along with a term that is a further
+restriction, you may remove that term.  If a license document contains
+a further restriction but permits relicensing or conveying under this
+License, you may add to a covered work material governed by the terms
+of that license document, provided that the further restriction does
+not survive such relicensing or conveying.
+
+  If you add terms to a covered work in accord with this section, you
+must place, in the relevant source files, a statement of the
+additional terms that apply to those files, or a notice indicating
+where to find the applicable terms.
+
+  Additional terms, permissive or non-permissive, may be stated in the
+form of a separately written license, or stated as exceptions;
+the above requirements apply either way.
+
+  8. Termination.
+
+  You may not propagate or modify a covered work except as expressly
+provided under this License.  Any attempt otherwise to propagate or
+modify it is void, and will automatically terminate your rights under
+this License (including any patent licenses granted under the third
+paragraph of section 11).
+
+  However, if you cease all violation of this License, then your
+license from a particular copyright holder is reinstated (a)
+provisionally, unless and until the copyright holder explicitly and
+finally terminates your license, and (b) permanently, if the copyright
+holder fails to notify you of the violation by some reasonable means
+prior to 60 days after the cessation.
+
+  Moreover, your license from a particular copyright holder is
+reinstated permanently if the copyright holder notifies you of the
+violation by some reasonable means, this is the first time you have
+received notice of violation of this License (for any work) from that
+copyright holder, and you cure the violation prior to 30 days after
+your receipt of the notice.
+
+  Termination of your rights under this section does not terminate the
+licenses of parties who have received copies or rights from you under
+this License.  If your rights have been terminated and not permanently
+reinstated, you do not qualify to receive new licenses for the same
+material under section 10.
+
+  9. Acceptance Not Required for Having Copies.
+
+  You are not required to accept this License in order to receive or
+run a copy of the Program.  Ancillary propagation of a covered work
+occurring solely as a consequence of using peer-to-peer transmission
+to receive a copy likewise does not require acceptance.  However,
+nothing other than this License grants you permission to propagate or
+modify any covered work.  These actions infringe copyright if you do
+not accept this License.  Therefore, by modifying or propagating a
+covered work, you indicate your acceptance of this License to do so.
+
+  10. Automatic Licensing of Downstream Recipients.
+
+  Each time you convey a covered work, the recipient automatically
+receives a license from the original licensors, to run, modify and
+propagate that work, subject to this License.  You are not responsible
+for enforcing compliance by third parties with this License.
+
+  An "entity transaction" is a transaction transferring control of an
+organization, or substantially all assets of one, or subdividing an
+organization, or merging organizations.  If propagation of a covered
+work results from an entity transaction, each party to that
+transaction who receives a copy of the work also receives whatever
+licenses to the work the party's predecessor in interest had or could
+give under the previous paragraph, plus a right to possession of the
+Corresponding Source of the work from the predecessor in interest, if
+the predecessor has it or can get it with reasonable efforts.
+
+  You may not impose any further restrictions on the exercise of the
+rights granted or affirmed under this License.  For example, you may
+not impose a license fee, royalty, or other charge for exercise of
+rights granted under this License, and you may not initiate litigation
+(including a cross-claim or counterclaim in a lawsuit) alleging that
+any patent claim is infringed by making, using, selling, offering for
+sale, or importing the Program or any portion of it.
+
+  11. Patents.
+
+  A "contributor" is a copyright holder who authorizes use under this
+License of the Program or a work on which the Program is based.  The
+work thus licensed is called the contributor's "contributor version".
+
+  A contributor's "essential patent claims" are all patent claims
+owned or controlled by the contributor, whether already acquired or
+hereafter acquired, that would be infringed by some manner, permitted
+by this License, of making, using, or selling its contributor version,
+but do not include claims that would be infringed only as a
+consequence of further modification of the contributor version.  For
+purposes of this definition, "control" includes the right to grant
+patent sublicenses in a manner consistent with the requirements of
+this License.
+
+  Each contributor grants you a non-exclusive, worldwide, royalty-free
+patent license under the contributor's essential patent claims, to
+make, use, sell, offer for sale, import and otherwise run, modify and
+propagate the contents of its contributor version.
+
+  In the following three paragraphs, a "patent license" is any express
+agreement or commitment, however denominated, not to enforce a patent
+(such as an express permission to practice a patent or covenant not to
+sue for patent infringement).  To "grant" such a patent license to a
+party means to make such an agreement or commitment not to enforce a
+patent against the party.
+
+  If you convey a covered work, knowingly relying on a patent license,
+and the Corresponding Source of the work is not available for anyone
+to copy, free of charge and under the terms of this License, through a
+publicly available network server or other readily accessible means,
+then you must either (1) cause the Corresponding Source to be so
+available, or (2) arrange to deprive yourself of the benefit of the
+patent license for this particular work, or (3) arrange, in a manner
+consistent with the requirements of this License, to extend the patent
+license to downstream recipients.  "Knowingly relying" means you have
+actual knowledge that, but for the patent license, your conveying the
+covered work in a country, or your recipient's use of the covered work
+in a country, would infringe one or more identifiable patents in that
+country that you have reason to believe are valid.
+
+  If, pursuant to or in connection with a single transaction or
+arrangement, you convey, or propagate by procuring conveyance of, a
+covered work, and grant a patent license to some of the parties
+receiving the covered work authorizing them to use, propagate, modify
+or convey a specific copy of the covered work, then the patent license
+you grant is automatically extended to all recipients of the covered
+work and works based on it.
+
+  A patent license is "discriminatory" if it does not include within
+the scope of its coverage, prohibits the exercise of, or is
+conditioned on the non-exercise of one or more of the rights that are
+specifically granted under this License.  You may not convey a covered
+work if you are a party to an arrangement with a third party that is
+in the business of distributing software, under which you make payment
+to the third party based on the extent of your activity of conveying
+the work, and under which the third party grants, to any of the
+parties who would receive the covered work from you, a discriminatory
+patent license (a) in connection with copies of the covered work
+conveyed by you (or copies made from those copies), or (b) primarily
+for and in connection with specific products or compilations that
+contain the covered work, unless you entered into that arrangement,
+or that patent license was granted, prior to 28 March 2007.
+
+  Nothing in this License shall be construed as excluding or limiting
+any implied license or other defenses to infringement that may
+otherwise be available to you under applicable patent law.
+
+  12. No Surrender of Others' Freedom.
+
+  If conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License.  If you cannot convey a
+covered work so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you may
+not convey it at all.  For example, if you agree to terms that obligate you
+to collect a royalty for further conveying from those to whom you convey
+the Program, the only way you could satisfy both those terms and this
+License would be to refrain entirely from conveying the Program.
+
+  13. Use with the GNU Affero General Public License.
+
+  Notwithstanding any other provision of this License, you have
+permission to link or combine any covered work with a work licensed
+under version 3 of the GNU Affero General Public License into a single
+combined work, and to convey the resulting work.  The terms of this
+License will continue to apply to the part which is the covered work,
+but the special requirements of the GNU Affero General Public License,
+section 13, concerning interaction through a network will apply to the
+combination as such.
+
+  14. Revised Versions of this License.
+
+  The Free Software Foundation may publish revised and/or new versions of
+the GNU General Public License from time to time.  Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+  Each version is given a distinguishing version number.  If the
+Program specifies that a certain numbered version of the GNU General
+Public License "or any later version" applies to it, you have the
+option of following the terms and conditions either of that numbered
+version or of any later version published by the Free Software
+Foundation.  If the Program does not specify a version number of the
+GNU General Public License, you may choose any version ever published
+by the Free Software Foundation.
+
+  If the Program specifies that a proxy can decide which future
+versions of the GNU General Public License can be used, that proxy's
+public statement of acceptance of a version permanently authorizes you
+to choose that version for the Program.
+
+  Later license versions may give you additional or different
+permissions.  However, no additional obligations are imposed on any
+author or copyright holder as a result of your choosing to follow a
+later version.
+
+  15. Disclaimer of Warranty.
+
+  THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
+APPLICABLE LAW.  EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
+HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
+OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
+THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
+IS WITH YOU.  SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
+ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+  16. Limitation of Liability.
+
+  IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
+THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
+GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
+USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
+DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
+PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
+EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
+SUCH DAMAGES.
+
+  17. Interpretation of Sections 15 and 16.
+
+  If the disclaimer of warranty and limitation of liability provided
+above cannot be given local legal effect according to their terms,
+reviewing courts shall apply local law that most closely approximates
+an absolute waiver of all civil liability in connection with the
+Program, unless a warranty or assumption of liability accompanies a
+copy of the Program in return for a fee.
+
+                     END OF TERMS AND CONDITIONS
+
+            How to Apply These Terms to Your New Programs
+
+  If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+  To do so, attach the following notices to the program.  It is safest
+to attach them to the start of each source file to most effectively
+state the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+    <one line to give the program's name and a brief idea of what it does.>
+    Copyright (C) <year>  <name of author>
+
+    This program is free software: you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation, either version 3 of the License, or
+    (at your option) any later version.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+Also add information on how to contact you by electronic and paper mail.
+
+  If the program does terminal interaction, make it output a short
+notice like this when it starts in an interactive mode:
+
+    <program>  Copyright (C) <year>  <name of author>
+    This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+    This is free software, and you are welcome to redistribute it
+    under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License.  Of course, your program's commands
+might be different; for a GUI interface, you would use an "about box".
+
+  You should also get your employer (if you work as a programmer) or school,
+if any, to sign a "copyright disclaimer" for the program, if necessary.
+For more information on this, and how to apply and follow the GNU GPL, see
+<http://www.gnu.org/licenses/>.
+
+  The GNU General Public License does not permit incorporating your program
+into proprietary programs.  If your program is a subroutine library, you
+may consider it more useful to permit linking proprietary applications with
+the library.  If this is what you want to do, use the GNU Lesser General
+Public License instead of this License.  But first, please read
+<http://www.gnu.org/philosophy/why-not-lgpl.html>.
diff --git a/MANIFEST.in b/MANIFEST.in
new file mode 100644
index 0000000..5343ad8
--- /dev/null
+++ b/MANIFEST.in
@@ -0,0 +1,9 @@
+include INSTALL
+include README
+include TODO
+include COPYRIGHT
+include CHANGELOG
+include LICENSE
+include *.xml
+include *.odt
+include *.csv
diff --git a/PKG-INFO b/PKG-INFO
new file mode 100644
index 0000000..de2c729
--- /dev/null
+++ b/PKG-INFO
@@ -0,0 +1,38 @@
+Metadata-Version: 1.0
+Name: trytond_sale
+Version: 1.0.0
+Summary: Define sale order.
+Add to product sale informations.
+Define the sale price as the list price.
+
+With the possibilities:
+    - to follow invoice and packing states from the sale order.
+    - to define invoice method:
+        - Manual
+        - On Order Confirmed
+        - On packing Sent
+    - to define packing method:
+        - Manual
+        - On Order Confirmed
+        - On Invoice Paid
+
+Home-page: http://www.tryton.org/
+Author: B2CK
+Author-email: info at b2ck.com
+License: GPL-3
+Description: UNKNOWN
+Platform: UNKNOWN
+Classifier: Development Status :: 5 - Production/Stable
+Classifier: Environment :: Plugins
+Classifier: Intended Audience :: Developers
+Classifier: Intended Audience :: Financial and Insurance Industry
+Classifier: Intended Audience :: Legal Industry
+Classifier: License :: OSI Approved :: GNU General Public License (GPL)
+Classifier: Natural Language :: English
+Classifier: Natural Language :: French
+Classifier: Natural Language :: German
+Classifier: Natural Language :: Spanish
+Classifier: Operating System :: OS Independent
+Classifier: Programming Language :: Python
+Classifier: Topic :: Office/Business
+Classifier: Topic :: Office/Business :: Financial :: Accounting
diff --git a/README b/README
new file mode 100644
index 0000000..bbe3ab1
--- /dev/null
+++ b/README
@@ -0,0 +1,36 @@
+trytond_sale
+============
+
+The sale module of the Tryton application platform.
+See __tryton__.py
+
+Installing
+----------
+
+See INSTALL
+
+Support
+-------
+
+If you encounter any problems with Tryton, please don't hesitate to ask
+questions on the Tryton bug tracker, mailing list, wiki or IRC channel:
+
+  http://bugs.tryton.org/
+  http://groups.tryton.org/
+  http://wiki.tryton.org/
+  irc://irc.freenode.net/tryton
+
+License
+-------
+
+See LICENSE
+
+Copyright
+---------
+
+See COPYRIGHT
+
+
+For more information please visit the Tryton web site:
+
+  http://www.tryton.org/
diff --git a/TODO b/TODO
new file mode 100644
index 0000000..fac542d
--- /dev/null
+++ b/TODO
@@ -0,0 +1,4 @@
+- Add button to recreate packing when in exception
+- Add button to recreate invoice when in exception
+- Add form_relate from party to party's sales
+- Add historization of quotation
diff --git a/__init__.py b/__init__.py
new file mode 100644
index 0000000..335e3a6
--- /dev/null
+++ b/__init__.py
@@ -0,0 +1,3 @@
+#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 sale import *
diff --git a/__tryton__.py b/__tryton__.py
new file mode 100644
index 0000000..017281c
--- /dev/null
+++ b/__tryton__.py
@@ -0,0 +1,93 @@
+#This file is part of Tryton.  The COPYRIGHT file at the top level of
+#this repository contains the full copyright notices and license terms.
+{
+    'name': 'Sale',
+    'name_de_DE': 'Verkauf',
+    'name_fr_FR': 'Vente',
+    'name_es_ES': 'Ventas',
+    'version': '1.0.0',
+    'author': 'B2CK',
+    'email': 'info at b2ck.com',
+    'website': 'http://www.tryton.org/',
+    'category': 'Sale',
+    'description': '''Define sale order.
+Add to product sale informations.
+Define the sale price as the list price.
+
+With the possibilities:
+    - to follow invoice and packing states from the sale order.
+    - to define invoice method:
+        - Manual
+        - On Order Confirmed
+        - On packing Sent
+    - to define packing method:
+        - Manual
+        - On Order Confirmed
+        - On Invoice Paid
+''',
+    'description_de_DE': ''' - Dient der Erstellung von Verkaufsvorgängen (Entwurf, Angebot, Auftrag).
+ - Fügt den Artikeln Einkaufsinformationen hinzu.
+ - Erlaubt die Definition des Einkaufspreises als Listenpreis.
+
+Ermöglicht:
+    - die Verfolgung des Status von Rechnungsstellung und Versand für Verkäufe
+    - die Festlegung der Methode für die Rechnungsstellung:
+        - Manuell
+        - Nach Auftragsbestätigung
+        - Nach Versand
+    - die Festlegung der Methode für den Versand:
+        - Manuell
+        - Nach Auftragsbestätigung
+        - Nach Bezahlung
+''',
+    'description_fr_FR': '''Défini l'ordre de vente.
+Ajoute au produit les information de vente.
+
+Avec la possibilité:
+    ' de suivre l'état de la facture et du colisage depuis l'ordre de vente
+    ' de choisir entre plusieurs méthodes de facturation:
+        ' Manuelle
+        ' Sur confirmation de la commande
+        ' À la livraison
+    ' de choisir entre plusieurs méthodes de colisage:
+        ' Manuel
+        ' Sur confirmation de la commande
+        ' Au paiement de la facture
+''',
+    'description_es_ES': ''' - Define la orden de Ventas.
+ - Se añade al producto la información de ventas.
+ - Definición del precio de venta y el precio de lista.
+
+ - Con las posibilidades de:
+    - seguir los estados de facturación y empaque desde la orden de venta.
+    - definir el método de facturación:
+        - Manual
+        - Al Confirmar la Orden
+        - Al Envío del Paquete
+    - definir el método de empaque:
+        - Manual
+        - Al Confirmar la Orden
+        - Contra el Pago de la Factura
+''',
+    'depends': [
+        'company',
+        'party',
+        'stock',
+        'account',
+        'product',
+        'account_invoice',
+        'workflow',
+        'res',
+        'ir',
+        'currency',
+        'account_product',
+    ],
+    'xml': [
+        'sale.xml',
+    ],
+    'translation': [
+        'de_DE.csv',
+        'es_ES.csv',
+        'fr_FR.csv',
+    ],
+}
diff --git a/de_DE.csv b/de_DE.csv
new file mode 100644
index 0000000..916bab5
--- /dev/null
+++ b/de_DE.csv
@@ -0,0 +1,154 @@
+type,name,res_id,src,value,fuzzy
+error,account.invoice,0,You can not delete invoices that comes from a sale!,Aus einem Verkauf stammende Rechnungen können nicht gelöscht werden!,0
+error,sale.line,0,"It miss an ""account_revenue"" default property!","Es ist keine allgemeine Eigenschaft ""Konto Ertrag"" definiert",0
+error,sale.line,0,The customer location is required!,Der Lagerort des Kunden muss eingegeben werden!,0
+error,sale.sale,0,Invoice and Packing addresses must be defined for the quotation.,Rechnungs- und Lieferadresse müssen für das Angebot angegeben werden.,0
+error,sale.sale,0,Wrong combination of method!,Ungültige Kombination von Methoden!,0
+field,"product.template,salable",0,Salable,Verkäuflich,0
+field,"product.template,sale_uom",0,Sale UOM,Einheit Verkauf,0
+field,"sale.line,amount",0,Amount,Betrag,0
+field,"sale.line,comment",0,Comment,Kommentar,0
+field,"sale.line,description",0,Description,Bezeichnung,0
+field,"sale.line,invoice_lines",0,Invoice Lines,Rechnungspositionen,0
+field,"sale.line,move_done",0,Moves Done,Bewegungen erledigt,0
+field,"sale.line,move_exception",0,Moves Exception,Bewegungsvorbehalt,0
+field,"sale.line,moves",0,Moves,Bewegungen,0
+field,"sale.line,moves_ignored",0,Moves Ignored,Ignorierte Bewegungen,0
+field,"sale.line,product",0,Product,Artikel,0
+field,"sale.line,quantity",0,Quantity,Menge,0
+field,"sale.line,sale",0,Sale,Verkauf,0
+field,"sale.line,sequence",0,Sequence,Sequenz,0
+field,"sale.line,taxes",0,Taxes,Steuern,0
+field,"sale.line,type",0,Type,Typ,0
+field,"sale.line,unit",0,Unit,Einheit,0
+field,"sale.line,unit_digits",0,Unit Digits,Anzahl Stellen,0
+field,"sale.line,unit_price",0,Unit Price,Einzelpreis,0
+field,"sale.sale,comment",0,Comment,Kommentar,0
+field,"sale.sale,company",0,Company,Unternehmen,0
+field,"sale.sale,contact_address",0,Contact Address,Kontaktadresse,0
+field,"sale.sale,currency",0,Currency,Währung,0
+field,"sale.sale,currency_digits",0,Currency Digits,Währung (signifikante Stellen),0
+field,"sale.sale,description",0,Description,Beschreibung,0
+field,"sale.sale,invoice_address",0,Invoice Address,Rechnungsadresse,0
+field,"sale.sale,invoice_exception",0,Invoices Exception,Rechnungsvorbehalt,0
+field,"sale.sale,invoice_method",0,Invoice Method,Rechnungsstellung,0
+field,"sale.sale,invoice_paid",0,Invoices Paid,Bezahlte Rechnungen,0
+field,"sale.sale,invoices",0,Invoices,Rechnungen,0
+field,"sale.sale,invoices_ignored",0,Invoices Ignored,Ignorierte Rechnungen,0
+field,"sale.sale,invoice_state",0,Invoice State,Rechnungsstatus,0
+field,"sale.sale,lines",0,Lines,Positionen,0
+field,"sale.sale,moves",0,Moves,Bewegungen,0
+field,"sale.sale,packing_address",0,Packing Address,Lieferadresse,0
+field,"sale.sale,packing_done",0,Packing Done,Lieferschein erledigt,0
+field,"sale.sale,packing_exception",0,Packings Exception,Lieferungsvorbehalt,0
+field,"sale.sale,packing_method",0,Packing Method,Liefermethode,0
+field,"sale.sale,packings",0,Packings,Lieferscheine,0
+field,"sale.sale,packing_state",0,Packing State,Lieferstatus,0
+field,"sale.sale,party",0,Party,Partei,0
+field,"sale.sale,party_lang",0,Party Language,Sprache Partei,0
+field,"sale.sale,payment_term",0,Payment Term,Zahlungsbedingung,0
+field,"sale.sale,reference",0,Reference,Referenz,0
+field,"sale.sale,sale_date",0,Sale Date,Verkaufsdatum,0
+field,"sale.sale,state",0,State,Status,0
+field,"sale.sale,tax_amount",0,Tax,Steuer,0
+field,"sale.sale,total_amount",0,Total,Gesamt,0
+field,"sale.sale,untaxed_amount",0,Untaxed,Netto,0
+field,"sale.sale,warehouse",0,Warehouse,Warenlager,0
+field,"stock.move,sale",0,Sale,Verkauf,0
+field,"stock.move,sale_line",0,unknown,unbekannt,0
+model,"ir.action,name",act_sale_form_confirmed,Confirmed Sales,Aufträge (Verkäufe),0
+model,"ir.action,name",act_sale_form_draft,Draft Sales,Entwürfe (Verkäufe),0
+model,"ir.action,name",act_sale_form_quotation,Quotation Sales,Angebote (Verkäufe),0
+model,"ir.action,name",report_sale,Sale,Verkauf drucken,0
+model,"ir.action,name",act_sale_form,Sales,Verkäufe,0
+model,"ir.sequence,name",sequence_sale,Sale,Verkauf,0
+model,"ir.sequence.type,name",sequence_type_sale,Sale,Verkauf,0
+model,"ir.ui.menu,name",menu_sale_form_confirmed,Confirmed Sales,Aufträge (Verkäufe),0
+model,"ir.ui.menu,name",menu_sale_form_draft,Draft Sales,Entwürfe (Verkäufe),0
+model,"ir.ui.menu,name",menu_sale_form_quotation,Quotation Sales,Angebote (Verkäufe),0
+model,"ir.ui.menu,name",menu_sale,Sale Management,Verkauf,0
+model,"ir.ui.menu,name",menu_sale_form,Sales,Verkauf,0
+model,"res.group,name",group_sale,Sale,Verkauf,0
+model,"workflow.activity,name",sale_activity_cancel,Cancel,Abbrechen,0
+model,"workflow.activity,name",sale_activity_confirmed,Confirmed,Beauftragt,0
+model,"workflow.activity,name",sale_activity_done,Done,Erledigt,0
+model,"workflow.activity,name",sale_activity_draft,Draft,Entwurf,0
+model,"workflow.activity,name",sale_activity_invoice_sale,Invoice,Rechnung,0
+model,"workflow.activity,name",sale_activity_invoice_sale_done,Invoice Done,Rechnung erledigt,0
+model,"workflow.activity,name",sale_activity_invoice_sale_exception,Invoice Exception,Rechnungsvorbehalt,0
+model,"workflow.activity,name",sale_activity_invoice_method,Invoice Method,Rechnungsstellung,0
+model,"workflow.activity,name",sale_activity_invoice_method_done,Invoice Method Done,Rechnungsstellung erledigt,0
+model,"workflow.activity,name",sale_activity_invoice_packing,Invoice Packing,Lieferschein Rechnung,0
+model,"workflow.activity,name",sale_activity_invoice_packing_done,Invoice Packing Done,Lieferschein Rechnung erledigt,0
+model,"workflow.activity,name",sale_activity_invoice_packing_exception,Invoice Packing Exception,Lieferschein Rechnung Vorbehalt,0
+model,"workflow.activity,name",sale_activity_invoice_packing_method,Invoice Packing Method,Lieferschein Rechnungsstellung,0
+model,"workflow.activity,name",sale_activity_invoice_packing_method_done,Invoice Packing Method Done,Lieferschein Rechnungsstellung erledigt,0
+model,"workflow.activity,name",sale_activity_packing,Packing,Lieferschein,0
+model,"workflow.activity,name",sale_activity_packing_exception,Packing Exception,Lieferschein Vorbehalt,0
+model,"workflow.activity,name",sale_activity_packing_invoice,Packing Invoice,Lieferschein Rechnung,0
+model,"workflow.activity,name",sale_activity_packing_invoice_done,Packing Invoice Done,Lieferschein Rechnung erledigt,0
+model,"workflow.activity,name",sale_activity_packing_invoice_exception,Packing Invoice Exception,Lieferschein Rechnung Vorbehalt,0
+model,"workflow.activity,name",sale_activity_packing_invoice_method,Packing Invoice Method,Lieferschein Rechnungsstellung,0
+model,"workflow.activity,name",sale_activity_packing_invoice_method_done,Packing Invoice Method Done,Lieferschein Rechnungsstellung erledigt,0
+model,"workflow.activity,name",sale_activity_packing_method,Packing Method,Liefermethode,0
+model,"workflow.activity,name",sale_activity_packing_method_done,Packing Method Done,Liefermethode erledigt,0
+model,"workflow.activity,name",sale_activity_quotation,Quotation,Angebot,0
+model,"workflow.activity,name",sale_activity_waiting_invoice_sale,Waiting Invoice,Rechnung wartend,0
+model,"workflow.activity,name",sale_activity_waiting_invoice_packing,Waiting Invoice Packing,Rechnung Lieferschein wartend,0
+model,"workflow.activity,name",sale_activity_waiting_packing,Waiting Packing,Lieferschein wartend,0
+model,"workflow.activity,name",sale_activity_waiting_packing_invoice,Waiting Packing Invoice,Lieferschein Rechnung wartend,0
+model,"workflow,name",sale_workflow,Sale workflow,Workflow Verkauf,0
+odt,sale.sale,0,Amount,Betrag,0
+odt,sale.sale,0,Date:,Datum:,0
+odt,sale.sale,0,Description,Bezeichnung,0
+odt,sale.sale,0,Description:,Bezeichnung:,0
+odt,sale.sale,0,Draft Sale Order,Auftragsentwurf,0
+odt,sale.sale,0,E-Mail:,E-Mail:,0
+odt,sale.sale,0,Phone:,Telefon:,0
+odt,sale.sale,0,Quantity,Menge,0
+odt,sale.sale,0,Quotation N°:,Angebot Nr.:,0
+odt,sale.sale,0,Sale Order N°:,Verkaufsauftrag Nr.:,0
+odt,sale.sale,0,Taxes,Steuern,0
+odt,sale.sale,0,Taxes:,Steuern:,0
+odt,sale.sale,0,Total:,Gesamt:,0
+odt,sale.sale,0,Total (excl. taxes):,Netto:,0
+odt,sale.sale,0,Unit Price,Einzelpreis,0
+odt,sale.sale,0,VAT:,USt:,0
+selection,"sale.line,type",0,Line,Position,0
+selection,"sale.line,type",0,Subtotal,Zwischensumme,0
+selection,"sale.line,type",0,Title,Überschrift,0
+selection,"sale.sale,invoice_method",0,Manual,Manuell,0
+selection,"sale.sale,invoice_method",0,On Order Confirmed,Bei Beauftragung,0
+selection,"sale.sale,invoice_method",0,On Packing Sent,Bei Versand,0
+selection,"sale.sale,invoice_state",0,Exception,Vorbehalt,0
+selection,"sale.sale,invoice_state",0,None,Kein,0
+selection,"sale.sale,invoice_state",0,Paid,Bezahlt,0
+selection,"sale.sale,invoice_state",0,Waiting,Wartend,0
+selection,"sale.sale,packing_method",0,Manual,Manuell,0
+selection,"sale.sale,packing_method",0,On Invoice Paid,Bei Bezahlung,0
+selection,"sale.sale,packing_method",0,On Order Confirmed,Bei Beauftragung,0
+selection,"sale.sale,packing_state",0,Exception,Vorbehalt,0
+selection,"sale.sale,packing_state",0,None,Kein,0
+selection,"sale.sale,packing_state",0,Sent,Gesendet,0
+selection,"sale.sale,packing_state",0,Waiting,Wartend,0
+selection,"sale.sale,state",0,Cancel,Abbrechen,0
+selection,"sale.sale,state",0,Confirmed,Beauftragt,0
+selection,"sale.sale,state",0,Done,Erledigt,0
+selection,"sale.sale,state",0,Draft,Entwurf,0
+selection,"sale.sale,state",0,Quotation,Angebot,0
+view,product.product,0,Customers,Kunden,0
+view,sale.line,0,Products,Artikel,0
+view,sale.line,0,Sale Line,Position Verkauf,0
+view,sale.line,0,Sale Lines,Positionen Verkauf,0
+view,sale.sale,0,Cancel,Abbrechen,0
+view,sale.sale,0,Confirm,Beauftragen,0
+view,sale.sale,0,Draft,Entwurf,0
+view,sale.sale,0,Ignore Invoice Exception,Rechnungsvorbehalt ignorieren,0
+view,sale.sale,0,Ignore Packing Exception,Verpackungsvorbehalt ignorieren,0
+view,sale.sale,0,Invoices,Rechnungen,0
+view,sale.sale,0,Lines,Positionen,0
+view,sale.sale,0,Other Info,Sonstiges,0
+view,sale.sale,0,Packings,Lieferscheine,0
+view,sale.sale,0,Quotation,Angebot,0
+view,sale.sale,0,Sale,Verkauf,0
+view,sale.sale,0,Sales,Verkäufe,0
diff --git a/debian/changelog b/debian/changelog
new file mode 100644
index 0000000..075ec04
--- /dev/null
+++ b/debian/changelog
@@ -0,0 +1,5 @@
+tryton-modules-sale (1.0.0-1) unstable; urgency=low
+
+  * Initial release (Closes: #506095).
+
+ -- Daniel Baumann <daniel at debian.org>  Mon, 12 Jan 2009 15:49:00 -0500
diff --git a/debian/compat b/debian/compat
new file mode 100644
index 0000000..7f8f011
--- /dev/null
+++ b/debian/compat
@@ -0,0 +1 @@
+7
diff --git a/debian/control b/debian/control
new file mode 100644
index 0000000..77662fb
--- /dev/null
+++ b/debian/control
@@ -0,0 +1,26 @@
+Source: tryton-modules-sale
+Section: python
+Priority: optional
+Maintainer: Daniel Baumann <daniel at debian.org>
+Build-Depends: debhelper (>= 7), python, python-all-dev, python-setuptools, python-support
+Standards-Version: 3.8.0
+Homepage: http://www.tryton.org/
+Vcs-Browser: http://git.debian.net/?p=debian/tryton-modules-sale.git
+Vcs-Git: git://git.debian.net/git/debian/tryton-modules-sale.git
+
+Package: tryton-modules-sale
+Architecture: any
+Depends: ${misc:Depends}, ${python:Depends}, tryton-server, tryton-modules-account, tryton-modules-account-invoice, tryton-modules-account-product, tryton-modules-company, tryton-modules-currency, tryton-modules-party, tryton-modules-product, tryton-modules-stock, python-pkg-resources
+XB-Python-Version: ${python:Versions}
+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 an ERP.
+ .
+ This module defines sale order, adds to product sale informations, and defines
+ the sale price as the list price.
+ .
+ With the possibilities:
+ .
+  * to follow invoice and packing states from the sale order.
+  * to define invoice method: Manual, On Order Confirmed, On packing Sent.
+  * to define packing method: Manual, On Order Confirmed, On Invoice Paid.
diff --git a/debian/copyright b/debian/copyright
new file mode 100644
index 0000000..0088eff
--- /dev/null
+++ b/debian/copyright
@@ -0,0 +1,44 @@
+Author: Tryton Project <http://www.tryton.org/>
+Download: http://www.tryton.org/downloads.html
+
+Files: *
+Copyright:
+ (C) 2004-2008 Tiny SPRL
+ (C) 2008 Cedric Krier
+ (C) 2008 Bertrand Chenal
+ (C) 2008 B2CK SPRL
+License: GPL-3+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+ .
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+ .
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>.
+ .
+ On Debian systems, the complete text of the GNU General Public License
+ can be found in /usr/share/common-licenses/GPL-3 file.
+
+Files: debian/*
+Copyright: (C) 2009 Daniel Baumann <daniel at debian.org>
+License: GPL-3+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+ .
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+ .
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>.
+ .
+ On Debian systems, the complete text of the GNU General Public License
+ can be found in /usr/share/common-licenses/GPL-3 file.
diff --git a/debian/pycompat b/debian/pycompat
new file mode 100644
index 0000000..0cfbf08
--- /dev/null
+++ b/debian/pycompat
@@ -0,0 +1 @@
+2
diff --git a/debian/pyversions b/debian/pyversions
new file mode 100644
index 0000000..8b253bc
--- /dev/null
+++ b/debian/pyversions
@@ -0,0 +1 @@
+2.4-
diff --git a/debian/rules b/debian/rules
new file mode 100755
index 0000000..1541359
--- /dev/null
+++ b/debian/rules
@@ -0,0 +1,42 @@
+#!/usr/bin/make -f
+
+clean:
+	dh_testdir
+	dh_testroot
+	rm -f build-stamp
+
+	python setup.py clean
+	rm -rf dist build trytond_sale.egg-info
+
+	dh_clean
+
+build:
+
+install:
+	dh_testdir
+	dh_testroot
+	dh_prep
+	dh_installdirs
+
+	python setup.py install --single-version-externally-managed --root=$(CURDIR)/debian/tryton-modules-sale --install-lib /usr/share/python-support/tryton-modules-sale
+
+	find debian/tryton-modules-sale -type f -name "*.pyc" | xargs rm -f
+
+binary: binary-indep
+
+binary-arch:
+
+binary-indep: install
+	dh_testdir
+	dh_testroot
+	dh_installchangelogs CHANGELOG
+	dh_installdocs
+	dh_pysupport
+	dh_compress
+	dh_fixperms
+	dh_installdeb
+	dh_gencontrol
+	dh_md5sums
+	dh_builddeb
+
+.PHONY: clean build install binary binary-arch binary-indep
diff --git a/es_ES.csv b/es_ES.csv
new file mode 100644
index 0000000..00407ac
--- /dev/null
+++ b/es_ES.csv
@@ -0,0 +1,120 @@
+type,name,res_id,src,value,fuzzy
+error,account.invoice,0,You can not delete invoices that comes from a sale!,No puede borrar facturas que provenientes de una venta!,0
+error,sale.line,0,"It miss an ""account_revenue"" default property!","Hace falta una propiedad predeterminada de ""cuenta_de_ganancias""!",0
+error,sale.line,0,The customer location is required!,Es indispensable el lugar del cliente!,0
+error,sale.sale,0,Wrong combination of method!,Combinación o método erróneos!,0
+field,"product.template,salable",0,Salable,De fácil venta,0
+field,"product.template,sale_uom",0,Sale UOM,UdM de Venta,0
+field,"sale.line,amount",0,Amount,Cantidad,0
+field,"sale.line,comment",0,Comment,Comentario,0
+field,"sale.line,description",0,Description,Descripción,0
+field,"sale.line,invoice_lines",0,Invoice Lines,Líneas de Factura,0
+field,"sale.line,move_done",0,Moves Done,Movimientos Hechos,0
+field,"sale.line,move_exception",0,Moves Exception,Exepción de Movimientos,0
+field,"sale.line,moves",0,Moves,Movimientos,0
+field,"sale.line,moves_ignored",0,Moves Ignored,Movimientos Ignorados,0
+field,"sale.line,product",0,Product,Producto,0
+field,"sale.line,quantity",0,Quantity,Cantidad,0
+field,"sale.line,sale",0,Sale,Venta,0
+field,"sale.line,sequence",0,Sequence,Secuencia,0
+field,"sale.line,taxes",0,Taxes,Impuestos,0
+field,"sale.line,type",0,Type,Tipo,0
+field,"sale.line,unit",0,Unit,Unidad,0
+field,"sale.line,unit_digits",0,Unit Digits,Dígitos de Unidad,0
+field,"sale.line,unit_price",0,Unit Price,Precio Unitario,0
+field,"sale.sale,comment",0,Comment,Comentario,0
+field,"sale.sale,company",0,Company,Compañía,0
+field,"sale.sale,contact_address",0,Contact Address,Dirección de Contacto,0
+field,"sale.sale,currency",0,Currency,Moneda,0
+field,"sale.sale,currency_digits",0,Currency Digits,Dígitos de Moneda,0
+field,"sale.sale,description",0,Description,Descripción,0
+field,"sale.sale,invoice_address",0,Invoice Address,Dirección de Facturación,0
+field,"sale.sale,invoice_exception",0,Invoices Exception,Excepción de Facturación,0
+field,"sale.sale,invoice_method",0,Invoice Method,Método de Facturación,0
+field,"sale.sale,invoice_paid",0,Invoices Paid,Facturas Pagadas,0
+field,"sale.sale,invoices",0,Invoices,Facturas,0
+field,"sale.sale,invoices_ignored",0,Invoices Ignored,Facturas Ignoradas,0
+field,"sale.sale,invoice_state",0,Invoice State,Estado de Factura,0
+field,"sale.sale,lines",0,Lines,Líneas,0
+field,"sale.sale,moves",0,Moves,Movimientos,0
+field,"sale.sale,packing_address",0,Packing Address,Dirección de empaque,0
+field,"sale.sale,packing_done",0,Packing Done,Empacado Finalizado,0
+field,"sale.sale,packing_exception",0,Packings Exception,Excepción de Empaques,0
+field,"sale.sale,packing_method",0,Packing Method,Método de Empacado,0
+field,"sale.sale,packings",0,Packings,Empaques,0
+field,"sale.sale,packing_state",0,Packing State,Estado de Empaque,0
+field,"sale.sale,party",0,Party,Tercero,0
+field,"sale.sale,party_lang",0,Party Language,Idioma del Tercero,0
+field,"sale.sale,payment_term",0,Payment Term,Término de Pago,0
+field,"sale.sale,reference",0,Reference,Referencia,0
+field,"sale.sale,sale_date",0,Sale Date,Fecha de Venta,0
+field,"sale.sale,state",0,State,Estado,0
+field,"sale.sale,tax_amount",0,Tax,Impuesto,0
+field,"sale.sale,total_amount",0,Total,Total,0
+field,"sale.sale,untaxed_amount",0,Untaxed,Sin Impuesto,0
+field,"sale.sale,warehouse",0,Warehouse,Depósito,0
+field,"stock.move,sale",0,Sale,Venta,0
+field,"stock.move,sale_line",0,unknown,desconocido,0
+model,"ir.action,name",act_sale_form_confirmed,Confirmed Sales,Ventas Confirmadas,0
+model,"ir.action,name",act_sale_form_draft,Draft Sales,Ventas en Borrador,0
+model,"ir.action,name",act_sale_form_quotation,Quotation Sales,Ventas Cotizadas,0
+model,"ir.action,name",report_sale,Sale,Venta,0
+model,"ir.action,name",act_sale_form,Sales,Ventas,0
+model,"ir.ui.menu,name",menu_sale_form_confirmed,Confirmed Sales,Ventas Confirmadas,0
+model,"ir.ui.menu,name",menu_sale_form_draft,Draft Sales,Ventas en Borrador,0
+model,"ir.ui.menu,name",menu_sale_form_quotation,Quotation Sales,Ventas Cotizadas,0
+model,"ir.ui.menu,name",menu_sale,Sale Management,Gestión de Ventas,0
+model,"ir.ui.menu,name",menu_sale_form,Sales,Ventas,0
+odt,sale.sale,0,Amount,Cantidad,0
+odt,sale.sale,0,Date:,Fecha:,0
+odt,sale.sale,0,Description,Descripción,0
+odt,sale.sale,0,Description:,Descripción:,0
+odt,sale.sale,0,Draft Sale Order,Orden de Venta en Borrador,0
+odt,sale.sale,0,E-Mail:,Correo electrónico:,0
+odt,sale.sale,0,Phone:,Teléfono:,0
+odt,sale.sale,0,Quantity,Cantidad,0
+odt,sale.sale,0,Quotation N°:,Cotización Nº:,0
+odt,sale.sale,0,Sale Order N°:,Orden de Venta Nº:,0
+odt,sale.sale,0,Taxes,Impuestos,0
+odt,sale.sale,0,Taxes:,Impuestos:,0
+odt,sale.sale,0,Total:,Total:,0
+odt,sale.sale,0,Total (excl. taxes):,Total (sin impuestos):,0
+odt,sale.sale,0,Unit Price,Precio Unitario,0
+odt,sale.sale,0,VAT:,VAT:,0
+selection,"sale.line,type",0,Line,Línea,0
+selection,"sale.line,type",0,Subtotal,Subtotal,0
+selection,"sale.line,type",0,Title,Título,0
+selection,"sale.sale,invoice_method",0,Manual,Manual,0
+selection,"sale.sale,invoice_method",0,On Order Confirmed,Al Confirmar la Orden,0
+selection,"sale.sale,invoice_method",0,On Packing Sent,Al enviar el Empaque,0
+selection,"sale.sale,invoice_state",0,Exception,Excepción,0
+selection,"sale.sale,invoice_state",0,None,Ninguno,0
+selection,"sale.sale,invoice_state",0,Paid,Pagado,0
+selection,"sale.sale,invoice_state",0,Waiting,En Espera,0
+selection,"sale.sale,packing_method",0,Manual,Manual,0
+selection,"sale.sale,packing_method",0,On Invoice Paid,Al Pagar,0
+selection,"sale.sale,packing_method",0,On Order Confirmed,Al Confirmar la Orden,0
+selection,"sale.sale,packing_state",0,Exception,Excepción,0
+selection,"sale.sale,packing_state",0,None,Ninguno,0
+selection,"sale.sale,packing_state",0,Sent,Enviado,0
+selection,"sale.sale,packing_state",0,Waiting,En Espera,0
+selection,"sale.sale,state",0,Cancel,Cancelar,0
+selection,"sale.sale,state",0,Confirmed,Confirmado,0
+selection,"sale.sale,state",0,Done,Hecho,0
+selection,"sale.sale,state",0,Draft,Borrador,0
+selection,"sale.sale,state",0,Quotation,Cotización,0
+view,product.product,0,Customers,Clientes,0
+view,sale.line,0,Sale Line,Línea de Venta,0
+view,sale.line,0,Sale Lines,Líneas de Venta,0
+view,sale.sale,0,Cancel,Cancelar,0
+view,sale.sale,0,Confirm,Confirmar,0
+view,sale.sale,0,Draft,Borrador,0
+view,sale.sale,0,Ignore Invoice Exception,Ignorar excepción en Factura,0
+view,sale.sale,0,Ignore Packing Exception,Ignorar excepción en Empaque,0
+view,sale.sale,0,Invoices,Facturas,0
+view,sale.sale,0,Lines,Líneas,0
+view,sale.sale,0,Other Info,Información Adicional,0
+view,sale.sale,0,Packings,Empaques,0
+view,sale.sale,0,Quotation,Cotización,0
+view,sale.sale,0,Sale,Venta,0
+view,sale.sale,0,Sales,Ventas,0
diff --git a/fr_FR.csv b/fr_FR.csv
new file mode 100644
index 0000000..67dd64a
--- /dev/null
+++ b/fr_FR.csv
@@ -0,0 +1,138 @@
+type,name,res_id,src,value,fuzzy
+error,account.invoice,0,You can not delete invoices that comes from a sale!,Vous ne pouvez pas supprimer des factures provenant d'une vente !,0
+error,sale.line,0,"It miss an ""account_revenue"" default property!","Il manque une propriété""account_expense""",0
+error,sale.line,0,The customer location is required!,L'emplacement client est requis !,0
+error,sale.sale,0,Invoice and Packing addresses must be defined for the quotation.,Les adresses de facturation de de colisage sont requises pour le devis.,0
+error,sale.sale,0,Wrong combination of method!,Mauvaise combinaison de méthodes !,0
+field,"product.template,salable",0,Salable,Vendable,0
+field,"product.template,sale_uom",0,Sale UOM,UDM de vente,0
+field,"sale.line,amount",0,Amount,Montatn,0
+field,"sale.line,comment",0,Comment,Commentaire,0
+field,"sale.line,description",0,Description,Description,0
+field,"sale.line,invoice_lines",0,Invoice Lines,Lignes de facture,0
+field,"sale.line,move_done",0,Moves Done,Mouvements effectués,0
+field,"sale.line,move_exception",0,Moves Exception,Mouvements en exception,0
+field,"sale.line,moves",0,Moves,Mouvements,0
+field,"sale.line,moves_ignored",0,Moves Ignored,Mouvements ignorés,0
+field,"sale.line,product",0,Product,Produit,0
+field,"sale.line,quantity",0,Quantity,Quantité,0
+field,"sale.line,sale",0,Sale,Vente,0
+field,"sale.line,sequence",0,Sequence,Séquence,0
+field,"sale.line,taxes",0,Taxes,Taxes,0
+field,"sale.line,type",0,Type,Type,0
+field,"sale.line,unit",0,Unit,Unité,0
+field,"sale.line,unit_digits",0,Unit Digits,Décimales de l'unité,0
+field,"sale.line,unit_price",0,Unit Price,Prix unitaire,0
+field,"sale.sale,comment",0,Comment,Commentaire,0
+field,"sale.sale,company",0,Company,Companie,0
+field,"sale.sale,contact_address",0,Contact Address,Adresse de contact,0
+field,"sale.sale,currency",0,Currency,Devise,0
+field,"sale.sale,currency_digits",0,Currency Digits,Décimales de la devise,0
+field,"sale.sale,description",0,Description,Description,0
+field,"sale.sale,invoice_address",0,Invoice Address,Adresse de facturation,0
+field,"sale.sale,invoice_exception",0,Invoices Exception,Factures en exception,0
+field,"sale.sale,invoice_method",0,Invoice Method,Méthode de facturation,0
+field,"sale.sale,invoice_paid",0,Invoices Paid,Factures payées,0
+field,"sale.sale,invoices",0,Invoices,Factures,0
+field,"sale.sale,invoices_ignored",0,Invoices Ignored,Factures ignorées,0
+field,"sale.sale,invoice_state",0,Invoice State,État de la factutre,0
+field,"sale.sale,lines",0,Lines,Lignes,0
+field,"sale.sale,moves",0,Moves,Mouvements,0
+field,"sale.sale,packing_address",0,Packing Address,Adresse de livraison,0
+field,"sale.sale,packing_done",0,Packing Done,Colisage effectué,0
+field,"sale.sale,packing_exception",0,Packings Exception,Colisages en exception,0
+field,"sale.sale,packing_method",0,Packing Method,Méthode de livraison,0
+field,"sale.sale,packings",0,Packings,Colisages,0
+field,"sale.sale,packing_state",0,Packing State,État du colisage,0
+field,"sale.sale,party",0,Party,Tiers,0
+field,"sale.sale,party_lang",0,Party Language,Langue du tiers,0
+field,"sale.sale,payment_term",0,Payment Term,Condition de paiement,0
+field,"sale.sale,reference",0,Reference,Référence,0
+field,"sale.sale,sale_date",0,Sale Date,Date de la vente,0
+field,"sale.sale,state",0,State,État,0
+field,"sale.sale,tax_amount",0,Tax,Taxe,0
+field,"sale.sale,total_amount",0,Total,Total,0
+field,"sale.sale,untaxed_amount",0,Untaxed,Non-taxé,0
+field,"sale.sale,warehouse",0,Warehouse,Entrepôt,0
+field,"stock.move,sale",0,Sale,Vente,0
+field,"stock.move,sale_line",0,unknown,inconnu,0
+model,"ir.action,name",act_sale_form_confirmed,Confirmed Sales,Ventes confirmées,0
+model,"ir.action,name",act_sale_form_draft,Draft Sales,Ventes brouillon,0
+model,"ir.action,name",act_sale_form_quotation,Quotation Sales,Devis,0
+model,"ir.action,name",report_sale,Sale,Vente,0
+model,"ir.action,name",act_sale_form,Sales,Ventes,0
+model,"ir.sequence,name",sequence_sale,Sale,Vente,0
+model,"ir.sequence.type,name",sequence_type_sale,Sale,Vente,0
+model,"ir.ui.menu,name",menu_sale_form_confirmed,Confirmed Sales,Ventes confirmées,0
+model,"ir.ui.menu,name",menu_sale_form_draft,Draft Sales,Ventes brouillons,0
+model,"ir.ui.menu,name",menu_sale_form_quotation,Quotation Sales,Devis,0
+model,"ir.ui.menu,name",menu_sale,Sale Management,Gestion des ventes,0
+model,"ir.ui.menu,name",menu_sale_form,Sales,Ventes,0
+model,"res.group,name",group_sale,Sale,Vente,0
+model,"workflow.activity,name",sale_activity_cancel,Cancel,Annulé,0
+model,"workflow.activity,name",sale_activity_confirmed,Confirmed,Confirmé,0
+model,"workflow.activity,name",sale_activity_done,Done,Fait,0
+model,"workflow.activity,name",sale_activity_draft,Draft,Brouillon,0
+model,"workflow.activity,name",sale_activity_invoice_sale,Invoice,Facture,0
+model,"workflow.activity,name",sale_activity_invoice_sale_done,Invoice Done,Facture faite,0
+model,"workflow.activity,name",sale_activity_invoice_sale_exception,Invoice Exception,Facture en exception,0
+model,"workflow.activity,name",sale_activity_invoice_method,Invoice Method,Méthode de facturation,0
+model,"workflow.activity,name",sale_activity_invoice_method_done,Invoice Method Done,Méthode de facture faite,0
+model,"workflow.activity,name",sale_activity_invoice_packing,Invoice Packing,Facture colisage,0
+model,"workflow.activity,name",sale_activity_invoice_packing_done,Invoice Packing Done,Facture colisage faite,0
+model,"workflow.activity,name",sale_activity_invoice_packing_exception,Invoice Packing Exception,Facture colisage en exception,0
+model,"workflow.activity,name",sale_activity_invoice_packing_method,Invoice Packing Method,Méthode facture colisage,0
+model,"workflow.activity,name",sale_activity_invoice_packing_method_done,Invoice Packing Method Done,Méthode facture colisage faite,0
+model,"workflow.activity,name",sale_activity_packing,Packing,Colisage,0
+model,"workflow.activity,name",sale_activity_packing_exception,Packing Exception,Colisage en exception,0
+model,"workflow.activity,name",sale_activity_packing_invoice,Packing Invoice,Facture colisage,0
+model,"workflow.activity,name",sale_activity_packing_invoice_done,Packing Invoice Done,Facture colisage faite,0
+model,"workflow.activity,name",sale_activity_packing_invoice_exception,Packing Invoice Exception,Facture colisage en exception,0
+model,"workflow.activity,name",sale_activity_packing_invoice_method,Packing Invoice Method,Méthode facture colisage,0
+model,"workflow.activity,name",sale_activity_packing_invoice_method_done,Packing Invoice Method Done,Méthode facture colisage faite,0
+model,"workflow.activity,name",sale_activity_packing_method,Packing Method,Méthode de colisage,0
+model,"workflow.activity,name",sale_activity_packing_method_done,Packing Method Done,Méthode de colisage faite,0
+model,"workflow.activity,name",sale_activity_quotation,Quotation,Devis,0
+model,"workflow.activity,name",sale_activity_waiting_invoice_sale,Waiting Invoice,Facture en attente,0
+model,"workflow.activity,name",sale_activity_waiting_invoice_packing,Waiting Invoice Packing,Facture colisage en attente,0
+model,"workflow.activity,name",sale_activity_waiting_packing,Waiting Packing,Colisage en attente,0
+model,"workflow.activity,name",sale_activity_waiting_packing_invoice,Waiting Packing Invoice,Facture colisage en attente,0
+model,"workflow,name",sale_workflow,Sale workflow,Workflow de vente,0
+selection,"sale.line,type",0,Line,Ligne,0
+selection,"sale.line,type",0,Subtotal,Sous-total,0
+selection,"sale.line,type",0,Title,Titre,0
+selection,"sale.sale,invoice_method",0,Manual,Manuel,0
+selection,"sale.sale,invoice_method",0,On Order Confirmed,À la confirmation de la commande,0
+selection,"sale.sale,invoice_method",0,On Packing Sent,À la livraison,0
+selection,"sale.sale,invoice_state",0,Exception,Exception,0
+selection,"sale.sale,invoice_state",0,None,Aucun,0
+selection,"sale.sale,invoice_state",0,Paid,Payé,0
+selection,"sale.sale,invoice_state",0,Waiting,En attente,0
+selection,"sale.sale,packing_method",0,Manual,Manuel,0
+selection,"sale.sale,packing_method",0,On Invoice Paid,Au paiement de la facture,0
+selection,"sale.sale,packing_method",0,On Order Confirmed,À la confirmation de la commande,0
+selection,"sale.sale,packing_state",0,Exception,Exception,0
+selection,"sale.sale,packing_state",0,None,Aucun,0
+selection,"sale.sale,packing_state",0,Sent,Envoyé,0
+selection,"sale.sale,packing_state",0,Waiting,En attente,0
+selection,"sale.sale,state",0,Cancel,Annulé,0
+selection,"sale.sale,state",0,Confirmed,Confirmé,0
+selection,"sale.sale,state",0,Done,Fait,0
+selection,"sale.sale,state",0,Draft,Brouillon,0
+selection,"sale.sale,state",0,Quotation,Devis,0
+view,product.product,0,Customers,Clients,0
+view,sale.line,0,Products,produits,0
+view,sale.line,0,Sale Line,Ligne de vente,0
+view,sale.line,0,Sale Lines,Lignes de vente,0
+view,sale.sale,0,Cancel,Annuler,0
+view,sale.sale,0,Confirm,Confirmer,0
+view,sale.sale,0,Draft,Brouillon,0
+view,sale.sale,0,Ignore Invoice Exception,Ignorer l'exception de facturation ,0
+view,sale.sale,0,Ignore Packing Exception,Ignorer l'exception de livraison,0
+view,sale.sale,0,Invoices,Factures,0
+view,sale.sale,0,Lines,Lignes,0
+view,sale.sale,0,Other Info,Autre informations,0
+view,sale.sale,0,Packings,Colisages,0
+view,sale.sale,0,Quotation,Devis,0
+view,sale.sale,0,Sale,Vente,0
+view,sale.sale,0,Sales,Ventes,0
diff --git a/sale.odt b/sale.odt
new file mode 100644
index 0000000..1667524
Binary files /dev/null and b/sale.odt differ
diff --git a/sale.py b/sale.py
new file mode 100644
index 0000000..4b9a2af
--- /dev/null
+++ b/sale.py
@@ -0,0 +1,1459 @@
+#This file is part of Tryton.  The COPYRIGHT file at the top level
+#of this repository contains the full copyright notices and license terms.
+"Sale"
+
+from trytond.osv import fields, OSV
+from decimal import Decimal
+from trytond.netsvc import LocalService
+from trytond.report import CompanyReport
+
+
+class Sale(OSV):
+    'Sale'
+    _name = 'sale.sale'
+    _rec_name = 'reference'
+    _description = __doc__
+
+    company = fields.Many2One('company.company', 'Company', required=True,
+            states={
+                'readonly': "state != 'draft' or bool(lines)",
+            })
+    reference = fields.Char('Reference', readonly=True, select=1)
+    description = fields.Char('Description', states={
+        'readonly': "state != 'draft'",
+        })
+    state = fields.Selection([
+        ('draft', 'Draft'),
+        ('quotation', 'Quotation'),
+        ('confirmed', 'Confirmed'),
+        ('done', 'Done'),
+        ('cancel', 'Cancel'),
+    ], 'State', readonly=True, required=True)
+    sale_date = fields.Date('Sale Date', required=True, states={
+        'readonly': "state != 'draft'",
+        })
+    payment_term = fields.Many2One('account.invoice.payment_term',
+            'Payment Term', required=True, states={
+                'readonly': "state != 'draft'",
+            })
+    party = fields.Many2One('party.party', 'Party', change_default=True,
+            required=True, states={
+                'readonly': "state != 'draft'",
+            }, on_change=['party', 'payment_term'])
+    party_lang = fields.Function('get_function_fields', type='char',
+            string='Party Language', on_change_with=['party'])
+    invoice_address = fields.Many2One('party.address', 'Invoice Address',
+            domain="[('party', '=', party)]", states={
+                'readonly': "state != 'draft'",
+            })
+    packing_address = fields.Many2One('party.address', 'Packing Address',
+            domain="[('party', '=', party)]", states={
+                'readonly': "state != 'draft'",
+            })
+    warehouse = fields.Many2One('stock.location', 'Warehouse',
+            domain=[('type', '=', 'warehouse')], required=True, states={
+                'readonly': "state != 'draft'",
+            })
+    currency = fields.Many2One('currency.currency', 'Currency', required=True,
+        states={
+            'readonly': "state != 'draft' or (bool(lines) and bool(currency))",
+        })
+    currency_digits = fields.Function('get_function_fields', type='integer',
+            string='Currency Digits', on_change_with=['currency'])
+    lines = fields.One2Many('sale.line', 'sale', 'Lines', states={
+        'readonly': "state != 'draft'",
+        }, on_change=['lines', 'currency', 'party'])
+    comment = fields.Text('Comment')
+    untaxed_amount = fields.Function('get_function_fields', type='numeric',
+            digits="(16, currency_digits)", string='Untaxed')
+    tax_amount = fields.Function('get_function_fields', type='numeric',
+            digits="(16, currency_digits)", string='Tax')
+    total_amount = fields.Function('get_function_fields', type='numeric',
+            digits="(16, currency_digits)", string='Total')
+    invoice_method = fields.Selection([
+        ('manual', 'Manual'),
+        ('order', 'On Order Confirmed'),
+        ('packing', 'On Packing Sent'),
+    ], 'Invoice Method', required=True, states={
+        'readonly': "state != 'draft'",
+        })
+    invoice_state = fields.Selection([
+        ('none', 'None'),
+        ('waiting', 'Waiting'),
+        ('paid', 'Paid'),
+        ('exception', 'Exception'),
+    ], 'Invoice State', readonly=True, required=True)
+    invoices = fields.Many2Many('account.invoice', 'sale_invoices_rel',
+            'sale', 'invoice', 'Invoices', readonly=True)
+    invoices_ignored = fields.Many2Many('account.invoice',
+            'sale_invoice_ignored_rel', 'sale', 'invoice',
+            'Invoices Ignored', readonly=True)
+    invoice_paid = fields.Function('get_function_fields', type='boolean',
+            string='Invoices Paid')
+    invoice_exception = fields.Function('get_function_fields', type='boolean',
+            string='Invoices Exception')
+    packing_method = fields.Selection([
+        ('manual', 'Manual'),
+        ('order', 'On Order Confirmed'),
+        ('invoice', 'On Invoice Paid'),
+    ], 'Packing Method', required=True, states={
+        'readonly': "state != 'draft'",
+        })
+    packing_state = fields.Selection([
+        ('none', 'None'),
+        ('waiting', 'Waiting'),
+        ('sent', 'Sent'),
+        ('exception', 'Exception'),
+    ], 'Packing State', readonly=True, required=True)
+    packings = fields.Function('get_function_fields', type='many2many',
+            relation='stock.packing.out', string='Packings')
+    moves = fields.Function('get_function_fields', type='many2many',
+            relation='stock.move', string='Moves')
+    packing_done = fields.Function('get_function_fields', type='boolean',
+            string='Packing Done')
+    packing_exception = fields.Function('get_function_fields', type='boolean',
+            string='Packings Exception')
+
+    def __init__(self):
+        super(Sale, self).__init__()
+        self._constraints += [
+            ('check_method', 'wrong_method')
+        ]
+        self._error_messages.update({
+            'wrong_method': 'Wrong combination of method!',
+            'addresses_required': 'Invoice and Packing addresses must be '
+            'defined for the quotation.',
+        })
+
+    def default_payment_term(self, cursor, user, context=None):
+        payment_term_obj = self.pool.get('account.invoice.payment_term')
+        payment_term_ids = payment_term_obj.search(cursor, user,
+                self.payment_term._domain, context=context)
+        if len(payment_term_ids) == 1:
+            return payment_term_obj.name_get(cursor, user, payment_term_ids,
+                    context=context)[0]
+        return False
+
+    def default_warehouse(self, cursor, user, context=None):
+        location_obj = self.pool.get('stock.location')
+        location_ids = location_obj.search(cursor, user,
+                self.warehouse._domain, context=context)
+        if len(location_ids) == 1:
+            return location_obj.name_get(cursor, user, location_ids,
+                    context=context)[0]
+        return False
+
+    def default_company(self, cursor, user, context=None):
+        company_obj = self.pool.get('company.company')
+        if context is None:
+            context = {}
+        if context.get('company'):
+            return company_obj.name_get(cursor, user, context['company'],
+                    context=context)[0]
+        return False
+
+    def default_state(self, cursor, user, context=None):
+        return 'draft'
+
+    def default_sale_date(self, cursor, user, context=None):
+        date_obj = self.pool.get('ir.date')
+        return date_obj.today(cursor, user, context=context)
+
+    def default_currency(self, cursor, user, context=None):
+        company_obj = self.pool.get('company.company')
+        currency_obj = self.pool.get('currency.currency')
+        if context is None:
+            context = {}
+        company = None
+        if context.get('company'):
+            company = company_obj.browse(cursor, user, context['company'],
+                    context=context)
+            return currency_obj.name_get(cursor, user, company.currency.id,
+                    context=context)[0]
+        return False
+
+    def default_currency_digits(self, cursor, user, context=None):
+        company_obj = self.pool.get('company.company')
+        if context is None:
+            context = {}
+        company = None
+        if context.get('company'):
+            company = company_obj.browse(cursor, user, context['company'],
+                    context=context)
+            return company.currency.digits
+        return 2
+
+    def default_invoice_method(self, cursor, user, context=None):
+        return 'order'
+
+    def default_invoice_state(self, cursor, user, context=None):
+        return 'none'
+
+    def default_packing_method(self, cursor, user, context=None):
+        return 'order'
+
+    def default_packing_state(self, cursor, user, context=None):
+        return 'none'
+
+    def on_change_party(self, cursor, user, ids, vals, context=None):
+        party_obj = self.pool.get('party.party')
+        address_obj = self.pool.get('party.address')
+        payment_term_obj = self.pool.get('account.invoice.payment_term')
+        res = {
+            'invoice_address': False,
+            'packing_address': False,
+            'payment_term': False,
+        }
+        if vals.get('party'):
+            party = party_obj.browse(cursor, user, vals['party'],
+                    context=context)
+            res['invoice_address'] = party_obj.address_get(cursor, user,
+                    party.id, type='invoice', context=context)
+            res['packing_address'] = party_obj.address_get(cursor, user,
+                    party.id, type='delivery', context=context)
+            if party.supplier_payment_term:
+                res['payment_term'] = party.supplier_payment_term.id
+
+        if res['invoice_address']:
+            res['invoice_address'] = address_obj.name_get(cursor, user,
+                    res['invoice_address'], context=context)[0]
+        if res['packing_address']:
+            res['packing_address'] = address_obj.name_get(cursor, user,
+                    res['packing_address'], context=context)[0]
+        if res['payment_term']:
+            res['payment_term'] = payment_term_obj.name_get(cursor, user,
+                    res['payment_term'], context=context)[0]
+        else:
+            res['payment_term'] = self.default_payment_term(cursor, user,
+                    context=context)
+        return res
+
+    def on_change_with_currency_digits(self, cursor, user, ids, vals,
+            context=None):
+        currency_obj = self.pool.get('currency.currency')
+        if vals.get('currency'):
+            currency = currency_obj.browse(cursor, user, vals['currency'],
+                    context=context)
+            return currency.digits
+        return 2
+
+    def get_currency_digits(self, cursor, user, sales, context=None):
+        '''
+        Return the number of digits of the currency of each sales
+
+        :param cursor: the database cursor
+        :param user: the user id
+        :param sales: a BrowseRecordList of puchases
+        :param context: the context
+        :return: a dictionary with sale id as key and
+            number of digits as value
+        '''
+        res = {}
+        for sale in sales:
+            res[sale.id] = sale.currency.digits
+        return res
+
+    def get_tax_context(self, cursor, user, sale, context=None):
+        party_obj = self.pool.get('party.party')
+        res = {}
+        if isinstance(sale, dict):
+            if sale.get('party'):
+                party = party_obj.browse(cursor, user, sale['party'],
+                        context=context)
+                if party.lang:
+                    res['language'] = party.lang.code
+        else:
+            if sale.party.lang:
+                res['language'] = sale.party.lang.code
+        return res
+
+    def on_change_with_party_lang(self, cursor, user, ids, vals,
+            context=None):
+        party_obj = self.pool.get('party.party')
+        if vals.get('party'):
+            party = party_obj.browse(cursor, user, vals['party'],
+                    context=context)
+            if party.lang:
+                return party.lang.code
+        return 'en_US'
+
+    def get_party_lang(self, cursor, user, sales, context=None):
+        '''
+        Return the code lang of the party for each sales
+
+        :param cursor: the database cursor
+        :param user: the user id
+        :param sales: a BrowseRecordList of sales
+        :param context: the context
+        :return: a dictionary with sale id as key and
+            code lang as value
+        '''
+        res = {}
+        for sale in sales:
+            if sale.party.lang:
+                res[sale.id] = sale.party.lang.code
+            else:
+                res[sale.id] = 'en_US'
+        return res
+
+
+    def on_change_lines(self, cursor, user, ids, vals, context=None):
+        currency_obj = self.pool.get('currency.currency')
+        tax_obj = self.pool.get('account.tax')
+
+        if context is None:
+            context = {}
+
+        res = {
+            'untaxed_amount': Decimal('0.0'),
+            'tax_amount': Decimal('0.0'),
+            'total_amount': Decimal('0.0'),
+        }
+
+        currency = None
+        if vals.get('currency'):
+            currency = currency_obj.browse(cursor, user, vals['currency'],
+                    context=context)
+
+        if vals.get('lines'):
+            ctx = context.copy()
+            ctx.update(self.get_tax_context(cursor, user, vals,
+                context=context))
+            for line in vals['lines']:
+                if line.get('type', 'line') != 'line':
+                    continue
+                res['untaxed_amount'] += line.get('amount', Decimal('0.0'))
+
+                for tax in tax_obj.compute(cursor, user, line.get('taxes', []),
+                        line.get('unit_price', Decimal('0.0')),
+                        line.get('quantity', 0.0), context=context):
+                    res['tax_amount'] += tax['amount']
+        if currency:
+            res['untaxed_amount'] = currency_obj.round(cursor, user, currency,
+                    res['untaxed_amount'])
+            res['tax_amount'] = currency_obj.round(cursor, user, currency,
+                    res['tax_amount'])
+        res['total_amount'] = res['untaxed_amount'] + res['tax_amount']
+        if currency:
+            res['total_amount'] = currency_obj.round(cursor, user, currency,
+                    res['total_amount'])
+        return res
+
+    def get_function_fields(self, cursor, user, ids, names, args, context=None):
+        '''
+        Function to compute function fields for sale ids
+
+        :param cursor: the database cursor
+        :param user: the user id
+        :param ids: the ids of the sales
+        :param names: the list of field name to compute
+        :param args: optional argument
+        :param context: the context
+        :return: a dictionary with all field names as key and
+            a dictionary as value with id as key
+        '''
+        res = {}
+        sales = self.browse(cursor, user, ids, context=context)
+        if 'currency_digits' in names:
+            res['currency_digits'] = self.get_currency_digits(cursor, user,
+                    sales, context=context)
+        if 'party_lang' in names:
+            res['party_lang'] = self.get_party_lang(cursor, user, sales,
+                    context=context)
+        if 'untaxed_amount' in names:
+            res['untaxed_amount'] = self.get_untaxed_amount(cursor, user,
+                    sales, context=context)
+        if 'tax_amount' in names:
+            res['tax_amount'] = self.get_tax_amount(cursor, user, sales,
+                    context=context)
+        if 'total_amount' in names:
+            res['total_amount'] = self.get_total_amount(cursor, user, sales,
+                    context=context)
+        if 'invoice_paid' in names:
+            res['invoice_paid'] = self.get_invoice_paid(cursor, user, sales,
+                    context=context)
+        if 'invoice_exception' in names:
+            res['invoice_exception'] = self.get_invoice_exception(cursor, user,
+                    sales, context=context)
+        if 'packings' in names:
+            res['packings'] = self.get_packings(cursor, user, sales,
+                    context=context)
+        if 'moves' in names:
+            res['moves'] = self.get_moves(cursor, user, sales, context=context)
+        if 'packing_done' in names:
+            res['packing_done'] = self.get_packing_done(cursor, user, sales,
+                    context=context)
+        if 'packing_exception' in names:
+            res['packing_exception'] = self.get_packing_exception(cursor, user,
+                    sales, context=context)
+        return res
+
+    def get_untaxed_amount(self, cursor, user, sales, context=None):
+        '''
+        Compute the untaxed amount for each sales
+
+        :param cursor: the database cursor
+        :param user: the user id
+        :param sales: a BrowseRecordList of sales
+        :param context: the context
+        :return: a dictionary with sale id as key and
+            untaxed amount as value
+        '''
+        currency_obj = self.pool.get('currency.currency')
+        res = {}
+        for sale in sales:
+            res.setdefault(sale.id, Decimal('0.0'))
+            for line in sale.lines:
+                if line.type != 'line':
+                    continue
+                res[sale.id] += line.amount
+            res[sale.id] = currency_obj.round(cursor, user, sale.currency,
+                    res[sale.id])
+        return res
+
+    def get_tax_amount(self, cursor, user, sales, context=None):
+        '''
+        Compute tax amount for each sales
+
+        :param cursor: the database cursor
+        :param user: the user id
+        :param sales: a BrowseRecordList of sales
+        :param context: the context
+        :return: a dictionary with sale id as key and
+            tax amount as value
+        '''
+        currency_obj = self.pool.get('currency.currency')
+        tax_obj = self.pool.get('account.tax')
+        if context is None:
+            context = {}
+        res = {}
+        for sale in sales:
+            ctx = context.copy()
+            ctx.update(self.get_tax_context(cursor, user, sale,
+                context=context))
+            res.setdefault(sale.id, Decimal('0.0'))
+            for line in sale.lines:
+                if line.type != 'line':
+                    continue
+                # Don't round on each line to handle rounding error
+                for tax in tax_obj.compute(cursor, user,
+                        [t.id for t in line.taxes], line.unit_price,
+                        line.quantity, context=ctx):
+                    res[sale.id] += tax['amount']
+            res[sale.id] = currency_obj.round(cursor, user, sale.currency,
+                    res[sale.id])
+        return res
+
+    def get_total_amount(self, cursor, user, sales, context=None):
+        '''
+        Return the total amount of each sales
+
+        :param cursor: the database cursor
+        :param user: the user id
+        :param sales: a BrowseRecordList of sales
+        :param context: the context
+        :return: a dictionary with sale id as key and
+            total amount as value
+        '''
+        currency_obj = self.pool.get('currency.currency')
+        res = {}
+        untaxed_amounts = self.get_untaxed_amount(cursor, user, sales,
+                context=context)
+        tax_amounts = self.get_tax_amount(cursor, user, sales,
+                context=context)
+        for sale in sales:
+            res[sale.id] = currency_obj.round(cursor, user, sale.currency,
+                    untaxed_amounts[sale.id] + tax_amounts[sale.id])
+        return res
+
+    def get_invoice_paid(self, cursor, user, sales, context=None):
+        '''
+        Return if all invoices have been paid for each sales
+
+        :param cursor: the database cursor
+        :param user: the user id
+        :param sales: a BrowseRecordList of sales
+        :param context: the context
+        :return: a dictionary with sale id as key and
+            a boolean as value
+        '''
+        res = {}
+        for sale in sales:
+            val = True
+            ignored_ids = [x.id for x in sale.invoices_ignored]
+            for invoice in sale.invoices:
+                if invoice.state != 'paid' \
+                        and invoice.id not in ignored_ids:
+                    val = False
+                    break
+            res[sale.id] = val
+        return res
+
+    def get_invoice_exception(self, cursor, user, sales, context=None):
+        '''
+        Return if there is an invoice exception for each sales
+
+        :param cursor: the database cursor
+        :param user: the user id
+        :param sales: a BrowseRecordList of sales
+        :param context: the context
+        :return: a dictionary with sale id as key and
+            a boolean as value
+        '''
+        res = {}
+        for sale in sales:
+            val = False
+            ignored_ids = [x.id for x in sale.invoices_ignored]
+            for invoice in sale.invoices:
+                if invoice.state == 'cancel' \
+                        and invoice.id not in ignored_ids:
+                    val = True
+                    break
+            res[sale.id] = val
+        return res
+
+    def get_packings(self, cursor, user, sales, context=None):
+        '''
+        Return packing_out ids for each sales
+
+        :param cursor: the database cursor
+        :param user: the user id
+        :param sales: a BrowseRecordList of sales
+        :param context: the context
+        :return: a dictionary with sale id as key and
+            a list of packing_out id as value
+        '''
+        res = {}
+        for sale in sales:
+            res[sale.id] = []
+            for line in sale.lines:
+                for move in line.moves:
+                    if move.packing_out:
+                        if move.packing_out.id not in res[sale.id]:
+                            res[sale.id].append(move.packing_out.id)
+        return res
+
+    def get_moves(self, cursor, user, sales, context=None):
+        '''
+        Return move ids for each sales
+
+        :param cursor: the database cursor
+        :param user: the user id
+        :param sales: a BrowseRecordList of sales
+        :param context: the context
+        :return: a dictionary with sale id as key and
+            a list of move ids as value
+        '''
+        res = {}
+        for sale in sales:
+            res[sale.id] = []
+            for line in sale.lines:
+                res[sale.id].extend([x.id for x in line.moves])
+        return res
+
+    def get_packing_done(self, cursor, user, sales, context=None):
+        '''
+        Return if all the packings have been done for each sales
+
+        :param cursor: the database cursor
+        :param user: the user id
+        :param sales: a BrowseRecordList of sales
+        :param context: the context
+        :return: a dictionary with sale id as key and
+            a boolean as value
+        '''
+        res = {}
+        for sale in sales:
+            val = True
+            for line in sale.lines:
+                if not line.move_done:
+                    val = False
+                    break
+            res[sale.id] = val
+        return res
+
+    def get_packing_exception(self, cursor, user, sales, context=None):
+        '''
+        Return if there is a packing exception for each sales
+
+        :param cursor: the database cursor
+        :param user: the user id
+        :param sales: a BrowseRecordList of sales
+        :param context: the context
+        :return: a dictionary with sale id as key and
+            a boolean as value
+        '''
+        res = {}
+        for sale in sales:
+            val = False
+            for line in sale.lines:
+                if line.move_exception:
+                    val = True
+                    break
+            res[sale.id] = val
+        return res
+
+    def check_method(self, cursor, user, ids):
+        '''
+        Check the methods.
+        '''
+        for sale in self.browse(cursor, user, ids):
+            if sale.invoice_method == 'packing' \
+                    and sale.packing_method in ('invoice', 'manual'):
+                return False
+            if sale.packing_method == 'invoice' \
+                    and sale.invoice_method in ('packing', 'manual'):
+                return False
+        return True
+
+    def name_get(self, cursor, user, ids, context=None):
+        if not ids:
+            return []
+        if isinstance(ids, (int, long)):
+            ids = [ids]
+        res = []
+        for sale in self.browse(cursor, user, ids, context=context):
+            res.append((sale.id, sale.reference or str(sale.id) \
+                    + ' ' + sale.party.name))
+        return res
+
+    def name_search(self, cursor, user, name='', args=None, operator='ilike',
+            context=None, limit=None):
+        if args is None:
+            args = []
+        if name:
+            ids = self.search(cursor, user,
+                    [('reference', operator, name)] + args, limit=limit,
+                    context=context)
+        if not ids:
+            ids = self.search(cursor, user, [('party', operator, name)] + args,
+                    limit=limit, context=context)
+        res = self.name_get(cursor, user, ids, context=context)
+        return res
+
+    def copy(self, cursor, user, sale_id, default=None, context=None):
+        if default is None:
+            default = {}
+        default = default.copy()
+        default['state'] = 'draft'
+        default['reference'] = False
+        default['invoice_state'] = 'none'
+        default['invoices'] = False
+        default['invoices_ignored'] = False
+        default['packing_state'] = 'none'
+        return super(Sale, self).copy(cursor, user, sale_id, default=default,
+                context=context)
+
+    def check_for_quotation(self, cursor, user, sale_id, context=None):
+        sale = self.browse(cursor, user, sale_id, context=context)
+        if not sale.invoice_address or not sale.packing_address:
+            self.raise_user_error(cursor, 'addresses_required', context=context)
+        return True
+
+    def set_reference(self, cursor, user, sale_id, context=None):
+        '''
+        Fill the reference field with the sale sequence
+
+        :param cursor: the database cursor
+        :param user: the user id
+        :param sale_id: the id of the sale
+        :param context: the context
+
+        :return: True if succeed
+        '''
+        sequence_obj = self.pool.get('ir.sequence')
+
+        sale = self.browse(cursor, user, sale_id, context=context)
+
+        if sale.reference:
+            return True
+
+        reference = sequence_obj.get(cursor, user, 'sale.sale')
+        self.write(cursor, user, sale_id, {
+            'reference': reference,
+            }, context=context)
+        return True
+
+    def _get_invoice_line_sale_line(self, cursor, user, sale, context=None):
+        '''
+        Return invoice line values for each sale lines
+
+        :param cursor: the database cursor
+        :param user: the user id
+        :param sale: the BrowseRecord of the sale
+        :param context: the context
+
+        :return: a dictionary with invoice line as key
+            and a list of invoice lines values as value
+        '''
+        line_obj = self.pool.get('sale.line')
+        res = {}
+        for line in sale.lines:
+            val = line_obj.get_invoice_line(cursor, user, line,
+                    context=context)
+            if val:
+                res[line.id] = val
+        return res
+
+    def create_invoice(self, cursor, user, sale_id, context=None):
+        '''
+        Create an invoice for the sale
+
+        :param cursor: the database cursor
+        :param user: the user id
+        :param sale_id: the sale id
+        :param context: the context
+
+        :return: the created invoice id or None
+        '''
+        invoice_obj = self.pool.get('account.invoice')
+        journal_obj = self.pool.get('account.journal')
+        invoice_line_obj = self.pool.get('account.invoice.line')
+        sale_line_obj = self.pool.get('sale.line')
+
+        if context is None:
+            context = {}
+
+        sale = self.browse(cursor, user, sale_id, context=context)
+
+        invoice_lines = self._get_invoice_line_sale_line(cursor, user, sale,
+                context=context)
+        if not invoice_lines:
+            return
+
+        journal_id = journal_obj.search(cursor, user, [
+            ('type', '=', 'revenue'),
+            ], limit=1, context=context)
+        if journal_id:
+            journal_id = journal_id[0]
+
+        ctx = context.copy()
+        ctx['user'] = user
+        invoice_id = invoice_obj.create(cursor, 0, {
+            'company': sale.company.id,
+            'type': 'out_invoice',
+            'reference': sale.reference,
+            'journal': journal_id,
+            'party': sale.party.id,
+            'invoice_address': sale.invoice_address.id,
+            'currency': sale.currency.id,
+            'account': sale.party.account_receivable.id,
+            'payment_term': sale.payment_term.id,
+        }, context=ctx)
+
+        for line_id in invoice_lines:
+            for vals in invoice_lines[line_id]:
+                vals['invoice'] = invoice_id
+                invoice_line_id = invoice_line_obj.create(cursor, 0, vals,
+                        context=ctx)
+                sale_line_obj.write(cursor, user, line_id, {
+                    'invoice_lines': [('add', invoice_line_id)],
+                    }, context=context)
+
+        invoice_obj.update_taxes(cursor, 0, [invoice_id], context=ctx)
+
+        self.write(cursor, user, sale_id, {
+            'invoices': [('add', invoice_id)],
+        }, context=context)
+        return invoice_id
+
+    def ignore_invoice_exception(self, cursor, user, sale_id, context=None):
+        sale = self.browse(cursor, user, sale_id, context=context)
+        invoice_ids = []
+        for invoice in sale.invoices:
+            if invoice.state == 'cancel':
+                invoice_ids.append(invoice.id)
+        if invoice_ids:
+            self.write(cursor, user, sale_id, {
+                'invoices_ignored': [('add', x) for x in invoice_ids],
+            }, context=context)
+
+    def _get_move_sale_line(self, cursor, user, sale, context=None):
+        '''
+        Return a dictionary of move values for each sale lines
+
+        :param cursor: the database cursor
+        :param user: the user id
+        :param sale: the BrowseRecord of the sale
+        :param context: the context
+
+        :return: a dictionary with move as key and move values as value
+        '''
+        line_obj = self.pool.get('sale.line')
+        res = {}
+        for line in sale.lines:
+            val = line_obj.get_move(cursor, user, line, context=context)
+            if val:
+                res[line.id] = val
+        return res
+
+    def create_packing(self, cursor, user, sale_id, context=None):
+        '''
+        Create a packing for the sale
+
+        :param cursor: the database cursor
+        :param user: the user id
+        :param sale_id: the sale id
+        :param context: the context
+
+        :return: the created packing id or None
+        '''
+        packing_obj = self.pool.get('stock.packing.out')
+        move_obj = self.pool.get('stock.move')
+        sale_line_obj = self.pool.get('sale.line')
+        workflow_service = LocalService('workflow')
+
+        if context is None:
+            context = {}
+
+        sale = self.browse(cursor, user, sale_id, context=context)
+
+        moves = self._get_move_sale_line(cursor, user, sale, context=context)
+        if not moves:
+            return
+
+        ctx = context.copy()
+        ctx['user'] = user
+        packing_id = packing_obj.create(cursor, 0, {
+            'planned_date': sale.sale_date,
+            'customer': sale.party.id,
+            'delivery_address': sale.packing_address.id,
+            'reference': sale.reference,
+            'warehouse': sale.warehouse.id,
+            'customer_location': sale.party.customer_location.id,
+        }, context=ctx)
+
+        for line_id in moves:
+            vals = moves[line_id]
+            vals['packing_out'] = packing_id
+            move_id = move_obj.create(cursor, 0, vals, context=ctx)
+            sale_line_obj.write(cursor, user, line_id, {
+                'moves': [('add', move_id)],
+                }, context=context)
+        workflow_service.trg_validate(0, 'stock.packing.out', packing_id,
+                'waiting', cursor, context=ctx)
+        return packing_id
+
+    def ignore_packing_exception(self, cursor, user, sale_id, context=None):
+        line_obj = self.pool.get('sale.line')
+
+        sale = self.browse(cursor, user, sale_id, context=context)
+        for line in sale.lines:
+            line_obj.ignore_move_exception(cursor, user, line, context=context)
+
+Sale()
+
+
+class SaleLine(OSV):
+    'Sale Line'
+    _name = 'sale.line'
+    _rec_name = 'description'
+    _description = __doc__
+
+    sale = fields.Many2One('sale.sale', 'Sale', ondelete='CASCADE', select=1)
+    sequence = fields.Integer('Sequence')
+    type = fields.Selection([
+        ('line', 'Line'),
+        ('subtotal', 'Subtotal'),
+        ('title', 'Title'),
+        ], 'Type', select=1, required=True)
+    quantity = fields.Float('Quantity',
+            digits="(16, unit_digits)",
+            states={
+                'invisible': "type != 'line'",
+                'required': "type == 'line'",
+            }, on_change=['product', 'quantity', 'unit',
+                '_parent_sale.currency', '_parent_sale.party'])
+    unit = fields.Many2One('product.uom', 'Unit',
+            states={
+                'required': "product",
+                'invisible': "type != 'line'",
+            }, domain="[('category', '=', " \
+                    "(product, 'product.default_uom.category'))]",
+            context="{'category': (product, 'product.default_uom.category')}",
+            on_change=['product', 'quantity', 'unit', '_parent_sale.currency',
+                '_parent_sale.party'])
+    unit_digits = fields.Function('get_unit_digits', type='integer',
+            string='Unit Digits', on_change_with=['unit'])
+    product = fields.Many2One('product.product', 'Product',
+            domain=[('salable', '=', True)],
+            states={
+                'invisible': "type != 'line'",
+            }, on_change=['product', 'unit', 'quantity', 'description',
+                '_parent_sale.party', '_parent_sale.currency'],
+            context="{'locations': [_parent_sale.warehouse], " \
+                    "'stock_date_end': _parent_sale.sale_date}")
+    unit_price = fields.Numeric('Unit Price', digits=(16, 4),
+            states={
+                'invisible': "type != 'line'",
+                'required': "type == 'line'",
+            })
+    amount = fields.Function('get_amount', type='numeric', string='Amount',
+            digits="(16, _parent_sale.currency_digits)",
+            states={
+                'invisible': "type not in ('line', 'subtotal')",
+            }, on_change_with=['type', 'quantity', 'unit_price',
+                '_parent_sale.currency'])
+    description = fields.Char('Description', size=None, required=True)
+    comment = fields.Text('Comment',
+            states={
+                'invisible': "type != 'line'",
+            })
+    taxes = fields.Many2Many('account.tax', 'sale_line_account_tax',
+            'line', 'tax', 'Taxes', domain=[('parent', '=', False)],
+            states={
+                'invisible': "type != 'line'",
+            })
+    invoice_lines = fields.Many2Many('account.invoice.line',
+            'sale_line_invoice_lines_rel', 'sale_line', 'invoice_line',
+            'Invoice Lines', readonly=True)
+    moves = fields.One2Many('stock.move', 'sale_line', 'Moves',
+            readonly=True, select=1)
+    moves_ignored = fields.Many2Many('stock.move', 'sale_line_moves_ignored_rel',
+            'sale_line', 'move', 'Moves Ignored', readonly=True)
+    move_done = fields.Function('get_move_done', type='boolean',
+            string='Moves Done')
+    move_exception = fields.Function('get_move_exception', type='boolean',
+            string='Moves Exception')
+
+    def __init__(self):
+        super(SaleLine, self).__init__()
+        self._order.insert(0, ('sequence', 'ASC'))
+        self._error_messages.update({
+            'missing_account_revenue': 'It miss ' \
+                    'an "account_revenue" default property!',
+            'customer_location_required': 'The customer location is required!',
+            })
+
+    def default_type(self, cursor, user, context=None):
+        return 'line'
+
+    def default_quantity(self, cursor, user, context=None):
+        return 0.0
+
+    def default_unit_price(self, cursor, user, context=None):
+        return Decimal('0.0')
+
+    def on_change_with_unit_digits(self, cursor, user, ids, vals,
+            context=None):
+        uom_obj = self.pool.get('product.uom')
+        if vals.get('unit'):
+            uom = uom_obj.browse(cursor, user, vals['unit'],
+                    context=context)
+            return uom.digits
+        return 2
+
+    def get_unit_digits(self, cursor, user, ids, name, arg, context=None):
+        res = {}
+        for line in self.browse(cursor, user, ids, context=context):
+            if line.unit:
+                res[line.id] = line.unit.digits
+            else:
+                res[line.id] = 2
+        return res
+
+    def get_move_done(self, cursor, user, ids, name, args, context=None):
+        uom_obj = self.pool.get('product.uom')
+        res = {}
+        for line in self.browse(cursor, user, ids, context=context):
+            val = True
+            if not line.product:
+                res[line.id] = True
+                continue
+            if line.product.type == 'service':
+                res[line.id] = True
+                continue
+            ignored_ids = [x.id for x in line.moves_ignored]
+            quantity = line.quantity
+            for move in line.moves:
+                if move.state != 'done' \
+                        and move.id not in ignored_ids:
+                    val = False
+                    break
+                quantity -= uom_obj.compute_qty(cursor, user, move.uom,
+                        move.quantity, line.unit, context=context)
+            if val:
+                if quantity > 0.0:
+                    val = False
+            res[line.id] = val
+        return res
+
+    def get_move_exception(self, cursor, user, ids, name, args, context=None):
+        res = {}
+        for line in self.browse(cursor, user, ids, context=context):
+            val = False
+            ignored_ids = [x.id for x in line.moves_ignored]
+            for move in line.moves:
+                if move.state == 'cancel' \
+                        and move.id not in ignored_ids:
+                    val = True
+                    break
+            res[line.id] = val
+        return res
+
+    def on_change_product(self, cursor, user, ids, vals, context=None):
+        party_obj = self.pool.get('party.party')
+        product_obj = self.pool.get('product.product')
+        uom_obj = self.pool.get('product.uom')
+
+        if context is None:
+            context = {}
+        if not vals.get('product'):
+            return {}
+        res = {}
+
+        ctx = context.copy()
+        party = None
+        if vals.get('_parent_sale.party'):
+            party = party_obj.browse(cursor, user, vals['_parent_sale.party'],
+                    context=context)
+            if party.lang:
+                ctx['language'] = party.lang.code
+
+        product = product_obj.browse(cursor, user, vals['product'],
+                context=context)
+
+        ctx2 = context.copy()
+        if vals.get('_parent_sale.currency'):
+            ctx2['currency'] = vals['_parent_sale.currency']
+        if vals.get('_parent_sale.party'):
+            ctx2['customer'] = vals['_parent_sale.party']
+        if vals.get('unit'):
+            ctx2['uom'] = vals['unit']
+        else:
+            ctx2['uom'] = product.sale_uom.id
+        res['unit_price'] = product_obj.get_sale_price(cursor, user,
+                [product.id], vals.get('quantity', 0), context=ctx2)[product.id]
+        res['taxes'] = []
+        for tax in product.customer_taxes_used:
+            if party:
+                if 'customer_' + tax.group.code in party_obj._columns \
+                        and party['customer_' + tax.group.code]:
+                    res['taxes'].append(
+                            party['customer_' + tax.group.code].id)
+                    continue
+            res['taxes'].append(tax.id)
+
+        if not vals.get('description'):
+            res['description'] = product_obj.name_get(cursor, user, product.id,
+                    context=ctx)[0][1]
+
+        category = product.sale_uom.category
+        if not vals.get('unit') \
+                or vals.get('unit') not in [x.id for x in category.uoms]:
+            res['unit'] = uom_obj.name_get(cursor, user, product.sale_uom.id,
+                    context=context)[0]
+            res['unit_digits'] = product.sale_uom.digits
+        return res
+
+    def on_change_quantity(self, cursor, user, ids, vals, context=None):
+        product_obj = self.pool.get('product.product')
+
+        if context is None:
+            context = {}
+        if not vals.get('product'):
+            return {}
+        res = {}
+
+        product = product_obj.browse(cursor, user, vals['product'],
+                context=context)
+
+        ctx2 = context.copy()
+        if vals.get('_parent_sale.currency'):
+            ctx2['currency'] = vals['_parent_sale.currency']
+        if vals.get('_parent_sale.party'):
+            ctx2['customer'] = vals['_parent_sale.party']
+        if vals.get('unit'):
+            ctx2['uom'] = vals['unit']
+        res['unit_price'] = product_obj.get_sale_price(cursor, user,
+                [vals['product']], vals.get('quantity', 0),
+                context=ctx2)[vals['product']]
+        return res
+
+    def on_change_unit(self, cursor, user, ids, vals, context=None):
+        return self.on_change_quantity(cursor, user, ids, vals, context=context)
+
+    def on_change_with_amount(self, cursor, user, ids, vals, context=None):
+        currency_obj = self.pool.get('currency.currency')
+        if vals.get('type') == 'line':
+            if isinstance(vals.get('_parent_sale.currency'), (int, long)):
+                currency = currency_obj.browse(cursor, user,
+                        vals['_parent_sale.currency'], context=context)
+            else:
+                currency = vals['_parent_sale.currency']
+            amount = Decimal(str(vals.get('quantity') or '0.0')) * \
+                    (vals.get('unit_price') or Decimal('0.0'))
+            if currency:
+                return currency_obj.round(cursor, user, currency, amount)
+            return amount
+        return Decimal('0.0')
+
+    def get_amount(self, cursor, user, ids, name, arg, context=None):
+        currency_obj = self.pool.get('currency.currency')
+        res = {}
+        for line in self.browse(cursor, user, ids, context=context):
+            if line.type == 'line':
+                res[line.id] = currency_obj.round(cursor, user,
+                        line.sale.currency,
+                        Decimal(str(line.quantity)) * line.unit_price)
+            elif line.type == 'subtotal':
+                res[line.id] = Decimal('0.0')
+                for line2 in line.sale.lines:
+                    if line2.type == 'line':
+                        res[line.id] += currency_obj.round(cursor, user,
+                                line2.sale.currency,
+                                Decimal(str(line2.quantity)) * line2.unit_price)
+                    elif line2.type == 'subtotal':
+                        if line.id == line2.id:
+                            break
+                        res[line.id] = Decimal('0.0')
+            else:
+                res[line.id] = Decimal('0.0')
+        return res
+
+    def get_invoice_line(self, cursor, user, line, context=None):
+        '''
+        Return invoice line values for sale line
+
+        :param cursor: the database cursor
+        :param user: the user id
+        :param line: the BrowseRecord of the line
+        :param context: the context
+
+        :return: a list of invoice line values
+        '''
+        uom_obj = self.pool.get('product.uom')
+        property_obj = self.pool.get('ir.property')
+
+        res = {}
+        res['sequence'] = line.sequence
+        res['type'] = line.type
+        res['description'] = line.description
+        if line.type != 'line':
+            return [res]
+        if line.sale.invoice_method == 'order':
+            res['quantity'] = line.quantity
+        else:
+            quantity = 0.0
+            for move in line.moves:
+                if move.state == 'done':
+                    quantity += uom_obj.compute_qty(cursor, user, move.uom,
+                            move.quantity, line.unit, context=context)
+            for invoice_line in line.invoice_lines:
+                quantity -= uom_obj.compute_qty(cursor, user,
+                        invoice_line.unit, invoice_line.quantity, line.unit,
+                        context=context)
+            res['quantity'] = quantity
+        if res['quantity'] <= 0.0:
+            return None
+        res['unit'] = line.unit.id
+        res['product'] = line.product.id
+        res['unit_price'] = line.unit_price
+        res['taxes'] = [('set', [x.id for x in line.taxes])]
+        if line.product:
+            res['account'] = line.product.account_revenue_used.id
+        else:
+            for model in ('product.template', 'product.category'):
+                res['account'] = property_obj.get(cursor, user,
+                        'account_revenue', model, context=context)
+                if res['account']:
+                    break
+            if not res['account']:
+                self.raise_user_error(cursor, 'missing_account_revenue',
+                        context=context)
+        return [res]
+
+    def copy(self, cursor, user, line_id, default=None, context=None):
+        if default is None:
+            default = {}
+        default = default.copy()
+        default['moves'] = False
+        default['moves_ignored'] = False
+        default['invoice_lines'] = False
+        return super(SaleLine, self).copy(cursor, user, line_id,
+                default=default, context=context)
+
+    def get_move(self, cursor, user, line, context=None):
+        '''
+        Return move values for the sale line
+
+        :param cursor: the database cursor
+        :param user: the user id
+        :param line: the BrowseRecord of the line
+        :param context: the context
+
+        :return: a dictionary of values of move
+        '''
+        uom_obj = self.pool.get('product.uom')
+
+        res = {}
+        if line.type != 'line':
+            return
+        if not line.product:
+            return
+        if line.product.type == 'service':
+            return
+        quantity = line.quantity
+        for move in line.moves:
+            quantity -= uom_obj.compute_qty(cursor, user, move.uom,
+                    move.quantity, line.unit, context=context)
+        if quantity <= 0.0:
+            return
+        if not line.sale.party.customer_location:
+            self.raise_user_error(cursor, 'customer_location_required',
+                    context=context)
+        res['quantity'] = quantity
+        res['uom'] = line.unit.id
+        res['product'] = line.product.id
+        res['from_location'] = line.sale.warehouse.output_location.id
+        res['to_location'] = line.sale.party.customer_location.id
+        res['state'] = 'draft'
+        res['company'] = line.sale.company.id
+        res['unit_price'] = line.unit_price
+        res['currency'] = line.sale.currency.id
+        res['planned_date'] = line.sale.sale_date
+        return res
+
+    def ignore_move_exception(self, cursor, user, line, context=None):
+        move_ids = []
+        for move in line.moves:
+            if move.state == 'cancel':
+                move_ids.append(move.id)
+        if move_ids:
+            self.write(cursor, user, line.id, {
+                'moves_ignored': [('add', x) for x in move_ids],
+            }, context=context)
+
+SaleLine()
+
+
+class SaleReport(CompanyReport):
+    _name = 'sale.sale'
+
+SaleReport()
+
+
+class Template(OSV):
+    _name = 'product.template'
+
+    salable = fields.Boolean('Salable', states={
+        'readonly': "active == False",
+        })
+    sale_uom = fields.Many2One('product.uom', 'Sale UOM', states={
+        'readonly': "active == False",
+        'invisible': "not salable",
+        'required': "salable",
+        }, domain="[('category', '=', " \
+                "(default_uom, 'uom.category'))]",
+        context="{'category': (default_uom, 'uom.category')}",
+        on_change_with=['default_uom', 'sale_uom'])
+
+    def default_salable(self, cursor, user, context=None):
+        return False
+
+    def on_change_with_sale_uom(self, cursor, user, ids, vals, context=None):
+        uom_obj = self.pool.get('product.uom')
+        res = False
+
+        if vals.get('default_uom'):
+            default_uom = uom_obj.browse(cursor, user, vals['default_uom'],
+                    context=context)
+            if vals.get('sale_uom'):
+                sale_uom = uom_obj.browse(cursor, user, vals['sale_uom'],
+                        context=context)
+                if default_uom.category.id == sale_uom.category.id:
+                    res = sale_uom.id
+                else:
+                    res = default_uom.id
+            else:
+                res = default_uom.id
+        if res:
+            res = uom_obj.name_get(cursor, user, res, context=context)[0]
+        return res
+
+Template()
+
+
+class Product(OSV):
+    _name = 'product.product'
+
+    def on_change_with_sale_uom(self, cursor, user, ids, vals, context=None):
+        template_obj = self.pool.get('product.template')
+        return template_obj.on_change_with_sale_uom(cursor, user, ids, vals,
+                context=context)
+
+    def get_sale_price(self, cursor, user, ids, quantity=0, context=None):
+        '''
+        Return the sale price for product ids.
+
+        :param cursor: the database cursor
+        :param user: the user id
+        :param ids: the product ids
+        :param quantity: the quantity of the products
+        :param context: the context that can have as keys:
+            uom: the unit of measure
+            currency: the currency id for the returned price
+        :return: a dictionary with for each product ids keys the computed price
+        '''
+        uom_obj = self.pool.get('product.uom')
+        user_obj = self.pool.get('res.user')
+        currency_obj = self.pool.get('currency.currency')
+
+        if context is None:
+            context = {}
+
+        res = {}
+
+        uom = None
+        if context.get('uom'):
+            uom = uom_obj.browse(cursor, user, context['uom'],
+                    context=context)
+
+        currency = None
+        if context.get('currency'):
+            currency = currency_obj.browse(cursor, user, context['currency'],
+                    context=context)
+
+        user2 = user_obj.browse(cursor, user, user, context=context)
+
+        for product in self.browse(cursor, user, ids, context=context):
+            res[product.id] = product.list_price
+            if uom:
+                res[product.id] = uom_obj.compute_price(cursor, user,
+                        product.default_uom, res[product.id], uom,
+                        context=context)
+            if currency:
+                if user2.company.currency.id != currency.id:
+                    res[product.id] = currency_obj.compute(cursor, user,
+                            user2.company.currency, res[product.id],
+                            currency, context=context)
+        return res
+
+Product()
+
+
+class PackingOut(OSV):
+    _name = 'stock.packing.out'
+
+    def write(self, cursor, user, ids, vals, context=None):
+        workflow_service = LocalService('workflow')
+        sale_line_obj = self.pool.get('sale.line')
+
+        res = super(PackingOut, self).write(cursor, user, ids, vals,
+                context=context)
+
+        if 'state' in vals and vals['state'] in ('done', 'cancel'):
+            sale_ids = []
+            move_ids = []
+            if isinstance(ids, (int, long)):
+                ids = [ids]
+            for packing in self.browse(cursor, user, ids, context=context):
+                move_ids.extend([x.id for x in packing.outgoing_moves])
+
+            sale_line_ids = sale_line_obj.search(cursor, user, [
+                ('moves', 'in', move_ids),
+                ], context=context)
+            if sale_line_ids:
+                for sale_line in sale_line_obj.browse(cursor, user,
+                        sale_line_ids, context=context):
+                    if sale_line.sale.id not in sale_ids:
+                        sale_ids.append(sale_line.sale.id)
+
+            for sale_id in sale_ids:
+                workflow_service.trg_validate(user, 'sale.sale', sale_id,
+                        'packing_update', cursor, context=context)
+        return res
+
+PackingOut()
+
+
+class Move(OSV):
+    _name = 'stock.move'
+
+    sale_line = fields.Many2One('sale.line', select=1,
+            states={
+                'readonly': "state != 'draft'",
+            })
+    sale = fields.Function('get_sale', type='many2one',
+            relation='sale.sale', string='Sale',
+            fnct_search='search_sale', select=1)
+
+    def get_sale(self, cursor, user, ids, name, arg, context=None):
+        sale_obj = self.pool.get('sale.sale')
+
+        res = {}
+        for move in self.browse(cursor, user, ids, context=context):
+            res[move.id] = False
+            if move.sale_line:
+                res[move.id] = move.sale_line.sale.id
+
+        sale_names = {}
+        for sale_id , sale_name in sale_obj.name_get(cursor, user,
+                [x for x in res.values() if x], context=context):
+            sale_names[sale_id] = sale_name
+
+        for i in res.keys():
+            if res[i] and res[i] in sale_names:
+                res[i] = (res[i], sale_names[res[i]])
+            else:
+                res[i] = False
+        return res
+
+    def search_sale(self, cursor, user, name, args, context=None):
+        args2 = []
+        i = 0
+        while i < len(args):
+            field = args[i][0]
+            args2.append(('sale_line.' + field, args[i][1], args[i][2]))
+            i += 1
+        return args2
+
+    def write(self, cursor, user, ids, vals, context=None):
+        workflow_service = LocalService('workflow')
+        sale_line_obj = self.pool.get('sale.line')
+
+        res = super(Move, self).write(cursor, user, ids, vals,
+                context=context)
+        if 'state' in vals and vals['state'] in ('cancel',):
+            sale_ids = []
+            sale_line_ids = sale_line_obj.search(cursor, user, [
+                ('moves', 'in', ids),
+                ], context=context)
+            if sale_line_ids:
+                for sale_line in sale_line_obj.browse(cursor, user,
+                        sale_line_ids, context=context):
+                    if sale_line.sale.id not in sale_ids:
+                        sale_ids.append(sale_line.sale.id)
+            for sale_id in sale_ids:
+                workflow_service.trg_validate(user, 'sale.sale',
+                        sale_id, 'packing_update', cursor, context=context)
+        return res
+
+Move()
+
+
+class Invoice(OSV):
+    _name = 'account.invoice'
+
+    def __init__(self):
+        super(Invoice, self).__init__()
+        self._error_messages.update({
+            'delete_sale_invoice': 'You can not delete invoices ' \
+                    'that comes from a sale!',
+            })
+
+    def delete(self, cursor, user, ids, context=None):
+        if not ids:
+            return True
+        if isinstance(ids, (int, long)):
+            ids = [ids]
+        cursor.execute('SELECT id FROM sale_invoices_rel ' \
+                'WHERE invoice IN (' + ','.join(['%s' for x in ids]) + ')',
+                ids)
+        if cursor.rowcount:
+            self.raise_user_error(cursor, 'delete_sale_invoice',
+                    context=context)
+        return super(Invoice, self).delete(cursor, user, ids,
+                context=context)
+
+Invoice()
diff --git a/sale.xml b/sale.xml
new file mode 100644
index 0000000..af6ac31
--- /dev/null
+++ b/sale.xml
@@ -0,0 +1,784 @@
+<?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. -->
+<tryton>
+    <data>
+        <menuitem name="Sale Management" id="menu_sale" sequence="5"/>
+        <record model="res.group" id="group_sale">
+            <field name="name">Sale</field>
+        </record>
+        <record model="res.user" id="res.user_admin">
+            <field name="groups" eval="[('add', ref('group_sale'))]"/>
+        </record>
+
+        <record model="ir.ui.view" id="sale_view_form">
+            <field name="model">sale.sale</field>
+            <field name="type">form</field>
+            <field name="arch" type="xml">
+                <![CDATA[
+                <form string="Sale" col="6">
+                    <label name="party"/>
+                    <field name="party"/>
+                    <label name="invoice_address"/>
+                    <field name="invoice_address"/>
+                    <label name="packing_address"/>
+                    <field name="packing_address"/>
+                    <label name="description"/>
+                    <field name="description" colspan="3"/>
+                    <label name="reference"/>
+                    <field name="reference"/>
+                    <notebook colspan="6">
+                        <page string="Sale">
+                            <label name="sale_date"/>
+                            <field name="sale_date"/>
+                            <label name="payment_term"/>
+                            <field name="payment_term"/>
+                            <label name="warehouse"/>
+                            <field name="warehouse"/>
+                            <label name="currency"/>
+                            <field name="currency"/>
+                            <field name="lines" colspan="4">
+                                <tree string="Lines" sequence="sequence" fill="1">
+                                    <field name="type"/>
+                                    <field name="product"/>
+                                    <field name="description"/>
+                                    <field name="quantity"/>
+                                    <field name="unit"/>
+                                    <field name="unit_price"/>
+                                    <field name="taxes"/>
+                                    <field name="amount"/>
+                                    <field name="sequence" tree_invisible="1"/>
+                                    <field name="unit_digits" tree_invisible="1"/>
+                                </tree>
+                            </field>
+                            <group col="2" colspan="2">
+                                <label name="invoice_state"/>
+                                <field name="invoice_state"/>
+                                <label name="packing_state"/>
+                                <field name="packing_state"/>
+                            </group>
+                            <group col="2" colspan="2">
+                                <label name="untaxed_amount"/>
+                                <field name="untaxed_amount"/>
+                                <label name="tax_amount"/>
+                                <field name="tax_amount"/>
+                                <label name="total_amount"/>
+                                <field name="total_amount"/>
+                                <label name="state"/>
+                                <field name="state"/>
+                                <group col="6" colspan="2">
+                                    <button name="cancel" string="Cancel"
+                                        states="{'invisible': '''not ((state in ('draft', 'quotation')) or (invoice_state == 'exception') or (packing_state == 'exception')) ''', 'readonly': '''%(group_sale)d not in groups'''}"
+                                        icon="tryton-cancel"/>
+                                    <button name="draft" string="Draft"
+                                        states="{'invisible': '''state != 'quotation' ''', 'readonly': '''%(group_sale)d not in groups'''}"
+                                        icon="tryton-clear"/>
+                                    <button name="quotation" string="Quotation"
+                                        states="{'invisible': '''state != 'draft' ''', 'readonly': '''%(group_sale)d not in groups'''}"
+                                        icon="tryton-go-next"/>
+                                    <button name="invoice_ok" string="Ignore Invoice Exception"
+                                        states="{'invisible': '''invoice_state != 'exception' or state == 'cancel' ''', 'readonly': '''%(group_sale)d not in groups'''}"
+                                        icon="tryton-go-next"/>
+                                    <button name="packing_ok" string="Ignore Packing Exception"
+                                        states="{'invisible': '''packing_state != 'exception' or state == 'cancel' ''', 'readonly': '''%(group_sale)d not in groups'''}"
+                                        icon="tryton-go-next"/>
+                                    <button name="confirm" string="Confirm"
+                                        states="{'invisible': '''state != 'quotation' ''', 'readonly': '''%(group_sale)d not in groups'''}"
+                                        icon="tryton-go-next"/>
+                                </group>
+                            </group>
+                        </page>
+                        <page string="Other Info">
+                            <label name="company"/>
+                            <field name="company"/>
+                            <newline/>
+                            <label name="invoice_method"/>
+                            <field name="invoice_method"/>
+                            <label name="packing_method"/>
+                            <field name="packing_method"/>
+                            <separator name="comment" colspan="4"/>
+                            <field name="comment" colspan="4" spell="party_lang"/>
+                        </page>
+                        <page string="Invoices">
+                            <field name="invoices" colspan="4" widget="one2many"/>
+                        </page>
+                        <page string="Packings">
+                            <field name="packings" colspan="4" widget="one2many"/>
+                            <field name="moves" colspan="4" widget="one2many"/>
+                        </page>
+                    </notebook>
+                    <field name="currency_digits" invisible="1" colspan="6"/>
+                    <field name="party_lang" invisible="1" colspan="6"/>
+                </form>
+                ]]>
+            </field>
+        </record>
+        <record model="ir.ui.view" id="sale_view_tree">
+            <field name="model">sale.sale</field>
+            <field name="type">tree</field>
+            <field name="arch" type="xml">
+                <![CDATA[
+                <tree string="Sales">
+                    <field name="reference" select="1"/>
+                    <field name="sale_date" select="1"/>
+                    <field name="party" select="1"/>
+                    <field name="warehouse"/>
+                    <field name="currency" select="2"/>
+                    <field name="untaxed_amount" select="2"/>
+                    <field name="total_amount" select="2"/>
+                    <field name="state" select="2"/>
+                    <field name="invoice_state" select="2"/>
+                    <field name="packing_state" select="2"/>
+                    <field name="description" select="2"/>
+                    <field name="currency_digits" tree_invisible="1"/>
+                </tree>
+                ]]>
+            </field>
+        </record>
+
+        <record model="ir.action.act_window" id="act_sale_form">
+            <field name="name">Sales</field>
+            <field name="res_model">sale.sale</field>
+            <field name="view_type">form</field>
+        </record>
+        <record model="ir.action.act_window.view" id="act_sale_form_view1">
+            <field name="sequence" eval="10"/>
+            <field name="view" ref="sale_view_tree"/>
+            <field name="act_window" ref="act_sale_form"/>
+        </record>
+        <record model="ir.action.act_window.view" id="act_sale_form_view2">
+            <field name="sequence" eval="20"/>
+            <field name="view" ref="sale_view_form"/>
+            <field name="act_window" ref="act_sale_form"/>
+        </record>
+        <menuitem parent="menu_sale" action="act_sale_form"
+            id="menu_sale_form"/>
+
+        <record model="ir.action.act_window" id="act_sale_form_draft">
+            <field name="name">Draft Sales</field>
+            <field name="res_model">sale.sale</field>
+            <field name="view_type">form</field>
+            <field name="domain">[('state', '=', 'draft')]</field>
+        </record>
+        <record model="ir.action.act_window.view" id="act_sale_form_draft_view1">
+            <field name="sequence" eval="10"/>
+            <field name="view" ref="sale_view_tree"/>
+            <field name="act_window" ref="act_sale_form_draft"/>
+        </record>
+        <record model="ir.action.act_window.view" id="act_sale_form_draft_view2">
+            <field name="sequence" eval="20"/>
+            <field name="view" ref="sale_view_form"/>
+            <field name="act_window" ref="act_sale_form_draft"/>
+        </record>
+        <menuitem parent="menu_sale_form" action="act_sale_form_draft"
+            id="menu_sale_form_draft"/>
+
+        <record model="ir.action.act_window" id="act_sale_form_quotation">
+            <field name="name">Quotation Sales</field>
+            <field name="res_model">sale.sale</field>
+            <field name="view_type">form</field>
+            <field name="domain">[('state', '=', 'quotation')]</field>
+        </record>
+        <record model="ir.action.act_window.view" id="act_sale_form_quotation_view1">
+            <field name="sequence" eval="10"/>
+            <field name="view" ref="sale_view_tree"/>
+            <field name="act_window" ref="act_sale_form_quotation"/>
+        </record>
+        <record model="ir.action.act_window.view" id="act_sale_form_quotation_view2">
+            <field name="sequence" eval="20"/>
+            <field name="view" ref="sale_view_form"/>
+            <field name="act_window" ref="act_sale_form_quotation"/>
+        </record>
+        <menuitem parent="menu_sale_form" action="act_sale_form_quotation"
+            id="menu_sale_form_quotation"/>
+
+        <record model="ir.action.act_window" id="act_sale_form_confirmed">
+            <field name="name">Confirmed Sales</field>
+            <field name="res_model">sale.sale</field>
+            <field name="view_type">form</field>
+            <field name="domain">[('state', '=', 'confirmed')]</field>
+        </record>
+        <record model="ir.action.act_window.view" id="act_sale_form_confirmed_view1">
+            <field name="sequence" eval="10"/>
+            <field name="view" ref="sale_view_tree"/>
+            <field name="act_window" ref="act_sale_form_confirmed"/>
+        </record>
+        <record model="ir.action.act_window.view" id="act_sale_form_confirmed_view2">
+            <field name="sequence" eval="20"/>
+            <field name="view" ref="sale_view_form"/>
+            <field name="act_window" ref="act_sale_form_confirmed"/>
+        </record>
+        <menuitem parent="menu_sale_form" action="act_sale_form_confirmed"
+            id="menu_sale_form_confirmed"/>
+
+        <record model="ir.model.access" id="access_sale">
+            <field name="model" search="[('model', '=', 'sale.sale')]"/>
+            <field name="perm_read" eval="True"/>
+            <field name="perm_write" eval="False"/>
+            <field name="perm_create" eval="False"/>
+            <field name="perm_delete" eval="False"/>
+        </record>
+        <record model="ir.model.access" id="access_sale_sale">
+            <field name="model" search="[('model', '=', 'sale.sale')]"/>
+            <field name="group" ref="group_sale"/>
+            <field name="perm_read" eval="True"/>
+            <field name="perm_write" eval="True"/>
+            <field name="perm_create" eval="True"/>
+            <field name="perm_delete" eval="True"/>
+        </record>
+
+        <record model="ir.sequence.type" id="sequence_type_sale">
+            <field name="name">Sale</field>
+            <field name="code">sale.sale</field>
+        </record>
+        <record model="ir.sequence" id="sequence_sale">
+            <field name="name">Sale</field>
+            <field name="code">sale.sale</field>
+        </record>
+
+        <record model="workflow" id="sale_workflow">
+            <field name="name">Sale workflow</field>
+            <field name="osv">sale.sale</field>
+            <field name="on_create" eval="True"/>
+        </record>
+        <record model="workflow.activity" id="sale_activity_draft">
+            <field name="name">Draft</field>
+            <field name="workflow" ref="sale_workflow"/>
+            <field name="kind">function</field>
+            <field name="action">write({'state': 'draft'})</field>
+            <field name="flow_start" eval="True"/>
+        </record>
+        <record model="workflow.activity" id="sale_activity_quotation">
+            <field name="name">Quotation</field>
+            <field name="workflow" ref="sale_workflow"/>
+            <field name="kind">function</field>
+            <field name="action">check_for_quotation()
set_reference()
write({'state': 'quotation'})</field>
+        </record>
+        <record model="workflow.activity" id="sale_activity_confirmed">
+            <field name="name">Confirmed</field>
+            <field name="workflow" ref="sale_workflow"/>
+            <field name="split_mode">AND</field>
+            <field name="kind">function</field>
+            <field name="action">write({'state': 'confirmed'})</field>
+        </record>
+        <record model="workflow.activity" id="sale_activity_invoice_method">
+            <field name="name">Invoice Method</field>
+            <field name="workflow" ref="sale_workflow"/>
+            <field name="split_mode">OR</field>
+        </record>
+        <record model="workflow.activity" id="sale_activity_invoice_sale">
+            <field name="name">Invoice</field>
+            <field name="workflow" ref="sale_workflow"/>
+            <field name="kind">function</field>
+            <field name="action">create_invoice()
write({'invoice_state': 'waiting'})</field>
+        </record>
+        <record model="workflow.activity" id="sale_activity_waiting_invoice_sale">
+            <field name="name">Waiting Invoice</field>
+            <field name="workflow" ref="sale_workflow"/>
+            <field name="kind">function</field>
+            <field name="action">write({'invoice_state': 'waiting'})
ignore_invoice_exception()</field>
+        </record>
+        <record model="workflow.activity" id="sale_activity_invoice_sale_exception">
+            <field name="name">Invoice Exception</field>
+            <field name="workflow" ref="sale_workflow"/>
+            <field name="kind">function</field>
+            <field name="action">write({'invoice_state': 'exception'})</field>
+        </record>
+        <record model="workflow.activity" id="sale_activity_invoice_sale_done">
+            <field name="name">Invoice Done</field>
+            <field name="workflow" ref="sale_workflow"/>
+            <field name="kind">function</field>
+            <field name="action">write({'invoice_state': 'paid'})</field>
+        </record>
+        <record model="workflow.activity" id="sale_activity_packing_invoice_method">
+            <field name="name">Packing Invoice Method</field>
+            <field name="workflow" ref="sale_workflow"/>
+            <field name="split_mode">OR</field>
+        </record>
+        <record model="workflow.activity" id="sale_activity_packing_invoice">
+            <field name="name">Packing Invoice</field>
+            <field name="workflow" ref="sale_workflow"/>
+            <field name="kind">function</field>
+            <field name="action">create_packing()</field>
+        </record>
+        <record model="workflow.activity" id="sale_activity_waiting_packing_invoice">
+            <field name="name">Waiting Packing Invoice</field>
+            <field name="workflow" ref="sale_workflow"/>
+            <field name="kind">function</field>
+            <field name="action">write({'packing_state': 'waiting'})
ignore_packing_exception
create_packing()</field>
+        </record>
+        <record model="workflow.activity" id="sale_activity_packing_invoice_exception">
+            <field name="name">Packing Invoice Exception</field>
+            <field name="workflow" ref="sale_workflow"/>
+            <field name="kind">function</field>
+            <field name="action">write({'packing_state': 'exception'})</field>
+        </record>
+        <record model="workflow.activity" id="sale_activity_packing_invoice_done">
+            <field name="name">Packing Invoice Done</field>
+            <field name="workflow" ref="sale_workflow"/>
+            <field name="kind">function</field>
+            <field name="action">write({'packing_state': 'sent'})</field>
+        </record>
+        <record model="workflow.activity" id="sale_activity_packing_invoice_method_done">
+            <field name="name">Packing Invoice Method Done</field>
+            <field name="workflow" ref="sale_workflow"/>
+        </record>
+        <record model="workflow.activity" id="sale_activity_invoice_method_done">
+            <field name="name">Invoice Method Done</field>
+            <field name="workflow" ref="sale_workflow"/>
+        </record>
+        <record model="workflow.activity" id="sale_activity_packing_method">
+            <field name="name">Packing Method</field>
+            <field name="workflow" ref="sale_workflow"/>
+        </record>
+        <record model="workflow.activity" id="sale_activity_packing">
+            <field name="name">Packing</field>
+            <field name="workflow" ref="sale_workflow"/>
+            <field name="kind">function</field>
+            <field name="action">create_packing()</field>
+        </record>
+        <record model="workflow.activity" id="sale_activity_waiting_packing">
+            <field name="name">Waiting Packing</field>
+            <field name="workflow" ref="sale_workflow"/>
+            <field name="kind">function</field>
+            <field name="action">write({'packing_state': 'waiting'})
ignore_packing_exception()
create_packing()</field>
+        </record>
+        <record model="workflow.activity" id="sale_activity_packing_exception">
+            <field name="name">Packing Exception</field>
+            <field name="workflow" ref="sale_workflow"/>
+            <field name="kind">function</field>
+            <field name="action">write({'packing_state': 'exception'})</field>
+        </record>
+        <record model="workflow.activity" id="sale_activity_invoice_packing_method">
+            <field name="name">Invoice Packing Method</field>
+            <field name="workflow" ref="sale_workflow"/>
+            <field name="split_mode">OR</field>
+        </record>
+        <record model="workflow.activity" id="sale_activity_invoice_packing">
+            <field name="name">Invoice Packing</field>
+            <field name="workflow" ref="sale_workflow"/>
+            <field name="kind">function</field>
+            <field name="action">create_invoice()
write({'invoice_state': 'waiting'})</field>
+        </record>
+        <record model="workflow.activity" id="sale_activity_waiting_invoice_packing">
+            <field name="name">Waiting Invoice Packing</field>
+            <field name="workflow" ref="sale_workflow"/>
+            <field name="kind">function</field>
+            <field name="action">write({'invoice_state': 'waiting', 'packing_state': 'sent'})
ignore_invoice_exception()</field>
+        </record>
+        <record model="workflow.activity" id="sale_activity_invoice_packing_exception">
+            <field name="name">Invoice Packing Exception</field>
+            <field name="workflow" ref="sale_workflow"/>
+            <field name="kind">function</field>
+            <field name="action">write({'invoice_state': 'exception'})</field>
+        </record>
+        <record model="workflow.activity" id="sale_activity_invoice_packing_done">
+            <field name="name">Invoice Packing Done</field>
+            <field name="workflow" ref="sale_workflow"/>
+            <field name="kind">function</field>
+            <field name="action">write({'invoice_state': 'paid'})</field>
+        </record>
+        <record model="workflow.activity" id="sale_activity_invoice_packing_method_done">
+            <field name="name">Invoice Packing Method Done</field>
+            <field name="workflow" ref="sale_workflow"/>
+            <field name="kind">function</field>
+            <field name="action">write({'packing_state': 'sent'})</field>
+        </record>
+        <record model="workflow.activity" id="sale_activity_packing_method_done">
+            <field name="name">Packing Method Done</field>
+            <field name="workflow" ref="sale_workflow"/>
+        </record>
+        <record model="workflow.activity" id="sale_activity_done">
+            <field name="name">Done</field>
+            <field name="workflow" ref="sale_workflow"/>
+            <field name="join_mode">AND</field>
+            <field name="kind">function</field>
+            <field name="action">write({'state': 'done'})</field>
+            <field name="flow_stop" eval="True"/>
+        </record>
+        <record model="workflow.activity" id="sale_activity_cancel">
+            <field name="name">Cancel</field>
+            <field name="workflow" ref="sale_workflow"/>
+            <field name="kind">function</field>
+            <field name="action">write({'state': 'cancel'})</field>
+            <field name="flow_stop" eval="True"/>
+        </record>
+
+        <record model="workflow.transition" id="sale_transition_draft_quotation">
+            <field name="act_from" ref="sale_activity_draft"/>
+            <field name="act_to" ref="sale_activity_quotation"/>
+            <field name="signal">quotation</field>
+            <field name="group" ref="group_sale"/>
+        </record>
+        <record model="workflow.transition" id="sale_transition_draft_cancel">
+            <field name="act_from" ref="sale_activity_draft"/>
+            <field name="act_to" ref="sale_activity_cancel"/>
+            <field name="signal">cancel</field>
+            <field name="group" ref="group_sale"/>
+        </record>
+        <record model="workflow.transition" id="sale_transition_quotation_draft">
+            <field name="act_from" ref="sale_activity_quotation"/>
+            <field name="act_to" ref="sale_activity_draft"/>
+            <field name="signal">draft</field>
+            <field name="group" ref="group_sale"/>
+        </record>
+        <record model="workflow.transition" id="sale_transition_quotation_confirmed">
+            <field name="act_from" ref="sale_activity_quotation"/>
+            <field name="act_to" ref="sale_activity_confirmed"/>
+            <field name="signal">confirm</field>
+            <field name="group" ref="group_sale"/>
+        </record>
+        <record model="workflow.transition" id="sale_transition_quotation_cancel">
+            <field name="act_from" ref="sale_activity_quotation"/>
+            <field name="act_to" ref="sale_activity_cancel"/>
+            <field name="signal">cancel</field>
+            <field name="group" ref="group_sale"/>
+        </record>
+        <record model="workflow.transition" id="sale_transition_confirmed_invoice_method">
+            <field name="act_from" ref="sale_activity_confirmed"/>
+            <field name="act_to" ref="sale_activity_invoice_method"/>
+        </record>
+
+        <record model="workflow.transition" id="sale_transition_invoice_method_invoice_sale">
+            <field name="act_from" ref="sale_activity_invoice_method"/>
+            <field name="act_to" ref="sale_activity_invoice_sale"/>
+            <field name="condition">invoice_method == 'order'</field>
+        </record>
+        <record model="workflow.transition" id="sale_transition_invoice_method_invoice_method_done">
+            <field name="act_from" ref="sale_activity_invoice_method"/>
+            <field name="act_to" ref="sale_activity_invoice_method_done"/>
+            <field name="condition">invoice_method != 'order'</field>
+        </record>
+        <record model="workflow.transition" id="sale_transition_invoice_sale_waiting_invoice_sale">
+            <field name="act_from" ref="sale_activity_invoice_sale"/>
+            <field name="act_to" ref="sale_activity_waiting_invoice_sale"/>
+        </record>
+        <record model="workflow.transition" id="sale_transition_waiting_invoice_sale_invoice_sale_exception">
+            <field name="act_from" ref="sale_activity_waiting_invoice_sale"/>
+            <field name="act_to" ref="sale_activity_invoice_sale_exception"/>
+            <field name="trigger_model">accont.invoice</field>
+            <field name="trigger_expr_id">[x.id for x in invoices]</field>
+            <field name="condition">invoice_exception</field>
+        </record>
+        <record model="workflow.transition" id="sale_transition_invoice_sale_exception_invoice_sale">
+            <field name="act_from" ref="sale_activity_invoice_sale_exception"/>
+            <field name="act_to" ref="sale_activity_waiting_invoice_sale"/>
+            <field name="signal">invoice_ok</field>
+            <field name="group" ref="group_sale"/>
+        </record>
+        <record model="workflow.transition" id="sale_transition_invoice_sale_exception_cancel">
+            <field name="act_from" ref="sale_activity_invoice_sale_exception"/>
+            <field name="act_to" ref="sale_activity_cancel"/>
+            <field name="signal">cancel</field>
+            <field name="group" ref="group_sale"/>
+        </record>
+        <record model="workflow.transition" id="sale_transition_waiting_invoice_sale_invoic_sale_done">
+            <field name="act_from" ref="sale_activity_waiting_invoice_sale"/>
+            <field name="act_to" ref="sale_activity_invoice_sale_done"/>
+            <field name="trigger_model">account.invoice</field>
+            <field name="trigger_expr_id">[x.id for x in invoices]</field>
+            <field name="condition">invoice_paid</field>
+        </record>
+        <record model="workflow.transition" id="sale_transition_invoice_sale_done">
+            <field name="act_from" ref="sale_activity_invoice_sale_done"/>
+            <field name="act_to" ref="sale_activity_packing_invoice_method"/>
+        </record>
+        <record model="workflow.transition" id="sale_transition_packing_invoice_method_packing_invoice_method_done">
+            <field name="act_from" ref="sale_activity_packing_invoice_method"/>
+            <field name="act_to" ref="sale_activity_packing_invoice_method_done"/>
+            <field name="condition">packing_method != 'invoice'</field>
+        </record>
+        <record model="workflow.transition" id="sale_transition_packing_invoice_method_packing_invoice">
+            <field name="act_from" ref="sale_activity_packing_invoice_method"/>
+            <field name="act_to" ref="sale_activity_packing_invoice"/>
+            <field name="condition">packing_method == 'invoice'</field>
+        </record>
+        <record model="workflow.transition" id="sale_transition_packing_invoice_waiting_packing_invoice">
+            <field name="act_from" ref="sale_activity_packing_invoice"/>
+            <field name="act_to" ref="sale_activity_waiting_packing_invoice"/>
+        </record>
+        <record model="workflow.transition" id="sale_transition_packing_invoice_packing_invoice_exception">
+            <field name="act_from" ref="sale_activity_waiting_packing_invoice"/>
+            <field name="act_to" ref="sale_activity_packing_invoice_exception"/>
+            <field name="trigger_model">stock.packing.out</field>
+            <field name="trigger_expr_id">[x.id for x in packings]</field>
+            <field name="condition">packing_exception</field>
+        </record>
+        <record model="workflow.transition" id="sale_transition_packing_invoice_exception_cancel">
+            <field name="act_from" ref="sale_activity_packing_invoice_exception"/>
+            <field name="act_to" ref="sale_activity_cancel"/>
+            <field name="signal">cancel</field>
+            <field name="group" ref="group_sale"/>
+        </record>
+        <record model="workflow.transition" id="sale_transition_packing_invoice_exception_waiting_packing_invoice">
+            <field name="act_from" ref="sale_activity_packing_invoice_exception"/>
+            <field name="act_to" ref="sale_activity_waiting_packing_invoice"/>
+            <field name="signal">packing_ok</field>
+            <field name="group" ref="group_sale"/>
+        </record>
+        <record model="workflow.transition" id="sale_transition_packing_waiting_packing_invoice_packing_invoice_done">
+            <field name="act_from" ref="sale_activity_waiting_packing_invoice"/>
+            <field name="act_to" ref="sale_activity_packing_invoice_done"/>
+            <field name="trigger_model">stock.packing.out</field>
+            <field name="trigger_expr_id">[x.id for x in packings]</field>
+            <field name="condition">packing_done</field>
+        </record>
+        <record model="workflow.transition" id="sale_transition_packing_invoice_done_packing_invoice_method_done">
+            <field name="act_from" ref="sale_activity_packing_invoice_done"/>
+            <field name="act_to" ref="sale_activity_packing_invoice_method_done"/>
+        </record>
+        <record model="workflow.transition" id="sale_transition_packing_invoice_method_done_invoice_method_done">
+            <field name="act_from" ref="sale_activity_packing_invoice_method_done"/>
+            <field name="act_to" ref="sale_activity_invoice_method_done"/>
+        </record>
+        <record model="workflow.transition" id="sale_transition_invoice_method_done_done">
+            <field name="act_from" ref="sale_activity_invoice_method_done"/>
+            <field name="act_to" ref="sale_activity_done"/>
+        </record>
+        <record model="workflow.transition" id="sale_transition_confirmed_packing_method">
+            <field name="act_from" ref="sale_activity_confirmed"/>
+            <field name="act_to" ref="sale_activity_packing_method"/>
+        </record>
+        <record model="workflow.transition" id="sale_transition_packing_method_packing_method_done">
+            <field name="act_from" ref="sale_activity_packing_method"/>
+            <field name="act_to" ref="sale_activity_packing_method_done"/>
+            <field name="condition">packing_method != 'order'</field>
+        </record>
+        <record model="workflow.transition" id="sale_transition_packing_method_packing">
+            <field name="act_from" ref="sale_activity_packing_method"/>
+            <field name="act_to" ref="sale_activity_packing"/>
+            <field name="condition">packing_method == 'order'</field>
+        </record>
+        <record model="workflow.transition" id="sale_transition_packing_waiting_packing">
+            <field name="act_from" ref="sale_activity_packing"/>
+            <field name="act_to" ref="sale_activity_waiting_packing"/>
+        </record>
+        <record model="workflow.transition" id="sale_transition_waiting_packing_packing_exception">
+            <field name="act_from" ref="sale_activity_waiting_packing"/>
+            <field name="act_to" ref="sale_activity_packing_exception"/>
+            <field name="signal">packing_update</field>
+            <field name="condition">packing_exception</field>
+        </record>
+        <record model="workflow.transition" id="sale_transition_packing_exception_cancel">
+            <field name="act_from" ref="sale_activity_packing_exception"/>
+            <field name="act_to" ref="sale_activity_cancel"/>
+            <field name="signal">cancel</field>
+            <field name="group" ref="group_sale"/>
+        </record>
+        <record model="workflow.transition" id="sale_transition_packing_exception_waiting_packing">
+            <field name="act_from" ref="sale_activity_packing_exception"/>
+            <field name="act_to" ref="sale_activity_waiting_packing"/>
+            <field name="signal">packing_ok</field>
+            <field name="group" ref="group_sale"/>
+        </record>
+        <record model="workflow.transition" id="sale_transition_waiting_packing_invoice_packing_method">
+            <field name="act_from" ref="sale_activity_waiting_packing"/>
+            <field name="act_to" ref="sale_activity_invoice_packing_method"/>
+            <field name="signal">packing_update</field>
+            <field name="condition">not packing_exception</field>
+        </record>
+        <record model="workflow.transition" id="sale_transition_waiting_packing_invoice_packing_method2">
+            <field name="act_from" ref="sale_activity_waiting_packing"/>
+            <field name="act_to" ref="sale_activity_invoice_packing_method"/>
+            <field name="condition">packing_done</field>
+        </record>
+        <record model="workflow.transition" id="sale_transition_invoice_packing_method_invoice_packing">
+            <field name="act_from" ref="sale_activity_invoice_packing_method"/>
+            <field name="act_to" ref="sale_activity_invoice_packing"/>
+            <field name="condition">invoice_method == 'packing'</field>
+        </record>
+        <record model="workflow.transition" id="sale_transition_invoice_packing_method_invoice_packing_method_done">
+            <field name="act_from" ref="sale_activity_invoice_packing_method"/>
+            <field name="act_to" ref="sale_activity_invoice_packing_method_done"/>
+            <field name="condition">invoice_method != 'packing' and packing_done</field>
+        </record>
+        <record model="workflow.transition" id="sale_transition_invoice_packing_method_waiting_packing">
+            <field name="act_from" ref="sale_activity_invoice_packing_method"/>
+            <field name="act_to" ref="sale_activity_waiting_packing"/>
+            <field name="condition">invoice_method != 'packing' and not packing_done</field>
+        </record>
+        <record model="workflow.transition" id="sale_transition_invoice_packing_waiting_packing">
+            <field name="act_from" ref="sale_activity_invoice_packing"/>
+            <field name="act_to" ref="sale_activity_waiting_packing"/>
+            <field name="condition">not packing_done</field>
+        </record>
+        <record model="workflow.transition" id="sale_transition_invoice_packing_waiting_invoice_packing">
+            <field name="act_from" ref="sale_activity_invoice_packing"/>
+            <field name="act_to" ref="sale_activity_waiting_invoice_packing"/>
+            <field name="condition">packing_done</field>
+        </record>
+        <record model="workflow.transition" id="sale_transition_waiting_invoice_packing_invoice_packing_exception">
+            <field name="act_from" ref="sale_activity_waiting_invoice_packing"/>
+            <field name="act_to" ref="sale_activity_invoice_packing_exception"/>
+            <field name="trigger_model">account.invoice</field>
+            <field name="trigger_expr_id">[x.id for x in invoices]</field>
+            <field name="condition">invoice_exception</field>
+        </record>
+        <record model="workflow.transition" id="sale_transition_invoice_packing_exception_cancel">
+            <field name="act_from" ref="sale_activity_invoice_packing_exception"/>
+            <field name="act_to" ref="sale_activity_cancel"/>
+            <field name="signal">cancel</field>
+            <field name="group" ref="group_sale"/>
+        </record>
+        <record model="workflow.transition" id="sale_transition_invoice_packing_exception_waiting_invoice_packing">
+            <field name="act_from" ref="sale_activity_invoice_packing_exception"/>
+            <field name="act_to" ref="sale_activity_waiting_invoice_packing"/>
+            <field name="signal">invoice_ok</field>
+            <field name="group" ref="group_sale"/>
+        </record>
+        <record model="workflow.transition" id="sale_transition_waiting_invoice_packing_invoice_packing_done">
+            <field name="act_from" ref="sale_activity_waiting_invoice_packing"/>
+            <field name="act_to" ref="sale_activity_invoice_packing_done"/>
+            <field name="trigger_model">account.invoice</field>
+            <field name="trigger_expr_id">[x.id for x in invoices]</field>
+            <field name="condition">invoice_paid</field>
+        </record>
+        <record model="workflow.transition" id="sale_transition_invoice_packing_done_invoice_packing_method_done">
+            <field name="act_from" ref="sale_activity_invoice_packing_done"/>
+            <field name="act_to" ref="sale_activity_invoice_packing_method_done"/>
+        </record>
+        <record model="workflow.transition" id="sale_transition_invoice_packing_method_done_packing_method_done">
+            <field name="act_from" ref="sale_activity_invoice_packing_method_done"/>
+            <field name="act_to" ref="sale_activity_packing_method_done"/>
+        </record>
+        <record model="workflow.transition" id="sale_transition_packing_method_done_done">
+            <field name="act_from" ref="sale_activity_packing_method_done"/>
+            <field name="act_to" ref="sale_activity_done"/>
+        </record>
+
+        <record model="ir.action.report" id="report_sale">
+            <field name="name">Sale</field>
+            <field name="model">sale.sale</field>
+            <field name="report_name">sale.sale</field>
+            <field name="report">sale/sale.odt</field>
+            <field name="style">company/header_A4.odt</field>
+        </record>
+        <record model="ir.action.keyword" id="report_sale_keyword">
+            <field name="keyword">form_print</field>
+            <field name="model">sale.sale,0</field>
+            <field name="action" ref="report_sale"/>
+        </record>
+
+        <record model="ir.ui.view" id="sale_line_view_form">
+            <field name="model">sale.line</field>
+            <field name="type">form</field>
+            <field name="arch" type="xml">
+                <![CDATA[
+                <form string="Sale Line" cursor="product">
+                    <label name="sale"/>
+                    <field name="sale" colspan="3"/>
+                    <label name="type"/>
+                    <field name="type"/>
+                    <label name="sequence"/>
+                    <field name="sequence"/>
+                    <label name="product"/>
+                    <field name="product">
+                        <tree string="Products">
+                            <field name="name" select="1"/>
+                            <field name="code" select="1"/>
+                            <field name="list_price_uom" select="2"/>
+                            <field name="cost_price_uom" select="2"/>
+                            <field name="quantity" select="2"/>
+                            <field name="forecast_quantity" select="2"/>
+                            <field name="default_uom" select="2"/>
+                            <field name="active" select="2"/>
+                        </tree>
+                    </field>
+                    <newline/>
+                    <label name="description"/>
+                    <field name="description" colspan="3"/>
+                    <label name="quantity"/>
+                    <field name="quantity"/>
+                    <label name="unit"/>
+                    <field name="unit"/>
+                    <label name="unit_price"/>
+                    <field name="unit_price"/>
+                    <label name="amount"/>
+                    <field name="amount"/>
+                    <separator name="taxes" colspan="4"/>
+                    <field name="taxes" colspan="4"/>
+                    <separator name="comment" colspan="4"/>
+                    <field name="comment" colspan="4" spell="_parent_sale.party_lang"/>
+                    <field name="unit_digits" invisible="1"/>
+                </form>
+                ]]>
+            </field>
+        </record>
+        <record model="ir.ui.view" id="sale_line_view_tree">
+            <field name="model">sale.line</field>
+            <field name="type">tree</field>
+            <field name="arch" type="xml">
+                <![CDATA[
+                <tree string="Sale Lines">
+                    <field name="sale" select="1"/>
+                    <field name="type" select="1"/>
+                    <field name="product" select="1"/>
+                    <field name="description" select="1"/>
+                    <field name="quantity" select="1"/>
+                    <field name="unit" select="2"/>
+                    <field name="unit_price" select="2"/>
+                    <field name="taxes"/>
+                    <field name="amount"/>
+                    <field name="unit_digits" tree_invisible="1"/>
+                </tree>
+                ]]>
+            </field>
+        </record>
+
+        <record model="ir.model.access" id="access_sale_line">
+            <field name="model" search="[('model', '=', 'sale.line')]"/>
+            <field name="perm_read" eval="True"/>
+            <field name="perm_write" eval="False"/>
+            <field name="perm_create" eval="False"/>
+            <field name="perm_delete" eval="False"/>
+        </record>
+        <record model="ir.model.access" id="access_sale_line_sale">
+            <field name="model" search="[('model', '=', 'sale.line')]"/>
+            <field name="group" ref="group_sale"/>
+            <field name="perm_read" eval="True"/>
+            <field name="perm_write" eval="True"/>
+            <field name="perm_create" eval="True"/>
+            <field name="perm_delete" eval="True"/>
+        </record>
+
+        <record model="ir.ui.view" id="product_view_form">
+            <field name="model">product.product</field>
+            <field name="inherit" ref="product.product_view_form"/>
+            <field name="arch" type="xml">
+                <![CDATA[
+                <data>
+                    <xpath expr="/form/notebook/page/separator[@name="description"]"
+                        position="before">
+                        <label name="salable"/>
+                        <field name="salable"/>
+                    </xpath>
+                    <xpath expr="/form/notebook/page[@string="General"]"
+                        position="after">
+                        <page string="Customers"
+                            states="{'invisible': '''not salable'''}">
+                            <label name="salable"/>
+                            <field name="salable"/>
+                            <label name="sale_uom"/>
+                            <field name="sale_uom"/>
+                        </page>
+                    </xpath>
+                </data>
+                ]]>
+            </field>
+        </record>
+        <record model="ir.ui.view" id="product_view_tree">
+            <field name="model">product.product</field>
+            <field name="inherit" ref="product.product_view_tree"/>
+            <field name="arch" type="xml">
+                <![CDATA[
+                <data>
+                    <xpath expr="/tree/field[@name="default_uom"]"
+                        position="after">
+                        <field name="salable" select="2"/>
+                    </xpath>
+                </data>
+                ]]>
+            </field>
+        </record>
+
+    </data>
+</tryton>
diff --git a/setup.cfg b/setup.cfg
new file mode 100644
index 0000000..861a9f5
--- /dev/null
+++ b/setup.cfg
@@ -0,0 +1,5 @@
+[egg_info]
+tag_build = 
+tag_date = 0
+tag_svn_revision = 0
+
diff --git a/setup.py b/setup.py
new file mode 100644
index 0000000..8407943
--- /dev/null
+++ b/setup.py
@@ -0,0 +1,57 @@
+#!/usr/bin/env python
+#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 setuptools import setup, find_packages
+import re
+
+info = eval(file('__tryton__.py').read())
+
+requires = []
+for dep in info.get('depends', []):
+    match = re.compile(
+            '(ir|res|workflow|webdav)((\s|$|<|>|<=|>=|==|!=).*?$)').match(dep)
+    if match:
+        continue
+    else:
+        dep = 'trytond_' + dep
+    requires.append(dep)
+
+major_version, minor_version, _ = info.get('version', '0.0.1').split('.', 2)
+requires.append('trytond >= %s.%s' % (major_version, minor_version))
+requires.append('trytond < %s.%s' % (major_version, str(int(minor_version) + 1)))
+
+setup(name='trytond_sale',
+    version=info.get('version', '0.0.1'),
+    description=info.get('description', ''),
+    author=info.get('author', ''),
+    author_email=info.get('email', ''),
+    url=info.get('website', ''),
+    package_dir={'trytond.modules.sale': '.'},
+    packages=[
+        'trytond.modules.sale',
+    ],
+    package_data={
+        'trytond.modules.sale': info.get('xml', []) \
+                + info.get('translation', []) \
+                + ['sale.odt'],
+    },
+    classifiers=[
+        'Development Status :: 5 - Production/Stable',
+        'Environment :: Plugins',
+        'Intended Audience :: Developers',
+        'Intended Audience :: Financial and Insurance Industry',
+        'Intended Audience :: Legal Industry',
+        'License :: OSI Approved :: GNU General Public License (GPL)',
+        'Natural Language :: English',
+        'Natural Language :: French',
+        'Natural Language :: German',
+        'Natural Language :: Spanish',
+        'Operating System :: OS Independent',
+        'Programming Language :: Python',
+        'Topic :: Office/Business',
+        'Topic :: Office/Business :: Financial :: Accounting',
+    ],
+    license='GPL-3',
+    install_requires=requires,
+)
diff --git a/trytond_sale.egg-info/PKG-INFO b/trytond_sale.egg-info/PKG-INFO
new file mode 100644
index 0000000..20fe90b
--- /dev/null
+++ b/trytond_sale.egg-info/PKG-INFO
@@ -0,0 +1,38 @@
+Metadata-Version: 1.0
+Name: trytond-sale
+Version: 1.0.0
+Summary: Define sale order.
+Add to product sale informations.
+Define the sale price as the list price.
+
+With the possibilities:
+    - to follow invoice and packing states from the sale order.
+    - to define invoice method:
+        - Manual
+        - On Order Confirmed
+        - On packing Sent
+    - to define packing method:
+        - Manual
+        - On Order Confirmed
+        - On Invoice Paid
+
+Home-page: http://www.tryton.org/
+Author: B2CK
+Author-email: info at b2ck.com
+License: GPL-3
+Description: UNKNOWN
+Platform: UNKNOWN
+Classifier: Development Status :: 5 - Production/Stable
+Classifier: Environment :: Plugins
+Classifier: Intended Audience :: Developers
+Classifier: Intended Audience :: Financial and Insurance Industry
+Classifier: Intended Audience :: Legal Industry
+Classifier: License :: OSI Approved :: GNU General Public License (GPL)
+Classifier: Natural Language :: English
+Classifier: Natural Language :: French
+Classifier: Natural Language :: German
+Classifier: Natural Language :: Spanish
+Classifier: Operating System :: OS Independent
+Classifier: Programming Language :: Python
+Classifier: Topic :: Office/Business
+Classifier: Topic :: Office/Business :: Financial :: Accounting
diff --git a/trytond_sale.egg-info/SOURCES.txt b/trytond_sale.egg-info/SOURCES.txt
new file mode 100644
index 0000000..1ae3f50
--- /dev/null
+++ b/trytond_sale.egg-info/SOURCES.txt
@@ -0,0 +1,21 @@
+CHANGELOG
+COPYRIGHT
+INSTALL
+LICENSE
+MANIFEST.in
+README
+TODO
+de_DE.csv
+es_ES.csv
+fr_FR.csv
+sale.odt
+sale.xml
+setup.py
+./__init__.py
+./__tryton__.py
+./sale.py
+trytond_sale.egg-info/PKG-INFO
+trytond_sale.egg-info/SOURCES.txt
+trytond_sale.egg-info/dependency_links.txt
+trytond_sale.egg-info/requires.txt
+trytond_sale.egg-info/top_level.txt
\ No newline at end of file
diff --git a/trytond_sale.egg-info/dependency_links.txt b/trytond_sale.egg-info/dependency_links.txt
new file mode 100644
index 0000000..8b13789
--- /dev/null
+++ b/trytond_sale.egg-info/dependency_links.txt
@@ -0,0 +1 @@
+
diff --git a/trytond_sale.egg-info/requires.txt b/trytond_sale.egg-info/requires.txt
new file mode 100644
index 0000000..3fb0c72
--- /dev/null
+++ b/trytond_sale.egg-info/requires.txt
@@ -0,0 +1,10 @@
+trytond_company
+trytond_party
+trytond_stock
+trytond_account
+trytond_product
+trytond_account_invoice
+trytond_currency
+trytond_account_product
+trytond >= 1.0
+trytond < 1.1
\ No newline at end of file
diff --git a/trytond_sale.egg-info/top_level.txt b/trytond_sale.egg-info/top_level.txt
new file mode 100644
index 0000000..93df119
--- /dev/null
+++ b/trytond_sale.egg-info/top_level.txt
@@ -0,0 +1 @@
+trytond
-- 
tryton-modules-sale



More information about the tryton-debian-vcs mailing list