[tryton-debian-vcs] tryton-modules-sale branch upstream updated. upstream/3.8.1-2-g54c194f

Mathias Behrle tryton-debian-vcs at alioth.debian.org
Thu Jun 2 16:25:13 UTC 2016


The following commit has been merged in the upstream branch:
https://alioth.debian.org/plugins/scmgit/cgi-bin/gitweb.cgi/?p=tryton/tryton-modules-sale.git;a=commitdiff;h=upstream/3.8.1-2-g54c194f

commit 54c194fd615a850768ea733073c2dcf82e255be1
Author: Mathias Behrle <mathiasb at m9s.biz>
Date:   Fri May 27 18:35:28 2016 +0200

    Adding upstream version 4.0.1.
    
    Signed-off-by: Mathias Behrle <mathiasb at m9s.biz>

diff --git a/CHANGELOG b/CHANGELOG
index 3ef7da2..0160330 100644
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -1,3 +1,6 @@
+Version 4.0.1 - 2016-05-11
+* Bug fixes (see mercurial logs for details)
+
 Version 4.0.0 - 2016-05-02
 * Bug fixes (see mercurial logs for details)
 * Rename Sale reference into number and add reference
diff --git a/PKG-INFO b/PKG-INFO
index 74db9d3..38cc5b8 100644
--- a/PKG-INFO
+++ b/PKG-INFO
@@ -1,6 +1,6 @@
 Metadata-Version: 1.1
 Name: trytond_sale
-Version: 4.0.0
+Version: 4.0.1
 Summary: Tryton module for sale
 Home-page: http://www.tryton.org/
 Author: Tryton
diff --git a/locale/ca_ES.po b/locale/ca_ES.po
index 7009505..4a43111 100644
--- a/locale/ca_ES.po
+++ b/locale/ca_ES.po
@@ -68,21 +68,19 @@ msgstr "Vendes"
 
 msgctxt "field:product.product,lead_time:"
 msgid "Lead Time"
-msgstr ""
+msgstr "Temps d'espera"
 
-#, fuzzy
 msgctxt "field:product.product,salable:"
 msgid "Salable"
 msgstr "Vendible"
 
-#, fuzzy
 msgctxt "field:product.product,sale_uom:"
 msgid "Sale UOM"
 msgstr "UdM de venda"
 
 msgctxt "field:product.template,lead_time:"
 msgid "Lead Time"
-msgstr ""
+msgstr "Temps d'espera"
 
 msgctxt "field:product.template,salable:"
 msgid "Salable"
@@ -114,7 +112,7 @@ msgstr "Mètode de facturació"
 
 msgctxt "field:sale.configuration,sale_sequence:"
 msgid "Sale Sequence"
-msgstr ""
+msgstr "Seqüència de venda"
 
 msgctxt "field:sale.configuration,sale_shipment_method:"
 msgid "Sale Shipment Method"
@@ -230,7 +228,7 @@ msgstr "Seqüència"
 
 msgctxt "field:sale.line,shipping_date:"
 msgid "Shipping Date"
-msgstr ""
+msgstr "Data d'enviament"
 
 msgctxt "field:sale.line,taxes:"
 msgid "Taxes"
@@ -434,7 +432,7 @@ msgstr "Moviments"
 
 msgctxt "field:sale.sale,number:"
 msgid "Number"
-msgstr ""
+msgstr "Número"
 
 msgctxt "field:sale.sale,origin:"
 msgid "Origin"
@@ -789,10 +787,9 @@ msgctxt "report:sale.sale:"
 msgid "Quotation N°:"
 msgstr "Pressupost Núm.:"
 
-#, fuzzy
 msgctxt "report:sale.sale:"
 msgid "Reference:"
-msgstr "Referència"
+msgstr "Referència:"
 
 msgctxt "report:sale.sale:"
 msgid "Sale Order N°:"
diff --git a/locale/de_DE.po b/locale/de_DE.po
index d516a9d..64e2577 100644
--- a/locale/de_DE.po
+++ b/locale/de_DE.po
@@ -76,21 +76,19 @@ msgstr "Verkäufe"
 
 msgctxt "field:product.product,lead_time:"
 msgid "Lead Time"
-msgstr ""
+msgstr "Beschaffungszeit"
 
-#, fuzzy
 msgctxt "field:product.product,salable:"
 msgid "Salable"
 msgstr "Verkäuflich"
 
-#, fuzzy
 msgctxt "field:product.product,sale_uom:"
 msgid "Sale UOM"
 msgstr "Einheit Verkauf"
 
 msgctxt "field:product.template,lead_time:"
 msgid "Lead Time"
-msgstr ""
+msgstr "Beschaffungszeit"
 
 msgctxt "field:product.template,salable:"
 msgid "Salable"
@@ -122,7 +120,7 @@ msgstr "Rechnungsstellung Verkauf"
 
 msgctxt "field:sale.configuration,sale_sequence:"
 msgid "Sale Sequence"
-msgstr ""
+msgstr "Nummernkreis Verkauf"
 
 msgctxt "field:sale.configuration,sale_shipment_method:"
 msgid "Sale Shipment Method"
@@ -238,7 +236,7 @@ msgstr "Reihenfolge"
 
 msgctxt "field:sale.line,shipping_date:"
 msgid "Shipping Date"
-msgstr ""
+msgstr "Lieferdatum"
 
 msgctxt "field:sale.line,taxes:"
 msgid "Taxes"
@@ -442,7 +440,7 @@ msgstr "Bewegungen"
 
 msgctxt "field:sale.sale,number:"
 msgid "Number"
-msgstr ""
+msgstr "Nummer"
 
 msgctxt "field:sale.sale,origin:"
 msgid "Origin"
@@ -798,10 +796,9 @@ msgctxt "report:sale.sale:"
 msgid "Quotation N°:"
 msgstr "Angebot Nr.:"
 
-#, fuzzy
 msgctxt "report:sale.sale:"
 msgid "Reference:"
-msgstr "Beleg-Nr."
+msgstr "Beleg-Nr.:"
 
 msgctxt "report:sale.sale:"
 msgid "Sale Order N°:"
@@ -833,7 +830,7 @@ msgstr "USt-ID-Nr:"
 
 msgctxt "selection:account.invoice,sale_exception_state:"
 msgid ""
-msgstr ""
+msgstr " "
 
 msgctxt "selection:account.invoice,sale_exception_state:"
 msgid "Ignored"
@@ -853,7 +850,7 @@ msgstr "Bei Auftragsausführung"
 
 msgctxt "selection:sale.configuration,sale_invoice_method:"
 msgid "On Shipment Sent"
-msgstr "Bei Versand"
+msgstr "Bei Lieferung"
 
 msgctxt "selection:sale.configuration,sale_shipment_method:"
 msgid "Manual"
@@ -893,7 +890,7 @@ msgstr "Bei Auftragsausführung"
 
 msgctxt "selection:sale.sale,invoice_method:"
 msgid "On Shipment Sent"
-msgstr "Bei Versand"
+msgstr "Bei Lieferung"
 
 msgctxt "selection:sale.sale,invoice_state:"
 msgid "Exception"
@@ -965,7 +962,7 @@ msgstr "Angebot"
 
 msgctxt "selection:stock.move,sale_exception_state:"
 msgid ""
-msgstr ""
+msgstr " "
 
 msgctxt "selection:stock.move,sale_exception_state:"
 msgid "Ignored"
diff --git a/locale/es_AR.po b/locale/es_AR.po
index cf96376..c14b519 100644
--- a/locale/es_AR.po
+++ b/locale/es_AR.po
@@ -66,21 +66,19 @@ msgstr "Ventas"
 
 msgctxt "field:product.product,lead_time:"
 msgid "Lead Time"
-msgstr ""
+msgstr "Tiempo de espera"
 
-#, fuzzy
 msgctxt "field:product.product,salable:"
 msgid "Salable"
 msgstr "Vendible"
 
-#, fuzzy
 msgctxt "field:product.product,sale_uom:"
 msgid "Sale UOM"
 msgstr "UdM de venta"
 
 msgctxt "field:product.template,lead_time:"
 msgid "Lead Time"
-msgstr ""
+msgstr "Tiempo de espera"
 
 msgctxt "field:product.template,salable:"
 msgid "Salable"
@@ -112,7 +110,7 @@ msgstr "Método de facturación de venta"
 
 msgctxt "field:sale.configuration,sale_sequence:"
 msgid "Sale Sequence"
-msgstr ""
+msgstr "Secuencia de venta"
 
 msgctxt "field:sale.configuration,sale_shipment_method:"
 msgid "Sale Shipment Method"
@@ -228,7 +226,7 @@ msgstr "Secuencia"
 
 msgctxt "field:sale.line,shipping_date:"
 msgid "Shipping Date"
-msgstr ""
+msgstr "Fecha de envío"
 
 msgctxt "field:sale.line,taxes:"
 msgid "Taxes"
@@ -432,7 +430,7 @@ msgstr "Movimientos"
 
 msgctxt "field:sale.sale,number:"
 msgid "Number"
-msgstr ""
+msgstr "Número"
 
 msgctxt "field:sale.sale,origin:"
 msgid "Origin"
@@ -787,10 +785,9 @@ msgctxt "report:sale.sale:"
 msgid "Quotation N°:"
 msgstr "Presupuesto Nº:"
 
-#, fuzzy
 msgctxt "report:sale.sale:"
 msgid "Reference:"
-msgstr "Referencia"
+msgstr "Referencia:"
 
 msgctxt "report:sale.sale:"
 msgid "Sale Order N°:"
diff --git a/locale/es_CO.po b/locale/es_CO.po
index 96bb11d..ca385bb 100644
--- a/locale/es_CO.po
+++ b/locale/es_CO.po
@@ -67,21 +67,19 @@ msgstr "Ventas"
 
 msgctxt "field:product.product,lead_time:"
 msgid "Lead Time"
-msgstr ""
+msgstr "Tiempo de Elaboración"
 
-#, fuzzy
 msgctxt "field:product.product,salable:"
 msgid "Salable"
 msgstr "Vendible"
 
-#, fuzzy
 msgctxt "field:product.product,sale_uom:"
 msgid "Sale UOM"
 msgstr "UdM de Venta"
 
 msgctxt "field:product.template,lead_time:"
 msgid "Lead Time"
-msgstr ""
+msgstr "Tiemp de Elaboración"
 
 msgctxt "field:product.template,salable:"
 msgid "Salable"
@@ -113,7 +111,7 @@ msgstr "Método de Facturación"
 
 msgctxt "field:sale.configuration,sale_sequence:"
 msgid "Sale Sequence"
-msgstr ""
+msgstr "Secuencia de Venta"
 
 msgctxt "field:sale.configuration,sale_shipment_method:"
 msgid "Sale Shipment Method"
@@ -229,7 +227,7 @@ msgstr "Secuencia"
 
 msgctxt "field:sale.line,shipping_date:"
 msgid "Shipping Date"
-msgstr ""
+msgstr "Fecha de Envio"
 
 msgctxt "field:sale.line,taxes:"
 msgid "Taxes"
@@ -433,7 +431,7 @@ msgstr "Movimientos"
 
 msgctxt "field:sale.sale,number:"
 msgid "Number"
-msgstr ""
+msgstr "Número"
 
 msgctxt "field:sale.sale,origin:"
 msgid "Origin"
@@ -473,7 +471,7 @@ msgstr "Método de Envío"
 
 msgctxt "field:sale.sale,shipment_party:"
 msgid "Shipment Party"
-msgstr ""
+msgstr "Tercero de Envio"
 
 msgctxt "field:sale.sale,shipment_returns:"
 msgid "Shipment Returns"
@@ -788,10 +786,9 @@ msgctxt "report:sale.sale:"
 msgid "Quotation N°:"
 msgstr "Cotización Nº:"
 
-#, fuzzy
 msgctxt "report:sale.sale:"
 msgid "Reference:"
-msgstr "Referencia"
+msgstr "Referencia:"
 
 msgctxt "report:sale.sale:"
 msgid "Sale Order N°:"
@@ -823,7 +820,7 @@ msgstr "NIT:"
 
 msgctxt "selection:account.invoice,sale_exception_state:"
 msgid ""
-msgstr ""
+msgstr " "
 
 msgctxt "selection:account.invoice,sale_exception_state:"
 msgid "Ignored"
@@ -955,7 +952,7 @@ msgstr "Cotización"
 
 msgctxt "selection:stock.move,sale_exception_state:"
 msgid ""
-msgstr ""
+msgstr " "
 
 msgctxt "selection:stock.move,sale_exception_state:"
 msgid "Ignored"
diff --git a/locale/es_EC.po b/locale/es_EC.po
index 720973e..4f63061 100644
--- a/locale/es_EC.po
+++ b/locale/es_EC.po
@@ -66,21 +66,19 @@ msgstr "Ventas"
 
 msgctxt "field:product.product,lead_time:"
 msgid "Lead Time"
-msgstr ""
+msgstr "Tiempo de espera"
 
-#, fuzzy
 msgctxt "field:product.product,salable:"
 msgid "Salable"
 msgstr "Vendible"
 
-#, fuzzy
 msgctxt "field:product.product,sale_uom:"
 msgid "Sale UOM"
 msgstr "UdM de venta"
 
 msgctxt "field:product.template,lead_time:"
 msgid "Lead Time"
-msgstr ""
+msgstr "Tiempo de espera"
 
 msgctxt "field:product.template,salable:"
 msgid "Salable"
@@ -112,7 +110,7 @@ msgstr "Método de facturación"
 
 msgctxt "field:sale.configuration,sale_sequence:"
 msgid "Sale Sequence"
-msgstr ""
+msgstr "Secuencia de venta"
 
 msgctxt "field:sale.configuration,sale_shipment_method:"
 msgid "Sale Shipment Method"
@@ -228,7 +226,7 @@ msgstr "Secuencia"
 
 msgctxt "field:sale.line,shipping_date:"
 msgid "Shipping Date"
-msgstr ""
+msgstr "Fecha de envío"
 
 msgctxt "field:sale.line,taxes:"
 msgid "Taxes"
@@ -432,7 +430,7 @@ msgstr "Movimientos"
 
 msgctxt "field:sale.sale,number:"
 msgid "Number"
-msgstr ""
+msgstr "Número"
 
 msgctxt "field:sale.sale,origin:"
 msgid "Origin"
@@ -787,10 +785,9 @@ msgctxt "report:sale.sale:"
 msgid "Quotation N°:"
 msgstr "Cotización Nº:"
 
-#, fuzzy
 msgctxt "report:sale.sale:"
 msgid "Reference:"
-msgstr "Referencia"
+msgstr "Referencia:"
 
 msgctxt "report:sale.sale:"
 msgid "Sale Order N°:"
diff --git a/locale/es_ES.po b/locale/es_ES.po
index 326993b..85f7e09 100644
--- a/locale/es_ES.po
+++ b/locale/es_ES.po
@@ -68,21 +68,19 @@ msgstr "Ventas"
 
 msgctxt "field:product.product,lead_time:"
 msgid "Lead Time"
-msgstr ""
+msgstr "Tiempo de espera"
 
-#, fuzzy
 msgctxt "field:product.product,salable:"
 msgid "Salable"
 msgstr "Vendible"
 
-#, fuzzy
 msgctxt "field:product.product,sale_uom:"
 msgid "Sale UOM"
 msgstr "UdM de venta"
 
 msgctxt "field:product.template,lead_time:"
 msgid "Lead Time"
-msgstr ""
+msgstr "Tiempo de espera"
 
 msgctxt "field:product.template,salable:"
 msgid "Salable"
@@ -114,7 +112,7 @@ msgstr "Método de facturación"
 
 msgctxt "field:sale.configuration,sale_sequence:"
 msgid "Sale Sequence"
-msgstr ""
+msgstr "Secuencia de venta"
 
 msgctxt "field:sale.configuration,sale_shipment_method:"
 msgid "Sale Shipment Method"
@@ -230,7 +228,7 @@ msgstr "Secuencia"
 
 msgctxt "field:sale.line,shipping_date:"
 msgid "Shipping Date"
-msgstr ""
+msgstr "Fecha de envío"
 
 msgctxt "field:sale.line,taxes:"
 msgid "Taxes"
@@ -434,7 +432,7 @@ msgstr "Movimientos"
 
 msgctxt "field:sale.sale,number:"
 msgid "Number"
-msgstr ""
+msgstr "Número"
 
 msgctxt "field:sale.sale,origin:"
 msgid "Origin"
@@ -789,10 +787,9 @@ msgctxt "report:sale.sale:"
 msgid "Quotation N°:"
 msgstr "Presupuesto Nº:"
 
-#, fuzzy
 msgctxt "report:sale.sale:"
 msgid "Reference:"
-msgstr "Referencia"
+msgstr "Referencia:"
 
 msgctxt "report:sale.sale:"
 msgid "Sale Order N°:"
diff --git a/locale/fr_FR.po b/locale/fr_FR.po
index f362660..d169ac0 100644
--- a/locale/fr_FR.po
+++ b/locale/fr_FR.po
@@ -67,21 +67,19 @@ msgstr "Ventes"
 
 msgctxt "field:product.product,lead_time:"
 msgid "Lead Time"
-msgstr ""
+msgstr "Délai d'exécution"
 
-#, fuzzy
 msgctxt "field:product.product,salable:"
 msgid "Salable"
 msgstr "Vendable"
 
-#, fuzzy
 msgctxt "field:product.product,sale_uom:"
 msgid "Sale UOM"
 msgstr "UDM de vente"
 
 msgctxt "field:product.template,lead_time:"
 msgid "Lead Time"
-msgstr ""
+msgstr "Délai d'exécution"
 
 msgctxt "field:product.template,salable:"
 msgid "Salable"
@@ -113,7 +111,7 @@ msgstr "Méthod de facturation"
 
 msgctxt "field:sale.configuration,sale_sequence:"
 msgid "Sale Sequence"
-msgstr ""
+msgstr "Séquence de vente"
 
 msgctxt "field:sale.configuration,sale_shipment_method:"
 msgid "Sale Shipment Method"
@@ -229,7 +227,7 @@ msgstr "Séquence"
 
 msgctxt "field:sale.line,shipping_date:"
 msgid "Shipping Date"
-msgstr ""
+msgstr "Date de livraison"
 
 msgctxt "field:sale.line,taxes:"
 msgid "Taxes"
@@ -433,7 +431,7 @@ msgstr "Mouvements"
 
 msgctxt "field:sale.sale,number:"
 msgid "Number"
-msgstr ""
+msgstr "Numéro"
 
 msgctxt "field:sale.sale,origin:"
 msgid "Origin"
@@ -788,10 +786,9 @@ msgctxt "report:sale.sale:"
 msgid "Quotation N°:"
 msgstr "Devis N° :"
 
-#, fuzzy
 msgctxt "report:sale.sale:"
 msgid "Reference:"
-msgstr "Référence"
+msgstr "Référence :"
 
 msgctxt "report:sale.sale:"
 msgid "Sale Order N°:"
diff --git a/locale/sl_SI.po b/locale/sl_SI.po
index 915e47b..99fd473 100644
--- a/locale/sl_SI.po
+++ b/locale/sl_SI.po
@@ -5,7 +5,7 @@ msgstr "Content-Type: text/plain; charset=utf-8\n"
 msgctxt "error:account.invoice:"
 msgid "You cannot reset to draft an invoice generated by a sale."
 msgstr ""
-"Računa, ustvarjenega iz prodajnega naloga, ni možno prestaviti v stanje "
+"Računa, izdelanega iz prodajnega naloga, ni možno prestaviti v stanje "
 "priprave."
 
 msgctxt "error:sale.line:"
@@ -53,13 +53,13 @@ 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 ""
-"Prometa, ustvarjenega iz prodajnega naloga, ni možno prestaviti v stanje "
+"Prometa, izdelanega iz prodajnega naloga, ni možno prestaviti v stanje "
 "priprave."
 
 msgctxt "error:stock.shipment.out:"
 msgid "You cannot reset to draft a move generated by a sale."
 msgstr ""
-"Prometa, ustvarjenega iz prodajnega naloga, ni možno prestaviti v stanje "
+"Prometa, izdelanega iz prodajnega naloga, ni možno prestaviti v stanje "
 "priprave."
 
 msgctxt "field:account.invoice,sale_exception_state:"
@@ -72,21 +72,19 @@ msgstr "Prodajni nalogi"
 
 msgctxt "field:product.product,lead_time:"
 msgid "Lead Time"
-msgstr ""
+msgstr "Dobavni rok"
 
-#, fuzzy
 msgctxt "field:product.product,salable:"
 msgid "Salable"
 msgstr "Za prodajo"
 
-#, fuzzy
 msgctxt "field:product.product,sale_uom:"
 msgid "Sale UOM"
 msgstr "Prodajna ME"
 
 msgctxt "field:product.template,lead_time:"
 msgid "Lead Time"
-msgstr ""
+msgstr "Dobavni rok"
 
 msgctxt "field:product.template,salable:"
 msgid "Salable"
@@ -118,7 +116,7 @@ msgstr "Način obračuna"
 
 msgctxt "field:sale.configuration,sale_sequence:"
 msgid "Sale Sequence"
-msgstr ""
+msgstr "Štetje prodajnih nalogov"
 
 msgctxt "field:sale.configuration,sale_shipment_method:"
 msgid "Sale Shipment Method"
@@ -234,7 +232,7 @@ msgstr "Zap.št."
 
 msgctxt "field:sale.line,shipping_date:"
 msgid "Shipping Date"
-msgstr ""
+msgstr "Datum odpreme"
 
 msgctxt "field:sale.line,taxes:"
 msgid "Taxes"
@@ -438,7 +436,7 @@ msgstr "Promet"
 
 msgctxt "field:sale.sale,number:"
 msgid "Number"
-msgstr ""
+msgstr "Številka"
 
 msgctxt "field:sale.sale,origin:"
 msgid "Origin"
@@ -792,10 +790,9 @@ msgctxt "report:sale.sale:"
 msgid "Quotation N°:"
 msgstr "Ponudba št.:"
 
-#, fuzzy
 msgctxt "report:sale.sale:"
 msgid "Reference:"
-msgstr "Sklic"
+msgstr "Sklic:"
 
 msgctxt "report:sale.sale:"
 msgid "Sale Order N°:"
diff --git a/tryton.cfg b/tryton.cfg
index 838e0f4..beb9250 100644
--- a/tryton.cfg
+++ b/tryton.cfg
@@ -1,5 +1,5 @@
 [tryton]
-version=4.0.0
+version=4.0.1
 depends:
     account
     account_invoice
diff --git a/trytond_sale.egg-info/PKG-INFO b/trytond_sale.egg-info/PKG-INFO
index f160c35..3792e67 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: 4.0.0
+Version: 4.0.1
 Summary: Tryton module for sale
 Home-page: http://www.tryton.org/
 Author: Tryton
diff --git a/trytond_sale.egg-info/SOURCES.txt b/trytond_sale.egg-info/SOURCES.txt
index 3172f9e..9ff65f2 100644
--- a/trytond_sale.egg-info/SOURCES.txt
+++ b/trytond_sale.egg-info/SOURCES.txt
@@ -38,11 +38,13 @@ tryton.cfg
 ./locale/hu_HU.po
 ./locale/it_IT.po
 ./locale/ja_JP.po
+./locale/lo_LA.po
 ./locale/lt_LT.po
 ./locale/nl_NL.po
 ./locale/pt_BR.po
 ./locale/ru_RU.po
 ./locale/sl_SI.po
+./locale/zh_CN.po
 ./tests/__init__.py
 ./tests/scenario_sale.rst
 ./tests/test_sale.py
diff --git a/trytond_sale.egg-info/requires.txt b/trytond_sale.egg-info/requires.txt
index bdeb17b..25cd843 100644
--- a/trytond_sale.egg-info/requires.txt
+++ b/trytond_sale.egg-info/requires.txt
@@ -8,4 +8,4 @@ trytond_currency >= 4.0, < 4.1
 trytond_party >= 4.0, < 4.1
 trytond_product >= 4.0, < 4.1
 trytond_stock >= 4.0, < 4.1
-trytond >= 4.0, < 4.1
\ No newline at end of file
+trytond >= 4.0, < 4.1
commit d68793b0e98e00fed5f3a24c9ffca81c769e6169
Author: Mathias Behrle <mathiasb at m9s.biz>
Date:   Fri May 27 18:26:13 2016 +0200

    Adding upstream version 4.0.0.
    
    Signed-off-by: Mathias Behrle <mathiasb at m9s.biz>

diff --git a/CHANGELOG b/CHANGELOG
index 295496c..3ef7da2 100644
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -1,5 +1,9 @@
-Version 3.8.1 - 2016-04-06
+Version 4.0.0 - 2016-05-02
 * Bug fixes (see mercurial logs for details)
+* Rename Sale reference into number and add reference
+* Add Python3 support
+* Replace Delivery Time by Lead Time on Product Template
+* Rename Delivery Date of Sale Line into Shipping Date
 
 Version 3.8.0 - 2015-11-02
 * Bug fixes (see mercurial logs for details)
diff --git a/PKG-INFO b/PKG-INFO
index 79341b4..74db9d3 100644
--- a/PKG-INFO
+++ b/PKG-INFO
@@ -1,12 +1,12 @@
 Metadata-Version: 1.1
 Name: trytond_sale
-Version: 3.8.1
+Version: 4.0.0
 Summary: Tryton module for sale
 Home-page: http://www.tryton.org/
 Author: Tryton
 Author-email: issue_tracker at tryton.org
 License: GPL-3
-Download-URL: http://downloads.tryton.org/3.8/
+Download-URL: http://downloads.tryton.org/4.0/
 Description: trytond_sale
         ============
         
@@ -54,6 +54,7 @@ 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 :: Chinese (Simplified)
 Classifier: Natural Language :: Czech
 Classifier: Natural Language :: Dutch
 Classifier: Natural Language :: English
@@ -67,6 +68,9 @@ Classifier: Natural Language :: Slovenian
 Classifier: Natural Language :: Spanish
 Classifier: Operating System :: OS Independent
 Classifier: Programming Language :: Python :: 2.7
+Classifier: Programming Language :: Python :: 3.3
+Classifier: Programming Language :: Python :: 3.4
+Classifier: Programming Language :: Python :: 3.5
 Classifier: Programming Language :: Python :: Implementation :: CPython
 Classifier: Programming Language :: Python :: Implementation :: PyPy
 Classifier: Topic :: Office/Business
diff --git a/configuration.py b/configuration.py
index c301a03..7a6bb46 100644
--- a/configuration.py
+++ b/configuration.py
@@ -10,7 +10,7 @@ class Configuration(ModelSingleton, ModelSQL, ModelView):
     'Sale Configuration'
     __name__ = 'sale.configuration'
     sale_sequence = fields.Property(fields.Many2One('ir.sequence',
-            'Sale Reference Sequence', domain=[
+            'Sale Sequence', domain=[
                 ('company', 'in',
                     [Eval('context', {}).get('company', -1), None]),
                 ('code', '=', 'sale.sale'),
diff --git a/invoice.py b/invoice.py
index 595102a..09f351c 100644
--- a/invoice.py
+++ b/invoice.py
@@ -9,7 +9,6 @@ from trytond.transaction import Transaction
 from trytond import backend
 
 __all__ = ['Invoice', 'InvoiceLine']
-__metaclass__ = PoolMeta
 
 
 def process_sale(func):
@@ -26,6 +25,7 @@ def process_sale(func):
 
 
 class Invoice:
+    __metaclass__ = PoolMeta
     __name__ = 'account.invoice'
     sale_exception_state = fields.Function(fields.Selection([
         ('', ''),
@@ -117,19 +117,20 @@ class Invoice:
 
 
 class InvoiceLine:
+    __metaclass__ = PoolMeta
     __name__ = 'account.invoice.line'
 
     @classmethod
     def __register__(cls, module_name):
         TableHandler = backend.get('TableHandler')
-        cursor = Transaction().cursor
+        cursor = Transaction().connection.cursor()
         sql_table = cls.__table__()
 
         super(InvoiceLine, cls).__register__(module_name)
 
         # Migration from 2.6: remove sale_lines
         rel_table_name = 'sale_line_invoice_lines_rel'
-        if TableHandler.table_exist(cursor, rel_table_name):
+        if TableHandler.table_exist(rel_table_name):
             rel_table = Table(rel_table_name)
             cursor.execute(*rel_table.select(
                     rel_table.sale_line, rel_table.invoice_line))
@@ -138,7 +139,7 @@ class InvoiceLine:
                         columns=[sql_table.origin],
                         values=['sale.line,%s' % sale_line],
                         where=sql_table.id == invoice_line))
-            TableHandler.drop_table(cursor,
+            TableHandler.drop_table(
                 'sale.line-account.invoice.line', rel_table_name)
 
     @property
diff --git a/locale/bg_BG.po b/locale/bg_BG.po
index eac91a3..614458d 100644
--- a/locale/bg_BG.po
+++ b/locale/bg_BG.po
@@ -56,9 +56,23 @@ msgctxt "field:account.invoice,sales:"
 msgid "Sales"
 msgstr "Продажби"
 
-msgctxt "field:product.template,delivery_time:"
-msgid "Delivery Time"
-msgstr "Време за доставка"
+msgctxt "field:product.product,lead_time:"
+msgid "Lead Time"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:product.product,salable:"
+msgid "Salable"
+msgstr "Продажен"
+
+#, fuzzy
+msgctxt "field:product.product,sale_uom:"
+msgid "Sale UOM"
+msgstr "Мер. ед. на продажба"
+
+msgctxt "field:product.template,lead_time:"
+msgid "Lead Time"
+msgstr ""
 
 msgctxt "field:product.template,salable:"
 msgid "Salable"
@@ -89,8 +103,8 @@ msgid "Sale Invoice Method"
 msgstr "Начин на фактурине на продажба"
 
 msgctxt "field:sale.configuration,sale_sequence:"
-msgid "Sale Reference Sequence"
-msgstr "Последователност за отпратка на продажба"
+msgid "Sale Sequence"
+msgstr ""
 
 msgctxt "field:sale.configuration,sale_shipment_method:"
 msgid "Sale Shipment Method"
@@ -140,10 +154,6 @@ 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 "Описание"
@@ -208,6 +218,10 @@ msgctxt "field:sale.line,sequence:"
 msgid "Sequence"
 msgstr "Последователност"
 
+msgctxt "field:sale.line,shipping_date:"
+msgid "Shipping Date"
+msgstr ""
+
 msgctxt "field:sale.line,taxes:"
 msgid "Taxes"
 msgstr "Данъци"
@@ -409,6 +423,10 @@ msgctxt "field:sale.sale,moves:"
 msgid "Moves"
 msgstr "Движения"
 
+msgctxt "field:sale.sale,number:"
+msgid "Number"
+msgstr ""
+
 #, fuzzy
 msgctxt "field:sale.sale,origin:"
 msgid "Origin"
@@ -574,10 +592,6 @@ msgctxt "field:stock.move,sale_exception_state:"
 msgid "Exception State"
 msgstr "Състояние на грешка"
 
-msgctxt "help:product.template,delivery_time:"
-msgid "In number of days"
-msgstr "В брой дни"
-
 msgctxt "help:sale.handle.invoice.exception.ask,recreate_invoices:"
 msgid ""
 "The selected invoices will be recreated. The other ones will be ignored."
@@ -747,59 +761,64 @@ msgctxt "model:sale.sale-recreated-account.invoice,name:"
 msgid "Sale - Recreated Invoice"
 msgstr "Продажба - Наново създадена фактура"
 
-msgctxt "odt:sale.sale:"
+msgctxt "report:sale.sale:"
 msgid "Amount"
 msgstr "Сума"
 
-msgctxt "odt:sale.sale:"
+msgctxt "report:sale.sale:"
 msgid "Date:"
 msgstr "Дата:"
 
-msgctxt "odt:sale.sale:"
+msgctxt "report:sale.sale:"
 msgid "Description"
 msgstr "Описание"
 
-msgctxt "odt:sale.sale:"
+msgctxt "report:sale.sale:"
 msgid "Description:"
 msgstr "Описание:"
 
-msgctxt "odt:sale.sale:"
+msgctxt "report:sale.sale:"
 msgid "Draft Sale Order"
 msgstr "Проект на поръчка за продажба"
 
-msgctxt "odt:sale.sale:"
+msgctxt "report:sale.sale:"
 msgid "Quantity"
 msgstr "Количество"
 
-msgctxt "odt:sale.sale:"
+msgctxt "report:sale.sale:"
 msgid "Quotation N°:"
 msgstr "Запитване N°:"
 
-msgctxt "odt:sale.sale:"
+#, fuzzy
+msgctxt "report:sale.sale:"
+msgid "Reference:"
+msgstr "Отпратка"
+
+msgctxt "report:sale.sale:"
 msgid "Sale Order N°:"
 msgstr "Поръчка за продажба N°:"
 
-msgctxt "odt:sale.sale:"
+msgctxt "report:sale.sale:"
 msgid "Taxes"
 msgstr "Данъци"
 
-msgctxt "odt:sale.sale:"
+msgctxt "report:sale.sale:"
 msgid "Taxes:"
 msgstr "Данъци:"
 
-msgctxt "odt:sale.sale:"
+msgctxt "report:sale.sale:"
 msgid "Total (excl. taxes):"
 msgstr "Общо (без данъци):"
 
-msgctxt "odt:sale.sale:"
+msgctxt "report:sale.sale:"
 msgid "Total:"
 msgstr "Общо:"
 
-msgctxt "odt:sale.sale:"
+msgctxt "report:sale.sale:"
 msgid "Unit Price"
 msgstr "Единична цена"
 
-msgctxt "odt:sale.sale:"
+msgctxt "report:sale.sale:"
 msgid "VAT:"
 msgstr "ДДС:"
 
@@ -998,7 +1017,7 @@ msgstr "Редове от продажба"
 
 msgctxt "view:sale.line:"
 msgid "Taxes"
-msgstr ""
+msgstr "Данъци"
 
 msgctxt "view:sale.return_sale.start:"
 msgid "Are you sure to return those/this sale(s)?"
@@ -1074,6 +1093,7 @@ msgctxt "wizard_button:sale.return_sale,start,end:"
 msgid "Cancel"
 msgstr "Отказване"
 
+#, fuzzy
 msgctxt "wizard_button:sale.return_sale,start,return_:"
 msgid "Return"
-msgstr ""
+msgstr "Връщане"
diff --git a/locale/ca_ES.po b/locale/ca_ES.po
index fdae002..7009505 100644
--- a/locale/ca_ES.po
+++ b/locale/ca_ES.po
@@ -66,9 +66,23 @@ msgctxt "field:account.invoice,sales:"
 msgid "Sales"
 msgstr "Vendes"
 
-msgctxt "field:product.template,delivery_time:"
-msgid "Delivery Time"
-msgstr "Termini de lliurament"
+msgctxt "field:product.product,lead_time:"
+msgid "Lead Time"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:product.product,salable:"
+msgid "Salable"
+msgstr "Vendible"
+
+#, fuzzy
+msgctxt "field:product.product,sale_uom:"
+msgid "Sale UOM"
+msgstr "UdM de venda"
+
+msgctxt "field:product.template,lead_time:"
+msgid "Lead Time"
+msgstr ""
 
 msgctxt "field:product.template,salable:"
 msgid "Salable"
@@ -99,8 +113,8 @@ msgid "Sale Invoice Method"
 msgstr "Mètode de facturació"
 
 msgctxt "field:sale.configuration,sale_sequence:"
-msgid "Sale Reference Sequence"
-msgstr "Seqüència de numeració vendes"
+msgid "Sale Sequence"
+msgstr ""
 
 msgctxt "field:sale.configuration,sale_shipment_method:"
 msgid "Sale Shipment Method"
@@ -150,10 +164,6 @@ msgctxt "field:sale.line,create_uid:"
 msgid "Create User"
 msgstr "Usuari creació"
 
-msgctxt "field:sale.line,delivery_date:"
-msgid "Delivery Date"
-msgstr "Data de lliurament"
-
 msgctxt "field:sale.line,description:"
 msgid "Description"
 msgstr "Descripció"
@@ -218,6 +228,10 @@ msgctxt "field:sale.line,sequence:"
 msgid "Sequence"
 msgstr "Seqüència"
 
+msgctxt "field:sale.line,shipping_date:"
+msgid "Shipping Date"
+msgstr ""
+
 msgctxt "field:sale.line,taxes:"
 msgid "Taxes"
 msgstr "Impostos"
@@ -418,6 +432,10 @@ msgctxt "field:sale.sale,moves:"
 msgid "Moves"
 msgstr "Moviments"
 
+msgctxt "field:sale.sale,number:"
+msgid "Number"
+msgstr ""
+
 msgctxt "field:sale.sale,origin:"
 msgid "Origin"
 msgstr "Origen"
@@ -582,10 +600,6 @@ msgctxt "field:stock.move,sale_exception_state:"
 msgid "Exception State"
 msgstr "Estat excepció"
 
-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."
@@ -747,59 +761,64 @@ msgctxt "model:sale.sale-recreated-account.invoice,name:"
 msgid "Sale - Recreated Invoice"
 msgstr "Venda - Factura recreada"
 
-msgctxt "odt:sale.sale:"
+msgctxt "report:sale.sale:"
 msgid "Amount"
 msgstr "Import"
 
-msgctxt "odt:sale.sale:"
+msgctxt "report:sale.sale:"
 msgid "Date:"
 msgstr "Data:"
 
-msgctxt "odt:sale.sale:"
+msgctxt "report:sale.sale:"
 msgid "Description"
 msgstr "Descripció"
 
-msgctxt "odt:sale.sale:"
+msgctxt "report:sale.sale:"
 msgid "Description:"
 msgstr "Descripció:"
 
-msgctxt "odt:sale.sale:"
+msgctxt "report:sale.sale:"
 msgid "Draft Sale Order"
 msgstr "Comanda de venda esborrany"
 
-msgctxt "odt:sale.sale:"
+msgctxt "report:sale.sale:"
 msgid "Quantity"
 msgstr "Quantitat"
 
-msgctxt "odt:sale.sale:"
+msgctxt "report:sale.sale:"
 msgid "Quotation N°:"
 msgstr "Pressupost Núm.:"
 
-msgctxt "odt:sale.sale:"
+#, fuzzy
+msgctxt "report:sale.sale:"
+msgid "Reference:"
+msgstr "Referència"
+
+msgctxt "report:sale.sale:"
 msgid "Sale Order N°:"
 msgstr "Venta Núm.:"
 
-msgctxt "odt:sale.sale:"
+msgctxt "report:sale.sale:"
 msgid "Taxes"
 msgstr "Impostos"
 
-msgctxt "odt:sale.sale:"
+msgctxt "report:sale.sale:"
 msgid "Taxes:"
 msgstr "Impostos:"
 
-msgctxt "odt:sale.sale:"
+msgctxt "report:sale.sale:"
 msgid "Total (excl. taxes):"
 msgstr "Base imposable:"
 
-msgctxt "odt:sale.sale:"
+msgctxt "report:sale.sale:"
 msgid "Total:"
 msgstr "Total:"
 
-msgctxt "odt:sale.sale:"
+msgctxt "report:sale.sale:"
 msgid "Unit Price"
 msgstr "Preu unitari"
 
-msgctxt "odt:sale.sale:"
+msgctxt "report:sale.sale:"
 msgid "VAT:"
 msgstr "CIF/NIF:"
 
diff --git a/locale/cs_CZ.po b/locale/cs_CZ.po
index 2b6e79f..225cdec 100644
--- a/locale/cs_CZ.po
+++ b/locale/cs_CZ.po
@@ -56,8 +56,20 @@ msgctxt "field:account.invoice,sales:"
 msgid "Sales"
 msgstr ""
 
-msgctxt "field:product.template,delivery_time:"
-msgid "Delivery Time"
+msgctxt "field:product.product,lead_time:"
+msgid "Lead Time"
+msgstr ""
+
+msgctxt "field:product.product,salable:"
+msgid "Salable"
+msgstr ""
+
+msgctxt "field:product.product,sale_uom:"
+msgid "Sale UOM"
+msgstr ""
+
+msgctxt "field:product.template,lead_time:"
+msgid "Lead Time"
 msgstr ""
 
 msgctxt "field:product.template,salable:"
@@ -89,7 +101,7 @@ msgid "Sale Invoice Method"
 msgstr ""
 
 msgctxt "field:sale.configuration,sale_sequence:"
-msgid "Sale Reference Sequence"
+msgid "Sale Sequence"
 msgstr ""
 
 msgctxt "field:sale.configuration,sale_shipment_method:"
@@ -140,10 +152,6 @@ 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 ""
@@ -208,6 +216,10 @@ msgctxt "field:sale.line,sequence:"
 msgid "Sequence"
 msgstr ""
 
+msgctxt "field:sale.line,shipping_date:"
+msgid "Shipping Date"
+msgstr ""
+
 msgctxt "field:sale.line,taxes:"
 msgid "Taxes"
 msgstr ""
@@ -408,6 +420,10 @@ msgctxt "field:sale.sale,moves:"
 msgid "Moves"
 msgstr ""
 
+msgctxt "field:sale.sale,number:"
+msgid "Number"
+msgstr ""
+
 msgctxt "field:sale.sale,origin:"
 msgid "Origin"
 msgstr ""
@@ -572,10 +588,6 @@ msgctxt "field:stock.move,sale_exception_state:"
 msgid "Exception State"
 msgstr ""
 
-msgctxt "help:product.template,delivery_time:"
-msgid "In number of days"
-msgstr ""
-
 msgctxt "help:sale.handle.invoice.exception.ask,recreate_invoices:"
 msgid ""
 "The selected invoices will be recreated. The other ones will be ignored."
@@ -736,59 +748,63 @@ msgctxt "model:sale.sale-recreated-account.invoice,name:"
 msgid "Sale - Recreated Invoice"
 msgstr ""
 
-msgctxt "odt:sale.sale:"
+msgctxt "report:sale.sale:"
 msgid "Amount"
 msgstr ""
 
-msgctxt "odt:sale.sale:"
+msgctxt "report:sale.sale:"
 msgid "Date:"
 msgstr ""
 
-msgctxt "odt:sale.sale:"
+msgctxt "report:sale.sale:"
 msgid "Description"
 msgstr ""
 
-msgctxt "odt:sale.sale:"
+msgctxt "report:sale.sale:"
 msgid "Description:"
 msgstr ""
 
-msgctxt "odt:sale.sale:"
+msgctxt "report:sale.sale:"
 msgid "Draft Sale Order"
 msgstr ""
 
-msgctxt "odt:sale.sale:"
+msgctxt "report:sale.sale:"
 msgid "Quantity"
 msgstr ""
 
-msgctxt "odt:sale.sale:"
+msgctxt "report:sale.sale:"
 msgid "Quotation N°:"
 msgstr ""
 
-msgctxt "odt:sale.sale:"
+msgctxt "report:sale.sale:"
+msgid "Reference:"
+msgstr ""
+
+msgctxt "report:sale.sale:"
 msgid "Sale Order N°:"
 msgstr ""
 
-msgctxt "odt:sale.sale:"
+msgctxt "report:sale.sale:"
 msgid "Taxes"
 msgstr ""
 
-msgctxt "odt:sale.sale:"
+msgctxt "report:sale.sale:"
 msgid "Taxes:"
 msgstr ""
 
-msgctxt "odt:sale.sale:"
+msgctxt "report:sale.sale:"
 msgid "Total (excl. taxes):"
 msgstr ""
 
-msgctxt "odt:sale.sale:"
+msgctxt "report:sale.sale:"
 msgid "Total:"
 msgstr ""
 
-msgctxt "odt:sale.sale:"
+msgctxt "report:sale.sale:"
 msgid "Unit Price"
 msgstr ""
 
-msgctxt "odt:sale.sale:"
+msgctxt "report:sale.sale:"
 msgid "VAT:"
 msgstr ""
 
diff --git a/locale/de_DE.po b/locale/de_DE.po
index dd00aad..d516a9d 100644
--- a/locale/de_DE.po
+++ b/locale/de_DE.po
@@ -74,9 +74,23 @@ msgctxt "field:account.invoice,sales:"
 msgid "Sales"
 msgstr "Verkäufe"
 
-msgctxt "field:product.template,delivery_time:"
-msgid "Delivery Time"
-msgstr "Lieferzeitraum"
+msgctxt "field:product.product,lead_time:"
+msgid "Lead Time"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:product.product,salable:"
+msgid "Salable"
+msgstr "Verkäuflich"
+
+#, fuzzy
+msgctxt "field:product.product,sale_uom:"
+msgid "Sale UOM"
+msgstr "Einheit Verkauf"
+
+msgctxt "field:product.template,lead_time:"
+msgid "Lead Time"
+msgstr ""
 
 msgctxt "field:product.template,salable:"
 msgid "Salable"
@@ -107,8 +121,8 @@ msgid "Sale Invoice Method"
 msgstr "Rechnungsstellung Verkauf"
 
 msgctxt "field:sale.configuration,sale_sequence:"
-msgid "Sale Reference Sequence"
-msgstr "Nummernkreis Verkauf"
+msgid "Sale Sequence"
+msgstr ""
 
 msgctxt "field:sale.configuration,sale_shipment_method:"
 msgid "Sale Shipment Method"
@@ -158,10 +172,6 @@ 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 "Beschreibung"
@@ -226,6 +236,10 @@ msgctxt "field:sale.line,sequence:"
 msgid "Sequence"
 msgstr "Reihenfolge"
 
+msgctxt "field:sale.line,shipping_date:"
+msgid "Shipping Date"
+msgstr ""
+
 msgctxt "field:sale.line,taxes:"
 msgid "Taxes"
 msgstr "Steuern"
@@ -426,6 +440,10 @@ msgctxt "field:sale.sale,moves:"
 msgid "Moves"
 msgstr "Bewegungen"
 
+msgctxt "field:sale.sale,number:"
+msgid "Number"
+msgstr ""
+
 msgctxt "field:sale.sale,origin:"
 msgid "Origin"
 msgstr "Herkunft"
@@ -590,10 +608,6 @@ msgctxt "field:stock.move,sale_exception_state:"
 msgid "Exception State"
 msgstr "Status Vorbehalt"
 
-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:"
 msgid ""
 "The selected invoices will be recreated. The other ones will be ignored."
@@ -756,59 +770,64 @@ msgctxt "model:sale.sale-recreated-account.invoice,name:"
 msgid "Sale - Recreated Invoice"
 msgstr "Verkauf - Neu erstellte Rechnung"
 
-msgctxt "odt:sale.sale:"
+msgctxt "report:sale.sale:"
 msgid "Amount"
 msgstr "Betrag"
 
-msgctxt "odt:sale.sale:"
+msgctxt "report:sale.sale:"
 msgid "Date:"
 msgstr "Datum:"
 
-msgctxt "odt:sale.sale:"
+msgctxt "report:sale.sale:"
 msgid "Description"
 msgstr "Beschreibung"
 
-msgctxt "odt:sale.sale:"
+msgctxt "report:sale.sale:"
 msgid "Description:"
 msgstr "Beschreibung:"
 
-msgctxt "odt:sale.sale:"
+msgctxt "report:sale.sale:"
 msgid "Draft Sale Order"
 msgstr "Auftrag (Entwurf)"
 
-msgctxt "odt:sale.sale:"
+msgctxt "report:sale.sale:"
 msgid "Quantity"
 msgstr "Anzahl"
 
-msgctxt "odt:sale.sale:"
+msgctxt "report:sale.sale:"
 msgid "Quotation N°:"
 msgstr "Angebot Nr.:"
 
-msgctxt "odt:sale.sale:"
+#, fuzzy
+msgctxt "report:sale.sale:"
+msgid "Reference:"
+msgstr "Beleg-Nr."
+
+msgctxt "report:sale.sale:"
 msgid "Sale Order N°:"
 msgstr "Auftrag Nr.:"
 
-msgctxt "odt:sale.sale:"
+msgctxt "report:sale.sale:"
 msgid "Taxes"
 msgstr "Steuern"
 
-msgctxt "odt:sale.sale:"
+msgctxt "report:sale.sale:"
 msgid "Taxes:"
 msgstr "Steuern"
 
-msgctxt "odt:sale.sale:"
+msgctxt "report:sale.sale:"
 msgid "Total (excl. taxes):"
 msgstr "Netto"
 
-msgctxt "odt:sale.sale:"
+msgctxt "report:sale.sale:"
 msgid "Total:"
 msgstr "Gesamt"
 
-msgctxt "odt:sale.sale:"
+msgctxt "report:sale.sale:"
 msgid "Unit Price"
 msgstr "Einzelpreis"
 
-msgctxt "odt:sale.sale:"
+msgctxt "report:sale.sale:"
 msgid "VAT:"
 msgstr "USt-ID-Nr:"
 
diff --git a/locale/es_AR.po b/locale/es_AR.po
index a90c33c..cf96376 100644
--- a/locale/es_AR.po
+++ b/locale/es_AR.po
@@ -64,9 +64,23 @@ msgctxt "field:account.invoice,sales:"
 msgid "Sales"
 msgstr "Ventas"
 
-msgctxt "field:product.template,delivery_time:"
-msgid "Delivery Time"
-msgstr "Tiempo de envío"
+msgctxt "field:product.product,lead_time:"
+msgid "Lead Time"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:product.product,salable:"
+msgid "Salable"
+msgstr "Vendible"
+
+#, fuzzy
+msgctxt "field:product.product,sale_uom:"
+msgid "Sale UOM"
+msgstr "UdM de venta"
+
+msgctxt "field:product.template,lead_time:"
+msgid "Lead Time"
+msgstr ""
 
 msgctxt "field:product.template,salable:"
 msgid "Salable"
@@ -97,8 +111,8 @@ 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"
+msgid "Sale Sequence"
+msgstr ""
 
 msgctxt "field:sale.configuration,sale_shipment_method:"
 msgid "Sale Shipment Method"
@@ -148,10 +162,6 @@ 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"
@@ -216,6 +226,10 @@ msgctxt "field:sale.line,sequence:"
 msgid "Sequence"
 msgstr "Secuencia"
 
+msgctxt "field:sale.line,shipping_date:"
+msgid "Shipping Date"
+msgstr ""
+
 msgctxt "field:sale.line,taxes:"
 msgid "Taxes"
 msgstr "Impuestos"
@@ -416,6 +430,10 @@ msgctxt "field:sale.sale,moves:"
 msgid "Moves"
 msgstr "Movimientos"
 
+msgctxt "field:sale.sale,number:"
+msgid "Number"
+msgstr ""
+
 msgctxt "field:sale.sale,origin:"
 msgid "Origin"
 msgstr "Origen"
@@ -580,10 +598,6 @@ msgctxt "field:stock.move,sale_exception_state:"
 msgid "Exception State"
 msgstr "Estado excepción"
 
-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."
@@ -745,59 +759,64 @@ msgctxt "model:sale.sale-recreated-account.invoice,name:"
 msgid "Sale - Recreated Invoice"
 msgstr "Venta - Factura recreada"
 
-msgctxt "odt:sale.sale:"
+msgctxt "report:sale.sale:"
 msgid "Amount"
 msgstr "Importe"
 
-msgctxt "odt:sale.sale:"
+msgctxt "report:sale.sale:"
 msgid "Date:"
 msgstr "Fecha:"
 
-msgctxt "odt:sale.sale:"
+msgctxt "report:sale.sale:"
 msgid "Description"
 msgstr "Descripción"
 
-msgctxt "odt:sale.sale:"
+msgctxt "report:sale.sale:"
 msgid "Description:"
 msgstr "Descripción:"
 
-msgctxt "odt:sale.sale:"
+msgctxt "report:sale.sale:"
 msgid "Draft Sale Order"
 msgstr "Ordenes de venta en borrador"
 
-msgctxt "odt:sale.sale:"
+msgctxt "report:sale.sale:"
 msgid "Quantity"
 msgstr "Cantidad"
 
-msgctxt "odt:sale.sale:"
+msgctxt "report:sale.sale:"
 msgid "Quotation N°:"
 msgstr "Presupuesto Nº:"
 
-msgctxt "odt:sale.sale:"
+#, fuzzy
+msgctxt "report:sale.sale:"
+msgid "Reference:"
+msgstr "Referencia"
+
+msgctxt "report:sale.sale:"
 msgid "Sale Order N°:"
 msgstr "Orden de venta Nº:"
 
-msgctxt "odt:sale.sale:"
+msgctxt "report:sale.sale:"
 msgid "Taxes"
 msgstr "Impuestos"
 
-msgctxt "odt:sale.sale:"
+msgctxt "report:sale.sale:"
 msgid "Taxes:"
 msgstr "Impuestos:"
 
-msgctxt "odt:sale.sale:"
+msgctxt "report:sale.sale:"
 msgid "Total (excl. taxes):"
 msgstr "Total (sin impuestos):"
 
-msgctxt "odt:sale.sale:"
+msgctxt "report:sale.sale:"
 msgid "Total:"
 msgstr "Total:"
 
-msgctxt "odt:sale.sale:"
+msgctxt "report:sale.sale:"
 msgid "Unit Price"
 msgstr "Precio unitario"
 
-msgctxt "odt:sale.sale:"
+msgctxt "report:sale.sale:"
 msgid "VAT:"
 msgstr "CUIT:"
 
diff --git a/locale/es_CO.po b/locale/es_CO.po
index a5b26d0..96bb11d 100644
--- a/locale/es_CO.po
+++ b/locale/es_CO.po
@@ -65,9 +65,23 @@ msgctxt "field:account.invoice,sales:"
 msgid "Sales"
 msgstr "Ventas"
 
-msgctxt "field:product.template,delivery_time:"
-msgid "Delivery Time"
-msgstr "Tiempo de Entrega"
+msgctxt "field:product.product,lead_time:"
+msgid "Lead Time"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:product.product,salable:"
+msgid "Salable"
+msgstr "Vendible"
+
+#, fuzzy
+msgctxt "field:product.product,sale_uom:"
+msgid "Sale UOM"
+msgstr "UdM de Venta"
+
+msgctxt "field:product.template,lead_time:"
+msgid "Lead Time"
+msgstr ""
 
 msgctxt "field:product.template,salable:"
 msgid "Salable"
@@ -98,8 +112,8 @@ msgid "Sale Invoice Method"
 msgstr "Método de Facturación"
 
 msgctxt "field:sale.configuration,sale_sequence:"
-msgid "Sale Reference Sequence"
-msgstr "Secuencia Pedidos de Venta"
+msgid "Sale Sequence"
+msgstr ""
 
 msgctxt "field:sale.configuration,sale_shipment_method:"
 msgid "Sale Shipment Method"
@@ -149,10 +163,6 @@ msgctxt "field:sale.line,create_uid:"
 msgid "Create User"
 msgstr "Creado por Usuario"
 
-msgctxt "field:sale.line,delivery_date:"
-msgid "Delivery Date"
-msgstr "Fecha de Entrega"
-
 msgctxt "field:sale.line,description:"
 msgid "Description"
 msgstr "Descripción"
@@ -217,6 +227,10 @@ msgctxt "field:sale.line,sequence:"
 msgid "Sequence"
 msgstr "Secuencia"
 
+msgctxt "field:sale.line,shipping_date:"
+msgid "Shipping Date"
+msgstr ""
+
 msgctxt "field:sale.line,taxes:"
 msgid "Taxes"
 msgstr "Impuestos"
@@ -417,6 +431,10 @@ msgctxt "field:sale.sale,moves:"
 msgid "Moves"
 msgstr "Movimientos"
 
+msgctxt "field:sale.sale,number:"
+msgid "Number"
+msgstr ""
+
 msgctxt "field:sale.sale,origin:"
 msgid "Origin"
 msgstr "Origen"
@@ -581,10 +599,6 @@ msgctxt "field:stock.move,sale_exception_state:"
 msgid "Exception State"
 msgstr "Estado Excepción"
 
-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."
@@ -746,59 +760,64 @@ msgctxt "model:sale.sale-recreated-account.invoice,name:"
 msgid "Sale - Recreated Invoice"
 msgstr "Venta - Factura Recreada"
 
-msgctxt "odt:sale.sale:"
+msgctxt "report:sale.sale:"
 msgid "Amount"
 msgstr "Subtotal"
 
-msgctxt "odt:sale.sale:"
+msgctxt "report:sale.sale:"
 msgid "Date:"
 msgstr "Fecha:"
 
-msgctxt "odt:sale.sale:"
+msgctxt "report:sale.sale:"
 msgid "Description"
 msgstr "Descripción"
 
-msgctxt "odt:sale.sale:"
+msgctxt "report:sale.sale:"
 msgid "Description:"
 msgstr "Descripción:"
 
-msgctxt "odt:sale.sale:"
+msgctxt "report:sale.sale:"
 msgid "Draft Sale Order"
 msgstr "Pedido en Borrador"
 
-msgctxt "odt:sale.sale:"
+msgctxt "report:sale.sale:"
 msgid "Quantity"
 msgstr "Cantidad"
 
-msgctxt "odt:sale.sale:"
+msgctxt "report:sale.sale:"
 msgid "Quotation N°:"
 msgstr "Cotización Nº:"
 
-msgctxt "odt:sale.sale:"
+#, fuzzy
+msgctxt "report:sale.sale:"
+msgid "Reference:"
+msgstr "Referencia"
+
+msgctxt "report:sale.sale:"
 msgid "Sale Order N°:"
 msgstr "Pedido de Venta Nº:"
 
-msgctxt "odt:sale.sale:"
+msgctxt "report:sale.sale:"
 msgid "Taxes"
 msgstr "Impuestos"
 
-msgctxt "odt:sale.sale:"
+msgctxt "report:sale.sale:"
 msgid "Taxes:"
 msgstr "Impuestos:"
 
-msgctxt "odt:sale.sale:"
+msgctxt "report:sale.sale:"
 msgid "Total (excl. taxes):"
 msgstr "Base (sin impuestos):"
 
-msgctxt "odt:sale.sale:"
+msgctxt "report:sale.sale:"
 msgid "Total:"
 msgstr "Total:"
 
-msgctxt "odt:sale.sale:"
+msgctxt "report:sale.sale:"
 msgid "Unit Price"
 msgstr "Precio Unitario"
 
-msgctxt "odt:sale.sale:"
+msgctxt "report:sale.sale:"
 msgid "VAT:"
 msgstr "NIT:"
 
diff --git a/locale/es_EC.po b/locale/es_EC.po
index dff1f04..720973e 100644
--- a/locale/es_EC.po
+++ b/locale/es_EC.po
@@ -64,9 +64,23 @@ msgctxt "field:account.invoice,sales:"
 msgid "Sales"
 msgstr "Ventas"
 
-msgctxt "field:product.template,delivery_time:"
-msgid "Delivery Time"
-msgstr "Tiempo de entrega"
+msgctxt "field:product.product,lead_time:"
+msgid "Lead Time"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:product.product,salable:"
+msgid "Salable"
+msgstr "Vendible"
+
+#, fuzzy
+msgctxt "field:product.product,sale_uom:"
+msgid "Sale UOM"
+msgstr "UdM de venta"
+
+msgctxt "field:product.template,lead_time:"
+msgid "Lead Time"
+msgstr ""
 
 msgctxt "field:product.template,salable:"
 msgid "Salable"
@@ -97,8 +111,8 @@ msgid "Sale Invoice Method"
 msgstr "Método de facturación"
 
 msgctxt "field:sale.configuration,sale_sequence:"
-msgid "Sale Reference Sequence"
-msgstr "Secuencia de referencia de venta"
+msgid "Sale Sequence"
+msgstr ""
 
 msgctxt "field:sale.configuration,sale_shipment_method:"
 msgid "Sale Shipment Method"
@@ -148,10 +162,6 @@ msgctxt "field:sale.line,create_uid:"
 msgid "Create User"
 msgstr "Creado por usuario"
 
-msgctxt "field:sale.line,delivery_date:"
-msgid "Delivery Date"
-msgstr "Fecha de entrega"
-
 msgctxt "field:sale.line,description:"
 msgid "Description"
 msgstr "Descripción"
@@ -216,6 +226,10 @@ msgctxt "field:sale.line,sequence:"
 msgid "Sequence"
 msgstr "Secuencia"
 
+msgctxt "field:sale.line,shipping_date:"
+msgid "Shipping Date"
+msgstr ""
+
 msgctxt "field:sale.line,taxes:"
 msgid "Taxes"
 msgstr "Impuestos"
@@ -416,6 +430,10 @@ msgctxt "field:sale.sale,moves:"
 msgid "Moves"
 msgstr "Movimientos"
 
+msgctxt "field:sale.sale,number:"
+msgid "Number"
+msgstr ""
+
 msgctxt "field:sale.sale,origin:"
 msgid "Origin"
 msgstr "Origen"
@@ -580,10 +598,6 @@ msgctxt "field:stock.move,sale_exception_state:"
 msgid "Exception State"
 msgstr "Estado de excepción"
 
-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."
@@ -745,59 +759,64 @@ msgctxt "model:sale.sale-recreated-account.invoice,name:"
 msgid "Sale - Recreated Invoice"
 msgstr "Venta - Factura recreada"
 
-msgctxt "odt:sale.sale:"
+msgctxt "report:sale.sale:"
 msgid "Amount"
 msgstr "Importe"
 
-msgctxt "odt:sale.sale:"
+msgctxt "report:sale.sale:"
 msgid "Date:"
 msgstr "Fecha:"
 
-msgctxt "odt:sale.sale:"
+msgctxt "report:sale.sale:"
 msgid "Description"
 msgstr "Descripción"
 
-msgctxt "odt:sale.sale:"
+msgctxt "report:sale.sale:"
 msgid "Description:"
 msgstr "Descripción:"
 
-msgctxt "odt:sale.sale:"
+msgctxt "report:sale.sale:"
 msgid "Draft Sale Order"
 msgstr "Pedido de venta en borrador"
 
-msgctxt "odt:sale.sale:"
+msgctxt "report:sale.sale:"
 msgid "Quantity"
 msgstr "Cantidad"
 
-msgctxt "odt:sale.sale:"
+msgctxt "report:sale.sale:"
 msgid "Quotation N°:"
 msgstr "Cotización Nº:"
 
-msgctxt "odt:sale.sale:"
+#, fuzzy
+msgctxt "report:sale.sale:"
+msgid "Reference:"
+msgstr "Referencia"
+
+msgctxt "report:sale.sale:"
 msgid "Sale Order N°:"
 msgstr "Orden de venta Nº:"
 
-msgctxt "odt:sale.sale:"
+msgctxt "report:sale.sale:"
 msgid "Taxes"
 msgstr "Impuestos"
 
-msgctxt "odt:sale.sale:"
+msgctxt "report:sale.sale:"
 msgid "Taxes:"
 msgstr "Impuestos:"
 
-msgctxt "odt:sale.sale:"
+msgctxt "report:sale.sale:"
 msgid "Total (excl. taxes):"
 msgstr "Total (sin impuestos):"
 
-msgctxt "odt:sale.sale:"
+msgctxt "report:sale.sale:"
 msgid "Total:"
 msgstr "Total:"
 
-msgctxt "odt:sale.sale:"
+msgctxt "report:sale.sale:"
 msgid "Unit Price"
 msgstr "Precio unitario"
 
-msgctxt "odt:sale.sale:"
+msgctxt "report:sale.sale:"
 msgid "VAT:"
 msgstr "CI/RUC:"
 
diff --git a/locale/es_ES.po b/locale/es_ES.po
index 5571a45..326993b 100644
--- a/locale/es_ES.po
+++ b/locale/es_ES.po
@@ -66,9 +66,23 @@ msgctxt "field:account.invoice,sales:"
 msgid "Sales"
 msgstr "Ventas"
 
-msgctxt "field:product.template,delivery_time:"
-msgid "Delivery Time"
-msgstr "Plazo de entrega"
+msgctxt "field:product.product,lead_time:"
+msgid "Lead Time"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:product.product,salable:"
+msgid "Salable"
+msgstr "Vendible"
+
+#, fuzzy
+msgctxt "field:product.product,sale_uom:"
+msgid "Sale UOM"
+msgstr "UdM de venta"
+
+msgctxt "field:product.template,lead_time:"
+msgid "Lead Time"
+msgstr ""
 
 msgctxt "field:product.template,salable:"
 msgid "Salable"
@@ -99,8 +113,8 @@ msgid "Sale Invoice Method"
 msgstr "Método de facturación"
 
 msgctxt "field:sale.configuration,sale_sequence:"
-msgid "Sale Reference Sequence"
-msgstr "Secuencia de pedidos de venta"
+msgid "Sale Sequence"
+msgstr ""
 
 msgctxt "field:sale.configuration,sale_shipment_method:"
 msgid "Sale Shipment Method"
@@ -150,10 +164,6 @@ 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"
@@ -218,6 +228,10 @@ msgctxt "field:sale.line,sequence:"
 msgid "Sequence"
 msgstr "Secuencia"
 
+msgctxt "field:sale.line,shipping_date:"
+msgid "Shipping Date"
+msgstr ""
+
 msgctxt "field:sale.line,taxes:"
 msgid "Taxes"
 msgstr "Impuestos"
@@ -418,6 +432,10 @@ msgctxt "field:sale.sale,moves:"
 msgid "Moves"
 msgstr "Movimientos"
 
+msgctxt "field:sale.sale,number:"
+msgid "Number"
+msgstr ""
+
 msgctxt "field:sale.sale,origin:"
 msgid "Origin"
 msgstr "Origen"
@@ -582,10 +600,6 @@ msgctxt "field:stock.move,sale_exception_state:"
 msgid "Exception State"
 msgstr "Estado excepción"
 
-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."
@@ -747,59 +761,64 @@ msgctxt "model:sale.sale-recreated-account.invoice,name:"
 msgid "Sale - Recreated Invoice"
 msgstr "Venta - Factura recreada"
 
-msgctxt "odt:sale.sale:"
+msgctxt "report:sale.sale:"
 msgid "Amount"
 msgstr "Importe"
 
-msgctxt "odt:sale.sale:"
+msgctxt "report:sale.sale:"
 msgid "Date:"
 msgstr "Fecha:"
 
-msgctxt "odt:sale.sale:"
+msgctxt "report:sale.sale:"
 msgid "Description"
 msgstr "Descripción"
 
-msgctxt "odt:sale.sale:"
+msgctxt "report:sale.sale:"
 msgid "Description:"
 msgstr "Descripción:"
 
-msgctxt "odt:sale.sale:"
+msgctxt "report:sale.sale:"
 msgid "Draft Sale Order"
 msgstr "Ventas borrador"
 
-msgctxt "odt:sale.sale:"
+msgctxt "report:sale.sale:"
 msgid "Quantity"
 msgstr "Cantidad"
 
-msgctxt "odt:sale.sale:"
+msgctxt "report:sale.sale:"
 msgid "Quotation N°:"
 msgstr "Presupuesto Nº:"
 
-msgctxt "odt:sale.sale:"
+#, fuzzy
+msgctxt "report:sale.sale:"
+msgid "Reference:"
+msgstr "Referencia"
+
+msgctxt "report:sale.sale:"
 msgid "Sale Order N°:"
 msgstr "Venta Nº:"
 
-msgctxt "odt:sale.sale:"
+msgctxt "report:sale.sale:"
 msgid "Taxes"
 msgstr "Impuestos"
 
-msgctxt "odt:sale.sale:"
+msgctxt "report:sale.sale:"
 msgid "Taxes:"
 msgstr "Impuestos:"
 
-msgctxt "odt:sale.sale:"
+msgctxt "report:sale.sale:"
 msgid "Total (excl. taxes):"
 msgstr "Base imponible:"
 
-msgctxt "odt:sale.sale:"
+msgctxt "report:sale.sale:"
 msgid "Total:"
 msgstr "Total:"
 
-msgctxt "odt:sale.sale:"
+msgctxt "report:sale.sale:"
 msgid "Unit Price"
 msgstr "Precio unidad"
 
-msgctxt "odt:sale.sale:"
+msgctxt "report:sale.sale:"
 msgid "VAT:"
 msgstr "CIF/NIF:"
 
diff --git a/locale/es_MX.po b/locale/es_MX.po
index 968b24b..ab56fd3 100644
--- a/locale/es_MX.po
+++ b/locale/es_MX.po
@@ -66,9 +66,23 @@ msgctxt "field:account.invoice,sales:"
 msgid "Sales"
 msgstr "Ventas"
 
-msgctxt "field:product.template,delivery_time:"
-msgid "Delivery Time"
-msgstr "Plazo de entrega"
+msgctxt "field:product.product,lead_time:"
+msgid "Lead Time"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:product.product,salable:"
+msgid "Salable"
+msgstr "Puede ser vendido"
+
+#, fuzzy
+msgctxt "field:product.product,sale_uom:"
+msgid "Sale UOM"
+msgstr "UdM de venta"
+
+msgctxt "field:product.template,lead_time:"
+msgid "Lead Time"
+msgstr ""
 
 msgctxt "field:product.template,salable:"
 msgid "Salable"
@@ -99,8 +113,8 @@ msgid "Sale Invoice Method"
 msgstr "Método de facturación"
 
 msgctxt "field:sale.configuration,sale_sequence:"
-msgid "Sale Reference Sequence"
-msgstr "Secuencia de pedidos de venta"
+msgid "Sale Sequence"
+msgstr ""
 
 msgctxt "field:sale.configuration,sale_shipment_method:"
 msgid "Sale Shipment Method"
@@ -150,10 +164,6 @@ 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"
@@ -218,6 +228,10 @@ msgctxt "field:sale.line,sequence:"
 msgid "Sequence"
 msgstr "Secuencia"
 
+msgctxt "field:sale.line,shipping_date:"
+msgid "Shipping Date"
+msgstr ""
+
 msgctxt "field:sale.line,taxes:"
 msgid "Taxes"
 msgstr "Impuestos"
@@ -418,6 +432,10 @@ msgctxt "field:sale.sale,moves:"
 msgid "Moves"
 msgstr "Movimientos"
 
+msgctxt "field:sale.sale,number:"
+msgid "Number"
+msgstr ""
+
 msgctxt "field:sale.sale,origin:"
 msgid "Origin"
 msgstr "Origen"
@@ -582,10 +600,6 @@ msgctxt "field:stock.move,sale_exception_state:"
 msgid "Exception State"
 msgstr "Estado excepción"
 
-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."
@@ -747,59 +761,72 @@ msgctxt "model:sale.sale-recreated-account.invoice,name:"
 msgid "Sale - Recreated Invoice"
 msgstr "Venta - Factura recreada"
 
-msgctxt "odt:sale.sale:"
+#, fuzzy
+msgctxt "report:sale.sale:"
 msgid "Amount"
-msgstr ""
+msgstr "Importe"
 
-msgctxt "odt:sale.sale:"
+msgctxt "report:sale.sale:"
 msgid "Date:"
 msgstr ""
 
-msgctxt "odt:sale.sale:"
+#, fuzzy
+msgctxt "report:sale.sale:"
 msgid "Description"
-msgstr ""
+msgstr "Descripción"
 
-msgctxt "odt:sale.sale:"
+#, fuzzy
+msgctxt "report:sale.sale:"
 msgid "Description:"
-msgstr ""
+msgstr "Descripción"
 
-msgctxt "odt:sale.sale:"
+msgctxt "report:sale.sale:"
 msgid "Draft Sale Order"
 msgstr ""
 
-msgctxt "odt:sale.sale:"
+#, fuzzy
+msgctxt "report:sale.sale:"
 msgid "Quantity"
-msgstr ""
+msgstr "Cantidad"
 
-msgctxt "odt:sale.sale:"
+msgctxt "report:sale.sale:"
 msgid "Quotation N°:"
 msgstr ""
 
-msgctxt "odt:sale.sale:"
+#, fuzzy
+msgctxt "report:sale.sale:"
+msgid "Reference:"
+msgstr "Referencia"
+
+msgctxt "report:sale.sale:"
 msgid "Sale Order N°:"
 msgstr ""
 
-msgctxt "odt:sale.sale:"
+#, fuzzy
+msgctxt "report:sale.sale:"
 msgid "Taxes"
-msgstr ""
+msgstr "Impuestos"
 
-msgctxt "odt:sale.sale:"
+#, fuzzy
+msgctxt "report:sale.sale:"
 msgid "Taxes:"
-msgstr ""
+msgstr "Impuestos"
 
-msgctxt "odt:sale.sale:"
+msgctxt "report:sale.sale:"
 msgid "Total (excl. taxes):"
 msgstr ""
 
-msgctxt "odt:sale.sale:"
+#, fuzzy
+msgctxt "report:sale.sale:"
 msgid "Total:"
-msgstr ""
+msgstr "Total"
 
-msgctxt "odt:sale.sale:"
+#, fuzzy
+msgctxt "report:sale.sale:"
 msgid "Unit Price"
-msgstr ""
+msgstr "Precio unidad"
 
-msgctxt "odt:sale.sale:"
+msgctxt "report:sale.sale:"
 msgid "VAT:"
 msgstr ""
 
@@ -947,85 +974,100 @@ msgctxt "selection:stock.move,sale_exception_state:"
 msgid "Recreated"
 msgstr "Recreado"
 
+#, fuzzy
 msgctxt "view:party.party:"
 msgid "Sale"
-msgstr ""
+msgstr "Venta"
 
+#, fuzzy
 msgctxt "view:product.product:"
 msgid "Products"
-msgstr ""
+msgstr "Producto"
 
 msgctxt "view:product.template:"
 msgid "Customers"
 msgstr ""
 
+#, fuzzy
 msgctxt "view:sale.configuration:"
 msgid "Sale Configuration"
-msgstr ""
+msgstr "Configuración ventas"
 
 msgctxt "view:sale.handle.invoice.exception.ask:"
 msgid "Choose invoices to recreate"
 msgstr ""
 
+#, fuzzy
 msgctxt "view:sale.handle.invoice.exception.ask:"
 msgid "Handle Invoice Exception"
-msgstr ""
+msgstr "Gestionar excepción de factura"
 
 msgctxt "view:sale.handle.shipment.exception.ask:"
 msgid "Choose move to recreate"
 msgstr ""
 
+#, fuzzy
 msgctxt "view:sale.handle.shipment.exception.ask:"
 msgid "Handle shipment Exception"
-msgstr ""
+msgstr "Gestionar excepción de envío"
 
 msgctxt "view:sale.line:"
 msgid "General"
 msgstr ""
 
+#, fuzzy
 msgctxt "view:sale.line:"
 msgid "Notes"
-msgstr ""
+msgstr "Nota"
 
+#, fuzzy
 msgctxt "view:sale.line:"
 msgid "Sale Line"
-msgstr ""
+msgstr "Línea de venta"
 
+#, fuzzy
 msgctxt "view:sale.line:"
 msgid "Sale Lines"
-msgstr ""
+msgstr "Línea de venta"
 
+#, fuzzy
 msgctxt "view:sale.line:"
 msgid "Taxes"
-msgstr ""
+msgstr "Impuestos"
 
 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 ""
+msgstr "Devolución venta"
 
+#, fuzzy
 msgctxt "view:sale.sale:"
 msgid "Cancel"
-msgstr ""
+msgstr "Cancelar"
 
+#, fuzzy
 msgctxt "view:sale.sale:"
 msgid "Confirm"
-msgstr ""
+msgstr "Confirmada"
 
+#, fuzzy
 msgctxt "view:sale.sale:"
 msgid "Draft"
-msgstr ""
+msgstr "Borrador"
 
+#, fuzzy
 msgctxt "view:sale.sale:"
 msgid "Handle Invoice Exception"
-msgstr ""
+msgstr "Gestionar excepción de factura"
 
+#, fuzzy
 msgctxt "view:sale.sale:"
 msgid "Handle Shipment Exception"
-msgstr ""
+msgstr "Gestionar excepción de envío"
 
 msgctxt "view:sale.sale:"
 msgid "Other Info"
@@ -1039,17 +1081,20 @@ msgctxt "view:sale.sale:"
 msgid "Quote"
 msgstr ""
 
+#, fuzzy
 msgctxt "view:sale.sale:"
 msgid "Sale"
-msgstr ""
+msgstr "Venta"
 
+#, fuzzy
 msgctxt "view:sale.sale:"
 msgid "Sales"
-msgstr ""
+msgstr "Ventas"
 
+#, fuzzy
 msgctxt "view:stock.move:"
 msgid "Moves"
-msgstr ""
+msgstr "Movimientos"
 
 msgctxt "wizard_button:sale.handle.invoice.exception,ask,end:"
 msgid "Cancel"
diff --git a/locale/fr_FR.po b/locale/fr_FR.po
index fc4eb2b..f362660 100644
--- a/locale/fr_FR.po
+++ b/locale/fr_FR.po
@@ -65,9 +65,23 @@ msgctxt "field:account.invoice,sales:"
 msgid "Sales"
 msgstr "Ventes"
 
-msgctxt "field:product.template,delivery_time:"
-msgid "Delivery Time"
-msgstr "Délai de livraison"
+msgctxt "field:product.product,lead_time:"
+msgid "Lead Time"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:product.product,salable:"
+msgid "Salable"
+msgstr "Vendable"
+
+#, fuzzy
+msgctxt "field:product.product,sale_uom:"
+msgid "Sale UOM"
+msgstr "UDM de vente"
+
+msgctxt "field:product.template,lead_time:"
+msgid "Lead Time"
+msgstr ""
 
 msgctxt "field:product.template,salable:"
 msgid "Salable"
@@ -98,8 +112,8 @@ msgid "Sale Invoice Method"
 msgstr "Méthod de facturation"
 
 msgctxt "field:sale.configuration,sale_sequence:"
-msgid "Sale Reference Sequence"
-msgstr "Séquence de référence de vente"
+msgid "Sale Sequence"
+msgstr ""
 
 msgctxt "field:sale.configuration,sale_shipment_method:"
 msgid "Sale Shipment Method"
@@ -149,10 +163,6 @@ 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"
@@ -217,6 +227,10 @@ msgctxt "field:sale.line,sequence:"
 msgid "Sequence"
 msgstr "Séquence"
 
+msgctxt "field:sale.line,shipping_date:"
+msgid "Shipping Date"
+msgstr ""
+
 msgctxt "field:sale.line,taxes:"
 msgid "Taxes"
 msgstr "Taxes"
@@ -417,6 +431,10 @@ msgctxt "field:sale.sale,moves:"
 msgid "Moves"
 msgstr "Mouvements"
 
+msgctxt "field:sale.sale,number:"
+msgid "Number"
+msgstr ""
+
 msgctxt "field:sale.sale,origin:"
 msgid "Origin"
 msgstr "Origine"
@@ -581,10 +599,6 @@ msgctxt "field:stock.move,sale_exception_state:"
 msgid "Exception State"
 msgstr "État d'exception"
 
-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:"
 msgid ""
 "The selected invoices will be recreated. The other ones will be ignored."
@@ -746,59 +760,64 @@ msgctxt "model:sale.sale-recreated-account.invoice,name:"
 msgid "Sale - Recreated Invoice"
 msgstr "Vente - Facture recréée"
 
-msgctxt "odt:sale.sale:"
+msgctxt "report:sale.sale:"
 msgid "Amount"
 msgstr "Montant"
 
-msgctxt "odt:sale.sale:"
+msgctxt "report:sale.sale:"
 msgid "Date:"
 msgstr "Date :"
 
-msgctxt "odt:sale.sale:"
+msgctxt "report:sale.sale:"
 msgid "Description"
 msgstr "Description"
 
-msgctxt "odt:sale.sale:"
+msgctxt "report:sale.sale:"
 msgid "Description:"
 msgstr "Description :"
 
-msgctxt "odt:sale.sale:"
+msgctxt "report:sale.sale:"
 msgid "Draft Sale Order"
 msgstr "Bon de commande brouillon"
 
-msgctxt "odt:sale.sale:"
+msgctxt "report:sale.sale:"
 msgid "Quantity"
 msgstr "Quantité"
 
-msgctxt "odt:sale.sale:"
+msgctxt "report:sale.sale:"
 msgid "Quotation N°:"
 msgstr "Devis N° :"
 
-msgctxt "odt:sale.sale:"
+#, fuzzy
+msgctxt "report:sale.sale:"
+msgid "Reference:"
+msgstr "Référence"
+
+msgctxt "report:sale.sale:"
 msgid "Sale Order N°:"
 msgstr "Bon de commande N° :"
 
-msgctxt "odt:sale.sale:"
+msgctxt "report:sale.sale:"
 msgid "Taxes"
 msgstr "Taxes"
 
-msgctxt "odt:sale.sale:"
+msgctxt "report:sale.sale:"
 msgid "Taxes:"
 msgstr "Taxes :"
 
-msgctxt "odt:sale.sale:"
+msgctxt "report:sale.sale:"
 msgid "Total (excl. taxes):"
 msgstr "Total (hors taxes) :"
 
-msgctxt "odt:sale.sale:"
+msgctxt "report:sale.sale:"
 msgid "Total:"
 msgstr "Total :"
 
-msgctxt "odt:sale.sale:"
+msgctxt "report:sale.sale:"
 msgid "Unit Price"
 msgstr "Prix unitaire"
 
-msgctxt "odt:sale.sale:"
+msgctxt "report:sale.sale:"
 msgid "VAT:"
 msgstr "TVA :"
 
diff --git a/locale/hu_HU.po b/locale/hu_HU.po
index 2b6e79f..225cdec 100644
--- a/locale/hu_HU.po
+++ b/locale/hu_HU.po
@@ -56,8 +56,20 @@ msgctxt "field:account.invoice,sales:"
 msgid "Sales"
 msgstr ""
 
-msgctxt "field:product.template,delivery_time:"
-msgid "Delivery Time"
+msgctxt "field:product.product,lead_time:"
+msgid "Lead Time"
+msgstr ""
+
+msgctxt "field:product.product,salable:"
+msgid "Salable"
+msgstr ""
+
+msgctxt "field:product.product,sale_uom:"
+msgid "Sale UOM"
+msgstr ""
+
+msgctxt "field:product.template,lead_time:"
+msgid "Lead Time"
 msgstr ""
 
 msgctxt "field:product.template,salable:"
@@ -89,7 +101,7 @@ msgid "Sale Invoice Method"
 msgstr ""
 
 msgctxt "field:sale.configuration,sale_sequence:"
-msgid "Sale Reference Sequence"
+msgid "Sale Sequence"
 msgstr ""
 
 msgctxt "field:sale.configuration,sale_shipment_method:"
@@ -140,10 +152,6 @@ 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 ""
@@ -208,6 +216,10 @@ msgctxt "field:sale.line,sequence:"
 msgid "Sequence"
 msgstr ""
 
+msgctxt "field:sale.line,shipping_date:"
+msgid "Shipping Date"
+msgstr ""
+
 msgctxt "field:sale.line,taxes:"
 msgid "Taxes"
 msgstr ""
@@ -408,6 +420,10 @@ msgctxt "field:sale.sale,moves:"
 msgid "Moves"
 msgstr ""
 
+msgctxt "field:sale.sale,number:"
+msgid "Number"
+msgstr ""
+
 msgctxt "field:sale.sale,origin:"
 msgid "Origin"
 msgstr ""
@@ -572,10 +588,6 @@ msgctxt "field:stock.move,sale_exception_state:"
 msgid "Exception State"
 msgstr ""
 
-msgctxt "help:product.template,delivery_time:"
-msgid "In number of days"
-msgstr ""
-
 msgctxt "help:sale.handle.invoice.exception.ask,recreate_invoices:"
 msgid ""
 "The selected invoices will be recreated. The other ones will be ignored."
@@ -736,59 +748,63 @@ msgctxt "model:sale.sale-recreated-account.invoice,name:"
 msgid "Sale - Recreated Invoice"
 msgstr ""
 
-msgctxt "odt:sale.sale:"
+msgctxt "report:sale.sale:"
 msgid "Amount"
 msgstr ""
 
-msgctxt "odt:sale.sale:"
+msgctxt "report:sale.sale:"
 msgid "Date:"
 msgstr ""
 
-msgctxt "odt:sale.sale:"
+msgctxt "report:sale.sale:"
 msgid "Description"
 msgstr ""
 
-msgctxt "odt:sale.sale:"
+msgctxt "report:sale.sale:"
 msgid "Description:"
 msgstr ""
 
-msgctxt "odt:sale.sale:"
+msgctxt "report:sale.sale:"
 msgid "Draft Sale Order"
 msgstr ""
 
-msgctxt "odt:sale.sale:"
+msgctxt "report:sale.sale:"
 msgid "Quantity"
 msgstr ""
 
-msgctxt "odt:sale.sale:"
+msgctxt "report:sale.sale:"
 msgid "Quotation N°:"
 msgstr ""
 
-msgctxt "odt:sale.sale:"
+msgctxt "report:sale.sale:"
+msgid "Reference:"
+msgstr ""
+
+msgctxt "report:sale.sale:"
 msgid "Sale Order N°:"
 msgstr ""
 
-msgctxt "odt:sale.sale:"
+msgctxt "report:sale.sale:"
 msgid "Taxes"
 msgstr ""
 
-msgctxt "odt:sale.sale:"
+msgctxt "report:sale.sale:"
 msgid "Taxes:"
 msgstr ""
 
-msgctxt "odt:sale.sale:"
+msgctxt "report:sale.sale:"
 msgid "Total (excl. taxes):"
 msgstr ""
 
-msgctxt "odt:sale.sale:"
+msgctxt "report:sale.sale:"
 msgid "Total:"
 msgstr ""
 
-msgctxt "odt:sale.sale:"
+msgctxt "report:sale.sale:"
 msgid "Unit Price"
 msgstr ""
 
-msgctxt "odt:sale.sale:"
+msgctxt "report:sale.sale:"
 msgid "VAT:"
 msgstr ""
 
diff --git a/locale/it_IT.po b/locale/it_IT.po
index 2b6e79f..225cdec 100644
--- a/locale/it_IT.po
+++ b/locale/it_IT.po
@@ -56,8 +56,20 @@ msgctxt "field:account.invoice,sales:"
 msgid "Sales"
 msgstr ""
 
-msgctxt "field:product.template,delivery_time:"
-msgid "Delivery Time"
+msgctxt "field:product.product,lead_time:"
+msgid "Lead Time"
+msgstr ""
+
+msgctxt "field:product.product,salable:"
+msgid "Salable"
+msgstr ""
+
+msgctxt "field:product.product,sale_uom:"
+msgid "Sale UOM"
+msgstr ""
+
+msgctxt "field:product.template,lead_time:"
+msgid "Lead Time"
 msgstr ""
 
 msgctxt "field:product.template,salable:"
@@ -89,7 +101,7 @@ msgid "Sale Invoice Method"
 msgstr ""
 
 msgctxt "field:sale.configuration,sale_sequence:"
-msgid "Sale Reference Sequence"
+msgid "Sale Sequence"
 msgstr ""
 
 msgctxt "field:sale.configuration,sale_shipment_method:"
@@ -140,10 +152,6 @@ 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 ""
@@ -208,6 +216,10 @@ msgctxt "field:sale.line,sequence:"
 msgid "Sequence"
 msgstr ""
 
+msgctxt "field:sale.line,shipping_date:"
+msgid "Shipping Date"
+msgstr ""
+
 msgctxt "field:sale.line,taxes:"
 msgid "Taxes"
 msgstr ""
@@ -408,6 +420,10 @@ msgctxt "field:sale.sale,moves:"
 msgid "Moves"
 msgstr ""
 
+msgctxt "field:sale.sale,number:"
+msgid "Number"
+msgstr ""
+
 msgctxt "field:sale.sale,origin:"
 msgid "Origin"
 msgstr ""
@@ -572,10 +588,6 @@ msgctxt "field:stock.move,sale_exception_state:"
 msgid "Exception State"
 msgstr ""
 
-msgctxt "help:product.template,delivery_time:"
-msgid "In number of days"
-msgstr ""
-
 msgctxt "help:sale.handle.invoice.exception.ask,recreate_invoices:"
 msgid ""
 "The selected invoices will be recreated. The other ones will be ignored."
@@ -736,59 +748,63 @@ msgctxt "model:sale.sale-recreated-account.invoice,name:"
 msgid "Sale - Recreated Invoice"
 msgstr ""
 
-msgctxt "odt:sale.sale:"
+msgctxt "report:sale.sale:"
 msgid "Amount"
 msgstr ""
 
-msgctxt "odt:sale.sale:"
+msgctxt "report:sale.sale:"
 msgid "Date:"
 msgstr ""
 
-msgctxt "odt:sale.sale:"
+msgctxt "report:sale.sale:"
 msgid "Description"
 msgstr ""
 
-msgctxt "odt:sale.sale:"
+msgctxt "report:sale.sale:"
 msgid "Description:"
 msgstr ""
 
-msgctxt "odt:sale.sale:"
+msgctxt "report:sale.sale:"
 msgid "Draft Sale Order"
 msgstr ""
 
-msgctxt "odt:sale.sale:"
+msgctxt "report:sale.sale:"
 msgid "Quantity"
 msgstr ""
 
-msgctxt "odt:sale.sale:"
+msgctxt "report:sale.sale:"
 msgid "Quotation N°:"
 msgstr ""
 
-msgctxt "odt:sale.sale:"
+msgctxt "report:sale.sale:"
+msgid "Reference:"
+msgstr ""
+
+msgctxt "report:sale.sale:"
 msgid "Sale Order N°:"
 msgstr ""
 
-msgctxt "odt:sale.sale:"
+msgctxt "report:sale.sale:"
 msgid "Taxes"
 msgstr ""
 
-msgctxt "odt:sale.sale:"
+msgctxt "report:sale.sale:"
 msgid "Taxes:"
 msgstr ""
 
-msgctxt "odt:sale.sale:"
+msgctxt "report:sale.sale:"
 msgid "Total (excl. taxes):"
 msgstr ""
 
-msgctxt "odt:sale.sale:"
+msgctxt "report:sale.sale:"
 msgid "Total:"
 msgstr ""
 
-msgctxt "odt:sale.sale:"
+msgctxt "report:sale.sale:"
 msgid "Unit Price"
 msgstr ""
 
-msgctxt "odt:sale.sale:"
+msgctxt "report:sale.sale:"
 msgid "VAT:"
 msgstr ""
 
diff --git a/locale/ja_JP.po b/locale/ja_JP.po
index 2b6e79f..225cdec 100644
--- a/locale/ja_JP.po
+++ b/locale/ja_JP.po
@@ -56,8 +56,20 @@ msgctxt "field:account.invoice,sales:"
 msgid "Sales"
 msgstr ""
 
-msgctxt "field:product.template,delivery_time:"
-msgid "Delivery Time"
+msgctxt "field:product.product,lead_time:"
+msgid "Lead Time"
+msgstr ""
+
+msgctxt "field:product.product,salable:"
+msgid "Salable"
+msgstr ""
+
+msgctxt "field:product.product,sale_uom:"
+msgid "Sale UOM"
+msgstr ""
+
+msgctxt "field:product.template,lead_time:"
+msgid "Lead Time"
 msgstr ""
 
 msgctxt "field:product.template,salable:"
@@ -89,7 +101,7 @@ msgid "Sale Invoice Method"
 msgstr ""
 
 msgctxt "field:sale.configuration,sale_sequence:"
-msgid "Sale Reference Sequence"
+msgid "Sale Sequence"
 msgstr ""
 
 msgctxt "field:sale.configuration,sale_shipment_method:"
@@ -140,10 +152,6 @@ 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 ""
@@ -208,6 +216,10 @@ msgctxt "field:sale.line,sequence:"
 msgid "Sequence"
 msgstr ""
 
+msgctxt "field:sale.line,shipping_date:"
+msgid "Shipping Date"
+msgstr ""
+
 msgctxt "field:sale.line,taxes:"
 msgid "Taxes"
 msgstr ""
@@ -408,6 +420,10 @@ msgctxt "field:sale.sale,moves:"
 msgid "Moves"
 msgstr ""
 
+msgctxt "field:sale.sale,number:"
+msgid "Number"
+msgstr ""
+
 msgctxt "field:sale.sale,origin:"
 msgid "Origin"
 msgstr ""
@@ -572,10 +588,6 @@ msgctxt "field:stock.move,sale_exception_state:"
 msgid "Exception State"
 msgstr ""
 
-msgctxt "help:product.template,delivery_time:"
-msgid "In number of days"
-msgstr ""
-
 msgctxt "help:sale.handle.invoice.exception.ask,recreate_invoices:"
 msgid ""
 "The selected invoices will be recreated. The other ones will be ignored."
@@ -736,59 +748,63 @@ msgctxt "model:sale.sale-recreated-account.invoice,name:"
 msgid "Sale - Recreated Invoice"
 msgstr ""
 
-msgctxt "odt:sale.sale:"
+msgctxt "report:sale.sale:"
 msgid "Amount"
 msgstr ""
 
-msgctxt "odt:sale.sale:"
+msgctxt "report:sale.sale:"
 msgid "Date:"
 msgstr ""
 
-msgctxt "odt:sale.sale:"
+msgctxt "report:sale.sale:"
 msgid "Description"
 msgstr ""
 
-msgctxt "odt:sale.sale:"
+msgctxt "report:sale.sale:"
 msgid "Description:"
 msgstr ""
 
-msgctxt "odt:sale.sale:"
+msgctxt "report:sale.sale:"
 msgid "Draft Sale Order"
 msgstr ""
 
-msgctxt "odt:sale.sale:"
+msgctxt "report:sale.sale:"
 msgid "Quantity"
 msgstr ""
 
-msgctxt "odt:sale.sale:"
+msgctxt "report:sale.sale:"
 msgid "Quotation N°:"
 msgstr ""
 
-msgctxt "odt:sale.sale:"
+msgctxt "report:sale.sale:"
+msgid "Reference:"
+msgstr ""
+
+msgctxt "report:sale.sale:"
 msgid "Sale Order N°:"
 msgstr ""
 
-msgctxt "odt:sale.sale:"
+msgctxt "report:sale.sale:"
 msgid "Taxes"
 msgstr ""
 
-msgctxt "odt:sale.sale:"
+msgctxt "report:sale.sale:"
 msgid "Taxes:"
 msgstr ""
 
-msgctxt "odt:sale.sale:"
+msgctxt "report:sale.sale:"
 msgid "Total (excl. taxes):"
 msgstr ""
 
-msgctxt "odt:sale.sale:"
+msgctxt "report:sale.sale:"
 msgid "Total:"
 msgstr ""
 
-msgctxt "odt:sale.sale:"
+msgctxt "report:sale.sale:"
 msgid "Unit Price"
 msgstr ""
 
-msgctxt "odt:sale.sale:"
+msgctxt "report:sale.sale:"
 msgid "VAT:"
 msgstr ""
 
diff --git a/locale/ja_JP.po b/locale/lo_LA.po
similarity index 95%
copy from locale/ja_JP.po
copy to locale/lo_LA.po
index 2b6e79f..225cdec 100644
--- a/locale/ja_JP.po
+++ b/locale/lo_LA.po
@@ -56,8 +56,20 @@ msgctxt "field:account.invoice,sales:"
 msgid "Sales"
 msgstr ""
 
-msgctxt "field:product.template,delivery_time:"
-msgid "Delivery Time"
+msgctxt "field:product.product,lead_time:"
+msgid "Lead Time"
+msgstr ""
+
+msgctxt "field:product.product,salable:"
+msgid "Salable"
+msgstr ""
+
+msgctxt "field:product.product,sale_uom:"
+msgid "Sale UOM"
+msgstr ""
+
+msgctxt "field:product.template,lead_time:"
+msgid "Lead Time"
 msgstr ""
 
 msgctxt "field:product.template,salable:"
@@ -89,7 +101,7 @@ msgid "Sale Invoice Method"
 msgstr ""
 
 msgctxt "field:sale.configuration,sale_sequence:"
-msgid "Sale Reference Sequence"
+msgid "Sale Sequence"
 msgstr ""
 
 msgctxt "field:sale.configuration,sale_shipment_method:"
@@ -140,10 +152,6 @@ 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 ""
@@ -208,6 +216,10 @@ msgctxt "field:sale.line,sequence:"
 msgid "Sequence"
 msgstr ""
 
+msgctxt "field:sale.line,shipping_date:"
+msgid "Shipping Date"
+msgstr ""
+
 msgctxt "field:sale.line,taxes:"
 msgid "Taxes"
 msgstr ""
@@ -408,6 +420,10 @@ msgctxt "field:sale.sale,moves:"
 msgid "Moves"
 msgstr ""
 
+msgctxt "field:sale.sale,number:"
+msgid "Number"
+msgstr ""
+
 msgctxt "field:sale.sale,origin:"
 msgid "Origin"
 msgstr ""
@@ -572,10 +588,6 @@ msgctxt "field:stock.move,sale_exception_state:"
 msgid "Exception State"
 msgstr ""
 
-msgctxt "help:product.template,delivery_time:"
-msgid "In number of days"
-msgstr ""
-
 msgctxt "help:sale.handle.invoice.exception.ask,recreate_invoices:"
 msgid ""
 "The selected invoices will be recreated. The other ones will be ignored."
@@ -736,59 +748,63 @@ msgctxt "model:sale.sale-recreated-account.invoice,name:"
 msgid "Sale - Recreated Invoice"
 msgstr ""
 
-msgctxt "odt:sale.sale:"
+msgctxt "report:sale.sale:"
 msgid "Amount"
 msgstr ""
 
-msgctxt "odt:sale.sale:"
+msgctxt "report:sale.sale:"
 msgid "Date:"
 msgstr ""
 
-msgctxt "odt:sale.sale:"
+msgctxt "report:sale.sale:"
 msgid "Description"
 msgstr ""
 
-msgctxt "odt:sale.sale:"
+msgctxt "report:sale.sale:"
 msgid "Description:"
 msgstr ""
 
-msgctxt "odt:sale.sale:"
+msgctxt "report:sale.sale:"
 msgid "Draft Sale Order"
 msgstr ""
 
-msgctxt "odt:sale.sale:"
+msgctxt "report:sale.sale:"
 msgid "Quantity"
 msgstr ""
 
-msgctxt "odt:sale.sale:"
+msgctxt "report:sale.sale:"
 msgid "Quotation N°:"
 msgstr ""
 
-msgctxt "odt:sale.sale:"
+msgctxt "report:sale.sale:"
+msgid "Reference:"
+msgstr ""
+
+msgctxt "report:sale.sale:"
 msgid "Sale Order N°:"
 msgstr ""
 
-msgctxt "odt:sale.sale:"
+msgctxt "report:sale.sale:"
 msgid "Taxes"
 msgstr ""
 
-msgctxt "odt:sale.sale:"
+msgctxt "report:sale.sale:"
 msgid "Taxes:"
 msgstr ""
 
-msgctxt "odt:sale.sale:"
+msgctxt "report:sale.sale:"
 msgid "Total (excl. taxes):"
 msgstr ""
 
-msgctxt "odt:sale.sale:"
+msgctxt "report:sale.sale:"
 msgid "Total:"
 msgstr ""
 
-msgctxt "odt:sale.sale:"
+msgctxt "report:sale.sale:"
 msgid "Unit Price"
 msgstr ""
 
-msgctxt "odt:sale.sale:"
+msgctxt "report:sale.sale:"
 msgid "VAT:"
 msgstr ""
 
diff --git a/locale/lt_LT.po b/locale/lt_LT.po
index 2b6e79f..225cdec 100644
--- a/locale/lt_LT.po
+++ b/locale/lt_LT.po
@@ -56,8 +56,20 @@ msgctxt "field:account.invoice,sales:"
 msgid "Sales"
 msgstr ""
 
-msgctxt "field:product.template,delivery_time:"
-msgid "Delivery Time"
+msgctxt "field:product.product,lead_time:"
+msgid "Lead Time"
+msgstr ""
+
+msgctxt "field:product.product,salable:"
+msgid "Salable"
+msgstr ""
+
+msgctxt "field:product.product,sale_uom:"
+msgid "Sale UOM"
+msgstr ""
+
+msgctxt "field:product.template,lead_time:"
+msgid "Lead Time"
 msgstr ""
 
 msgctxt "field:product.template,salable:"
@@ -89,7 +101,7 @@ msgid "Sale Invoice Method"
 msgstr ""
 
 msgctxt "field:sale.configuration,sale_sequence:"
-msgid "Sale Reference Sequence"
+msgid "Sale Sequence"
 msgstr ""
 
 msgctxt "field:sale.configuration,sale_shipment_method:"
@@ -140,10 +152,6 @@ 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 ""
@@ -208,6 +216,10 @@ msgctxt "field:sale.line,sequence:"
 msgid "Sequence"
 msgstr ""
 
+msgctxt "field:sale.line,shipping_date:"
+msgid "Shipping Date"
+msgstr ""
+
 msgctxt "field:sale.line,taxes:"
 msgid "Taxes"
 msgstr ""
@@ -408,6 +420,10 @@ msgctxt "field:sale.sale,moves:"
 msgid "Moves"
 msgstr ""
 
+msgctxt "field:sale.sale,number:"
+msgid "Number"
+msgstr ""
+
 msgctxt "field:sale.sale,origin:"
 msgid "Origin"
 msgstr ""
@@ -572,10 +588,6 @@ msgctxt "field:stock.move,sale_exception_state:"
 msgid "Exception State"
 msgstr ""
 
-msgctxt "help:product.template,delivery_time:"
-msgid "In number of days"
-msgstr ""
-
 msgctxt "help:sale.handle.invoice.exception.ask,recreate_invoices:"
 msgid ""
 "The selected invoices will be recreated. The other ones will be ignored."
@@ -736,59 +748,63 @@ msgctxt "model:sale.sale-recreated-account.invoice,name:"
 msgid "Sale - Recreated Invoice"
 msgstr ""
 
-msgctxt "odt:sale.sale:"
+msgctxt "report:sale.sale:"
 msgid "Amount"
 msgstr ""
 
-msgctxt "odt:sale.sale:"
+msgctxt "report:sale.sale:"
 msgid "Date:"
 msgstr ""
 
-msgctxt "odt:sale.sale:"
+msgctxt "report:sale.sale:"
 msgid "Description"
 msgstr ""
 
-msgctxt "odt:sale.sale:"
+msgctxt "report:sale.sale:"
 msgid "Description:"
 msgstr ""
 
-msgctxt "odt:sale.sale:"
+msgctxt "report:sale.sale:"
 msgid "Draft Sale Order"
 msgstr ""
 
-msgctxt "odt:sale.sale:"
+msgctxt "report:sale.sale:"
 msgid "Quantity"
 msgstr ""
 
-msgctxt "odt:sale.sale:"
+msgctxt "report:sale.sale:"
 msgid "Quotation N°:"
 msgstr ""
 
-msgctxt "odt:sale.sale:"
+msgctxt "report:sale.sale:"
+msgid "Reference:"
+msgstr ""
+
+msgctxt "report:sale.sale:"
 msgid "Sale Order N°:"
 msgstr ""
 
-msgctxt "odt:sale.sale:"
+msgctxt "report:sale.sale:"
 msgid "Taxes"
 msgstr ""
 
-msgctxt "odt:sale.sale:"
+msgctxt "report:sale.sale:"
 msgid "Taxes:"
 msgstr ""
 
-msgctxt "odt:sale.sale:"
+msgctxt "report:sale.sale:"
 msgid "Total (excl. taxes):"
 msgstr ""
 
-msgctxt "odt:sale.sale:"
+msgctxt "report:sale.sale:"
 msgid "Total:"
 msgstr ""
 
-msgctxt "odt:sale.sale:"
+msgctxt "report:sale.sale:"
 msgid "Unit Price"
 msgstr ""
 
-msgctxt "odt:sale.sale:"
+msgctxt "report:sale.sale:"
 msgid "VAT:"
 msgstr ""
 
diff --git a/locale/nl_NL.po b/locale/nl_NL.po
index a210a1e..caebb08 100644
--- a/locale/nl_NL.po
+++ b/locale/nl_NL.po
@@ -61,8 +61,22 @@ msgctxt "field:account.invoice,sales:"
 msgid "Sales"
 msgstr "Verkoopbeheer"
 
-msgctxt "field:product.template,delivery_time:"
-msgid "Delivery Time"
+msgctxt "field:product.product,lead_time:"
+msgid "Lead Time"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:product.product,salable:"
+msgid "Salable"
+msgstr "Verkoopbaar"
+
+#, fuzzy
+msgctxt "field:product.product,sale_uom:"
+msgid "Sale UOM"
+msgstr "Maateenheid verkoop"
+
+msgctxt "field:product.template,lead_time:"
+msgid "Lead Time"
 msgstr ""
 
 msgctxt "field:product.template,salable:"
@@ -94,12 +108,13 @@ msgid "Sale Invoice Method"
 msgstr ""
 
 msgctxt "field:sale.configuration,sale_sequence:"
-msgid "Sale Reference Sequence"
-msgstr "Verkoopkenmerkreeks"
+msgid "Sale Sequence"
+msgstr ""
 
+#, fuzzy
 msgctxt "field:sale.configuration,sale_shipment_method:"
 msgid "Sale Shipment Method"
-msgstr ""
+msgstr "Levering afhandeling"
 
 msgctxt "field:sale.configuration,write_date:"
 msgid "Write Date"
@@ -145,10 +160,6 @@ 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"
@@ -213,6 +224,10 @@ msgctxt "field:sale.line,sequence:"
 msgid "Sequence"
 msgstr "Reeks"
 
+msgctxt "field:sale.line,shipping_date:"
+msgid "Shipping Date"
+msgstr ""
+
 msgctxt "field:sale.line,taxes:"
 msgid "Taxes"
 msgstr "Belastingen"
@@ -414,6 +429,10 @@ msgctxt "field:sale.sale,moves:"
 msgid "Moves"
 msgstr "Boekingen"
 
+msgctxt "field:sale.sale,number:"
+msgid "Number"
+msgstr ""
+
 msgctxt "field:sale.sale,origin:"
 msgid "Origin"
 msgstr ""
@@ -578,10 +597,6 @@ msgctxt "field:stock.move,sale_exception_state:"
 msgid "Exception State"
 msgstr "Uitzonderingstoestand"
 
-msgctxt "help:product.template,delivery_time:"
-msgid "In number of days"
-msgstr ""
-
 msgctxt "help:sale.handle.invoice.exception.ask,recreate_invoices:"
 msgid ""
 "The selected invoices will be recreated. The other ones will be ignored."
@@ -758,69 +773,74 @@ msgid "Sale - Recreated Invoice"
 msgstr "Verkoop - factuur opnieuw aanmaken"
 
 #, fuzzy
-msgctxt "odt:sale.sale:"
+msgctxt "report:sale.sale:"
 msgid "Amount"
 msgstr "Bedrag"
 
 #, fuzzy
-msgctxt "odt:sale.sale:"
+msgctxt "report:sale.sale:"
 msgid "Date:"
 msgstr "Datum:"
 
 #, fuzzy
-msgctxt "odt:sale.sale:"
+msgctxt "report:sale.sale:"
 msgid "Description"
 msgstr "Specificatie"
 
 #, fuzzy
-msgctxt "odt:sale.sale:"
+msgctxt "report:sale.sale:"
 msgid "Description:"
 msgstr "Betreft:"
 
-msgctxt "odt:sale.sale:"
+msgctxt "report:sale.sale:"
 msgid "Draft Sale Order"
 msgstr ""
 
 #, fuzzy
-msgctxt "odt:sale.sale:"
+msgctxt "report:sale.sale:"
 msgid "Quantity"
 msgstr "Hoeveelheid"
 
-msgctxt "odt:sale.sale:"
+msgctxt "report:sale.sale:"
 msgid "Quotation N°:"
 msgstr ""
 
-msgctxt "odt:sale.sale:"
+#, fuzzy
+msgctxt "report:sale.sale:"
+msgid "Reference:"
+msgstr "Referentie"
+
+msgctxt "report:sale.sale:"
 msgid "Sale Order N°:"
 msgstr ""
 
 #, fuzzy
-msgctxt "odt:sale.sale:"
+msgctxt "report:sale.sale:"
 msgid "Taxes"
 msgstr "Belastingen"
 
 #, fuzzy
-msgctxt "odt:sale.sale:"
+msgctxt "report:sale.sale:"
 msgid "Taxes:"
 msgstr "Belastingen:"
 
 #, fuzzy
-msgctxt "odt:sale.sale:"
+msgctxt "report:sale.sale:"
 msgid "Total (excl. taxes):"
 msgstr "Totaal (excl. belasting):"
 
 #, fuzzy
-msgctxt "odt:sale.sale:"
+msgctxt "report:sale.sale:"
 msgid "Total:"
 msgstr "Totaal:"
 
 #, fuzzy
-msgctxt "odt:sale.sale:"
+msgctxt "report:sale.sale:"
 msgid "Unit Price"
 msgstr "Eenheidsprijs"
 
 #, fuzzy
-msgctxt "odt:sale.sale:"
+msgctxt "report:sale.sale:"
 msgid "VAT:"
 msgstr "BTW:"
 
@@ -1025,7 +1045,7 @@ msgstr "Offerteregels"
 
 msgctxt "view:sale.line:"
 msgid "Taxes"
-msgstr ""
+msgstr "Belastingen"
 
 msgctxt "view:sale.return_sale.start:"
 msgid "Are you sure to return those/this sale(s)?"
diff --git a/locale/pt_BR.po b/locale/pt_BR.po
index 43fb88e..adf26bf 100644
--- a/locale/pt_BR.po
+++ b/locale/pt_BR.po
@@ -61,9 +61,23 @@ msgctxt "field:account.invoice,sales:"
 msgid "Sales"
 msgstr "Vendas"
 
-msgctxt "field:product.template,delivery_time:"
-msgid "Delivery Time"
-msgstr "Tempo de entrega"
+msgctxt "field:product.product,lead_time:"
+msgid "Lead Time"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:product.product,salable:"
+msgid "Salable"
+msgstr "Vendável"
+
+#, fuzzy
+msgctxt "field:product.product,sale_uom:"
+msgid "Sale UOM"
+msgstr "UM para venda"
+
+msgctxt "field:product.template,lead_time:"
+msgid "Lead Time"
+msgstr ""
 
 msgctxt "field:product.template,salable:"
 msgid "Salable"
@@ -94,8 +108,8 @@ msgid "Sale Invoice Method"
 msgstr "Método da fatura da venda"
 
 msgctxt "field:sale.configuration,sale_sequence:"
-msgid "Sale Reference Sequence"
-msgstr "Sequência da referência para venda"
+msgid "Sale Sequence"
+msgstr ""
 
 msgctxt "field:sale.configuration,sale_shipment_method:"
 msgid "Sale Shipment Method"
@@ -145,10 +159,6 @@ msgctxt "field:sale.line,create_uid:"
 msgid "Create User"
 msgstr "Criado pelo usuário"
 
-msgctxt "field:sale.line,delivery_date:"
-msgid "Delivery Date"
-msgstr "Data de Entrega"
-
 msgctxt "field:sale.line,description:"
 msgid "Description"
 msgstr "Descrição"
@@ -213,6 +223,10 @@ msgctxt "field:sale.line,sequence:"
 msgid "Sequence"
 msgstr "Sequência"
 
+msgctxt "field:sale.line,shipping_date:"
+msgid "Shipping Date"
+msgstr ""
+
 msgctxt "field:sale.line,taxes:"
 msgid "Taxes"
 msgstr "Impostos"
@@ -413,6 +427,10 @@ msgctxt "field:sale.sale,moves:"
 msgid "Moves"
 msgstr "Movimentações"
 
+msgctxt "field:sale.sale,number:"
+msgid "Number"
+msgstr ""
+
 msgctxt "field:sale.sale,origin:"
 msgid "Origin"
 msgstr "Origem"
@@ -577,10 +595,6 @@ msgctxt "field:stock.move,sale_exception_state:"
 msgid "Exception State"
 msgstr "Estado da exceção"
 
-msgctxt "help:product.template,delivery_time:"
-msgid "In number of days"
-msgstr "Em número de dias"
-
 msgctxt "help:sale.handle.invoice.exception.ask,recreate_invoices:"
 msgid ""
 "The selected invoices will be recreated. The other ones will be ignored."
@@ -742,59 +756,64 @@ msgctxt "model:sale.sale-recreated-account.invoice,name:"
 msgid "Sale - Recreated Invoice"
 msgstr "Venda - Recriar fatura"
 
-msgctxt "odt:sale.sale:"
+msgctxt "report:sale.sale:"
 msgid "Amount"
 msgstr "Quantidade"
 
-msgctxt "odt:sale.sale:"
+msgctxt "report:sale.sale:"
 msgid "Date:"
 msgstr "Data:"
 
-msgctxt "odt:sale.sale:"
+msgctxt "report:sale.sale:"
 msgid "Description"
 msgstr "Descrição"
 
-msgctxt "odt:sale.sale:"
+msgctxt "report:sale.sale:"
 msgid "Description:"
 msgstr "Descrição:"
 
-msgctxt "odt:sale.sale:"
+msgctxt "report:sale.sale:"
 msgid "Draft Sale Order"
 msgstr "Rascunho de Ordem de Venda"
 
-msgctxt "odt:sale.sale:"
+msgctxt "report:sale.sale:"
 msgid "Quantity"
 msgstr "Quantidade"
 
-msgctxt "odt:sale.sale:"
+msgctxt "report:sale.sale:"
 msgid "Quotation N°:"
 msgstr "Cotação n°:"
 
-msgctxt "odt:sale.sale:"
+#, fuzzy
+msgctxt "report:sale.sale:"
+msgid "Reference:"
+msgstr "Referência"
+
+msgctxt "report:sale.sale:"
 msgid "Sale Order N°:"
 msgstr "Ordem de Venda n°:"
 
-msgctxt "odt:sale.sale:"
+msgctxt "report:sale.sale:"
 msgid "Taxes"
 msgstr "Impostos"
 
-msgctxt "odt:sale.sale:"
+msgctxt "report:sale.sale:"
 msgid "Taxes:"
 msgstr "Tributos"
 
-msgctxt "odt:sale.sale:"
+msgctxt "report:sale.sale:"
 msgid "Total (excl. taxes):"
 msgstr "Total (sem tributos):"
 
-msgctxt "odt:sale.sale:"
+msgctxt "report:sale.sale:"
 msgid "Total:"
 msgstr "Total:"
 
-msgctxt "odt:sale.sale:"
+msgctxt "report:sale.sale:"
 msgid "Unit Price"
 msgstr "Preço unitário"
 
-msgctxt "odt:sale.sale:"
+msgctxt "report:sale.sale:"
 msgid "VAT:"
 msgstr "IVA:"
 
diff --git a/locale/ru_RU.po b/locale/ru_RU.po
index a3ab6b4..2a36a5c 100644
--- a/locale/ru_RU.po
+++ b/locale/ru_RU.po
@@ -62,9 +62,23 @@ msgctxt "field:account.invoice,sales:"
 msgid "Sales"
 msgstr "Продажи"
 
-msgctxt "field:product.template,delivery_time:"
-msgid "Delivery Time"
-msgstr "Время доставки"
+msgctxt "field:product.product,lead_time:"
+msgid "Lead Time"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:product.product,salable:"
+msgid "Salable"
+msgstr "Для продажи"
+
+#, fuzzy
+msgctxt "field:product.product,sale_uom:"
+msgid "Sale UOM"
+msgstr "Ед.измерения продажи"
+
+msgctxt "field:product.template,lead_time:"
+msgid "Lead Time"
+msgstr ""
 
 msgctxt "field:product.template,salable:"
 msgid "Salable"
@@ -95,8 +109,8 @@ msgid "Sale Invoice Method"
 msgstr "Метод инвойса продажи"
 
 msgctxt "field:sale.configuration,sale_sequence:"
-msgid "Sale Reference Sequence"
-msgstr "Ссылка на нумерация продаж"
+msgid "Sale Sequence"
+msgstr ""
 
 msgctxt "field:sale.configuration,sale_shipment_method:"
 msgid "Sale Shipment Method"
@@ -146,10 +160,6 @@ 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 "Описание"
@@ -214,6 +224,10 @@ msgctxt "field:sale.line,sequence:"
 msgid "Sequence"
 msgstr "Нумерация"
 
+msgctxt "field:sale.line,shipping_date:"
+msgid "Shipping Date"
+msgstr ""
+
 msgctxt "field:sale.line,taxes:"
 msgid "Taxes"
 msgstr "Налоги"
@@ -415,6 +429,10 @@ msgctxt "field:sale.sale,moves:"
 msgid "Moves"
 msgstr "Перемещения"
 
+msgctxt "field:sale.sale,number:"
+msgid "Number"
+msgstr ""
+
 #, fuzzy
 msgctxt "field:sale.sale,origin:"
 msgid "Origin"
@@ -580,10 +598,6 @@ msgctxt "field:stock.move,sale_exception_state:"
 msgid "Exception State"
 msgstr "Состояние ситуации"
 
-msgctxt "help:product.template,delivery_time:"
-msgid "In number of days"
-msgstr "После указанного количества дней"
-
 msgctxt "help:sale.handle.invoice.exception.ask,recreate_invoices:"
 msgid ""
 "The selected invoices will be recreated. The other ones will be ignored."
@@ -749,59 +763,64 @@ msgctxt "model:sale.sale-recreated-account.invoice,name:"
 msgid "Sale - Recreated Invoice"
 msgstr "Продажи - Созданные заново инвойсы"
 
-msgctxt "odt:sale.sale:"
+msgctxt "report:sale.sale:"
 msgid "Amount"
 msgstr "Сумма"
 
-msgctxt "odt:sale.sale:"
+msgctxt "report:sale.sale:"
 msgid "Date:"
 msgstr "Дата:"
 
-msgctxt "odt:sale.sale:"
+msgctxt "report:sale.sale:"
 msgid "Description"
 msgstr "Описание"
 
-msgctxt "odt:sale.sale:"
+msgctxt "report:sale.sale:"
 msgid "Description:"
 msgstr "Описание:"
 
-msgctxt "odt:sale.sale:"
+msgctxt "report:sale.sale:"
 msgid "Draft Sale Order"
 msgstr "Черновой заказ на продажу"
 
-msgctxt "odt:sale.sale:"
+msgctxt "report:sale.sale:"
 msgid "Quantity"
 msgstr "Кол-во"
 
-msgctxt "odt:sale.sale:"
+msgctxt "report:sale.sale:"
 msgid "Quotation N°:"
 msgstr "Котировка N°:"
 
-msgctxt "odt:sale.sale:"
+#, fuzzy
+msgctxt "report:sale.sale:"
+msgid "Reference:"
+msgstr "Ссылка"
+
+msgctxt "report:sale.sale:"
 msgid "Sale Order N°:"
 msgstr "Заказ на продажу №:"
 
-msgctxt "odt:sale.sale:"
+msgctxt "report:sale.sale:"
 msgid "Taxes"
 msgstr "Налоги"
 
-msgctxt "odt:sale.sale:"
+msgctxt "report:sale.sale:"
 msgid "Taxes:"
 msgstr "Налоги:"
 
-msgctxt "odt:sale.sale:"
+msgctxt "report:sale.sale:"
 msgid "Total (excl. taxes):"
 msgstr "Итого (без налогов):"
 
-msgctxt "odt:sale.sale:"
+msgctxt "report:sale.sale:"
 msgid "Total:"
 msgstr "Итого:"
 
-msgctxt "odt:sale.sale:"
+msgctxt "report:sale.sale:"
 msgid "Unit Price"
 msgstr "Цена за единицу"
 
-msgctxt "odt:sale.sale:"
+msgctxt "report:sale.sale:"
 msgid "VAT:"
 msgstr "ИНН:"
 
@@ -1000,7 +1019,7 @@ msgstr "Строки продажи"
 
 msgctxt "view:sale.line:"
 msgid "Taxes"
-msgstr ""
+msgstr "Налоги"
 
 msgctxt "view:sale.return_sale.start:"
 msgid "Are you sure to return those/this sale(s)?"
@@ -1076,6 +1095,7 @@ msgctxt "wizard_button:sale.return_sale,start,end:"
 msgid "Cancel"
 msgstr "Отменить"
 
+#, fuzzy
 msgctxt "wizard_button:sale.return_sale,start,return_:"
 msgid "Return"
-msgstr ""
+msgstr "Возвраты"
diff --git a/locale/sl_SI.po b/locale/sl_SI.po
index 8dea5e7..915e47b 100644
--- a/locale/sl_SI.po
+++ b/locale/sl_SI.po
@@ -70,9 +70,23 @@ msgctxt "field:account.invoice,sales:"
 msgid "Sales"
 msgstr "Prodajni nalogi"
 
-msgctxt "field:product.template,delivery_time:"
-msgid "Delivery Time"
-msgstr "Dostavljeno"
+msgctxt "field:product.product,lead_time:"
+msgid "Lead Time"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:product.product,salable:"
+msgid "Salable"
+msgstr "Za prodajo"
+
+#, fuzzy
+msgctxt "field:product.product,sale_uom:"
+msgid "Sale UOM"
+msgstr "Prodajna ME"
+
+msgctxt "field:product.template,lead_time:"
+msgid "Lead Time"
+msgstr ""
 
 msgctxt "field:product.template,salable:"
 msgid "Salable"
@@ -103,8 +117,8 @@ msgid "Sale Invoice Method"
 msgstr "Način obračuna"
 
 msgctxt "field:sale.configuration,sale_sequence:"
-msgid "Sale Reference Sequence"
-msgstr "Štetje prodajnih nalogov"
+msgid "Sale Sequence"
+msgstr ""
 
 msgctxt "field:sale.configuration,sale_shipment_method:"
 msgid "Sale Shipment Method"
@@ -154,10 +168,6 @@ msgctxt "field:sale.line,create_uid:"
 msgid "Create User"
 msgstr "Izdelal"
 
-msgctxt "field:sale.line,delivery_date:"
-msgid "Delivery Date"
-msgstr "Dostavljeno"
-
 msgctxt "field:sale.line,description:"
 msgid "Description"
 msgstr "Opis"
@@ -222,6 +232,10 @@ msgctxt "field:sale.line,sequence:"
 msgid "Sequence"
 msgstr "Zap.št."
 
+msgctxt "field:sale.line,shipping_date:"
+msgid "Shipping Date"
+msgstr ""
+
 msgctxt "field:sale.line,taxes:"
 msgid "Taxes"
 msgstr "Davki"
@@ -422,6 +436,10 @@ msgctxt "field:sale.sale,moves:"
 msgid "Moves"
 msgstr "Promet"
 
+msgctxt "field:sale.sale,number:"
+msgid "Number"
+msgstr ""
+
 msgctxt "field:sale.sale,origin:"
 msgid "Origin"
 msgstr "Poreklo"
@@ -586,10 +604,6 @@ msgctxt "field:stock.move,sale_exception_state:"
 msgid "Exception State"
 msgstr "Pridržano"
 
-msgctxt "help:product.template,delivery_time:"
-msgid "In number of days"
-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."
@@ -750,59 +764,64 @@ msgctxt "model:sale.sale-recreated-account.invoice,name:"
 msgid "Sale - Recreated Invoice"
 msgstr "Prodajni nalog - Ponovno izdelan račun"
 
-msgctxt "odt:sale.sale:"
+msgctxt "report:sale.sale:"
 msgid "Amount"
 msgstr "Znesek"
 
-msgctxt "odt:sale.sale:"
+msgctxt "report:sale.sale:"
 msgid "Date:"
 msgstr "Datum:"
 
-msgctxt "odt:sale.sale:"
+msgctxt "report:sale.sale:"
 msgid "Description"
 msgstr "Opis"
 
-msgctxt "odt:sale.sale:"
+msgctxt "report:sale.sale:"
 msgid "Description:"
 msgstr "Opis:"
 
-msgctxt "odt:sale.sale:"
+msgctxt "report:sale.sale:"
 msgid "Draft Sale Order"
 msgstr "Osnutek prodajnega naloga"
 
-msgctxt "odt:sale.sale:"
+msgctxt "report:sale.sale:"
 msgid "Quantity"
 msgstr "Količina"
 
-msgctxt "odt:sale.sale:"
+msgctxt "report:sale.sale:"
 msgid "Quotation N°:"
 msgstr "Ponudba št.:"
 
-msgctxt "odt:sale.sale:"
+#, fuzzy
+msgctxt "report:sale.sale:"
+msgid "Reference:"
+msgstr "Sklic"
+
+msgctxt "report:sale.sale:"
 msgid "Sale Order N°:"
 msgstr "Prodajni nalog št.:"
 
-msgctxt "odt:sale.sale:"
+msgctxt "report:sale.sale:"
 msgid "Taxes"
 msgstr "Davek"
 
-msgctxt "odt:sale.sale:"
+msgctxt "report:sale.sale:"
 msgid "Taxes:"
 msgstr "Davek:"
 
-msgctxt "odt:sale.sale:"
+msgctxt "report:sale.sale:"
 msgid "Total (excl. taxes):"
 msgstr "Skupaj (brez davka):"
 
-msgctxt "odt:sale.sale:"
+msgctxt "report:sale.sale:"
 msgid "Total:"
 msgstr "Skupaj:"
 
-msgctxt "odt:sale.sale:"
+msgctxt "report:sale.sale:"
 msgid "Unit Price"
 msgstr "Cena"
 
-msgctxt "odt:sale.sale:"
+msgctxt "report:sale.sale:"
 msgid "VAT:"
 msgstr "DDV:"
 
diff --git a/locale/ja_JP.po b/locale/zh_CN.po
similarity index 95%
copy from locale/ja_JP.po
copy to locale/zh_CN.po
index 2b6e79f..225cdec 100644
--- a/locale/ja_JP.po
+++ b/locale/zh_CN.po
@@ -56,8 +56,20 @@ msgctxt "field:account.invoice,sales:"
 msgid "Sales"
 msgstr ""
 
-msgctxt "field:product.template,delivery_time:"
-msgid "Delivery Time"
+msgctxt "field:product.product,lead_time:"
+msgid "Lead Time"
+msgstr ""
+
+msgctxt "field:product.product,salable:"
+msgid "Salable"
+msgstr ""
+
+msgctxt "field:product.product,sale_uom:"
+msgid "Sale UOM"
+msgstr ""
+
+msgctxt "field:product.template,lead_time:"
+msgid "Lead Time"
 msgstr ""
 
 msgctxt "field:product.template,salable:"
@@ -89,7 +101,7 @@ msgid "Sale Invoice Method"
 msgstr ""
 
 msgctxt "field:sale.configuration,sale_sequence:"
-msgid "Sale Reference Sequence"
+msgid "Sale Sequence"
 msgstr ""
 
 msgctxt "field:sale.configuration,sale_shipment_method:"
@@ -140,10 +152,6 @@ 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 ""
@@ -208,6 +216,10 @@ msgctxt "field:sale.line,sequence:"
 msgid "Sequence"
 msgstr ""
 
+msgctxt "field:sale.line,shipping_date:"
+msgid "Shipping Date"
+msgstr ""
+
 msgctxt "field:sale.line,taxes:"
 msgid "Taxes"
 msgstr ""
@@ -408,6 +420,10 @@ msgctxt "field:sale.sale,moves:"
 msgid "Moves"
 msgstr ""
 
+msgctxt "field:sale.sale,number:"
+msgid "Number"
+msgstr ""
+
 msgctxt "field:sale.sale,origin:"
 msgid "Origin"
 msgstr ""
@@ -572,10 +588,6 @@ msgctxt "field:stock.move,sale_exception_state:"
 msgid "Exception State"
 msgstr ""
 
-msgctxt "help:product.template,delivery_time:"
-msgid "In number of days"
-msgstr ""
-
 msgctxt "help:sale.handle.invoice.exception.ask,recreate_invoices:"
 msgid ""
 "The selected invoices will be recreated. The other ones will be ignored."
@@ -736,59 +748,63 @@ msgctxt "model:sale.sale-recreated-account.invoice,name:"
 msgid "Sale - Recreated Invoice"
 msgstr ""
 
-msgctxt "odt:sale.sale:"
+msgctxt "report:sale.sale:"
 msgid "Amount"
 msgstr ""
 
-msgctxt "odt:sale.sale:"
+msgctxt "report:sale.sale:"
 msgid "Date:"
 msgstr ""
 
-msgctxt "odt:sale.sale:"
+msgctxt "report:sale.sale:"
 msgid "Description"
 msgstr ""
 
-msgctxt "odt:sale.sale:"
+msgctxt "report:sale.sale:"
 msgid "Description:"
 msgstr ""
 
-msgctxt "odt:sale.sale:"
+msgctxt "report:sale.sale:"
 msgid "Draft Sale Order"
 msgstr ""
 
-msgctxt "odt:sale.sale:"
+msgctxt "report:sale.sale:"
 msgid "Quantity"
 msgstr ""
 
-msgctxt "odt:sale.sale:"
+msgctxt "report:sale.sale:"
 msgid "Quotation N°:"
 msgstr ""
 
-msgctxt "odt:sale.sale:"
+msgctxt "report:sale.sale:"
+msgid "Reference:"
+msgstr ""
+
+msgctxt "report:sale.sale:"
 msgid "Sale Order N°:"
 msgstr ""
 
-msgctxt "odt:sale.sale:"
+msgctxt "report:sale.sale:"
 msgid "Taxes"
 msgstr ""
 
-msgctxt "odt:sale.sale:"
+msgctxt "report:sale.sale:"
 msgid "Taxes:"
 msgstr ""
 
-msgctxt "odt:sale.sale:"
+msgctxt "report:sale.sale:"
 msgid "Total (excl. taxes):"
 msgstr ""
 
-msgctxt "odt:sale.sale:"
+msgctxt "report:sale.sale:"
 msgid "Total:"
 msgstr ""
 
-msgctxt "odt:sale.sale:"
+msgctxt "report:sale.sale:"
 msgid "Unit Price"
 msgstr ""
 
-msgctxt "odt:sale.sale:"
+msgctxt "report:sale.sale:"
 msgid "VAT:"
 msgstr ""
 
diff --git a/product.py b/product.py
index 6452c2e..8072b60 100644
--- a/product.py
+++ b/product.py
@@ -6,12 +6,13 @@ from trytond.model import fields
 from trytond.pyson import Eval
 from trytond.pool import Pool, PoolMeta
 from trytond.transaction import Transaction
+from trytond import backend
 
 __all__ = ['Template', 'Product']
-__metaclass__ = PoolMeta
 
 
 class Template:
+    __metaclass__ = PoolMeta
     __name__ = 'product.template'
     salable = fields.Boolean('Salable', states={
             'readonly': ~Eval('active', True),
@@ -25,13 +26,12 @@ class Template:
             ('category', '=', Eval('default_uom_category')),
             ],
         depends=['active', 'salable', 'default_uom_category'])
-    delivery_time = fields.Integer('Delivery Time', states={
+    lead_time = fields.TimeDelta('Lead Time', states={
             'readonly': ~Eval('active', True),
             'invisible': ~Eval('salable', False),
             'required': Eval('salable', False),
             },
-        depends=['active', 'salable'],
-        help='In number of days')
+        depends=['active', 'salable'])
 
     @classmethod
     def __setup__(cls):
@@ -47,9 +47,32 @@ class Template:
         if 'salable' not in cls.account_revenue.depends:
             cls.account_revenue.depends.append('salable')
 
+    @classmethod
+    def __register__(cls, module_name):
+        TableHandler = backend.get('TableHandler')
+        cursor = Transaction().connection.cursor()
+        table = TableHandler(cls, module_name)
+        sql_table = cls.__table__()
+
+        super(Template, cls).__register__(module_name)
+
+        # Migration from 3.8: change delivery_time into timedelta lead_time
+        if table.column_exist('delivery_time'):
+            cursor.execute(*sql_table.select(
+                    sql_table.id, sql_table.delivery_time))
+            for id_, delivery_time in cursor.fetchall():
+                if delivery_time is None:
+                    continue
+                lead_time = datetime.timedelta(days=delivery_time)
+                cursor.execute(*sql_table.update(
+                        [sql_table.lead_time],
+                        [lead_time],
+                        where=sql_table.id == id_))
+            table.drop_column('delivery_time')
+
     @staticmethod
-    def default_delivery_time():
-        return 0
+    def default_lead_time():
+        return datetime.timedelta(0)
 
     @fields.depends('default_uom', 'sale_uom', 'salable')
     def on_change_default_uom(self):
@@ -73,6 +96,7 @@ class Template:
 
 
 class Product:
+    __metaclass__ = PoolMeta
     __name__ = 'product.product'
 
     @staticmethod
@@ -116,12 +140,12 @@ class Product:
                             currency, round=False)
         return prices
 
-    def compute_delivery_date(self, date=None):
+    def compute_shipping_date(self, date=None):
         '''
-        Compute the delivery date a the given date
+        Compute the shipping date at the given date
         '''
         Date = Pool().get('ir.date')
 
         if not date:
             date = Date.today()
-        return date + datetime.timedelta(self.delivery_time)
+        return date + self.lead_time
diff --git a/sale.odt b/sale.odt
index 6691544..4fa584f 100644
Binary files a/sale.odt and b/sale.odt differ
diff --git a/sale.py b/sale.py
index 39700ed..a7e6d6e 100644
--- a/sale.py
+++ b/sale.py
@@ -16,7 +16,7 @@ from trytond.wizard import Wizard, StateAction, StateView, StateTransition, \
 from trytond import backend
 from trytond.pyson import If, Eval, Bool, PYSONEncoder, Id
 from trytond.transaction import Transaction
-from trytond.pool import Pool, PoolMeta
+from trytond.pool import Pool
 
 from trytond.modules.account.tax import TaxableMixin
 from trytond.modules.product import price_digits
@@ -27,7 +27,6 @@ __all__ = ['Sale', 'SaleIgnoredInvoice', 'SaleRecreatedInvoice',
     'HandleShipmentExceptionAsk', 'HandleShipmentException',
     'HandleInvoiceExceptionAsk', 'HandleInvoiceException',
     'ReturnSaleStart', 'ReturnSale']
-__metaclass__ = PoolMeta
 
 _ZERO = Decimal(0)
 
@@ -35,7 +34,7 @@ _ZERO = Decimal(0)
 class Sale(Workflow, ModelSQL, ModelView, TaxableMixin):
     'Sale'
     __name__ = 'sale.sale'
-    _rec_name = 'reference'
+    _rec_name = 'number'
     company = fields.Many2One('company.company', 'Company', required=True,
         states={
             'readonly': (Eval('state') != 'draft') | Eval('lines', [0]),
@@ -45,7 +44,8 @@ class Sale(Workflow, ModelSQL, ModelView, TaxableMixin):
                 Eval('context', {}).get('company', -1)),
             ],
         depends=['state'], select=True)
-    reference = fields.Char('Reference', readonly=True, select=True)
+    number = fields.Char('Number', readonly=True, select=True)
+    reference = fields.Char('Reference', select=True)
     description = fields.Char('Description',
         states={
             'readonly': Eval('state') != 'draft',
@@ -260,7 +260,7 @@ class Sale(Workflow, ModelSQL, ModelView, TaxableMixin):
         TableHandler = backend.get('TableHandler')
         sale_line_invoice_line_table_name = 'sale_line_invoice_lines_rel'
         Move = pool.get('stock.move')
-        cursor = Transaction().cursor
+        cursor = Transaction().connection.cursor()
         model_data = Table('ir_model_data')
         model_field = Table('ir_model_field')
         sql_table = cls.__table__()
@@ -287,11 +287,16 @@ class Sale(Workflow, ModelSQL, ModelView, TaxableMixin):
                         len('packing'))],
                 where=model_field.name.like('%packing%')
                 & (model_field.module == module_name)))
-        table = TableHandler(cursor, cls, module_name)
+        table = TableHandler(cls, module_name)
         table.column_rename('packing_state', 'shipment_state')
         table.column_rename('packing_method', 'shipment_method')
         table.column_rename('packing_address', 'shipment_address')
 
+        # Migration from 3.8: rename reference into number
+        if (table.column_exist('reference')
+                and not table.column_exist('number')):
+            table.column_rename('reference', 'number')
+
         super(Sale, cls).__register__(module_name)
 
         # Migration from 1.2
@@ -300,15 +305,15 @@ class Sale(Workflow, ModelSQL, ModelView, TaxableMixin):
                 values=['shipment'],
                 where=sql_table.invoice_method == 'packing'))
 
-        table = TableHandler(cursor, cls, module_name)
+        table = TableHandler(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, SaleLine._table)
-                and TableHandler.table_exist(cursor,
+        if (TableHandler.table_exist(SaleLine._table)
+                and TableHandler.table_exist(
                     sale_line_invoice_line_table_name)
-                and TableHandler.table_exist(cursor, Move._table)):
+                and TableHandler.table_exist(Move._table)):
             sale_line = SaleLine.__table__()
             sale_line_invoice_line = \
                 Table(sale_line_invoice_line_table_name)
@@ -333,7 +338,7 @@ class Sale(Workflow, ModelSQL, ModelView, TaxableMixin):
                     where=sql_table.id.in_(sub_query.select(sub_query.id))))
 
         # Add index on create_date
-        table = TableHandler(cursor, cls, module_name)
+        table = TableHandler(cls, module_name)
         table.index_action('create_date', action='add')
 
     @classmethod
@@ -470,10 +475,6 @@ class Sale(Workflow, ModelSQL, ModelView, TaxableMixin):
                     if value is not None else default_value,)
         return taxable_lines
 
-    @property
-    def tax_type(self):
-        return 'invoice'
-
     def get_tax_amount(self):
         return sum(v['amount'] for v in self._get_taxes().itervalues())
 
@@ -577,7 +578,11 @@ class Sale(Workflow, ModelSQL, ModelView, TaxableMixin):
         Search on shipments or returns
         '''
         def method(self, name, clause):
-            return [('lines.moves.shipment',) + tuple(clause[1:])
+            if isinstance(clause[2], basestring):
+                target = 'rec_name'
+            else:
+                target = 'id'
+            return [('lines.moves.shipment.' + target,) + tuple(clause[1:])
                 + (model_name,)]
         return classmethod(method)
 
@@ -640,20 +645,24 @@ class Sale(Workflow, ModelSQL, ModelView, TaxableMixin):
             self.raise_user_error('invalid_method', (self.rec_name,))
 
     def get_rec_name(self, name):
-        return (self.reference or str(self.id)
+        return (self.number or str(self.id)
             + ' - ' + self.party.rec_name)
 
     @classmethod
     def search_rec_name(cls, name, clause):
-        if clause[1].startswith('!') or clause[1].startswith('not '):
+        _, operator, value = clause
+        if operator.startswith('!') or operator.startswith('not '):
             bool_op = 'AND'
         else:
             bool_op = 'OR'
-        names = clause[2].split(' - ', 1)
-        res = [bool_op, ('reference', clause[1], names[0])]
+        names = value.split(' - ', 1)
+        domain = [bool_op,
+            ('number', operator, names[0]),
+            ('reference', operator, names[0]),
+            ]
         if len(names) != 1 and names[1]:
-            res.append(('party', clause[1], names[1]))
-        return res
+            domain = [bool_op, domain, ('party', operator, names[1])]
+        return domain
 
     @classmethod
     def view_attributes(cls):
@@ -665,7 +674,7 @@ class Sale(Workflow, ModelSQL, ModelView, TaxableMixin):
             default = {}
         default = default.copy()
         default['state'] = 'draft'
-        default['reference'] = None
+        default['number'] = None
         default['invoice_state'] = 'none'
         default['invoices_ignored'] = None
         default['moves'] = None
@@ -677,7 +686,7 @@ class Sale(Workflow, ModelSQL, ModelView, TaxableMixin):
         if not self.invoice_address or not self.shipment_address:
             self.raise_user_error('addresses_required', (self.rec_name,))
         for line in self.lines:
-            if line.quantity >= 0:
+            if (line.quantity or 0) >= 0:
                 location = line.from_location
             else:
                 location = line.to_location
@@ -688,9 +697,9 @@ class Sale(Workflow, ModelSQL, ModelView, TaxableMixin):
                     (self.rec_name,))
 
     @classmethod
-    def set_reference(cls, sales):
+    def set_number(cls, sales):
         '''
-        Fill the reference field with the sale sequence
+        Fill the number field with the sale sequence
         '''
         pool = Pool()
         Sequence = pool.get('ir.sequence')
@@ -698,12 +707,10 @@ class Sale(Workflow, ModelSQL, ModelView, TaxableMixin):
 
         config = Config(1)
         for sale in sales:
-            if sale.reference:
+            if sale.number:
                 continue
-            reference = Sequence.get_id(config.sale_sequence.id)
-            cls.write([sale], {
-                    'reference': reference,
-                    })
+            sale.number = Sequence.get_id(config.sale_sequence.id)
+        cls.save(sales)
 
     @classmethod
     def set_sale_date(cls, sales):
@@ -723,48 +730,24 @@ class Sale(Workflow, ModelSQL, ModelView, TaxableMixin):
                     'total_amount_cache': sale.total_amount,
                     })
 
-    def _get_invoice_line_sale_line(self, invoice_type):
-        '''
-        Return invoice line for each sale lines according to invoice_type
-        '''
-        res = {}
-        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, invoice_type):
-        '''
-        Return invoice of type invoice_type
-        '''
+    def _get_invoice_sale(self):
+        'Return invoice'
         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
-
-        return Invoice(
+        invoice = Invoice(
             company=self.company,
-            type=invoice_type,
-            journal=journal,
+            type='out',
             party=self.party,
             invoice_address=self.invoice_address,
             currency=self.currency,
             account=self.party.account_receivable,
-            payment_term=self.payment_term,
             )
+        invoice.on_change_type()
+        invoice.payment_term = self.payment_term
+        return invoice
 
-    def create_invoice(self, invoice_type):
-        '''
-        Create and return an invoice of type invoice_type
-        '''
+    def create_invoice(self):
+        'Create and return an invoice'
         pool = Pool()
         Invoice = pool.get('account.invoice')
         if self.invoice_method == 'manual':
@@ -774,11 +757,15 @@ class Sale(Workflow, ModelSQL, ModelView, TaxableMixin):
             self.raise_user_error('missing_account_receivable',
                 (self.party.rec_name,))
 
-        invoice_lines = self._get_invoice_line_sale_line(invoice_type)
+        invoice_lines = {}
+        for line in self.lines:
+            ilines = line.get_invoice_line()
+            if ilines:
+                invoice_lines[line.id] = ilines
         if not invoice_lines:
             return
 
-        invoice = self._get_invoice_sale(invoice_type)
+        invoice = self._get_invoice_sale()
         invoice.lines = ((list(invoice.lines)
                 if hasattr(invoice, 'lines') else [])
             + list(chain.from_iterable(invoice_lines[l.id] for l in self.lines
@@ -788,17 +775,6 @@ class Sale(Workflow, ModelSQL, ModelView, TaxableMixin):
         Invoice.update_taxes([invoice])
         return invoice
 
-    def _get_move_sale_line(self, shipment_type):
-        '''
-        Return move for each sale lines of the right shipment_type
-        '''
-        res = {}
-        for line in self.lines:
-            val = line.get_move(shipment_type)
-            if val:
-                res[line.id] = val
-        return res
-
     def _group_shipment_key(self, moves, move):
         '''
         The key to group moves by shipments
@@ -836,7 +812,11 @@ class Sale(Workflow, ModelSQL, ModelView, TaxableMixin):
         if self.shipment_method == 'manual':
             return
 
-        moves = self._get_move_sale_line(shipment_type)
+        moves = {}
+        for line in self.lines:
+            move = line.get_move(shipment_type)
+            if move:
+                moves[line.id] = move
         if not moves:
             return
         if shipment_type == 'out':
@@ -894,7 +874,7 @@ class Sale(Workflow, ModelSQL, ModelView, TaxableMixin):
     def quote(cls, sales):
         for sale in sales:
             sale.check_for_quotation()
-        cls.set_reference(sales)
+        cls.set_number(sales)
 
     @classmethod
     @ModelView.button
@@ -931,8 +911,7 @@ class Sale(Workflow, ModelSQL, ModelView, TaxableMixin):
         for sale in sales:
             if sale.state not in ('confirmed', 'processing', 'done'):
                 continue
-            sale.create_invoice('out_invoice')
-            sale.create_invoice('out_credit_note')
+            sale.create_invoice()
             sale.set_invoice_state()
             sale.create_shipment('out')
             sale.create_shipment('return')
@@ -989,7 +968,7 @@ class SaleLine(ModelSQL, ModelView):
             'readonly': ~Eval('_parent_sale', {}),
             },
         depends=['type', 'unit_digits'])
-    unit = fields.Many2One('product.uom', 'Unit',
+    unit = fields.Many2One('product.uom', 'Unit', ondelete='RESTRICT',
             states={
                 'required': Bool(Eval('product')),
                 'invisible': Eval('type') != 'line',
@@ -1004,7 +983,7 @@ class SaleLine(ModelSQL, ModelView):
     unit_digits = fields.Function(fields.Integer('Unit Digits'),
         'on_change_with_unit_digits')
     product = fields.Many2One('product.product', 'Product',
-        domain=[('salable', '=', True)],
+        ondelete='RESTRICT', domain=[('salable', '=', True)],
         states={
             'invisible': Eval('type') != 'line',
             'readonly': ~Eval('_parent_sale', {}),
@@ -1059,12 +1038,12 @@ class SaleLine(ModelSQL, ModelView):
             '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',
+    shipping_date = fields.Function(fields.Date('Shipping Date',
             states={
                 'invisible': Eval('type') != 'line',
                 },
             depends=['type']),
-        'on_change_with_delivery_date')
+        'on_change_with_shipping_date')
 
     @classmethod
     def __setup__(cls):
@@ -1083,10 +1062,10 @@ class SaleLine(ModelSQL, ModelView):
     @classmethod
     def __register__(cls, module_name):
         TableHandler = backend.get('TableHandler')
-        cursor = Transaction().cursor
+        cursor = Transaction().connection.cursor()
         sql_table = cls.__table__()
         super(SaleLine, cls).__register__(module_name)
-        table = TableHandler(cursor, cls, module_name)
+        table = TableHandler(cls, module_name)
 
         # Migration from 1.0 comment change into note
         if table.column_exist('comment'):
@@ -1282,34 +1261,35 @@ class SaleLine(ModelSQL, ModelView):
         return self.sale.warehouse.id if self.sale.warehouse else None
 
     def get_from_location(self, name):
-        if self.quantity >= 0:
+        if (self.quantity or 0) >= 0:
             if self.warehouse:
                 return self.warehouse.output_location.id
         else:
             return self.sale.party.customer_location.id
 
     def get_to_location(self, name):
-        if self.quantity >= 0:
+        if (self.quantity or 0) >= 0:
             return self.sale.party.customer_location.id
         else:
             if self.warehouse:
                 return self.warehouse.input_location.id
 
     @fields.depends('product', 'quantity', 'moves', '_parent_sale.sale_date')
-    def on_change_with_delivery_date(self, name=None):
+    def on_change_with_shipping_date(self, name=None):
         if self.moves:
-            return min(m.effective_date if m.effective_date else m.planned_date
-                for m in self.moves)
-        if self.product and self.quantity > 0:
+            dates = filter(
+                None, (m.effective_date or m.planned_date for m in self.moves))
+            if dates:
+                return min(dates)
+            else:
+                return
+        if self.product and self.quantity is not None and self.quantity > 0:
             date = self.sale.sale_date if self.sale else None
-            return self.product.compute_delivery_date(date=date)
+            return self.product.compute_shipping_date(date=date)
 
-    def get_invoice_line(self, invoice_type):
-        '''
-        Return a list of invoice lines for sale line according to invoice_type
-        '''
+    def get_invoice_line(self):
+        'Return a list of invoice lines for sale line'
         pool = Pool()
-        Uom = pool.get('product.uom')
         Property = pool.get('ir.property')
         InvoiceLine = pool.get('account.invoice.line')
 
@@ -1319,64 +1299,26 @@ class SaleLine(ModelSQL, ModelView):
         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')
-                        or (all(l.quantity <= 0 for l in self.sale.lines
-                                if l.type == 'line')
-                            and invoice_type == 'out_credit_note'))):
+            if self._get_invoice_not_line():
                 return [invoice_line]
             else:
                 return []
 
-        if (invoice_type == 'out_invoice') != (self.quantity >= 0):
-            return []
+        quantity = (self._get_invoice_line_quantity()
+            - self._get_invoiced_quantity())
 
-        stock_moves = []
-        if (self.sale.invoice_method == 'order'
-                or not self.product
-                or self.product.type == 'service'):
-            quantity = abs(self.quantity)
-            stock_moves = self.moves
-        else:
-            quantity = 0.0
-            for move in self.moves:
-                if move.state == 'done':
-                    quantity += Uom.compute_qty(move.uom, move.quantity,
-                        self.unit)
-                    if move.invoiced_quantity < move.quantity:
-                        stock_moves.append(move)
-        if self.sale.shipment_method == 'order':
-            invoice_line.stock_moves = stock_moves
-
-        skip_ids = set(l.id for i in self.sale.invoices_recreated
-            for l in i.lines)
-        for old_invoice_line in self.invoice_lines:
-            if old_invoice_line.type != 'line':
-                continue
-            if old_invoice_line.id not in skip_ids:
-                if old_invoice_line.invoice:
-                    old_invoice_type = old_invoice_line.invoice.type
-                else:
-                    old_invoice_type = old_invoice_line.invoice_type
-
-                sign = 1 if old_invoice_type == invoice_type else -1
-
-                quantity -= Uom.compute_qty(old_invoice_line.unit,
-                    sign * old_invoice_line.quantity, self.unit)
+        if self.unit:
+            quantity = self.unit.round(quantity)
+        invoice_line.quantity = quantity
 
-        rounding = self.unit.rounding if self.unit else 0.01
-        invoice_line.quantity = Uom.round(quantity, rounding)
-        if invoice_line.quantity <= 0:
+        if not invoice_line.quantity:
             return []
 
         invoice_line.unit = self.unit
         invoice_line.product = self.product
         invoice_line.unit_price = self.unit_price
         invoice_line.taxes = self.taxes
-        invoice_line.invoice_type = invoice_type
+        invoice_line.invoice_type = 'out'
         if self.product:
             invoice_line.account = self.product.account_revenue_used
             if not invoice_line.account:
@@ -1393,31 +1335,65 @@ class SaleLine(ModelSQL, ModelView):
                 self.raise_user_error('missing_account_revenue_property', {
                         'sale': self.sale.rec_name,
                         })
+        invoice_line.stock_moves = self._get_invoice_line_moves()
         return [invoice_line]
 
-    @classmethod
-    def view_attributes(cls):
-        return [
-            ('/form//field[@name="note"]|/form//field[@name="description"]',
-                'spell', Eval('_parent_sale', {}).get('party_lang'))]
+    def _get_invoice_not_line(self):
+        'Return if the not line should be invoiced'
+        return self.sale.invoice_method == 'order' and not self.invoice_lines
 
-    @classmethod
-    def copy(cls, lines, default=None):
-        if default is None:
-            default = {}
-        default = default.copy()
-        default['moves'] = None
-        default['moves_ignored'] = None
-        default['moves_recreated'] = None
-        default['invoice_lines'] = None
-        return super(SaleLine, cls).copy(lines, default=default)
+    def _get_invoice_line_quantity(self):
+        'Return the quantity that should be invoiced'
+        pool = Pool()
+        Uom = pool.get('product.uom')
+
+        if (self.sale.invoice_method == 'order'
+                or not self.product
+                or self.product.type == 'service'):
+            return self.quantity
+        elif self.sale.invoice_method == 'shipment':
+            quantity = 0.0
+            for move in self.moves:
+                if move.state == 'done':
+                    quantity += Uom.compute_qty(move.uom, move.quantity,
+                        self.unit)
+            if self.quantity < 0:
+                quantity *= -1
+            return quantity
+
+    def _get_invoiced_quantity(self):
+        'Return the quantity already invoiced'
+        pool = Pool()
+        Uom = pool.get('product.uom')
+
+        quantity = 0
+        skips = {l for i in self.sale.invoices_recreated for l in i.lines}
+        for invoice_line in self.invoice_lines:
+            if invoice_line.type != 'line':
+                continue
+            if invoice_line not in skips:
+                quantity += Uom.compute_qty(invoice_line.unit,
+                    invoice_line.quantity, self.unit)
+        return quantity
+
+    def _get_invoice_line_moves(self):
+        'Return the stock moves that should be invoiced'
+        moves = []
+        if self.sale.invoice_method == 'order':
+            if self.sale.shipment_method != 'order':
+                moves.extend(self.moves)
+        elif self.sale.invoice_method == 'shipment':
+            for move in self.moves:
+                if move.state == 'done':
+                    if move.invoiced_quantity < move.quantity:
+                        moves.append(move)
+        return moves
 
     def get_move(self, shipment_type):
         '''
         Return moves for the sale line according to shipment_type
         '''
         pool = Pool()
-        Uom = pool.get('product.uom')
         Move = pool.get('stock.move')
 
         if self.type != 'line':
@@ -1426,30 +1402,14 @@ class SaleLine(ModelSQL, ModelView):
             return
         if self.product.type == 'service':
             return
+
         if (shipment_type == 'out') != (self.quantity >= 0):
             return
 
-        invoice_lines = []
-        if self.sale.shipment_method == 'order':
-            quantity = abs(self.quantity)
-            if self.sale.invoice_method == 'order':
-                invoice_lines = self.invoice_lines
-        else:
-            quantity = 0.0
-            for invoice_line in self.invoice_lines:
-                if invoice_line.invoice.state == 'paid':
-                    quantity += Uom.compute_qty(invoice_line.unit,
-                        invoice_line.quantity, self.unit)
-                    if invoice_line.moved_quantity < invoice_line.quantity:
-                        invoice_lines.append(invoice_line)
-
-        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.compute_qty(move.uom, move.quantity,
-                    self.unit)
+        quantity = (self._get_move_quantity(shipment_type)
+            - self._get_shipped_quantity(shipment_type))
 
-        quantity = Uom.round(quantity, self.unit.rounding)
+        quantity = self.unit.round(quantity)
         if quantity <= 0:
             return
 
@@ -1468,11 +1428,71 @@ class SaleLine(ModelSQL, ModelView):
         move.company = self.sale.company
         move.unit_price = self.unit_price
         move.currency = self.sale.currency
-        move.planned_date = self.delivery_date
-        move.invoice_lines = invoice_lines
+        move.planned_date = self.shipping_date
+        move.invoice_lines = self._get_move_invoice_lines(shipment_type)
         move.origin = self
         return move
 
+    def _get_move_quantity(self, shipment_type):
+        'Return the quantity that should be shipped'
+        pool = Pool()
+        Uom = pool.get('product.uom')
+
+        if self.sale.shipment_method == 'order':
+            return abs(self.quantity)
+        elif self.sale.shipment_method == 'invoice':
+            quantity = 0.0
+            for invoice_line in self.invoice_lines:
+                if (invoice_line.invoice
+                        and invoice_line.invoice.state == 'paid'):
+                    quantity += Uom.compute_qty(invoice_line.unit,
+                        invoice_line.quantity, self.unit)
+            return quantity
+
+    def _get_shipped_quantity(self, shipment_type):
+        'Return the quantity already shipped'
+        pool = Pool()
+        Uom = pool.get('product.uom')
+
+        quantity = 0
+        skips = set(m for m in self.moves_recreated)
+        for move in self.moves:
+            if move not in skips:
+                quantity += Uom.compute_qty(move.uom, move.quantity,
+                    self.unit)
+        return quantity
+
+    def _get_move_invoice_lines(self, shipment_type):
+        'Return the invoice lines that should be shipped'
+        invoice_lines = []
+        if self.sale.shipment_method == 'order':
+            if self.sale.invoice_method == 'order':
+                invoice_lines.extend(self.invoice_lines)
+        elif self.sale.shipment_method == 'invoice':
+            for invoice_line in self.invoice_lines:
+                if (invoice_line.invoice
+                        and invoice_line.invoice.state == 'paid'):
+                    if invoice_line.moved_quantity < invoice_line.quantity:
+                        invoice_lines.append(invoice_line)
+        return invoice_lines
+
+    @classmethod
+    def view_attributes(cls):
+        return [
+            ('/form//field[@name="note"]|/form//field[@name="description"]',
+                'spell', Eval('_parent_sale', {}).get('party_lang'))]
+
+    @classmethod
+    def copy(cls, lines, default=None):
+        if default is None:
+            default = {}
+        default = default.copy()
+        default['moves'] = None
+        default['moves_ignored'] = None
+        default['moves_recreated'] = None
+        default['invoice_lines'] = None
+        return super(SaleLine, cls).copy(lines, default=default)
+
 
 class SaleLineTax(ModelSQL):
     'Sale Line - Tax'
@@ -1519,11 +1539,11 @@ class OpenCustomer(Wizard):
         ModelData = pool.get('ir.model.data')
         Wizard = pool.get('ir.action.wizard')
         Sale = pool.get('sale.sale')
-        cursor = Transaction().cursor
+        cursor = Transaction().connection.cursor()
         sale = Sale.__table__()
 
         cursor.execute(*sale.select(sale.party, group_by=sale.party))
-        customer_ids = [line[0] for line in Transaction().cursor.fetchall()]
+        customer_ids = [line[0] for line in cursor.fetchall()]
         action['pyson_domain'] = PYSONEncoder().encode(
             [('id', 'in', customer_ids)])
         wizard = Wizard(ModelData.get_id('sale', 'act_open_customer'))
@@ -1545,7 +1565,7 @@ class HandleShipmentExceptionAsk(ModelView):
 
     @classmethod
     def __register__(cls, module_name):
-        cursor = Transaction().cursor
+        cursor = Transaction().connection.cursor()
         model = Table('ir_model')
         # Migration from 1.2: packing renamed into shipment
         cursor.execute(*model.update(
diff --git a/setup.py b/setup.py
index 53aadc0..4d7de5e 100644
--- a/setup.py
+++ b/setup.py
@@ -5,11 +5,17 @@
 from setuptools import setup
 import re
 import os
-import ConfigParser
+import io
+try:
+    from configparser import ConfigParser
+except ImportError:
+    from ConfigParser import ConfigParser
 
 
 def read(fname):
-    return open(os.path.join(os.path.dirname(__file__), fname)).read()
+    return io.open(
+        os.path.join(os.path.dirname(__file__), fname),
+        'r', encoding='utf-8').read()
 
 
 def get_require_version(name):
@@ -21,7 +27,7 @@ def get_require_version(name):
         major_version, minor_version + 1)
     return require
 
-config = ConfigParser.ConfigParser()
+config = ConfigParser()
 config.readfp(open('tryton.cfg'))
 info = dict(config.items('tryton'))
 for key in ('depends', 'extras_depend', 'xml'):
@@ -43,7 +49,7 @@ if minor_version % 2:
 
 requires = ['python-sql >= 0.4']
 for dep in info.get('depends', []):
-    if not re.match(r'(ir|res|webdav)(\W|$)', dep):
+    if not re.match(r'(ir|res)(\W|$)', dep):
         requires.append(get_require_version('trytond_%s' % dep))
 requires.append(get_require_version('trytond'))
 
@@ -82,6 +88,7 @@ setup(name=name,
         'License :: OSI Approved :: GNU General Public License (GPL)',
         'Natural Language :: Bulgarian',
         'Natural Language :: Catalan',
+        'Natural Language :: Chinese (Simplified)',
         'Natural Language :: Czech',
         'Natural Language :: Dutch',
         'Natural Language :: English',
@@ -95,6 +102,9 @@ setup(name=name,
         'Natural Language :: Spanish',
         'Operating System :: OS Independent',
         'Programming Language :: Python :: 2.7',
+        'Programming Language :: Python :: 3.3',
+        'Programming Language :: Python :: 3.4',
+        'Programming Language :: Python :: 3.5',
         'Programming Language :: Python :: Implementation :: CPython',
         'Programming Language :: Python :: Implementation :: PyPy',
         'Topic :: Office/Business',
@@ -111,4 +121,8 @@ setup(name=name,
     test_suite='tests',
     test_loader='trytond.test_loader:Loader',
     tests_require=tests_require,
+    use_2to3=True,
+    convert_2to3_doctests=[
+        'tests/scenario_sale.rst',
+        ],
     )
diff --git a/stock.py b/stock.py
index bc291ea..83c67bf 100644
--- a/stock.py
+++ b/stock.py
@@ -9,10 +9,10 @@ from trytond.pool import Pool, PoolMeta
 from trytond import backend
 
 __all__ = ['ShipmentOut', 'ShipmentOutReturn', 'Move']
-__metaclass__ = PoolMeta
 
 
 class ShipmentOut:
+    __metaclass__ = PoolMeta
     __name__ = 'stock.shipment.out'
 
     @classmethod
@@ -63,6 +63,7 @@ class ShipmentOut:
 
 
 class ShipmentOutReturn:
+    __metaclass__ = PoolMeta
     __name__ = 'stock.shipment.out.return'
 
     @classmethod
@@ -117,6 +118,7 @@ class ShipmentOutReturn:
 
 
 class Move:
+    __metaclass__ = PoolMeta
     __name__ = 'stock.move'
     sale = fields.Function(fields.Many2One('sale.sale', 'Sale', select=True),
         'get_sale', searcher='search_sale')
@@ -129,12 +131,12 @@ class Move:
     @classmethod
     def __register__(cls, module_name):
         TableHandler = backend.get('TableHandler')
-        cursor = Transaction().cursor
+        cursor = Transaction().connection.cursor()
         sql_table = cls.__table__()
 
         super(Move, cls).__register__(module_name)
 
-        table = TableHandler(cursor, cls, module_name)
+        table = TableHandler(cls, module_name)
 
         # Migration from 2.6: remove sale_line
         if table.column_exist('sale_line'):
diff --git a/tests/__init__.py b/tests/__init__.py
index daf50d7..4ecb3d8 100644
--- a/tests/__init__.py
+++ b/tests/__init__.py
@@ -1,6 +1,9 @@
 # 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
+try:
+    from trytond.modules.sale.tests.test_sale import suite
+except ImportError:
+    from .test_sale import suite
 
 __all__ = ['suite']
diff --git a/tests/scenario_sale.rst b/tests/scenario_sale.rst
index 9e60219..b674e12 100644
--- a/tests/scenario_sale.rst
+++ b/tests/scenario_sale.rst
@@ -13,7 +13,7 @@ Imports::
     ...     get_company
     >>> from trytond.modules.account.tests.tools import create_fiscalyear, \
     ...     create_chart, get_accounts, create_tax
-    >>> from.trytond.modules.account_invoice.tests.tools import \
+    >>> from trytond.modules.account_invoice.tests.tools import \
     ...     set_fiscalyear_invoice_sequences, create_payment_term
     >>> today = datetime.date.today()
 
@@ -103,12 +103,6 @@ Create parties::
     >>> 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')
@@ -118,7 +112,6 @@ Create product::
     >>> product = Product()
     >>> template = ProductTemplate()
     >>> template.name = 'product'
-    >>> template.category = category
     >>> template.default_uom = unit
     >>> template.type = 'goods'
     >>> template.purchasable = True
@@ -214,9 +207,9 @@ Sale 5 products::
 Invoice line must be linked to stock move::
 
     >>> _, invoice_line1, invoice_line2 = sorted(invoice.lines,
-    ...     key=lambda l: l.quantity)
+    ...     key=lambda l: l.quantity or 0)
     >>> stock_move1, stock_move2 = sorted(shipment.outgoing_moves,
-    ...     key=lambda m: m.quantity)
+    ...     key=lambda m: m.quantity or 0)
     >>> invoice_line1.stock_moves == [stock_move1]
     True
     >>> stock_move1.invoice_lines == [invoice_line1]
@@ -282,7 +275,7 @@ Not yet linked to invoice lines::
     >>> shipment, = sale.shipments
     >>> config.user = stock_user.id
     >>> stock_move1, stock_move2 = sorted(shipment.outgoing_moves,
-    ...     key=lambda m: m.quantity)
+    ...     key=lambda m: m.quantity or 0)
     >>> len(stock_move1.invoice_lines)
     0
     >>> len(stock_move2.invoice_lines)
@@ -304,9 +297,9 @@ Open customer invoice::
     >>> Invoice = Model.get('account.invoice')
     >>> invoice = Invoice(invoice.id)
     >>> invoice.type
-    u'out_invoice'
+    u'out'
     >>> invoice_line1, invoice_line2 = sorted(invoice.lines,
-    ...     key=lambda l: l.quantity)
+    ...     key=lambda l: l.quantity or 0)
     >>> for line in invoice.lines:
     ...     line.quantity = 1
     ...     line.save()
@@ -463,11 +456,11 @@ Open customer credit note::
     >>> config.user = account_user.id
     >>> credit_note = Invoice(credit_note.id)
     >>> credit_note.type
-    u'out_credit_note'
+    u'out'
     >>> len(credit_note.lines)
     1
     >>> sum(l.quantity for l in credit_note.lines)
-    4.0
+    -4.0
     >>> credit_note.click('post')
 
 Mixing return and sale::
@@ -496,7 +489,7 @@ Mixing return and sale::
     u'processing'
     >>> mix.reload()
     >>> len(mix.shipments), len(mix.shipment_returns), len(mix.invoices)
-    (1, 1, 2)
+    (1, 1, 1)
 
 Checking Shipments::
 
@@ -524,21 +517,16 @@ Checking the invoice::
 
     >>> config.user = sale_user.id
     >>> mix.reload()
-    >>> mix_invoice, mix_credit_note = sorted(mix.invoices,
-    ...     key=attrgetter('type'), reverse=True)
+    >>> mix_invoice, = mix.invoices
     >>> config.user = account_user.id
     >>> mix_invoice = Invoice(mix_invoice.id)
-    >>> mix_credit_note = Invoice(mix_credit_note.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)
-    >>> sum(l.quantity for l in mix_invoice.lines)
-    7.0
-    >>> sum(l.quantity for l in mix_credit_note.lines)
-    2.0
+    >>> mix_invoice.type
+    u'out'
+    >>> len(mix_invoice.lines)
+    3
+    >>> sorted(l.quantity for l in mix_invoice.lines if l.quantity)
+    [-2.0, 7.0]
     >>> mix_invoice.click('post')
-    >>> mix_credit_note.click('post')
 
 Mixing stuff with an invoice method 'on shipment'::
 
@@ -651,8 +639,8 @@ Return sales using the wizard::
     ...     ])
     >>> returned_sale.origin == sale_to_return
     True
-    >>> sorted([x.quantity for x in returned_sale.lines])
-    [None, -1.0]
+    >>> sorted([x.quantity or 0 for x in returned_sale.lines])
+    [-1.0, 0]
 
 Create a sale to be invoiced on shipment partialy and check correctly linked
 to invoices::
diff --git a/tests/test_sale.py b/tests/test_sale.py
index 54fd92c..b732abd 100644
--- a/tests/test_sale.py
+++ b/tests/test_sale.py
@@ -4,7 +4,8 @@ import unittest
 import doctest
 import trytond.tests.test_tryton
 from trytond.tests.test_tryton import ModuleTestCase
-from trytond.tests.test_tryton import doctest_setup, doctest_teardown
+from trytond.tests.test_tryton import (doctest_setup, doctest_teardown,
+    doctest_checker)
 
 
 class SaleTestCase(ModuleTestCase):
@@ -17,5 +18,6 @@ def suite():
     suite.addTests(unittest.TestLoader().loadTestsFromTestCase(SaleTestCase))
     suite.addTests(doctest.DocFileSuite('scenario_sale.rst',
             setUp=doctest_setup, tearDown=doctest_teardown, encoding='utf-8',
-            optionflags=doctest.REPORT_ONLY_FIRST_FAILURE))
+            optionflags=doctest.REPORT_ONLY_FIRST_FAILURE,
+            checker=doctest_checker))
     return suite
diff --git a/tryton.cfg b/tryton.cfg
index 5794383..838e0f4 100644
--- a/tryton.cfg
+++ b/tryton.cfg
@@ -1,5 +1,5 @@
 [tryton]
-version=3.8.1
+version=4.0.0
 depends:
     account
     account_invoice
diff --git a/trytond_sale.egg-info/PKG-INFO b/trytond_sale.egg-info/PKG-INFO
index c467db1..f160c35 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: 3.8.1
+Version: 4.0.0
 Summary: Tryton module for sale
 Home-page: http://www.tryton.org/
 Author: Tryton
 Author-email: issue_tracker at tryton.org
 License: GPL-3
-Download-URL: http://downloads.tryton.org/3.8/
+Download-URL: http://downloads.tryton.org/4.0/
 Description: trytond_sale
         ============
         
@@ -54,6 +54,7 @@ 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 :: Chinese (Simplified)
 Classifier: Natural Language :: Czech
 Classifier: Natural Language :: Dutch
 Classifier: Natural Language :: English
@@ -67,6 +68,9 @@ Classifier: Natural Language :: Slovenian
 Classifier: Natural Language :: Spanish
 Classifier: Operating System :: OS Independent
 Classifier: Programming Language :: Python :: 2.7
+Classifier: Programming Language :: Python :: 3.3
+Classifier: Programming Language :: Python :: 3.4
+Classifier: Programming Language :: Python :: 3.5
 Classifier: Programming Language :: Python :: Implementation :: CPython
 Classifier: Programming Language :: Python :: Implementation :: PyPy
 Classifier: Topic :: Office/Business
diff --git a/trytond_sale.egg-info/SOURCES.txt b/trytond_sale.egg-info/SOURCES.txt
index 1bfccd0..3172f9e 100644
--- a/trytond_sale.egg-info/SOURCES.txt
+++ b/trytond_sale.egg-info/SOURCES.txt
@@ -74,11 +74,13 @@ locale/fr_FR.po
 locale/hu_HU.po
 locale/it_IT.po
 locale/ja_JP.po
+locale/lo_LA.po
 locale/lt_LT.po
 locale/nl_NL.po
 locale/pt_BR.po
 locale/ru_RU.po
 locale/sl_SI.po
+locale/zh_CN.po
 tests/scenario_sale.rst
 trytond_sale.egg-info/PKG-INFO
 trytond_sale.egg-info/SOURCES.txt
diff --git a/trytond_sale.egg-info/requires.txt b/trytond_sale.egg-info/requires.txt
index 91c0d3a..bdeb17b 100644
--- a/trytond_sale.egg-info/requires.txt
+++ b/trytond_sale.egg-info/requires.txt
@@ -1,11 +1,11 @@
 python-sql >= 0.4
-trytond_account >= 3.8, < 3.9
-trytond_account_invoice >= 3.8, < 3.9
-trytond_account_invoice_stock >= 3.8, < 3.9
-trytond_account_product >= 3.8, < 3.9
-trytond_company >= 3.8, < 3.9
-trytond_currency >= 3.8, < 3.9
-trytond_party >= 3.8, < 3.9
-trytond_product >= 3.8, < 3.9
-trytond_stock >= 3.8, < 3.9
-trytond >= 3.8, < 3.9
+trytond_account >= 4.0, < 4.1
+trytond_account_invoice >= 4.0, < 4.1
+trytond_account_invoice_stock >= 4.0, < 4.1
+trytond_account_product >= 4.0, < 4.1
+trytond_company >= 4.0, < 4.1
+trytond_currency >= 4.0, < 4.1
+trytond_party >= 4.0, < 4.1
+trytond_product >= 4.0, < 4.1
+trytond_stock >= 4.0, < 4.1
+trytond >= 4.0, < 4.1
\ No newline at end of file
diff --git a/view/product_list_sale_line.xml b/view/product_list_sale_line.xml
index 5c638ca..d02317d 100644
--- a/view/product_list_sale_line.xml
+++ b/view/product_list_sale_line.xml
@@ -2,12 +2,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. -->
 <tree string="Products">
-    <field name="template"/>
     <field name="code"/>
+    <field name="name"/>
     <field name="list_price_uom"/>
     <field name="cost_price_uom"/>
     <field name="quantity"/>
     <field name="forecast_quantity"/>
     <field name="default_uom"/>
-    <field name="active"/>
+    <field name="active" tree_invisible="1"/>
 </tree>
diff --git a/view/sale_form.xml b/view/sale_form.xml
index 4fe1c4f..f8814fb 100644
--- a/view/sale_form.xml
+++ b/view/sale_form.xml
@@ -6,15 +6,17 @@ this repository contains the full copyright notices and license terms. -->
     <field name="party"/>
     <label name="invoice_address"/>
     <field name="invoice_address"/>
-    <label name="reference"/>
-    <field name="reference"/>
+    <label name="number"/>
+    <field name="number"/>
     <label name="shipment_party"/>
     <field name="shipment_party"/>
     <label name="shipment_address"/>
     <field name="shipment_address"/>
     <newline/>
     <label name="description"/>
-    <field name="description" colspan="5"/>
+    <field name="description" colspan="3"/>
+    <label name="reference"/>
+    <field name="reference"/>
     <notebook colspan="6">
         <page string="Sale" id="sale">
             <label name="sale_date"/>
diff --git a/view/sale_line_form.xml b/view/sale_line_form.xml
index 949b1dc..300cac2 100644
--- a/view/sale_line_form.xml
+++ b/view/sale_line_form.xml
@@ -24,8 +24,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"/>
+            <label name="shipping_date"/>
+            <field name="shipping_date"/>
         </page>
         <page string="Taxes" id="taxes">
             <field name="taxes" colspan="4"/>
diff --git a/view/sale_tree.xml b/view/sale_tree.xml
index e4b7fc1..48c187f 100644
--- a/view/sale_tree.xml
+++ b/view/sale_tree.xml
@@ -2,6 +2,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. -->
 <tree string="Sales">
+    <field name="number"/>
     <field name="reference"/>
     <field name="sale_date"/>
     <field name="party"/>
diff --git a/view/template_form.xml b/view/template_form.xml
index dde1d0a..52814e8 100644
--- a/view/template_form.xml
+++ b/view/template_form.xml
@@ -13,8 +13,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"/>
+            <label name="lead_time"/>
+            <field name="lead_time"/>
         </page>
     </xpath>
 </data>
-- 
tryton-modules-sale



More information about the tryton-debian-vcs mailing list