[tryton-debian-vcs] tryton-modules-purchase branch upstream created. c2b9d3c8ab84eea6f93b934799cfbd83a40b05d7

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


The following commit has been merged in the upstream branch:
https://alioth.debian.org/plugins/scmgit/cgi-bin/gitweb.cgi/?p=tryton/tryton-modules-purchase.git;a=commitdiff;h=c2b9d3c8ab84eea6f93b934799cfbd83a40b05d7
commit c2b9d3c8ab84eea6f93b934799cfbd83a40b05d7
Author: Mathias Behrle <mathiasb at m9s.biz>
Date:   Sun Nov 24 17:27:51 2013 +0100

    Adding upstream version 3.0.0.

diff --git a/CHANGELOG b/CHANGELOG
index 2672ce9..91a5c28 100644
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -1,5 +1,6 @@
-Version 2.8.1 - 2013-10-01
+Version 3.0.0 - 2013-10-21
 * Bug fixes (see mercurial logs for details)
+* Replace reference copying by relate
 
 Version 2.8.0 - 2013-04-22
 * Bug fixes (see mercurial logs for details)
diff --git a/INSTALL b/INSTALL
index c52e5fb..dea2f76 100644
--- a/INSTALL
+++ b/INSTALL
@@ -6,6 +6,7 @@ Prerequisites
 
  * Python 2.6 or later (http://www.python.org/)
  * trytond (http://www.tryton.org/)
+ * python-sql (http://code.google.com/p/python-sql/)
  * trytond_company (http://www.tryton.org/)
  * trytond_party (http://www.tryton.org/)
  * trytond_stock (http://www.tryton.org/)
diff --git a/MANIFEST.in b/MANIFEST.in
index 2569955..fc0b03e 100644
--- a/MANIFEST.in
+++ b/MANIFEST.in
@@ -10,3 +10,4 @@ include view/*.xml
 include *.odt
 include locale/*.po
 include doc/*
+include tests/*.rst
diff --git a/PKG-INFO b/PKG-INFO
index f5fde0f..d117bd0 100644
--- a/PKG-INFO
+++ b/PKG-INFO
@@ -1,12 +1,12 @@
 Metadata-Version: 1.1
 Name: trytond_purchase
-Version: 2.8.1
+Version: 3.0.0
 Summary: Tryton module for purchase
 Home-page: http://www.tryton.org/
 Author: Tryton
 Author-email: UNKNOWN
 License: GPL-3
-Download-URL: http://downloads.tryton.org/2.8/
+Download-URL: http://downloads.tryton.org/3.0/
 Description: trytond_purchase
         ================
         
@@ -59,6 +59,7 @@ Classifier: Natural Language :: English
 Classifier: Natural Language :: French
 Classifier: Natural Language :: German
 Classifier: Natural Language :: Russian
+Classifier: Natural Language :: Slovenian
 Classifier: Natural Language :: Spanish
 Classifier: Operating System :: OS Independent
 Classifier: Programming Language :: Python :: 2.6
diff --git a/__init__.py b/__init__.py
index f5f710c..810de6c 100644
--- a/__init__.py
+++ b/__init__.py
@@ -3,9 +3,10 @@
 
 from trytond.pool import Pool
 from .purchase import *
+from .product import *
+from .stock import *
 from .configuration import *
 from .invoice import *
-from .stock import *
 
 
 def register():
diff --git a/configuration.py b/configuration.py
index 4987a16..c7f038d 100644
--- a/configuration.py
+++ b/configuration.py
@@ -12,7 +12,7 @@ class Configuration(ModelSingleton, ModelSQL, ModelView):
     purchase_sequence = fields.Property(fields.Many2One('ir.sequence',
             'Purchase Reference Sequence', domain=[
                 ('company', 'in',
-                    [Eval('context', {}).get('company', 0), None]),
+                    [Eval('context', {}).get('company', -1), None]),
                 ('code', '=', 'purchase.purchase'),
                 ], required=True))
     purchase_invoice_method = fields.Property(fields.Selection([
@@ -20,5 +20,5 @@ class Configuration(ModelSingleton, ModelSQL, ModelView):
                 ('order', 'Based On Order'),
                 ('shipment', 'Based On Shipment'),
                 ], 'Invoice Method', states={
-                'required': Bool(Eval('context', {}).get('company', 0)),
+                'required': Bool(Eval('context', {}).get('company')),
                 }))
diff --git a/invoice.py b/invoice.py
index 9199d59..5650f2a 100644
--- a/invoice.py
+++ b/invoice.py
@@ -1,14 +1,29 @@
 #This file is part of Tryton.  The COPYRIGHT file at the top level of
 #this repository contains the full copyright notices and license terms.
+from functools import wraps
+from sql import Table
+
 from trytond.model import ModelView, Workflow, fields
 from trytond.pool import Pool, PoolMeta
 from trytond.transaction import Transaction
-from trytond.backend import TableHandler
+from trytond import backend
 
 __all__ = ['Invoice', 'InvoiceLine']
 __metaclass__ = PoolMeta
 
 
+def process_purchase(func):
+    @wraps(func)
+    def wrapper(cls, invoices):
+        pool = Pool()
+        Purchase = pool.get('purchase.purchase')
+        func(cls, invoices)
+        with Transaction().set_user(0, set_context=True):
+            Purchase.process([p for i in cls.browse(invoices)
+                    for p in i.purchases])
+    return wrapper
+
+
 class Invoice:
     __name__ = 'account.invoice'
     purchase_exception_state = fields.Function(fields.Selection([
@@ -52,11 +67,14 @@ class Invoice:
 
     @classmethod
     def delete(cls, invoices):
+        pool = Pool()
+        Purchase_Invoice = pool.get('purchase.purchase-account.invoice')
+        purchase_invoice = Purchase_Invoice.__table__()
         cursor = Transaction().cursor
         if invoices:
-            cursor.execute('SELECT id FROM purchase_invoices_rel '
-                'WHERE invoice IN (' + ','.join(('%s',) * len(invoices)) + ')',
-                [i.id for i in invoices])
+            cursor.execute(*purchase_invoice.select(purchase_invoice.id,
+                    where=purchase_invoice.invoice.in_(
+                        [i.id for i in invoices])))
             if cursor.fetchone():
                 cls.raise_user_error('delete_purchase_invoice')
         super(Invoice, cls).delete(invoices)
@@ -84,22 +102,19 @@ class Invoice:
         return super(Invoice, cls).draft(invoices)
 
     @classmethod
+    @process_purchase
+    def post(cls, invoices):
+        super(Invoice, cls).post(invoices)
+
+    @classmethod
+    @process_purchase
     def paid(cls, invoices):
-        pool = Pool()
-        Purchase = pool.get('purchase.purchase')
         super(Invoice, cls).paid(invoices)
-        with Transaction().set_user(0, set_context=True):
-            Purchase.process([p for i in cls.browse(invoices)
-                    for p in i.purchases])
 
     @classmethod
+    @process_purchase
     def cancel(cls, invoices):
-        pool = Pool()
-        Purchase = pool.get('purchase.purchase')
         super(Invoice, cls).cancel(invoices)
-        with Transaction().set_user(0, set_context=True):
-            Purchase.process([p for i in cls.browse(invoices)
-                    for p in i.purchases])
 
 
 class InvoiceLine:
@@ -107,22 +122,34 @@ class InvoiceLine:
 
     @classmethod
     def __register__(cls, module_name):
+        TableHandler = backend.get('TableHandler')
         cursor = Transaction().cursor
+        sql_table = cls.__table__()
 
         super(InvoiceLine, cls).__register__(module_name)
 
         # Migration from 2.6: remove purchase_lines
-        rel_table = 'purchase_line_invoice_lines_rel'
-        if TableHandler.table_exist(cursor, rel_table):
-            cursor.execute('SELECT purchase_line, invoice_line '
-                'FROM "' + rel_table + '"')
+        rel_table_name = 'purchase_line_invoice_lines_rel'
+        if TableHandler.table_exist(cursor, rel_table_name):
+            rel_table = Table(rel_table_name)
+            cursor.execute(*rel_table.select(
+                    rel_table.purchase_line, rel_table.invoice_line))
             for purchase_line, invoice_line in cursor.fetchall():
-                cursor.execute('UPDATE "' + cls._table + '" '
-                    'SET origin = %s '
-                    'WHERE id = %s',
-                    ('purchase.line,%s' % purchase_line, invoice_line))
+                cursor.execute(*sql_table.update(
+                        columns=[sql_table.origin],
+                        values=['purchase.line,%s' % purchase_line],
+                        where=sql_table.id == invoice_line))
             TableHandler.drop_table(cursor,
-                'purchase.line-account.invoice.line', rel_table)
+                'purchase.line-account.invoice.line', rel_table_name)
+
+    @property
+    def origin_name(self):
+        pool = Pool()
+        PurchaseLine = pool.get('purchase.line')
+        name = super(InvoiceLine, self).origin_name
+        if isinstance(self.origin, PurchaseLine):
+            name = self.origin.purchase.rec_name
+        return name
 
     @classmethod
     def _get_origin(cls):
diff --git a/locale/bg_BG.po b/locale/bg_BG.po
index 81b3e2a..6d5eff1 100644
--- a/locale/bg_BG.po
+++ b/locale/bg_BG.po
@@ -755,6 +755,11 @@ msgid "Purchases"
 msgstr "Покупки"
 
 #, fuzzy
+msgctxt "model:ir.action,name:act_purchase_invoice_relate"
+msgid "Purchases"
+msgstr "Покупки"
+
+#, fuzzy
 msgctxt "model:ir.action,name:act_return_form"
 msgid "Returns"
 msgstr "Връщане"
diff --git a/locale/ca_ES.po b/locale/ca_ES.po
index 4630c52..a0868ad 100644
--- a/locale/ca_ES.po
+++ b/locale/ca_ES.po
@@ -352,7 +352,7 @@ msgstr "Codi"
 
 msgctxt "field:purchase.product_supplier,company:"
 msgid "Company"
-msgstr "Companyia"
+msgstr "Empresa"
 
 msgctxt "field:purchase.product_supplier,create_date:"
 msgid "Create Date"
@@ -755,6 +755,10 @@ msgctxt "model:ir.action,name:act_purchase_form2"
 msgid "Purchases"
 msgstr "Compres"
 
+msgctxt "model:ir.action,name:act_purchase_invoice_relate"
+msgid "Purchases"
+msgstr "Compres"
+
 msgctxt "model:ir.action,name:act_return_form"
 msgid "Returns"
 msgstr "Retorna"
@@ -956,7 +960,7 @@ msgstr "IVA:"
 
 msgctxt "selection:account.invoice,purchase_exception_state:"
 msgid ""
-msgstr " "
+msgstr ""
 
 msgctxt "selection:account.invoice,purchase_exception_state:"
 msgid "Ignored"
@@ -1060,7 +1064,7 @@ msgstr "Pressupost"
 
 msgctxt "selection:stock.move,purchase_exception_state:"
 msgid ""
-msgstr " "
+msgstr ""
 
 msgctxt "selection:stock.move,purchase_exception_state:"
 msgid "Ignored"
diff --git a/locale/cs_CZ.po b/locale/cs_CZ.po
index 0bfa52d..20c0770 100644
--- a/locale/cs_CZ.po
+++ b/locale/cs_CZ.po
@@ -747,6 +747,10 @@ msgctxt "model:ir.action,name:act_purchase_form2"
 msgid "Purchases"
 msgstr ""
 
+msgctxt "model:ir.action,name:act_purchase_invoice_relate"
+msgid "Purchases"
+msgstr ""
+
 msgctxt "model:ir.action,name:act_return_form"
 msgid "Returns"
 msgstr ""
diff --git a/locale/de_DE.po b/locale/de_DE.po
index 7d7b74c..ce5d0a1 100644
--- a/locale/de_DE.po
+++ b/locale/de_DE.po
@@ -767,6 +767,10 @@ msgctxt "model:ir.action,name:act_purchase_form2"
 msgid "Purchases"
 msgstr "Einkäufe"
 
+msgctxt "model:ir.action,name:act_purchase_invoice_relate"
+msgid "Purchases"
+msgstr "Einkäufe"
+
 msgctxt "model:ir.action,name:act_return_form"
 msgid "Returns"
 msgstr "Rückgaben"
diff --git a/locale/es_AR.po b/locale/es_AR.po
index 00c6b16..e96b3a4 100644
--- a/locale/es_AR.po
+++ b/locale/es_AR.po
@@ -367,7 +367,7 @@ msgstr "Usuario creación"
 
 msgctxt "field:purchase.product_supplier,currency:"
 msgid "Currency"
-msgstr "Divisa"
+msgstr "Moneda"
 
 msgctxt "field:purchase.product_supplier,delivery_time:"
 msgid "Delivery Time"
@@ -463,11 +463,11 @@ msgstr "Usuario creación"
 
 msgctxt "field:purchase.purchase,currency:"
 msgid "Currency"
-msgstr "Divisa"
+msgstr "Moneda"
 
 msgctxt "field:purchase.purchase,currency_digits:"
 msgid "Currency Digits"
-msgstr "Dígitos de divisa"
+msgstr "Dígitos de moneda"
 
 msgctxt "field:purchase.purchase,description:"
 msgid "Description"
@@ -535,7 +535,7 @@ msgstr "Referencia"
 
 msgctxt "field:purchase.purchase,shipment_returns:"
 msgid "Shipment Returns"
-msgstr "Envío de devolución"
+msgstr "Remitos de devolución"
 
 msgctxt "field:purchase.purchase,shipment_state:"
 msgid "Shipment State"
@@ -543,7 +543,7 @@ msgstr "Estado de envío"
 
 msgctxt "field:purchase.purchase,shipments:"
 msgid "Shipments"
-msgstr "Envíos"
+msgstr "Remitos"
 
 msgctxt "field:purchase.purchase,state:"
 msgid "State"
@@ -691,7 +691,7 @@ msgstr "Compra"
 
 msgctxt "field:stock.move,purchase_currency:"
 msgid "Purchase Currency"
-msgstr "Divisa de compra"
+msgstr "Moneda de compra"
 
 msgctxt "field:stock.move,purchase_exception_state:"
 msgid "Exception State"
@@ -760,13 +760,17 @@ msgctxt "model:ir.action,name:act_purchase_form2"
 msgid "Purchases"
 msgstr "Compras"
 
+msgctxt "model:ir.action,name:act_purchase_invoice_relate"
+msgid "Purchases"
+msgstr "Compras"
+
 msgctxt "model:ir.action,name:act_return_form"
 msgid "Returns"
 msgstr "Devolución"
 
 msgctxt "model:ir.action,name:act_shipment_form"
 msgid "Shipments"
-msgstr "Envíos"
+msgstr "Remitos"
 
 msgctxt "model:ir.action,name:report_purchase"
 msgid "Purchase"
@@ -778,7 +782,7 @@ msgstr "Gestionar excepción de factura"
 
 msgctxt "model:ir.action,name:wizard_shipment_handle_exception"
 msgid "Handle Shipment Exception"
-msgstr "Gestionar excepción de envío"
+msgstr "Gestionar excepción de remito"
 
 msgctxt "model:ir.action.act_window.domain,name:act_purchase_form_domain_all"
 msgid "All"
@@ -841,7 +845,7 @@ msgstr "Gestionar excepción de factura"
 
 msgctxt "model:purchase.handle.shipment.exception.ask,name:"
 msgid "Handle Shipment Exception"
-msgstr "Gestionar excepción de envío"
+msgstr "Gestionar excepción de remito"
 
 msgctxt "model:purchase.line,name:"
 msgid "Purchase Line"
@@ -977,7 +981,7 @@ msgstr "Basado en la orden"
 
 msgctxt "selection:purchase.configuration,purchase_invoice_method:"
 msgid "Based On Shipment"
-msgstr "Basado en el envío"
+msgstr "Basado en el Remito"
 
 msgctxt "selection:purchase.configuration,purchase_invoice_method:"
 msgid "Manual"
@@ -1005,7 +1009,7 @@ msgstr "Basado en la orden"
 
 msgctxt "selection:purchase.purchase,invoice_method:"
 msgid "Based On Shipment"
-msgstr "Basado en el envío"
+msgstr "Basado en el Remito"
 
 msgctxt "selection:purchase.purchase,invoice_method:"
 msgid "Manual"
@@ -1101,7 +1105,7 @@ msgstr "Seleccione movimientos a recrear"
 
 msgctxt "view:purchase.handle.shipment.exception.ask:"
 msgid "Handle shipment Exception"
-msgstr "Gestionar excepción de envío"
+msgstr "Gestionar excepción de remito"
 
 msgctxt "view:purchase.line:"
 msgid "General"
@@ -1157,7 +1161,7 @@ msgstr "Gestionar excepción de factura"
 
 msgctxt "view:purchase.purchase:"
 msgid "Handle Shipment Exception"
-msgstr "Gestionar excepción de envío"
+msgstr "Gestionar excepción de remito"
 
 msgctxt "view:purchase.purchase:"
 msgid "Invoices"
@@ -1181,7 +1185,7 @@ msgstr "Presupuestar"
 
 msgctxt "view:purchase.purchase:"
 msgid "Shipments"
-msgstr "Envíos"
+msgstr "Remitos"
 
 msgctxt "view:stock.move:"
 msgid "Moves"
diff --git a/locale/es_CO.po b/locale/es_CO.po
index f848145..dd98df9 100644
--- a/locale/es_CO.po
+++ b/locale/es_CO.po
@@ -47,7 +47,7 @@ msgstr ""
 
 msgctxt "error:purchase.purchase:"
 msgid "Missing \"Account Payable\" on party \"%s\"."
-msgstr "Falta \"Cuenta por Pagar\" en el tercero \"%s\"."
+msgstr "Falta la \"Cuenta por Pagar\" en el tercero \"%s\"."
 
 msgctxt "error:purchase.purchase:"
 msgid "Purchase \"%s\" must be cancelled before deletion."
@@ -144,7 +144,7 @@ msgstr "Recrear Movimientos"
 
 msgctxt "field:purchase.line,amount:"
 msgid "Amount"
-msgstr "Cantidad"
+msgstr "Subtotal"
 
 msgctxt "field:purchase.line,create_date:"
 msgid "Create Date"
@@ -244,7 +244,7 @@ msgstr "Dígitos de Unidad"
 
 msgctxt "field:purchase.line,unit_price:"
 msgid "Unit Price"
-msgstr "Precio unitario"
+msgstr "Precio Unitario"
 
 msgctxt "field:purchase.line,write_date:"
 msgid "Write Date"
@@ -372,7 +372,7 @@ msgstr "Moneda"
 
 msgctxt "field:purchase.product_supplier,delivery_time:"
 msgid "Delivery Time"
-msgstr "Tiempo de Envío"
+msgstr "Tiempo de Entrega"
 
 msgctxt "field:purchase.product_supplier,id:"
 msgid "ID"
@@ -500,7 +500,7 @@ msgstr "Facturas Ignoradas"
 
 msgctxt "field:purchase.purchase,invoices_recreated:"
 msgid "Recreated Invoices"
-msgstr "Facturas recreadas"
+msgstr "Facturas Recreadas"
 
 msgctxt "field:purchase.purchase,lines:"
 msgid "Lines"
@@ -560,7 +560,7 @@ msgstr "Impuesto"
 
 msgctxt "field:purchase.purchase,tax_amount_cache:"
 msgid "Tax Cache"
-msgstr "Impuestos Precalculado"
+msgstr "Caché de Impuestos"
 
 msgctxt "field:purchase.purchase,total_amount:"
 msgid "Total"
@@ -739,7 +739,7 @@ msgstr "En número de días."
 
 msgctxt "help:purchase.product_supplier.price,quantity:"
 msgid "Minimal quantity"
-msgstr "Cantidad mínima."
+msgstr "Cantidad mínima"
 
 msgctxt "model:ir.action,name:act_invoice_form"
 msgid "Invoices"
@@ -761,6 +761,10 @@ msgctxt "model:ir.action,name:act_purchase_form2"
 msgid "Purchases"
 msgstr "Compras"
 
+msgctxt "model:ir.action,name:act_purchase_invoice_relate"
+msgid "Purchases"
+msgstr "Compras"
+
 msgctxt "model:ir.action,name:act_return_form"
 msgid "Returns"
 msgstr "Devolución"
@@ -775,11 +779,11 @@ msgstr "Compra"
 
 msgctxt "model:ir.action,name:wizard_invoice_handle_exception"
 msgid "Handle Invoice Exception"
-msgstr "Gestionar Excepción de Factura"
+msgstr "Excepció Manual de Factura"
 
 msgctxt "model:ir.action,name:wizard_shipment_handle_exception"
 msgid "Handle Shipment Exception"
-msgstr "Gestionar Excepción de Envío"
+msgstr "Excepción Manual de Envío"
 
 msgctxt "model:ir.action.act_window.domain,name:act_purchase_form_domain_all"
 msgid "All"
@@ -814,7 +818,7 @@ msgstr "Configuración"
 
 msgctxt "model:ir.ui.menu,name:menu_purchase"
 msgid "Purchase"
-msgstr "Compras"
+msgstr "Gestión de Compras"
 
 msgctxt "model:ir.ui.menu,name:menu_purchase_configuration"
 msgid "Purchase Configuration"
@@ -838,7 +842,7 @@ msgstr "Configuración de Compras"
 
 msgctxt "model:purchase.handle.invoice.exception.ask,name:"
 msgid "Handle Invoice Exception"
-msgstr "Gestionar Excepción de Factura"
+msgstr "Excepción Manual de Factura"
 
 msgctxt "model:purchase.handle.shipment.exception.ask,name:"
 msgid "Handle Shipment Exception"
@@ -894,7 +898,7 @@ msgstr "Administrador de Compras"
 
 msgctxt "odt:purchase.purchase:"
 msgid "Amount"
-msgstr "Cantidad"
+msgstr "Subtotal"
 
 msgctxt "odt:purchase.purchase:"
 msgid "Date:"
@@ -960,10 +964,9 @@ msgctxt "odt:purchase.purchase:"
 msgid "VAT:"
 msgstr "NIT:"
 
-#, fuzzy
 msgctxt "selection:account.invoice,purchase_exception_state:"
 msgid ""
-msgstr "Punto de Orden"
+msgstr ""
 
 msgctxt "selection:account.invoice,purchase_exception_state:"
 msgid "Ignored"
@@ -1039,7 +1042,7 @@ msgstr "Ninguno"
 
 msgctxt "selection:purchase.purchase,shipment_state:"
 msgid "Received"
-msgstr "Recibida"
+msgstr "Recibido"
 
 msgctxt "selection:purchase.purchase,shipment_state:"
 msgid "Waiting"
@@ -1055,7 +1058,7 @@ msgstr "Confirmada"
 
 msgctxt "selection:purchase.purchase,state:"
 msgid "Done"
-msgstr "Realizada"
+msgstr "Hecha"
 
 msgctxt "selection:purchase.purchase,state:"
 msgid "Draft"
@@ -1065,10 +1068,9 @@ msgctxt "selection:purchase.purchase,state:"
 msgid "Quotation"
 msgstr "Cotización"
 
-#, fuzzy
 msgctxt "selection:stock.move,purchase_exception_state:"
 msgid ""
-msgstr "Punto de Orden"
+msgstr ""
 
 msgctxt "selection:stock.move,purchase_exception_state:"
 msgid "Ignored"
@@ -1096,7 +1098,7 @@ msgstr "Seleccione facturas a recrear"
 
 msgctxt "view:purchase.handle.invoice.exception.ask:"
 msgid "Handle Invoice Exception"
-msgstr "Gestionar Excepción de Factura"
+msgstr "Excepción Manual de Factura"
 
 msgctxt "view:purchase.handle.shipment.exception.ask:"
 msgid "Choose move to recreate"
@@ -1104,7 +1106,7 @@ msgstr "Seleccione movimientos a recrear"
 
 msgctxt "view:purchase.handle.shipment.exception.ask:"
 msgid "Handle shipment Exception"
-msgstr "Gestionar Excepción de Envío"
+msgstr "Excepción Manual de Envío"
 
 msgctxt "view:purchase.line:"
 msgid "General"
@@ -1156,11 +1158,11 @@ msgstr "Borrador"
 
 msgctxt "view:purchase.purchase:"
 msgid "Handle Invoice Exception"
-msgstr "Gestionar Excepción de Factura"
+msgstr "Excepción Manual de Factura"
 
 msgctxt "view:purchase.purchase:"
 msgid "Handle Shipment Exception"
-msgstr "Gestionar Excepción de Envío"
+msgstr "Excepción Manual de Envío"
 
 msgctxt "view:purchase.purchase:"
 msgid "Invoices"
diff --git a/locale/es_ES.po b/locale/es_ES.po
index 7b4bc5d..0f42e29 100644
--- a/locale/es_ES.po
+++ b/locale/es_ES.po
@@ -51,7 +51,7 @@ msgstr "Falta la \"Cuenta a pagar\" en el tercer \"%s\"."
 
 msgctxt "error:purchase.purchase:"
 msgid "Purchase \"%s\" must be cancelled before deletion."
-msgstr "Debe cancelar la compra \"%s\" antes de borrar."
+msgstr "Debe cancelar la compra \"%s\" antes de borrarla."
 
 msgctxt "error:stock.shipment.in.return:"
 msgid "You cannot reset to draft a move generated by a purchase."
@@ -371,7 +371,7 @@ msgstr "Moneda"
 
 msgctxt "field:purchase.product_supplier,delivery_time:"
 msgid "Delivery Time"
-msgstr "Tiempo de envío"
+msgstr "Plazo de entrega"
 
 msgctxt "field:purchase.product_supplier,id:"
 msgid "ID"
@@ -555,11 +555,11 @@ msgstr "Referencia de proveedor"
 
 msgctxt "field:purchase.purchase,tax_amount:"
 msgid "Tax"
-msgstr "Impuesto"
+msgstr "Impuestos"
 
 msgctxt "field:purchase.purchase,tax_amount_cache:"
 msgid "Tax Cache"
-msgstr "Impuestos precalculado"
+msgstr "Impuestos precalculados"
 
 msgctxt "field:purchase.purchase,total_amount:"
 msgid "Total"
@@ -760,6 +760,10 @@ msgctxt "model:ir.action,name:act_purchase_form2"
 msgid "Purchases"
 msgstr "Compras"
 
+msgctxt "model:ir.action,name:act_purchase_invoice_relate"
+msgid "Purchases"
+msgstr "Compras"
+
 msgctxt "model:ir.action,name:act_return_form"
 msgid "Returns"
 msgstr "Devolver"
diff --git a/locale/fr_FR.po b/locale/fr_FR.po
index c1791eb..4929bc8 100644
--- a/locale/fr_FR.po
+++ b/locale/fr_FR.po
@@ -10,17 +10,6 @@ msgctxt "error:account.invoice:"
 msgid "You cannot reset to draft an invoice generated by a purchase."
 msgstr "Vous ne pouvez pas réinitialiser une facture générée par un achat."
 
-msgctxt "error:account.invoice:"
-msgid "You cannot reset to draft an invoice generated by a purchase."
-msgstr "Vous ne pouvez pas réinitialiser une facture générée par un achat."
-
-msgctxt "error:product.template:"
-msgid ""
-"Purchase prices are based on the purchase uom, are you sure to change it?"
-msgstr ""
-"Les prix d'achat sont basé sur l'UDM d'achat, êtes-vous sûr de vouloir la "
-"modifier ?"
-
 msgctxt "error:product.template:"
 msgid ""
 "Purchase prices are based on the purchase uom, are you sure to change it?"
@@ -149,7 +138,7 @@ msgstr "ID"
 
 msgctxt "field:purchase.handle.shipment.exception.ask,recreate_moves:"
 msgid "Recreate Moves"
-msgstr "Recréer les mouvements"
+msgstr "Recréer des mouvements"
 
 msgctxt "field:purchase.line,amount:"
 msgid "Amount"
@@ -770,6 +759,10 @@ msgctxt "model:ir.action,name:act_purchase_form2"
 msgid "Purchases"
 msgstr "Achats"
 
+msgctxt "model:ir.action,name:act_purchase_invoice_relate"
+msgid "Purchases"
+msgstr "Achats"
+
 msgctxt "model:ir.action,name:act_return_form"
 msgid "Returns"
 msgstr "Retours"
@@ -906,30 +899,14 @@ msgid "Amount"
 msgstr "Montant"
 
 msgctxt "odt:purchase.purchase:"
-msgid "Amount"
-msgstr "Montant"
-
-msgctxt "odt:purchase.purchase:"
 msgid "Date:"
-msgstr "Date:"
-
-msgctxt "odt:purchase.purchase:"
-msgid "Date:"
-msgstr "Date:"
+msgstr "Date :"
 
 msgctxt "odt:purchase.purchase:"
 msgid "Description"
 msgstr "Description"
 
 msgctxt "odt:purchase.purchase:"
-msgid "Description"
-msgstr "Description"
-
-msgctxt "odt:purchase.purchase:"
-msgid "Description:"
-msgstr "Description:"
-
-msgctxt "odt:purchase.purchase:"
 msgid "Description:"
 msgstr "Description:"
 
@@ -938,14 +915,6 @@ msgid "Draft Purchase Order"
 msgstr "Commande d'achat"
 
 msgctxt "odt:purchase.purchase:"
-msgid "Draft Purchase Order"
-msgstr "Commande d'achat"
-
-msgctxt "odt:purchase.purchase:"
-msgid "E-Mail:"
-msgstr "E-Mail:"
-
-msgctxt "odt:purchase.purchase:"
 msgid "E-Mail:"
 msgstr "E-Mail:"
 
@@ -954,22 +923,10 @@ msgid "Phone:"
 msgstr "Téléphone"
 
 msgctxt "odt:purchase.purchase:"
-msgid "Phone:"
-msgstr "Téléphone"
-
-msgctxt "odt:purchase.purchase:"
 msgid "Purchase Order N°:"
 msgstr "Commande d'achat n° :"
 
 msgctxt "odt:purchase.purchase:"
-msgid "Purchase Order N°:"
-msgstr "Commande d'achat n° :"
-
-msgctxt "odt:purchase.purchase:"
-msgid "Quantity"
-msgstr "Quantité"
-
-msgctxt "odt:purchase.purchase:"
 msgid "Quantity"
 msgstr "Quantité"
 
@@ -978,14 +935,6 @@ msgid "Request for Quotation N°:"
 msgstr "Demande pour le devis n°"
 
 msgctxt "odt:purchase.purchase:"
-msgid "Request for Quotation N°:"
-msgstr "Demande pour le devis n°"
-
-msgctxt "odt:purchase.purchase:"
-msgid "Taxes"
-msgstr "Taxes"
-
-msgctxt "odt:purchase.purchase:"
 msgid "Taxes"
 msgstr "Taxes"
 
@@ -994,14 +943,6 @@ msgid "Taxes:"
 msgstr "Taxes:"
 
 msgctxt "odt:purchase.purchase:"
-msgid "Taxes:"
-msgstr "Taxes:"
-
-msgctxt "odt:purchase.purchase:"
-msgid "Total (excl. taxes):"
-msgstr "Total (htva)"
-
-msgctxt "odt:purchase.purchase:"
 msgid "Total (excl. taxes):"
 msgstr "Total (htva)"
 
@@ -1010,28 +951,12 @@ msgid "Total:"
 msgstr "Total:"
 
 msgctxt "odt:purchase.purchase:"
-msgid "Total:"
-msgstr "Total:"
-
-msgctxt "odt:purchase.purchase:"
-msgid "Unit Price"
-msgstr "Prix unitaire"
-
-msgctxt "odt:purchase.purchase:"
 msgid "Unit Price"
 msgstr "Prix unitaire"
 
 msgctxt "odt:purchase.purchase:"
 msgid "VAT Number:"
-msgstr "Numéro TVA:"
-
-msgctxt "odt:purchase.purchase:"
-msgid "VAT Number:"
-msgstr "Numéro TVA:"
-
-msgctxt "odt:purchase.purchase:"
-msgid "VAT:"
-msgstr "TVA:"
+msgstr "Numéro TVA :"
 
 msgctxt "odt:purchase.purchase:"
 msgid "VAT:"
@@ -1042,14 +967,6 @@ msgid ""
 msgstr ""
 
 msgctxt "selection:account.invoice,purchase_exception_state:"
-msgid ""
-msgstr ""
-
-msgctxt "selection:account.invoice,purchase_exception_state:"
-msgid "Ignored"
-msgstr "Ignoré"
-
-msgctxt "selection:account.invoice,purchase_exception_state:"
 msgid "Ignored"
 msgstr "Ignoré"
 
@@ -1057,14 +974,6 @@ msgctxt "selection:account.invoice,purchase_exception_state:"
 msgid "Recreated"
 msgstr "Recréé"
 
-msgctxt "selection:account.invoice,purchase_exception_state:"
-msgid "Recreated"
-msgstr "Recréé"
-
-msgctxt "selection:purchase.configuration,purchase_invoice_method:"
-msgid "Based On Order"
-msgstr "Basé sur la commande"
-
 msgctxt "selection:purchase.configuration,purchase_invoice_method:"
 msgid "Based On Order"
 msgstr "Basé sur la commande"
@@ -1074,14 +983,6 @@ msgid "Based On Shipment"
 msgstr "Basé sur la livraison"
 
 msgctxt "selection:purchase.configuration,purchase_invoice_method:"
-msgid "Based On Shipment"
-msgstr "Basé sur la livraison"
-
-msgctxt "selection:purchase.configuration,purchase_invoice_method:"
-msgid "Manual"
-msgstr "Manuel"
-
-msgctxt "selection:purchase.configuration,purchase_invoice_method:"
 msgid "Manual"
 msgstr "Manuel"
 
@@ -1090,14 +991,6 @@ msgid "Comment"
 msgstr "Commentaire"
 
 msgctxt "selection:purchase.line,type:"
-msgid "Comment"
-msgstr "Commentaire"
-
-msgctxt "selection:purchase.line,type:"
-msgid "Line"
-msgstr "Ligne"
-
-msgctxt "selection:purchase.line,type:"
 msgid "Line"
 msgstr "Ligne"
 
@@ -1106,14 +999,6 @@ msgid "Subtotal"
 msgstr "Sous-total"
 
 msgctxt "selection:purchase.line,type:"
-msgid "Subtotal"
-msgstr "Sous-total"
-
-msgctxt "selection:purchase.line,type:"
-msgid "Title"
-msgstr "Titre"
-
-msgctxt "selection:purchase.line,type:"
 msgid "Title"
 msgstr "Titre"
 
@@ -1122,14 +1007,6 @@ msgid "Based On Order"
 msgstr "Basé sur la commande"
 
 msgctxt "selection:purchase.purchase,invoice_method:"
-msgid "Based On Order"
-msgstr "Basé sur la commande"
-
-msgctxt "selection:purchase.purchase,invoice_method:"
-msgid "Based On Shipment"
-msgstr "Basé sur la livraison"
-
-msgctxt "selection:purchase.purchase,invoice_method:"
 msgid "Based On Shipment"
 msgstr "Basé sur la livraison"
 
@@ -1137,23 +1014,11 @@ msgctxt "selection:purchase.purchase,invoice_method:"
 msgid "Manual"
 msgstr "Manuel"
 
-msgctxt "selection:purchase.purchase,invoice_method:"
-msgid "Manual"
-msgstr "Manuel"
-
 msgctxt "selection:purchase.purchase,invoice_state:"
 msgid "Exception"
 msgstr "Exception"
 
 msgctxt "selection:purchase.purchase,invoice_state:"
-msgid "Exception"
-msgstr "Exception"
-
-msgctxt "selection:purchase.purchase,invoice_state:"
-msgid "None"
-msgstr "Aucun"
-
-msgctxt "selection:purchase.purchase,invoice_state:"
 msgid "None"
 msgstr "Aucun"
 
@@ -1162,14 +1027,6 @@ msgid "Paid"
 msgstr "Payé"
 
 msgctxt "selection:purchase.purchase,invoice_state:"
-msgid "Paid"
-msgstr "Payé"
-
-msgctxt "selection:purchase.purchase,invoice_state:"
-msgid "Waiting"
-msgstr "En attente"
-
-msgctxt "selection:purchase.purchase,invoice_state:"
 msgid "Waiting"
 msgstr "En attente"
 
@@ -1178,14 +1035,6 @@ msgid "Exception"
 msgstr "Exception"
 
 msgctxt "selection:purchase.purchase,shipment_state:"
-msgid "Exception"
-msgstr "Exception"
-
-msgctxt "selection:purchase.purchase,shipment_state:"
-msgid "None"
-msgstr "Aucun"
-
-msgctxt "selection:purchase.purchase,shipment_state:"
 msgid "None"
 msgstr "Aucun"
 
@@ -1194,14 +1043,6 @@ msgid "Received"
 msgstr "Reçu"
 
 msgctxt "selection:purchase.purchase,shipment_state:"
-msgid "Received"
-msgstr "Reçu"
-
-msgctxt "selection:purchase.purchase,shipment_state:"
-msgid "Waiting"
-msgstr "En attente"
-
-msgctxt "selection:purchase.purchase,shipment_state:"
 msgid "Waiting"
 msgstr "En attente"
 
@@ -1210,22 +1051,10 @@ msgid "Canceled"
 msgstr "Annulé"
 
 msgctxt "selection:purchase.purchase,state:"
-msgid "Canceled"
-msgstr "Annulé"
-
-msgctxt "selection:purchase.purchase,state:"
 msgid "Confirmed"
 msgstr "Confirmé"
 
 msgctxt "selection:purchase.purchase,state:"
-msgid "Confirmed"
-msgstr "Confirmé"
-
-msgctxt "selection:purchase.purchase,state:"
-msgid "Done"
-msgstr "Fait"
-
-msgctxt "selection:purchase.purchase,state:"
 msgid "Done"
 msgstr "Fait"
 
@@ -1234,21 +1063,9 @@ msgid "Draft"
 msgstr "Brouillon"
 
 msgctxt "selection:purchase.purchase,state:"
-msgid "Draft"
-msgstr "Brouillon"
-
-msgctxt "selection:purchase.purchase,state:"
 msgid "Quotation"
 msgstr "Devis"
 
-msgctxt "selection:purchase.purchase,state:"
-msgid "Quotation"
-msgstr "Devis"
-
-msgctxt "selection:stock.move,purchase_exception_state:"
-msgid ""
-msgstr ""
-
 msgctxt "selection:stock.move,purchase_exception_state:"
 msgid ""
 msgstr ""
@@ -1258,14 +1075,6 @@ msgid "Ignored"
 msgstr "Ignoré"
 
 msgctxt "selection:stock.move,purchase_exception_state:"
-msgid "Ignored"
-msgstr "Ignoré"
-
-msgctxt "selection:stock.move,purchase_exception_state:"
-msgid "Recreated"
-msgstr "Recréé"
-
-msgctxt "selection:stock.move,purchase_exception_state:"
 msgid "Recreated"
 msgstr "Recréé"
 
@@ -1277,14 +1086,6 @@ msgctxt "view:product.template:"
 msgid "Suppliers"
 msgstr "Fournisseurs"
 
-msgctxt "view:product.template:"
-msgid "Suppliers"
-msgstr "Fournisseurs"
-
-msgctxt "view:purchase.configuration:"
-msgid "Purchase Configuration"
-msgstr "Configuration des achats"
-
 msgctxt "view:purchase.configuration:"
 msgid "Purchase Configuration"
 msgstr "Configuration des achats"
@@ -1294,14 +1095,6 @@ msgid "Choose invoices to recreate"
 msgstr "Choisir les factures à recréer"
 
 msgctxt "view:purchase.handle.invoice.exception.ask:"
-msgid "Choose invoices to recreate"
-msgstr "Choisir les factures à recréer"
-
-msgctxt "view:purchase.handle.invoice.exception.ask:"
-msgid "Handle Invoice Exception"
-msgstr "Gérer l'exception de facture"
-
-msgctxt "view:purchase.handle.invoice.exception.ask:"
 msgid "Handle Invoice Exception"
 msgstr "Gérer l'exception de facture"
 
@@ -1310,14 +1103,6 @@ msgid "Choose move to recreate"
 msgstr "Choisir le mouvement à recréer"
 
 msgctxt "view:purchase.handle.shipment.exception.ask:"
-msgid "Choose move to recreate"
-msgstr "Choisir le mouvement à recréer"
-
-msgctxt "view:purchase.handle.shipment.exception.ask:"
-msgid "Handle shipment Exception"
-msgstr "Gérer l'exception d'expédition"
-
-msgctxt "view:purchase.handle.shipment.exception.ask:"
 msgid "Handle shipment Exception"
 msgstr "Gérer l'exception d'expédition"
 
@@ -1326,10 +1111,6 @@ msgid "General"
 msgstr "Général"
 
 msgctxt "view:purchase.line:"
-msgid "General"
-msgstr "Général"
-
-msgctxt "view:purchase.line:"
 msgid "Lines"
 msgstr "Lignes"
 
@@ -1338,14 +1119,6 @@ msgid "Notes"
 msgstr "Notes"
 
 msgctxt "view:purchase.line:"
-msgid "Notes"
-msgstr "Notes"
-
-msgctxt "view:purchase.line:"
-msgid "Purchase Line"
-msgstr "Ligne d'achat"
-
-msgctxt "view:purchase.line:"
 msgid "Purchase Line"
 msgstr "Ligne d'achat"
 
@@ -1353,14 +1126,6 @@ msgctxt "view:purchase.line:"
 msgid "Purchase Lines"
 msgstr "Lignes d'achat"
 
-msgctxt "view:purchase.line:"
-msgid "Purchase Lines"
-msgstr "Lignes d'achat"
-
-msgctxt "view:purchase.product_supplier.price:"
-msgid "Product Supplier Price"
-msgstr "Prix du fournisseur du produit"
-
 msgctxt "view:purchase.product_supplier.price:"
 msgid "Product Supplier Price"
 msgstr "Prix du fournisseur du produit"
@@ -1369,14 +1134,6 @@ msgctxt "view:purchase.product_supplier.price:"
 msgid "Product Supplier Prices"
 msgstr "Prix du fournisseur du produit"
 
-msgctxt "view:purchase.product_supplier.price:"
-msgid "Product Supplier Prices"
-msgstr "Prix du fournisseur du produit"
-
-msgctxt "view:purchase.product_supplier:"
-msgid "Product Supplier"
-msgstr "Fournisseur du produit"
-
 msgctxt "view:purchase.product_supplier:"
 msgid "Product Supplier"
 msgstr "Fournisseur du produit"
@@ -1385,14 +1142,6 @@ msgctxt "view:purchase.product_supplier:"
 msgid "Product Suppliers"
 msgstr "Fournisseurs du produit"
 
-msgctxt "view:purchase.product_supplier:"
-msgid "Product Suppliers"
-msgstr "Fournisseurs du produit"
-
-msgctxt "view:purchase.purchase:"
-msgid "Cancel"
-msgstr "Annuler"
-
 msgctxt "view:purchase.purchase:"
 msgid "Cancel"
 msgstr "Annuler"
@@ -1402,22 +1151,10 @@ msgid "Confirm"
 msgstr "Confirmer"
 
 msgctxt "view:purchase.purchase:"
-msgid "Confirm"
-msgstr "Confirmer"
-
-msgctxt "view:purchase.purchase:"
 msgid "Draft"
 msgstr "Brouillon"
 
 msgctxt "view:purchase.purchase:"
-msgid "Draft"
-msgstr "Brouillon"
-
-msgctxt "view:purchase.purchase:"
-msgid "Handle Invoice Exception"
-msgstr "Gérer l'exception de facture"
-
-msgctxt "view:purchase.purchase:"
 msgid "Handle Invoice Exception"
 msgstr "Gérer l'exception de facture"
 
@@ -1426,14 +1163,6 @@ msgid "Handle Shipment Exception"
 msgstr "Gérer l'exception d'expédition"
 
 msgctxt "view:purchase.purchase:"
-msgid "Handle Shipment Exception"
-msgstr "Gérer l'exception d'expédition"
-
-msgctxt "view:purchase.purchase:"
-msgid "Invoices"
-msgstr "Factures"
-
-msgctxt "view:purchase.purchase:"
 msgid "Invoices"
 msgstr "Factures"
 
@@ -1442,14 +1171,6 @@ msgid "Other Info"
 msgstr "Autre information"
 
 msgctxt "view:purchase.purchase:"
-msgid "Other Info"
-msgstr "Autre information"
-
-msgctxt "view:purchase.purchase:"
-msgid "Purchase"
-msgstr "Achat"
-
-msgctxt "view:purchase.purchase:"
 msgid "Purchase"
 msgstr "Achat"
 
@@ -1458,10 +1179,6 @@ msgid "Purchases"
 msgstr "Achats"
 
 msgctxt "view:purchase.purchase:"
-msgid "Purchases"
-msgstr "Achats"
-
-msgctxt "view:purchase.purchase:"
 msgid "Quote"
 msgstr "Devis"
 
@@ -1469,10 +1186,6 @@ msgctxt "view:purchase.purchase:"
 msgid "Shipments"
 msgstr "Expéditions"
 
-msgctxt "view:purchase.purchase:"
-msgid "Shipments"
-msgstr "Expéditions"
-
 msgctxt "view:stock.move:"
 msgid "Moves"
 msgstr "Mouvements"
diff --git a/locale/nl_NL.po b/locale/nl_NL.po
index bf39673..4c9c7c2 100644
--- a/locale/nl_NL.po
+++ b/locale/nl_NL.po
@@ -827,6 +827,10 @@ msgctxt "model:ir.action,name:act_purchase_form2"
 msgid "Purchases"
 msgstr ""
 
+msgctxt "model:ir.action,name:act_purchase_invoice_relate"
+msgid "Purchases"
+msgstr ""
+
 msgctxt "model:ir.action,name:act_return_form"
 msgid "Returns"
 msgstr ""
diff --git a/locale/ru_RU.po b/locale/ru_RU.po
index 703403d..5291128 100644
--- a/locale/ru_RU.po
+++ b/locale/ru_RU.po
@@ -756,6 +756,11 @@ msgctxt "model:ir.action,name:act_purchase_form2"
 msgid "Purchases"
 msgstr "Покупки"
 
+#, fuzzy
+msgctxt "model:ir.action,name:act_purchase_invoice_relate"
+msgid "Purchases"
+msgstr "Покупки"
+
 msgctxt "model:ir.action,name:act_return_form"
 msgid "Returns"
 msgstr "Возвраты"
diff --git a/locale/nl_NL.po b/locale/sl_SI.po
similarity index 75%
copy from locale/nl_NL.po
copy to locale/sl_SI.po
index bf39673..ea0b3f1 100644
--- a/locale/nl_NL.po
+++ b/locale/sl_SI.po
@@ -4,1345 +4,1213 @@ msgstr "Content-Type: text/plain; charset=utf-8\n"
 
 msgctxt "error:account.invoice:"
 msgid "You can not delete invoices that come from a purchase."
-msgstr ""
+msgstr "Računov, izhajajočih iz nabavnih nalogov, ni možno brisati."
 
 msgctxt "error:account.invoice:"
 msgid "You cannot reset to draft an invoice generated by a purchase."
 msgstr ""
+"Računa, ustvarjenega iz nabavnega naloga, ni možno prestaviti v stanje "
+"osnutka."
 
 msgctxt "error:product.template:"
 msgid ""
 "Purchase prices are based on the purchase uom, are you sure to change it?"
 msgstr ""
+"Nabavne cene so zasnovane na nabavni ME. Ali jo res želite spremeniti?"
 
 msgctxt "error:purchase.line:"
 msgid ""
 "Product \"%(product)s\" of purchase %(purchase)s misses an expense account."
 msgstr ""
+"Izdelku \"%(product)s\" na nabavnem nalogu %(purchase)s manjka odhodkovni "
+"konto."
 
 msgctxt "error:purchase.line:"
 msgid "Purchase \"%(purchase)s\" misses an \"account expense\" default property."
 msgstr ""
+"Nabavnemu nalogu \"%(purchase)s\" manjka privzeta lastnost odhodkovnega "
+"konta."
 
 msgctxt "error:purchase.line:"
 msgid "Purchase \"%(purchase)s\" misses the supplier location for line \"%(line)s\"."
 msgstr ""
+"Postavki \"%(line)s\" na nabavnem nalogu \"%(purchase)s\" manjka "
+"dobaviteljeva lokacija."
 
 msgctxt "error:purchase.purchase:"
 msgid "A warehouse must be defined for quotation of sale \"%s\"."
-msgstr ""
+msgstr "Za ponudbo \"%s\" mora biti določeno skladišče."
 
 msgctxt "error:purchase.purchase:"
 msgid "Invoice address must be defined for quotation of sale \"%s\"."
-msgstr ""
+msgstr "Za ponudbo \"%s\" mora biti določen plačnik."
 
 msgctxt "error:purchase.purchase:"
 msgid "Missing \"Account Payable\" on party \"%s\"."
-msgstr ""
+msgstr "Za stranko \"%s\" manjka terjatveni konto."
 
 msgctxt "error:purchase.purchase:"
 msgid "Purchase \"%s\" must be cancelled before deletion."
-msgstr ""
+msgstr "Pred brisanjem je potrebno nabavni nalog \"%s\" preklicati."
 
 msgctxt "error:stock.shipment.in.return:"
 msgid "You cannot reset to draft a move generated by a purchase."
 msgstr ""
+"Prometa, ustvarjenega iz nabavnega naloga, ni možno prestaviti v stanje "
+"osnutka."
 
 msgctxt "error:stock.shipment.in:"
 msgid ""
 "You cannot reset to draft move \"%s\" because it was generated by a "
 "purchase."
 msgstr ""
+"Prometa \"%s\", ustvarjenega iz nabavnega naloga, ni možno prestaviti v "
+"stanje osnutka."
 
-#, fuzzy
 msgctxt "field:account.invoice,purchase_exception_state:"
 msgid "Exception State"
-msgstr "Uitzonderingstoestand"
+msgstr "Pridržano"
 
 msgctxt "field:account.invoice,purchases:"
 msgid "Purchases"
-msgstr ""
+msgstr "Nabavni nalogi"
 
 msgctxt "field:product.template,product_suppliers:"
 msgid "Suppliers"
-msgstr ""
+msgstr "Dobavitelji"
 
 msgctxt "field:product.template,purchasable:"
 msgid "Purchasable"
-msgstr ""
+msgstr "Za nabavo"
 
 msgctxt "field:product.template,purchase_uom:"
 msgid "Purchase UOM"
-msgstr ""
+msgstr "Nabavna ME"
 
 msgctxt "field:purchase.configuration,create_date:"
 msgid "Create Date"
-msgstr ""
+msgstr "Ustvarjeno"
 
 msgctxt "field:purchase.configuration,create_uid:"
 msgid "Create User"
-msgstr ""
+msgstr "Ustvaril"
 
 msgctxt "field:purchase.configuration,id:"
 msgid "ID"
-msgstr ""
+msgstr "ID"
 
-#, fuzzy
 msgctxt "field:purchase.configuration,purchase_invoice_method:"
 msgid "Invoice Method"
-msgstr "Factuur afhandeling"
+msgstr "Način obračuna"
 
 msgctxt "field:purchase.configuration,purchase_sequence:"
 msgid "Purchase Reference Sequence"
-msgstr ""
+msgstr "Štetje nabavnih nalogov"
 
-#, fuzzy
 msgctxt "field:purchase.configuration,rec_name:"
 msgid "Name"
-msgstr "Naam bijlage"
+msgstr "Ime"
 
 msgctxt "field:purchase.configuration,write_date:"
 msgid "Write Date"
-msgstr ""
+msgstr "Zapisano"
 
 msgctxt "field:purchase.configuration,write_uid:"
 msgid "Write User"
-msgstr ""
+msgstr "Zapisal"
 
-#, fuzzy
 msgctxt "field:purchase.handle.invoice.exception.ask,domain_invoices:"
 msgid "Domain Invoices"
-msgstr "Domein facturen"
+msgstr "Vključeni računi"
 
 msgctxt "field:purchase.handle.invoice.exception.ask,id:"
 msgid "ID"
-msgstr ""
+msgstr "ID"
 
-#, fuzzy
 msgctxt "field:purchase.handle.invoice.exception.ask,recreate_invoices:"
 msgid "Recreate Invoices"
-msgstr "Facturen opnieuw aanmaken"
+msgstr "Poustvarjeni računi"
 
-#, fuzzy
 msgctxt "field:purchase.handle.shipment.exception.ask,domain_moves:"
 msgid "Domain Moves"
-msgstr "Domein boekingen"
+msgstr "Vključen promet"
 
 msgctxt "field:purchase.handle.shipment.exception.ask,id:"
 msgid "ID"
-msgstr ""
+msgstr "ID"
 
-#, fuzzy
 msgctxt "field:purchase.handle.shipment.exception.ask,recreate_moves:"
 msgid "Recreate Moves"
-msgstr "Boekingen opnieuw aanmaken"
+msgstr "Poustvarjen promet"
 
-#, fuzzy
 msgctxt "field:purchase.line,amount:"
 msgid "Amount"
-msgstr "Bedrag"
+msgstr "Znesek"
 
 msgctxt "field:purchase.line,create_date:"
 msgid "Create Date"
-msgstr ""
+msgstr "Ustvarjeno"
 
 msgctxt "field:purchase.line,create_uid:"
 msgid "Create User"
-msgstr ""
+msgstr "Ustvaril"
 
 msgctxt "field:purchase.line,delivery_date:"
 msgid "Delivery Date"
-msgstr ""
+msgstr "Dostavljeno"
 
-#, fuzzy
 msgctxt "field:purchase.line,description:"
 msgid "Description"
-msgstr "Specificatie"
+msgstr "Opis"
 
 msgctxt "field:purchase.line,from_location:"
 msgid "From Location"
-msgstr ""
+msgstr "Iz lokacije"
 
 msgctxt "field:purchase.line,id:"
 msgid "ID"
-msgstr ""
+msgstr "ID"
 
-#, fuzzy
 msgctxt "field:purchase.line,invoice_lines:"
 msgid "Invoice Lines"
-msgstr "Factuurregels"
+msgstr "Postavke računa"
 
-#, fuzzy
 msgctxt "field:purchase.line,move_done:"
 msgid "Moves Done"
-msgstr "Boekingen klaar"
+msgstr "Zaključen promet"
 
-#, fuzzy
 msgctxt "field:purchase.line,move_exception:"
 msgid "Moves Exception"
-msgstr "Boekingen uitzondering"
+msgstr "Pridržani promet"
 
-#, fuzzy
 msgctxt "field:purchase.line,moves:"
 msgid "Moves"
-msgstr "Boekingen"
+msgstr "Promet"
 
-#, fuzzy
 msgctxt "field:purchase.line,moves_ignored:"
 msgid "Ignored Moves"
-msgstr "Genegeerde boekingen"
+msgstr "Prezrt promet"
 
-#, fuzzy
 msgctxt "field:purchase.line,moves_recreated:"
 msgid "Recreated Moves"
-msgstr "Opnieuw aangemaakte boekingen"
+msgstr "Poustvarjen promet"
 
-#, fuzzy
 msgctxt "field:purchase.line,note:"
 msgid "Note"
-msgstr "Aantekening"
+msgstr "Opomba"
 
-#, fuzzy
 msgctxt "field:purchase.line,product:"
 msgid "Product"
-msgstr "Producten"
+msgstr "Izdelek"
 
 msgctxt "field:purchase.line,product_uom_category:"
 msgid "Product Uom Category"
-msgstr ""
+msgstr "Katerogija EM izdelka"
 
 msgctxt "field:purchase.line,purchase:"
 msgid "Purchase"
-msgstr ""
+msgstr "Nabavni nalog"
 
-#, fuzzy
 msgctxt "field:purchase.line,quantity:"
 msgid "Quantity"
-msgstr "Hoeveelheid"
+msgstr "Količina"
 
-#, fuzzy
 msgctxt "field:purchase.line,rec_name:"
 msgid "Name"
-msgstr "Naam bijlage"
+msgstr "Ime"
 
-#, fuzzy
 msgctxt "field:purchase.line,sequence:"
 msgid "Sequence"
-msgstr "Reeks"
+msgstr "Zap.št."
 
-#, fuzzy
 msgctxt "field:purchase.line,taxes:"
 msgid "Taxes"
-msgstr "Belastingen"
+msgstr "Davki"
 
 msgctxt "field:purchase.line,to_location:"
 msgid "To Location"
-msgstr ""
+msgstr "Na lokacijo"
 
-#, fuzzy
 msgctxt "field:purchase.line,type:"
 msgid "Type"
-msgstr "Type"
+msgstr "Vrsta"
 
-#, fuzzy
 msgctxt "field:purchase.line,unit:"
 msgid "Unit"
-msgstr "Eenheid"
+msgstr "enota"
 
-#, fuzzy
 msgctxt "field:purchase.line,unit_digits:"
 msgid "Unit Digits"
-msgstr "Decimalen eenheid"
+msgstr "Decimalke"
 
-#, fuzzy
 msgctxt "field:purchase.line,unit_price:"
 msgid "Unit Price"
-msgstr "Eenheidsprijs"
+msgstr "Cena"
 
 msgctxt "field:purchase.line,write_date:"
 msgid "Write Date"
-msgstr ""
+msgstr "Zapisano"
 
 msgctxt "field:purchase.line,write_uid:"
 msgid "Write User"
-msgstr ""
+msgstr "Zapisal"
 
 msgctxt "field:purchase.line-account.tax,create_date:"
 msgid "Create Date"
-msgstr ""
+msgstr "Ustvarjeno"
 
 msgctxt "field:purchase.line-account.tax,create_uid:"
 msgid "Create User"
-msgstr ""
+msgstr "Ustvaril"
 
 msgctxt "field:purchase.line-account.tax,id:"
 msgid "ID"
-msgstr ""
+msgstr "ID"
 
 msgctxt "field:purchase.line-account.tax,line:"
 msgid "Purchase Line"
-msgstr ""
+msgstr "Nabavna postavka"
 
-#, fuzzy
 msgctxt "field:purchase.line-account.tax,rec_name:"
 msgid "Name"
-msgstr "Naam bijlage"
+msgstr "Ime"
 
-#, fuzzy
 msgctxt "field:purchase.line-account.tax,tax:"
 msgid "Tax"
-msgstr "Belasting"
+msgstr "Davek"
 
 msgctxt "field:purchase.line-account.tax,write_date:"
 msgid "Write Date"
-msgstr ""
+msgstr "Zapisano"
 
 msgctxt "field:purchase.line-account.tax,write_uid:"
 msgid "Write User"
-msgstr ""
+msgstr "Zapisal"
 
 msgctxt "field:purchase.line-ignored-stock.move,create_date:"
 msgid "Create Date"
-msgstr ""
+msgstr "Ustvarjeno"
 
 msgctxt "field:purchase.line-ignored-stock.move,create_uid:"
 msgid "Create User"
-msgstr ""
+msgstr "Ustvaril"
 
 msgctxt "field:purchase.line-ignored-stock.move,id:"
 msgid "ID"
-msgstr ""
+msgstr "ID"
 
-#, fuzzy
 msgctxt "field:purchase.line-ignored-stock.move,move:"
 msgid "Move"
-msgstr "Boeking"
+msgstr "Promet"
 
 msgctxt "field:purchase.line-ignored-stock.move,purchase_line:"
 msgid "Purchase Line"
-msgstr ""
+msgstr "Nabavna postavka"
 
-#, fuzzy
 msgctxt "field:purchase.line-ignored-stock.move,rec_name:"
 msgid "Name"
-msgstr "Naam bijlage"
+msgstr "Ime"
 
 msgctxt "field:purchase.line-ignored-stock.move,write_date:"
 msgid "Write Date"
-msgstr ""
+msgstr "Zapisano"
 
 msgctxt "field:purchase.line-ignored-stock.move,write_uid:"
 msgid "Write User"
-msgstr ""
+msgstr "Zapisal"
 
 msgctxt "field:purchase.line-recreated-stock.move,create_date:"
 msgid "Create Date"
-msgstr ""
+msgstr "Ustvarjeno"
 
 msgctxt "field:purchase.line-recreated-stock.move,create_uid:"
 msgid "Create User"
-msgstr ""
+msgstr "Ustvaril"
 
 msgctxt "field:purchase.line-recreated-stock.move,id:"
 msgid "ID"
-msgstr ""
+msgstr "ID"
 
-#, fuzzy
 msgctxt "field:purchase.line-recreated-stock.move,move:"
 msgid "Move"
-msgstr "Boeking"
+msgstr "Promet"
 
 msgctxt "field:purchase.line-recreated-stock.move,purchase_line:"
 msgid "Purchase Line"
-msgstr ""
+msgstr "Nabavna postavka"
 
-#, fuzzy
 msgctxt "field:purchase.line-recreated-stock.move,rec_name:"
 msgid "Name"
-msgstr "Naam bijlage"
+msgstr "Ime"
 
 msgctxt "field:purchase.line-recreated-stock.move,write_date:"
 msgid "Write Date"
-msgstr ""
+msgstr "Zapisano"
 
 msgctxt "field:purchase.line-recreated-stock.move,write_uid:"
 msgid "Write User"
-msgstr ""
+msgstr "Zapisal"
 
-#, fuzzy
 msgctxt "field:purchase.product_supplier,code:"
 msgid "Code"
-msgstr "Code"
+msgstr "Šifra"
 
-#, fuzzy
 msgctxt "field:purchase.product_supplier,company:"
 msgid "Company"
-msgstr "Bedrijf"
+msgstr "Podjetje"
 
 msgctxt "field:purchase.product_supplier,create_date:"
 msgid "Create Date"
-msgstr ""
+msgstr "Ustvarjeno"
 
 msgctxt "field:purchase.product_supplier,create_uid:"
 msgid "Create User"
-msgstr ""
+msgstr "Ustvaril"
 
-#, fuzzy
 msgctxt "field:purchase.product_supplier,currency:"
 msgid "Currency"
 msgstr "Valuta"
 
 msgctxt "field:purchase.product_supplier,delivery_time:"
 msgid "Delivery Time"
-msgstr ""
+msgstr "Dostavljeno"
 
 msgctxt "field:purchase.product_supplier,id:"
 msgid "ID"
-msgstr ""
+msgstr "ID"
 
-#, fuzzy
 msgctxt "field:purchase.product_supplier,name:"
 msgid "Name"
-msgstr "Naam bijlage"
+msgstr "Naziv"
 
-#, fuzzy
 msgctxt "field:purchase.product_supplier,party:"
 msgid "Supplier"
-msgstr "Leverancier"
+msgstr "Dobavitelj"
 
 msgctxt "field:purchase.product_supplier,prices:"
 msgid "Prices"
-msgstr ""
+msgstr "Cene"
 
-#, fuzzy
 msgctxt "field:purchase.product_supplier,product:"
 msgid "Product"
-msgstr "Producten"
+msgstr "Izdelek"
 
-#, fuzzy
 msgctxt "field:purchase.product_supplier,rec_name:"
 msgid "Name"
-msgstr "Naam bijlage"
+msgstr "Ime"
 
-#, fuzzy
 msgctxt "field:purchase.product_supplier,sequence:"
 msgid "Sequence"
-msgstr "Reeks"
+msgstr "Zap.št."
 
 msgctxt "field:purchase.product_supplier,write_date:"
 msgid "Write Date"
-msgstr ""
+msgstr "Zapisano"
 
 msgctxt "field:purchase.product_supplier,write_uid:"
 msgid "Write User"
-msgstr ""
+msgstr "Zapisal"
 
 msgctxt "field:purchase.product_supplier.price,create_date:"
 msgid "Create Date"
-msgstr ""
+msgstr "Ustvarjeno"
 
 msgctxt "field:purchase.product_supplier.price,create_uid:"
 msgid "Create User"
-msgstr ""
+msgstr "Ustvaril"
 
 msgctxt "field:purchase.product_supplier.price,id:"
 msgid "ID"
-msgstr ""
+msgstr "ID"
 
-#, fuzzy
 msgctxt "field:purchase.product_supplier.price,product_supplier:"
 msgid "Supplier"
-msgstr "Leverancier"
+msgstr "Dobavitelj"
 
-#, fuzzy
 msgctxt "field:purchase.product_supplier.price,quantity:"
 msgid "Quantity"
-msgstr "Hoeveelheid"
+msgstr "Količina"
 
-#, fuzzy
 msgctxt "field:purchase.product_supplier.price,rec_name:"
 msgid "Name"
-msgstr "Naam bijlage"
+msgstr "Ime"
 
-#, fuzzy
 msgctxt "field:purchase.product_supplier.price,unit_price:"
 msgid "Unit Price"
-msgstr "Eenheidsprijs"
+msgstr "Cena"
 
 msgctxt "field:purchase.product_supplier.price,write_date:"
 msgid "Write Date"
-msgstr ""
+msgstr "Zapisano"
 
 msgctxt "field:purchase.product_supplier.price,write_uid:"
 msgid "Write User"
-msgstr ""
+msgstr "Zapisal"
 
-#, fuzzy
 msgctxt "field:purchase.purchase,comment:"
 msgid "Comment"
-msgstr "Opmerking"
+msgstr "Opomba"
 
-#, fuzzy
 msgctxt "field:purchase.purchase,company:"
 msgid "Company"
-msgstr "Bedrijf"
+msgstr "Podjetje"
 
 msgctxt "field:purchase.purchase,create_date:"
 msgid "Create Date"
-msgstr ""
+msgstr "Ustvarjeno"
 
 msgctxt "field:purchase.purchase,create_uid:"
 msgid "Create User"
-msgstr ""
+msgstr "Ustvaril"
 
-#, fuzzy
 msgctxt "field:purchase.purchase,currency:"
 msgid "Currency"
 msgstr "Valuta"
 
-#, fuzzy
 msgctxt "field:purchase.purchase,currency_digits:"
 msgid "Currency Digits"
-msgstr "Valuta decimalen"
+msgstr "Decimalke"
 
-#, fuzzy
 msgctxt "field:purchase.purchase,description:"
 msgid "Description"
-msgstr "Specificatie"
+msgstr "Opis"
 
 msgctxt "field:purchase.purchase,id:"
 msgid "ID"
-msgstr ""
+msgstr "ID"
 
-#, fuzzy
 msgctxt "field:purchase.purchase,invoice_address:"
 msgid "Invoice Address"
-msgstr "Factuuradres"
+msgstr "Plačnik"
 
-#, fuzzy
 msgctxt "field:purchase.purchase,invoice_method:"
 msgid "Invoice Method"
-msgstr "Factuur afhandeling"
+msgstr "Način obračuna"
 
-#, fuzzy
 msgctxt "field:purchase.purchase,invoice_state:"
 msgid "Invoice State"
-msgstr "Factuur status"
+msgstr "Stanje računa"
 
-#, fuzzy
 msgctxt "field:purchase.purchase,invoices:"
 msgid "Invoices"
-msgstr "Verkoopfacturen"
+msgstr "Računi"
 
-#, fuzzy
 msgctxt "field:purchase.purchase,invoices_ignored:"
 msgid "Ignored Invoices"
-msgstr "Genegeerde facturen"
+msgstr "Prezrti računi"
 
-#, fuzzy
 msgctxt "field:purchase.purchase,invoices_recreated:"
 msgid "Recreated Invoices"
-msgstr "Opnieuw aangemaakte facturen"
+msgstr "Poustvarjeni računi"
 
-#, fuzzy
 msgctxt "field:purchase.purchase,lines:"
 msgid "Lines"
-msgstr "Regels"
+msgstr "Postavke"
 
-#, fuzzy
 msgctxt "field:purchase.purchase,moves:"
 msgid "Moves"
-msgstr "Boekingen"
+msgstr "Promet"
 
-#, fuzzy
 msgctxt "field:purchase.purchase,party:"
 msgid "Party"
-msgstr "Relaties"
+msgstr "Stranka"
 
-#, fuzzy
 msgctxt "field:purchase.purchase,party_lang:"
 msgid "Party Language"
-msgstr "Taal relatie"
+msgstr "Jezik stranke"
 
-#, fuzzy
 msgctxt "field:purchase.purchase,payment_term:"
 msgid "Payment Term"
-msgstr "Betalingstermijn"
+msgstr "Plačilni rok"
 
 msgctxt "field:purchase.purchase,purchase_date:"
 msgid "Purchase Date"
-msgstr ""
+msgstr "Nabavljeno"
 
-#, fuzzy
 msgctxt "field:purchase.purchase,rec_name:"
 msgid "Name"
-msgstr "Naam bijlage"
+msgstr "Ime"
 
-#, fuzzy
 msgctxt "field:purchase.purchase,reference:"
 msgid "Reference"
-msgstr "Referentie"
+msgstr "Sklic"
 
 msgctxt "field:purchase.purchase,shipment_returns:"
 msgid "Shipment Returns"
-msgstr ""
+msgstr "Vrnjene prevzemnice"
 
-#, fuzzy
 msgctxt "field:purchase.purchase,shipment_state:"
 msgid "Shipment State"
-msgstr "Levering status"
+msgstr "Stanje pošiljke"
 
-#, fuzzy
 msgctxt "field:purchase.purchase,shipments:"
 msgid "Shipments"
-msgstr "Leveringen"
+msgstr "Pošiljke"
 
-#, fuzzy
 msgctxt "field:purchase.purchase,state:"
 msgid "State"
-msgstr "Status"
+msgstr "Stanje"
 
 msgctxt "field:purchase.purchase,supplier_reference:"
 msgid "Supplier Reference"
-msgstr ""
+msgstr "Dobaviteljev sklic"
 
-#, fuzzy
 msgctxt "field:purchase.purchase,tax_amount:"
 msgid "Tax"
-msgstr "Belasting"
+msgstr "Davek"
 
 msgctxt "field:purchase.purchase,tax_amount_cache:"
 msgid "Tax Cache"
-msgstr ""
+msgstr "Davek predpomnjen"
 
-#, fuzzy
 msgctxt "field:purchase.purchase,total_amount:"
 msgid "Total"
-msgstr "Totaal"
+msgstr "Skupaj"
 
 msgctxt "field:purchase.purchase,total_amount_cache:"
 msgid "Total Cache"
-msgstr ""
+msgstr "Skupaj predpomnjeno"
 
-#, fuzzy
 msgctxt "field:purchase.purchase,untaxed_amount:"
 msgid "Untaxed"
-msgstr "Onbelast"
+msgstr "Neobdavčeno"
 
 msgctxt "field:purchase.purchase,untaxed_amount_cache:"
 msgid "Untaxed Cache"
-msgstr ""
+msgstr "Neobdavčeno predpomnjeno"
 
-#, fuzzy
 msgctxt "field:purchase.purchase,warehouse:"
 msgid "Warehouse"
-msgstr "Magazijn"
+msgstr "Skladišče"
 
 msgctxt "field:purchase.purchase,write_date:"
 msgid "Write Date"
-msgstr ""
+msgstr "Zapisano"
 
 msgctxt "field:purchase.purchase,write_uid:"
 msgid "Write User"
-msgstr ""
+msgstr "Zapisal"
 
 msgctxt "field:purchase.purchase-account.invoice,create_date:"
 msgid "Create Date"
-msgstr ""
+msgstr "Ustvarjeno"
 
 msgctxt "field:purchase.purchase-account.invoice,create_uid:"
 msgid "Create User"
-msgstr ""
+msgstr "Ustvaril"
 
 msgctxt "field:purchase.purchase-account.invoice,id:"
 msgid "ID"
-msgstr ""
+msgstr "ID"
 
-#, fuzzy
 msgctxt "field:purchase.purchase-account.invoice,invoice:"
 msgid "Invoice"
-msgstr "Verkoopfactuur"
+msgstr "Račun"
 
 msgctxt "field:purchase.purchase-account.invoice,purchase:"
 msgid "Purchase"
-msgstr ""
+msgstr "Nabavni nalog"
 
-#, fuzzy
 msgctxt "field:purchase.purchase-account.invoice,rec_name:"
 msgid "Name"
-msgstr "Naam bijlage"
+msgstr "Ime"
 
 msgctxt "field:purchase.purchase-account.invoice,write_date:"
 msgid "Write Date"
-msgstr ""
+msgstr "Zapisano"
 
 msgctxt "field:purchase.purchase-account.invoice,write_uid:"
 msgid "Write User"
-msgstr ""
+msgstr "Zapisal"
 
 msgctxt "field:purchase.purchase-ignored-account.invoice,create_date:"
 msgid "Create Date"
-msgstr ""
+msgstr "Ustvarjeno"
 
 msgctxt "field:purchase.purchase-ignored-account.invoice,create_uid:"
 msgid "Create User"
-msgstr ""
+msgstr "Ustvaril"
 
 msgctxt "field:purchase.purchase-ignored-account.invoice,id:"
 msgid "ID"
-msgstr ""
+msgstr "ID"
 
-#, fuzzy
 msgctxt "field:purchase.purchase-ignored-account.invoice,invoice:"
 msgid "Invoice"
-msgstr "Verkoopfactuur"
+msgstr "Račun"
 
 msgctxt "field:purchase.purchase-ignored-account.invoice,purchase:"
 msgid "Purchase"
-msgstr ""
+msgstr "Nabavni nalog"
 
-#, fuzzy
 msgctxt "field:purchase.purchase-ignored-account.invoice,rec_name:"
 msgid "Name"
-msgstr "Naam bijlage"
+msgstr "Ime"
 
 msgctxt "field:purchase.purchase-ignored-account.invoice,write_date:"
 msgid "Write Date"
-msgstr ""
+msgstr "Zapisano"
 
 msgctxt "field:purchase.purchase-ignored-account.invoice,write_uid:"
 msgid "Write User"
-msgstr ""
+msgstr "Zapisal"
 
 msgctxt "field:purchase.purchase-recreated-account.invoice,create_date:"
 msgid "Create Date"
-msgstr ""
+msgstr "Ustvarjeno"
 
 msgctxt "field:purchase.purchase-recreated-account.invoice,create_uid:"
 msgid "Create User"
-msgstr ""
+msgstr "Ustvaril"
 
 msgctxt "field:purchase.purchase-recreated-account.invoice,id:"
 msgid "ID"
-msgstr ""
+msgstr "ID"
 
-#, fuzzy
 msgctxt "field:purchase.purchase-recreated-account.invoice,invoice:"
 msgid "Invoice"
-msgstr "Verkoopfactuur"
+msgstr "Račun"
 
 msgctxt "field:purchase.purchase-recreated-account.invoice,purchase:"
 msgid "Purchase"
-msgstr ""
+msgstr "Nabavni nalog"
 
-#, fuzzy
 msgctxt "field:purchase.purchase-recreated-account.invoice,rec_name:"
 msgid "Name"
-msgstr "Naam bijlage"
+msgstr "Ime"
 
 msgctxt "field:purchase.purchase-recreated-account.invoice,write_date:"
 msgid "Write Date"
-msgstr ""
+msgstr "Zapisano"
 
 msgctxt "field:purchase.purchase-recreated-account.invoice,write_uid:"
 msgid "Write User"
-msgstr ""
+msgstr "Zapisal"
 
 msgctxt "field:stock.move,purchase:"
 msgid "Purchase"
-msgstr ""
+msgstr "Nabavni nalog"
 
 msgctxt "field:stock.move,purchase_currency:"
 msgid "Purchase Currency"
-msgstr ""
+msgstr "Nabavna valuta"
 
-#, fuzzy
 msgctxt "field:stock.move,purchase_exception_state:"
 msgid "Exception State"
-msgstr "Uitzonderingstoestand"
+msgstr "Pridržano"
 
 msgctxt "field:stock.move,purchase_quantity:"
 msgid "Purchase Quantity"
-msgstr ""
+msgstr "Nabavna količina"
 
 msgctxt "field:stock.move,purchase_unit:"
 msgid "Purchase Unit"
-msgstr ""
+msgstr "Nabavna enota"
 
 msgctxt "field:stock.move,purchase_unit_digits:"
 msgid "Purchase Unit Digits"
-msgstr ""
+msgstr "Nabavne decimalke"
 
 msgctxt "field:stock.move,purchase_unit_price:"
 msgid "Purchase Unit Price"
-msgstr ""
+msgstr "Nabavna cena"
 
 msgctxt "field:stock.move,purchase_visible:"
 msgid "Purchase Visible"
-msgstr ""
+msgstr "Nabavni nalog viden"
 
-#, fuzzy
 msgctxt "field:stock.move,supplier:"
 msgid "Supplier"
-msgstr "Leverancier"
+msgstr "Dobavitelj"
 
-#, fuzzy
 msgctxt "help:purchase.handle.invoice.exception.ask,recreate_invoices:"
 msgid ""
 "The selected invoices will be recreated. The other ones will be ignored."
-msgstr ""
-"De geselecteerde facturen worden opnieuw aangemaakt. De rest wordt "
-"genegeerd."
+msgstr "Izbrani računi bodo poustvarjeni, ostali bodo prezrti."
 
 msgctxt "help:purchase.handle.shipment.exception.ask,recreate_moves:"
 msgid "The selected moves will be recreated. The other ones will be ignored."
-msgstr ""
+msgstr "Izbran promet bo poustvarjen, ostali bo prezrt."
 
 msgctxt "help:purchase.product_supplier,delivery_time:"
 msgid "In number of days"
-msgstr ""
+msgstr "V dnevih"
 
 msgctxt "help:purchase.product_supplier.price,quantity:"
 msgid "Minimal quantity"
-msgstr ""
+msgstr "Minimalna količina"
 
-#, fuzzy
 msgctxt "model:ir.action,name:act_invoice_form"
 msgid "Invoices"
-msgstr "Verkoopfacturen"
+msgstr "Računi"
 
 msgctxt "model:ir.action,name:act_open_supplier"
 msgid "Parties associated to Purchases"
-msgstr ""
+msgstr "Stranke pri nabavi"
 
 msgctxt "model:ir.action,name:act_purchase_configuration_form"
 msgid "Purchase Configuration"
-msgstr ""
+msgstr "Nabavna konfiguracija"
 
 msgctxt "model:ir.action,name:act_purchase_form"
 msgid "Purchases"
-msgstr ""
+msgstr "Nabavni nalogi"
 
 msgctxt "model:ir.action,name:act_purchase_form2"
 msgid "Purchases"
-msgstr ""
+msgstr "Nabavni nalogi"
+
+msgctxt "model:ir.action,name:act_purchase_invoice_relate"
+msgid "Purchases"
+msgstr "Nabavni nalogi"
 
 msgctxt "model:ir.action,name:act_return_form"
 msgid "Returns"
-msgstr ""
+msgstr "Vrnjene prevzemnice"
 
-#, fuzzy
 msgctxt "model:ir.action,name:act_shipment_form"
 msgid "Shipments"
-msgstr "Leveringen"
+msgstr "Pošiljke"
 
 msgctxt "model:ir.action,name:report_purchase"
 msgid "Purchase"
-msgstr ""
+msgstr "Nabavni nalogi"
 
-#, fuzzy
 msgctxt "model:ir.action,name:wizard_invoice_handle_exception"
 msgid "Handle Invoice Exception"
-msgstr "Factuuruitzondering afhandelen"
+msgstr "Obravnava pridržanih računov"
 
-#, fuzzy
 msgctxt "model:ir.action,name:wizard_shipment_handle_exception"
 msgid "Handle Shipment Exception"
-msgstr "Zendinguitzondering afhandelen"
+msgstr "Obravnava pridržanih prevzemnic"
 
 msgctxt "model:ir.action.act_window.domain,name:act_purchase_form_domain_all"
 msgid "All"
-msgstr ""
+msgstr "Vse"
 
-#, fuzzy
 msgctxt ""
 "model:ir.action.act_window.domain,name:act_purchase_form_domain_confirmed"
 msgid "Confirmed"
-msgstr "Bevestigd"
+msgstr "Potrjeno"
 
-#, fuzzy
 msgctxt ""
 "model:ir.action.act_window.domain,name:act_purchase_form_domain_draft"
 msgid "Draft"
-msgstr "Concept"
+msgstr "Osnutek"
 
-#, fuzzy
 msgctxt ""
 "model:ir.action.act_window.domain,name:act_purchase_form_domain_quotation"
 msgid "Quotation"
-msgstr "Offerte"
+msgstr "Ponudba"
 
 msgctxt "model:ir.sequence,name:sequence_purchase"
 msgid "Purchase"
-msgstr ""
+msgstr "Nabavni nalog"
 
 msgctxt "model:ir.sequence.type,name:sequence_type_purchase"
 msgid "Purchase"
-msgstr ""
+msgstr "Nabavni nalog"
 
-#, fuzzy
 msgctxt "model:ir.ui.menu,name:menu_configuration"
 msgid "Configuration"
-msgstr "Instellingen"
+msgstr "Nastavitve"
 
 msgctxt "model:ir.ui.menu,name:menu_purchase"
 msgid "Purchase"
-msgstr ""
+msgstr "Nabava"
 
 msgctxt "model:ir.ui.menu,name:menu_purchase_configuration"
 msgid "Purchase Configuration"
-msgstr ""
+msgstr "Konfiguracija"
 
 msgctxt "model:ir.ui.menu,name:menu_purchase_form"
 msgid "Purchases"
-msgstr ""
+msgstr "Nabavni nalogi"
 
-#, fuzzy
 msgctxt "model:ir.ui.menu,name:menu_reporting"
 msgid "Reporting"
-msgstr "Rapportage"
+msgstr "Poročila"
 
 msgctxt "model:ir.ui.menu,name:menu_supplier"
 msgid "Parties associated to Purchases"
-msgstr ""
+msgstr "Stranke pri nabavi"
 
 msgctxt "model:purchase.configuration,name:"
 msgid "Purchase Configuration"
-msgstr ""
+msgstr "Nabavna konfiguracija"
 
-#, fuzzy
 msgctxt "model:purchase.handle.invoice.exception.ask,name:"
 msgid "Handle Invoice Exception"
-msgstr "Factuur uitzondering vragen"
+msgstr "Obravnava pridržanih računov"
 
-#, fuzzy
 msgctxt "model:purchase.handle.shipment.exception.ask,name:"
 msgid "Handle Shipment Exception"
-msgstr "Afleveren uitzondering vragen"
+msgstr "Obravnava pridržanih prevzemnic"
 
 msgctxt "model:purchase.line,name:"
 msgid "Purchase Line"
-msgstr ""
+msgstr "Nabavna postavka"
 
 msgctxt "model:purchase.line-account.tax,name:"
 msgid "Purchase Line - Tax"
-msgstr ""
+msgstr "Nabavna postavka - Davek"
 
 msgctxt "model:purchase.line-ignored-stock.move,name:"
 msgid "Purchase Line - Ignored Move"
-msgstr ""
+msgstr "Nabavna postavka - Prezrt promet"
 
 msgctxt "model:purchase.line-recreated-stock.move,name:"
 msgid "Purchase Line - Ignored Move"
-msgstr ""
+msgstr "Nabavna postavka - Poustvarjen promet"
 
 msgctxt "model:purchase.product_supplier,name:"
 msgid "Product Supplier"
-msgstr ""
+msgstr "Dobavitelj izdelkov"
 
 msgctxt "model:purchase.product_supplier.price,name:"
 msgid "Product Supplier Price"
-msgstr ""
+msgstr "Dobaviteljeva cena"
 
 msgctxt "model:purchase.purchase,name:"
 msgid "Purchase"
-msgstr ""
+msgstr "Nabavni nalog"
 
 msgctxt "model:purchase.purchase-account.invoice,name:"
 msgid "Purchase - Invoice"
-msgstr ""
+msgstr "Nabavni nalog - Račun"
 
 msgctxt "model:purchase.purchase-ignored-account.invoice,name:"
 msgid "Purchase - Ignored Invoice"
-msgstr ""
+msgstr "Nabavni nalog - Prezrt račun"
 
 msgctxt "model:purchase.purchase-recreated-account.invoice,name:"
 msgid "Purchase - Recreated Invoice"
-msgstr ""
+msgstr "Nabavni nalog - Poustvarjeni račun"
 
 msgctxt "model:res.group,name:group_purchase"
 msgid "Purchase"
-msgstr ""
+msgstr "Nabava"
 
 msgctxt "model:res.group,name:group_purchase_admin"
 msgid "Purchase Administrator"
-msgstr ""
+msgstr "Nabava - vodenje"
 
-#, fuzzy
 msgctxt "odt:purchase.purchase:"
 msgid "Amount"
-msgstr "Bedrag"
+msgstr "Znesek"
 
-#, fuzzy
 msgctxt "odt:purchase.purchase:"
 msgid "Date:"
 msgstr "Datum:"
 
-#, fuzzy
 msgctxt "odt:purchase.purchase:"
 msgid "Description"
-msgstr "Specificatie"
+msgstr "Opis"
 
-#, fuzzy
 msgctxt "odt:purchase.purchase:"
 msgid "Description:"
-msgstr "Betreft:"
+msgstr "Opis:"
 
 msgctxt "odt:purchase.purchase:"
 msgid "Draft Purchase Order"
-msgstr ""
+msgstr "Osnutek nabavnega naloga"
 
-#, fuzzy
 msgctxt "odt:purchase.purchase:"
 msgid "E-Mail:"
-msgstr "E-mail:"
+msgstr "E-pošta:"
 
-#, fuzzy
 msgctxt "odt:purchase.purchase:"
 msgid "Phone:"
-msgstr "Telefoon:"
+msgstr "Telefon:"
 
 msgctxt "odt:purchase.purchase:"
 msgid "Purchase Order N°:"
-msgstr ""
+msgstr "Nabavni nalog št.:"
 
-#, fuzzy
 msgctxt "odt:purchase.purchase:"
 msgid "Quantity"
-msgstr "Hoeveelheid"
+msgstr "Količina"
 
 msgctxt "odt:purchase.purchase:"
 msgid "Request for Quotation N°:"
-msgstr ""
+msgstr "Zahtevek za ponudbo št.:"
 
-#, fuzzy
 msgctxt "odt:purchase.purchase:"
 msgid "Taxes"
-msgstr "Belastingen"
+msgstr "Davki"
 
-#, fuzzy
 msgctxt "odt:purchase.purchase:"
 msgid "Taxes:"
-msgstr "Belastingen:"
+msgstr "Davki:"
 
-#, fuzzy
 msgctxt "odt:purchase.purchase:"
 msgid "Total (excl. taxes):"
-msgstr "Totaal (excl. belasting):"
+msgstr "Skupaj (brez davkov):"
 
-#, fuzzy
 msgctxt "odt:purchase.purchase:"
 msgid "Total:"
-msgstr "Totaal:"
+msgstr "Skupaj:"
 
-#, fuzzy
 msgctxt "odt:purchase.purchase:"
 msgid "Unit Price"
-msgstr "Eenheidsprijs"
+msgstr "Cena"
 
-#, fuzzy
 msgctxt "odt:purchase.purchase:"
 msgid "VAT Number:"
-msgstr "BTW-nummer:"
+msgstr "DDV številka:"
 
-#, fuzzy
 msgctxt "odt:purchase.purchase:"
 msgid "VAT:"
-msgstr "BTW:"
+msgstr "DDV:"
 
 msgctxt "selection:account.invoice,purchase_exception_state:"
 msgid ""
 msgstr ""
 
-#, fuzzy
 msgctxt "selection:account.invoice,purchase_exception_state:"
 msgid "Ignored"
-msgstr "Genegeerd"
+msgstr "Prezrto"
 
-#, fuzzy
 msgctxt "selection:account.invoice,purchase_exception_state:"
 msgid "Recreated"
-msgstr "Opnieuw aangemaakt"
+msgstr "Poustvarjeno"
 
 msgctxt "selection:purchase.configuration,purchase_invoice_method:"
 msgid "Based On Order"
-msgstr ""
+msgstr "Na podlagi naloga"
 
 msgctxt "selection:purchase.configuration,purchase_invoice_method:"
 msgid "Based On Shipment"
-msgstr ""
+msgstr "Na podlagi prevzemnice"
 
-#, fuzzy
 msgctxt "selection:purchase.configuration,purchase_invoice_method:"
 msgid "Manual"
-msgstr "Handmatig"
+msgstr "Ročno"
 
-#, fuzzy
 msgctxt "selection:purchase.line,type:"
 msgid "Comment"
-msgstr "Opmerking"
+msgstr "Opomba"
 
-#, fuzzy
 msgctxt "selection:purchase.line,type:"
 msgid "Line"
-msgstr "Regel"
+msgstr "Postavka"
 
-#, fuzzy
 msgctxt "selection:purchase.line,type:"
 msgid "Subtotal"
-msgstr "Subtotaal"
+msgstr "Vmesna vsota"
 
-#, fuzzy
 msgctxt "selection:purchase.line,type:"
 msgid "Title"
-msgstr "Titel"
+msgstr "Napis"
 
 msgctxt "selection:purchase.purchase,invoice_method:"
 msgid "Based On Order"
-msgstr ""
+msgstr "Na podlagi naloga"
 
 msgctxt "selection:purchase.purchase,invoice_method:"
 msgid "Based On Shipment"
-msgstr ""
+msgstr "Na podlagi pošiljke"
 
-#, fuzzy
 msgctxt "selection:purchase.purchase,invoice_method:"
 msgid "Manual"
-msgstr "Handmatig"
+msgstr "Ročno"
 
-#, fuzzy
 msgctxt "selection:purchase.purchase,invoice_state:"
 msgid "Exception"
-msgstr "Uitzondering"
+msgstr "Pridržano"
 
-#, fuzzy
 msgctxt "selection:purchase.purchase,invoice_state:"
 msgid "None"
-msgstr "Geen"
+msgstr "Brez"
 
-#, fuzzy
 msgctxt "selection:purchase.purchase,invoice_state:"
 msgid "Paid"
-msgstr "Betaald"
+msgstr "Plačano"
 
-#, fuzzy
 msgctxt "selection:purchase.purchase,invoice_state:"
 msgid "Waiting"
-msgstr "In afwachting"
+msgstr "Čakajoče"
 
-#, fuzzy
 msgctxt "selection:purchase.purchase,shipment_state:"
 msgid "Exception"
-msgstr "Uitzondering"
+msgstr "Pridržano"
 
-#, fuzzy
 msgctxt "selection:purchase.purchase,shipment_state:"
 msgid "None"
-msgstr "Geen"
+msgstr "Brez"
 
 msgctxt "selection:purchase.purchase,shipment_state:"
 msgid "Received"
-msgstr ""
+msgstr "Prejeto"
 
-#, fuzzy
 msgctxt "selection:purchase.purchase,shipment_state:"
 msgid "Waiting"
-msgstr "In afwachting"
+msgstr "Čakajoče"
 
-#, fuzzy
 msgctxt "selection:purchase.purchase,state:"
 msgid "Canceled"
-msgstr "Geannuleerd"
+msgstr "Preklicano"
 
-#, fuzzy
 msgctxt "selection:purchase.purchase,state:"
 msgid "Confirmed"
-msgstr "Bevestigd"
+msgstr "Potrjeno"
 
-#, fuzzy
 msgctxt "selection:purchase.purchase,state:"
 msgid "Done"
-msgstr "Klaar"
+msgstr "Zaključeno"
 
-#, fuzzy
 msgctxt "selection:purchase.purchase,state:"
 msgid "Draft"
-msgstr "Concept"
+msgstr "Osnutek"
 
-#, fuzzy
 msgctxt "selection:purchase.purchase,state:"
 msgid "Quotation"
-msgstr "Offerte"
+msgstr "Ponudba"
 
 msgctxt "selection:stock.move,purchase_exception_state:"
 msgid ""
 msgstr ""
 
-#, fuzzy
 msgctxt "selection:stock.move,purchase_exception_state:"
 msgid "Ignored"
-msgstr "Genegeerd"
+msgstr "Prezrto"
 
-#, fuzzy
 msgctxt "selection:stock.move,purchase_exception_state:"
 msgid "Recreated"
-msgstr "Opnieuw aangemaakt"
+msgstr "Poustvarjeno"
 
-#, fuzzy
 msgctxt "view:product.product:"
 msgid "Products"
-msgstr "Producten"
+msgstr "Izdelki"
 
 msgctxt "view:product.template:"
 msgid "Suppliers"
-msgstr ""
+msgstr "Dobavitelji"
 
 msgctxt "view:purchase.configuration:"
 msgid "Purchase Configuration"
-msgstr ""
+msgstr "Nabavna konfiguracija"
 
-#, fuzzy
 msgctxt "view:purchase.handle.invoice.exception.ask:"
 msgid "Choose invoices to recreate"
-msgstr "Kies facturen om opnieuw aan te maken"
+msgstr "Izbor računov za poustvaritev"
 
-#, fuzzy
 msgctxt "view:purchase.handle.invoice.exception.ask:"
 msgid "Handle Invoice Exception"
-msgstr "Factuuruitzondering afhandelen"
+msgstr "Obravnava pridržanih računov"
 
-#, fuzzy
 msgctxt "view:purchase.handle.shipment.exception.ask:"
 msgid "Choose move to recreate"
-msgstr "Kies boeking om opnieuw aan te maken"
+msgstr "Izbor prometa za poustvaritev"
 
-#, fuzzy
 msgctxt "view:purchase.handle.shipment.exception.ask:"
 msgid "Handle shipment Exception"
-msgstr "Zendinguitzondering afhandelen"
+msgstr "Obravnava pridržanih prevzemnic"
 
-#, fuzzy
 msgctxt "view:purchase.line:"
 msgid "General"
-msgstr "Algemeen"
+msgstr "Splošno"
 
-#, fuzzy
 msgctxt "view:purchase.line:"
 msgid "Lines"
-msgstr "Regels"
+msgstr "Postavke"
 
-#, fuzzy
 msgctxt "view:purchase.line:"
 msgid "Notes"
-msgstr "Aantekeningen"
+msgstr "Opombe"
 
 msgctxt "view:purchase.line:"
 msgid "Purchase Line"
-msgstr ""
+msgstr "Nabavna postavka"
 
 msgctxt "view:purchase.line:"
 msgid "Purchase Lines"
-msgstr ""
+msgstr "Nabavne postavke"
 
 msgctxt "view:purchase.product_supplier.price:"
 msgid "Product Supplier Price"
-msgstr ""
+msgstr "Dobaviteljeva cena"
 
 msgctxt "view:purchase.product_supplier.price:"
 msgid "Product Supplier Prices"
-msgstr ""
+msgstr "Dobaviteljeve cene"
 
 msgctxt "view:purchase.product_supplier:"
 msgid "Product Supplier"
-msgstr ""
+msgstr "Dobavitelj izdelkov"
 
 msgctxt "view:purchase.product_supplier:"
 msgid "Product Suppliers"
-msgstr ""
+msgstr "Dobavitelji izdelkov"
 
-#, fuzzy
 msgctxt "view:purchase.purchase:"
 msgid "Cancel"
-msgstr "Annuleren"
+msgstr "Prekliči"
 
-#, fuzzy
 msgctxt "view:purchase.purchase:"
 msgid "Confirm"
-msgstr "Bevestig"
+msgstr "Potrditev"
 
-#, fuzzy
 msgctxt "view:purchase.purchase:"
 msgid "Draft"
-msgstr "Concept"
+msgstr "Osnutek"
 
-#, fuzzy
 msgctxt "view:purchase.purchase:"
 msgid "Handle Invoice Exception"
-msgstr "Factuuruitzondering afhandelen"
+msgstr "Obravnava pridržanih računov"
 
-#, fuzzy
 msgctxt "view:purchase.purchase:"
 msgid "Handle Shipment Exception"
-msgstr "Zendinguitzondering afhandelen"
+msgstr "Obravnava pridržanih prevzemnic"
 
-#, fuzzy
 msgctxt "view:purchase.purchase:"
 msgid "Invoices"
-msgstr "Verkoopfacturen"
+msgstr "Računi"
 
-#, fuzzy
 msgctxt "view:purchase.purchase:"
 msgid "Other Info"
-msgstr "Aanvullende informatie"
+msgstr "Drugo"
 
 msgctxt "view:purchase.purchase:"
 msgid "Purchase"
-msgstr ""
+msgstr "Nabavni nalog"
 
 msgctxt "view:purchase.purchase:"
 msgid "Purchases"
-msgstr ""
+msgstr "Nabavni nalogi"
 
 msgctxt "view:purchase.purchase:"
 msgid "Quote"
-msgstr ""
+msgstr "Ponudba"
 
-#, fuzzy
 msgctxt "view:purchase.purchase:"
 msgid "Shipments"
-msgstr "Leveringen"
+msgstr "Pošiljke"
 
-#, fuzzy
 msgctxt "view:stock.move:"
 msgid "Moves"
-msgstr "Boekingen"
+msgstr "Promet"
 
-#, fuzzy
 msgctxt "wizard_button:purchase.handle.invoice.exception,ask,end:"
 msgid "Cancel"
-msgstr "Annuleren"
+msgstr "Prekliči"
 
-#, fuzzy
 msgctxt "wizard_button:purchase.handle.invoice.exception,ask,handle:"
 msgid "Ok"
-msgstr "Oké"
+msgstr "V redu"
 
-#, fuzzy
 msgctxt "wizard_button:purchase.handle.shipment.exception,ask,end:"
 msgid "Cancel"
-msgstr "Annuleren"
+msgstr "Prekliči"
 
-#, fuzzy
 msgctxt "wizard_button:purchase.handle.shipment.exception,ask,handle:"
 msgid "Ok"
-msgstr "Oké"
+msgstr "V redu"
 
-#, fuzzy
 msgctxt "wizard_button:stock.product_quantities_warehouse,start,end:"
 msgid "Cancel"
-msgstr "Annuleren"
+msgstr "Prekliči"
 
-#, fuzzy
 msgctxt "wizard_button:stock.product_quantities_warehouse,start,open_:"
 msgid "Open"
-msgstr "Open"
+msgstr "Odpri"
diff --git a/product.py b/product.py
new file mode 100644
index 0000000..d4164ba
--- /dev/null
+++ b/product.py
@@ -0,0 +1,276 @@
+#This file is part of Tryton.  The COPYRIGHT file at the top level of
+#this repository contains the full copyright notices and license terms.
+import datetime
+from sql import Literal
+from sql.aggregate import Count
+
+from trytond.model import ModelView, ModelSQL, fields
+from trytond.pyson import Eval, If
+from trytond.pool import Pool, PoolMeta
+from trytond.transaction import Transaction
+from trytond import backend
+
+__all__ = ['Template', 'Product', 'ProductSupplier', 'ProductSupplierPrice']
+__metaclass__ = PoolMeta
+
+
+class Template:
+    __name__ = "product.template"
+    purchasable = fields.Boolean('Purchasable', states={
+            'readonly': ~Eval('active', True),
+            }, depends=['active'])
+    product_suppliers = fields.One2Many('purchase.product_supplier',
+        'product', 'Suppliers', states={
+            'readonly': ~Eval('active', True),
+            'invisible': (~Eval('purchasable', False)
+                | ~Eval('context', {}).get('company')),
+            }, depends=['active', 'purchasable'])
+    purchase_uom = fields.Many2One('product.uom', 'Purchase UOM', states={
+            'readonly': ~Eval('active'),
+            'invisible': ~Eval('purchasable'),
+            'required': Eval('purchasable', False),
+            },
+        domain=[('category', '=', Eval('default_uom_category'))],
+        on_change_with=['default_uom', 'purchase_uom', 'purchasable'],
+        depends=['active', 'purchasable', 'default_uom_category'])
+
+    @classmethod
+    def __setup__(cls):
+        super(Template, cls).__setup__()
+        cls._error_messages.update({
+                'change_purchase_uom': ('Purchase prices are based '
+                    'on the purchase uom, are you sure to change it?'),
+                })
+        required = ~Eval('account_category') & Eval('purchasable', False)
+        if not cls.account_expense.states.get('required'):
+            cls.account_expense.states['required'] = required
+        else:
+            cls.account_expense.states['required'] = (
+                cls.account_expense.states['required'] | required)
+        if 'account_category' not in cls.account_expense.depends:
+            cls.account_expense.depends.append('account_category')
+        if 'purchasable' not in cls.account_expense.depends:
+            cls.account_expense.depends.append('purchasable')
+
+    def on_change_with_purchase_uom(self):
+        if self.default_uom:
+            if self.purchase_uom:
+                if self.default_uom.category == self.purchase_uom.category:
+                    return self.purchase_uom.id
+                else:
+                    return self.default_uom.id
+            else:
+                return self.default_uom.id
+
+    @classmethod
+    def write(cls, templates, vals):
+        if vals.get("purchase_uom"):
+            for template in templates:
+                if not template.purchase_uom:
+                    continue
+                if template.purchase_uom.id == vals["purchase_uom"]:
+                    continue
+                for product in template.products:
+                    if not product.product_suppliers:
+                        continue
+                    cls.raise_user_warning(
+                            '%s at product_template' % template.id,
+                            'change_purchase_uom')
+        super(Template, cls).write(templates, vals)
+
+
+class Product:
+    __name__ = 'product.product'
+
+    @classmethod
+    def get_purchase_price(cls, products, quantity=0):
+        '''
+        Return purchase price for product ids.
+        The context that can have as keys:
+            uom: the unit of measure
+            supplier: the supplier party id
+            currency: the currency id for the returned price
+        '''
+        pool = Pool()
+        Uom = pool.get('product.uom')
+        User = pool.get('res.user')
+        Currency = pool.get('currency.currency')
+        Date = pool.get('ir.date')
+
+        today = Date.today()
+        res = {}
+
+        uom = None
+        if Transaction().context.get('uom'):
+            uom = Uom(Transaction().context['uom'])
+
+        currency = None
+        if Transaction().context.get('currency'):
+            currency = Currency(Transaction().context['currency'])
+
+        user = User(Transaction().user)
+
+        for product in products:
+            res[product.id] = product.cost_price
+            default_uom = product.default_uom
+            default_currency = (user.company.currency if user.company
+                else None)
+            if not uom:
+                uom = default_uom
+            if (Transaction().context.get('supplier')
+                    and product.product_suppliers):
+                supplier_id = Transaction().context['supplier']
+                for product_supplier in product.product_suppliers:
+                    if product_supplier.party.id == supplier_id:
+                        for price in product_supplier.prices:
+                            if Uom.compute_qty(product.purchase_uom,
+                                    price.quantity, uom) <= quantity:
+                                res[product.id] = price.unit_price
+                                default_uom = product.purchase_uom
+                                default_currency = product_supplier.currency
+                        break
+            res[product.id] = Uom.compute_price(default_uom, res[product.id],
+                uom)
+            if currency and default_currency:
+                date = Transaction().context.get('purchase_date') or today
+                with Transaction().set_context(date=date):
+                    res[product.id] = Currency.compute(default_currency,
+                        res[product.id], currency, round=False)
+        return res
+
+
+class ProductSupplier(ModelSQL, ModelView):
+    'Product Supplier'
+    __name__ = 'purchase.product_supplier'
+    product = fields.Many2One('product.template', 'Product', required=True,
+            ondelete='CASCADE', select=True)
+    party = fields.Many2One('party.party', 'Supplier', required=True,
+            ondelete='CASCADE', select=True, on_change=['party'])
+    name = fields.Char('Name', size=None, translate=True, select=True)
+    code = fields.Char('Code', size=None, select=True)
+    sequence = fields.Integer('Sequence')
+    prices = fields.One2Many('purchase.product_supplier.price',
+            'product_supplier', 'Prices')
+    company = fields.Many2One('company.company', 'Company', required=True,
+        ondelete='CASCADE', select=True,
+        domain=[
+            ('id', If(Eval('context', {}).contains('company'), '=', '!='),
+                Eval('context', {}).get('company', -1)),
+            ])
+    delivery_time = fields.Integer('Delivery Time', help="In number of days")
+    currency = fields.Many2One('currency.currency', 'Currency', required=True,
+        ondelete='RESTRICT')
+
+    @classmethod
+    def __setup__(cls):
+        super(ProductSupplier, cls).__setup__()
+        cls._order.insert(0, ('sequence', 'ASC'))
+
+    @classmethod
+    def __register__(cls, module_name):
+        TableHandler = backend.get('TableHandler')
+        cursor = Transaction().cursor
+        table = TableHandler(cursor, cls, module_name)
+        sql_table = cls.__table__()
+
+        # Migration from 2.2 new field currency
+        created_currency = table.column_exist('currency')
+
+        super(ProductSupplier, cls).__register__(module_name)
+
+        # Migration from 2.2 fill currency
+        if not created_currency:
+            Company = Pool().get('company.company')
+            company = Company.__table__()
+            limit = cursor.IN_MAX
+            cursor.execute(*sql_table.select(Count(sql_table.id)))
+            product_supplier_count, = cursor.fetchone()
+            for offset in range(0, product_supplier_count, limit):
+                cursor.execute(*sql_table.join(company,
+                        condition=sql_table.company == company.id
+                        ).select(sql_table.id, company.currency,
+                        order_by=sql_table.id,
+                        limit=limit, offset=offset))
+                for product_supplier_id, currency_id in cursor.fetchall():
+                    cursor.execute(*sql_table.update(
+                            columns=[sql_table.currency],
+                            values=[currency_id],
+                            where=sql_table.id == product_supplier_id))
+
+        # Migration from 2.4: drop required on sequence
+        table.not_null_action('sequence', action='remove')
+
+        # Migration from 2.6: drop required on delivery_time
+        table.not_null_action('delivery_time', action='remove')
+
+    @staticmethod
+    def order_sequence(tables):
+        table, _ = tables[None]
+        return [table.sequence == None, table.sequence]
+
+    @staticmethod
+    def default_company():
+        return Transaction().context.get('company')
+
+    @staticmethod
+    def default_currency():
+        Company = Pool().get('company.company')
+        if Transaction().context.get('company'):
+            company = Company(Transaction().context['company'])
+            return company.currency.id
+
+    def on_change_party(self):
+        cursor = Transaction().cursor
+        changes = {
+            'currency': self.default_currency(),
+            }
+        if self.party:
+            table = self.__table__()
+            cursor.execute(*table.select(table.currency,
+                    where=table.party == self.party.id,
+                    group_by=table.currency,
+                    order_by=Count(Literal(1)).desc))
+            row = cursor.fetchone()
+            if row:
+                changes['currency'], = row
+        return changes
+
+    def compute_supply_date(self, date=None):
+        '''
+        Compute the supply date for the Product Supplier at the given date
+        '''
+        Date = Pool().get('ir.date')
+
+        if not date:
+            date = Date.today()
+        if self.delivery_time is None:
+            return datetime.date.max
+        return date + datetime.timedelta(self.delivery_time)
+
+    def compute_purchase_date(self, date):
+        '''
+        Compute the purchase date for the Product Supplier at the given date
+        '''
+        Date = Pool().get('ir.date')
+
+        if self.delivery_time is None:
+            return Date.today()
+        return date - datetime.timedelta(self.delivery_time)
+
+
+class ProductSupplierPrice(ModelSQL, ModelView):
+    'Product Supplier Price'
+    __name__ = 'purchase.product_supplier.price'
+    product_supplier = fields.Many2One('purchase.product_supplier',
+            'Supplier', required=True, ondelete='CASCADE')
+    quantity = fields.Float('Quantity', required=True, help='Minimal quantity')
+    unit_price = fields.Numeric('Unit Price', required=True, digits=(16, 4))
+
+    @classmethod
+    def __setup__(cls):
+        super(ProductSupplierPrice, cls).__setup__()
+        cls._order.insert(0, ('quantity', 'ASC'))
+
+    @staticmethod
+    def default_quantity():
+        return 0.0
diff --git a/purchase.odt b/purchase.odt
index 7c6784e..95c53f8 100644
Binary files a/purchase.odt and b/purchase.odt differ
diff --git a/purchase.py b/purchase.py
index 4e30c24..1abdd58 100644
--- a/purchase.py
+++ b/purchase.py
@@ -3,29 +3,31 @@
 import datetime
 from itertools import chain
 from decimal import Decimal
+from sql import Table, Literal
+from sql.functions import Overlay, Position
+from sql.aggregate import Count
+
 from trytond.model import Workflow, ModelView, ModelSQL, fields
 from trytond.modules.company import CompanyReport
 from trytond.wizard import Wizard, StateAction, StateView, StateTransition, \
     Button
-from trytond.backend import TableHandler
+from trytond import backend
 from trytond.pyson import Eval, Bool, If, PYSONEncoder, Id
 from trytond.transaction import Transaction
 from trytond.pool import Pool, PoolMeta
 
 __all__ = ['Purchase', 'PurchaseInvoice', 'PurchaseIgnoredInvoice',
     'PurchaseRecreadtedInvoice', 'PurchaseLine', 'PurchaseLineTax',
-    'PurchaseLineIgnoredMove',
-    'PurchaseLineRecreatedMove', 'PurchaseReport', 'Template', 'Product',
-    'ProductSupplier', 'ProductSupplierPrice', 'ShipmentIn',
-    'ShipmentInReturn', 'Move', 'OpenSupplier', 'HandleShipmentExceptionAsk',
-    'HandleShipmentException', 'HandleInvoiceExceptionAsk',
-    'HandleInvoiceException']
+    'PurchaseLineIgnoredMove', 'PurchaseLineRecreatedMove', 'PurchaseReport',
+    'OpenSupplier', 'HandleShipmentExceptionAsk', 'HandleShipmentException',
+    'HandleInvoiceExceptionAsk', 'HandleInvoiceException']
 __metaclass__ = PoolMeta
 
 _STATES = {
     'readonly': Eval('state') != 'draft',
     }
 _DEPENDS = ['state']
+_ZERO = Decimal(0)
 
 
 class Purchase(Workflow, ModelSQL, ModelView):
@@ -38,7 +40,7 @@ class Purchase(Workflow, ModelSQL, ModelView):
             },
         domain=[
             ('id', If(Eval('context', {}).contains('company'), '=', '!='),
-                Eval('context', {}).get('company', 0)),
+                Eval('context', {}).get('company', -1)),
             ],
         depends=['state'], select=True)
     reference = fields.Char('Reference', size=None, readonly=True, select=True)
@@ -85,19 +87,19 @@ class Purchase(Workflow, ModelSQL, ModelView):
     comment = fields.Text('Comment')
     untaxed_amount = fields.Function(fields.Numeric('Untaxed',
             digits=(16, Eval('currency_digits', 2)),
-            depends=['currency_digits']), 'get_untaxed_amount')
+            depends=['currency_digits']), 'get_amount')
     untaxed_amount_cache = fields.Numeric('Untaxed Cache',
         digits=(16, Eval('currency_digits', 2)),
         depends=['currency_digits'])
     tax_amount = fields.Function(fields.Numeric('Tax',
             digits=(16, Eval('currency_digits', 2)),
-            depends=['currency_digits']), 'get_tax_amount')
+            depends=['currency_digits']), 'get_amount')
     tax_amount_cache = fields.Numeric('Tax Cache',
         digits=(16, Eval('currency_digits', 2)),
         depends=['currency_digits'])
     total_amount = fields.Function(fields.Numeric('Total',
             digits=(16, Eval('currency_digits', 2)),
-            depends=['currency_digits']), 'get_total_amount')
+            depends=['currency_digits']), 'get_amount')
     total_amount_cache = fields.Numeric('Total Cache',
         digits=(16, Eval('currency_digits', 2)),
         depends=['currency_digits'])
@@ -193,18 +195,34 @@ class Purchase(Workflow, ModelSQL, ModelView):
 
     @classmethod
     def __register__(cls, module_name):
+        TableHandler = backend.get('TableHandler')
         cursor = Transaction().cursor
+        model_data = Table('ir_model_data')
+        model_field = Table('ir_model_field')
+        sql_table = cls.__table__()
+
         # Migration from 1.2: packing renamed into shipment
-        cursor.execute("UPDATE ir_model_data "
-            "SET fs_id = REPLACE(fs_id, 'packing', 'shipment') "
-            "WHERE fs_id like '%%packing%%' AND module = %s",
-            (module_name,))
-        cursor.execute("UPDATE ir_model_field "
-            "SET relation = REPLACE(relation, 'packing', 'shipment'), "
-                "name = REPLACE(name, 'packing', 'shipment') "
-            "WHERE (relation like '%%packing%%' "
-                "OR name like '%%packing%%') AND module = %s",
-            (module_name,))
+        cursor.execute(*model_data.update(
+                columns=[model_data.fs_id],
+                values=[Overlay(model_data.fs_id, 'shipment',
+                        Position('packing', model_data.fs_id),
+                        len('packing'))],
+                where=model_data.fs_id.like('%packing%')
+                & (model_data.module == module_name)))
+        cursor.execute(*model_field.update(
+                columns=[model_field.relation],
+                values=[Overlay(model_field.relation, 'shipment',
+                        Position('packing', model_field.relation),
+                        len('packing'))],
+                where=model_field.relation.like('%packing%')
+                & (model_field.module == module_name)))
+        cursor.execute(*model_field.update(
+                columns=[model_field.name],
+                values=[Overlay(model_field.name, 'shipment',
+                        Position('packing', model_field.name),
+                        len('packing'))],
+                where=model_field.name.like('%packing%')
+                & (model_field.module == module_name)))
         table = TableHandler(cursor, cls, module_name)
         table.column_rename('packing_state', 'shipment_state')
 
@@ -212,9 +230,10 @@ class Purchase(Workflow, ModelSQL, ModelView):
 
         # Migration from 1.2: rename packing to shipment in
         # invoice_method values
-        cursor.execute("UPDATE " + cls._table + " "
-            "SET invoice_method = 'shipment' "
-            "WHERE invoice_method = 'packing'")
+        cursor.execute(*sql_table.update(
+                columns=[sql_table.invoice_method],
+                values=['shipment'],
+                where=sql_table.invoice_method == 'packing'))
 
         table = TableHandler(cursor, cls, module_name)
         # Migration from 2.2: warehouse is no more required
@@ -285,6 +304,7 @@ class Purchase(Workflow, ModelSQL, ModelView):
         PaymentTerm = pool.get('account.invoice.payment_term')
         Currency = pool.get('currency.currency')
         cursor = Transaction().cursor
+        table = self.__table__()
         changes = {
             'invoice_address': None,
             'payment_term': None,
@@ -298,13 +318,13 @@ class Purchase(Workflow, ModelSQL, ModelView):
             if self.party.supplier_payment_term:
                 payment_term = self.party.supplier_payment_term
 
-            subquery = cursor.limit_clause('SELECT currency '
-                'FROM "' + self._table + '" '
-                'WHERE party = %s '
-                'ORDER BY id DESC', 10)
-            cursor.execute('SELECT currency FROM (' + subquery + ') AS p '
-                'GROUP BY currency '
-                'ORDER BY COUNT(1) DESC', (self.party.id,))
+            subquery = table.select(table.currency,
+                where=table.party == self.party.id,
+                order_by=table.id,
+                limit=10)
+            cursor.execute(*subquery.select(subquery.currency,
+                    group_by=subquery.currency,
+                    order_by=Count(Literal(1)).desc))
             row = cursor.fetchone()
             if row:
                 currency_id, = row
@@ -387,25 +407,11 @@ class Purchase(Workflow, ModelSQL, ModelView):
                 changes['total_amount'])
         return changes
 
-    def get_untaxed_amount(self, name):
-        '''
-        Return the untaxed amount for each purchases
-        '''
-        if (self.state in self._states_cached
-                and self.untaxed_amount_cache is not None):
-            return self.untaxed_amount_cache
-        amount = sum((l.amount for l in self.lines
-                if l.type == 'line'), Decimal(0))
-        return self.currency.round(amount)
-
-    def get_tax_amount(self, name):
+    def get_tax_amount(self):
         pool = Pool()
         Tax = pool.get('account.tax')
         Invoice = pool.get('account.invoice')
 
-        if (self.state in self._states_cached
-                and self.tax_amount_cache is not None):
-            return self.tax_amount_cache
         context = self.get_tax_context()
         taxes = {}
         for line in self.lines:
@@ -421,15 +427,39 @@ class Purchase(Workflow, ModelSQL, ModelView):
                     taxes[key] = val['amount']
                 else:
                     taxes[key] += val['amount']
-        amount = sum((self.currency.round(tax) for tax in taxes.itervalues()),
-            Decimal(0))
-        return self.currency.round(amount)
+        return sum((self.currency.round(tax) for tax in taxes.values()), _ZERO)
+
+    @classmethod
+    def get_amount(cls, purchases, names):
+        untaxed_amount = {}
+        tax_amount = {}
+        total_amount = {}
 
-    def get_total_amount(self, name):
-        if (self.state in self._states_cached
-                and self.total_amount_cache is not None):
-            return self.total_amount_cache
-        return self.currency.round(self.untaxed_amount + self.tax_amount)
+        for purchase in purchases:
+            if (purchase.state in cls._states_cached
+                    and purchase.untaxed_amount_cache is not None
+                    and purchase.tax_amount_cache is not None
+                    and purchase.total_amount_cache is not None):
+                untaxed_amount[purchase.id] = purchase.untaxed_amount_cache
+                tax_amount[purchase.id] = purchase.tax_amount_cache
+                total_amount[purchase.id] = purchase.total_amount_cache
+            else:
+                untaxed_amount[purchase.id] = sum(
+                    (line.amount for line in purchase.lines
+                        if line.type == 'line'), _ZERO)
+                tax_amount[purchase.id] = purchase.get_tax_amount()
+                total_amount[purchase.id] = (
+                    untaxed_amount[purchase.id] + tax_amount[purchase.id])
+
+        result = {
+            'untaxed_amount': untaxed_amount,
+            'tax_amount': tax_amount,
+            'total_amount': total_amount,
+            }
+        for key in result.keys():
+            if key not in names:
+                del result[key]
+        return result
 
     def get_invoice_state(self):
         '''
@@ -604,7 +634,6 @@ class Purchase(Workflow, ModelSQL, ModelView):
             return Invoice(
                 company=self.company,
                 type=invoice_type,
-                reference=self.reference,
                 journal=journal,
                 party=self.party,
                 invoice_address=self.invoice_address,
@@ -661,7 +690,6 @@ class Purchase(Workflow, ModelSQL, ModelView):
         with Transaction().set_user(0, set_context=True):
             return ShipmentInReturn(
                 company=self.company,
-                reference=self.reference,
                 from_location=self.warehouse.storage_location,
                 to_location=self.party.supplier_location,
                 )
@@ -788,9 +816,7 @@ class PurchaseLine(ModelSQL, ModelView):
     _rec_name = 'description'
     purchase = fields.Many2One('purchase.purchase', 'Purchase',
             ondelete='CASCADE', select=True, required=True)
-    sequence = fields.Integer('Sequence',
-        order_field='(%(table)s.sequence IS NULL) %(order)s, '
-        '%(table)s.sequence %(order)s')
+    sequence = fields.Integer('Sequence')
     type = fields.Selection([
         ('line', 'Line'),
         ('subtotal', 'Subtotal'),
@@ -838,7 +864,6 @@ class PurchaseLine(ModelSQL, ModelView):
                 []),
             'stock_date_end': Eval('_parent_purchase', {}).get(
                 'purchase_date'),
-            'purchasable': True,
             'stock_skip_warehouse': True,
             }, depends=['type'])
     product_uom_category = fields.Function(
@@ -900,30 +925,38 @@ class PurchaseLine(ModelSQL, ModelView):
         super(PurchaseLine, cls).__setup__()
         cls._order.insert(0, ('sequence', 'ASC'))
         cls._error_messages.update({
-                'supplier_location_required': ('Purchase "%(purchase)s" misses '
-                    'the supplier location for line "%(line)s".'),
-                'missing_account_expense': ('Product "%(product)s" of purchase '
-                    '%(purchase)s misses an expense account.'),
+                'supplier_location_required': ('Purchase "%(purchase)s" '
+                    'misses the supplier location for line "%(line)s".'),
+                'missing_account_expense': ('Product "%(product)s" of '
+                    'purchase %(purchase)s misses an expense account.'),
                 'missing_account_expense_property': ('Purchase "%(purchase)s" '
                     'misses an "account expense" default property.'),
                 })
 
     @classmethod
     def __register__(cls, module_name):
-        super(PurchaseLine, cls).__register__(module_name)
+        TableHandler = backend.get('TableHandler')
         cursor = Transaction().cursor
+        sql_table = cls.__table__()
+        super(PurchaseLine, cls).__register__(module_name)
         table = TableHandler(cursor, cls, module_name)
 
         # Migration from 1.0 comment change into note
         if table.column_exist('comment'):
-            cursor.execute('UPDATE "' + cls._table + '" '
-                'SET note = comment')
+            cursor.execute(*sql_table.update(
+                    columns=[sql_table.note],
+                    values=[sql_table.comment]))
             table.drop_column('comment', exception=True)
 
         # Migration from 2.4: drop required on sequence
         table.not_null_action('sequence', action='remove')
 
     @staticmethod
+    def order_sequence(tables):
+        table, _ = tables[None]
+        return [table.sequence == None, table.sequence]
+
+    @staticmethod
     def default_type():
         return 'line'
 
@@ -1006,7 +1039,7 @@ class PurchaseLine(ModelSQL, ModelView):
 
         with Transaction().set_context(self._get_context_purchase_price()):
             res['unit_price'] = Product.get_purchase_price([self.product],
-                self.quantity or 0)[self.product.id]
+                abs(self.quantity or 0))[self.product.id]
             if res['unit_price']:
                 res['unit_price'] = res['unit_price'].quantize(
                     Decimal(1) / 10 ** self.__class__.unit_price.digits[1])
@@ -1046,7 +1079,7 @@ class PurchaseLine(ModelSQL, ModelView):
 
         with Transaction().set_context(self._get_context_purchase_price()):
             res['unit_price'] = Product.get_purchase_price([self.product],
-                self.quantity or 0)[self.product.id]
+                abs(self.quantity or 0))[self.product.id]
             if res['unit_price']:
                 res['unit_price'] = res['unit_price'].quantize(
                     Decimal(1) / 10 ** self.__class__.unit_price.digits[1])
@@ -1166,6 +1199,7 @@ class PurchaseLine(ModelSQL, ModelView):
         invoice_line.product = self.product
         invoice_line.unit_price = self.unit_price
         invoice_line.taxes = self.taxes
+        invoice_line.invoice_type = invoice_type
         if self.product:
             invoice_line.account = self.product.account_expense_used
             if not invoice_line.account:
@@ -1282,531 +1316,6 @@ class PurchaseReport(CompanyReport):
     __name__ = 'purchase.purchase'
 
 
-class Template:
-    __name__ = "product.template"
-    purchasable = fields.Boolean('Purchasable', states={
-            'readonly': ~Eval('active', True),
-            }, depends=['active'])
-    product_suppliers = fields.One2Many('purchase.product_supplier',
-        'product', 'Suppliers', states={
-            'readonly': ~Eval('active', True),
-            'invisible': (~Eval('purchasable', False)
-                | ~Eval('context', {}).get('company', 0)),
-            }, depends=['active', 'purchasable'])
-    purchase_uom = fields.Many2One('product.uom', 'Purchase UOM', states={
-            'readonly': ~Eval('active'),
-            'invisible': ~Eval('purchasable'),
-            'required': Eval('purchasable', False),
-            },
-        domain=[('category', '=', Eval('default_uom_category'))],
-        on_change_with=['default_uom', 'purchase_uom', 'purchasable'],
-        depends=['active', 'purchasable', 'default_uom_category'])
-
-    @classmethod
-    def __setup__(cls):
-        super(Template, cls).__setup__()
-        cls._error_messages.update({
-                'change_purchase_uom': ('Purchase prices are based '
-                    'on the purchase uom, are you sure to change it?'),
-                })
-        required = ~Eval('account_category') & Eval('purchasable', False)
-        if not cls.account_expense.states.get('required'):
-            cls.account_expense.states['required'] = required
-        else:
-            cls.account_expense.states['required'] = (
-                cls.account_expense.states['required'] | required)
-        if 'account_category' not in cls.account_expense.depends:
-            cls.account_expense.depends.append('account_category')
-        if 'purchasable' not in cls.account_expense.depends:
-            cls.account_expense.depends.append('purchasable')
-
-    @staticmethod
-    def default_purchasable():
-        return Transaction().context.get('purchasable') or False
-
-    def on_change_with_purchase_uom(self):
-        if self.default_uom:
-            if self.purchase_uom:
-                if self.default_uom.category == self.purchase_uom.category:
-                    return self.purchase_uom.id
-                else:
-                    return self.default_uom.id
-            else:
-                return self.default_uom.id
-
-    @classmethod
-    def write(cls, templates, vals):
-        if vals.get("purchase_uom"):
-            for template in templates:
-                if not template.purchase_uom:
-                    continue
-                if template.purchase_uom.id == vals["purchase_uom"]:
-                    continue
-                for product in template.products:
-                    if not product.product_suppliers:
-                        continue
-                    cls.raise_user_warning(
-                            '%s at product_template' % template.id,
-                            'change_purchase_uom')
-        super(Template, cls).write(templates, vals)
-
-
-class Product:
-    __name__ = 'product.product'
-
-    @classmethod
-    def get_purchase_price(cls, products, quantity=0):
-        '''
-        Return purchase price for product ids.
-        The context that can have as keys:
-            uom: the unit of measure
-            supplier: the supplier party id
-            currency: the currency id for the returned price
-        '''
-        pool = Pool()
-        Uom = pool.get('product.uom')
-        User = pool.get('res.user')
-        Currency = pool.get('currency.currency')
-        Date = pool.get('ir.date')
-
-        today = Date.today()
-        res = {}
-
-        uom = None
-        if Transaction().context.get('uom'):
-            uom = Uom(Transaction().context['uom'])
-
-        currency = None
-        if Transaction().context.get('currency'):
-            currency = Currency(Transaction().context['currency'])
-
-        user = User(Transaction().user)
-
-        for product in products:
-            res[product.id] = product.cost_price
-            default_uom = product.default_uom
-            default_currency = (user.company.currency if user.company
-                else None)
-            if not uom:
-                uom = default_uom
-            if (Transaction().context.get('supplier')
-                    and product.product_suppliers):
-                supplier_id = Transaction().context['supplier']
-                for product_supplier in product.product_suppliers:
-                    if product_supplier.party.id == supplier_id:
-                        for price in product_supplier.prices:
-                            if Uom.compute_qty(product.purchase_uom,
-                                    price.quantity, uom) <= quantity:
-                                res[product.id] = price.unit_price
-                                default_uom = product.purchase_uom
-                                default_currency = product_supplier.currency
-                        break
-            res[product.id] = Uom.compute_price(default_uom, res[product.id],
-                uom)
-            if currency and default_currency:
-                date = Transaction().context.get('purchase_date') or today
-                with Transaction().set_context(date=date):
-                    res[product.id] = Currency.compute(default_currency,
-                        res[product.id], currency, round=False)
-        return res
-
-
-class ProductSupplier(ModelSQL, ModelView):
-    'Product Supplier'
-    __name__ = 'purchase.product_supplier'
-    product = fields.Many2One('product.template', 'Product', required=True,
-            ondelete='CASCADE', select=True)
-    party = fields.Many2One('party.party', 'Supplier', required=True,
-            ondelete='CASCADE', select=True, on_change=['party'])
-    name = fields.Char('Name', size=None, translate=True, select=True)
-    code = fields.Char('Code', size=None, select=True)
-    sequence = fields.Integer('Sequence',
-        order_field='(%(table)s.sequence IS NULL) %(order)s, '
-        '%(table)s.sequence %(order)s')
-    prices = fields.One2Many('purchase.product_supplier.price',
-            'product_supplier', 'Prices')
-    company = fields.Many2One('company.company', 'Company', required=True,
-        ondelete='CASCADE', select=True,
-        domain=[
-            ('id', If(Eval('context', {}).contains('company'), '=', '!='),
-                Eval('context', {}).get('company', 0)),
-            ])
-    delivery_time = fields.Integer('Delivery Time', help="In number of days")
-    currency = fields.Many2One('currency.currency', 'Currency', required=True,
-        ondelete='RESTRICT')
-
-    @classmethod
-    def __setup__(cls):
-        super(ProductSupplier, cls).__setup__()
-        cls._order.insert(0, ('sequence', 'ASC'))
-
-    @classmethod
-    def __register__(cls, module_name):
-        cursor = Transaction().cursor
-        table = TableHandler(cursor, cls, module_name)
-
-        # Migration from 2.2 new field currency
-        created_currency = table.column_exist('currency')
-
-        super(ProductSupplier, cls).__register__(module_name)
-
-        # Migration from 2.2 fill currency
-        if not created_currency:
-            Company = Pool().get('company.company')
-            limit = cursor.IN_MAX
-            cursor.execute('SELECT count(id) FROM "' + cls._table + '"')
-            product_supplier_count, = cursor.fetchone()
-            for offset in range(0, product_supplier_count, limit):
-                cursor.execute(cursor.limit_clause(
-                        'SELECT p.id, c.currency '
-                        'FROM "' + cls._table + '" AS p '
-                        'INNER JOIN "' + Company._table + '" AS c '
-                            'ON p.company = c.id '
-                        'ORDER BY p.id',
-                        limit, offset))
-                for product_supplier_id, currency_id in cursor.fetchall():
-                    cursor.execute('UPDATE "' + cls._table + '" '
-                        'SET currency = %s '
-                        'WHERE id = %s', (currency_id, product_supplier_id))
-
-        # Migration from 2.4: drop required on sequence
-        table.not_null_action('sequence', action='remove')
-
-        # Migration from 2.6: drop required on delivery_time
-        table.not_null_action('delivery_time', action='remove')
-
-    @staticmethod
-    def default_company():
-        return Transaction().context.get('company')
-
-    @staticmethod
-    def default_currency():
-        Company = Pool().get('company.company')
-        if Transaction().context.get('company'):
-            company = Company(Transaction().context['company'])
-            return company.currency.id
-
-    def on_change_party(self):
-        cursor = Transaction().cursor
-        changes = {
-            'currency': self.default_currency(),
-            }
-        if self.party:
-            cursor.execute('SELECT currency FROM "' + self._table + '" '
-                'WHERE party = %s '
-                'GROUP BY currency '
-                'ORDER BY COUNT(1) DESC', (self.party.id,))
-            row = cursor.fetchone()
-            if row:
-                changes['currency'], = row
-        return changes
-
-    def compute_supply_date(self, date=None):
-        '''
-        Compute the supply date for the Product Supplier at the given date
-        '''
-        Date = Pool().get('ir.date')
-
-        if not date:
-            date = Date.today()
-        if self.delivery_time is None:
-            return datetime.date.max
-        return date + datetime.timedelta(self.delivery_time)
-
-    def compute_purchase_date(self, date):
-        '''
-        Compute the purchase date for the Product Supplier at the given date
-        '''
-        Date = Pool().get('ir.date')
-
-        if self.delivery_time is None:
-            return Date.today()
-        return date - datetime.timedelta(self.delivery_time)
-
-
-class ProductSupplierPrice(ModelSQL, ModelView):
-    'Product Supplier Price'
-    __name__ = 'purchase.product_supplier.price'
-    product_supplier = fields.Many2One('purchase.product_supplier',
-            'Supplier', required=True, ondelete='CASCADE')
-    quantity = fields.Float('Quantity', required=True, help='Minimal quantity')
-    unit_price = fields.Numeric('Unit Price', required=True, digits=(16, 4))
-
-    @classmethod
-    def __setup__(cls):
-        super(ProductSupplierPrice, cls).__setup__()
-        cls._order.insert(0, ('quantity', 'ASC'))
-
-    @staticmethod
-    def default_quantity():
-        return 0.0
-
-
-class ShipmentIn:
-    __name__ = 'stock.shipment.in'
-
-    @classmethod
-    def __setup__(cls):
-        super(ShipmentIn, cls).__setup__()
-        add_remove = [
-            ('supplier', '=', Eval('supplier')),
-            ]
-        if not cls.incoming_moves.add_remove:
-            cls.incoming_moves.add_remove = add_remove
-        else:
-            cls.incoming_moves.add_remove = [
-                add_remove,
-                cls.incoming_moves.add_remove,
-                ]
-        if 'supplier' not in cls.incoming_moves.depends:
-            cls.incoming_moves.depends.append('supplier')
-
-        cls._error_messages.update({
-                'reset_move': ('You cannot reset to draft move "%s" because '
-                    'it was generated by a purchase.'),
-                })
-
-    @classmethod
-    def write(cls, shipments, vals):
-        pool = Pool()
-        Purchase = pool.get('purchase.purchase')
-        PurchaseLine = pool.get('purchase.line')
-
-        super(ShipmentIn, cls).write(shipments, vals)
-
-        if 'state' in vals and vals['state'] in ('received', 'cancel'):
-            purchases = []
-            move_ids = []
-            for shipment in shipments:
-                move_ids.extend([x.id for x in shipment.incoming_moves])
-
-            purchase_lines = PurchaseLine.search([
-                    ('moves', 'in', move_ids),
-                    ])
-            if purchase_lines:
-                for purchase_line in purchase_lines:
-                    if purchase_line.purchase not in purchases:
-                        purchases.append(purchase_line.purchase)
-
-            with Transaction().set_user(0, set_context=True):
-                purchases = Purchase.browse([p.id for p in purchases])
-                Purchase.process(purchases)
-
-    @classmethod
-    @ModelView.button
-    @Workflow.transition('draft')
-    def draft(cls, shipments):
-        PurchaseLine = Pool().get('purchase.line')
-        for shipment in shipments:
-            for move in shipment.incoming_moves:
-                if (move.state == 'cancel'
-                        and isinstance(move.origin, PurchaseLine)):
-                    cls.raise_user_error('reset_move', (move.rec_name,))
-
-        return super(ShipmentIn, cls).draft(shipments)
-
-
-class ShipmentInReturn:
-    __name__ = 'stock.shipment.in.return'
-
-    @classmethod
-    def __setup__(cls):
-        super(ShipmentInReturn, cls).__setup__()
-        cls._error_messages.update({
-                'reset_move': ('You cannot reset to draft a move generated '
-                    'by a purchase.'),
-                })
-
-    @classmethod
-    def write(cls, shipments, vals):
-        pool = Pool()
-        Purchase = pool.get('purchase.purchase')
-        PurchaseLine = pool.get('purchase.line')
-
-        super(ShipmentInReturn, cls).write(shipments, vals)
-
-        if 'state' in vals and vals['state'] == 'done':
-            move_ids = []
-            for shipment in shipments:
-                move_ids.extend([x.id for x in shipment.moves])
-
-            purchase_lines = PurchaseLine.search([
-                    ('moves', 'in', move_ids),
-                    ])
-            purchases = set()
-            if purchase_lines:
-                for purchase_line in purchase_lines:
-                    purchases.add(purchase_line.purchase)
-
-            with Transaction().set_user(0, set_context=True):
-                purchases = Purchase.browse([p.id for p in purchases])
-                Purchase.process(purchases)
-
-    @classmethod
-    @ModelView.button
-    @Workflow.transition('draft')
-    def draft(cls, shipments):
-        PurchaseLine = Pool().get('purchase.line')
-        for shipment in shipments:
-            for move in shipment.moves:
-                if (move.state == 'cancel'
-                        and isinstance(move.origin, PurchaseLine)):
-                    cls.raise_user_error('reset_move')
-
-        return super(ShipmentInReturn, cls).draft(shipments)
-
-
-class Move(ModelSQL, ModelView):
-    __name__ = 'stock.move'
-    purchase = fields.Function(fields.Many2One('purchase.purchase', 'Purchase',
-            states={
-                'invisible': ~Eval('purchase_visible', False),
-                },
-            depends=['purchase_visible']), 'get_purchase',
-        searcher='search_purchase')
-    purchase_quantity = fields.Function(fields.Float('Purchase Quantity',
-            digits=(16, Eval('unit_digits', 2)),
-            states={
-                'invisible': ~Eval('purchase_visible', False),
-                },
-            depends=['purchase_visible', 'unit_digits']),
-        'get_purchase_fields')
-    purchase_unit = fields.Function(fields.Many2One('product.uom',
-            'Purchase Unit', states={
-                'invisible': ~Eval('purchase_visible', False),
-                }, depends=['purchase_visible']), 'get_purchase_fields')
-    purchase_unit_digits = fields.Function(fields.Integer(
-        'Purchase Unit Digits'), 'get_purchase_fields')
-    purchase_unit_price = fields.Function(fields.Numeric('Purchase Unit Price',
-            digits=(16, 4), states={
-                'invisible': ~Eval('purchase_visible', False),
-                }, depends=['purchase_visible']), 'get_purchase_fields')
-    purchase_currency = fields.Function(fields.Many2One('currency.currency',
-            'Purchase Currency', states={
-                'invisible': ~Eval('purchase_visible', False),
-                }, depends=['purchase_visible']), 'get_purchase_fields')
-    purchase_visible = fields.Function(fields.Boolean('Purchase Visible',
-        on_change_with=['from_location']), 'on_change_with_purchase_visible')
-    supplier = fields.Function(fields.Many2One('party.party', 'Supplier'),
-        'get_supplier', searcher='search_supplier')
-    purchase_exception_state = fields.Function(fields.Selection([
-        ('', ''),
-        ('ignored', 'Ignored'),
-        ('recreated', 'Recreated'),
-        ], 'Exception State'), 'get_purchase_exception_state')
-
-    @classmethod
-    def __register__(cls, module_name):
-        cursor = Transaction().cursor
-
-        super(Move, cls).__register__(module_name)
-
-        table = TableHandler(cursor, cls, module_name)
-
-        # Migration from 2.6: remove purchase_line
-        if table.column_exist('purchase_line'):
-            cursor.execute('UPDATE "' + cls._table + '" '
-                'SET origin = \'purchase.line,\' || purchase_line '
-                'WHERE purchase_line IS NOT NULL')
-            table.drop_column('purchase_line')
-
-    @classmethod
-    def _get_origin(cls):
-        models = super(Move, cls)._get_origin()
-        models.append('purchase.line')
-        return models
-
-    def get_purchase(self, name):
-        PurchaseLine = Pool().get('purchase.line')
-        if isinstance(self.origin, PurchaseLine):
-            return self.origin.purchase.id
-
-    @classmethod
-    def search_purchase(cls, name, clause):
-        return [('origin.' + name,) + tuple(clause[1:]) + ('purchase.line',)]
-
-    def get_purchase_exception_state(self, name):
-        PurchaseLine = Pool().get('purchase.line')
-        if not isinstance(self.origin, PurchaseLine):
-            return ''
-        if self in self.origin.moves_recreated:
-            return 'recreated'
-        if self in self.origin.moves_ignored:
-            return 'ignored'
-
-    def get_purchase_fields(self, name):
-        PurchaseLine = Pool().get('purchase.line')
-        if isinstance(self.origin, PurchaseLine):
-            if name[9:] == 'currency':
-                return self.origin.purchase.currency.id
-            elif name[9:] in ('quantity', 'unit_digits', 'unit_price'):
-                return getattr(self.origin, name[9:])
-            else:
-                return getattr(self.origin, name[9:]).id
-        else:
-            if name[9:] == 'quantity':
-                return 0.0
-            elif name[9:] == 'unit_digits':
-                return 2
-
-    def on_change_with_purchase_visible(self, name=None):
-        if self.from_location:
-            if self.from_location.type == 'supplier':
-                return True
-        return False
-
-    def get_supplier(self, name):
-        PurchaseLine = Pool().get('purchase.line')
-        if isinstance(self.origin, PurchaseLine):
-            return self.origin.purchase.party.id
-
-    @classmethod
-    def search_supplier(cls, name, clause):
-        return [('origin.purchase.party',) + tuple(clause[1:]) +
-            ('purchase.line',)]
-
-    @classmethod
-    def write(cls, moves, vals):
-        pool = Pool()
-        Purchase = pool.get('purchase.purchase')
-        PurchaseLine = pool.get('purchase.line')
-
-        super(Move, cls).write(moves, vals)
-        if 'state' in vals and vals['state'] in ('cancel',):
-            purchases = set()
-            purchase_lines = PurchaseLine.search([
-                    ('moves', 'in', [m.id for m in moves]),
-                    ])
-            if purchase_lines:
-                for purchase_line in purchase_lines:
-                    purchases.add(purchase_line.purchase)
-            if purchases:
-                with Transaction().set_user(0, set_context=True):
-                    purchases = Purchase.browse([p.id for p in purchases])
-                    Purchase.process(purchases)
-
-    @classmethod
-    def delete(cls, moves):
-        pool = Pool()
-        Purchase = pool.get('purchase.purchase')
-        PurchaseLine = pool.get('purchase.line')
-
-        purchases = set()
-        purchase_lines = PurchaseLine.search([
-                ('moves', 'in', [m.id for m in moves]),
-                ])
-
-        super(Move, cls).delete(moves)
-
-        if purchase_lines:
-            for purchase_line in purchase_lines:
-                purchases.add(purchase_line.purchase)
-            if purchases:
-                with Transaction().set_user(0, set_context=True):
-                    purchases = Purchase.browse([p.id for p in purchases])
-                    Purchase.process(purchases)
-
-
 class OpenSupplier(Wizard):
     'Open Suppliers'
     __name__ = 'purchase.open_supplier'
@@ -1817,9 +1326,12 @@ class OpenSupplier(Wizard):
         pool = Pool()
         ModelData = pool.get('ir.model.data')
         Wizard = pool.get('ir.action.wizard')
+        Purchase = pool.get('purchase.purchase')
         cursor = Transaction().cursor
+        purchase = Purchase.__table__()
 
-        cursor.execute("SELECT DISTINCT(party) FROM purchase_purchase")
+        cursor.execute(*purchase.select(purchase.party,
+                group_by=purchase.party))
         supplier_ids = [line[0] for line in cursor.fetchall()]
         action['pyson_domain'] = PYSONEncoder().encode(
             [('id', 'in', supplier_ids)])
@@ -1848,11 +1360,15 @@ class HandleShipmentExceptionAsk(ModelView):
     @classmethod
     def __register__(cls, module_name):
         cursor = Transaction().cursor
+        model = Table('ir_model')
         # Migration from 1.2: packing renamed into shipment
-        cursor.execute("UPDATE ir_model "
-            "SET model = REPLACE(model, 'packing', 'shipment') "
-            "WHERE model like '%%packing%%' AND module = %s",
-            (module_name,))
+        cursor.execute(*model.update(
+                columns=[model.model],
+                values=[Overlay(model.model, 'shipment',
+                        Position('packing', model.model),
+                        len('packing'))],
+                where=model.model.like('%packing%')
+                & (model.module == module_name)))
         super(HandleShipmentExceptionAsk, cls).__register__(module_name)
 
 
diff --git a/purchase.xml b/purchase.xml
index 2e2d6b4..a0427d8 100644
--- a/purchase.xml
+++ b/purchase.xml
@@ -163,6 +163,30 @@ this repository contains the full copyright notices and license terms. -->
             <field name="group" ref="group_purchase"/>
         </record>
 
+        <record model="ir.action.act_window" id="act_purchase_invoice_relate">
+            <field name="name">Purchases</field>
+            <field name="res_model">purchase.purchase</field>
+            <field name="domain">[('invoices', 'in', [Eval('id')])]</field>
+        </record>
+        <record model="ir.action.act_window.view"
+            id="act_purchase_invoice_relate_view1">
+            <field name="sequence" eval="10"/>
+            <field name="view" ref="purchase_view_tree"/>
+            <field name="act_window" ref="act_purchase_invoice_relate"/>
+        </record>
+        <record model="ir.action.act_window.view"
+            id="act_purchase_invoice_relate_view2">
+            <field name="sequence" eval="20"/>
+            <field name="view" ref="purchase_view_form"/>
+            <field name="act_window" ref="act_purchase_invoice_relate"/>
+        </record>
+        <record model="ir.action.keyword"
+            id="act_purchase_invoice_relate_keyword">
+            <field name="keyword">form_relate</field>
+            <field name="model">account.invoice,-1</field>
+            <field name="action" ref="act_purchase_invoice_relate"/>
+        </record>
+
         <menuitem name="Reporting" parent="menu_purchase"
             id="menu_reporting" sequence="100" active="0"/>
 
diff --git a/setup.py b/setup.py
index b231cb4..4ecd41d 100644
--- a/setup.py
+++ b/setup.py
@@ -21,7 +21,7 @@ major_version, minor_version, _ = info.get('version', '0.0.1').split('.', 2)
 major_version = int(major_version)
 minor_version = int(minor_version)
 
-requires = []
+requires = ['python-sql']
 for dep in info.get('depends', []):
     if not re.match(r'(ir|res|webdav)(\W|$)', dep):
         requires.append('trytond_%s >= %s.%s, < %s.%s' %
@@ -45,7 +45,8 @@ setup(name='trytond_purchase',
         ],
     package_data={
         'trytond.modules.purchase': (info.get('xml', [])
-            + ['tryton.cfg', 'view/*.xml', 'locale/*.po', 'purchase.odt']),
+            + ['tryton.cfg', 'view/*.xml', 'locale/*.po', 'tests/*.rst',
+                'purchase.odt']),
         },
     classifiers=[
         'Development Status :: 5 - Production/Stable',
@@ -63,6 +64,7 @@ setup(name='trytond_purchase',
         'Natural Language :: French',
         'Natural Language :: German',
         'Natural Language :: Russian',
+        'Natural Language :: Slovenian',
         'Natural Language :: Spanish',
         'Operating System :: OS Independent',
         'Programming Language :: Python :: 2.6',
diff --git a/stock.py b/stock.py
index 18ccf22..b01801a 100644
--- a/stock.py
+++ b/stock.py
@@ -1,13 +1,294 @@
 #This file is part of Tryton.  The COPYRIGHT file at the top level of
 #this repository contains the full copyright notices and license terms.
 import datetime
+from sql.operators import Concat
 
+from trytond.model import Workflow, ModelView, fields
+from trytond.pyson import Eval
 from trytond.wizard import Wizard
-from trytond.pool import Pool
+from trytond.pool import Pool, PoolMeta
 from trytond.transaction import Transaction
 from trytond.pyson import PYSONDecoder, PYSONEncoder
+from trytond import backend
 
-__all__ = ['OpenProductQuantitiesByWarehouse']
+__all__ = ['ShipmentIn', 'ShipmentInReturn', 'Move',
+    'OpenProductQuantitiesByWarehouse']
+__metaclass__ = PoolMeta
+
+
+class ShipmentIn:
+    __name__ = 'stock.shipment.in'
+
+    @classmethod
+    def __setup__(cls):
+        super(ShipmentIn, cls).__setup__()
+        add_remove = [
+            ('supplier', '=', Eval('supplier')),
+            ]
+        if not cls.incoming_moves.add_remove:
+            cls.incoming_moves.add_remove = add_remove
+        else:
+            cls.incoming_moves.add_remove = [
+                add_remove,
+                cls.incoming_moves.add_remove,
+                ]
+        if 'supplier' not in cls.incoming_moves.depends:
+            cls.incoming_moves.depends.append('supplier')
+
+        cls._error_messages.update({
+                'reset_move': ('You cannot reset to draft move "%s" because '
+                    'it was generated by a purchase.'),
+                })
+
+    @classmethod
+    def write(cls, shipments, vals):
+        pool = Pool()
+        Purchase = pool.get('purchase.purchase')
+        PurchaseLine = pool.get('purchase.line')
+
+        super(ShipmentIn, cls).write(shipments, vals)
+
+        if 'state' in vals and vals['state'] in ('received', 'cancel'):
+            purchases = []
+            move_ids = []
+            for shipment in shipments:
+                move_ids.extend([x.id for x in shipment.incoming_moves])
+
+            purchase_lines = PurchaseLine.search([
+                    ('moves', 'in', move_ids),
+                    ])
+            if purchase_lines:
+                for purchase_line in purchase_lines:
+                    if purchase_line.purchase not in purchases:
+                        purchases.append(purchase_line.purchase)
+
+            with Transaction().set_user(0, set_context=True):
+                purchases = Purchase.browse([p.id for p in purchases])
+                Purchase.process(purchases)
+
+    @classmethod
+    @ModelView.button
+    @Workflow.transition('draft')
+    def draft(cls, shipments):
+        PurchaseLine = Pool().get('purchase.line')
+        for shipment in shipments:
+            for move in shipment.incoming_moves:
+                if (move.state == 'cancel'
+                        and isinstance(move.origin, PurchaseLine)):
+                    cls.raise_user_error('reset_move', (move.rec_name,))
+
+        return super(ShipmentIn, cls).draft(shipments)
+
+
+class ShipmentInReturn:
+    __name__ = 'stock.shipment.in.return'
+
+    @classmethod
+    def __setup__(cls):
+        super(ShipmentInReturn, cls).__setup__()
+        cls._error_messages.update({
+                'reset_move': ('You cannot reset to draft a move generated '
+                    'by a purchase.'),
+                })
+
+    @classmethod
+    def write(cls, shipments, vals):
+        pool = Pool()
+        Purchase = pool.get('purchase.purchase')
+        PurchaseLine = pool.get('purchase.line')
+
+        super(ShipmentInReturn, cls).write(shipments, vals)
+
+        if 'state' in vals and vals['state'] == 'done':
+            move_ids = []
+            for shipment in shipments:
+                move_ids.extend([x.id for x in shipment.moves])
+
+            purchase_lines = PurchaseLine.search([
+                    ('moves', 'in', move_ids),
+                    ])
+            purchases = set()
+            if purchase_lines:
+                for purchase_line in purchase_lines:
+                    purchases.add(purchase_line.purchase)
+
+            with Transaction().set_user(0, set_context=True):
+                purchases = Purchase.browse([p.id for p in purchases])
+                Purchase.process(purchases)
+
+    @classmethod
+    @ModelView.button
+    @Workflow.transition('draft')
+    def draft(cls, shipments):
+        PurchaseLine = Pool().get('purchase.line')
+        for shipment in shipments:
+            for move in shipment.moves:
+                if (move.state == 'cancel'
+                        and isinstance(move.origin, PurchaseLine)):
+                    cls.raise_user_error('reset_move')
+
+        return super(ShipmentInReturn, cls).draft(shipments)
+
+
+class Move:
+    __name__ = 'stock.move'
+    purchase = fields.Function(fields.Many2One('purchase.purchase', 'Purchase',
+            states={
+                'invisible': ~Eval('purchase_visible', False),
+                },
+            depends=['purchase_visible']), 'get_purchase',
+        searcher='search_purchase')
+    purchase_quantity = fields.Function(fields.Float('Purchase Quantity',
+            digits=(16, Eval('unit_digits', 2)),
+            states={
+                'invisible': ~Eval('purchase_visible', False),
+                },
+            depends=['purchase_visible', 'unit_digits']),
+        'get_purchase_fields')
+    purchase_unit = fields.Function(fields.Many2One('product.uom',
+            'Purchase Unit', states={
+                'invisible': ~Eval('purchase_visible', False),
+                }, depends=['purchase_visible']), 'get_purchase_fields')
+    purchase_unit_digits = fields.Function(fields.Integer(
+        'Purchase Unit Digits'), 'get_purchase_fields')
+    purchase_unit_price = fields.Function(fields.Numeric('Purchase Unit Price',
+            digits=(16, 4), states={
+                'invisible': ~Eval('purchase_visible', False),
+                }, depends=['purchase_visible']), 'get_purchase_fields')
+    purchase_currency = fields.Function(fields.Many2One('currency.currency',
+            'Purchase Currency', states={
+                'invisible': ~Eval('purchase_visible', False),
+                }, depends=['purchase_visible']), 'get_purchase_fields')
+    purchase_visible = fields.Function(fields.Boolean('Purchase Visible',
+        on_change_with=['from_location']), 'on_change_with_purchase_visible')
+    supplier = fields.Function(fields.Many2One('party.party', 'Supplier'),
+        'get_supplier', searcher='search_supplier')
+    purchase_exception_state = fields.Function(fields.Selection([
+        ('', ''),
+        ('ignored', 'Ignored'),
+        ('recreated', 'Recreated'),
+        ], 'Exception State'), 'get_purchase_exception_state')
+
+    @classmethod
+    def __register__(cls, module_name):
+        TableHandler = backend.get('TableHandler')
+        cursor = Transaction().cursor
+        sql_table = cls.__table__()
+
+        super(Move, cls).__register__(module_name)
+
+        table = TableHandler(cursor, cls, module_name)
+
+        # Migration from 2.6: remove purchase_line
+        if table.column_exist('purchase_line'):
+            cursor.execute(*sql_table.update(
+                    columns=[sql_table.origin],
+                    values=[Concat('purchase.line,', sql_table.purchase_line)],
+                    where=sql_table.purchase_line != None))
+            table.drop_column('purchase_line')
+
+    @classmethod
+    def _get_origin(cls):
+        models = super(Move, cls)._get_origin()
+        models.append('purchase.line')
+        return models
+
+    def get_purchase(self, name):
+        PurchaseLine = Pool().get('purchase.line')
+        if isinstance(self.origin, PurchaseLine):
+            return self.origin.purchase.id
+
+    @classmethod
+    def search_purchase(cls, name, clause):
+        return [('origin.' + name,) + tuple(clause[1:]) + ('purchase.line',)]
+
+    def get_purchase_exception_state(self, name):
+        PurchaseLine = Pool().get('purchase.line')
+        if not isinstance(self.origin, PurchaseLine):
+            return ''
+        if self in self.origin.moves_recreated:
+            return 'recreated'
+        if self in self.origin.moves_ignored:
+            return 'ignored'
+
+    def get_purchase_fields(self, name):
+        PurchaseLine = Pool().get('purchase.line')
+        if isinstance(self.origin, PurchaseLine):
+            if name[9:] == 'currency':
+                return self.origin.purchase.currency.id
+            elif name[9:] in ('quantity', 'unit_digits', 'unit_price'):
+                return getattr(self.origin, name[9:])
+            else:
+                return getattr(self.origin, name[9:]).id
+        else:
+            if name[9:] == 'quantity':
+                return 0.0
+            elif name[9:] == 'unit_digits':
+                return 2
+
+    def on_change_with_purchase_visible(self, name=None):
+        if self.from_location:
+            if self.from_location.type == 'supplier':
+                return True
+        return False
+
+    def get_supplier(self, name):
+        PurchaseLine = Pool().get('purchase.line')
+        if isinstance(self.origin, PurchaseLine):
+            return self.origin.purchase.party.id
+
+    @property
+    def origin_name(self):
+        pool = Pool()
+        PurchaseLine = pool.get('purchase.line')
+        name = super(Move, self).origin_name
+        if isinstance(self.origin, PurchaseLine):
+            name = self.origin.purchase.rec_name
+        return name
+
+    @classmethod
+    def search_supplier(cls, name, clause):
+        return [('origin.purchase.party',) + tuple(clause[1:]) +
+            ('purchase.line',)]
+
+    @classmethod
+    @ModelView.button
+    @Workflow.transition('cancel')
+    def cancel(cls, moves):
+        pool = Pool()
+        Purchase = pool.get('purchase.purchase')
+        PurchaseLine = pool.get('purchase.line')
+
+        super(Move, cls).cancel(moves)
+        purchase_lines = PurchaseLine.search([
+                ('moves', 'in', [m.id for m in moves]),
+                ])
+        if purchase_lines:
+            purchase_ids = list(set(l.purchase.id for l in purchase_lines))
+            with Transaction().set_user(0, set_context=True):
+                purchases = Purchase.browse(purchase_ids)
+                Purchase.process(purchases)
+
+    @classmethod
+    def delete(cls, moves):
+        pool = Pool()
+        Purchase = pool.get('purchase.purchase')
+        PurchaseLine = pool.get('purchase.line')
+
+        purchases = set()
+        purchase_lines = PurchaseLine.search([
+                ('moves', 'in', [m.id for m in moves]),
+                ])
+
+        super(Move, cls).delete(moves)
+
+        if purchase_lines:
+            for purchase_line in purchase_lines:
+                purchases.add(purchase_line.purchase)
+            if purchases:
+                with Transaction().set_user(0, set_context=True):
+                    purchases = Purchase.browse([p.id for p in purchases])
+                    Purchase.process(purchases)
 
 
 class OpenProductQuantitiesByWarehouse(Wizard):
diff --git a/tests/__init__.py b/tests/__init__.py
index fdda836..f648605 100644
--- a/tests/__init__.py
+++ b/tests/__init__.py
@@ -2,3 +2,5 @@
 #this repository contains the full copyright notices and license terms.
 
 from .test_purchase import suite
+
+__all__ = ['suite']
diff --git a/tests/scenario_purchase.rst b/tests/scenario_purchase.rst
new file mode 100644
index 0000000..51472dc
--- /dev/null
+++ b/tests/scenario_purchase.rst
@@ -0,0 +1,509 @@
+=================
+Purchase Scenario
+=================
+
+Imports::
+
+    >>> import datetime
+    >>> from dateutil.relativedelta import relativedelta
+    >>> from decimal import Decimal
+    >>> from operator import attrgetter
+    >>> from proteus import config, Model, Wizard
+    >>> today = datetime.date.today()
+
+Create database::
+
+    >>> config = config.set_trytond()
+    >>> config.pool.test = True
+
+Install purchase::
+
+    >>> Module = Model.get('ir.module.module')
+    >>> purchase_module, = Module.find([('name', '=', 'purchase')])
+    >>> Module.install([purchase_module.id], config.context)
+    >>> Wizard('ir.module.module.install_upgrade').execute('upgrade')
+
+Create company::
+
+    >>> Currency = Model.get('currency.currency')
+    >>> CurrencyRate = Model.get('currency.currency.rate')
+    >>> currencies = Currency.find([('code', '=', 'EUR')])
+    >>> if not currencies:
+    ...     currency = Currency(name='Euro', symbol=u'€', code='EUR',
+    ...         rounding=Decimal('0.01'), mon_grouping='[3, 3, 0]',
+    ...         mon_decimal_point=',')
+    ...     currency.save()
+    ...     CurrencyRate(date=today + relativedelta(month=1, day=1),
+    ...         rate=Decimal('1.0'), currency=currency).save()
+    ... else:
+    ...     currency, = currencies
+    >>> Company = Model.get('company.company')
+    >>> Party = Model.get('party.party')
+    >>> company_config = Wizard('company.company.config')
+    >>> company_config.execute('company')
+    >>> company = company_config.form
+    >>> party = Party(name='B2CK')
+    >>> party.save()
+    >>> company.party = party
+    >>> company.currency = currency
+    >>> company_config.execute('add')
+    >>> company, = Company.find([])
+
+Reload the context::
+
+    >>> User = Model.get('res.user')
+    >>> Group = Model.get('res.group')
+    >>> config._context = User.get_preferences(True, config.context)
+
+Create purchase user::
+
+    >>> purchase_user = User()
+    >>> purchase_user.name = 'Purchase'
+    >>> purchase_user.login = 'purchase'
+    >>> purchase_user.main_company = company
+    >>> purchase_group, = Group.find([('name', '=', 'Purchase')])
+    >>> purchase_user.groups.append(purchase_group)
+    >>> purchase_user.save()
+
+Create stock user::
+
+    >>> stock_user = User()
+    >>> stock_user.name = 'Stock'
+    >>> stock_user.login = 'stock'
+    >>> stock_user.main_company = company
+    >>> stock_group, = Group.find([('name', '=', 'Stock')])
+    >>> stock_user.groups.append(stock_group)
+    >>> stock_user.save()
+
+Create account user::
+
+    >>> account_user = User()
+    >>> account_user.name = 'Account'
+    >>> account_user.login = 'account'
+    >>> account_user.main_company = company
+    >>> account_group, = Group.find([('name', '=', 'Account')])
+    >>> account_user.groups.append(account_group)
+    >>> account_user.save()
+
+Create fiscal year::
+
+    >>> FiscalYear = Model.get('account.fiscalyear')
+    >>> Sequence = Model.get('ir.sequence')
+    >>> SequenceStrict = Model.get('ir.sequence.strict')
+    >>> fiscalyear = FiscalYear(name=str(today.year))
+    >>> fiscalyear.start_date = today + relativedelta(month=1, day=1)
+    >>> fiscalyear.end_date = today + relativedelta(month=12, day=31)
+    >>> fiscalyear.company = company
+    >>> post_move_seq = Sequence(name=str(today.year), code='account.move',
+    ...     company=company)
+    >>> post_move_seq.save()
+    >>> fiscalyear.post_move_sequence = post_move_seq
+    >>> invoice_seq = SequenceStrict(name=str(today.year),
+    ...     code='account.invoice', company=company)
+    >>> invoice_seq.save()
+    >>> fiscalyear.out_invoice_sequence = invoice_seq
+    >>> fiscalyear.in_invoice_sequence = invoice_seq
+    >>> fiscalyear.out_credit_note_sequence = invoice_seq
+    >>> fiscalyear.in_credit_note_sequence = invoice_seq
+    >>> fiscalyear.save()
+    >>> FiscalYear.create_period([fiscalyear.id], config.context)
+
+Create chart of accounts::
+
+    >>> AccountTemplate = Model.get('account.account.template')
+    >>> Account = Model.get('account.account')
+    >>> account_template, = AccountTemplate.find([('parent', '=', None)])
+    >>> create_chart = Wizard('account.create_chart')
+    >>> create_chart.execute('account')
+    >>> create_chart.form.account_template = account_template
+    >>> create_chart.form.company = company
+    >>> create_chart.execute('create_account')
+    >>> receivable, = Account.find([
+    ...         ('kind', '=', 'receivable'),
+    ...         ('company', '=', company.id),
+    ...         ])
+    >>> payable, = Account.find([
+    ...         ('kind', '=', 'payable'),
+    ...         ('company', '=', company.id),
+    ...         ])
+    >>> revenue, = Account.find([
+    ...         ('kind', '=', 'revenue'),
+    ...         ('company', '=', company.id),
+    ...         ])
+    >>> expense, = Account.find([
+    ...         ('kind', '=', 'expense'),
+    ...         ('company', '=', company.id),
+    ...         ])
+    >>> create_chart.form.account_receivable = receivable
+    >>> create_chart.form.account_payable = payable
+    >>> create_chart.execute('create_properties')
+
+Create parties::
+
+    >>> Party = Model.get('party.party')
+    >>> supplier = Party(name='Supplier')
+    >>> supplier.save()
+    >>> customer = Party(name='Customer')
+    >>> customer.save()
+
+Create product::
+
+    >>> ProductUom = Model.get('product.uom')
+    >>> unit, = ProductUom.find([('name', '=', 'Unit')])
+    >>> ProductTemplate = Model.get('product.template')
+    >>> Product = Model.get('product.product')
+    >>> product = Product()
+    >>> template = ProductTemplate()
+    >>> template.name = 'product'
+    >>> template.default_uom = unit
+    >>> template.type = 'goods'
+    >>> template.purchasable = True
+    >>> template.salable = True
+    >>> template.list_price = Decimal('10')
+    >>> template.cost_price = Decimal('5')
+    >>> template.cost_price_method = 'fixed'
+    >>> template.account_expense = expense
+    >>> template.account_revenue = revenue
+    >>> template.save()
+    >>> product.template = template
+    >>> product.save()
+
+Create payment term::
+
+    >>> PaymentTerm = Model.get('account.invoice.payment_term')
+    >>> PaymentTermLine = Model.get('account.invoice.payment_term.line')
+    >>> payment_term = PaymentTerm(name='Direct')
+    >>> payment_term_line = PaymentTermLine(type='remainder', days=0)
+    >>> payment_term.lines.append(payment_term_line)
+    >>> payment_term.save()
+
+Create an Inventory::
+
+    >>> config.user = stock_user.id
+    >>> Inventory = Model.get('stock.inventory')
+    >>> InventoryLine = Model.get('stock.inventory.line')
+    >>> Location = Model.get('stock.location')
+    >>> storage, = Location.find([
+    ...         ('code', '=', 'STO'),
+    ...         ])
+    >>> inventory = Inventory()
+    >>> inventory.location = storage
+    >>> inventory.save()
+    >>> inventory_line = InventoryLine(product=product, inventory=inventory)
+    >>> inventory_line.quantity = 100.0
+    >>> inventory_line.expected_quantity = 0.0
+    >>> inventory.save()
+    >>> inventory_line.save()
+    >>> Inventory.confirm([inventory.id], config.context)
+    >>> inventory.state
+    u'done'
+
+Purchase 5 products::
+
+    >>> config.user = purchase_user.id
+    >>> Purchase = Model.get('purchase.purchase')
+    >>> PurchaseLine = Model.get('purchase.line')
+    >>> purchase = Purchase()
+    >>> purchase.party = supplier
+    >>> purchase.payment_term = payment_term
+    >>> purchase.invoice_method = 'order'
+    >>> purchase_line = PurchaseLine()
+    >>> purchase.lines.append(purchase_line)
+    >>> purchase_line.product = product
+    >>> purchase_line.quantity = 2.0
+    >>> purchase_line = PurchaseLine()
+    >>> purchase.lines.append(purchase_line)
+    >>> purchase_line.type = 'comment'
+    >>> purchase_line.description = 'Comment'
+    >>> purchase_line = PurchaseLine()
+    >>> purchase.lines.append(purchase_line)
+    >>> purchase_line.product = product
+    >>> purchase_line.quantity = 3.0
+    >>> purchase.save()
+    >>> Purchase.quote([purchase.id], config.context)
+    >>> Purchase.confirm([purchase.id], config.context)
+    >>> purchase.state
+    u'confirmed'
+    >>> purchase.reload()
+    >>> len(purchase.moves), len(purchase.shipment_returns), len(purchase.invoices)
+    (2, 0, 1)
+    >>> invoice, = purchase.invoices
+    >>> invoice.origins == purchase.rec_name
+    True
+
+Post invoice and check no new invoices::
+
+    >>> config.user = account_user.id
+    >>> Invoice = Model.get('account.invoice')
+    >>> purchase.invoices[0].invoice_date = today
+    >>> purchase.invoices[0].save()
+    >>> Invoice.post([i.id for i in purchase.invoices], config.context)
+    >>> config.user = purchase_user.id
+    >>> purchase.reload()
+    >>> len(purchase.moves), len(purchase.shipment_returns), len(purchase.invoices)
+    (2, 0, 1)
+
+Purchase 5 products with an invoice method 'on shipment'::
+
+    >>> config.user = purchase_user.id
+    >>> purchase = Purchase()
+    >>> purchase.party = supplier
+    >>> purchase.payment_term = payment_term
+    >>> purchase.invoice_method = 'shipment'
+    >>> purchase_line = PurchaseLine()
+    >>> purchase.lines.append(purchase_line)
+    >>> purchase_line.product = product
+    >>> purchase_line.quantity = 2.0
+    >>> purchase_line = PurchaseLine()
+    >>> purchase.lines.append(purchase_line)
+    >>> purchase_line.type = 'comment'
+    >>> purchase_line.description = 'Comment'
+    >>> purchase_line = PurchaseLine()
+    >>> purchase.lines.append(purchase_line)
+    >>> purchase_line.product = product
+    >>> purchase_line.quantity = 3.0
+    >>> purchase.save()
+    >>> Purchase.quote([purchase.id], config.context)
+    >>> Purchase.confirm([purchase.id], config.context)
+    >>> purchase.state
+    u'confirmed'
+    >>> purchase.reload()
+    >>> len(purchase.moves), len(purchase.shipment_returns), len(purchase.invoices)
+    (2, 0, 0)
+
+Validate Shipments::
+
+    >>> config.user = stock_user.id
+    >>> Move = Model.get('stock.move')
+    >>> ShipmentIn = Model.get('stock.shipment.in')
+    >>> shipment = ShipmentIn()
+    >>> shipment.supplier = supplier
+    >>> for move in purchase.moves:
+    ...     incoming_move = Move(id=move.id)
+    ...     shipment.incoming_moves.append(incoming_move)
+    >>> shipment.save()
+    >>> shipment.origins == purchase.rec_name
+    True
+    >>> ShipmentIn.receive([shipment.id], config.context)
+    >>> ShipmentIn.done([shipment.id], config.context)
+    >>> purchase.reload()
+    >>> len(purchase.shipments), len(purchase.shipment_returns)
+    (1, 0)
+
+Open supplier invoice::
+
+    >>> Invoice = Model.get('account.invoice')
+    >>> invoice, = purchase.invoices
+    >>> config.user = account_user.id
+    >>> invoice.type
+    u'in_invoice'
+    >>> len(invoice.lines)
+    2
+    >>> for line in invoice.lines:
+    ...     line.quantity = 1
+    ...     line.save()
+    >>> invoice.invoice_date = today
+    >>> invoice.save()
+    >>> Invoice.post([invoice.id], config.context)
+
+Check second invoices::
+
+    >>> config.user = purchase_user.id
+    >>> purchase.reload()
+    >>> len(purchase.invoices)
+    2
+    >>> sum(l.quantity for i in purchase.invoices for l in i.lines)
+    5.0
+
+Create a Return::
+
+    >>> config.user = purchase_user.id
+    >>> return_ = Purchase()
+    >>> return_.party = supplier
+    >>> return_.payment_term = payment_term
+    >>> return_.invoice_method = 'shipment'
+    >>> return_line = PurchaseLine()
+    >>> return_.lines.append(return_line)
+    >>> return_line.product = product
+    >>> return_line.quantity = -4.
+    >>> return_line = PurchaseLine()
+    >>> return_.lines.append(return_line)
+    >>> return_line.type = 'comment'
+    >>> return_line.description = 'Comment'
+    >>> return_.save()
+    >>> Purchase.quote([return_.id], config.context)
+    >>> Purchase.confirm([return_.id], config.context)
+    >>> return_.state
+    u'confirmed'
+    >>> return_.reload()
+    >>> (len(return_.shipments), len(return_.shipment_returns),
+    ...     len(return_.invoices))
+    (0, 1, 0)
+
+Check Return Shipments::
+
+    >>> config.user = stock_user.id
+    >>> ShipmentReturn = Model.get('stock.shipment.in.return')
+    >>> ship_return, = return_.shipment_returns
+    >>> ship_return.state
+    u'waiting'
+    >>> move_return, = ship_return.moves
+    >>> move_return.product.rec_name
+    u'product'
+    >>> move_return.quantity
+    4.0
+    >>> ShipmentReturn.assign_try([ship_return.id], config.context)
+    True
+    >>> ShipmentReturn.done([ship_return.id], config.context)
+    >>> ship_return.reload()
+    >>> ship_return.state
+    u'done'
+    >>> return_.reload()
+
+Open supplier credit note::
+
+    >>> credit_note, = return_.invoices
+    >>> config.user = account_user.id
+    >>> credit_note.type
+    u'in_credit_note'
+    >>> len(credit_note.lines)
+    1
+    >>> sum(l.quantity for l in credit_note.lines)
+    4.0
+    >>> credit_note.invoice_date = today
+    >>> credit_note.save()
+    >>> Invoice.post([credit_note.id], config.context)
+
+Mixing return and purchase::
+
+    >>> config.user = purchase_user.id
+    >>> mix = Purchase()
+    >>> mix.party = supplier
+    >>> mix.payment_term = payment_term
+    >>> mix.invoice_method = 'order'
+    >>> mixline = PurchaseLine()
+    >>> mix.lines.append(mixline)
+    >>> mixline.product = product
+    >>> mixline.quantity = 7.
+    >>> mixline_comment = PurchaseLine()
+    >>> mix.lines.append(mixline_comment)
+    >>> mixline_comment.type = 'comment'
+    >>> mixline_comment.description = 'Comment'
+    >>> mixline2 = PurchaseLine()
+    >>> mix.lines.append(mixline2)
+    >>> mixline2.product = product
+    >>> mixline2.quantity = -2.
+    >>> mix.save()
+    >>> Purchase.quote([mix.id], config.context)
+    >>> Purchase.confirm([mix.id], config.context)
+    >>> mix.state
+    u'confirmed'
+    >>> mix.reload()
+    >>> len(mix.moves), len(mix.shipment_returns), len(mix.invoices)
+    (2, 1, 2)
+
+Checking Shipments::
+
+    >>> mix_returns, = mix.shipment_returns
+    >>> config.user = stock_user.id
+    >>> mix_shipments = ShipmentIn()
+    >>> mix_shipments.supplier = supplier
+    >>> for move in mix.moves:
+    ...     if move.id in [m.id for m in mix_returns.moves]:
+    ...         continue
+    ...     incoming_move = Move(id=move.id)
+    ...     mix_shipments.incoming_moves.append(incoming_move)
+    >>> mix_shipments.save()
+    >>> ShipmentIn.receive([mix_shipments.id], config.context)
+    >>> ShipmentIn.done([mix_shipments.id], config.context)
+    >>> mix.reload()
+    >>> len(mix.shipments)
+    1
+
+    >>> ShipmentReturn.wait([mix_returns.id], config.context)
+    >>> ShipmentReturn.assign_try([mix_returns.id], config.context)
+    True
+    >>> ShipmentReturn.done([mix_returns.id], config.context)
+    >>> move_return, = mix_returns.moves
+    >>> move_return.product.rec_name
+    u'product'
+    >>> move_return.quantity
+    2.0
+
+Checking the invoice::
+
+    >>> config.user = purchase_user.id
+    >>> mix.reload()
+    >>> mix_invoice, mix_credit_note = sorted(mix.invoices,
+    ...     key=attrgetter('type'), reverse=True)
+    >>> config.user = account_user.id
+    >>> mix_invoice.type, mix_credit_note.type
+    (u'in_invoice', u'in_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.invoice_date = today
+    >>> mix_invoice.save()
+    >>> Invoice.post([mix_invoice.id], config.context)
+    >>> mix_credit_note.invoice_date = today
+    >>> mix_credit_note.save()
+    >>> Invoice.post([mix_credit_note.id], config.context)
+
+Mixing stuff with an invoice method 'on shipment'::
+
+    >>> config.user = purchase_user.id
+    >>> mix = Purchase()
+    >>> mix.party = supplier
+    >>> mix.payment_term = payment_term
+    >>> mix.invoice_method = 'shipment'
+    >>> mixline = PurchaseLine()
+    >>> mix.lines.append(mixline)
+    >>> mixline.product = product
+    >>> mixline.quantity = 6.
+    >>> mixline_comment = PurchaseLine()
+    >>> mix.lines.append(mixline_comment)
+    >>> mixline_comment.type = 'comment'
+    >>> mixline_comment.description = 'Comment'
+    >>> mixline2 = PurchaseLine()
+    >>> mix.lines.append(mixline2)
+    >>> mixline2.product = product
+    >>> mixline2.quantity = -3.
+    >>> mix.save()
+    >>> Purchase.quote([mix.id], config.context)
+    >>> Purchase.confirm([mix.id], config.context)
+    >>> mix.state
+    u'confirmed'
+    >>> mix.reload()
+    >>> len(mix.moves), len(mix.shipment_returns), len(mix.invoices)
+    (2, 1, 0)
+
+Checking Shipments::
+
+    >>> config.user = stock_user.id
+    >>> mix_returns, = mix.shipment_returns
+    >>> mix_shipments = ShipmentIn()
+    >>> mix_shipments.supplier = supplier
+    >>> for move in mix.moves:
+    ...     if move.id in [m.id for m in mix_returns.moves]:
+    ...         continue
+    ...     incoming_move = Move(id=move.id)
+    ...     mix_shipments.incoming_moves.append(incoming_move)
+    >>> mix_shipments.save()
+    >>> ShipmentIn.receive([mix_shipments.id], config.context)
+    >>> ShipmentIn.done([mix_shipments.id], config.context)
+    >>> mix.reload()
+    >>> len(mix.shipments)
+    1
+
+    >>> ShipmentReturn.wait([mix_returns.id], config.context)
+    >>> ShipmentReturn.assign_try([mix_returns.id], config.context)
+    True
+    >>> ShipmentReturn.done([mix_returns.id], config.context)
+    >>> move_return, = mix_returns.moves
+    >>> move_return.product.rec_name
+    u'product'
+    >>> move_return.quantity
+    3.0
diff --git a/tryton.cfg b/tryton.cfg
index 2e500f3..d730807 100644
--- a/tryton.cfg
+++ b/tryton.cfg
@@ -1,5 +1,5 @@
 [tryton]
-version=2.8.1
+version=3.0.0
 depends:
     account
     account_invoice
diff --git a/trytond_purchase.egg-info/PKG-INFO b/trytond_purchase.egg-info/PKG-INFO
index 9cd4956..9b4ba9e 100644
--- a/trytond_purchase.egg-info/PKG-INFO
+++ b/trytond_purchase.egg-info/PKG-INFO
@@ -1,12 +1,12 @@
 Metadata-Version: 1.1
 Name: trytond-purchase
-Version: 2.8.1
+Version: 3.0.0
 Summary: Tryton module for purchase
 Home-page: http://www.tryton.org/
 Author: Tryton
 Author-email: UNKNOWN
 License: GPL-3
-Download-URL: http://downloads.tryton.org/2.8/
+Download-URL: http://downloads.tryton.org/3.0/
 Description: trytond_purchase
         ================
         
@@ -59,6 +59,7 @@ Classifier: Natural Language :: English
 Classifier: Natural Language :: French
 Classifier: Natural Language :: German
 Classifier: Natural Language :: Russian
+Classifier: Natural Language :: Slovenian
 Classifier: Natural Language :: Spanish
 Classifier: Operating System :: OS Independent
 Classifier: Programming Language :: Python :: 2.6
diff --git a/trytond_purchase.egg-info/SOURCES.txt b/trytond_purchase.egg-info/SOURCES.txt
index 8e0a17a..67ef9c3 100644
--- a/trytond_purchase.egg-info/SOURCES.txt
+++ b/trytond_purchase.egg-info/SOURCES.txt
@@ -16,6 +16,7 @@ tryton.cfg
 ./__init__.py
 ./configuration.py
 ./invoice.py
+./product.py
 ./purchase.py
 ./stock.py
 ./tests/__init__.py
@@ -31,6 +32,8 @@ locale/es_ES.po
 locale/fr_FR.po
 locale/nl_NL.po
 locale/ru_RU.po
+locale/sl_SI.po
+tests/scenario_purchase.rst
 trytond_purchase.egg-info/PKG-INFO
 trytond_purchase.egg-info/SOURCES.txt
 trytond_purchase.egg-info/dependency_links.txt
diff --git a/trytond_purchase.egg-info/requires.txt b/trytond_purchase.egg-info/requires.txt
index 54d6265..bc38aef 100644
--- a/trytond_purchase.egg-info/requires.txt
+++ b/trytond_purchase.egg-info/requires.txt
@@ -1,9 +1,10 @@
-trytond_account >= 2.8, < 2.9
-trytond_account_invoice >= 2.8, < 2.9
-trytond_account_product >= 2.8, < 2.9
-trytond_company >= 2.8, < 2.9
-trytond_currency >= 2.8, < 2.9
-trytond_party >= 2.8, < 2.9
-trytond_product >= 2.8, < 2.9
-trytond_stock >= 2.8, < 2.9
-trytond >= 2.8, < 2.9
\ No newline at end of file
+python-sql
+trytond_account >= 3.0, < 3.1
+trytond_account_invoice >= 3.0, < 3.1
+trytond_account_product >= 3.0, < 3.1
+trytond_company >= 3.0, < 3.1
+trytond_currency >= 3.0, < 3.1
+trytond_party >= 3.0, < 3.1
+trytond_product >= 3.0, < 3.1
+trytond_stock >= 3.0, < 3.1
+trytond >= 3.0, < 3.1
\ No newline at end of file
diff --git a/view/purchase_tree.xml b/view/purchase_tree.xml
index 7778ed4..4f16d6c 100644
--- a/view/purchase_tree.xml
+++ b/view/purchase_tree.xml
@@ -15,5 +15,4 @@ this repository contains the full copyright notices and license terms. -->
     <field name="shipment_state"/>
     <field name="description"/>
     <field name="currency_digits" tree_invisible="1"/>
-    <field name="create_date" tree_invisible="1"/>
 </tree>
commit b0548d5e07f1e1ca44ce1eaf15133f190a38cd4f
Author: Mathias Behrle <mathiasb at m9s.biz>
Date:   Sun Oct 13 20:01:58 2013 +0200

    Adding upstream version 2.8.1.

diff --git a/CHANGELOG b/CHANGELOG
index 2f1b1f2..2672ce9 100644
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -1,3 +1,6 @@
+Version 2.8.1 - 2013-10-01
+* Bug fixes (see mercurial logs for details)
+
 Version 2.8.0 - 2013-04-22
 * Bug fixes (see mercurial logs for details)
 * Use origin Reference on Invoice Line and Stock Move
diff --git a/PKG-INFO b/PKG-INFO
index f818c38..f5fde0f 100644
--- a/PKG-INFO
+++ b/PKG-INFO
@@ -1,6 +1,6 @@
 Metadata-Version: 1.1
 Name: trytond_purchase
-Version: 2.8.0
+Version: 2.8.1
 Summary: Tryton module for purchase
 Home-page: http://www.tryton.org/
 Author: Tryton
diff --git a/invoice.py b/invoice.py
index d04b3a3..9199d59 100644
--- a/invoice.py
+++ b/invoice.py
@@ -57,8 +57,8 @@ class Invoice:
             cursor.execute('SELECT id FROM purchase_invoices_rel '
                 'WHERE invoice IN (' + ','.join(('%s',) * len(invoices)) + ')',
                 [i.id for i in invoices])
-        if cursor.fetchone():
-            cls.raise_user_error('delete_purchase_invoice')
+            if cursor.fetchone():
+                cls.raise_user_error('delete_purchase_invoice')
         super(Invoice, cls).delete(invoices)
 
     @classmethod
diff --git a/purchase.py b/purchase.py
index a974940..4e30c24 100644
--- a/purchase.py
+++ b/purchase.py
@@ -1123,8 +1123,10 @@ class PurchaseLine(ModelSQL, ModelView):
         invoice_line.type = self.type
         invoice_line.description = self.description
         invoice_line.note = self.note
+        invoice_line.origin = self
         if self.type != 'line':
             if (self.purchase.invoice_method == 'order'
+                    and not self.invoice_lines
                     and ((all(l.quantity >= 0 for l in self.purchase.lines
                                 if l.type == 'line')
                             and invoice_type == 'in_invoice')
@@ -1179,7 +1181,6 @@ class PurchaseLine(ModelSQL, ModelView):
             if not invoice_line.account:
                 self.raise_user_error('missing_account_expense_property',
                     (invoice_line.purchase.rec_name,))
-        invoice_line.origin = self
         return [invoice_line]
 
     @classmethod
diff --git a/tryton.cfg b/tryton.cfg
index a396b5e..2e500f3 100644
--- a/tryton.cfg
+++ b/tryton.cfg
@@ -1,5 +1,5 @@
 [tryton]
-version=2.8.0
+version=2.8.1
 depends:
     account
     account_invoice
diff --git a/trytond_purchase.egg-info/PKG-INFO b/trytond_purchase.egg-info/PKG-INFO
index 38ea800..9cd4956 100644
--- a/trytond_purchase.egg-info/PKG-INFO
+++ b/trytond_purchase.egg-info/PKG-INFO
@@ -1,6 +1,6 @@
 Metadata-Version: 1.1
 Name: trytond-purchase
-Version: 2.8.0
+Version: 2.8.1
 Summary: Tryton module for purchase
 Home-page: http://www.tryton.org/
 Author: Tryton
commit e003914641dca553018542b0ca432e547033abc4
Author: Mathias Behrle <mathiasb at m9s.biz>
Date:   Thu May 2 00:37:18 2013 +0200

    Adding upstream version 2.8.0.

diff --git a/CHANGELOG b/CHANGELOG
index 7f55da7..2f1b1f2 100644
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -1,5 +1,7 @@
-Version 2.6.1 - 2012-12-23
+Version 2.8.0 - 2013-04-22
 * Bug fixes (see mercurial logs for details)
+* Use origin Reference on Invoice Line and Stock Move
+* Allow no delivery time on product supplier
 
 Version 2.6.0 - 2012-10-22
 * Bug fixes (see mercurial logs for details)
diff --git a/COPYRIGHT b/COPYRIGHT
index ede3fac..5d422e0 100644
--- a/COPYRIGHT
+++ b/COPYRIGHT
@@ -1,6 +1,6 @@
-Copyright (C) 2008-2012 Cédric Krier.
-Copyright (C) 2008-2012 Bertrand Chenal.
-Copyright (C) 2008-2012 B2CK SPRL.
+Copyright (C) 2008-2013 Cédric Krier.
+Copyright (C) 2008-2013 Bertrand Chenal.
+Copyright (C) 2008-2013 B2CK SPRL.
 Copyright (C) 2004-2008 Tiny SPRL.
 
 This program is free software: you can redistribute it and/or modify
diff --git a/MANIFEST.in b/MANIFEST.in
index 97a9596..2569955 100644
--- a/MANIFEST.in
+++ b/MANIFEST.in
@@ -6,6 +6,7 @@ include CHANGELOG
 include LICENSE
 include tryton.cfg
 include *.xml
+include view/*.xml
 include *.odt
 include locale/*.po
 include doc/*
diff --git a/PKG-INFO b/PKG-INFO
index ee5c3e1..f818c38 100644
--- a/PKG-INFO
+++ b/PKG-INFO
@@ -1,12 +1,12 @@
 Metadata-Version: 1.1
 Name: trytond_purchase
-Version: 2.6.1
+Version: 2.8.0
 Summary: Tryton module for purchase
 Home-page: http://www.tryton.org/
 Author: Tryton
 Author-email: UNKNOWN
 License: GPL-3
-Download-URL: http://downloads.tryton.org/2.6/
+Download-URL: http://downloads.tryton.org/2.8/
 Description: trytond_purchase
         ================
         
@@ -52,6 +52,7 @@ Classifier: Intended Audience :: Financial and Insurance Industry
 Classifier: Intended Audience :: Legal Industry
 Classifier: License :: OSI Approved :: GNU General Public License (GPL)
 Classifier: Natural Language :: Bulgarian
+Classifier: Natural Language :: Catalan
 Classifier: Natural Language :: Czech
 Classifier: Natural Language :: Dutch
 Classifier: Natural Language :: English
diff --git a/__init__.py b/__init__.py
index 2001f59..f5f710c 100644
--- a/__init__.py
+++ b/__init__.py
@@ -10,13 +10,13 @@ from .stock import *
 
 def register():
     Pool.register(
+        Move,
         Purchase,
         PurchaseInvoice,
         PurchaseIgnoredInvoice,
         PurchaseRecreadtedInvoice,
         PurchaseLine,
         PurchaseLineTax,
-        PurchaseLineInvoiceLine,
         PurchaseLineIgnoredMove,
         PurchaseLineRecreatedMove,
         Template,
@@ -25,7 +25,6 @@ def register():
         ProductSupplierPrice,
         ShipmentIn,
         ShipmentInReturn,
-        Move,
         HandleShipmentExceptionAsk,
         HandleInvoiceExceptionAsk,
         Configuration,
diff --git a/configuration.xml b/configuration.xml
index 8c2ad6e..9cdc959 100644
--- a/configuration.xml
+++ b/configuration.xml
@@ -6,16 +6,7 @@ this repository contains the full copyright notices and license terms. -->
         <record model="ir.ui.view" id="purchase_configuration_view_form">
             <field name="model">purchase.configuration</field>
             <field name="type">form</field>
-            <field name="arch" type="xml">
-                <![CDATA[
-                <form string="Purchase Configuration">
-                    <label name="purchase_sequence"/>
-                    <field name="purchase_sequence"/>
-                    <label name="purchase_invoice_method" />
-                    <field name="purchase_invoice_method" />
-                </form>
-                ]]>
-            </field>
+            <field name="name">configuration_form</field>
         </record>
         <record model="ir.action.act_window" id="act_purchase_configuration_form">
             <field name="name">Purchase Configuration</field>
diff --git a/invoice.py b/invoice.py
index bf7c732..d04b3a3 100644
--- a/invoice.py
+++ b/invoice.py
@@ -3,6 +3,7 @@
 from trytond.model import ModelView, Workflow, fields
 from trytond.pool import Pool, PoolMeta
 from trytond.transaction import Transaction
+from trytond.backend import TableHandler
 
 __all__ = ['Invoice', 'InvoiceLine']
 __metaclass__ = PoolMeta
@@ -22,10 +23,10 @@ class Invoice:
     def __setup__(cls):
         super(Invoice, cls).__setup__()
         cls._error_messages.update({
-                'delete_purchase_invoice': 'You can not delete invoices ' \
-                    'that come from a purchase!',
-                'reset_invoice_purchase': 'You cannot reset to draft ' \
-                        'an invoice generated by a purchase.',
+                'delete_purchase_invoice': ('You can not delete invoices '
+                    'that come from a purchase.'),
+                'reset_invoice_purchase': ('You cannot reset to draft '
+                    'an invoice generated by a purchase.'),
                 })
 
     @classmethod
@@ -53,7 +54,7 @@ class Invoice:
     def delete(cls, invoices):
         cursor = Transaction().cursor
         if invoices:
-            cursor.execute('SELECT id FROM purchase_invoices_rel ' \
+            cursor.execute('SELECT id FROM purchase_invoices_rel '
                 'WHERE invoice IN (' + ','.join(('%s',) * len(invoices)) + ')',
                 [i.id for i in invoices])
         if cursor.fetchone():
@@ -77,7 +78,7 @@ class Invoice:
             purchases = Purchase.search([
                     ('invoices', 'in', [i.id for i in invoices]),
                     ])
-        if purchases:
+        if purchases and any(i.state == 'cancel' for i in invoices):
             cls.raise_user_error('reset_invoice_purchase')
 
         return super(Invoice, cls).draft(invoices)
@@ -103,13 +104,28 @@ class Invoice:
 
 class InvoiceLine:
     __name__ = 'account.invoice.line'
-    purchase_lines = fields.Many2Many('purchase.line-account.invoice.line',
-            'invoice_line', 'purchase_line', 'Purchase Lines', readonly=True)
 
     @classmethod
-    def copy(cls, lines, default=None):
-        if default is None:
-            default = {}
-        default = default.copy()
-        default.setdefault('purchase_lines', None)
-        return super(InvoiceLine, cls).copy(lines, default=default)
+    def __register__(cls, module_name):
+        cursor = Transaction().cursor
+
+        super(InvoiceLine, cls).__register__(module_name)
+
+        # Migration from 2.6: remove purchase_lines
+        rel_table = 'purchase_line_invoice_lines_rel'
+        if TableHandler.table_exist(cursor, rel_table):
+            cursor.execute('SELECT purchase_line, invoice_line '
+                'FROM "' + rel_table + '"')
+            for purchase_line, invoice_line in cursor.fetchall():
+                cursor.execute('UPDATE "' + cls._table + '" '
+                    'SET origin = %s '
+                    'WHERE id = %s',
+                    ('purchase.line,%s' % purchase_line, invoice_line))
+            TableHandler.drop_table(cursor,
+                'purchase.line-account.invoice.line', rel_table)
+
+    @classmethod
+    def _get_origin(cls):
+        models = super(InvoiceLine, cls)._get_origin()
+        models.append('purchase.line')
+        return models
diff --git a/locale/bg_BG.po b/locale/bg_BG.po
index fd940ae..81b3e2a 100644
--- a/locale/bg_BG.po
+++ b/locale/bg_BG.po
@@ -3,8 +3,8 @@ msgid ""
 msgstr "Content-Type: text/plain; charset=utf-8\n"
 
 msgctxt "error:account.invoice:"
-msgid "You can not delete invoices that come from a purchase!"
-msgstr "Не може да изтривате фактури които идват от покупка!"
+msgid "You can not delete invoices that come from a purchase."
+msgstr ""
 
 msgctxt "error:account.invoice:"
 msgid "You cannot reset to draft an invoice generated by a purchase."
@@ -18,32 +18,33 @@ msgstr ""
 "да я смените?"
 
 msgctxt "error:purchase.line:"
-msgid "It misses an \"Account Expense\" on product \"%s\"!"
-msgstr "Не е зададена \"Сметка за разходи\" за продукт \"%s\"!"
+msgid ""
+"Product \"%(product)s\" of purchase %(purchase)s misses an expense account."
+msgstr ""
 
 msgctxt "error:purchase.line:"
-msgid "It misses an \"account expense\" default property!"
-msgstr "Няма е зададено свойство по подразбиране \"Сметка за разходи\"!"
+msgid "Purchase \"%(purchase)s\" misses an \"account expense\" default property."
+msgstr ""
 
 msgctxt "error:purchase.line:"
-msgid "The supplier location is required!"
-msgstr "Местонахождението на доставчика е задължително!"
+msgid "Purchase \"%(purchase)s\" misses the supplier location for line \"%(line)s\"."
+msgstr ""
 
 msgctxt "error:purchase.purchase:"
-msgid "A warehouse must be defined for the quotation."
-msgstr "При запитване е необходимо да се укаже склад"
+msgid "A warehouse must be defined for quotation of sale \"%s\"."
+msgstr ""
 
 msgctxt "error:purchase.purchase:"
-msgid "Invoice addresses must be defined for the quotation."
-msgstr "За запитването трябва да бъдат зададени адреси за фактуриране ."
+msgid "Invoice address must be defined for quotation of sale \"%s\"."
+msgstr ""
 
 msgctxt "error:purchase.purchase:"
-msgid "It misses an \"Account Payable\" on the party \"%s\"!"
-msgstr "Липсва \"Разходна сметка\" за партньор \"%s\"!"
+msgid "Missing \"Account Payable\" on party \"%s\"."
+msgstr ""
 
 msgctxt "error:purchase.purchase:"
-msgid "Purchase \"%s\" must be cancelled before deletion!"
-msgstr "Преди да бъде изтрита покупка \"%s\" трябва да бъде прекратена!"
+msgid "Purchase \"%s\" must be cancelled before deletion."
+msgstr ""
 
 #, fuzzy
 msgctxt "error:stock.shipment.in.return:"
@@ -51,8 +52,10 @@ msgid "You cannot reset to draft a move generated by a purchase."
 msgstr "Не може да преместите в проект движение създадено от покупка."
 
 msgctxt "error:stock.shipment.in:"
-msgid "You cannot reset to draft a move generated by a purchase."
-msgstr "Не може да преместите в проект движение създадено от покупка."
+msgid ""
+"You cannot reset to draft move \"%s\" because it was generated by a "
+"purchase."
+msgstr ""
 
 msgctxt "field:account.invoice,purchase_exception_state:"
 msgid "Exception State"
@@ -62,10 +65,6 @@ msgctxt "field:account.invoice,purchases:"
 msgid "Purchases"
 msgstr "Покупки"
 
-msgctxt "field:account.invoice.line,purchase_lines:"
-msgid "Purchase Lines"
-msgstr "Редове от покупка"
-
 msgctxt "field:product.template,product_suppliers:"
 msgid "Suppliers"
 msgstr "Доставчици"
@@ -246,38 +245,6 @@ msgctxt "field:purchase.line,write_uid:"
 msgid "Write User"
 msgstr "Променено от"
 
-msgctxt "field:purchase.line-account.invoice.line,create_date:"
-msgid "Create Date"
-msgstr "Създадено на"
-
-msgctxt "field:purchase.line-account.invoice.line,create_uid:"
-msgid "Create User"
-msgstr "Създадено от"
-
-msgctxt "field:purchase.line-account.invoice.line,id:"
-msgid "ID"
-msgstr "ID"
-
-msgctxt "field:purchase.line-account.invoice.line,invoice_line:"
-msgid "Invoice Line"
-msgstr "Ред от фактура"
-
-msgctxt "field:purchase.line-account.invoice.line,purchase_line:"
-msgid "Purchase Line"
-msgstr "Ред от покупка"
-
-msgctxt "field:purchase.line-account.invoice.line,rec_name:"
-msgid "Name"
-msgstr "Име"
-
-msgctxt "field:purchase.line-account.invoice.line,write_date:"
-msgid "Write Date"
-msgstr "Променено на"
-
-msgctxt "field:purchase.line-account.invoice.line,write_uid:"
-msgid "Write User"
-msgstr "Променено от"
-
 msgctxt "field:purchase.line-account.tax,create_date:"
 msgid "Create Date"
 msgstr "Създадено на"
@@ -723,10 +690,6 @@ msgctxt "field:stock.move,purchase_exception_state:"
 msgid "Exception State"
 msgstr "Състояние на грешка"
 
-msgctxt "field:stock.move,purchase_line:"
-msgid "Purchase Line"
-msgstr "Ред от покупка"
-
 msgctxt "field:stock.move,purchase_quantity:"
 msgid "Purchase Quantity"
 msgstr "Количество на покупка"
@@ -791,18 +754,6 @@ msgctxt "model:ir.action,name:act_purchase_form2"
 msgid "Purchases"
 msgstr "Покупки"
 
-msgctxt "model:ir.action,name:act_purchase_form_confirmed"
-msgid "Confirmed Purchases"
-msgstr "Потвърдена покупка"
-
-msgctxt "model:ir.action,name:act_purchase_form_draft"
-msgid "Draft Purchases"
-msgstr "Проект на покупки"
-
-msgctxt "model:ir.action,name:act_purchase_form_quotation"
-msgid "Purchases in Quotation"
-msgstr "Покупки в запитване"
-
 #, fuzzy
 msgctxt "model:ir.action,name:act_return_form"
 msgid "Returns"
@@ -824,6 +775,28 @@ msgctxt "model:ir.action,name:wizard_shipment_handle_exception"
 msgid "Handle Shipment Exception"
 msgstr "Обработка на грешка при изпращане"
 
+msgctxt "model:ir.action.act_window.domain,name:act_purchase_form_domain_all"
+msgid "All"
+msgstr ""
+
+#, fuzzy
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_purchase_form_domain_confirmed"
+msgid "Confirmed"
+msgstr "Потвърден"
+
+#, fuzzy
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_purchase_form_domain_draft"
+msgid "Draft"
+msgstr "Проект"
+
+#, fuzzy
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_purchase_form_domain_quotation"
+msgid "Quotation"
+msgstr "Запитване"
+
 msgctxt "model:ir.sequence,name:sequence_purchase"
 msgid "Purchase"
 msgstr "Покупка"
@@ -848,18 +821,6 @@ msgctxt "model:ir.ui.menu,name:menu_purchase_form"
 msgid "Purchases"
 msgstr "Покупки"
 
-msgctxt "model:ir.ui.menu,name:menu_purchase_form_confirmed"
-msgid "Confirmed Purchases"
-msgstr "Потвърдена покупка"
-
-msgctxt "model:ir.ui.menu,name:menu_purchase_form_draft"
-msgid "Draft Purchases"
-msgstr "Проект на покупки"
-
-msgctxt "model:ir.ui.menu,name:menu_purchase_form_quotation"
-msgid "Purchases in Quotation"
-msgstr "Покупки в запитване"
-
 msgctxt "model:ir.ui.menu,name:menu_reporting"
 msgid "Reporting"
 msgstr "Справки"
@@ -884,10 +845,6 @@ msgctxt "model:purchase.line,name:"
 msgid "Purchase Line"
 msgstr "Ред от покупка"
 
-msgctxt "model:purchase.line-account.invoice.line,name:"
-msgid "Purchase Line - Invoice Line"
-msgstr "Ред от покупка - Ред от фактура"
-
 msgctxt "model:purchase.line-account.tax,name:"
 msgid "Purchase Line - Tax"
 msgstr "Ред от покупка - Данък"
@@ -1121,10 +1078,6 @@ msgid "Products"
 msgstr "Продукти"
 
 msgctxt "view:product.template:"
-msgid "Product Suppliers"
-msgstr "Доставчици на продукт"
-
-msgctxt "view:product.template:"
 msgid "Suppliers"
 msgstr "Доставчици"
 
@@ -1145,17 +1098,9 @@ msgid "Choose move to recreate"
 msgstr "Избор на движение за ново създаване"
 
 msgctxt "view:purchase.handle.shipment.exception.ask:"
-msgid "Choose moves to recreate"
-msgstr "Избор на движения за ново създаване"
-
-msgctxt "view:purchase.handle.shipment.exception.ask:"
 msgid "Handle shipment Exception"
 msgstr "Обработване на грешка при изпращане"
 
-msgctxt "view:purchase.handle.shipment.exception.ask:"
-msgid "Recreated Moves"
-msgstr "Наново създаване на движения"
-
 msgctxt "view:purchase.line:"
 msgid "General"
 msgstr "Основен"
@@ -1169,10 +1114,6 @@ msgid "Notes"
 msgstr "Бележки"
 
 msgctxt "view:purchase.line:"
-msgid "Products"
-msgstr "Продукти"
-
-msgctxt "view:purchase.line:"
 msgid "Purchase Line"
 msgstr "Ред от покупка"
 
@@ -1221,14 +1162,6 @@ msgid "Invoices"
 msgstr "Фактури"
 
 msgctxt "view:purchase.purchase:"
-msgid "Lines"
-msgstr "Редове"
-
-msgctxt "view:purchase.purchase:"
-msgid "Moves"
-msgstr "Движения"
-
-msgctxt "view:purchase.purchase:"
 msgid "Other Info"
 msgstr "Друга информация"
 
@@ -1241,10 +1174,6 @@ msgid "Purchases"
 msgstr "Покупки"
 
 msgctxt "view:purchase.purchase:"
-msgid "Quotation"
-msgstr "Запитване"
-
-msgctxt "view:purchase.purchase:"
 msgid "Quote"
 msgstr "Запитване"
 
diff --git a/locale/ca_ES.po b/locale/ca_ES.po
index 50e8e20..4630c52 100644
--- a/locale/ca_ES.po
+++ b/locale/ca_ES.po
@@ -3,54 +3,64 @@ msgid ""
 msgstr "Content-Type: text/plain; charset=utf-8\n"
 
 msgctxt "error:account.invoice:"
-msgid "You can not delete invoices that come from a purchase!"
-msgstr "No pot esborrar factures que vénen d'una compra."
+msgid "You can not delete invoices that come from a purchase."
+msgstr "No podeu esborrar factures generades des d'una compra."
 
 msgctxt "error:account.invoice:"
 msgid "You cannot reset to draft an invoice generated by a purchase."
-msgstr "No pot canviar a esborrany una factura generada per una compra."
+msgstr "No podeu restaurar a esborrany una factura generada per una compra."
 
 msgctxt "error:product.template:"
 msgid ""
 "Purchase prices are based on the purchase uom, are you sure to change it?"
-msgstr ""
-"Els preus de compra estan basats en la UdM de compra, desitja canviar-ho?"
+msgstr "Els preus de compra estan basats en la UdM de compra. Vol canviar-ho?"
 
 msgctxt "error:purchase.line:"
-msgid "It misses an \"Account Expense\" on product \"%s\"!"
-msgstr "Fa falta un \"Compte de despeses\" del producte \"%s\"."
+msgid ""
+"Product \"%(product)s\" of purchase %(purchase)s misses an expense account."
+msgstr ""
+"Falta el compte a pagar del producte \"%(product)s\" de la compra "
+"%(purchase)s."
 
 msgctxt "error:purchase.line:"
-msgid "It misses an \"account expense\" default property!"
-msgstr "Fa falta la propietat predeterminada de \"Compte de despeses\"."
+msgid "Purchase \"%(purchase)s\" misses an \"account expense\" default property."
+msgstr ""
+"Falta la propietat \"compte a pagar\" per defecte de la compra "
+"\"%(purchase)s\"."
 
 msgctxt "error:purchase.line:"
-msgid "The supplier location is required!"
-msgstr "Es necessita la ubicació del proveïdor."
+msgid "Purchase \"%(purchase)s\" misses the supplier location for line \"%(line)s\"."
+msgstr ""
+"Falta la localització del proveïdor per a la línia \"%(line)s\" de la compra"
+" \"%(purchase)s\"."
 
 msgctxt "error:purchase.purchase:"
-msgid "A warehouse must be defined for the quotation."
-msgstr "Ha d'indicar un magatzem en el pressupost."
+msgid "A warehouse must be defined for quotation of sale \"%s\"."
+msgstr "S'ha de definir un magatzem pel pressupost de la venda \"%s\"."
 
 msgctxt "error:purchase.purchase:"
-msgid "Invoice addresses must be defined for the quotation."
-msgstr "Ha de definir les adreces de facturació."
+msgid "Invoice address must be defined for quotation of sale \"%s\"."
+msgstr "S'ha de definir una adreça de facturació pel pressupost de venda \"%s\"."
 
 msgctxt "error:purchase.purchase:"
-msgid "It misses an \"Account Payable\" on the party \"%s\"!"
-msgstr "Al tercer \"%s\" li fa falta un \"Compte de pagaments\"."
+msgid "Missing \"Account Payable\" on party \"%s\"."
+msgstr "No es troba el \"Compte a pagar\" del tercer \"%s\"."
 
 msgctxt "error:purchase.purchase:"
-msgid "Purchase \"%s\" must be cancelled before deletion!"
-msgstr "Al tercer \"%s\" li falta un \"Compte a pagar\"."
+msgid "Purchase \"%s\" must be cancelled before deletion."
+msgstr "Heu de cancel·lar la compra \"%s\" abans de ser eliminat."
 
 msgctxt "error:stock.shipment.in.return:"
 msgid "You cannot reset to draft a move generated by a purchase."
-msgstr "No pot restablir a esborrany un moviment generat per una compra."
+msgstr "No podeu restaurar a esborrany un moviment generat per una compra."
 
 msgctxt "error:stock.shipment.in:"
-msgid "You cannot reset to draft a move generated by a purchase."
-msgstr "No pot restablir a esborrany un moviment generat per una compra."
+msgid ""
+"You cannot reset to draft move \"%s\" because it was generated by a "
+"purchase."
+msgstr ""
+"No podeu restaurar a esborrany el moviment \"%s\" perquè s'ha generat per "
+"una compra."
 
 msgctxt "field:account.invoice,purchase_exception_state:"
 msgid "Exception State"
@@ -60,17 +70,13 @@ msgctxt "field:account.invoice,purchases:"
 msgid "Purchases"
 msgstr "Compres"
 
-msgctxt "field:account.invoice.line,purchase_lines:"
-msgid "Purchase Lines"
-msgstr "Línies de compra"
-
 msgctxt "field:product.template,product_suppliers:"
 msgid "Suppliers"
 msgstr "Proveïdors"
 
 msgctxt "field:product.template,purchasable:"
 msgid "Purchasable"
-msgstr "Es pot comprar"
+msgstr "Pot ser comprat"
 
 msgctxt "field:product.template,purchase_uom:"
 msgid "Purchase UOM"
@@ -94,7 +100,7 @@ msgstr "Mètode de facturació"
 
 msgctxt "field:purchase.configuration,purchase_sequence:"
 msgid "Purchase Reference Sequence"
-msgstr "Seqüència comanda de compra"
+msgstr "Seqüència de comanda de compra"
 
 msgctxt "field:purchase.configuration,rec_name:"
 msgid "Name"
@@ -244,38 +250,6 @@ msgctxt "field:purchase.line,write_uid:"
 msgid "Write User"
 msgstr "Usuari modificació"
 
-msgctxt "field:purchase.line-account.invoice.line,create_date:"
-msgid "Create Date"
-msgstr "Data creació"
-
-msgctxt "field:purchase.line-account.invoice.line,create_uid:"
-msgid "Create User"
-msgstr "Usuari creació"
-
-msgctxt "field:purchase.line-account.invoice.line,id:"
-msgid "ID"
-msgstr "ID"
-
-msgctxt "field:purchase.line-account.invoice.line,invoice_line:"
-msgid "Invoice Line"
-msgstr "Línia de factura"
-
-msgctxt "field:purchase.line-account.invoice.line,purchase_line:"
-msgid "Purchase Line"
-msgstr "Línia de compra"
-
-msgctxt "field:purchase.line-account.invoice.line,rec_name:"
-msgid "Name"
-msgstr "Nom"
-
-msgctxt "field:purchase.line-account.invoice.line,write_date:"
-msgid "Write Date"
-msgstr "Data modificació"
-
-msgctxt "field:purchase.line-account.invoice.line,write_uid:"
-msgid "Write User"
-msgstr "Usuari modificació"
-
 msgctxt "field:purchase.line-account.tax,create_date:"
 msgid "Create Date"
 msgstr "Data creació"
@@ -720,10 +694,6 @@ msgctxt "field:stock.move,purchase_exception_state:"
 msgid "Exception State"
 msgstr "Estat excepció"
 
-msgctxt "field:stock.move,purchase_line:"
-msgid "Purchase Line"
-msgstr "Línia de compra"
-
 msgctxt "field:stock.move,purchase_quantity:"
 msgid "Purchase Quantity"
 msgstr "Quantitat de compra"
@@ -771,11 +741,11 @@ msgstr "Factures"
 
 msgctxt "model:ir.action,name:act_open_supplier"
 msgid "Parties associated to Purchases"
-msgstr "Tercers associats amb compres"
+msgstr "Tercers amb compres"
 
 msgctxt "model:ir.action,name:act_purchase_configuration_form"
 msgid "Purchase Configuration"
-msgstr "Configuració compres"
+msgstr "Configuració de les compres"
 
 msgctxt "model:ir.action,name:act_purchase_form"
 msgid "Purchases"
@@ -785,18 +755,6 @@ msgctxt "model:ir.action,name:act_purchase_form2"
 msgid "Purchases"
 msgstr "Compres"
 
-msgctxt "model:ir.action,name:act_purchase_form_confirmed"
-msgid "Confirmed Purchases"
-msgstr "Compres confirmades"
-
-msgctxt "model:ir.action,name:act_purchase_form_draft"
-msgid "Draft Purchases"
-msgstr "Compres en esborrany"
-
-msgctxt "model:ir.action,name:act_purchase_form_quotation"
-msgid "Purchases in Quotation"
-msgstr "Compres en pressupost"
-
 msgctxt "model:ir.action,name:act_return_form"
 msgid "Returns"
 msgstr "Retorna"
@@ -817,6 +775,25 @@ msgctxt "model:ir.action,name:wizard_shipment_handle_exception"
 msgid "Handle Shipment Exception"
 msgstr "Gestionar excepció d'enviament"
 
+msgctxt "model:ir.action.act_window.domain,name:act_purchase_form_domain_all"
+msgid "All"
+msgstr "Tot"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_purchase_form_domain_confirmed"
+msgid "Confirmed"
+msgstr "Confirmat"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_purchase_form_domain_draft"
+msgid "Draft"
+msgstr "Esborrany"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_purchase_form_domain_quotation"
+msgid "Quotation"
+msgstr "Pressupost"
+
 msgctxt "model:ir.sequence,name:sequence_purchase"
 msgid "Purchase"
 msgstr "Compra"
@@ -835,35 +812,23 @@ msgstr "Compres"
 
 msgctxt "model:ir.ui.menu,name:menu_purchase_configuration"
 msgid "Purchase Configuration"
-msgstr "Configuració compres"
+msgstr "Compres"
 
 msgctxt "model:ir.ui.menu,name:menu_purchase_form"
 msgid "Purchases"
 msgstr "Compres"
 
-msgctxt "model:ir.ui.menu,name:menu_purchase_form_confirmed"
-msgid "Confirmed Purchases"
-msgstr "Confirmades"
-
-msgctxt "model:ir.ui.menu,name:menu_purchase_form_draft"
-msgid "Draft Purchases"
-msgstr "Esborrany"
-
-msgctxt "model:ir.ui.menu,name:menu_purchase_form_quotation"
-msgid "Purchases in Quotation"
-msgstr "Pressupost"
-
 msgctxt "model:ir.ui.menu,name:menu_reporting"
 msgid "Reporting"
 msgstr "Informes"
 
 msgctxt "model:ir.ui.menu,name:menu_supplier"
 msgid "Parties associated to Purchases"
-msgstr "Tercers associats amb compres"
+msgstr "Tercers amb compres"
 
 msgctxt "model:purchase.configuration,name:"
 msgid "Purchase Configuration"
-msgstr "Configuració compres"
+msgstr "Configuració de les compres"
 
 msgctxt "model:purchase.handle.invoice.exception.ask,name:"
 msgid "Handle Invoice Exception"
@@ -877,10 +842,6 @@ msgctxt "model:purchase.line,name:"
 msgid "Purchase Line"
 msgstr "Línia de compra"
 
-msgctxt "model:purchase.line-account.invoice.line,name:"
-msgid "Purchase Line - Invoice Line"
-msgstr "Línia de compra - Línia de factura"
-
 msgctxt "model:purchase.line-account.tax,name:"
 msgid "Purchase Line - Tax"
 msgstr "Línia de compra - Impost"
@@ -993,10 +954,9 @@ msgctxt "odt:purchase.purchase:"
 msgid "VAT:"
 msgstr "IVA:"
 
-#, fuzzy
 msgctxt "selection:account.invoice,purchase_exception_state:"
 msgid ""
-msgstr "Servidor"
+msgstr " "
 
 msgctxt "selection:account.invoice,purchase_exception_state:"
 msgid "Ignored"
@@ -1098,10 +1058,9 @@ msgctxt "selection:purchase.purchase,state:"
 msgid "Quotation"
 msgstr "Pressupost"
 
-#, fuzzy
 msgctxt "selection:stock.move,purchase_exception_state:"
 msgid ""
-msgstr "Servidor"
+msgstr " "
 
 msgctxt "selection:stock.move,purchase_exception_state:"
 msgid "Ignored"
@@ -1115,21 +1074,13 @@ msgctxt "view:product.product:"
 msgid "Products"
 msgstr "Productes"
 
-msgctxt "view:product.product:"
-msgid "Suppliers"
-msgstr "Proveïdors"
-
-msgctxt "view:product.template:"
-msgid "Product Suppliers"
-msgstr "Proveïdors de productes"
-
 msgctxt "view:product.template:"
 msgid "Suppliers"
 msgstr "Proveïdors"
 
 msgctxt "view:purchase.configuration:"
 msgid "Purchase Configuration"
-msgstr "Configuració compres"
+msgstr "Configuració de les compres"
 
 msgctxt "view:purchase.handle.invoice.exception.ask:"
 msgid "Choose invoices to recreate"
@@ -1144,17 +1095,9 @@ msgid "Choose move to recreate"
 msgstr "Esculli un moviment a refer"
 
 msgctxt "view:purchase.handle.shipment.exception.ask:"
-msgid "Choose moves to recreate"
-msgstr "Triar moviments a recrear"
-
-msgctxt "view:purchase.handle.shipment.exception.ask:"
 msgid "Handle shipment Exception"
 msgstr "Gestiona excepcions d'enviament"
 
-msgctxt "view:purchase.handle.shipment.exception.ask:"
-msgid "Recreated Moves"
-msgstr "Refer moviments"
-
 msgctxt "view:purchase.line:"
 msgid "General"
 msgstr "General"
@@ -1168,10 +1111,6 @@ msgid "Notes"
 msgstr "Notes"
 
 msgctxt "view:purchase.line:"
-msgid "Products"
-msgstr "Productes"
-
-msgctxt "view:purchase.line:"
 msgid "Purchase Line"
 msgstr "Línia de compra"
 
@@ -1220,14 +1159,6 @@ msgid "Invoices"
 msgstr "Factures"
 
 msgctxt "view:purchase.purchase:"
-msgid "Lines"
-msgstr "Línies"
-
-msgctxt "view:purchase.purchase:"
-msgid "Moves"
-msgstr "Moviments"
-
-msgctxt "view:purchase.purchase:"
 msgid "Other Info"
 msgstr "Informació addicional"
 
@@ -1240,10 +1171,6 @@ msgid "Purchases"
 msgstr "Compres"
 
 msgctxt "view:purchase.purchase:"
-msgid "Quotation"
-msgstr "Pressupost"
-
-msgctxt "view:purchase.purchase:"
 msgid "Quote"
 msgstr "Pressupost"
 
diff --git a/locale/cs_CZ.po b/locale/cs_CZ.po
index 591270b..0bfa52d 100644
--- a/locale/cs_CZ.po
+++ b/locale/cs_CZ.po
@@ -3,7 +3,7 @@ msgid ""
 msgstr "Content-Type: text/plain; charset=utf-8\n"
 
 msgctxt "error:account.invoice:"
-msgid "You can not delete invoices that come from a purchase!"
+msgid "You can not delete invoices that come from a purchase."
 msgstr ""
 
 msgctxt "error:account.invoice:"
@@ -16,31 +16,32 @@ msgid ""
 msgstr ""
 
 msgctxt "error:purchase.line:"
-msgid "It misses an \"Account Expense\" on product \"%s\"!"
+msgid ""
+"Product \"%(product)s\" of purchase %(purchase)s misses an expense account."
 msgstr ""
 
 msgctxt "error:purchase.line:"
-msgid "It misses an \"account expense\" default property!"
+msgid "Purchase \"%(purchase)s\" misses an \"account expense\" default property."
 msgstr ""
 
 msgctxt "error:purchase.line:"
-msgid "The supplier location is required!"
+msgid "Purchase \"%(purchase)s\" misses the supplier location for line \"%(line)s\"."
 msgstr ""
 
 msgctxt "error:purchase.purchase:"
-msgid "A warehouse must be defined for the quotation."
+msgid "A warehouse must be defined for quotation of sale \"%s\"."
 msgstr ""
 
 msgctxt "error:purchase.purchase:"
-msgid "Invoice addresses must be defined for the quotation."
+msgid "Invoice address must be defined for quotation of sale \"%s\"."
 msgstr ""
 
 msgctxt "error:purchase.purchase:"
-msgid "It misses an \"Account Payable\" on the party \"%s\"!"
+msgid "Missing \"Account Payable\" on party \"%s\"."
 msgstr ""
 
 msgctxt "error:purchase.purchase:"
-msgid "Purchase \"%s\" must be cancelled before deletion!"
+msgid "Purchase \"%s\" must be cancelled before deletion."
 msgstr ""
 
 msgctxt "error:stock.shipment.in.return:"
@@ -48,7 +49,9 @@ msgid "You cannot reset to draft a move generated by a purchase."
 msgstr ""
 
 msgctxt "error:stock.shipment.in:"
-msgid "You cannot reset to draft a move generated by a purchase."
+msgid ""
+"You cannot reset to draft move \"%s\" because it was generated by a "
+"purchase."
 msgstr ""
 
 msgctxt "field:account.invoice,purchase_exception_state:"
@@ -59,10 +62,6 @@ msgctxt "field:account.invoice,purchases:"
 msgid "Purchases"
 msgstr ""
 
-msgctxt "field:account.invoice.line,purchase_lines:"
-msgid "Purchase Lines"
-msgstr ""
-
 msgctxt "field:product.template,product_suppliers:"
 msgid "Suppliers"
 msgstr ""
@@ -243,38 +242,6 @@ msgctxt "field:purchase.line,write_uid:"
 msgid "Write User"
 msgstr ""
 
-msgctxt "field:purchase.line-account.invoice.line,create_date:"
-msgid "Create Date"
-msgstr ""
-
-msgctxt "field:purchase.line-account.invoice.line,create_uid:"
-msgid "Create User"
-msgstr ""
-
-msgctxt "field:purchase.line-account.invoice.line,id:"
-msgid "ID"
-msgstr ""
-
-msgctxt "field:purchase.line-account.invoice.line,invoice_line:"
-msgid "Invoice Line"
-msgstr ""
-
-msgctxt "field:purchase.line-account.invoice.line,purchase_line:"
-msgid "Purchase Line"
-msgstr ""
-
-msgctxt "field:purchase.line-account.invoice.line,rec_name:"
-msgid "Name"
-msgstr ""
-
-msgctxt "field:purchase.line-account.invoice.line,write_date:"
-msgid "Write Date"
-msgstr ""
-
-msgctxt "field:purchase.line-account.invoice.line,write_uid:"
-msgid "Write User"
-msgstr ""
-
 msgctxt "field:purchase.line-account.tax,create_date:"
 msgid "Create Date"
 msgstr ""
@@ -719,10 +686,6 @@ msgctxt "field:stock.move,purchase_exception_state:"
 msgid "Exception State"
 msgstr ""
 
-msgctxt "field:stock.move,purchase_line:"
-msgid "Purchase Line"
-msgstr ""
-
 msgctxt "field:stock.move,purchase_quantity:"
 msgid "Purchase Quantity"
 msgstr ""
@@ -784,18 +747,6 @@ msgctxt "model:ir.action,name:act_purchase_form2"
 msgid "Purchases"
 msgstr ""
 
-msgctxt "model:ir.action,name:act_purchase_form_confirmed"
-msgid "Confirmed Purchases"
-msgstr ""
-
-msgctxt "model:ir.action,name:act_purchase_form_draft"
-msgid "Draft Purchases"
-msgstr ""
-
-msgctxt "model:ir.action,name:act_purchase_form_quotation"
-msgid "Purchases in Quotation"
-msgstr ""
-
 msgctxt "model:ir.action,name:act_return_form"
 msgid "Returns"
 msgstr ""
@@ -816,6 +767,25 @@ msgctxt "model:ir.action,name:wizard_shipment_handle_exception"
 msgid "Handle Shipment Exception"
 msgstr ""
 
+msgctxt "model:ir.action.act_window.domain,name:act_purchase_form_domain_all"
+msgid "All"
+msgstr ""
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_purchase_form_domain_confirmed"
+msgid "Confirmed"
+msgstr ""
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_purchase_form_domain_draft"
+msgid "Draft"
+msgstr ""
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_purchase_form_domain_quotation"
+msgid "Quotation"
+msgstr ""
+
 msgctxt "model:ir.sequence,name:sequence_purchase"
 msgid "Purchase"
 msgstr ""
@@ -840,18 +810,6 @@ msgctxt "model:ir.ui.menu,name:menu_purchase_form"
 msgid "Purchases"
 msgstr ""
 
-msgctxt "model:ir.ui.menu,name:menu_purchase_form_confirmed"
-msgid "Confirmed Purchases"
-msgstr ""
-
-msgctxt "model:ir.ui.menu,name:menu_purchase_form_draft"
-msgid "Draft Purchases"
-msgstr ""
-
-msgctxt "model:ir.ui.menu,name:menu_purchase_form_quotation"
-msgid "Purchases in Quotation"
-msgstr ""
-
 msgctxt "model:ir.ui.menu,name:menu_reporting"
 msgid "Reporting"
 msgstr ""
@@ -876,10 +834,6 @@ msgctxt "model:purchase.line,name:"
 msgid "Purchase Line"
 msgstr ""
 
-msgctxt "model:purchase.line-account.invoice.line,name:"
-msgid "Purchase Line - Invoice Line"
-msgstr ""
-
 msgctxt "model:purchase.line-account.tax,name:"
 msgid "Purchase Line - Tax"
 msgstr ""
@@ -1113,10 +1067,6 @@ msgid "Products"
 msgstr ""
 
 msgctxt "view:product.template:"
-msgid "Product Suppliers"
-msgstr ""
-
-msgctxt "view:product.template:"
 msgid "Suppliers"
 msgstr ""
 
@@ -1140,10 +1090,6 @@ msgctxt "view:purchase.handle.shipment.exception.ask:"
 msgid "Handle shipment Exception"
 msgstr ""
 
-msgctxt "view:purchase.handle.shipment.exception.ask:"
-msgid "Recreated Moves"
-msgstr ""
-
 msgctxt "view:purchase.line:"
 msgid "General"
 msgstr ""
@@ -1157,10 +1103,6 @@ msgid "Notes"
 msgstr ""
 
 msgctxt "view:purchase.line:"
-msgid "Products"
-msgstr ""
-
-msgctxt "view:purchase.line:"
 msgid "Purchase Line"
 msgstr ""
 
@@ -1209,14 +1151,6 @@ msgid "Invoices"
 msgstr ""
 
 msgctxt "view:purchase.purchase:"
-msgid "Lines"
-msgstr ""
-
-msgctxt "view:purchase.purchase:"
-msgid "Moves"
-msgstr ""
-
-msgctxt "view:purchase.purchase:"
 msgid "Other Info"
 msgstr ""
 
@@ -1229,10 +1163,6 @@ msgid "Purchases"
 msgstr ""
 
 msgctxt "view:purchase.purchase:"
-msgid "Quotation"
-msgstr ""
-
-msgctxt "view:purchase.purchase:"
 msgid "Quote"
 msgstr ""
 
diff --git a/locale/de_DE.po b/locale/de_DE.po
index 8dd4b88..7d7b74c 100644
--- a/locale/de_DE.po
+++ b/locale/de_DE.po
@@ -3,9 +3,8 @@ msgid ""
 msgstr "Content-Type: text/plain; charset=utf-8\n"
 
 msgctxt "error:account.invoice:"
-msgid "You can not delete invoices that come from a purchase!"
-msgstr ""
-"Durch einen Einkauf generierte Rechnungen können nicht gelöscht werden!"
+msgid "You can not delete invoices that come from a purchase."
+msgstr "Aus einem Einkauf stammende Rechnungen können nicht gelöscht werden."
 
 msgctxt "error:account.invoice:"
 msgid "You cannot reset to draft an invoice generated by a purchase."
@@ -21,31 +20,40 @@ msgstr ""
 "Soll sie wirklich geändert werden?"
 
 msgctxt "error:purchase.line:"
-msgid "It misses an \"Account Expense\" on product \"%s\"!"
-msgstr "Es ist ken Aufwandskonto für Artikel \"%s\" definiert!"
+msgid ""
+"Product \"%(product)s\" of purchase %(purchase)s misses an expense account."
+msgstr ""
+"Für Artikel \"%(product)s\" in Einkauf %(purchase)s ist kein Aufwandskonto "
+"eingetragen."
 
 msgctxt "error:purchase.line:"
-msgid "It misses an \"account expense\" default property!"
-msgstr "Es ist keine Standardeigenschaft für das Aufwandskonto definiert!"
+msgid "Purchase \"%(purchase)s\" misses an \"account expense\" default property."
+msgstr ""
+"Für Einkauf \"%(purchase)s\" ist keine Standardeigenschaft für das "
+"Aufwandskonto eingetragen."
 
 msgctxt "error:purchase.line:"
-msgid "The supplier location is required!"
-msgstr "Der Lagerort des Lieferanten muss eingegeben werden!"
+msgid "Purchase \"%(purchase)s\" misses the supplier location for line \"%(line)s\"."
+msgstr ""
+"Für Einkauf \"%(purchase)s\" Position \"%(line)s\" ist kein Lagerort "
+"Lieferant eingetragen."
 
 msgctxt "error:purchase.purchase:"
-msgid "A warehouse must be defined for the quotation."
-msgstr "Für eine Angebotsanfrage muss ein Warenlager angegeben werden"
+msgid "A warehouse must be defined for quotation of sale \"%s\"."
+msgstr "Für Angebot von Verkauf \"%s\" muss ein Warenlager angegeben werden."
 
 msgctxt "error:purchase.purchase:"
-msgid "Invoice addresses must be defined for the quotation."
-msgstr "Die Rechnungsadresse muss für ein Angebot angegeben werden."
+msgid "Invoice address must be defined for quotation of sale \"%s\"."
+msgstr ""
+"Rechnungsadresse muss angegeben werden für Angebotsanfrage von Einkauf "
+"\"%s\"."
 
 msgctxt "error:purchase.purchase:"
-msgid "It misses an \"Account Payable\" on the party \"%s\"!"
-msgstr "Es ist kein Verbindlichkeitskonto für Partei \"%s\" definiert!"
+msgid "Missing \"Account Payable\" on party \"%s\"."
+msgstr "Fehlendes \"Verbindlichkeitskonto\" für Partei \"%s\"."
 
 msgctxt "error:purchase.purchase:"
-msgid "Purchase \"%s\" must be cancelled before deletion!"
+msgid "Purchase \"%s\" must be cancelled before deletion."
 msgstr "Einkauf \"%s\" muss annulliert werden, bevor er gelöscht werden kann."
 
 msgctxt "error:stock.shipment.in.return:"
@@ -55,10 +63,12 @@ msgstr ""
 "zurückgesetzt werden."
 
 msgctxt "error:stock.shipment.in:"
-msgid "You cannot reset to draft a move generated by a purchase."
+msgid ""
+"You cannot reset to draft move \"%s\" because it was generated by a "
+"purchase."
 msgstr ""
-"Eine durch einen Einkauf generierte Bewegung kann nicht auf Entwurf "
-"zurückgesetzt werden."
+"Bewegung \"%s\" kann nicht auf Status \"Entwurf\" gesetzt werden, weil sie "
+"durch einen Einkauf erzeugt wurde."
 
 msgctxt "field:account.invoice,purchase_exception_state:"
 msgid "Exception State"
@@ -68,10 +78,6 @@ msgctxt "field:account.invoice,purchases:"
 msgid "Purchases"
 msgstr "Einkäufe"
 
-msgctxt "field:account.invoice.line,purchase_lines:"
-msgid "Purchase Lines"
-msgstr "Positionen Einkauf"
-
 msgctxt "field:product.template,product_suppliers:"
 msgid "Suppliers"
 msgstr "Lieferanten"
@@ -252,38 +258,6 @@ msgctxt "field:purchase.line,write_uid:"
 msgid "Write User"
 msgstr "Letzte Änderung durch"
 
-msgctxt "field:purchase.line-account.invoice.line,create_date:"
-msgid "Create Date"
-msgstr "Erstellungsdatum"
-
-msgctxt "field:purchase.line-account.invoice.line,create_uid:"
-msgid "Create User"
-msgstr "Erstellt durch"
-
-msgctxt "field:purchase.line-account.invoice.line,id:"
-msgid "ID"
-msgstr "ID"
-
-msgctxt "field:purchase.line-account.invoice.line,invoice_line:"
-msgid "Invoice Line"
-msgstr "Rechnungsposition"
-
-msgctxt "field:purchase.line-account.invoice.line,purchase_line:"
-msgid "Purchase Line"
-msgstr "Position Einkauf"
-
-msgctxt "field:purchase.line-account.invoice.line,rec_name:"
-msgid "Name"
-msgstr "Name"
-
-msgctxt "field:purchase.line-account.invoice.line,write_date:"
-msgid "Write Date"
-msgstr "Zuletzt geändert"
-
-msgctxt "field:purchase.line-account.invoice.line,write_uid:"
-msgid "Write User"
-msgstr "Letzte Änderung durch"
-
 msgctxt "field:purchase.line-account.tax,create_date:"
 msgid "Create Date"
 msgstr "Erstellungsdatum"
@@ -728,10 +702,6 @@ msgctxt "field:stock.move,purchase_exception_state:"
 msgid "Exception State"
 msgstr "Status Vorbehalt"
 
-msgctxt "field:stock.move,purchase_line:"
-msgid "Purchase Line"
-msgstr "Position Einkauf"
-
 msgctxt "field:stock.move,purchase_quantity:"
 msgid "Purchase Quantity"
 msgstr "Anzahl Einkauf"
@@ -779,7 +749,7 @@ msgstr "Minimale Anzahl"
 
 msgctxt "model:ir.action,name:act_invoice_form"
 msgid "Invoices"
-msgstr "Rechnungseingang"
+msgstr "Rechnungsausgang"
 
 msgctxt "model:ir.action,name:act_open_supplier"
 msgid "Parties associated to Purchases"
@@ -797,18 +767,6 @@ msgctxt "model:ir.action,name:act_purchase_form2"
 msgid "Purchases"
 msgstr "Einkäufe"
 
-msgctxt "model:ir.action,name:act_purchase_form_confirmed"
-msgid "Confirmed Purchases"
-msgstr "Aufträge Einkäufe"
-
-msgctxt "model:ir.action,name:act_purchase_form_draft"
-msgid "Draft Purchases"
-msgstr "Entwürfe Einkäufe"
-
-msgctxt "model:ir.action,name:act_purchase_form_quotation"
-msgid "Purchases in Quotation"
-msgstr "Angebote Einkäufe"
-
 msgctxt "model:ir.action,name:act_return_form"
 msgid "Returns"
 msgstr "Rückgaben"
@@ -827,7 +785,26 @@ msgstr "Rechnungsvorbehalt bearbeiten"
 
 msgctxt "model:ir.action,name:wizard_shipment_handle_exception"
 msgid "Handle Shipment Exception"
-msgstr "Liefervorbehalt bearbeiten"
+msgstr "Nachfrage Liefervorbehalt"
+
+msgctxt "model:ir.action.act_window.domain,name:act_purchase_form_domain_all"
+msgid "All"
+msgstr "Alle"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_purchase_form_domain_confirmed"
+msgid "Confirmed"
+msgstr "Bestätigt"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_purchase_form_domain_draft"
+msgid "Draft"
+msgstr "Entwurf"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_purchase_form_domain_quotation"
+msgid "Quotation"
+msgstr "Angebot"
 
 msgctxt "model:ir.sequence,name:sequence_purchase"
 msgid "Purchase"
@@ -847,24 +824,12 @@ msgstr "Einkauf"
 
 msgctxt "model:ir.ui.menu,name:menu_purchase_configuration"
 msgid "Purchase Configuration"
-msgstr "Einstellungen Einkauf"
+msgstr "Einkauf"
 
 msgctxt "model:ir.ui.menu,name:menu_purchase_form"
 msgid "Purchases"
 msgstr "Einkäufe"
 
-msgctxt "model:ir.ui.menu,name:menu_purchase_form_confirmed"
-msgid "Confirmed Purchases"
-msgstr "Aufträge (Einkäufe)"
-
-msgctxt "model:ir.ui.menu,name:menu_purchase_form_draft"
-msgid "Draft Purchases"
-msgstr "Entwürfe (Einkäufe)"
-
-msgctxt "model:ir.ui.menu,name:menu_purchase_form_quotation"
-msgid "Purchases in Quotation"
-msgstr "Angebote (Einkäufe)"
-
 msgctxt "model:ir.ui.menu,name:menu_reporting"
 msgid "Reporting"
 msgstr "Auswertungen"
@@ -889,10 +854,6 @@ msgctxt "model:purchase.line,name:"
 msgid "Purchase Line"
 msgstr "Einkauf Position"
 
-msgctxt "model:purchase.line-account.invoice.line,name:"
-msgid "Purchase Line - Invoice Line"
-msgstr "Position Einkauf - Rechnungsposition"
-
 msgctxt "model:purchase.line-account.tax,name:"
 msgid "Purchase Line - Tax"
 msgstr "Position Einkauf - Steuer"
@@ -1122,21 +1083,9 @@ msgid "Recreated"
 msgstr "Nachgebildet"
 
 msgctxt "view:product.product:"
-msgid "Product Suppliers"
-msgstr "Lieferanten"
-
-msgctxt "view:product.product:"
 msgid "Products"
 msgstr "Artikel"
 
-msgctxt "view:product.product:"
-msgid "Suppliers"
-msgstr "Lieferanten"
-
-msgctxt "view:product.template:"
-msgid "Product Suppliers"
-msgstr "Lieferanten"
-
 msgctxt "view:product.template:"
 msgid "Suppliers"
 msgstr "Lieferanten"
@@ -1146,10 +1095,6 @@ msgid "Purchase Configuration"
 msgstr "Einstellungen Einkauf"
 
 msgctxt "view:purchase.handle.invoice.exception.ask:"
-msgid "Choose invoices to duplicate"
-msgstr "Auswahl Rechnungen für Duplizierung"
-
-msgctxt "view:purchase.handle.invoice.exception.ask:"
 msgid "Choose invoices to recreate"
 msgstr "Rechnungen zum Nachbilden auswählen"
 
@@ -1158,29 +1103,13 @@ msgid "Handle Invoice Exception"
 msgstr "Rechnungsvorbehalt bearbeiten"
 
 msgctxt "view:purchase.handle.shipment.exception.ask:"
-msgid "Choose move to duplicate"
-msgstr "Auswahl Bewegungen für Duplizierung"
-
-msgctxt "view:purchase.handle.shipment.exception.ask:"
 msgid "Choose move to recreate"
 msgstr "Bewegungen zum Nachbilden auswählen"
 
 msgctxt "view:purchase.handle.shipment.exception.ask:"
-msgid "Choose moves to recreate"
-msgstr "Auswahl Bewegungen zur Nachbildung"
-
-msgctxt "view:purchase.handle.shipment.exception.ask:"
-msgid "Duplicate Moves"
-msgstr "Bewegungen duplizieren"
-
-msgctxt "view:purchase.handle.shipment.exception.ask:"
 msgid "Handle shipment Exception"
 msgstr "Liefervorbehalt bearbeiten"
 
-msgctxt "view:purchase.handle.shipment.exception.ask:"
-msgid "Recreated Moves"
-msgstr "Nachgebildete Bewegungen"
-
 msgctxt "view:purchase.line:"
 msgid "General"
 msgstr "Allgemein"
@@ -1194,10 +1123,6 @@ msgid "Notes"
 msgstr "Notizen"
 
 msgctxt "view:purchase.line:"
-msgid "Products"
-msgstr "Artikel"
-
-msgctxt "view:purchase.line:"
 msgid "Purchase Line"
 msgstr "Position Einkauf"
 
@@ -1242,22 +1167,10 @@ msgid "Handle Shipment Exception"
 msgstr "Liefervorbehalt bearbeiten"
 
 msgctxt "view:purchase.purchase:"
-msgid "Ignore Invoice Exception"
-msgstr "Rechnungsvorbehalt ignorieren"
-
-msgctxt "view:purchase.purchase:"
 msgid "Invoices"
 msgstr "Rechnungen"
 
 msgctxt "view:purchase.purchase:"
-msgid "Lines"
-msgstr "Positionen"
-
-msgctxt "view:purchase.purchase:"
-msgid "Moves"
-msgstr "Bewegungen"
-
-msgctxt "view:purchase.purchase:"
 msgid "Other Info"
 msgstr "Sonstiges"
 
@@ -1270,10 +1183,6 @@ msgid "Purchases"
 msgstr "Einkäufe"
 
 msgctxt "view:purchase.purchase:"
-msgid "Quotation"
-msgstr "Angebot"
-
-msgctxt "view:purchase.purchase:"
 msgid "Quote"
 msgstr "Angebot"
 
diff --git a/locale/es_AR.po b/locale/es_AR.po
index c50f435..00c6b16 100644
--- a/locale/es_AR.po
+++ b/locale/es_AR.po
@@ -3,12 +3,12 @@ msgid ""
 msgstr "Content-Type: text/plain; charset=utf-8\n"
 
 msgctxt "error:account.invoice:"
-msgid "You can not delete invoices that come from a purchase!"
-msgstr "¡No puede borrar facturas que vienen de una compra!"
+msgid "You can not delete invoices that come from a purchase."
+msgstr "No puede eliminar facturas generadas por compras."
 
 msgctxt "error:account.invoice:"
 msgid "You cannot reset to draft an invoice generated by a purchase."
-msgstr "No puede cambiar a borrador una factura generada por una compra."
+msgstr "No puede restablecer a borrador una factura generada por una compra."
 
 msgctxt "error:product.template:"
 msgid ""
@@ -17,32 +17,40 @@ msgstr ""
 "Los precios de compra están basados en la UdM de compra, ¿desea cambiarlo?"
 
 msgctxt "error:purchase.line:"
-msgid "It misses an \"Account Expense\" on product \"%s\"!"
-msgstr "¡Hace falta una «Cuenta de gasto» del producto «%s»!"
+msgid ""
+"Product \"%(product)s\" of purchase %(purchase)s misses an expense account."
+msgstr ""
+"Falta la cuenta a pagar del producto «%(product)s» de la compra "
+"%(purchase)s."
 
 msgctxt "error:purchase.line:"
-msgid "It misses an \"account expense\" default property!"
-msgstr "¡Hace falta la propiedad predeterminada de «cuenta de gastos»!"
+msgid "Purchase \"%(purchase)s\" misses an \"account expense\" default property."
+msgstr ""
+"Falta la propiedad «Cuenta a pagar» por defecto de la compra «%(purchase)s»."
 
 msgctxt "error:purchase.line:"
-msgid "The supplier location is required!"
-msgstr "¡Se necesita la ubicación del proveedor!"
+msgid "Purchase \"%(purchase)s\" misses the supplier location for line \"%(line)s\"."
+msgstr ""
+"Falta la ubicación del proveedor para la línea «%(line)s» de la compra "
+"«%(purchase)s»."
 
 msgctxt "error:purchase.purchase:"
-msgid "A warehouse must be defined for the quotation."
-msgstr "Un almacén debe estar definido para el presupuesto."
+msgid "A warehouse must be defined for quotation of sale \"%s\"."
+msgstr "Se debe definir un almacén para el presupuesto de venta «%s»."
 
 msgctxt "error:purchase.purchase:"
-msgid "Invoice addresses must be defined for the quotation."
-msgstr "Debe definir las direcciones para la cotización."
+msgid "Invoice address must be defined for quotation of sale \"%s\"."
+msgstr ""
+"Se debe definir una dirección de facturación para el presupuesto de venta "
+"«%s»."
 
 msgctxt "error:purchase.purchase:"
-msgid "It misses an \"Account Payable\" on the party \"%s\"!"
-msgstr "¡A la entidad «%s» le hace falta una «Cuenta de pagos»!"
+msgid "Missing \"Account Payable\" on party \"%s\"."
+msgstr "Falta la «Cuenta a pagar» en la entidad «%s»."
 
 msgctxt "error:purchase.purchase:"
-msgid "Purchase \"%s\" must be cancelled before deletion!"
-msgstr "¡Compra «%s» debe ser cancelada antes de eliminar!"
+msgid "Purchase \"%s\" must be cancelled before deletion."
+msgstr "Debe cancelar la compra «%s» antes de eliminar."
 
 msgctxt "error:stock.shipment.in.return:"
 msgid "You cannot reset to draft a move generated by a purchase."
@@ -50,9 +58,12 @@ msgstr ""
 "No puede restablecer a borrador un movimiento generado por una compra."
 
 msgctxt "error:stock.shipment.in:"
-msgid "You cannot reset to draft a move generated by a purchase."
+msgid ""
+"You cannot reset to draft move \"%s\" because it was generated by a "
+"purchase."
 msgstr ""
-"No puede restablecer a borrador un movimiento generado por una compra."
+"No puede restablecer a borrador el movimiento «%s» porque se generó mediante"
+" una compra."
 
 msgctxt "field:account.invoice,purchase_exception_state:"
 msgid "Exception State"
@@ -62,10 +73,6 @@ msgctxt "field:account.invoice,purchases:"
 msgid "Purchases"
 msgstr "Compras"
 
-msgctxt "field:account.invoice.line,purchase_lines:"
-msgid "Purchase Lines"
-msgstr "Líneas de compra"
-
 msgctxt "field:product.template,product_suppliers:"
 msgid "Suppliers"
 msgstr "Proveedores"
@@ -96,11 +103,11 @@ msgstr "Método de facturación"
 
 msgctxt "field:purchase.configuration,purchase_sequence:"
 msgid "Purchase Reference Sequence"
-msgstr "Secuencia de Referencia de Compra"
+msgstr "Secuencia de referencia de compra"
 
 msgctxt "field:purchase.configuration,rec_name:"
 msgid "Name"
-msgstr "Nombre del campo"
+msgstr "Nombre campo"
 
 msgctxt "field:purchase.configuration,write_date:"
 msgid "Write Date"
@@ -120,7 +127,7 @@ msgstr "ID"
 
 msgctxt "field:purchase.handle.invoice.exception.ask,recreate_invoices:"
 msgid "Recreate Invoices"
-msgstr "Rehacer facturas"
+msgstr "Recrear facturas"
 
 msgctxt "field:purchase.handle.shipment.exception.ask,domain_moves:"
 msgid "Domain Moves"
@@ -132,11 +139,11 @@ msgstr "ID"
 
 msgctxt "field:purchase.handle.shipment.exception.ask,recreate_moves:"
 msgid "Recreate Moves"
-msgstr "Rehacer movimientos"
+msgstr "Recrear movimientos"
 
 msgctxt "field:purchase.line,amount:"
 msgid "Amount"
-msgstr "Cantidad"
+msgstr "Importe"
 
 msgctxt "field:purchase.line,create_date:"
 msgid "Create Date"
@@ -148,7 +155,7 @@ msgstr "Usuario creación"
 
 msgctxt "field:purchase.line,delivery_date:"
 msgid "Delivery Date"
-msgstr "Fecha de Entrega"
+msgstr "Fecha de entrega"
 
 msgctxt "field:purchase.line,description:"
 msgid "Description"
@@ -156,7 +163,7 @@ msgstr "Descripción"
 
 msgctxt "field:purchase.line,from_location:"
 msgid "From Location"
-msgstr "De ubicación"
+msgstr "Desde ubicación"
 
 msgctxt "field:purchase.line,id:"
 msgid "ID"
@@ -168,7 +175,7 @@ msgstr "Líneas de factura"
 
 msgctxt "field:purchase.line,move_done:"
 msgid "Moves Done"
-msgstr "Movimientos terminados"
+msgstr "Movimientos realizados"
 
 msgctxt "field:purchase.line,move_exception:"
 msgid "Moves Exception"
@@ -184,7 +191,7 @@ msgstr "Movimientos ignorados"
 
 msgctxt "field:purchase.line,moves_recreated:"
 msgid "Recreated Moves"
-msgstr "Rehacer movimientos"
+msgstr "Movimientos recreados"
 
 msgctxt "field:purchase.line,note:"
 msgid "Note"
@@ -232,7 +239,7 @@ msgstr "Unidad"
 
 msgctxt "field:purchase.line,unit_digits:"
 msgid "Unit Digits"
-msgstr "Dígitos unitarios"
+msgstr "Dígitos de unidad"
 
 msgctxt "field:purchase.line,unit_price:"
 msgid "Unit Price"
@@ -246,38 +253,6 @@ msgctxt "field:purchase.line,write_uid:"
 msgid "Write User"
 msgstr "Usuario modificación"
 
-msgctxt "field:purchase.line-account.invoice.line,create_date:"
-msgid "Create Date"
-msgstr "Fecha creación"
-
-msgctxt "field:purchase.line-account.invoice.line,create_uid:"
-msgid "Create User"
-msgstr "Usuario creación"
-
-msgctxt "field:purchase.line-account.invoice.line,id:"
-msgid "ID"
-msgstr "ID"
-
-msgctxt "field:purchase.line-account.invoice.line,invoice_line:"
-msgid "Invoice Line"
-msgstr "Línea de factura"
-
-msgctxt "field:purchase.line-account.invoice.line,purchase_line:"
-msgid "Purchase Line"
-msgstr "Línea de compra"
-
-msgctxt "field:purchase.line-account.invoice.line,rec_name:"
-msgid "Name"
-msgstr "Nombre"
-
-msgctxt "field:purchase.line-account.invoice.line,write_date:"
-msgid "Write Date"
-msgstr "Fecha modificación"
-
-msgctxt "field:purchase.line-account.invoice.line,write_uid:"
-msgid "Write User"
-msgstr "Usuario modificación"
-
 msgctxt "field:purchase.line-account.tax,create_date:"
 msgid "Create Date"
 msgstr "Fecha creación"
@@ -380,7 +355,7 @@ msgstr "Código"
 
 msgctxt "field:purchase.product_supplier,company:"
 msgid "Company"
-msgstr "Compañía"
+msgstr "Empresa"
 
 msgctxt "field:purchase.product_supplier,create_date:"
 msgid "Create Date"
@@ -392,7 +367,7 @@ msgstr "Usuario creación"
 
 msgctxt "field:purchase.product_supplier,currency:"
 msgid "Currency"
-msgstr "Gestión de divisas"
+msgstr "Divisa"
 
 msgctxt "field:purchase.product_supplier,delivery_time:"
 msgid "Delivery Time"
@@ -492,7 +467,7 @@ msgstr "Divisa"
 
 msgctxt "field:purchase.purchase,currency_digits:"
 msgid "Currency Digits"
-msgstr "Dígitos de la divisa"
+msgstr "Dígitos de divisa"
 
 msgctxt "field:purchase.purchase,description:"
 msgid "Description"
@@ -560,7 +535,7 @@ msgstr "Referencia"
 
 msgctxt "field:purchase.purchase,shipment_returns:"
 msgid "Shipment Returns"
-msgstr "Devolución de Envío"
+msgstr "Envío de devolución"
 
 msgctxt "field:purchase.purchase,shipment_state:"
 msgid "Shipment State"
@@ -584,7 +559,7 @@ msgstr "Impuesto"
 
 msgctxt "field:purchase.purchase,tax_amount_cache:"
 msgid "Tax Cache"
-msgstr "Caché de Impuestos"
+msgstr "Impuestos precalculado"
 
 msgctxt "field:purchase.purchase,total_amount:"
 msgid "Total"
@@ -592,15 +567,15 @@ msgstr "Total"
 
 msgctxt "field:purchase.purchase,total_amount_cache:"
 msgid "Total Cache"
-msgstr "Caché Total"
+msgstr "Total precalculado"
 
 msgctxt "field:purchase.purchase,untaxed_amount:"
 msgid "Untaxed"
-msgstr "Sin impuesto"
+msgstr "Base imponible"
 
 msgctxt "field:purchase.purchase,untaxed_amount_cache:"
 msgid "Untaxed Cache"
-msgstr "Caché Libre de Impuestos"
+msgstr "Base imponible precalculado"
 
 msgctxt "field:purchase.purchase,warehouse:"
 msgid "Warehouse"
@@ -722,10 +697,6 @@ msgctxt "field:stock.move,purchase_exception_state:"
 msgid "Exception State"
 msgstr "Estado excepción"
 
-msgctxt "field:stock.move,purchase_line:"
-msgid "Purchase Line"
-msgstr "Línea de compra"
-
 msgctxt "field:stock.move,purchase_quantity:"
 msgid "Purchase Quantity"
 msgstr "Cantidad de compra"
@@ -740,7 +711,7 @@ msgstr "Decimales de la unidad de compra"
 
 msgctxt "field:stock.move,purchase_unit_price:"
 msgid "Purchase Unit Price"
-msgstr "Precio de la unidad de compra"
+msgstr "Precio unidad de compra"
 
 msgctxt "field:stock.move,purchase_visible:"
 msgid "Purchase Visible"
@@ -753,11 +724,13 @@ msgstr "Proveedor"
 msgctxt "help:purchase.handle.invoice.exception.ask,recreate_invoices:"
 msgid ""
 "The selected invoices will be recreated. The other ones will be ignored."
-msgstr "La factura seleccionada será recreada. Las otras serán ignoradas."
+msgstr ""
+"Las facturas seleccionadas serán recreadas. Las otras serán ignoradas."
 
 msgctxt "help:purchase.handle.shipment.exception.ask,recreate_moves:"
 msgid "The selected moves will be recreated. The other ones will be ignored."
-msgstr "Los movimientos seleccionados se reharán. Los demás se ignorarán."
+msgstr ""
+"Los movimientos seleccionados serán recreados. Los demás se ignorarán."
 
 msgctxt "help:purchase.product_supplier,delivery_time:"
 msgid "In number of days"
@@ -777,7 +750,7 @@ msgstr "Entidades asociadas con compras"
 
 msgctxt "model:ir.action,name:act_purchase_configuration_form"
 msgid "Purchase Configuration"
-msgstr "Configuración de Compra"
+msgstr "Configuración de compras"
 
 msgctxt "model:ir.action,name:act_purchase_form"
 msgid "Purchases"
@@ -787,18 +760,6 @@ msgctxt "model:ir.action,name:act_purchase_form2"
 msgid "Purchases"
 msgstr "Compras"
 
-msgctxt "model:ir.action,name:act_purchase_form_confirmed"
-msgid "Confirmed Purchases"
-msgstr "Compras confirmadas"
-
-msgctxt "model:ir.action,name:act_purchase_form_draft"
-msgid "Draft Purchases"
-msgstr "Compras en borrador"
-
-msgctxt "model:ir.action,name:act_purchase_form_quotation"
-msgid "Purchases in Quotation"
-msgstr "Compras en cotización"
-
 msgctxt "model:ir.action,name:act_return_form"
 msgid "Returns"
 msgstr "Devolución"
@@ -819,6 +780,25 @@ msgctxt "model:ir.action,name:wizard_shipment_handle_exception"
 msgid "Handle Shipment Exception"
 msgstr "Gestionar excepción de envío"
 
+msgctxt "model:ir.action.act_window.domain,name:act_purchase_form_domain_all"
+msgid "All"
+msgstr "Todo"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_purchase_form_domain_confirmed"
+msgid "Confirmed"
+msgstr "Confirmado"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_purchase_form_domain_draft"
+msgid "Draft"
+msgstr "Borrador"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_purchase_form_domain_quotation"
+msgid "Quotation"
+msgstr "Presupuesto"
+
 msgctxt "model:ir.sequence,name:sequence_purchase"
 msgid "Purchase"
 msgstr "Compra"
@@ -833,28 +813,16 @@ msgstr "Configuración"
 
 msgctxt "model:ir.ui.menu,name:menu_purchase"
 msgid "Purchase"
-msgstr "Gestión de compras"
+msgstr "Compras"
 
 msgctxt "model:ir.ui.menu,name:menu_purchase_configuration"
 msgid "Purchase Configuration"
-msgstr "Configuración de Compra"
+msgstr "Compras"
 
 msgctxt "model:ir.ui.menu,name:menu_purchase_form"
 msgid "Purchases"
 msgstr "Compras"
 
-msgctxt "model:ir.ui.menu,name:menu_purchase_form_confirmed"
-msgid "Confirmed Purchases"
-msgstr "Compras confirmadas"
-
-msgctxt "model:ir.ui.menu,name:menu_purchase_form_draft"
-msgid "Draft Purchases"
-msgstr "Compras en borrador"
-
-msgctxt "model:ir.ui.menu,name:menu_purchase_form_quotation"
-msgid "Purchases in Quotation"
-msgstr "Compras en cotización"
-
 msgctxt "model:ir.ui.menu,name:menu_reporting"
 msgid "Reporting"
 msgstr "Informes"
@@ -865,24 +833,20 @@ msgstr "Entidades asociadas con compras"
 
 msgctxt "model:purchase.configuration,name:"
 msgid "Purchase Configuration"
-msgstr "Configuración de Compra"
+msgstr "Configuración de compras"
 
 msgctxt "model:purchase.handle.invoice.exception.ask,name:"
 msgid "Handle Invoice Exception"
-msgstr "Factura de excepción - Petición"
+msgstr "Gestionar excepción de factura"
 
 msgctxt "model:purchase.handle.shipment.exception.ask,name:"
 msgid "Handle Shipment Exception"
-msgstr "Envio de excepcion - Petición"
+msgstr "Gestionar excepción de envío"
 
 msgctxt "model:purchase.line,name:"
 msgid "Purchase Line"
 msgstr "Línea de compra"
 
-msgctxt "model:purchase.line-account.invoice.line,name:"
-msgid "Purchase Line - Invoice Line"
-msgstr "Línea de compra - Línea de factura"
-
 msgctxt "model:purchase.line-account.tax,name:"
 msgid "Purchase Line - Tax"
 msgstr "Línea de compra - Impuesto"
@@ -925,11 +889,11 @@ msgstr "Compra"
 
 msgctxt "model:res.group,name:group_purchase_admin"
 msgid "Purchase Administrator"
-msgstr "Administrador de compra"
+msgstr "Administrador de compras"
 
 msgctxt "odt:purchase.purchase:"
 msgid "Amount"
-msgstr "Cantidad"
+msgstr "Importe"
 
 msgctxt "odt:purchase.purchase:"
 msgid "Date:"
@@ -957,7 +921,7 @@ msgstr "Teléfono:"
 
 msgctxt "odt:purchase.purchase:"
 msgid "Purchase Order N°:"
-msgstr "Nº de orden de compra:"
+msgstr "Orden de compra Nº:"
 
 msgctxt "odt:purchase.purchase:"
 msgid "Quantity"
@@ -1005,15 +969,15 @@ msgstr "Ignorado"
 
 msgctxt "selection:account.invoice,purchase_exception_state:"
 msgid "Recreated"
-msgstr "Rehecho"
+msgstr "Recreada"
 
 msgctxt "selection:purchase.configuration,purchase_invoice_method:"
 msgid "Based On Order"
-msgstr "Basado en orden"
+msgstr "Basado en la orden"
 
 msgctxt "selection:purchase.configuration,purchase_invoice_method:"
 msgid "Based On Shipment"
-msgstr "Basado en envío"
+msgstr "Basado en el envío"
 
 msgctxt "selection:purchase.configuration,purchase_invoice_method:"
 msgid "Manual"
@@ -1037,11 +1001,11 @@ msgstr "Título"
 
 msgctxt "selection:purchase.purchase,invoice_method:"
 msgid "Based On Order"
-msgstr "Basado en orden"
+msgstr "Basado en la orden"
 
 msgctxt "selection:purchase.purchase,invoice_method:"
 msgid "Based On Shipment"
-msgstr "Basado en envio"
+msgstr "Basado en el envío"
 
 msgctxt "selection:purchase.purchase,invoice_method:"
 msgid "Manual"
@@ -1073,7 +1037,7 @@ msgstr "Ninguno"
 
 msgctxt "selection:purchase.purchase,shipment_state:"
 msgid "Received"
-msgstr "Recibido"
+msgstr "Recibida"
 
 msgctxt "selection:purchase.purchase,shipment_state:"
 msgid "Waiting"
@@ -1081,7 +1045,7 @@ msgstr "En espera"
 
 msgctxt "selection:purchase.purchase,state:"
 msgid "Canceled"
-msgstr "Cancelado"
+msgstr "Cancelada"
 
 msgctxt "selection:purchase.purchase,state:"
 msgid "Confirmed"
@@ -1089,7 +1053,7 @@ msgstr "Confirmado"
 
 msgctxt "selection:purchase.purchase,state:"
 msgid "Done"
-msgstr "Terminada"
+msgstr "Realizada"
 
 msgctxt "selection:purchase.purchase,state:"
 msgid "Draft"
@@ -1109,51 +1073,35 @@ msgstr "Ignorado"
 
 msgctxt "selection:stock.move,purchase_exception_state:"
 msgid "Recreated"
-msgstr "Rehecho"
+msgstr "Recreado"
 
 msgctxt "view:product.product:"
 msgid "Products"
 msgstr "Productos"
 
-msgctxt "view:product.product:"
-msgid "Suppliers"
-msgstr "Proveedores"
-
-msgctxt "view:product.template:"
-msgid "Product Suppliers"
-msgstr "Proveedores de productos"
-
 msgctxt "view:product.template:"
 msgid "Suppliers"
 msgstr "Proveedores"
 
 msgctxt "view:purchase.configuration:"
 msgid "Purchase Configuration"
-msgstr "Configuración de Compra"
+msgstr "Configuración de compras"
 
 msgctxt "view:purchase.handle.invoice.exception.ask:"
 msgid "Choose invoices to recreate"
-msgstr "Seleccione las facturas a recrear"
+msgstr "Seleccione facturas a recrear"
 
 msgctxt "view:purchase.handle.invoice.exception.ask:"
 msgid "Handle Invoice Exception"
-msgstr "Manejar excepción de factura"
+msgstr "Gestionar excepción de factura"
 
 msgctxt "view:purchase.handle.shipment.exception.ask:"
 msgid "Choose move to recreate"
-msgstr "Escoja un movimiento a rehacer"
-
-msgctxt "view:purchase.handle.shipment.exception.ask:"
-msgid "Choose moves to recreate"
-msgstr "Elegir movimientos a recrear"
+msgstr "Seleccione movimientos a recrear"
 
 msgctxt "view:purchase.handle.shipment.exception.ask:"
 msgid "Handle shipment Exception"
-msgstr "Gestionar excepciones de envio"
-
-msgctxt "view:purchase.handle.shipment.exception.ask:"
-msgid "Recreated Moves"
-msgstr "Movimientos recreados"
+msgstr "Gestionar excepción de envío"
 
 msgctxt "view:purchase.line:"
 msgid "General"
@@ -1168,10 +1116,6 @@ msgid "Notes"
 msgstr "Notas"
 
 msgctxt "view:purchase.line:"
-msgid "Products"
-msgstr "Productos"
-
-msgctxt "view:purchase.line:"
 msgid "Purchase Line"
 msgstr "Línea de compra"
 
@@ -1213,21 +1157,13 @@ msgstr "Gestionar excepción de factura"
 
 msgctxt "view:purchase.purchase:"
 msgid "Handle Shipment Exception"
-msgstr "Gestionar excepción de envios"
+msgstr "Gestionar excepción de envío"
 
 msgctxt "view:purchase.purchase:"
 msgid "Invoices"
 msgstr "Facturas"
 
 msgctxt "view:purchase.purchase:"
-msgid "Lines"
-msgstr "Líneas"
-
-msgctxt "view:purchase.purchase:"
-msgid "Moves"
-msgstr "Movimientos"
-
-msgctxt "view:purchase.purchase:"
 msgid "Other Info"
 msgstr "Información adicional"
 
@@ -1240,10 +1176,6 @@ msgid "Purchases"
 msgstr "Compras"
 
 msgctxt "view:purchase.purchase:"
-msgid "Quotation"
-msgstr "Presupuesto"
-
-msgctxt "view:purchase.purchase:"
 msgid "Quote"
 msgstr "Presupuestar"
 
diff --git a/locale/es_CO.po b/locale/es_CO.po
index df02e64..f848145 100644
--- a/locale/es_CO.po
+++ b/locale/es_CO.po
@@ -3,8 +3,8 @@ msgid ""
 msgstr "Content-Type: text/plain; charset=utf-8\n"
 
 msgctxt "error:account.invoice:"
-msgid "You can not delete invoices that come from a purchase!"
-msgstr "No puede eliminar facturas que vienen de una compra."
+msgid "You can not delete invoices that come from a purchase."
+msgstr "No puede eliminar facturas generadas por una compra."
 
 msgctxt "error:account.invoice:"
 msgid "You cannot reset to draft an invoice generated by a purchase."
@@ -17,43 +17,54 @@ msgstr ""
 "Los precios de compra están basados en la UdM de compra. ¿Desea cambiarlo?"
 
 msgctxt "error:purchase.line:"
-msgid "It misses an \"Account Expense\" on product \"%s\"!"
-msgstr "Al producto \"%s\" le falta una \"Cuenta de gastos\"."
+msgid ""
+"Product \"%(product)s\" of purchase %(purchase)s misses an expense account."
+msgstr ""
+"El producto \"%(product)s\" de la compra \"%(purchase)s\" le falta una "
+"cuenta de gastos."
 
 msgctxt "error:purchase.line:"
-msgid "It misses an \"account expense\" default property!"
-msgstr "Falta una propiedad por defecto de \"Cuenta de gastos\"."
+msgid "Purchase \"%(purchase)s\" misses an \"account expense\" default property."
+msgstr ""
+"La compra \"%(purchase)s\" le falta la propiedad por defecto \"Cuenta de "
+"Gastos\"."
 
 msgctxt "error:purchase.line:"
-msgid "The supplier location is required!"
-msgstr "La locación de proveedor es requerida."
+msgid "Purchase \"%(purchase)s\" misses the supplier location for line \"%(line)s\"."
+msgstr ""
+"La compra \"%(purchase)s\" le falta la bodega del proveedor para la línea "
+"\"%(line)s\"."
 
 msgctxt "error:purchase.purchase:"
-msgid "A warehouse must be defined for the quotation."
-msgstr "Debe indicar un almacén en el presupuesto."
+msgid "A warehouse must be defined for quotation of sale \"%s\"."
+msgstr "Un depósito de estar definido en la cotización de venta \"%s\"."
 
 msgctxt "error:purchase.purchase:"
-msgid "Invoice addresses must be defined for the quotation."
-msgstr "Debe indicar la dirección de facturación en la cotización."
+msgid "Invoice address must be defined for quotation of sale \"%s\"."
+msgstr ""
+"La dirección de facturación deben definirse en la cotización de la venta "
+"\"%s\"."
 
 msgctxt "error:purchase.purchase:"
-msgid "It misses an \"Account Payable\" on the party \"%s\"!"
-msgstr "Al tercero \"%s\" le falta una \"Cuenta a pagar\"."
+msgid "Missing \"Account Payable\" on party \"%s\"."
+msgstr "Falta \"Cuenta por Pagar\" en el tercero \"%s\"."
 
 msgctxt "error:purchase.purchase:"
-msgid "Purchase \"%s\" must be cancelled before deletion!"
+msgid "Purchase \"%s\" must be cancelled before deletion."
 msgstr "La compra \"%s\" debe ser cancelada antes de ser eliminada."
 
-#, fuzzy
 msgctxt "error:stock.shipment.in.return:"
 msgid "You cannot reset to draft a move generated by a purchase."
 msgstr ""
 "No puede restablecer a borrador un movimiento generado por una compra."
 
 msgctxt "error:stock.shipment.in:"
-msgid "You cannot reset to draft a move generated by a purchase."
+msgid ""
+"You cannot reset to draft move \"%s\" because it was generated by a "
+"purchase."
 msgstr ""
-"No puede restablecer a borrador un movimiento generado por una compra."
+"No puede restablecer a borrador el movimiento \"%s\" porque fue generado por"
+" una compra."
 
 msgctxt "field:account.invoice,purchase_exception_state:"
 msgid "Exception State"
@@ -63,10 +74,6 @@ msgctxt "field:account.invoice,purchases:"
 msgid "Purchases"
 msgstr "Compras"
 
-msgctxt "field:account.invoice.line,purchase_lines:"
-msgid "Purchase Lines"
-msgstr "Líneas de compra"
-
 msgctxt "field:product.template,product_suppliers:"
 msgid "Suppliers"
 msgstr "Proveedores"
@@ -77,15 +84,15 @@ msgstr "Comprable"
 
 msgctxt "field:product.template,purchase_uom:"
 msgid "Purchase UOM"
-msgstr "UdM de compra"
+msgstr "UdM de Compra"
 
 msgctxt "field:purchase.configuration,create_date:"
 msgid "Create Date"
-msgstr "Fecha creación"
+msgstr "Fecha de Creación"
 
 msgctxt "field:purchase.configuration,create_uid:"
 msgid "Create User"
-msgstr "Usuario creación"
+msgstr "Creado por Usuario"
 
 msgctxt "field:purchase.configuration,id:"
 msgid "ID"
@@ -93,11 +100,11 @@ msgstr "ID"
 
 msgctxt "field:purchase.configuration,purchase_invoice_method:"
 msgid "Invoice Method"
-msgstr "Método de facturación"
+msgstr "Método de Facturación"
 
 msgctxt "field:purchase.configuration,purchase_sequence:"
 msgid "Purchase Reference Sequence"
-msgstr "Secuencia pedidos de compra"
+msgstr "Secuencia Orden de Compra"
 
 msgctxt "field:purchase.configuration,rec_name:"
 msgid "Name"
@@ -105,15 +112,15 @@ msgstr "Nombre"
 
 msgctxt "field:purchase.configuration,write_date:"
 msgid "Write Date"
-msgstr "Fecha modificación"
+msgstr "Fecha de Modificación"
 
 msgctxt "field:purchase.configuration,write_uid:"
 msgid "Write User"
-msgstr "Usuario modificación"
+msgstr "Modificado por Usuario"
 
 msgctxt "field:purchase.handle.invoice.exception.ask,domain_invoices:"
 msgid "Domain Invoices"
-msgstr "Dominio de facturas"
+msgstr "Dominio de Facturas"
 
 msgctxt "field:purchase.handle.invoice.exception.ask,id:"
 msgid "ID"
@@ -121,11 +128,11 @@ msgstr "ID"
 
 msgctxt "field:purchase.handle.invoice.exception.ask,recreate_invoices:"
 msgid "Recreate Invoices"
-msgstr "Recrear facturas"
+msgstr "Recrear Facturas"
 
 msgctxt "field:purchase.handle.shipment.exception.ask,domain_moves:"
 msgid "Domain Moves"
-msgstr "Dominio de movimientos"
+msgstr "Dominio de Movimientos"
 
 msgctxt "field:purchase.handle.shipment.exception.ask,id:"
 msgid "ID"
@@ -133,7 +140,7 @@ msgstr "ID"
 
 msgctxt "field:purchase.handle.shipment.exception.ask,recreate_moves:"
 msgid "Recreate Moves"
-msgstr "Recrear movimientos"
+msgstr "Recrear Movimientos"
 
 msgctxt "field:purchase.line,amount:"
 msgid "Amount"
@@ -141,15 +148,15 @@ msgstr "Cantidad"
 
 msgctxt "field:purchase.line,create_date:"
 msgid "Create Date"
-msgstr "Fecha creación"
+msgstr "Fecha de Creación"
 
 msgctxt "field:purchase.line,create_uid:"
 msgid "Create User"
-msgstr "Usuario creación"
+msgstr "Creado por Usuario"
 
 msgctxt "field:purchase.line,delivery_date:"
 msgid "Delivery Date"
-msgstr "Fecha de entrega"
+msgstr "Fecha de Entrega"
 
 msgctxt "field:purchase.line,description:"
 msgid "Description"
@@ -157,7 +164,7 @@ msgstr "Descripción"
 
 msgctxt "field:purchase.line,from_location:"
 msgid "From Location"
-msgstr "Desde locación"
+msgstr "Desde Bodega"
 
 msgctxt "field:purchase.line,id:"
 msgid "ID"
@@ -165,15 +172,15 @@ msgstr "ID"
 
 msgctxt "field:purchase.line,invoice_lines:"
 msgid "Invoice Lines"
-msgstr "Líneas de factura"
+msgstr "Líneas de Factura"
 
 msgctxt "field:purchase.line,move_done:"
 msgid "Moves Done"
-msgstr "Movimientos realizados"
+msgstr "Movimientos Hechos"
 
 msgctxt "field:purchase.line,move_exception:"
 msgid "Moves Exception"
-msgstr "Exepción de movimientos"
+msgstr "Excepción de Movimientos"
 
 msgctxt "field:purchase.line,moves:"
 msgid "Moves"
@@ -181,11 +188,11 @@ msgstr "Movimientos"
 
 msgctxt "field:purchase.line,moves_ignored:"
 msgid "Ignored Moves"
-msgstr "Movimientos ignorados"
+msgstr "Movimientos Ignorados"
 
 msgctxt "field:purchase.line,moves_recreated:"
 msgid "Recreated Moves"
-msgstr "Movimientos recreados"
+msgstr "Movimientos Recreados"
 
 msgctxt "field:purchase.line,note:"
 msgid "Note"
@@ -221,7 +228,7 @@ msgstr "Impuestos"
 
 msgctxt "field:purchase.line,to_location:"
 msgid "To Location"
-msgstr "A locación"
+msgstr "A Bodega"
 
 msgctxt "field:purchase.line,type:"
 msgid "Type"
@@ -241,51 +248,19 @@ msgstr "Precio unitario"
 
 msgctxt "field:purchase.line,write_date:"
 msgid "Write Date"
-msgstr "Fecha modificación"
+msgstr "Fecha de Modificación"
 
 msgctxt "field:purchase.line,write_uid:"
 msgid "Write User"
-msgstr "Usuario modificación"
-
-msgctxt "field:purchase.line-account.invoice.line,create_date:"
-msgid "Create Date"
-msgstr "Fecha creación"
-
-msgctxt "field:purchase.line-account.invoice.line,create_uid:"
-msgid "Create User"
-msgstr "Usuario creación"
-
-msgctxt "field:purchase.line-account.invoice.line,id:"
-msgid "ID"
-msgstr "ID"
-
-msgctxt "field:purchase.line-account.invoice.line,invoice_line:"
-msgid "Invoice Line"
-msgstr "Línea de factura"
-
-msgctxt "field:purchase.line-account.invoice.line,purchase_line:"
-msgid "Purchase Line"
-msgstr "Línea de compra"
-
-msgctxt "field:purchase.line-account.invoice.line,rec_name:"
-msgid "Name"
-msgstr "Nombre"
-
-msgctxt "field:purchase.line-account.invoice.line,write_date:"
-msgid "Write Date"
-msgstr "Fecha modificación"
-
-msgctxt "field:purchase.line-account.invoice.line,write_uid:"
-msgid "Write User"
-msgstr "Usuario modificación"
+msgstr "Modificado por Usuario"
 
 msgctxt "field:purchase.line-account.tax,create_date:"
 msgid "Create Date"
-msgstr "Fecha creación"
+msgstr "Fecha de Creación"
 
 msgctxt "field:purchase.line-account.tax,create_uid:"
 msgid "Create User"
-msgstr "Usuario creación"
+msgstr "Creado por Usuario"
 
 msgctxt "field:purchase.line-account.tax,id:"
 msgid "ID"
@@ -305,19 +280,19 @@ msgstr "Impuesto"
 
 msgctxt "field:purchase.line-account.tax,write_date:"
 msgid "Write Date"
-msgstr "Fecha modificación"
+msgstr "Fecha de Modificación"
 
 msgctxt "field:purchase.line-account.tax,write_uid:"
 msgid "Write User"
-msgstr "Usuario modificación"
+msgstr "Modificado por Usuario"
 
 msgctxt "field:purchase.line-ignored-stock.move,create_date:"
 msgid "Create Date"
-msgstr "Fecha creación"
+msgstr "Fecha de Creación"
 
 msgctxt "field:purchase.line-ignored-stock.move,create_uid:"
 msgid "Create User"
-msgstr "Usuario creación"
+msgstr "Creado por Usuario"
 
 msgctxt "field:purchase.line-ignored-stock.move,id:"
 msgid "ID"
@@ -329,7 +304,7 @@ msgstr "Movimiento"
 
 msgctxt "field:purchase.line-ignored-stock.move,purchase_line:"
 msgid "Purchase Line"
-msgstr "Línea de compra"
+msgstr "Línea de Compra"
 
 msgctxt "field:purchase.line-ignored-stock.move,rec_name:"
 msgid "Name"
@@ -337,19 +312,19 @@ msgstr "Nombre"
 
 msgctxt "field:purchase.line-ignored-stock.move,write_date:"
 msgid "Write Date"
-msgstr "Fecha modificación"
+msgstr "Fecha de Modificación"
 
 msgctxt "field:purchase.line-ignored-stock.move,write_uid:"
 msgid "Write User"
-msgstr "Usuario modificación"
+msgstr "Modificado por Usuario"
 
 msgctxt "field:purchase.line-recreated-stock.move,create_date:"
 msgid "Create Date"
-msgstr "Fecha creación"
+msgstr "Fecha de Creación"
 
 msgctxt "field:purchase.line-recreated-stock.move,create_uid:"
 msgid "Create User"
-msgstr "Usuario creación"
+msgstr "Creado por Usuario"
 
 msgctxt "field:purchase.line-recreated-stock.move,id:"
 msgid "ID"
@@ -361,7 +336,7 @@ msgstr "Movimiento"
 
 msgctxt "field:purchase.line-recreated-stock.move,purchase_line:"
 msgid "Purchase Line"
-msgstr "Línea de compra"
+msgstr "Línea de Compra"
 
 msgctxt "field:purchase.line-recreated-stock.move,rec_name:"
 msgid "Name"
@@ -369,11 +344,11 @@ msgstr "Nombre"
 
 msgctxt "field:purchase.line-recreated-stock.move,write_date:"
 msgid "Write Date"
-msgstr "Fecha modificación"
+msgstr "Fecha de Modificación"
 
 msgctxt "field:purchase.line-recreated-stock.move,write_uid:"
 msgid "Write User"
-msgstr "Usuario modificación"
+msgstr "Modificado por Usuario"
 
 msgctxt "field:purchase.product_supplier,code:"
 msgid "Code"
@@ -385,11 +360,11 @@ msgstr "Compañia"
 
 msgctxt "field:purchase.product_supplier,create_date:"
 msgid "Create Date"
-msgstr "Fecha creación"
+msgstr "Fecha de Creación"
 
 msgctxt "field:purchase.product_supplier,create_uid:"
 msgid "Create User"
-msgstr "Usuario creación"
+msgstr "Creado por Usuario"
 
 msgctxt "field:purchase.product_supplier,currency:"
 msgid "Currency"
@@ -397,7 +372,7 @@ msgstr "Moneda"
 
 msgctxt "field:purchase.product_supplier,delivery_time:"
 msgid "Delivery Time"
-msgstr "Tiempo de envío"
+msgstr "Tiempo de Envío"
 
 msgctxt "field:purchase.product_supplier,id:"
 msgid "ID"
@@ -429,19 +404,19 @@ msgstr "Secuencia"
 
 msgctxt "field:purchase.product_supplier,write_date:"
 msgid "Write Date"
-msgstr "Fecha modificación"
+msgstr "Fecha de Modificación"
 
 msgctxt "field:purchase.product_supplier,write_uid:"
 msgid "Write User"
-msgstr "Usuario modificación"
+msgstr "Modificado por Usuario"
 
 msgctxt "field:purchase.product_supplier.price,create_date:"
 msgid "Create Date"
-msgstr "Fecha creación"
+msgstr "Fecha de Creación"
 
 msgctxt "field:purchase.product_supplier.price,create_uid:"
 msgid "Create User"
-msgstr "Usuario creación"
+msgstr "Creado por Usuario"
 
 msgctxt "field:purchase.product_supplier.price,id:"
 msgid "ID"
@@ -465,11 +440,11 @@ msgstr "Precio Unitario"
 
 msgctxt "field:purchase.product_supplier.price,write_date:"
 msgid "Write Date"
-msgstr "Fecha modificación"
+msgstr "Fecha de Modificación"
 
 msgctxt "field:purchase.product_supplier.price,write_uid:"
 msgid "Write User"
-msgstr "Usuario modificación"
+msgstr "Modificado por Usuario"
 
 msgctxt "field:purchase.purchase,comment:"
 msgid "Comment"
@@ -481,11 +456,11 @@ msgstr "Compañia"
 
 msgctxt "field:purchase.purchase,create_date:"
 msgid "Create Date"
-msgstr "Fecha creación"
+msgstr "Fecha de Creación"
 
 msgctxt "field:purchase.purchase,create_uid:"
 msgid "Create User"
-msgstr "Usuario creación"
+msgstr "Creado por Usuario"
 
 msgctxt "field:purchase.purchase,currency:"
 msgid "Currency"
@@ -505,15 +480,15 @@ msgstr "ID"
 
 msgctxt "field:purchase.purchase,invoice_address:"
 msgid "Invoice Address"
-msgstr "Dirección de facturación"
+msgstr "Dirección de Facturación"
 
 msgctxt "field:purchase.purchase,invoice_method:"
 msgid "Invoice Method"
-msgstr "Método de facturación"
+msgstr "Método de Facturación"
 
 msgctxt "field:purchase.purchase,invoice_state:"
 msgid "Invoice State"
-msgstr "Estado factura"
+msgstr "Estado Factura"
 
 msgctxt "field:purchase.purchase,invoices:"
 msgid "Invoices"
@@ -521,7 +496,7 @@ msgstr "Facturas"
 
 msgctxt "field:purchase.purchase,invoices_ignored:"
 msgid "Ignored Invoices"
-msgstr "Facturas ignoradas"
+msgstr "Facturas Ignoradas"
 
 msgctxt "field:purchase.purchase,invoices_recreated:"
 msgid "Recreated Invoices"
@@ -541,15 +516,15 @@ msgstr "Tercero"
 
 msgctxt "field:purchase.purchase,party_lang:"
 msgid "Party Language"
-msgstr "Idioma del tercero"
+msgstr "Idioma del Tercero"
 
 msgctxt "field:purchase.purchase,payment_term:"
 msgid "Payment Term"
-msgstr "Plazo de pago"
+msgstr "Forma de Pago"
 
 msgctxt "field:purchase.purchase,purchase_date:"
 msgid "Purchase Date"
-msgstr "Fecha de compra"
+msgstr "Fecha de Compra"
 
 msgctxt "field:purchase.purchase,rec_name:"
 msgid "Name"
@@ -559,7 +534,6 @@ msgctxt "field:purchase.purchase,reference:"
 msgid "Reference"
 msgstr "Referencia"
 
-#, fuzzy
 msgctxt "field:purchase.purchase,shipment_returns:"
 msgid "Shipment Returns"
 msgstr "Devolución"
@@ -586,7 +560,7 @@ msgstr "Impuesto"
 
 msgctxt "field:purchase.purchase,tax_amount_cache:"
 msgid "Tax Cache"
-msgstr "Impuestos precalculado"
+msgstr "Impuestos Precalculado"
 
 msgctxt "field:purchase.purchase,total_amount:"
 msgid "Total"
@@ -594,7 +568,7 @@ msgstr "Total"
 
 msgctxt "field:purchase.purchase,total_amount_cache:"
 msgid "Total Cache"
-msgstr "Total precalculado"
+msgstr "Total Precalculado"
 
 msgctxt "field:purchase.purchase,untaxed_amount:"
 msgid "Untaxed"
@@ -602,27 +576,27 @@ msgstr "Base Sin Impuesto"
 
 msgctxt "field:purchase.purchase,untaxed_amount_cache:"
 msgid "Untaxed Cache"
-msgstr "Base imponible precalculado"
+msgstr "Base Sin Impuesto Precalculado"
 
 msgctxt "field:purchase.purchase,warehouse:"
 msgid "Warehouse"
-msgstr "Almacén"
+msgstr "Depósito"
 
 msgctxt "field:purchase.purchase,write_date:"
 msgid "Write Date"
-msgstr "Fecha modificación"
+msgstr "Fecha de Modificación"
 
 msgctxt "field:purchase.purchase,write_uid:"
 msgid "Write User"
-msgstr "Usuario modificación"
+msgstr "Modificado por Usuario"
 
 msgctxt "field:purchase.purchase-account.invoice,create_date:"
 msgid "Create Date"
-msgstr "Fecha creación"
+msgstr "Fecha de Creación"
 
 msgctxt "field:purchase.purchase-account.invoice,create_uid:"
 msgid "Create User"
-msgstr "Usuario creación"
+msgstr "Creado por Usuario"
 
 msgctxt "field:purchase.purchase-account.invoice,id:"
 msgid "ID"
@@ -642,19 +616,19 @@ msgstr "Nombre"
 
 msgctxt "field:purchase.purchase-account.invoice,write_date:"
 msgid "Write Date"
-msgstr "Fecha modificación"
+msgstr "Fecha de Modificación"
 
 msgctxt "field:purchase.purchase-account.invoice,write_uid:"
 msgid "Write User"
-msgstr "Usuario modificación"
+msgstr "Modificado por Usuario"
 
 msgctxt "field:purchase.purchase-ignored-account.invoice,create_date:"
 msgid "Create Date"
-msgstr "Fecha creación"
+msgstr "Fecha de Creación"
 
 msgctxt "field:purchase.purchase-ignored-account.invoice,create_uid:"
 msgid "Create User"
-msgstr "Usuario creación"
+msgstr "Creado por Usuario"
 
 msgctxt "field:purchase.purchase-ignored-account.invoice,id:"
 msgid "ID"
@@ -674,19 +648,19 @@ msgstr "Nombre"
 
 msgctxt "field:purchase.purchase-ignored-account.invoice,write_date:"
 msgid "Write Date"
-msgstr "Fecha modificación"
+msgstr "Fecha de Modificación"
 
 msgctxt "field:purchase.purchase-ignored-account.invoice,write_uid:"
 msgid "Write User"
-msgstr "Usuario modificación"
+msgstr "Modificado por Usuario"
 
 msgctxt "field:purchase.purchase-recreated-account.invoice,create_date:"
 msgid "Create Date"
-msgstr "Fecha creación"
+msgstr "Fecha de Creación"
 
 msgctxt "field:purchase.purchase-recreated-account.invoice,create_uid:"
 msgid "Create User"
-msgstr "Usuario creación"
+msgstr "Creado por Usuario"
 
 msgctxt "field:purchase.purchase-recreated-account.invoice,id:"
 msgid "ID"
@@ -706,11 +680,11 @@ msgstr "Nombre"
 
 msgctxt "field:purchase.purchase-recreated-account.invoice,write_date:"
 msgid "Write Date"
-msgstr "Fecha modificación"
+msgstr "Fecha de Modificación"
 
 msgctxt "field:purchase.purchase-recreated-account.invoice,write_uid:"
 msgid "Write User"
-msgstr "Usuario modificación"
+msgstr "Modificado por Usuario"
 
 msgctxt "field:stock.move,purchase:"
 msgid "Purchase"
@@ -724,10 +698,6 @@ msgctxt "field:stock.move,purchase_exception_state:"
 msgid "Exception State"
 msgstr "Estado excepción"
 
-msgctxt "field:stock.move,purchase_line:"
-msgid "Purchase Line"
-msgstr "Línea de Compra"
-
 msgctxt "field:stock.move,purchase_quantity:"
 msgid "Purchase Quantity"
 msgstr "Cantidad de Compra"
@@ -738,15 +708,15 @@ msgstr "Unidad de Compra"
 
 msgctxt "field:stock.move,purchase_unit_digits:"
 msgid "Purchase Unit Digits"
-msgstr "Decimales de la unidad de compra"
+msgstr "Decimales de Unidad de Compra"
 
 msgctxt "field:stock.move,purchase_unit_price:"
 msgid "Purchase Unit Price"
-msgstr "Precio unitario de compra"
+msgstr "Precio Unitario de Compra"
 
 msgctxt "field:stock.move,purchase_visible:"
 msgid "Purchase Visible"
-msgstr "Compra visible"
+msgstr "Compra Visible"
 
 msgctxt "field:stock.move,supplier:"
 msgid "Supplier"
@@ -777,11 +747,11 @@ msgstr "Facturas"
 
 msgctxt "model:ir.action,name:act_open_supplier"
 msgid "Parties associated to Purchases"
-msgstr "Terceros asociados a compras"
+msgstr "Proveedores"
 
 msgctxt "model:ir.action,name:act_purchase_configuration_form"
 msgid "Purchase Configuration"
-msgstr "Configuración Compras"
+msgstr "Configuración de Compras"
 
 msgctxt "model:ir.action,name:act_purchase_form"
 msgid "Purchases"
@@ -791,19 +761,6 @@ msgctxt "model:ir.action,name:act_purchase_form2"
 msgid "Purchases"
 msgstr "Compras"
 
-msgctxt "model:ir.action,name:act_purchase_form_confirmed"
-msgid "Confirmed Purchases"
-msgstr "Compras Confirmadas"
-
-msgctxt "model:ir.action,name:act_purchase_form_draft"
-msgid "Draft Purchases"
-msgstr "Compras en Borrador"
-
-msgctxt "model:ir.action,name:act_purchase_form_quotation"
-msgid "Purchases in Quotation"
-msgstr "Compras en Cotización"
-
-#, fuzzy
 msgctxt "model:ir.action,name:act_return_form"
 msgid "Returns"
 msgstr "Devolución"
@@ -824,6 +781,25 @@ msgctxt "model:ir.action,name:wizard_shipment_handle_exception"
 msgid "Handle Shipment Exception"
 msgstr "Gestionar Excepción de Envío"
 
+msgctxt "model:ir.action.act_window.domain,name:act_purchase_form_domain_all"
+msgid "All"
+msgstr "Todo"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_purchase_form_domain_confirmed"
+msgid "Confirmed"
+msgstr "Confirmada"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_purchase_form_domain_draft"
+msgid "Draft"
+msgstr "Borrador"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_purchase_form_domain_quotation"
+msgid "Quotation"
+msgstr "Cotización"
+
 msgctxt "model:ir.sequence,name:sequence_purchase"
 msgid "Purchase"
 msgstr "Compra"
@@ -842,63 +818,47 @@ msgstr "Compras"
 
 msgctxt "model:ir.ui.menu,name:menu_purchase_configuration"
 msgid "Purchase Configuration"
-msgstr "Configuration Compras"
+msgstr "Configuración de Compras"
 
 msgctxt "model:ir.ui.menu,name:menu_purchase_form"
 msgid "Purchases"
 msgstr "Compras"
 
-msgctxt "model:ir.ui.menu,name:menu_purchase_form_confirmed"
-msgid "Confirmed Purchases"
-msgstr "Compras Confirmadas"
-
-msgctxt "model:ir.ui.menu,name:menu_purchase_form_draft"
-msgid "Draft Purchases"
-msgstr "Compras en Borrador"
-
-msgctxt "model:ir.ui.menu,name:menu_purchase_form_quotation"
-msgid "Purchases in Quotation"
-msgstr "Compras en Cotización"
-
 msgctxt "model:ir.ui.menu,name:menu_reporting"
 msgid "Reporting"
 msgstr "Informes"
 
 msgctxt "model:ir.ui.menu,name:menu_supplier"
 msgid "Parties associated to Purchases"
-msgstr "Terceros asociados a compras"
+msgstr "Proveedores"
 
 msgctxt "model:purchase.configuration,name:"
 msgid "Purchase Configuration"
-msgstr "Configuración compras"
+msgstr "Configuración de Compras"
 
 msgctxt "model:purchase.handle.invoice.exception.ask,name:"
 msgid "Handle Invoice Exception"
-msgstr "Gestionar Excepción de factura"
+msgstr "Gestionar Excepción de Factura"
 
 msgctxt "model:purchase.handle.shipment.exception.ask,name:"
 msgid "Handle Shipment Exception"
-msgstr "Gestionar Excepción de envío"
+msgstr "Gestionar Excepción de Envío"
 
 msgctxt "model:purchase.line,name:"
 msgid "Purchase Line"
 msgstr "Línea de Compra"
 
-msgctxt "model:purchase.line-account.invoice.line,name:"
-msgid "Purchase Line - Invoice Line"
-msgstr "Línea de Compra - Línea de Factura"
-
 msgctxt "model:purchase.line-account.tax,name:"
 msgid "Purchase Line - Tax"
-msgstr "Línea de compra - Impuesto"
+msgstr "Línea de Compra - Impuesto"
 
 msgctxt "model:purchase.line-ignored-stock.move,name:"
 msgid "Purchase Line - Ignored Move"
-msgstr "Línea de compra - Movimiento ignorado"
+msgstr "Línea de Compra - Movimiento Ignorado"
 
 msgctxt "model:purchase.line-recreated-stock.move,name:"
 msgid "Purchase Line - Ignored Move"
-msgstr "Línea de compra - Movimiento ignorado"
+msgstr "Línea de Compra - Movimiento Ignorado"
 
 msgctxt "model:purchase.product_supplier,name:"
 msgid "Product Supplier"
@@ -918,11 +878,11 @@ msgstr "Compra - Factura"
 
 msgctxt "model:purchase.purchase-ignored-account.invoice,name:"
 msgid "Purchase - Ignored Invoice"
-msgstr "Compra - Factura ignorada"
+msgstr "Compra - Factura Ignorada"
 
 msgctxt "model:purchase.purchase-recreated-account.invoice,name:"
 msgid "Purchase - Recreated Invoice"
-msgstr "Compra - Factura recreada"
+msgstr "Compra - Factura Recreada"
 
 msgctxt "model:res.group,name:group_purchase"
 msgid "Purchase"
@@ -930,7 +890,7 @@ msgstr "Compras"
 
 msgctxt "model:res.group,name:group_purchase_admin"
 msgid "Purchase Administrator"
-msgstr "Administrador de compras"
+msgstr "Administrador de Compras"
 
 msgctxt "odt:purchase.purchase:"
 msgid "Amount"
@@ -950,7 +910,7 @@ msgstr "Descripción:"
 
 msgctxt "odt:purchase.purchase:"
 msgid "Draft Purchase Order"
-msgstr "Pedido de compra en borrador"
+msgstr "Orden de Compra en Borrador"
 
 msgctxt "odt:purchase.purchase:"
 msgid "E-Mail:"
@@ -962,7 +922,7 @@ msgstr "Teléfono:"
 
 msgctxt "odt:purchase.purchase:"
 msgid "Purchase Order N°:"
-msgstr "Pedido de compra Nº:"
+msgstr "Orden de Compra Nº:"
 
 msgctxt "odt:purchase.purchase:"
 msgid "Quantity"
@@ -970,7 +930,7 @@ msgstr "Cantidad"
 
 msgctxt "odt:purchase.purchase:"
 msgid "Request for Quotation N°:"
-msgstr "Solicitud de presupuesto Nº:"
+msgstr "Solicitud de Cotización Nº:"
 
 msgctxt "odt:purchase.purchase:"
 msgid "Taxes"
@@ -1000,9 +960,10 @@ msgctxt "odt:purchase.purchase:"
 msgid "VAT:"
 msgstr "NIT:"
 
+#, fuzzy
 msgctxt "selection:account.invoice,purchase_exception_state:"
 msgid ""
-msgstr "Cuenta de impuesto"
+msgstr "Punto de Orden"
 
 msgctxt "selection:account.invoice,purchase_exception_state:"
 msgid "Ignored"
@@ -1014,11 +975,11 @@ msgstr "Recreada"
 
 msgctxt "selection:purchase.configuration,purchase_invoice_method:"
 msgid "Based On Order"
-msgstr "Basado en el pedido"
+msgstr "Basado en la Orden"
 
 msgctxt "selection:purchase.configuration,purchase_invoice_method:"
 msgid "Based On Shipment"
-msgstr "Basado en el envío"
+msgstr "Basado en el Envío"
 
 msgctxt "selection:purchase.configuration,purchase_invoice_method:"
 msgid "Manual"
@@ -1042,11 +1003,11 @@ msgstr "Título"
 
 msgctxt "selection:purchase.purchase,invoice_method:"
 msgid "Based On Order"
-msgstr "Basado en el pedido"
+msgstr "Basado en la Orden"
 
 msgctxt "selection:purchase.purchase,invoice_method:"
 msgid "Based On Shipment"
-msgstr "Basado en el envío"
+msgstr "Basado en el Envío"
 
 msgctxt "selection:purchase.purchase,invoice_method:"
 msgid "Manual"
@@ -1066,7 +1027,7 @@ msgstr "Pagada"
 
 msgctxt "selection:purchase.purchase,invoice_state:"
 msgid "Waiting"
-msgstr "En espera"
+msgstr "En Espera"
 
 msgctxt "selection:purchase.purchase,shipment_state:"
 msgid "Exception"
@@ -1082,7 +1043,7 @@ msgstr "Recibida"
 
 msgctxt "selection:purchase.purchase,shipment_state:"
 msgid "Waiting"
-msgstr "En espera"
+msgstr "En Espera"
 
 msgctxt "selection:purchase.purchase,state:"
 msgid "Canceled"
@@ -1104,9 +1065,10 @@ msgctxt "selection:purchase.purchase,state:"
 msgid "Quotation"
 msgstr "Cotización"
 
+#, fuzzy
 msgctxt "selection:stock.move,purchase_exception_state:"
 msgid ""
-msgstr "Cuenta de impuesto"
+msgstr "Punto de Orden"
 
 msgctxt "selection:stock.move,purchase_exception_state:"
 msgid "Ignored"
@@ -1120,14 +1082,6 @@ msgctxt "view:product.product:"
 msgid "Products"
 msgstr "Productos"
 
-msgctxt "view:product.product:"
-msgid "Suppliers"
-msgstr "Proveedores"
-
-msgctxt "view:product.template:"
-msgid "Product Suppliers"
-msgstr "Proveedores de productos"
-
 msgctxt "view:product.template:"
 msgid "Suppliers"
 msgstr "Proveedores"
@@ -1142,23 +1096,15 @@ msgstr "Seleccione facturas a recrear"
 
 msgctxt "view:purchase.handle.invoice.exception.ask:"
 msgid "Handle Invoice Exception"
-msgstr "Gestionar excepción de factura"
+msgstr "Gestionar Excepción de Factura"
 
 msgctxt "view:purchase.handle.shipment.exception.ask:"
 msgid "Choose move to recreate"
 msgstr "Seleccione movimientos a recrear"
 
 msgctxt "view:purchase.handle.shipment.exception.ask:"
-msgid "Choose moves to recreate"
-msgstr "Seleccione movimientos a recrear"
-
-msgctxt "view:purchase.handle.shipment.exception.ask:"
 msgid "Handle shipment Exception"
-msgstr "Gestionar excepción de envío"
-
-msgctxt "view:purchase.handle.shipment.exception.ask:"
-msgid "Recreated Moves"
-msgstr "Movimientos recreados"
+msgstr "Gestionar Excepción de Envío"
 
 msgctxt "view:purchase.line:"
 msgid "General"
@@ -1173,32 +1119,28 @@ msgid "Notes"
 msgstr "Notas"
 
 msgctxt "view:purchase.line:"
-msgid "Products"
-msgstr "Productos"
-
-msgctxt "view:purchase.line:"
 msgid "Purchase Line"
-msgstr "Línea de compra"
+msgstr "Línea de Compra"
 
 msgctxt "view:purchase.line:"
 msgid "Purchase Lines"
-msgstr "Líneas de compra"
+msgstr "Líneas de Compra"
 
 msgctxt "view:purchase.product_supplier.price:"
 msgid "Product Supplier Price"
-msgstr "Precio del proveedor del producto"
+msgstr "Precio del Proveedor del Producto"
 
 msgctxt "view:purchase.product_supplier.price:"
 msgid "Product Supplier Prices"
-msgstr "Precios del proveedor del producto"
+msgstr "Precios del Proveedor del Producto"
 
 msgctxt "view:purchase.product_supplier:"
 msgid "Product Supplier"
-msgstr "Proveedor del producto"
+msgstr "Proveedor de Producto"
 
 msgctxt "view:purchase.product_supplier:"
 msgid "Product Suppliers"
-msgstr "Proveedores de producto"
+msgstr "Proveedores de Producto"
 
 msgctxt "view:purchase.purchase:"
 msgid "Cancel"
@@ -1214,25 +1156,17 @@ msgstr "Borrador"
 
 msgctxt "view:purchase.purchase:"
 msgid "Handle Invoice Exception"
-msgstr "Gestionar excepción de factura"
+msgstr "Gestionar Excepción de Factura"
 
 msgctxt "view:purchase.purchase:"
 msgid "Handle Shipment Exception"
-msgstr "Gestionar excepción de envío"
+msgstr "Gestionar Excepción de Envío"
 
 msgctxt "view:purchase.purchase:"
 msgid "Invoices"
 msgstr "Facturas"
 
 msgctxt "view:purchase.purchase:"
-msgid "Lines"
-msgstr "Líneas"
-
-msgctxt "view:purchase.purchase:"
-msgid "Moves"
-msgstr "Movimientos"
-
-msgctxt "view:purchase.purchase:"
 msgid "Other Info"
 msgstr "Info Adicional"
 
@@ -1245,12 +1179,8 @@ msgid "Purchases"
 msgstr "Compras"
 
 msgctxt "view:purchase.purchase:"
-msgid "Quotation"
-msgstr "Cotización"
-
-msgctxt "view:purchase.purchase:"
 msgid "Quote"
-msgstr "Presupuesto"
+msgstr "Cotizar"
 
 msgctxt "view:purchase.purchase:"
 msgid "Shipments"
diff --git a/locale/es_ES.po b/locale/es_ES.po
index 3d62601..7b4bc5d 100644
--- a/locale/es_ES.po
+++ b/locale/es_ES.po
@@ -3,12 +3,12 @@ msgid ""
 msgstr "Content-Type: text/plain; charset=utf-8\n"
 
 msgctxt "error:account.invoice:"
-msgid "You can not delete invoices that come from a purchase!"
-msgstr "No puede eliminar facturas que vienen de una compra."
+msgid "You can not delete invoices that come from a purchase."
+msgstr "No puede borrar facturas generadas por compras."
 
 msgctxt "error:account.invoice:"
 msgid "You cannot reset to draft an invoice generated by a purchase."
-msgstr "No puede restablecer a borrador una factura generada por una compra."
+msgstr "No puede restaurar a borrador una factura generada por una compra."
 
 msgctxt "error:product.template:"
 msgid ""
@@ -17,42 +17,53 @@ msgstr ""
 "Los precios de compra están basados en la UdM de compra. ¿Desea cambiarlo?"
 
 msgctxt "error:purchase.line:"
-msgid "It misses an \"Account Expense\" on product \"%s\"!"
-msgstr "Al producto \"%s\" le falta una \"Cuenta de gastos\"."
+msgid ""
+"Product \"%(product)s\" of purchase %(purchase)s misses an expense account."
+msgstr ""
+"Falta la cuenta a pagar del product \"%(product)s\" de la compra "
+"%(purchase)s."
 
 msgctxt "error:purchase.line:"
-msgid "It misses an \"account expense\" default property!"
-msgstr "Falta una propiedad por defecto de \"Cuenta de gastos\"."
+msgid "Purchase \"%(purchase)s\" misses an \"account expense\" default property."
+msgstr ""
+"Falta la propiedad \"cuenta a pagar\" por defecto de la compra "
+"\"%(purchase)s\"."
 
 msgctxt "error:purchase.line:"
-msgid "The supplier location is required!"
-msgstr "La ubicación de proveedor es requerida."
+msgid "Purchase \"%(purchase)s\" misses the supplier location for line \"%(line)s\"."
+msgstr ""
+"Falta la ubicación del proveedor en la línea \"%(line)s\" de la compra "
+"\"%(purchase)s\"."
 
 msgctxt "error:purchase.purchase:"
-msgid "A warehouse must be defined for the quotation."
-msgstr "Debe indicar un almacén en el presupuesto."
+msgid "A warehouse must be defined for quotation of sale \"%s\"."
+msgstr "Se debe definir un almacén para el presupuesto de venta \"%s\"."
 
 msgctxt "error:purchase.purchase:"
-msgid "Invoice addresses must be defined for the quotation."
-msgstr "Debe indicar la dirección de facturación en el presupuesto."
+msgid "Invoice address must be defined for quotation of sale \"%s\"."
+msgstr ""
+"Se debe definir una dirección de facturación para el presupuesto de venta "
+"\"%s\"."
 
 msgctxt "error:purchase.purchase:"
-msgid "It misses an \"Account Payable\" on the party \"%s\"!"
-msgstr "Al tercero \"%s\" le falta una \"Cuenta a pagar\"."
+msgid "Missing \"Account Payable\" on party \"%s\"."
+msgstr "Falta la \"Cuenta a pagar\" en el tercer \"%s\"."
 
 msgctxt "error:purchase.purchase:"
-msgid "Purchase \"%s\" must be cancelled before deletion!"
-msgstr "La compra \"%s\" debe ser cancelada antes de ser eliminada."
+msgid "Purchase \"%s\" must be cancelled before deletion."
+msgstr "Debe cancelar la compra \"%s\" antes de borrar."
 
 msgctxt "error:stock.shipment.in.return:"
 msgid "You cannot reset to draft a move generated by a purchase."
-msgstr ""
-"No puede restablecer a borrador un movimiento generado por una compra."
+msgstr "No puede restaurar a borrador un movimiento generado por una compra."
 
 msgctxt "error:stock.shipment.in:"
-msgid "You cannot reset to draft a move generated by a purchase."
+msgid ""
+"You cannot reset to draft move \"%s\" because it was generated by a "
+"purchase."
 msgstr ""
-"No puede restablecer a borrador un movimiento generado por una compra."
+"No puede restaurar a borrador el movimiento \"%s\" porque se generó mediante"
+" una compra."
 
 msgctxt "field:account.invoice,purchase_exception_state:"
 msgid "Exception State"
@@ -62,10 +73,6 @@ msgctxt "field:account.invoice,purchases:"
 msgid "Purchases"
 msgstr "Compras"
 
-msgctxt "field:account.invoice.line,purchase_lines:"
-msgid "Purchase Lines"
-msgstr "Líneas de compra"
-
 msgctxt "field:product.template,product_suppliers:"
 msgid "Suppliers"
 msgstr "Proveedores"
@@ -96,7 +103,7 @@ msgstr "Método de facturación"
 
 msgctxt "field:purchase.configuration,purchase_sequence:"
 msgid "Purchase Reference Sequence"
-msgstr "Secuencia pedidos de compra"
+msgstr "Secuencia de pedidos de compra"
 
 msgctxt "field:purchase.configuration,rec_name:"
 msgid "Name"
@@ -246,38 +253,6 @@ msgctxt "field:purchase.line,write_uid:"
 msgid "Write User"
 msgstr "Usuario modificación"
 
-msgctxt "field:purchase.line-account.invoice.line,create_date:"
-msgid "Create Date"
-msgstr "Fecha creación"
-
-msgctxt "field:purchase.line-account.invoice.line,create_uid:"
-msgid "Create User"
-msgstr "Usuario creación"
-
-msgctxt "field:purchase.line-account.invoice.line,id:"
-msgid "ID"
-msgstr "ID"
-
-msgctxt "field:purchase.line-account.invoice.line,invoice_line:"
-msgid "Invoice Line"
-msgstr "Línea de factura"
-
-msgctxt "field:purchase.line-account.invoice.line,purchase_line:"
-msgid "Purchase Line"
-msgstr "Línea de compra"
-
-msgctxt "field:purchase.line-account.invoice.line,rec_name:"
-msgid "Name"
-msgstr "Nombre"
-
-msgctxt "field:purchase.line-account.invoice.line,write_date:"
-msgid "Write Date"
-msgstr "Fecha modificación"
-
-msgctxt "field:purchase.line-account.invoice.line,write_uid:"
-msgid "Write User"
-msgstr "Usuario modificación"
-
 msgctxt "field:purchase.line-account.tax,create_date:"
 msgid "Create Date"
 msgstr "Fecha creación"
@@ -722,10 +697,6 @@ msgctxt "field:stock.move,purchase_exception_state:"
 msgid "Exception State"
 msgstr "Estado excepción"
 
-msgctxt "field:stock.move,purchase_line:"
-msgid "Purchase Line"
-msgstr "Línea de compra"
-
 msgctxt "field:stock.move,purchase_quantity:"
 msgid "Purchase Quantity"
 msgstr "Cantidad de compra"
@@ -775,11 +746,11 @@ msgstr "Facturas"
 
 msgctxt "model:ir.action,name:act_open_supplier"
 msgid "Parties associated to Purchases"
-msgstr "Terceros asociados a compras"
+msgstr "Terceros con compras"
 
 msgctxt "model:ir.action,name:act_purchase_configuration_form"
 msgid "Purchase Configuration"
-msgstr "Configuración compras"
+msgstr "Configuración de compras"
 
 msgctxt "model:ir.action,name:act_purchase_form"
 msgid "Purchases"
@@ -789,18 +760,6 @@ msgctxt "model:ir.action,name:act_purchase_form2"
 msgid "Purchases"
 msgstr "Compras"
 
-msgctxt "model:ir.action,name:act_purchase_form_confirmed"
-msgid "Confirmed Purchases"
-msgstr "Compras confirmadas"
-
-msgctxt "model:ir.action,name:act_purchase_form_draft"
-msgid "Draft Purchases"
-msgstr "Compras en borrador"
-
-msgctxt "model:ir.action,name:act_purchase_form_quotation"
-msgid "Purchases in Quotation"
-msgstr "Compras en presupuesto"
-
 msgctxt "model:ir.action,name:act_return_form"
 msgid "Returns"
 msgstr "Devolver"
@@ -821,6 +780,25 @@ msgctxt "model:ir.action,name:wizard_shipment_handle_exception"
 msgid "Handle Shipment Exception"
 msgstr "Gestionar excepción de envío"
 
+msgctxt "model:ir.action.act_window.domain,name:act_purchase_form_domain_all"
+msgid "All"
+msgstr "Todo"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_purchase_form_domain_confirmed"
+msgid "Confirmed"
+msgstr "Confirmado"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_purchase_form_domain_draft"
+msgid "Draft"
+msgstr "Borrador"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_purchase_form_domain_quotation"
+msgid "Quotation"
+msgstr "Presupuesto"
+
 msgctxt "model:ir.sequence,name:sequence_purchase"
 msgid "Purchase"
 msgstr "Compra"
@@ -839,35 +817,23 @@ msgstr "Compras"
 
 msgctxt "model:ir.ui.menu,name:menu_purchase_configuration"
 msgid "Purchase Configuration"
-msgstr "Configuración compras"
+msgstr "Compras"
 
 msgctxt "model:ir.ui.menu,name:menu_purchase_form"
 msgid "Purchases"
 msgstr "Compras"
 
-msgctxt "model:ir.ui.menu,name:menu_purchase_form_confirmed"
-msgid "Confirmed Purchases"
-msgstr "Confirmadas"
-
-msgctxt "model:ir.ui.menu,name:menu_purchase_form_draft"
-msgid "Draft Purchases"
-msgstr "Borrador"
-
-msgctxt "model:ir.ui.menu,name:menu_purchase_form_quotation"
-msgid "Purchases in Quotation"
-msgstr "Presupuestadas"
-
 msgctxt "model:ir.ui.menu,name:menu_reporting"
 msgid "Reporting"
 msgstr "Informes"
 
 msgctxt "model:ir.ui.menu,name:menu_supplier"
 msgid "Parties associated to Purchases"
-msgstr "Terceros asociados a compras"
+msgstr "Terceros con compras"
 
 msgctxt "model:purchase.configuration,name:"
 msgid "Purchase Configuration"
-msgstr "Configuración compras"
+msgstr "Configuración de compras"
 
 msgctxt "model:purchase.handle.invoice.exception.ask,name:"
 msgid "Handle Invoice Exception"
@@ -881,10 +847,6 @@ msgctxt "model:purchase.line,name:"
 msgid "Purchase Line"
 msgstr "Línea de compra"
 
-msgctxt "model:purchase.line-account.invoice.line,name:"
-msgid "Purchase Line - Invoice Line"
-msgstr "Línea de compra - Línea de factura"
-
 msgctxt "model:purchase.line-account.tax,name:"
 msgid "Purchase Line - Tax"
 msgstr "Línea de compra - Impuesto"
@@ -1117,21 +1079,13 @@ msgctxt "view:product.product:"
 msgid "Products"
 msgstr "Productos"
 
-msgctxt "view:product.product:"
-msgid "Suppliers"
-msgstr "Proveedores"
-
-msgctxt "view:product.template:"
-msgid "Product Suppliers"
-msgstr "Proveedores de productos"
-
 msgctxt "view:product.template:"
 msgid "Suppliers"
 msgstr "Proveedores"
 
 msgctxt "view:purchase.configuration:"
 msgid "Purchase Configuration"
-msgstr "Configuración compras"
+msgstr "Configuración de compras"
 
 msgctxt "view:purchase.handle.invoice.exception.ask:"
 msgid "Choose invoices to recreate"
@@ -1146,17 +1100,9 @@ msgid "Choose move to recreate"
 msgstr "Seleccione movimientos a recrear"
 
 msgctxt "view:purchase.handle.shipment.exception.ask:"
-msgid "Choose moves to recreate"
-msgstr "Seleccione movimientos a recrear"
-
-msgctxt "view:purchase.handle.shipment.exception.ask:"
 msgid "Handle shipment Exception"
 msgstr "Gestionar excepción de envío"
 
-msgctxt "view:purchase.handle.shipment.exception.ask:"
-msgid "Recreated Moves"
-msgstr "Movimientos recreados"
-
 msgctxt "view:purchase.line:"
 msgid "General"
 msgstr "General"
@@ -1170,10 +1116,6 @@ msgid "Notes"
 msgstr "Notas"
 
 msgctxt "view:purchase.line:"
-msgid "Products"
-msgstr "Productos"
-
-msgctxt "view:purchase.line:"
 msgid "Purchase Line"
 msgstr "Línea de compra"
 
@@ -1222,14 +1164,6 @@ msgid "Invoices"
 msgstr "Facturas"
 
 msgctxt "view:purchase.purchase:"
-msgid "Lines"
-msgstr "Líneas"
-
-msgctxt "view:purchase.purchase:"
-msgid "Moves"
-msgstr "Movimientos"
-
-msgctxt "view:purchase.purchase:"
 msgid "Other Info"
 msgstr "Información adicional"
 
@@ -1242,10 +1176,6 @@ msgid "Purchases"
 msgstr "Compras"
 
 msgctxt "view:purchase.purchase:"
-msgid "Quotation"
-msgstr "Presupuesto"
-
-msgctxt "view:purchase.purchase:"
 msgid "Quote"
 msgstr "Presupuesto"
 
diff --git a/locale/fr_FR.po b/locale/fr_FR.po
index 3f87827..c1791eb 100644
--- a/locale/fr_FR.po
+++ b/locale/fr_FR.po
@@ -3,12 +3,8 @@ msgid ""
 msgstr "Content-Type: text/plain; charset=utf-8\n"
 
 msgctxt "error:account.invoice:"
-msgid "You can not delete invoices that come from a purchase!"
-msgstr "Vous ne pouvez pas supprimer une facture qui provient d'un achat"
-
-msgctxt "error:account.invoice:"
-msgid "You can not delete invoices that come from a purchase!"
-msgstr "Vous ne pouvez pas supprimer une facture qui provient d'un achat"
+msgid "You can not delete invoices that come from a purchase."
+msgstr "Vous ne pouvez supprimer une facture qui provient d'un achat."
 
 msgctxt "error:account.invoice:"
 msgid "You cannot reset to draft an invoice generated by a purchase."
@@ -33,64 +29,51 @@ msgstr ""
 "modifier ?"
 
 msgctxt "error:purchase.line:"
-msgid "It misses an \"Account Expense\" on product \"%s\"!"
-msgstr "Il manque un compte de charge sur le produit \"%s\" !"
-
-msgctxt "error:purchase.line:"
-msgid "It misses an \"Account Expense\" on product \"%s\"!"
-msgstr "Il manque un compte de charge sur le produit \"%s\" !"
-
-msgctxt "error:purchase.line:"
-msgid "It misses an \"account expense\" default property!"
-msgstr "il manque une propriété par défaut \"compte de charge\" !"
-
-msgctxt "error:purchase.line:"
-msgid "It misses an \"account expense\" default property!"
-msgstr "il manque une propriété par défaut \"compte de charge\" !"
+msgid ""
+"Product \"%(product)s\" of purchase %(purchase)s misses an expense account."
+msgstr ""
+"Le produit \"%(product)s\" de l'achat %(purchase)s n'a pas de compte de "
+"charge."
 
 msgctxt "error:purchase.line:"
-msgid "The supplier location is required!"
-msgstr "L'emplacement fournisseur est requis !"
+msgid "Purchase \"%(purchase)s\" misses an \"account expense\" default property."
+msgstr ""
+"La propriété par défaut \"compte de charge\" est absente de l'achat "
+"\"%(purchase)s\""
 
 msgctxt "error:purchase.line:"
-msgid "The supplier location is required!"
-msgstr "L'emplacement fournisseur est requis !"
-
-msgctxt "error:purchase.purchase:"
-msgid "A warehouse must be defined for the quotation."
-msgstr "Un entrepôt doit être défini pour le devis"
-
-msgctxt "error:purchase.purchase:"
-msgid "Invoice addresses must be defined for the quotation."
-msgstr "L'adresse de facturation doit être définie pour le devis."
+msgid "Purchase \"%(purchase)s\" misses the supplier location for line \"%(line)s\"."
+msgstr ""
+"L'emplacement fournisseur est manquant pour la ligne \"%(line)s\" de l'achat"
+" \"%(purchase)s\""
 
 msgctxt "error:purchase.purchase:"
-msgid "Invoice addresses must be defined for the quotation."
-msgstr "L'adresse de facturation doit être définie pour le devis."
+msgid "A warehouse must be defined for quotation of sale \"%s\"."
+msgstr "Un entrepôt doit être défini pour le devis \"%s\""
 
 msgctxt "error:purchase.purchase:"
-msgid "It misses an \"Account Payable\" on the party \"%s\"!"
-msgstr "Il manque un compte à payer sur le tiers \"%s\" !"
+msgid "Invoice address must be defined for quotation of sale \"%s\"."
+msgstr "L'adresse de facturation doit être définie pour le devis \"%s\". "
 
 msgctxt "error:purchase.purchase:"
-msgid "It misses an \"Account Payable\" on the party \"%s\"!"
-msgstr "Il manque un compte à payer sur le tiers \"%s\" !"
+msgid "Missing \"Account Payable\" on party \"%s\"."
+msgstr "Le compte à payer est manquant sur le tiers \"%s\"."
 
 msgctxt "error:purchase.purchase:"
-msgid "Purchase \"%s\" must be cancelled before deletion!"
-msgstr "L'achat \"%s\" doit être annulé avant suppression"
+msgid "Purchase \"%s\" must be cancelled before deletion."
+msgstr "La commande \"%s\" doit être annulée avant sa suppression"
 
 msgctxt "error:stock.shipment.in.return:"
 msgid "You cannot reset to draft a move generated by a purchase."
 msgstr "Vous ne pouvez pas réinitialiser un mouvement généré par un achat."
 
 msgctxt "error:stock.shipment.in:"
-msgid "You cannot reset to draft a move generated by a purchase."
-msgstr "Vous ne pouvez pas réinitialiser un mouvement généré par un achat."
-
-msgctxt "error:stock.shipment.in:"
-msgid "You cannot reset to draft a move generated by a purchase."
-msgstr "Vous ne pouvez pas réinitialiser un mouvement généré par un achat."
+msgid ""
+"You cannot reset to draft move \"%s\" because it was generated by a "
+"purchase."
+msgstr ""
+"vous ne pouvez remettre le mouvement \"%s\" en brouillon car il a été généré"
+" par un achat."
 
 msgctxt "field:account.invoice,purchase_exception_state:"
 msgid "Exception State"
@@ -100,10 +83,6 @@ msgctxt "field:account.invoice,purchases:"
 msgid "Purchases"
 msgstr "Achats"
 
-msgctxt "field:account.invoice.line,purchase_lines:"
-msgid "Purchase Lines"
-msgstr "Lignes d'achat"
-
 msgctxt "field:product.template,product_suppliers:"
 msgid "Suppliers"
 msgstr "Fournisseurs"
@@ -284,38 +263,6 @@ msgctxt "field:purchase.line,write_uid:"
 msgid "Write User"
 msgstr "Mis à jour par"
 
-msgctxt "field:purchase.line-account.invoice.line,create_date:"
-msgid "Create Date"
-msgstr "Date de création"
-
-msgctxt "field:purchase.line-account.invoice.line,create_uid:"
-msgid "Create User"
-msgstr "Créé par"
-
-msgctxt "field:purchase.line-account.invoice.line,id:"
-msgid "ID"
-msgstr "ID"
-
-msgctxt "field:purchase.line-account.invoice.line,invoice_line:"
-msgid "Invoice Line"
-msgstr "Ligne de Facture"
-
-msgctxt "field:purchase.line-account.invoice.line,purchase_line:"
-msgid "Purchase Line"
-msgstr "Ligne d'achat"
-
-msgctxt "field:purchase.line-account.invoice.line,rec_name:"
-msgid "Name"
-msgstr "Nom"
-
-msgctxt "field:purchase.line-account.invoice.line,write_date:"
-msgid "Write Date"
-msgstr "Date de mise à jour"
-
-msgctxt "field:purchase.line-account.invoice.line,write_uid:"
-msgid "Write User"
-msgstr "Mis à jour par"
-
 msgctxt "field:purchase.line-account.tax,create_date:"
 msgid "Create Date"
 msgstr "Date de création"
@@ -760,10 +707,6 @@ msgctxt "field:stock.move,purchase_exception_state:"
 msgid "Exception State"
 msgstr "État d'exception"
 
-msgctxt "field:stock.move,purchase_line:"
-msgid "Purchase Line"
-msgstr "Ligne d'achat"
-
 msgctxt "field:stock.move,purchase_quantity:"
 msgid "Purchase Quantity"
 msgstr "Quantité d'achat"
@@ -827,18 +770,6 @@ msgctxt "model:ir.action,name:act_purchase_form2"
 msgid "Purchases"
 msgstr "Achats"
 
-msgctxt "model:ir.action,name:act_purchase_form_confirmed"
-msgid "Confirmed Purchases"
-msgstr "Achats confirmés"
-
-msgctxt "model:ir.action,name:act_purchase_form_draft"
-msgid "Draft Purchases"
-msgstr "Achats brouillons"
-
-msgctxt "model:ir.action,name:act_purchase_form_quotation"
-msgid "Purchases in Quotation"
-msgstr "Devis"
-
 msgctxt "model:ir.action,name:act_return_form"
 msgid "Returns"
 msgstr "Retours"
@@ -859,6 +790,25 @@ msgctxt "model:ir.action,name:wizard_shipment_handle_exception"
 msgid "Handle Shipment Exception"
 msgstr "Gérer l'exception d'expédition"
 
+msgctxt "model:ir.action.act_window.domain,name:act_purchase_form_domain_all"
+msgid "All"
+msgstr "Tous"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_purchase_form_domain_confirmed"
+msgid "Confirmed"
+msgstr "Confirmé"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_purchase_form_domain_draft"
+msgid "Draft"
+msgstr "Brouillon"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_purchase_form_domain_quotation"
+msgid "Quotation"
+msgstr "Devis"
+
 msgctxt "model:ir.sequence,name:sequence_purchase"
 msgid "Purchase"
 msgstr "Achat"
@@ -883,18 +833,6 @@ msgctxt "model:ir.ui.menu,name:menu_purchase_form"
 msgid "Purchases"
 msgstr "Achats"
 
-msgctxt "model:ir.ui.menu,name:menu_purchase_form_confirmed"
-msgid "Confirmed Purchases"
-msgstr "Achats confirmés"
-
-msgctxt "model:ir.ui.menu,name:menu_purchase_form_draft"
-msgid "Draft Purchases"
-msgstr "Achats brouillons"
-
-msgctxt "model:ir.ui.menu,name:menu_purchase_form_quotation"
-msgid "Purchases in Quotation"
-msgstr "Devis"
-
 msgctxt "model:ir.ui.menu,name:menu_reporting"
 msgid "Reporting"
 msgstr "Rapport"
@@ -919,10 +857,6 @@ msgctxt "model:purchase.line,name:"
 msgid "Purchase Line"
 msgstr "Ligne d'achat"
 
-msgctxt "model:purchase.line-account.invoice.line,name:"
-msgid "Purchase Line - Invoice Line"
-msgstr "Ligne d'achat - Ligne de facture"
-
 msgctxt "model:purchase.line-account.tax,name:"
 msgid "Purchase Line - Tax"
 msgstr "Ligne d'achat - Taxe"
@@ -1336,21 +1270,9 @@ msgid "Recreated"
 msgstr "Recréé"
 
 msgctxt "view:product.product:"
-msgid "Product Suppliers"
-msgstr "Fournisseurs"
-
-msgctxt "view:product.product:"
 msgid "Products"
 msgstr "produits"
 
-msgctxt "view:product.product:"
-msgid "Suppliers"
-msgstr "Fournisseurs"
-
-msgctxt "view:product.template:"
-msgid "Product Suppliers"
-msgstr "Produit Fournisseur"
-
 msgctxt "view:product.template:"
 msgid "Suppliers"
 msgstr "Fournisseurs"
@@ -1392,10 +1314,6 @@ msgid "Choose move to recreate"
 msgstr "Choisir le mouvement à recréer"
 
 msgctxt "view:purchase.handle.shipment.exception.ask:"
-msgid "Choose moves to recreate"
-msgstr "Choisir les mouvements à recréer"
-
-msgctxt "view:purchase.handle.shipment.exception.ask:"
 msgid "Handle shipment Exception"
 msgstr "Gérer l'exception d'expédition"
 
@@ -1403,10 +1321,6 @@ msgctxt "view:purchase.handle.shipment.exception.ask:"
 msgid "Handle shipment Exception"
 msgstr "Gérer l'exception d'expédition"
 
-msgctxt "view:purchase.handle.shipment.exception.ask:"
-msgid "Recreated Moves"
-msgstr "Mouvements recréés"
-
 msgctxt "view:purchase.line:"
 msgid "General"
 msgstr "Général"
@@ -1428,10 +1342,6 @@ msgid "Notes"
 msgstr "Notes"
 
 msgctxt "view:purchase.line:"
-msgid "Products"
-msgstr "Produits"
-
-msgctxt "view:purchase.line:"
 msgid "Purchase Line"
 msgstr "Ligne d'achat"
 
@@ -1520,14 +1430,6 @@ msgid "Handle Shipment Exception"
 msgstr "Gérer l'exception d'expédition"
 
 msgctxt "view:purchase.purchase:"
-msgid "Ignore Invoice Exception"
-msgstr "Ignorer l'exception de facturation"
-
-msgctxt "view:purchase.purchase:"
-msgid "Ignore Shipment Exception"
-msgstr "Ignorer l'exception d'expédition"
-
-msgctxt "view:purchase.purchase:"
 msgid "Invoices"
 msgstr "Factures"
 
@@ -1536,14 +1438,6 @@ msgid "Invoices"
 msgstr "Factures"
 
 msgctxt "view:purchase.purchase:"
-msgid "Lines"
-msgstr "Lignes"
-
-msgctxt "view:purchase.purchase:"
-msgid "Moves"
-msgstr "Mouvements"
-
-msgctxt "view:purchase.purchase:"
 msgid "Other Info"
 msgstr "Autre information"
 
@@ -1568,10 +1462,6 @@ msgid "Purchases"
 msgstr "Achats"
 
 msgctxt "view:purchase.purchase:"
-msgid "Quotation"
-msgstr "Devis"
-
-msgctxt "view:purchase.purchase:"
 msgid "Quote"
 msgstr "Devis"
 
diff --git a/locale/nl_NL.po b/locale/nl_NL.po
index c5a50b3..bf39673 100644
--- a/locale/nl_NL.po
+++ b/locale/nl_NL.po
@@ -3,7 +3,7 @@ msgid ""
 msgstr "Content-Type: text/plain; charset=utf-8\n"
 
 msgctxt "error:account.invoice:"
-msgid "You can not delete invoices that come from a purchase!"
+msgid "You can not delete invoices that come from a purchase."
 msgstr ""
 
 msgctxt "error:account.invoice:"
@@ -16,31 +16,32 @@ msgid ""
 msgstr ""
 
 msgctxt "error:purchase.line:"
-msgid "It misses an \"Account Expense\" on product \"%s\"!"
+msgid ""
+"Product \"%(product)s\" of purchase %(purchase)s misses an expense account."
 msgstr ""
 
 msgctxt "error:purchase.line:"
-msgid "It misses an \"account expense\" default property!"
+msgid "Purchase \"%(purchase)s\" misses an \"account expense\" default property."
 msgstr ""
 
 msgctxt "error:purchase.line:"
-msgid "The supplier location is required!"
+msgid "Purchase \"%(purchase)s\" misses the supplier location for line \"%(line)s\"."
 msgstr ""
 
 msgctxt "error:purchase.purchase:"
-msgid "A warehouse must be defined for the quotation."
+msgid "A warehouse must be defined for quotation of sale \"%s\"."
 msgstr ""
 
 msgctxt "error:purchase.purchase:"
-msgid "Invoice addresses must be defined for the quotation."
+msgid "Invoice address must be defined for quotation of sale \"%s\"."
 msgstr ""
 
 msgctxt "error:purchase.purchase:"
-msgid "It misses an \"Account Payable\" on the party \"%s\"!"
+msgid "Missing \"Account Payable\" on party \"%s\"."
 msgstr ""
 
 msgctxt "error:purchase.purchase:"
-msgid "Purchase \"%s\" must be cancelled before deletion!"
+msgid "Purchase \"%s\" must be cancelled before deletion."
 msgstr ""
 
 msgctxt "error:stock.shipment.in.return:"
@@ -48,7 +49,9 @@ msgid "You cannot reset to draft a move generated by a purchase."
 msgstr ""
 
 msgctxt "error:stock.shipment.in:"
-msgid "You cannot reset to draft a move generated by a purchase."
+msgid ""
+"You cannot reset to draft move \"%s\" because it was generated by a "
+"purchase."
 msgstr ""
 
 #, fuzzy
@@ -60,10 +63,6 @@ msgctxt "field:account.invoice,purchases:"
 msgid "Purchases"
 msgstr ""
 
-msgctxt "field:account.invoice.line,purchase_lines:"
-msgid "Purchase Lines"
-msgstr ""
-
 msgctxt "field:product.template,product_suppliers:"
 msgid "Suppliers"
 msgstr ""
@@ -268,40 +267,6 @@ msgctxt "field:purchase.line,write_uid:"
 msgid "Write User"
 msgstr ""
 
-msgctxt "field:purchase.line-account.invoice.line,create_date:"
-msgid "Create Date"
-msgstr ""
-
-msgctxt "field:purchase.line-account.invoice.line,create_uid:"
-msgid "Create User"
-msgstr ""
-
-msgctxt "field:purchase.line-account.invoice.line,id:"
-msgid "ID"
-msgstr ""
-
-#, fuzzy
-msgctxt "field:purchase.line-account.invoice.line,invoice_line:"
-msgid "Invoice Line"
-msgstr "Factuurregel"
-
-msgctxt "field:purchase.line-account.invoice.line,purchase_line:"
-msgid "Purchase Line"
-msgstr ""
-
-#, fuzzy
-msgctxt "field:purchase.line-account.invoice.line,rec_name:"
-msgid "Name"
-msgstr "Naam bijlage"
-
-msgctxt "field:purchase.line-account.invoice.line,write_date:"
-msgid "Write Date"
-msgstr ""
-
-msgctxt "field:purchase.line-account.invoice.line,write_uid:"
-msgid "Write User"
-msgstr ""
-
 msgctxt "field:purchase.line-account.tax,create_date:"
 msgid "Create Date"
 msgstr ""
@@ -796,10 +761,6 @@ msgctxt "field:stock.move,purchase_exception_state:"
 msgid "Exception State"
 msgstr "Uitzonderingstoestand"
 
-msgctxt "field:stock.move,purchase_line:"
-msgid "Purchase Line"
-msgstr ""
-
 msgctxt "field:stock.move,purchase_quantity:"
 msgid "Purchase Quantity"
 msgstr ""
@@ -866,18 +827,6 @@ msgctxt "model:ir.action,name:act_purchase_form2"
 msgid "Purchases"
 msgstr ""
 
-msgctxt "model:ir.action,name:act_purchase_form_confirmed"
-msgid "Confirmed Purchases"
-msgstr ""
-
-msgctxt "model:ir.action,name:act_purchase_form_draft"
-msgid "Draft Purchases"
-msgstr ""
-
-msgctxt "model:ir.action,name:act_purchase_form_quotation"
-msgid "Purchases in Quotation"
-msgstr ""
-
 msgctxt "model:ir.action,name:act_return_form"
 msgid "Returns"
 msgstr ""
@@ -901,6 +850,28 @@ msgctxt "model:ir.action,name:wizard_shipment_handle_exception"
 msgid "Handle Shipment Exception"
 msgstr "Zendinguitzondering afhandelen"
 
+msgctxt "model:ir.action.act_window.domain,name:act_purchase_form_domain_all"
+msgid "All"
+msgstr ""
+
+#, fuzzy
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_purchase_form_domain_confirmed"
+msgid "Confirmed"
+msgstr "Bevestigd"
+
+#, fuzzy
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_purchase_form_domain_draft"
+msgid "Draft"
+msgstr "Concept"
+
+#, fuzzy
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_purchase_form_domain_quotation"
+msgid "Quotation"
+msgstr "Offerte"
+
 msgctxt "model:ir.sequence,name:sequence_purchase"
 msgid "Purchase"
 msgstr ""
@@ -926,18 +897,6 @@ msgctxt "model:ir.ui.menu,name:menu_purchase_form"
 msgid "Purchases"
 msgstr ""
 
-msgctxt "model:ir.ui.menu,name:menu_purchase_form_confirmed"
-msgid "Confirmed Purchases"
-msgstr ""
-
-msgctxt "model:ir.ui.menu,name:menu_purchase_form_draft"
-msgid "Draft Purchases"
-msgstr ""
-
-msgctxt "model:ir.ui.menu,name:menu_purchase_form_quotation"
-msgid "Purchases in Quotation"
-msgstr ""
-
 #, fuzzy
 msgctxt "model:ir.ui.menu,name:menu_reporting"
 msgid "Reporting"
@@ -965,10 +924,6 @@ msgctxt "model:purchase.line,name:"
 msgid "Purchase Line"
 msgstr ""
 
-msgctxt "model:purchase.line-account.invoice.line,name:"
-msgid "Purchase Line - Invoice Line"
-msgstr ""
-
 msgctxt "model:purchase.line-account.tax,name:"
 msgid "Purchase Line - Tax"
 msgstr ""
@@ -1239,10 +1194,6 @@ msgid "Products"
 msgstr "Producten"
 
 msgctxt "view:product.template:"
-msgid "Product Suppliers"
-msgstr ""
-
-msgctxt "view:product.template:"
 msgid "Suppliers"
 msgstr ""
 
@@ -1271,11 +1222,6 @@ msgid "Handle shipment Exception"
 msgstr "Zendinguitzondering afhandelen"
 
 #, fuzzy
-msgctxt "view:purchase.handle.shipment.exception.ask:"
-msgid "Recreated Moves"
-msgstr "Opnieuw aangemaakte boekingen"
-
-#, fuzzy
 msgctxt "view:purchase.line:"
 msgid "General"
 msgstr "Algemeen"
@@ -1290,11 +1236,6 @@ msgctxt "view:purchase.line:"
 msgid "Notes"
 msgstr "Aantekeningen"
 
-#, fuzzy
-msgctxt "view:purchase.line:"
-msgid "Products"
-msgstr "Producten"
-
 msgctxt "view:purchase.line:"
 msgid "Purchase Line"
 msgstr ""
@@ -1351,16 +1292,6 @@ msgstr "Verkoopfacturen"
 
 #, fuzzy
 msgctxt "view:purchase.purchase:"
-msgid "Lines"
-msgstr "Regels"
-
-#, fuzzy
-msgctxt "view:purchase.purchase:"
-msgid "Moves"
-msgstr "Boekingen"
-
-#, fuzzy
-msgctxt "view:purchase.purchase:"
 msgid "Other Info"
 msgstr "Aanvullende informatie"
 
@@ -1372,11 +1303,6 @@ msgctxt "view:purchase.purchase:"
 msgid "Purchases"
 msgstr ""
 
-#, fuzzy
-msgctxt "view:purchase.purchase:"
-msgid "Quotation"
-msgstr "Offerte"
-
 msgctxt "view:purchase.purchase:"
 msgid "Quote"
 msgstr ""
diff --git a/locale/ru_RU.po b/locale/ru_RU.po
index acd777d..703403d 100644
--- a/locale/ru_RU.po
+++ b/locale/ru_RU.po
@@ -3,792 +3,716 @@ msgid ""
 msgstr "Content-Type: text/plain; charset=utf-8\n"
 
 msgctxt "error:account.invoice:"
-msgid "You can not delete invoices that come from a purchase!"
-msgstr ""
+msgid "You can not delete invoices that come from a purchase."
+msgstr "Вы не можете удалить инвойсы созданный из покупки."
 
 msgctxt "error:account.invoice:"
 msgid "You cannot reset to draft an invoice generated by a purchase."
-msgstr ""
+msgstr "Вы не можете сбросить в черновик инвойс созданный из покупки."
 
 msgctxt "error:product.template:"
 msgid ""
 "Purchase prices are based on the purchase uom, are you sure to change it?"
 msgstr ""
+"Цены покупки основаны на ед. измерения, вы действительно хотите изменить их?"
 
 msgctxt "error:purchase.line:"
-msgid "It misses an \"Account Expense\" on product \"%s\"!"
+msgid ""
+"Product \"%(product)s\" of purchase %(purchase)s misses an expense account."
 msgstr ""
+"У продукта \"%(product)s\" в покупке \"%(purchase)s\" отсутствует счет "
+"расходов."
 
 msgctxt "error:purchase.line:"
-msgid "It misses an \"account expense\" default property!"
-msgstr ""
+msgid "Purchase \"%(purchase)s\" misses an \"account expense\" default property."
+msgstr "У покупки \"%(purchase)s\" не заполнено поле \"Счет расходов\"."
 
 msgctxt "error:purchase.line:"
-msgid "The supplier location is required!"
+msgid "Purchase \"%(purchase)s\" misses the supplier location for line \"%(line)s\"."
 msgstr ""
+"У покупки \"%(purchase)s\" отсутствует местоположение заказчика в строке "
+"\"%(line)s\"."
 
 msgctxt "error:purchase.purchase:"
-msgid "A warehouse must be defined for the quotation."
-msgstr ""
+msgid "A warehouse must be defined for quotation of sale \"%s\"."
+msgstr "Должен быть указан склад для котировки продажи \"%s\"."
 
 msgctxt "error:purchase.purchase:"
-msgid "Invoice addresses must be defined for the quotation."
-msgstr ""
+msgid "Invoice address must be defined for quotation of sale \"%s\"."
+msgstr "Должен быть указан адрес инвойса для котировки продажи \"%s\"."
 
 msgctxt "error:purchase.purchase:"
-msgid "It misses an \"Account Payable\" on the party \"%s\"!"
-msgstr ""
+msgid "Missing \"Account Payable\" on party \"%s\"."
+msgstr "Отсутствует \"Счет кредиторов\" у контрагента \"%s\"."
 
 msgctxt "error:purchase.purchase:"
-msgid "Purchase \"%s\" must be cancelled before deletion!"
-msgstr ""
+msgid "Purchase \"%s\" must be cancelled before deletion."
+msgstr "Покупка \"%s\" должна быть отменена перед удалением."
 
 msgctxt "error:stock.shipment.in.return:"
 msgid "You cannot reset to draft a move generated by a purchase."
-msgstr ""
+msgstr "Вы не можете сбросить в черновик перемещение созданное из покупки."
 
 msgctxt "error:stock.shipment.in:"
-msgid "You cannot reset to draft a move generated by a purchase."
+msgid ""
+"You cannot reset to draft move \"%s\" because it was generated by a "
+"purchase."
 msgstr ""
+"Вы не можете сбросить в черновик перемещение \"%s\" так как оно создано из "
+"покупки."
 
 msgctxt "field:account.invoice,purchase_exception_state:"
 msgid "Exception State"
-msgstr ""
+msgstr "Состояние ситуации"
 
 msgctxt "field:account.invoice,purchases:"
 msgid "Purchases"
-msgstr ""
-
-msgctxt "field:account.invoice.line,purchase_lines:"
-msgid "Purchase Lines"
-msgstr ""
+msgstr "Покупки"
 
 msgctxt "field:product.template,product_suppliers:"
 msgid "Suppliers"
-msgstr ""
+msgstr "Поставщики"
 
 msgctxt "field:product.template,purchasable:"
 msgid "Purchasable"
-msgstr ""
+msgstr "Для покупки"
 
 msgctxt "field:product.template,purchase_uom:"
 msgid "Purchase UOM"
-msgstr ""
+msgstr "Покупка, ед. измерения"
 
 msgctxt "field:purchase.configuration,create_date:"
 msgid "Create Date"
-msgstr ""
+msgstr "Дата создания"
 
 msgctxt "field:purchase.configuration,create_uid:"
 msgid "Create User"
-msgstr ""
+msgstr "Создано пользователем"
 
 msgctxt "field:purchase.configuration,id:"
 msgid "ID"
-msgstr ""
+msgstr "ID"
 
 msgctxt "field:purchase.configuration,purchase_invoice_method:"
 msgid "Invoice Method"
-msgstr ""
+msgstr "Метод инвойса"
 
 msgctxt "field:purchase.configuration,purchase_sequence:"
 msgid "Purchase Reference Sequence"
-msgstr ""
+msgstr "Ссылка на нумерацию покупок"
 
-#, fuzzy
 msgctxt "field:purchase.configuration,rec_name:"
 msgid "Name"
 msgstr "Наименование"
 
 msgctxt "field:purchase.configuration,write_date:"
 msgid "Write Date"
-msgstr ""
+msgstr "Дата изменения"
 
 msgctxt "field:purchase.configuration,write_uid:"
 msgid "Write User"
-msgstr ""
+msgstr "Изменено пользователем"
 
 msgctxt "field:purchase.handle.invoice.exception.ask,domain_invoices:"
 msgid "Domain Invoices"
-msgstr ""
+msgstr "Домен инвойсов"
 
 msgctxt "field:purchase.handle.invoice.exception.ask,id:"
 msgid "ID"
-msgstr ""
+msgstr "ID"
 
 msgctxt "field:purchase.handle.invoice.exception.ask,recreate_invoices:"
 msgid "Recreate Invoices"
-msgstr ""
+msgstr "Создать заново инвойсы"
 
 msgctxt "field:purchase.handle.shipment.exception.ask,domain_moves:"
 msgid "Domain Moves"
-msgstr ""
+msgstr "Домен проводок"
 
 msgctxt "field:purchase.handle.shipment.exception.ask,id:"
 msgid "ID"
-msgstr ""
+msgstr "ID"
 
 msgctxt "field:purchase.handle.shipment.exception.ask,recreate_moves:"
 msgid "Recreate Moves"
-msgstr ""
+msgstr "Создать заново проводки"
 
 msgctxt "field:purchase.line,amount:"
 msgid "Amount"
-msgstr ""
+msgstr "Сумма"
 
 msgctxt "field:purchase.line,create_date:"
 msgid "Create Date"
-msgstr ""
+msgstr "Дата создания"
 
 msgctxt "field:purchase.line,create_uid:"
 msgid "Create User"
-msgstr ""
+msgstr "Создано пользователем"
 
 msgctxt "field:purchase.line,delivery_date:"
 msgid "Delivery Date"
-msgstr ""
+msgstr "Дата доставки"
 
-#, fuzzy
 msgctxt "field:purchase.line,description:"
 msgid "Description"
 msgstr "Описание"
 
-#, fuzzy
 msgctxt "field:purchase.line,from_location:"
 msgid "From Location"
-msgstr "Из места"
+msgstr "Из местоположения"
 
 msgctxt "field:purchase.line,id:"
 msgid "ID"
-msgstr ""
+msgstr "ID"
 
 msgctxt "field:purchase.line,invoice_lines:"
 msgid "Invoice Lines"
-msgstr ""
+msgstr "Строки инвойса"
 
 msgctxt "field:purchase.line,move_done:"
 msgid "Moves Done"
-msgstr ""
+msgstr "Перемещения выполнены"
 
 msgctxt "field:purchase.line,move_exception:"
 msgid "Moves Exception"
-msgstr ""
+msgstr "Особые ситуации перемещения"
 
-#, fuzzy
 msgctxt "field:purchase.line,moves:"
 msgid "Moves"
 msgstr "Перемещения"
 
 msgctxt "field:purchase.line,moves_ignored:"
 msgid "Ignored Moves"
-msgstr ""
+msgstr "Игнорированные проводки"
 
 msgctxt "field:purchase.line,moves_recreated:"
 msgid "Recreated Moves"
-msgstr ""
+msgstr "Созданные заново проводки"
 
 msgctxt "field:purchase.line,note:"
 msgid "Note"
-msgstr ""
+msgstr "Комментарий"
 
-#, fuzzy
 msgctxt "field:purchase.line,product:"
 msgid "Product"
-msgstr "Товарно материальные ценности (ТМЦ)"
+msgstr "Продукт"
 
 msgctxt "field:purchase.line,product_uom_category:"
 msgid "Product Uom Category"
-msgstr ""
+msgstr "Категория ед. измерения продукции"
 
 msgctxt "field:purchase.line,purchase:"
 msgid "Purchase"
-msgstr ""
+msgstr "Покупки"
 
-#, fuzzy
 msgctxt "field:purchase.line,quantity:"
 msgid "Quantity"
 msgstr "Кол-во"
 
-#, fuzzy
 msgctxt "field:purchase.line,rec_name:"
 msgid "Name"
 msgstr "Наименование"
 
-#, fuzzy
 msgctxt "field:purchase.line,sequence:"
 msgid "Sequence"
-msgstr "Последовательность"
+msgstr "Нумерация"
 
 msgctxt "field:purchase.line,taxes:"
 msgid "Taxes"
-msgstr ""
+msgstr "Налоги"
 
-#, fuzzy
 msgctxt "field:purchase.line,to_location:"
 msgid "To Location"
-msgstr "В место"
+msgstr "В местоположение"
 
-#, fuzzy
 msgctxt "field:purchase.line,type:"
 msgid "Type"
 msgstr "Тип"
 
-#, fuzzy
 msgctxt "field:purchase.line,unit:"
 msgid "Unit"
-msgstr "Штука"
+msgstr "Единица измерения"
 
-#, fuzzy
 msgctxt "field:purchase.line,unit_digits:"
 msgid "Unit Digits"
-msgstr "Группа цифр"
+msgstr "Кол-во цифр после запятой"
 
-#, fuzzy
 msgctxt "field:purchase.line,unit_price:"
 msgid "Unit Price"
 msgstr "Цена за единицу"
 
 msgctxt "field:purchase.line,write_date:"
 msgid "Write Date"
-msgstr ""
+msgstr "Дата изменения"
 
 msgctxt "field:purchase.line,write_uid:"
 msgid "Write User"
-msgstr ""
-
-msgctxt "field:purchase.line-account.invoice.line,create_date:"
-msgid "Create Date"
-msgstr ""
-
-msgctxt "field:purchase.line-account.invoice.line,create_uid:"
-msgid "Create User"
-msgstr ""
-
-msgctxt "field:purchase.line-account.invoice.line,id:"
-msgid "ID"
-msgstr ""
-
-msgctxt "field:purchase.line-account.invoice.line,invoice_line:"
-msgid "Invoice Line"
-msgstr ""
-
-msgctxt "field:purchase.line-account.invoice.line,purchase_line:"
-msgid "Purchase Line"
-msgstr ""
-
-#, fuzzy
-msgctxt "field:purchase.line-account.invoice.line,rec_name:"
-msgid "Name"
-msgstr "Наименование"
-
-msgctxt "field:purchase.line-account.invoice.line,write_date:"
-msgid "Write Date"
-msgstr ""
-
-msgctxt "field:purchase.line-account.invoice.line,write_uid:"
-msgid "Write User"
-msgstr ""
+msgstr "Изменено пользователем"
 
 msgctxt "field:purchase.line-account.tax,create_date:"
 msgid "Create Date"
-msgstr ""
+msgstr "Дата создания"
 
 msgctxt "field:purchase.line-account.tax,create_uid:"
 msgid "Create User"
-msgstr ""
+msgstr "Создано пользователем"
 
 msgctxt "field:purchase.line-account.tax,id:"
 msgid "ID"
-msgstr ""
+msgstr "ID"
 
 msgctxt "field:purchase.line-account.tax,line:"
 msgid "Purchase Line"
-msgstr ""
+msgstr "Строка покупки"
 
-#, fuzzy
 msgctxt "field:purchase.line-account.tax,rec_name:"
 msgid "Name"
 msgstr "Наименование"
 
 msgctxt "field:purchase.line-account.tax,tax:"
 msgid "Tax"
-msgstr ""
+msgstr "Налог"
 
 msgctxt "field:purchase.line-account.tax,write_date:"
 msgid "Write Date"
-msgstr ""
+msgstr "Дата изменения"
 
 msgctxt "field:purchase.line-account.tax,write_uid:"
 msgid "Write User"
-msgstr ""
+msgstr "Изменено пользователем"
 
 msgctxt "field:purchase.line-ignored-stock.move,create_date:"
 msgid "Create Date"
-msgstr ""
+msgstr "Дата создания"
 
 msgctxt "field:purchase.line-ignored-stock.move,create_uid:"
 msgid "Create User"
-msgstr ""
+msgstr "Создано пользователем"
 
 msgctxt "field:purchase.line-ignored-stock.move,id:"
 msgid "ID"
-msgstr ""
+msgstr "ID"
 
-#, fuzzy
 msgctxt "field:purchase.line-ignored-stock.move,move:"
 msgid "Move"
 msgstr "Перемещение"
 
 msgctxt "field:purchase.line-ignored-stock.move,purchase_line:"
 msgid "Purchase Line"
-msgstr ""
+msgstr "Строка покупки"
 
-#, fuzzy
 msgctxt "field:purchase.line-ignored-stock.move,rec_name:"
 msgid "Name"
 msgstr "Наименование"
 
 msgctxt "field:purchase.line-ignored-stock.move,write_date:"
 msgid "Write Date"
-msgstr ""
+msgstr "Дата изменения"
 
 msgctxt "field:purchase.line-ignored-stock.move,write_uid:"
 msgid "Write User"
-msgstr ""
+msgstr "Изменено пользователем"
 
 msgctxt "field:purchase.line-recreated-stock.move,create_date:"
 msgid "Create Date"
-msgstr ""
+msgstr "Дата создания"
 
 msgctxt "field:purchase.line-recreated-stock.move,create_uid:"
 msgid "Create User"
-msgstr ""
+msgstr "Создано пользователем"
 
 msgctxt "field:purchase.line-recreated-stock.move,id:"
 msgid "ID"
-msgstr ""
+msgstr "ID"
 
-#, fuzzy
 msgctxt "field:purchase.line-recreated-stock.move,move:"
 msgid "Move"
 msgstr "Перемещение"
 
 msgctxt "field:purchase.line-recreated-stock.move,purchase_line:"
 msgid "Purchase Line"
-msgstr ""
+msgstr "Строка покупки"
 
-#, fuzzy
 msgctxt "field:purchase.line-recreated-stock.move,rec_name:"
 msgid "Name"
 msgstr "Наименование"
 
 msgctxt "field:purchase.line-recreated-stock.move,write_date:"
 msgid "Write Date"
-msgstr ""
+msgstr "Дата изменения"
 
 msgctxt "field:purchase.line-recreated-stock.move,write_uid:"
 msgid "Write User"
-msgstr ""
+msgstr "Изменено пользователем"
 
-#, fuzzy
 msgctxt "field:purchase.product_supplier,code:"
 msgid "Code"
-msgstr "Код страны"
+msgstr "Код"
 
-#, fuzzy
 msgctxt "field:purchase.product_supplier,company:"
 msgid "Company"
-msgstr "Учет.орг."
+msgstr "Организация"
 
 msgctxt "field:purchase.product_supplier,create_date:"
 msgid "Create Date"
-msgstr ""
+msgstr "Дата создания"
 
 msgctxt "field:purchase.product_supplier,create_uid:"
 msgid "Create User"
-msgstr ""
+msgstr "Создано пользователем"
 
-#, fuzzy
 msgctxt "field:purchase.product_supplier,currency:"
 msgid "Currency"
-msgstr "Валюты"
+msgstr "Валюта"
 
 msgctxt "field:purchase.product_supplier,delivery_time:"
 msgid "Delivery Time"
-msgstr ""
+msgstr "Время доставки"
 
 msgctxt "field:purchase.product_supplier,id:"
 msgid "ID"
-msgstr ""
+msgstr "ID"
 
-#, fuzzy
 msgctxt "field:purchase.product_supplier,name:"
 msgid "Name"
 msgstr "Наименование"
 
-#, fuzzy
 msgctxt "field:purchase.product_supplier,party:"
 msgid "Supplier"
 msgstr "Поставщик"
 
 msgctxt "field:purchase.product_supplier,prices:"
 msgid "Prices"
-msgstr ""
+msgstr "Цены"
 
-#, fuzzy
 msgctxt "field:purchase.product_supplier,product:"
 msgid "Product"
-msgstr "Товарно материальные ценности (ТМЦ)"
+msgstr "Продукт"
 
-#, fuzzy
 msgctxt "field:purchase.product_supplier,rec_name:"
 msgid "Name"
 msgstr "Наименование"
 
-#, fuzzy
 msgctxt "field:purchase.product_supplier,sequence:"
 msgid "Sequence"
-msgstr "Последовательность"
+msgstr "Нумерация"
 
 msgctxt "field:purchase.product_supplier,write_date:"
 msgid "Write Date"
-msgstr ""
+msgstr "Дата изменения"
 
 msgctxt "field:purchase.product_supplier,write_uid:"
 msgid "Write User"
-msgstr ""
+msgstr "Изменено пользователем"
 
 msgctxt "field:purchase.product_supplier.price,create_date:"
 msgid "Create Date"
-msgstr ""
+msgstr "Дата создания"
 
 msgctxt "field:purchase.product_supplier.price,create_uid:"
 msgid "Create User"
-msgstr ""
+msgstr "Создано пользователем"
 
 msgctxt "field:purchase.product_supplier.price,id:"
 msgid "ID"
-msgstr ""
+msgstr "ID"
 
-#, fuzzy
 msgctxt "field:purchase.product_supplier.price,product_supplier:"
 msgid "Supplier"
 msgstr "Поставщик"
 
-#, fuzzy
 msgctxt "field:purchase.product_supplier.price,quantity:"
 msgid "Quantity"
 msgstr "Кол-во"
 
-#, fuzzy
 msgctxt "field:purchase.product_supplier.price,rec_name:"
 msgid "Name"
 msgstr "Наименование"
 
-#, fuzzy
 msgctxt "field:purchase.product_supplier.price,unit_price:"
 msgid "Unit Price"
 msgstr "Цена за единицу"
 
 msgctxt "field:purchase.product_supplier.price,write_date:"
 msgid "Write Date"
-msgstr ""
+msgstr "Дата изменения"
 
 msgctxt "field:purchase.product_supplier.price,write_uid:"
 msgid "Write User"
-msgstr ""
+msgstr "Изменено пользователем"
 
-#, fuzzy
 msgctxt "field:purchase.purchase,comment:"
 msgid "Comment"
 msgstr "Комментарии"
 
-#, fuzzy
 msgctxt "field:purchase.purchase,company:"
 msgid "Company"
-msgstr "Учет.орг."
+msgstr "Организация"
 
 msgctxt "field:purchase.purchase,create_date:"
 msgid "Create Date"
-msgstr ""
+msgstr "Дата создания"
 
 msgctxt "field:purchase.purchase,create_uid:"
 msgid "Create User"
-msgstr ""
+msgstr "Создано пользователем"
 
-#, fuzzy
 msgctxt "field:purchase.purchase,currency:"
 msgid "Currency"
-msgstr "Валюты"
+msgstr "Валюта"
 
 msgctxt "field:purchase.purchase,currency_digits:"
 msgid "Currency Digits"
-msgstr ""
+msgstr "Кол-во цифр валюты"
 
-#, fuzzy
 msgctxt "field:purchase.purchase,description:"
 msgid "Description"
 msgstr "Описание"
 
 msgctxt "field:purchase.purchase,id:"
 msgid "ID"
-msgstr ""
+msgstr "ID"
 
 msgctxt "field:purchase.purchase,invoice_address:"
 msgid "Invoice Address"
-msgstr ""
+msgstr "Адрес для инвойса"
 
 msgctxt "field:purchase.purchase,invoice_method:"
 msgid "Invoice Method"
-msgstr ""
+msgstr "Метод инвойса"
 
 msgctxt "field:purchase.purchase,invoice_state:"
 msgid "Invoice State"
-msgstr ""
+msgstr "Состояние инвойса"
 
 msgctxt "field:purchase.purchase,invoices:"
 msgid "Invoices"
-msgstr ""
+msgstr "Инвойсы"
 
 msgctxt "field:purchase.purchase,invoices_ignored:"
 msgid "Ignored Invoices"
-msgstr ""
+msgstr "Игнорированные инвойсы"
 
 msgctxt "field:purchase.purchase,invoices_recreated:"
 msgid "Recreated Invoices"
-msgstr ""
+msgstr "Созданные заново инвойсы"
 
-#, fuzzy
 msgctxt "field:purchase.purchase,lines:"
 msgid "Lines"
 msgstr "Строки"
 
-#, fuzzy
 msgctxt "field:purchase.purchase,moves:"
 msgid "Moves"
 msgstr "Перемещения"
 
-#, fuzzy
 msgctxt "field:purchase.purchase,party:"
 msgid "Party"
-msgstr "Организации"
+msgstr "Контрагент"
 
 msgctxt "field:purchase.purchase,party_lang:"
 msgid "Party Language"
-msgstr ""
+msgstr "Язык контрагента"
 
 msgctxt "field:purchase.purchase,payment_term:"
 msgid "Payment Term"
-msgstr ""
+msgstr "Правило оплаты"
 
 msgctxt "field:purchase.purchase,purchase_date:"
 msgid "Purchase Date"
-msgstr ""
+msgstr "Дата покупки"
 
-#, fuzzy
 msgctxt "field:purchase.purchase,rec_name:"
 msgid "Name"
 msgstr "Наименование"
 
-#, fuzzy
 msgctxt "field:purchase.purchase,reference:"
 msgid "Reference"
 msgstr "Ссылка"
 
 msgctxt "field:purchase.purchase,shipment_returns:"
 msgid "Shipment Returns"
-msgstr ""
+msgstr "Возврат"
 
 msgctxt "field:purchase.purchase,shipment_state:"
 msgid "Shipment State"
-msgstr ""
+msgstr "Состояние доставки"
 
 msgctxt "field:purchase.purchase,shipments:"
 msgid "Shipments"
-msgstr ""
+msgstr "Доставка"
 
-#, fuzzy
 msgctxt "field:purchase.purchase,state:"
 msgid "State"
-msgstr "Статус"
+msgstr "Состояние"
 
 msgctxt "field:purchase.purchase,supplier_reference:"
 msgid "Supplier Reference"
-msgstr ""
+msgstr "Ссылка на поставщика"
 
 msgctxt "field:purchase.purchase,tax_amount:"
 msgid "Tax"
-msgstr ""
+msgstr "Налог"
 
 msgctxt "field:purchase.purchase,tax_amount_cache:"
 msgid "Tax Cache"
-msgstr ""
+msgstr "Облагаемые налогом"
 
 msgctxt "field:purchase.purchase,total_amount:"
 msgid "Total"
-msgstr ""
+msgstr "Итого"
 
 msgctxt "field:purchase.purchase,total_amount_cache:"
 msgid "Total Cache"
-msgstr ""
+msgstr "Итого"
 
 msgctxt "field:purchase.purchase,untaxed_amount:"
 msgid "Untaxed"
-msgstr ""
+msgstr "Необлагаемые"
 
 msgctxt "field:purchase.purchase,untaxed_amount_cache:"
 msgid "Untaxed Cache"
-msgstr ""
+msgstr "Необлагаемые налогом"
 
-#, fuzzy
 msgctxt "field:purchase.purchase,warehouse:"
 msgid "Warehouse"
 msgstr "Товарный склад"
 
 msgctxt "field:purchase.purchase,write_date:"
 msgid "Write Date"
-msgstr ""
+msgstr "Дата изменения"
 
 msgctxt "field:purchase.purchase,write_uid:"
 msgid "Write User"
-msgstr ""
+msgstr "Изменено пользователем"
 
 msgctxt "field:purchase.purchase-account.invoice,create_date:"
 msgid "Create Date"
-msgstr ""
+msgstr "Дата создания"
 
 msgctxt "field:purchase.purchase-account.invoice,create_uid:"
 msgid "Create User"
-msgstr ""
+msgstr "Создано пользователем"
 
 msgctxt "field:purchase.purchase-account.invoice,id:"
 msgid "ID"
-msgstr ""
+msgstr "ID"
 
 msgctxt "field:purchase.purchase-account.invoice,invoice:"
 msgid "Invoice"
-msgstr ""
+msgstr "Инвойс"
 
 msgctxt "field:purchase.purchase-account.invoice,purchase:"
 msgid "Purchase"
-msgstr ""
+msgstr "Покупки"
 
-#, fuzzy
 msgctxt "field:purchase.purchase-account.invoice,rec_name:"
 msgid "Name"
 msgstr "Наименование"
 
 msgctxt "field:purchase.purchase-account.invoice,write_date:"
 msgid "Write Date"
-msgstr ""
+msgstr "Дата изменения"
 
 msgctxt "field:purchase.purchase-account.invoice,write_uid:"
 msgid "Write User"
-msgstr ""
+msgstr "Изменено пользователем"
 
 msgctxt "field:purchase.purchase-ignored-account.invoice,create_date:"
 msgid "Create Date"
-msgstr ""
+msgstr "Дата создания"
 
 msgctxt "field:purchase.purchase-ignored-account.invoice,create_uid:"
 msgid "Create User"
-msgstr ""
+msgstr "Создано пользователем"
 
 msgctxt "field:purchase.purchase-ignored-account.invoice,id:"
 msgid "ID"
-msgstr ""
+msgstr "ID"
 
 msgctxt "field:purchase.purchase-ignored-account.invoice,invoice:"
 msgid "Invoice"
-msgstr ""
+msgstr "Инвойс"
 
 msgctxt "field:purchase.purchase-ignored-account.invoice,purchase:"
 msgid "Purchase"
-msgstr ""
+msgstr "Покупки"
 
-#, fuzzy
 msgctxt "field:purchase.purchase-ignored-account.invoice,rec_name:"
 msgid "Name"
 msgstr "Наименование"
 
 msgctxt "field:purchase.purchase-ignored-account.invoice,write_date:"
 msgid "Write Date"
-msgstr ""
+msgstr "Дата изменения"
 
 msgctxt "field:purchase.purchase-ignored-account.invoice,write_uid:"
 msgid "Write User"
-msgstr ""
+msgstr "Изменено пользователем"
 
 msgctxt "field:purchase.purchase-recreated-account.invoice,create_date:"
 msgid "Create Date"
-msgstr ""
+msgstr "Дата создания"
 
 msgctxt "field:purchase.purchase-recreated-account.invoice,create_uid:"
 msgid "Create User"
-msgstr ""
+msgstr "Создано пользователем"
 
 msgctxt "field:purchase.purchase-recreated-account.invoice,id:"
 msgid "ID"
-msgstr ""
+msgstr "ID"
 
 msgctxt "field:purchase.purchase-recreated-account.invoice,invoice:"
 msgid "Invoice"
-msgstr ""
+msgstr "Инвойс"
 
 msgctxt "field:purchase.purchase-recreated-account.invoice,purchase:"
 msgid "Purchase"
-msgstr ""
+msgstr "Покупки"
 
-#, fuzzy
 msgctxt "field:purchase.purchase-recreated-account.invoice,rec_name:"
 msgid "Name"
 msgstr "Наименование"
 
 msgctxt "field:purchase.purchase-recreated-account.invoice,write_date:"
 msgid "Write Date"
-msgstr ""
+msgstr "Дата изменения"
 
 msgctxt "field:purchase.purchase-recreated-account.invoice,write_uid:"
 msgid "Write User"
-msgstr ""
+msgstr "Изменено пользователем"
 
 msgctxt "field:stock.move,purchase:"
 msgid "Purchase"
-msgstr ""
+msgstr "Покупки"
 
 msgctxt "field:stock.move,purchase_currency:"
 msgid "Purchase Currency"
-msgstr ""
+msgstr "Валюта покупки"
 
 msgctxt "field:stock.move,purchase_exception_state:"
 msgid "Exception State"
-msgstr ""
-
-msgctxt "field:stock.move,purchase_line:"
-msgid "Purchase Line"
-msgstr ""
+msgstr "Состояние ситуации"
 
 msgctxt "field:stock.move,purchase_quantity:"
 msgid "Purchase Quantity"
-msgstr ""
+msgstr "Покупаемое кол-во"
 
 msgctxt "field:stock.move,purchase_unit:"
 msgid "Purchase Unit"
-msgstr ""
+msgstr "Покупка, единиц"
 
 msgctxt "field:stock.move,purchase_unit_digits:"
 msgid "Purchase Unit Digits"
-msgstr ""
+msgstr "Покупка, кол-во цифр после запятой"
 
 msgctxt "field:stock.move,purchase_unit_price:"
 msgid "Purchase Unit Price"
-msgstr ""
+msgstr "Покупка, цена за единицу"
 
 msgctxt "field:stock.move,purchase_visible:"
 msgid "Purchase Visible"
-msgstr ""
+msgstr "Покупка видима"
 
-#, fuzzy
 msgctxt "field:stock.move,supplier:"
 msgid "Supplier"
 msgstr "Поставщик"
@@ -797,254 +721,239 @@ msgctxt "help:purchase.handle.invoice.exception.ask,recreate_invoices:"
 msgid ""
 "The selected invoices will be recreated. The other ones will be ignored."
 msgstr ""
+"Выбранные инвойсы будут созданы заново. Остальные будут проигнорированы."
 
 msgctxt "help:purchase.handle.shipment.exception.ask,recreate_moves:"
 msgid "The selected moves will be recreated. The other ones will be ignored."
 msgstr ""
+"Выбранные перемещения будут созданы заново. Остальные будут проигнорированы."
 
 msgctxt "help:purchase.product_supplier,delivery_time:"
 msgid "In number of days"
-msgstr ""
+msgstr "После указанного количества дней"
 
 msgctxt "help:purchase.product_supplier.price,quantity:"
 msgid "Minimal quantity"
-msgstr ""
+msgstr "Минимальное кол-во"
 
 msgctxt "model:ir.action,name:act_invoice_form"
 msgid "Invoices"
-msgstr ""
+msgstr "Инвойсы"
 
 msgctxt "model:ir.action,name:act_open_supplier"
 msgid "Parties associated to Purchases"
-msgstr ""
+msgstr "Контрагенты связанные с покупками."
 
 msgctxt "model:ir.action,name:act_purchase_configuration_form"
 msgid "Purchase Configuration"
-msgstr ""
+msgstr "Конфигурация покупок"
 
 msgctxt "model:ir.action,name:act_purchase_form"
 msgid "Purchases"
-msgstr ""
+msgstr "Покупки"
 
 msgctxt "model:ir.action,name:act_purchase_form2"
 msgid "Purchases"
-msgstr ""
-
-msgctxt "model:ir.action,name:act_purchase_form_confirmed"
-msgid "Confirmed Purchases"
-msgstr ""
-
-msgctxt "model:ir.action,name:act_purchase_form_draft"
-msgid "Draft Purchases"
-msgstr ""
-
-msgctxt "model:ir.action,name:act_purchase_form_quotation"
-msgid "Purchases in Quotation"
-msgstr ""
+msgstr "Покупки"
 
 msgctxt "model:ir.action,name:act_return_form"
 msgid "Returns"
-msgstr ""
+msgstr "Возвраты"
 
 msgctxt "model:ir.action,name:act_shipment_form"
 msgid "Shipments"
-msgstr ""
+msgstr "Доставка"
 
 msgctxt "model:ir.action,name:report_purchase"
 msgid "Purchase"
-msgstr ""
+msgstr "Покупки"
 
 msgctxt "model:ir.action,name:wizard_invoice_handle_exception"
 msgid "Handle Invoice Exception"
-msgstr ""
+msgstr "Обработка особых ситуаций инвойса"
 
 msgctxt "model:ir.action,name:wizard_shipment_handle_exception"
 msgid "Handle Shipment Exception"
-msgstr ""
+msgstr "Обработка особых ситуаций доставки"
+
+msgctxt "model:ir.action.act_window.domain,name:act_purchase_form_domain_all"
+msgid "All"
+msgstr "Все"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_purchase_form_domain_confirmed"
+msgid "Confirmed"
+msgstr "Подтвержденно"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_purchase_form_domain_draft"
+msgid "Draft"
+msgstr "Черновик"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_purchase_form_domain_quotation"
+msgid "Quotation"
+msgstr "Котировка"
 
 msgctxt "model:ir.sequence,name:sequence_purchase"
 msgid "Purchase"
-msgstr ""
+msgstr "Покупки"
 
 msgctxt "model:ir.sequence.type,name:sequence_type_purchase"
 msgid "Purchase"
-msgstr ""
+msgstr "Покупки"
 
-#, fuzzy
 msgctxt "model:ir.ui.menu,name:menu_configuration"
 msgid "Configuration"
 msgstr "Конфигурация"
 
 msgctxt "model:ir.ui.menu,name:menu_purchase"
 msgid "Purchase"
-msgstr ""
+msgstr "Покупки"
 
 msgctxt "model:ir.ui.menu,name:menu_purchase_configuration"
 msgid "Purchase Configuration"
-msgstr ""
+msgstr "Конфигурация покупок"
 
 msgctxt "model:ir.ui.menu,name:menu_purchase_form"
 msgid "Purchases"
-msgstr ""
-
-msgctxt "model:ir.ui.menu,name:menu_purchase_form_confirmed"
-msgid "Confirmed Purchases"
-msgstr ""
-
-msgctxt "model:ir.ui.menu,name:menu_purchase_form_draft"
-msgid "Draft Purchases"
-msgstr ""
-
-msgctxt "model:ir.ui.menu,name:menu_purchase_form_quotation"
-msgid "Purchases in Quotation"
-msgstr ""
+msgstr "Покупки"
 
-#, fuzzy
 msgctxt "model:ir.ui.menu,name:menu_reporting"
 msgid "Reporting"
 msgstr "Отчетность"
 
 msgctxt "model:ir.ui.menu,name:menu_supplier"
 msgid "Parties associated to Purchases"
-msgstr ""
+msgstr "Контрагенты связанные с покупками."
 
 msgctxt "model:purchase.configuration,name:"
 msgid "Purchase Configuration"
-msgstr ""
+msgstr "Конфигурация покупок"
 
 msgctxt "model:purchase.handle.invoice.exception.ask,name:"
 msgid "Handle Invoice Exception"
-msgstr ""
+msgstr "Обработка особых ситуаций инвойса"
 
 msgctxt "model:purchase.handle.shipment.exception.ask,name:"
 msgid "Handle Shipment Exception"
-msgstr ""
+msgstr "Обработка особых ситуаций доставки"
 
 msgctxt "model:purchase.line,name:"
 msgid "Purchase Line"
-msgstr ""
-
-msgctxt "model:purchase.line-account.invoice.line,name:"
-msgid "Purchase Line - Invoice Line"
-msgstr ""
+msgstr "Строка покупки"
 
 msgctxt "model:purchase.line-account.tax,name:"
 msgid "Purchase Line - Tax"
-msgstr ""
+msgstr "Строка покупки - Налоги"
 
 msgctxt "model:purchase.line-ignored-stock.move,name:"
 msgid "Purchase Line - Ignored Move"
-msgstr ""
+msgstr "Строка покупки - Игнорированные перемещения"
 
 msgctxt "model:purchase.line-recreated-stock.move,name:"
 msgid "Purchase Line - Ignored Move"
-msgstr ""
+msgstr "Строка покупки - Игнорированные перемещения"
 
 msgctxt "model:purchase.product_supplier,name:"
 msgid "Product Supplier"
-msgstr ""
+msgstr "Поставщик продукции"
 
 msgctxt "model:purchase.product_supplier.price,name:"
 msgid "Product Supplier Price"
-msgstr ""
+msgstr "Цена поставщика продукции"
 
 msgctxt "model:purchase.purchase,name:"
 msgid "Purchase"
-msgstr ""
+msgstr "Покупки"
 
 msgctxt "model:purchase.purchase-account.invoice,name:"
 msgid "Purchase - Invoice"
-msgstr ""
+msgstr "Покупки - Инвойсы"
 
 msgctxt "model:purchase.purchase-ignored-account.invoice,name:"
 msgid "Purchase - Ignored Invoice"
-msgstr ""
+msgstr "Покупки - Игнорированные инвойсы"
 
 msgctxt "model:purchase.purchase-recreated-account.invoice,name:"
 msgid "Purchase - Recreated Invoice"
-msgstr ""
+msgstr "Покупки - Созданные заново инвойсы"
 
 msgctxt "model:res.group,name:group_purchase"
 msgid "Purchase"
-msgstr ""
+msgstr "Покупки"
 
 msgctxt "model:res.group,name:group_purchase_admin"
 msgid "Purchase Administrator"
-msgstr ""
+msgstr "Администрирование покупок"
 
 msgctxt "odt:purchase.purchase:"
 msgid "Amount"
-msgstr ""
+msgstr "Сумма"
 
-#, fuzzy
 msgctxt "odt:purchase.purchase:"
 msgid "Date:"
 msgstr "Дата:"
 
-#, fuzzy
 msgctxt "odt:purchase.purchase:"
 msgid "Description"
 msgstr "Описание"
 
 msgctxt "odt:purchase.purchase:"
 msgid "Description:"
-msgstr ""
+msgstr "Описание:"
 
 msgctxt "odt:purchase.purchase:"
 msgid "Draft Purchase Order"
-msgstr ""
+msgstr "Черновой заказ на покупку"
 
-#, fuzzy
 msgctxt "odt:purchase.purchase:"
 msgid "E-Mail:"
-msgstr "E-Mail:"
+msgstr "Эл.почта:"
 
-#, fuzzy
 msgctxt "odt:purchase.purchase:"
 msgid "Phone:"
 msgstr "Телефон:"
 
 msgctxt "odt:purchase.purchase:"
 msgid "Purchase Order N°:"
-msgstr ""
+msgstr "Заказ на покупку №:"
 
-#, fuzzy
 msgctxt "odt:purchase.purchase:"
 msgid "Quantity"
 msgstr "Кол-во"
 
 msgctxt "odt:purchase.purchase:"
 msgid "Request for Quotation N°:"
-msgstr ""
+msgstr "Запрос на Котировку №:"
 
 msgctxt "odt:purchase.purchase:"
 msgid "Taxes"
-msgstr ""
+msgstr "Налоги"
 
 msgctxt "odt:purchase.purchase:"
 msgid "Taxes:"
-msgstr ""
+msgstr "Налоги:"
 
 msgctxt "odt:purchase.purchase:"
 msgid "Total (excl. taxes):"
-msgstr ""
+msgstr "Итого (без налогов):"
 
 msgctxt "odt:purchase.purchase:"
 msgid "Total:"
-msgstr ""
+msgstr "Итого:"
 
-#, fuzzy
 msgctxt "odt:purchase.purchase:"
 msgid "Unit Price"
 msgstr "Цена за единицу"
 
 msgctxt "odt:purchase.purchase:"
 msgid "VAT Number:"
-msgstr ""
+msgstr "ИНН:"
 
 msgctxt "odt:purchase.purchase:"
 msgid "VAT:"
-msgstr ""
+msgstr "ИНН:"
 
 msgctxt "selection:account.invoice,purchase_exception_state:"
 msgid ""
@@ -1052,113 +961,103 @@ msgstr ""
 
 msgctxt "selection:account.invoice,purchase_exception_state:"
 msgid "Ignored"
-msgstr ""
+msgstr "Игнорируется"
 
 msgctxt "selection:account.invoice,purchase_exception_state:"
 msgid "Recreated"
-msgstr ""
+msgstr "Создано заново"
 
 msgctxt "selection:purchase.configuration,purchase_invoice_method:"
 msgid "Based On Order"
-msgstr ""
+msgstr "Основанные на заказе"
 
 msgctxt "selection:purchase.configuration,purchase_invoice_method:"
 msgid "Based On Shipment"
-msgstr ""
+msgstr "Основанные на доставке"
 
 msgctxt "selection:purchase.configuration,purchase_invoice_method:"
 msgid "Manual"
-msgstr ""
+msgstr "Ручной"
 
-#, fuzzy
 msgctxt "selection:purchase.line,type:"
 msgid "Comment"
 msgstr "Комментарии"
 
 msgctxt "selection:purchase.line,type:"
 msgid "Line"
-msgstr ""
+msgstr "Строка"
 
 msgctxt "selection:purchase.line,type:"
 msgid "Subtotal"
-msgstr ""
+msgstr "Подитог"
 
 msgctxt "selection:purchase.line,type:"
 msgid "Title"
-msgstr ""
+msgstr "Заголовок"
 
 msgctxt "selection:purchase.purchase,invoice_method:"
 msgid "Based On Order"
-msgstr ""
+msgstr "Основанные на заказе"
 
 msgctxt "selection:purchase.purchase,invoice_method:"
 msgid "Based On Shipment"
-msgstr ""
+msgstr "Основанные на доставке"
 
 msgctxt "selection:purchase.purchase,invoice_method:"
 msgid "Manual"
-msgstr ""
+msgstr "Ручной"
 
 msgctxt "selection:purchase.purchase,invoice_state:"
 msgid "Exception"
-msgstr ""
+msgstr "Особая ситуация"
 
-#, fuzzy
 msgctxt "selection:purchase.purchase,invoice_state:"
 msgid "None"
 msgstr "Отсутствует"
 
 msgctxt "selection:purchase.purchase,invoice_state:"
 msgid "Paid"
-msgstr ""
+msgstr "Оплачен"
 
-#, fuzzy
 msgctxt "selection:purchase.purchase,invoice_state:"
 msgid "Waiting"
 msgstr "Ожидание"
 
 msgctxt "selection:purchase.purchase,shipment_state:"
 msgid "Exception"
-msgstr ""
+msgstr "Особая ситуация"
 
-#, fuzzy
 msgctxt "selection:purchase.purchase,shipment_state:"
 msgid "None"
 msgstr "Отсутствует"
 
-#, fuzzy
 msgctxt "selection:purchase.purchase,shipment_state:"
 msgid "Received"
 msgstr "Поступило"
 
-#, fuzzy
 msgctxt "selection:purchase.purchase,shipment_state:"
 msgid "Waiting"
 msgstr "Ожидание"
 
-#, fuzzy
 msgctxt "selection:purchase.purchase,state:"
 msgid "Canceled"
 msgstr "Отменено"
 
-#, fuzzy
 msgctxt "selection:purchase.purchase,state:"
 msgid "Confirmed"
 msgstr "Подтвержденно"
 
-#, fuzzy
 msgctxt "selection:purchase.purchase,state:"
 msgid "Done"
 msgstr "Выполнено"
 
-#, fuzzy
 msgctxt "selection:purchase.purchase,state:"
 msgid "Draft"
 msgstr "Черновик"
 
 msgctxt "selection:purchase.purchase,state:"
 msgid "Quotation"
-msgstr ""
+msgstr "Котировка"
 
 msgctxt "selection:stock.move,purchase_exception_state:"
 msgid ""
@@ -1166,185 +1065,144 @@ msgstr ""
 
 msgctxt "selection:stock.move,purchase_exception_state:"
 msgid "Ignored"
-msgstr ""
+msgstr "Игнорируется"
 
 msgctxt "selection:stock.move,purchase_exception_state:"
 msgid "Recreated"
-msgstr ""
+msgstr "Создано заново"
 
-#, fuzzy
 msgctxt "view:product.product:"
 msgid "Products"
-msgstr "ТМЦ"
-
-msgctxt "view:product.template:"
-msgid "Product Suppliers"
-msgstr ""
+msgstr "Продукция"
 
 msgctxt "view:product.template:"
 msgid "Suppliers"
-msgstr ""
+msgstr "Поставщики"
 
 msgctxt "view:purchase.configuration:"
 msgid "Purchase Configuration"
-msgstr ""
+msgstr "Конфигурация покупок"
 
 msgctxt "view:purchase.handle.invoice.exception.ask:"
 msgid "Choose invoices to recreate"
-msgstr ""
+msgstr "Выберите инвойсы для пересоздания"
 
 msgctxt "view:purchase.handle.invoice.exception.ask:"
 msgid "Handle Invoice Exception"
-msgstr ""
+msgstr "Обработка особых ситуаций инвойса"
 
 msgctxt "view:purchase.handle.shipment.exception.ask:"
 msgid "Choose move to recreate"
-msgstr ""
+msgstr "Выберите проводки для пересоздания"
 
 msgctxt "view:purchase.handle.shipment.exception.ask:"
 msgid "Handle shipment Exception"
-msgstr ""
+msgstr "Обработка особых ситуаций доставки"
 
-msgctxt "view:purchase.handle.shipment.exception.ask:"
-msgid "Recreated Moves"
-msgstr ""
-
-#, fuzzy
 msgctxt "view:purchase.line:"
 msgid "General"
 msgstr "Основной"
 
-#, fuzzy
 msgctxt "view:purchase.line:"
 msgid "Lines"
 msgstr "Строки"
 
-#, fuzzy
 msgctxt "view:purchase.line:"
 msgid "Notes"
 msgstr "Комментарии"
 
-#, fuzzy
-msgctxt "view:purchase.line:"
-msgid "Products"
-msgstr "ТМЦ"
-
 msgctxt "view:purchase.line:"
 msgid "Purchase Line"
-msgstr ""
+msgstr "Строка покупки"
 
 msgctxt "view:purchase.line:"
 msgid "Purchase Lines"
-msgstr ""
+msgstr "Строки покупки"
 
 msgctxt "view:purchase.product_supplier.price:"
 msgid "Product Supplier Price"
-msgstr ""
+msgstr "Цена поставщика продукции"
 
 msgctxt "view:purchase.product_supplier.price:"
 msgid "Product Supplier Prices"
-msgstr ""
+msgstr "Цены поставщика продукции"
 
 msgctxt "view:purchase.product_supplier:"
 msgid "Product Supplier"
-msgstr ""
+msgstr "Поставщик продукции"
 
 msgctxt "view:purchase.product_supplier:"
 msgid "Product Suppliers"
-msgstr ""
+msgstr "Поставщики продукции"
 
-#, fuzzy
 msgctxt "view:purchase.purchase:"
 msgid "Cancel"
 msgstr "Отменить"
 
-#, fuzzy
 msgctxt "view:purchase.purchase:"
 msgid "Confirm"
-msgstr "Подтверждать"
+msgstr "Подтвердить"
 
-#, fuzzy
 msgctxt "view:purchase.purchase:"
 msgid "Draft"
 msgstr "Черновик"
 
 msgctxt "view:purchase.purchase:"
 msgid "Handle Invoice Exception"
-msgstr ""
+msgstr "Обработка особых ситуаций инвойса"
 
 msgctxt "view:purchase.purchase:"
 msgid "Handle Shipment Exception"
-msgstr ""
+msgstr "Обработка особых ситуаций доставки"
 
 msgctxt "view:purchase.purchase:"
 msgid "Invoices"
-msgstr ""
-
-#, fuzzy
-msgctxt "view:purchase.purchase:"
-msgid "Lines"
-msgstr "Строки"
-
-#, fuzzy
-msgctxt "view:purchase.purchase:"
-msgid "Moves"
-msgstr "Перемещения"
+msgstr "Инвойсы"
 
 msgctxt "view:purchase.purchase:"
 msgid "Other Info"
-msgstr ""
+msgstr "Другая информация"
 
 msgctxt "view:purchase.purchase:"
 msgid "Purchase"
-msgstr ""
+msgstr "Покупки"
 
 msgctxt "view:purchase.purchase:"
 msgid "Purchases"
-msgstr ""
-
-msgctxt "view:purchase.purchase:"
-msgid "Quotation"
-msgstr ""
+msgstr "Покупки"
 
 msgctxt "view:purchase.purchase:"
 msgid "Quote"
-msgstr ""
+msgstr "Котировать"
 
 msgctxt "view:purchase.purchase:"
 msgid "Shipments"
-msgstr ""
+msgstr "Доставка"
 
-#, fuzzy
 msgctxt "view:stock.move:"
 msgid "Moves"
 msgstr "Перемещения"
 
-#, fuzzy
 msgctxt "wizard_button:purchase.handle.invoice.exception,ask,end:"
 msgid "Cancel"
 msgstr "Отменить"
 
-#, fuzzy
 msgctxt "wizard_button:purchase.handle.invoice.exception,ask,handle:"
 msgid "Ok"
-msgstr "Да"
+msgstr "Ок"
 
-#, fuzzy
 msgctxt "wizard_button:purchase.handle.shipment.exception,ask,end:"
 msgid "Cancel"
 msgstr "Отменить"
 
-#, fuzzy
 msgctxt "wizard_button:purchase.handle.shipment.exception,ask,handle:"
 msgid "Ok"
-msgstr "Да"
+msgstr "Ок"
 
-#, fuzzy
 msgctxt "wizard_button:stock.product_quantities_warehouse,start,end:"
 msgid "Cancel"
 msgstr "Отменить"
 
-#, fuzzy
 msgctxt "wizard_button:stock.product_quantities_warehouse,start,open_:"
 msgid "Open"
 msgstr "Открыть"
diff --git a/product.xml b/product.xml
index e2cf516..d63e0d8 100644
--- a/product.xml
+++ b/product.xml
@@ -7,20 +7,7 @@ this repository contains the full copyright notices and license terms. -->
             <field name="model">product.product</field>
             <field name="type">tree</field>
             <field name="priority" eval="20"/>
-            <field name="arch" type="xml">
-                <![CDATA[
-                <tree string="Products">
-                    <field name="name"/>
-                    <field name="code"/>
-                    <field name="list_price_uom"/>
-                    <field name="cost_price_uom"/>
-                    <field name="quantity"/>
-                    <field name="forecast_quantity"/>
-                    <field name="default_uom"/>
-                    <field name="active"/>
-                </tree>
-                ]]>
-            </field>
+            <field name="name">product_list_purchase_line</field>
         </record>
     </data>
 </tryton>
diff --git a/purchase.py b/purchase.py
index 6b1dce4..a974940 100644
--- a/purchase.py
+++ b/purchase.py
@@ -1,6 +1,7 @@
 #This file is part of Tryton.  The COPYRIGHT file at the top level of
 #this repository contains the full copyright notices and license terms.
 import datetime
+from itertools import chain
 from decimal import Decimal
 from trytond.model import Workflow, ModelView, ModelSQL, fields
 from trytond.modules.company import CompanyReport
@@ -10,11 +11,10 @@ from trytond.backend import TableHandler
 from trytond.pyson import Eval, Bool, If, PYSONEncoder, Id
 from trytond.transaction import Transaction
 from trytond.pool import Pool, PoolMeta
-from trytond.config import CONFIG
 
 __all__ = ['Purchase', 'PurchaseInvoice', 'PurchaseIgnoredInvoice',
     'PurchaseRecreadtedInvoice', 'PurchaseLine', 'PurchaseLineTax',
-    'PurchaseLineInvoiceLine', 'PurchaseLineIgnoredMove',
+    'PurchaseLineIgnoredMove',
     'PurchaseLineRecreatedMove', 'PurchaseReport', 'Template', 'Product',
     'ProductSupplier', 'ProductSupplierPrice', 'ShipmentIn',
     'ShipmentInReturn', 'Move', 'OpenSupplier', 'HandleShipmentExceptionAsk',
@@ -141,14 +141,14 @@ class Purchase(Workflow, ModelSQL, ModelView):
         cls._order.insert(0, ('purchase_date', 'DESC'))
         cls._order.insert(1, ('id', 'DESC'))
         cls._error_messages.update({
-                'invoice_addresse_required': 'Invoice addresses must be '
-                'defined for the quotation.',
-                'warehouse_required': 'A warehouse must be defined for the ' \
-                    'quotation.',
-                'missing_account_payable': 'It misses ' \
-                        'an "Account Payable" on the party "%s"!',
-                'delete_cancel': 'Purchase "%s" must be cancelled before '\
-                    'deletion!',
+                'invoice_address_required': ('Invoice address must be '
+                    'defined for quotation of sale "%s".'),
+                'warehouse_required': ('A warehouse must be defined for '
+                    'quotation of sale "%s".'),
+                'missing_account_payable': ('Missing "Account Payable" on '
+                    'party "%s".'),
+                'delete_cancel': ('Purchase "%s" must be cancelled before '
+                    'deletion.'),
                 })
         cls._transitions |= set((
                 ('draft', 'quotation'),
@@ -195,16 +195,16 @@ class Purchase(Workflow, ModelSQL, ModelView):
     def __register__(cls, module_name):
         cursor = Transaction().cursor
         # Migration from 1.2: packing renamed into shipment
-        cursor.execute("UPDATE ir_model_data "\
-                "SET fs_id = REPLACE(fs_id, 'packing', 'shipment') "\
-                "WHERE fs_id like '%%packing%%' AND module = %s",
-                (module_name,))
-        cursor.execute("UPDATE ir_model_field "\
-                "SET relation = REPLACE(relation, 'packing', 'shipment'), "\
-                    "name = REPLACE(name, 'packing', 'shipment') "
-                "WHERE (relation like '%%packing%%' "\
-                    "OR name like '%%packing%%') AND module = %s",
-                (module_name,))
+        cursor.execute("UPDATE ir_model_data "
+            "SET fs_id = REPLACE(fs_id, 'packing', 'shipment') "
+            "WHERE fs_id like '%%packing%%' AND module = %s",
+            (module_name,))
+        cursor.execute("UPDATE ir_model_field "
+            "SET relation = REPLACE(relation, 'packing', 'shipment'), "
+                "name = REPLACE(name, 'packing', 'shipment') "
+            "WHERE (relation like '%%packing%%' "
+                "OR name like '%%packing%%') AND module = %s",
+            (module_name,))
         table = TableHandler(cursor, cls, module_name)
         table.column_rename('packing_state', 'shipment_state')
 
@@ -212,9 +212,9 @@ class Purchase(Workflow, ModelSQL, ModelView):
 
         # Migration from 1.2: rename packing to shipment in
         # invoice_method values
-        cursor.execute("UPDATE " + cls._table + " "\
-                "SET invoice_method = 'shipment' "\
-                "WHERE invoice_method = 'packing'")
+        cursor.execute("UPDATE " + cls._table + " "
+            "SET invoice_method = 'shipment' "
+            "WHERE invoice_method = 'packing'")
 
         table = TableHandler(cursor, cls, module_name)
         # Migration from 2.2: warehouse is no more required
@@ -333,10 +333,11 @@ class Purchase(Workflow, ModelSQL, ModelView):
         return 2
 
     def on_change_with_party_lang(self, name=None):
+        Config = Pool().get('ir.configuration')
         if self.party:
             if self.party.lang:
                 return self.party.lang.code
-        return CONFIG['language']
+        return Config.get_language()
 
     def get_tax_context(self):
         context = {}
@@ -456,21 +457,20 @@ class Purchase(Workflow, ModelSQL, ModelView):
                     'invoice_state': state,
                     })
 
-    def get_shipments_returns(attribute):
+    def get_shipments_returns(model_name):
         "Computes the returns or shipments"
         def method(self, name):
-            shipments = []
+            Model = Pool().get(model_name)
+            shipments = set()
             for line in self.lines:
                 for move in line.moves:
-                    ship_or_return = getattr(move, attribute)
-                    if bool(ship_or_return):
-                        if ship_or_return.id not in shipments:
-                            shipments.append(ship_or_return.id)
-            return shipments
+                    if isinstance(move.shipment, Model):
+                        shipments.add(move.shipment.id)
+            return list(shipments)
         return method
 
-    get_shipments = get_shipments_returns('shipment_in')
-    get_shipment_returns = get_shipments_returns('shipment_in_return')
+    get_shipments = get_shipments_returns('stock.shipment.in')
+    get_shipment_returns = get_shipments_returns('stock.shipment.in.return')
 
     def get_moves(self, name):
         return [m.id for l in self.lines for m in l.moves]
@@ -530,12 +530,12 @@ class Purchase(Workflow, ModelSQL, ModelView):
 
     def check_for_quotation(self):
         if not self.invoice_address:
-            self.raise_user_error('invoice_addresse_required')
+            self.raise_user_error('invoice_address_required', (self.rec_name,))
         for line in self.lines:
             if (not line.to_location
                     and line.product
                     and line.product.type in ('goods', 'assets')):
-                self.raise_user_error('warehouse_required')
+                self.raise_user_error('warehouse_required', (self.rec_name,))
 
     @classmethod
     def set_reference(cls, purchases):
@@ -619,7 +619,6 @@ class Purchase(Workflow, ModelSQL, ModelView):
         '''
         pool = Pool()
         Invoice = pool.get('account.invoice')
-        PurchaseLine = pool.get('purchase.line')
 
         if self.invoice_method == 'manual':
             return
@@ -633,18 +632,9 @@ class Purchase(Workflow, ModelSQL, ModelView):
             return
 
         invoice = self._get_invoice_purchase(invoice_type)
+        invoice.lines = list(chain.from_iterable(invoice_lines.itervalues()))
         invoice.save()
 
-        for line in self.lines:
-            if line.id not in invoice_lines:
-                continue
-            for invoice_line in invoice_lines[line.id]:
-                invoice_line.invoice = invoice.id
-                invoice_line.save()
-                PurchaseLine.write([line], {
-                        'invoice_lines': [('add', [invoice_line.id])],
-                        })
-
         with Transaction().set_user(0, set_context=True):
             Invoice.update_taxes([invoice])
 
@@ -872,14 +862,17 @@ class PurchaseLine(ModelSQL, ModelView):
     description = fields.Text('Description', size=None, required=True)
     note = fields.Text('Note')
     taxes = fields.Many2Many('purchase.line-account.tax',
-        'line', 'tax', 'Taxes', domain=[('parent', '=', None)],
+        'line', 'tax', 'Taxes',
+        domain=[('parent', '=', None), ['OR',
+                ('group', '=', None),
+                ('group.kind', 'in', ['purchase', 'both'])],
+            ],
         states={
             'invisible': Eval('type') != 'line',
             }, depends=['type'])
-    invoice_lines = fields.Many2Many('purchase.line-account.invoice.line',
-            'purchase_line', 'invoice_line', 'Invoice Lines', readonly=True)
-    moves = fields.One2Many('stock.move', 'purchase_line', 'Moves',
-            readonly=True)
+    invoice_lines = fields.One2Many('account.invoice.line', 'origin',
+        'Invoice Lines', readonly=True)
+    moves = fields.One2Many('stock.move', 'origin', 'Moves', readonly=True)
     moves_ignored = fields.Many2Many('purchase.line-ignored-stock.move',
             'purchase_line', 'move', 'Ignored Moves', readonly=True)
     moves_recreated = fields.Many2Many('purchase.line-recreated-stock.move',
@@ -892,8 +885,14 @@ class PurchaseLine(ModelSQL, ModelView):
     to_location = fields.Function(fields.Many2One('stock.location',
             'To Location'), 'get_to_location')
     delivery_date = fields.Function(fields.Date('Delivery Date',
-            on_change_with=['product', '_parent_purchase.purchase_date',
-                '_parent_purchase.party']),
+            on_change_with=['product', 'quantity',
+                '_parent_purchase.purchase_date', '_parent_purchase.party'],
+            states={
+                'invisible': ((Eval('type') != 'line')
+                    | (If(Bool(Eval('quantity')), Eval('quantity', 0), 0)
+                        <= 0)),
+                },
+            depends=['type', 'quantity']),
         'on_change_with_delivery_date')
 
     @classmethod
@@ -901,12 +900,13 @@ class PurchaseLine(ModelSQL, ModelView):
         super(PurchaseLine, cls).__setup__()
         cls._order.insert(0, ('sequence', 'ASC'))
         cls._error_messages.update({
-            'supplier_location_required': 'The supplier location is required!',
-            'missing_account_expense': 'It misses ' \
-                    'an "Account Expense" on product "%s"!',
-            'missing_account_expense_property': 'It misses ' \
-                    'an "account expense" default property!',
-            })
+                'supplier_location_required': ('Purchase "%(purchase)s" misses '
+                    'the supplier location for line "%(line)s".'),
+                'missing_account_expense': ('Product "%(product)s" of purchase '
+                    '%(purchase)s misses an expense account.'),
+                'missing_account_expense_property': ('Purchase "%(purchase)s" '
+                    'misses an "account expense" default property.'),
+                })
 
     @classmethod
     def __register__(cls, module_name):
@@ -916,8 +916,8 @@ class PurchaseLine(ModelSQL, ModelView):
 
         # Migration from 1.0 comment change into note
         if table.column_exist('comment'):
-            cursor.execute('UPDATE "' + cls._table + '" ' \
-                    'SET note = comment')
+            cursor.execute('UPDATE "' + cls._table + '" '
+                'SET note = comment')
             table.drop_column('comment', exception=True)
 
         # Migration from 2.4: drop required on sequence
@@ -1097,12 +1097,17 @@ class PurchaseLine(ModelSQL, ModelView):
 
     def on_change_with_delivery_date(self, name=None):
         if (self.product
+                and self.quantity > 0
                 and self.purchase and self.purchase.party
                 and self.product.product_suppliers):
             date = self.purchase.purchase_date if self.purchase else None
             for product_supplier in self.product.product_suppliers:
                 if product_supplier.party == self.purchase.party:
-                    return product_supplier.compute_supply_date(date=date)
+                    delivery_date = product_supplier.compute_supply_date(
+                        date=date)
+                    if delivery_date == datetime.date.max:
+                        return None
+                    return delivery_date
 
     def get_invoice_line(self, invoice_type):
         '''
@@ -1162,15 +1167,19 @@ class PurchaseLine(ModelSQL, ModelView):
         if self.product:
             invoice_line.account = self.product.account_expense_used
             if not invoice_line.account:
-                self.raise_user_error('missing_account_expense',
-                        error_args=(self.product.rec_name,))
+                self.raise_user_error('missing_account_expense', {
+                        'product': invoice_line.product.rec_name,
+                        'purchase': invoice_line.purchase.rec_name,
+                        })
         else:
             for model in ('product.template', 'product.category'):
                 invoice_line.account = Property.get('account_expense', model)
                 if invoice_line.account:
                     break
             if not invoice_line.account:
-                self.raise_user_error('missing_account_expense_property')
+                self.raise_user_error('missing_account_expense_property',
+                    (invoice_line.purchase.rec_name,))
+        invoice_line.origin = self
         return [invoice_line]
 
     @classmethod
@@ -1207,7 +1216,10 @@ class PurchaseLine(ModelSQL, ModelView):
         if quantity <= 0.0:
             return
         if not self.purchase.party.supplier_location:
-            self.raise_user_error('supplier_location_required')
+            self.raise_user_error('supplier_location_required', {
+                    'purchase': self.purchase.rec_name,
+                    'line': self.rec_name,
+                    })
         with Transaction().set_user(0, set_context=True):
             move = Move()
         move.quantity = quantity
@@ -1220,6 +1232,7 @@ class PurchaseLine(ModelSQL, ModelView):
         move.unit_price = self.unit_price
         move.currency = self.purchase.currency
         move.planned_date = self.delivery_date
+        move.origin = self
         return move
 
     def create_move(self):
@@ -1230,10 +1243,6 @@ class PurchaseLine(ModelSQL, ModelView):
         if not move:
             return
         move.save()
-        with Transaction().set_user(0, set_context=True):
-            self.write([self], {
-                    'moves': [('add', [move.id])],
-                    })
         return move
 
 
@@ -1248,16 +1257,6 @@ class PurchaseLineTax(ModelSQL):
             select=True, required=True, domain=[('parent', '=', None)])
 
 
-class PurchaseLineInvoiceLine(ModelSQL):
-    'Purchase Line - Invoice Line'
-    __name__ = 'purchase.line-account.invoice.line'
-    _table = 'purchase_line_invoice_lines_rel'
-    purchase_line = fields.Many2One('purchase.line', 'Purchase Line',
-            ondelete='CASCADE', select=True, required=True)
-    invoice_line = fields.Many2One('account.invoice.line', 'Invoice Line',
-            ondelete='RESTRICT', select=True, required=True)
-
-
 class PurchaseLineIgnoredMove(ModelSQL):
     'Purchase Line - Ignored Move'
     __name__ = 'purchase.line-ignored-stock.move'
@@ -1306,9 +1305,9 @@ class Template:
     def __setup__(cls):
         super(Template, cls).__setup__()
         cls._error_messages.update({
-                'change_purchase_uom': 'Purchase prices are based ' \
-                    'on the purchase uom, are you sure to change it?',
-            })
+                'change_purchase_uom': ('Purchase prices are based '
+                    'on the purchase uom, are you sure to change it?'),
+                })
         required = ~Eval('account_category') & Eval('purchasable', False)
         if not cls.account_expense.states.get('required'):
             cls.account_expense.states['required'] = required
@@ -1431,8 +1430,7 @@ class ProductSupplier(ModelSQL, ModelView):
             ('id', If(Eval('context', {}).contains('company'), '=', '!='),
                 Eval('context', {}).get('company', 0)),
             ])
-    delivery_time = fields.Integer('Delivery Time', required=True,
-            help="In number of days")
+    delivery_time = fields.Integer('Delivery Time', help="In number of days")
     currency = fields.Many2One('currency.currency', 'Currency', required=True,
         ondelete='RESTRICT')
 
@@ -1473,6 +1471,9 @@ class ProductSupplier(ModelSQL, ModelView):
         # Migration from 2.4: drop required on sequence
         table.not_null_action('sequence', action='remove')
 
+        # Migration from 2.6: drop required on delivery_time
+        table.not_null_action('delivery_time', action='remove')
+
     @staticmethod
     def default_company():
         return Transaction().context.get('company')
@@ -1507,7 +1508,7 @@ class ProductSupplier(ModelSQL, ModelView):
 
         if not date:
             date = Date.today()
-        if not self.delivery_time:
+        if self.delivery_time is None:
             return datetime.date.max
         return date + datetime.timedelta(self.delivery_time)
 
@@ -1517,7 +1518,7 @@ class ProductSupplier(ModelSQL, ModelView):
         '''
         Date = Pool().get('ir.date')
 
-        if not self.delivery_time:
+        if self.delivery_time is None:
             return Date.today()
         return date - datetime.timedelta(self.delivery_time)
 
@@ -1556,11 +1557,13 @@ class ShipmentIn:
                 add_remove,
                 cls.incoming_moves.add_remove,
                 ]
+        if 'supplier' not in cls.incoming_moves.depends:
+            cls.incoming_moves.depends.append('supplier')
 
         cls._error_messages.update({
-                'reset_move': 'You cannot reset to draft a move generated '\
-                    'by a purchase.',
-            })
+                'reset_move': ('You cannot reset to draft move "%s" because '
+                    'it was generated by a purchase.'),
+                })
 
     @classmethod
     def write(cls, shipments, vals):
@@ -1586,16 +1589,18 @@ class ShipmentIn:
 
             with Transaction().set_user(0, set_context=True):
                 purchases = Purchase.browse([p.id for p in purchases])
-            Purchase.process(purchases)
+                Purchase.process(purchases)
 
     @classmethod
     @ModelView.button
     @Workflow.transition('draft')
     def draft(cls, shipments):
+        PurchaseLine = Pool().get('purchase.line')
         for shipment in shipments:
             for move in shipment.incoming_moves:
-                if move.state == 'cancel' and move.purchase_line:
-                    cls.raise_user_error('reset_move')
+                if (move.state == 'cancel'
+                        and isinstance(move.origin, PurchaseLine)):
+                    cls.raise_user_error('reset_move', (move.rec_name,))
 
         return super(ShipmentIn, cls).draft(shipments)
 
@@ -1607,8 +1612,8 @@ class ShipmentInReturn:
     def __setup__(cls):
         super(ShipmentInReturn, cls).__setup__()
         cls._error_messages.update({
-                'reset_move': 'You cannot reset to draft a move generated '\
-                    'by a purchase.',
+                'reset_move': ('You cannot reset to draft a move generated '
+                    'by a purchase.'),
                 })
 
     @classmethod
@@ -1634,15 +1639,17 @@ class ShipmentInReturn:
 
             with Transaction().set_user(0, set_context=True):
                 purchases = Purchase.browse([p.id for p in purchases])
-            Purchase.process(purchases)
+                Purchase.process(purchases)
 
     @classmethod
     @ModelView.button
     @Workflow.transition('draft')
     def draft(cls, shipments):
+        PurchaseLine = Pool().get('purchase.line')
         for shipment in shipments:
             for move in shipment.moves:
-                if move.state == 'cancel' and move.purchase_line:
+                if (move.state == 'cancel'
+                        and isinstance(move.origin, PurchaseLine)):
                     cls.raise_user_error('reset_move')
 
         return super(ShipmentInReturn, cls).draft(shipments)
@@ -1650,15 +1657,11 @@ class ShipmentInReturn:
 
 class Move(ModelSQL, ModelView):
     __name__ = 'stock.move'
-    purchase_line = fields.Many2One('purchase.line', 'Purchase Line',
-        select=True, states={
-            'readonly': Eval('state') != 'draft',
-            },
-        depends=['state'])
     purchase = fields.Function(fields.Many2One('purchase.purchase', 'Purchase',
-            select=True, states={
+            states={
                 'invisible': ~Eval('purchase_visible', False),
-                }, depends=['purchase_visible']), 'get_purchase',
+                },
+            depends=['purchase_visible']), 'get_purchase',
         searcher='search_purchase')
     purchase_quantity = fields.Function(fields.Float('Purchase Quantity',
             digits=(16, Eval('unit_digits', 2)),
@@ -1683,38 +1686,62 @@ class Move(ModelSQL, ModelView):
                 }, depends=['purchase_visible']), 'get_purchase_fields')
     purchase_visible = fields.Function(fields.Boolean('Purchase Visible',
         on_change_with=['from_location']), 'on_change_with_purchase_visible')
-    supplier = fields.Function(fields.Many2One('party.party', 'Supplier',
-        select=True), 'get_supplier', searcher='search_supplier')
+    supplier = fields.Function(fields.Many2One('party.party', 'Supplier'),
+        'get_supplier', searcher='search_supplier')
     purchase_exception_state = fields.Function(fields.Selection([
         ('', ''),
         ('ignored', 'Ignored'),
         ('recreated', 'Recreated'),
         ], 'Exception State'), 'get_purchase_exception_state')
 
+    @classmethod
+    def __register__(cls, module_name):
+        cursor = Transaction().cursor
+
+        super(Move, cls).__register__(module_name)
+
+        table = TableHandler(cursor, cls, module_name)
+
+        # Migration from 2.6: remove purchase_line
+        if table.column_exist('purchase_line'):
+            cursor.execute('UPDATE "' + cls._table + '" '
+                'SET origin = \'purchase.line,\' || purchase_line '
+                'WHERE purchase_line IS NOT NULL')
+            table.drop_column('purchase_line')
+
+    @classmethod
+    def _get_origin(cls):
+        models = super(Move, cls)._get_origin()
+        models.append('purchase.line')
+        return models
+
     def get_purchase(self, name):
-        if self.purchase_line:
-            return self.purchase_line.purchase.id
+        PurchaseLine = Pool().get('purchase.line')
+        if isinstance(self.origin, PurchaseLine):
+            return self.origin.purchase.id
+
+    @classmethod
+    def search_purchase(cls, name, clause):
+        return [('origin.' + name,) + tuple(clause[1:]) + ('purchase.line',)]
 
     def get_purchase_exception_state(self, name):
-        if not self.purchase_line:
+        PurchaseLine = Pool().get('purchase.line')
+        if not isinstance(self.origin, PurchaseLine):
             return ''
-        if self in self.purchase_line.moves_recreated:
+        if self in self.origin.moves_recreated:
             return 'recreated'
-        if self in self.purchase_line.moves_ignored:
+        if self in self.origin.moves_ignored:
             return 'ignored'
 
-    @classmethod
-    def search_purchase(cls, name, clause):
-        return [('purchase_line.' + name,) + tuple(clause[1:])]
-
     def get_purchase_fields(self, name):
-        if self.purchase_line:
+        PurchaseLine = Pool().get('purchase.line')
+        if isinstance(self.origin, PurchaseLine):
             if name[9:] == 'currency':
-                return self.purchase_line.purchase.currency.id
+                return self.origin.purchase.currency.id
             elif name[9:] in ('quantity', 'unit_digits', 'unit_price'):
-                return getattr(self.purchase_line, name[9:])
+                return getattr(self.origin, name[9:])
             else:
-                return getattr(self.purchase_line, name[9:]).id
+                return getattr(self.origin, name[9:]).id
         else:
             if name[9:] == 'quantity':
                 return 0.0
@@ -1728,12 +1755,14 @@ class Move(ModelSQL, ModelView):
         return False
 
     def get_supplier(self, name):
-        if self.purchase_line:
-            return self.purchase_line.purchase.party.id
+        PurchaseLine = Pool().get('purchase.line')
+        if isinstance(self.origin, PurchaseLine):
+            return self.origin.purchase.party.id
 
     @classmethod
     def search_supplier(cls, name, clause):
-        return [('purchase_line.purchase.party',) + tuple(clause[1:])]
+        return [('origin.purchase.party',) + tuple(clause[1:]) +
+            ('purchase.line',)]
 
     @classmethod
     def write(cls, moves, vals):
@@ -1753,7 +1782,7 @@ class Move(ModelSQL, ModelView):
             if purchases:
                 with Transaction().set_user(0, set_context=True):
                     purchases = Purchase.browse([p.id for p in purchases])
-                Purchase.process(purchases)
+                    Purchase.process(purchases)
 
     @classmethod
     def delete(cls, moves):
@@ -1774,7 +1803,7 @@ class Move(ModelSQL, ModelView):
             if purchases:
                 with Transaction().set_user(0, set_context=True):
                     purchases = Purchase.browse([p.id for p in purchases])
-                Purchase.process(purchases)
+                    Purchase.process(purchases)
 
 
 class OpenSupplier(Wizard):
@@ -1797,7 +1826,6 @@ class OpenSupplier(Wizard):
         model_data, = ModelData.search([
                 ('fs_id', '=', 'act_open_supplier'),
                 ('module', '=', 'purchase'),
-                ('inherit', '=', None),
                 ], limit=1)
         wizard = Wizard(model_data.db_id)
 
@@ -1811,8 +1839,8 @@ class HandleShipmentExceptionAsk(ModelView):
     recreate_moves = fields.Many2Many(
         'stock.move', None, None, 'Recreate Moves',
         domain=[('id', 'in', Eval('domain_moves'))], depends=['domain_moves'],
-        help='The selected moves will be recreated. '\
-            'The other ones will be ignored.')
+        help=('The selected moves will be recreated. '
+            'The other ones will be ignored.'))
     domain_moves = fields.Many2Many(
         'stock.move', None, None, 'Domain Moves')
 
@@ -1820,10 +1848,10 @@ class HandleShipmentExceptionAsk(ModelView):
     def __register__(cls, module_name):
         cursor = Transaction().cursor
         # Migration from 1.2: packing renamed into shipment
-        cursor.execute("UPDATE ir_model "\
-                "SET model = REPLACE(model, 'packing', 'shipment') "\
-                "WHERE model like '%%packing%%' AND module = %s",
-                (module_name,))
+        cursor.execute("UPDATE ir_model "
+            "SET model = REPLACE(model, 'packing', 'shipment') "
+            "WHERE model like '%%packing%%' AND module = %s",
+            (module_name,))
         super(HandleShipmentExceptionAsk, cls).__register__(module_name)
 
 
@@ -1892,8 +1920,8 @@ class HandleInvoiceExceptionAsk(ModelView):
         'account.invoice', None, None, 'Recreate Invoices',
         domain=[('id', 'in', Eval('domain_invoices'))],
         depends=['domain_invoices'],
-        help='The selected invoices will be recreated. '\
-            'The other ones will be ignored.')
+        help=('The selected invoices will be recreated. '
+            'The other ones will be ignored.'))
     domain_invoices = fields.Many2Many(
         'account.invoice', None, None, 'Domain Invoices')
 
diff --git a/purchase.xml b/purchase.xml
index bffd186..2e2d6b4 100644
--- a/purchase.xml
+++ b/purchase.xml
@@ -58,110 +58,12 @@ this repository contains the full copyright notices and license terms. -->
         <record model="ir.ui.view" id="purchase_view_form">
             <field name="model">purchase.purchase</field>
             <field name="type">form</field>
-            <field name="arch" type="xml">
-                <![CDATA[
-                <form string="Purchase" col="6">
-                    <label name="party"/>
-                    <field name="party"/>
-                    <label name="invoice_address"/>
-                    <field name="invoice_address"/>
-                    <label name="supplier_reference"/>
-                    <field name="supplier_reference"/>
-                    <label name="description"/>
-                    <field name="description" colspan="3"/>
-                    <label name="reference"/>
-                    <field name="reference"/>
-                    <notebook colspan="6">
-                        <page string="Purchase" id="purchase">
-                            <label name="purchase_date"/>
-                            <field name="purchase_date"/>
-                            <label name="payment_term"/>
-                            <field name="payment_term"/>
-                            <label name="warehouse"/>
-                            <field name="warehouse"/>
-                            <label name="currency"/>
-                            <field name="currency"/>
-                            <field name="lines" colspan="4"
-                                view_ids="purchase.purchase_line_view_tree_sequence"/>
-                            <group col="2" colspan="2" id="states">
-                                <label name="invoice_state"/>
-                                <field name="invoice_state"/>
-                                <label name="shipment_state"/>
-                                <field name="shipment_state"/>
-                                <label name="state"/>
-                                <field name="state"/>
-                            </group>
-                            <group col="2" colspan="2" id="amount_buttons">
-                                <label name="untaxed_amount" xalign="1.0" xexpand="1"/>
-                                <field name="untaxed_amount" xalign="1.0" xexpand="0"/>
-                                <label name="tax_amount" xalign="1.0" xexpand="1"/>
-                                <field name="tax_amount" xalign="1.0" xexpand="0"/>
-                                <label name="total_amount" xalign="1.0" xexpand="1"/>
-                                <field name="total_amount" xalign="1.0" xexpand="0"/>
-                                <group col="6" colspan="2" id="buttons">
-                                    <button name="cancel" string="Cancel"
-                                        icon="tryton-cancel"/>
-                                    <button name="draft" string="Draft"/>
-                                    <button name="quote" string="Quote"
-                                        icon="tryton-go-next"/>
-                                    <button name="handle_invoice_exception"
-                                            string="Handle Invoice Exception"
-                                            icon="tryton-go-next"/>
-                                    <button name="handle_shipment_exception"
-                                            string="Handle Shipment Exception"
-                                            icon="tryton-go-next"/>
-                                    <button name="confirm" string="Confirm"
-                                        icon="tryton-ok"/>
-                                </group>
-                            </group>
-                        </page>
-                        <page string="Other Info" id="info">
-                            <label name="company"/>
-                            <field name="company"/>
-                            <label name="invoice_method"/>
-                            <field name="invoice_method"/>
-                            <separator name="comment" colspan="4"/>
-                            <field name="comment" colspan="4" spell="Eval('party_lang')"/>
-                        </page>
-                        <page string="Invoices" id="invoices">
-                            <field name="invoices" colspan="4"/>
-                        </page>
-                        <page string="Shipments" id="shipments">
-                            <field name="moves" colspan="4"
-                                view_ids="purchase.move_view_list_shipment"/>
-                            <field name="shipments" colspan="4"/>
-                            <field name="shipment_returns" colspan="4"/>
-                        </page>
-                    </notebook>
-                    <field name="currency_digits" invisible="1" colspan="6"/>
-                    <field name="party_lang" invisible="1" colspan="6"/>
-                </form>
-                ]]>
-            </field>
+            <field name="name">purchase_form</field>
         </record>
         <record model="ir.ui.view" id="purchase_view_tree">
             <field name="model">purchase.purchase</field>
             <field name="type">tree</field>
-            <field name="arch" type="xml">
-                <![CDATA[
-                <tree string="Purchases">
-                    <field name="reference"/>
-                    <field name="supplier_reference"/>
-                    <field name="purchase_date"/>
-                    <field name="party"/>
-                    <field name="warehouse"/>
-                    <field name="currency"/>
-                    <field name="untaxed_amount"/>
-                    <field name="total_amount"/>
-                    <field name="state"/>
-                    <field name="invoice_state"/>
-                    <field name="shipment_state"/>
-                    <field name="description"/>
-                    <field name="currency_digits" tree_invisible="1"/>
-                    <field name="create_date" tree_invisible="1"/>
-                </tree>
-                ]]>
-            </field>
+            <field name="name">purchase_tree</field>
         </record>
 
         <record model="ir.action.act_window" id="act_shipment_form">
@@ -202,42 +104,19 @@ this repository contains the full copyright notices and license terms. -->
         <record model="ir.ui.view" id="handle_shipment_exception_ask_view_form">
             <field name="model">purchase.handle.shipment.exception.ask</field>
             <field name="type">form</field>
-            <field name="arch" type="xml">
-                <![CDATA[
-                <form string="Handle shipment Exception" col="2">
-                    <image name="tryton-dialog-information" xexpand="0"
-                        xfill="0"/>
-                    <label string="Choose move to recreate"
-                        id="choose"
-                        yalign="0.0" xalign="0.0" xexpand="1"/>
-                    <field name="recreate_moves" colspan="2"
-                        view_ids="stock.move_view_tree"/>
-                </form>
-                ]]>
-            </field>
+            <field name="name">handle_shipment_exception_ask_form</field>
         </record>
 
         <record model="ir.ui.view" id="handle_invoice_exception_ask_view_form">
             <field name="model">purchase.handle.invoice.exception.ask</field>
             <field name="type">form</field>
-            <field name="arch" type="xml">
-                <![CDATA[
-                <form string="Handle Invoice Exception" col="2">
-                    <image name="tryton-dialog-information" xexpand="0"
-                        xfill="0"/>
-                    <label string="Choose invoices to recreate"
-                        id="choose"
-                        yalign="0.0" xalign="0.0" xexpand="1"/>
-                    <field name="recreate_invoices" colspan="2"/>
-                </form>
-                ]]>
-            </field>
+            <field name="name">handle_invoice_exception_ask_form</field>
         </record>
 
         <record model="ir.action.act_window" id="act_purchase_form">
             <field name="name">Purchases</field>
             <field name="res_model">purchase.purchase</field>
-            <field name="search_value">[('create_date', '>=', DateTime(hour=0, minute=0, second=0, microsecond=0, delta_years=-1))]</field>
+            <field name="search_value"></field>
         </record>
         <record model="ir.action.act_window.view" id="act_purchase_form_view1">
             <field name="sequence" eval="10"/>
@@ -249,66 +128,40 @@ this repository contains the full copyright notices and license terms. -->
             <field name="view" ref="purchase_view_form"/>
             <field name="act_window" ref="act_purchase_form"/>
         </record>
-        <menuitem parent="menu_purchase" action="act_purchase_form"
-            id="menu_purchase_form" sequence="10"/>
-        <record model="ir.ui.menu-res.group" id="menu_purchase_form_group_purchase">
-            <field name="menu" ref="menu_purchase_form"/>
-            <field name="group" ref="group_purchase"/>
-        </record>
-
-        <record model="ir.action.act_window" id="act_purchase_form_draft">
-            <field name="name">Draft Purchases</field>
-            <field name="res_model">purchase.purchase</field>
-            <field name="domain">[('state', '=', 'draft')]</field>
-        </record>
-        <record model="ir.action.act_window.view" id="act_purchase_form_draft_view1">
+        <record model="ir.action.act_window.domain"
+            id="act_purchase_form_domain_draft">
+            <field name="name">Draft</field>
             <field name="sequence" eval="10"/>
-            <field name="view" ref="purchase_view_tree"/>
-            <field name="act_window" ref="act_purchase_form_draft"/>
+            <field name="domain">[('state', '=', 'draft')]</field>
+            <field name="act_window" ref="act_purchase_form"/>
         </record>
-        <record model="ir.action.act_window.view" id="act_purchase_form_draft_view2">
+        <record model="ir.action.act_window.domain"
+            id="act_purchase_form_domain_quotation">
+            <field name="name">Quotation</field>
             <field name="sequence" eval="20"/>
-            <field name="view" ref="purchase_view_form"/>
-            <field name="act_window" ref="act_purchase_form_draft"/>
-        </record>
-        <menuitem parent="menu_purchase_form" action="act_purchase_form_draft"
-            id="menu_purchase_form_draft" sequence="20"/>
-
-        <record model="ir.action.act_window" id="act_purchase_form_quotation">
-            <field name="name">Purchases in Quotation</field>
-            <field name="res_model">purchase.purchase</field>
             <field name="domain">[('state', '=', 'quotation')]</field>
+            <field name="act_window" ref="act_purchase_form"/>
         </record>
-        <record model="ir.action.act_window.view" id="act_purchase_form_quotation_view1">
-            <field name="sequence" eval="10"/>
-            <field name="view" ref="purchase_view_tree"/>
-            <field name="act_window" ref="act_purchase_form_quotation"/>
-        </record>
-        <record model="ir.action.act_window.view" id="act_purchase_form_quotation_view2">
-            <field name="sequence" eval="20"/>
-            <field name="view" ref="purchase_view_form"/>
-            <field name="act_window" ref="act_purchase_form_quotation"/>
-        </record>
-        <menuitem parent="menu_purchase_form" action="act_purchase_form_quotation"
-            id="menu_purchase_form_quotation" sequence="30"/>
-
-        <record model="ir.action.act_window" id="act_purchase_form_confirmed">
-            <field name="name">Confirmed Purchases</field>
-            <field name="res_model">purchase.purchase</field>
+        <record model="ir.action.act_window.domain"
+            id="act_purchase_form_domain_confirmed">
+            <field name="name">Confirmed</field>
+            <field name="sequence" eval="30"/>
             <field name="domain">[('state', '=', 'confirmed')]</field>
+            <field name="act_window" ref="act_purchase_form"/>
         </record>
-        <record model="ir.action.act_window.view" id="act_purchase_form_confirmed_view1">
-            <field name="sequence" eval="10"/>
-            <field name="view" ref="purchase_view_tree"/>
-            <field name="act_window" ref="act_purchase_form_confirmed"/>
+        <record model="ir.action.act_window.domain"
+            id="act_purchase_form_domain_all">
+            <field name="name">All</field>
+            <field name="sequence" eval="9999"/>
+            <field name="domain"></field>
+            <field name="act_window" ref="act_purchase_form"/>
         </record>
-        <record model="ir.action.act_window.view" id="act_purchase_form_confirmed_view2">
-            <field name="sequence" eval="20"/>
-            <field name="view" ref="purchase_view_form"/>
-            <field name="act_window" ref="act_purchase_form_confirmed"/>
+        <menuitem parent="menu_purchase" action="act_purchase_form"
+            id="menu_purchase_form" sequence="10"/>
+        <record model="ir.ui.menu-res.group" id="menu_purchase_form_group_purchase">
+            <field name="menu" ref="menu_purchase_form"/>
+            <field name="group" ref="group_purchase"/>
         </record>
-        <menuitem parent="menu_purchase_form" action="act_purchase_form_confirmed"
-            id="menu_purchase_form_confirmed" sequence="40"/>
 
         <menuitem name="Reporting" parent="menu_purchase"
             id="menu_reporting" sequence="100" active="0"/>
@@ -409,90 +262,21 @@ this repository contains the full copyright notices and license terms. -->
         <record model="ir.ui.view" id="purchase_line_view_form">
             <field name="model">purchase.line</field>
             <field name="type">form</field>
-            <field name="arch" type="xml">
-                <![CDATA[
-                <form string="Purchase Line" cursor="product">
-                    <label name="purchase"/>
-                    <field name="purchase" colspan="3"/>
-                    <notebook colspan="4">
-                        <page string="General" id="general">
-                            <label name="type"/>
-                            <field name="type"/>
-                            <label name="sequence"/>
-                            <field name="sequence"/>
-                            <label name="product"/>
-                            <field name="product"
-                                view_ids="purchase.product_view_list_purchase_line"/>
-                            <newline/>
-                            <label name="description"/>
-                            <field name="description" colspan="3"
-                                spell="Get(Eval('_parent_purchase', {}), 'party_lang')"/>
-                            <label name="quantity"/>
-                            <field name="quantity"/>
-                            <label name="unit"/>
-                            <field name="unit"/>
-                            <label name="unit_price"/>
-                            <field name="unit_price"/>
-                            <label name="amount"/>
-                            <field name="amount"/>
-                            <label name="delivery_date"/>
-                            <field name="delivery_date"/>
-                            <field name="taxes" colspan="4"/>
-                        </page>
-                        <page string="Notes" id="notes">
-                            <separator name="note" colspan="4"/>
-                            <field name="note" colspan="4"
-                                spell="Get(Eval('_parent_purchase', {}), 'party_lang')"/>
-                        </page>
-                    </notebook>
-                    <field name="unit_digits" invisible="1" colspan="4"/>
-                </form>
-                ]]>
-            </field>
+            <field name="name">purchase_line_form</field>
         </record>
 
         <record model="ir.ui.view" id="purchase_line_view_tree">
             <field name="model">purchase.line</field>
             <field name="type">tree</field>
             <field name="priority" eval="10"/>
-            <field name="arch" type="xml">
-                <![CDATA[
-                <tree string="Purchase Lines">
-                    <field name="purchase"/>
-                    <field name="type"/>
-                    <field name="product"/>
-                    <field name="description"/>
-                    <field name="quantity"/>
-                    <field name="unit"/>
-                    <field name="unit_price"/>
-                    <field name="taxes"/>
-                    <field name="amount"/>
-                    <field name="unit_digits" tree_invisible="1"/>
-                </tree>
-                ]]>
-            </field>
+            <field name="name">purchase_line_tree</field>
         </record>
 
         <record model="ir.ui.view" id="purchase_line_view_tree_sequence">
             <field name="model">purchase.line</field>
             <field name="type">tree</field>
             <field name="priority" eval="20"/>
-            <field name="arch" type="xml">
-                <![CDATA[
-                <tree string="Lines" sequence="sequence">
-                    <field name="type"/>
-                    <field name="product"/>
-                    <field name="description"/>
-                    <field name="quantity"/>
-                    <field name="unit"/>
-                    <field name="unit_price"/>
-                    <field name="taxes"/>
-                    <field name="amount" expand="1"/>
-                    <field name="sequence" tree_invisible="1"/>
-                    <field name="unit_digits" tree_invisible="1"/>
-                </tree>
-                ]]>
-            </field>
+            <field name="name">purchase_line_tree_sequence</field>
         </record>
 
         <record model="ir.model.access" id="access_purchase_line">
@@ -514,59 +298,20 @@ this repository contains the full copyright notices and license terms. -->
         <record model="ir.ui.view" id="product_supplier_view_form">
             <field name="model">purchase.product_supplier</field>
             <field name="type">form</field>
-            <field name="arch" type="xml">
-                <![CDATA[
-                <form string="Product Supplier">
-                    <label name="product"/>
-                    <field name="product" colspan="3"/>
-                    <label name="party"/>
-                    <field name="party"/>
-                    <label name="sequence"/>
-                    <field name="sequence"/>
-                    <label name="name"/>
-                    <field name="name"/>
-                    <label name="code"/>
-                    <field name="code"/>
-                    <label name="delivery_time"/>
-                    <field name="delivery_time"/>
-                    <newline/>
-                    <label name="currency"/>
-                    <field name="currency"/>
-                    <field name="prices" colspan="4"/>
-                </form>
-                ]]>
-            </field>
+            <field name="name">product_supplier_form</field>
         </record>
         <record model="ir.ui.view" id="product_supplier_view_tree">
             <field name="model">purchase.product_supplier</field>
             <field name="type">tree</field>
             <field name="priority" eval="10"/>
-            <field name="arch" type="xml">
-                <![CDATA[
-                <tree string="Product Suppliers">
-                    <field name="product"/>
-                    <field name="party"/>
-                    <field name="name"/>
-                    <field name="code"/>
-                    <field name="sequence"/>
-                </tree>
-                ]]>
-            </field>
+            <field name="name">product_supplier_tree</field>
         </record>
 
         <record model="ir.ui.view" id="product_supplier_view_tree_sequence">
             <field name="model">purchase.product_supplier</field>
             <field name="type">tree</field>
             <field name="priority" eval="20"/>
-            <field name="arch" type="xml">
-                <![CDATA[
-                <tree string="Product Suppliers" sequence="sequence">
-                    <field name="party"/>
-                    <field name="name"/>
-                    <field name="code"/>
-                </tree>
-                ]]>
-            </field>
+            <field name="name">product_supplier_tree_sequence</field>
         </record>
 
         <record model="ir.rule.group" id="rule_group_product_supplier">
@@ -574,118 +319,36 @@ this repository contains the full copyright notices and license terms. -->
             <field name="global_p" eval="True"/>
         </record>
         <record model="ir.rule" id="rule_product_supplier">
-            <field name="field" search="[('name', '=', 'company'), ('model.model', '=', 'purchase.product_supplier')]"/>
-            <field name="operator">=</field>
-            <field name="operand">User/Current Company</field>
+            <field name="domain">[('company', '=', user.company.id if user.company else None)]</field>
             <field name="rule_group" ref="rule_group_product_supplier"/>
         </record>
 
         <record model="ir.ui.view" id="product_supplier_price_view_form">
             <field name="model">purchase.product_supplier.price</field>
             <field name="type">form</field>
-            <field name="arch" type="xml">
-                <![CDATA[
-                <form string="Product Supplier Price" col="6">
-                    <label name="product_supplier"/>
-                    <field name="product_supplier" colspan="5"/>
-                    <label name="quantity"/>
-                    <field name="quantity"/>
-                    <label name="unit_price"/>
-                    <field name="unit_price"/>
-                </form>
-                ]]>
-            </field>
+            <field name="name">product_supplier_price_form</field>
         </record>
         <record model="ir.ui.view" id="product_supplier_price_view_tree">
             <field name="model">purchase.product_supplier.price</field>
             <field name="type">tree</field>
-            <field name="arch" type="xml">
-                <![CDATA[
-                <tree string="Product Supplier Prices">
-                    <field name="product_supplier"/>
-                    <field name="quantity"/>
-                    <field name="unit_price"/>
-                </tree>
-                ]]>
-            </field>
+            <field name="name">product_supplier_price_tree</field>
         </record>
 
         <record model="ir.ui.view" id="template_view_form">
             <field name="model">product.template</field>
             <field name="inherit" ref="product.template_view_form"/>
-            <field name="arch" type="xml">
-                <![CDATA[
-                <data>
-                    <xpath expr="/form/notebook/page[@id="general"]/field[@name="cost_price_method"]"
-                        position="after">
-                        <label name="purchasable"/>
-                        <field name="purchasable"/>
-                    </xpath>
-                    <xpath expr="/form/notebook/page[@id="general"]"
-                        position="after">
-                        <page string="Suppliers"
-                            states="{'invisible': Not(Bool(Eval('purchasable')))}"
-                            id="suppliers">
-                            <label name="purchasable"/>
-                            <field name="purchasable"/>
-                            <label name="purchase_uom"/>
-                            <field name="purchase_uom"/>
-                            <field name="product_suppliers" colspan="4"
-                                view_ids="purchase.product_supplier_view_tree_sequence"/>
-                        </page>
-                    </xpath>
-                </data>
-                ]]>
-            </field>
+            <field name="name">template_form</field>
         </record>
         <record model="ir.ui.view" id="template_view_tree">
             <field name="model">product.template</field>
             <field name="inherit" ref="product.template_view_tree"/>
-            <field name="arch" type="xml">
-                <![CDATA[
-                <data>
-                    <xpath expr="/tree/field[@name="default_uom"]"
-                        position="after">
-                        <field name="purchasable"/>
-                    </xpath>
-                </data>
-                ]]>
-            </field>
+            <field name="name">template_tree</field>
         </record>
 
         <record model="ir.ui.view" id="move_view_form">
             <field name="model">stock.move</field>
             <field name="inherit" ref="stock.move_view_form"/>
-            <field name="arch" type="xml">
-                <![CDATA[
-                <data>
-                    <xpath expr="/form/field[@name="uom"]"
-                        position="after">
-                        <label name="purchase_quantity"/>
-                        <field name="purchase_quantity"/>
-                        <label name="purchase_unit"/>
-                        <field name="purchase_unit"/>
-                    </xpath>
-                    <xpath expr="/form/field[@name="currency"]"
-                        position="after">
-                        <label name="purchase_unit_price"/>
-                        <field name="purchase_unit_price"/>
-                        <label name="purchase_currency"/>
-                        <field name="purchase_currency"/>
-                    </xpath>
-                    <xpath expr="/form/field[@name="effective_date"]"
-                        position="after">
-                        <label name="purchase"/>
-                        <field name="purchase"/>
-                        <newline/>
-                    </xpath>
-                    <xpath expr="/form/field[@name="unit_digits"]"
-                        position="after">
-                        <field name="purchase_unit_digits" invisible="1" colspan="4"/>
-                    </xpath>
-                </data>
-                ]]>
-            </field>
+            <field name="name">move_form</field>
         </record>
 
         <record model="ir.action.wizard" id="act_open_supplier">
@@ -703,9 +366,7 @@ this repository contains the full copyright notices and license terms. -->
             <field name="global_p" eval="True"/>
         </record>
         <record model="ir.rule" id="rule_purchase1">
-            <field name="field" search="[('name', '=', 'company'), ('model.model', '=', 'purchase.purchase')]"/>
-            <field name="operator">=</field>
-            <field name="operand">User/Current Company</field>
+            <field name="domain">[('company', '=', user.company.id if user.company else None)]</field>
             <field name="rule_group" ref="rule_group_purchase"/>
         </record>
 
diff --git a/setup.py b/setup.py
index 551b517..b231cb4 100644
--- a/setup.py
+++ b/setup.py
@@ -25,10 +25,10 @@ requires = []
 for dep in info.get('depends', []):
     if not re.match(r'(ir|res|webdav)(\W|$)', dep):
         requires.append('trytond_%s >= %s.%s, < %s.%s' %
-                (dep, major_version, minor_version, major_version,
-                    minor_version + 1))
+            (dep, major_version, minor_version, major_version,
+                minor_version + 1))
 requires.append('trytond >= %s.%s, < %s.%s' %
-        (major_version, minor_version, major_version, minor_version + 1))
+    (major_version, minor_version, major_version, minor_version + 1))
 
 setup(name='trytond_purchase',
     version=info.get('version', '0.0.1'),
@@ -36,16 +36,16 @@ setup(name='trytond_purchase',
     long_description=read('README'),
     author='Tryton',
     url='http://www.tryton.org/',
-    download_url="http://downloads.tryton.org/" + \
-        info.get('version', '0.0.1').rsplit('.', 1)[0] + '/',
+    download_url=("http://downloads.tryton.org/" +
+        info.get('version', '0.0.1').rsplit('.', 1)[0] + '/'),
     package_dir={'trytond.modules.purchase': '.'},
     packages=[
         'trytond.modules.purchase',
         'trytond.modules.purchase.tests',
         ],
     package_data={
-        'trytond.modules.purchase': info.get('xml', []) \
-            + ['tryton.cfg', 'locale/*.po', 'purchase.odt'],
+        'trytond.modules.purchase': (info.get('xml', [])
+            + ['tryton.cfg', 'view/*.xml', 'locale/*.po', 'purchase.odt']),
         },
     classifiers=[
         'Development Status :: 5 - Production/Stable',
@@ -56,6 +56,7 @@ setup(name='trytond_purchase',
         'Intended Audience :: Legal Industry',
         'License :: OSI Approved :: GNU General Public License (GPL)',
         'Natural Language :: Bulgarian',
+        'Natural Language :: Catalan',
         'Natural Language :: Czech',
         'Natural Language :: Dutch',
         'Natural Language :: English',
diff --git a/stock.xml b/stock.xml
index a5dedcf..8a60db8 100644
--- a/stock.xml
+++ b/stock.xml
@@ -7,20 +7,7 @@ this repository contains the full copyright notices and license terms. -->
             <field name="model">stock.move</field>
             <field name="type">tree</field>
             <field name="priority" eval="20"/>
-            <field name="arch" type="xml">
-                <![CDATA[
-                <tree string="Moves">
-                    <field name="product"/>
-                    <field name="from_location"/>
-                    <field name="to_location"/>
-                    <field name="quantity"/>
-                    <field name="uom"/>
-                    <field name="state"/>
-                    <field name="purchase_exception_state"/>
-                    <field name="unit_digits" tree_invisible="1"/>
-                </tree>
-                ]]>
-            </field>
+            <field name="name">move_list_shipment</field>
         </record>
 
         <record model="ir.model.access" id="access_purchase_group_stock">
diff --git a/tryton.cfg b/tryton.cfg
index 675c575..a396b5e 100644
--- a/tryton.cfg
+++ b/tryton.cfg
@@ -1,5 +1,5 @@
 [tryton]
-version=2.6.1
+version=2.8.0
 depends:
     account
     account_invoice
diff --git a/trytond_purchase.egg-info/PKG-INFO b/trytond_purchase.egg-info/PKG-INFO
index a581e0d..38ea800 100644
--- a/trytond_purchase.egg-info/PKG-INFO
+++ b/trytond_purchase.egg-info/PKG-INFO
@@ -1,12 +1,12 @@
 Metadata-Version: 1.1
 Name: trytond-purchase
-Version: 2.6.1
+Version: 2.8.0
 Summary: Tryton module for purchase
 Home-page: http://www.tryton.org/
 Author: Tryton
 Author-email: UNKNOWN
 License: GPL-3
-Download-URL: http://downloads.tryton.org/2.6/
+Download-URL: http://downloads.tryton.org/2.8/
 Description: trytond_purchase
         ================
         
@@ -52,6 +52,7 @@ Classifier: Intended Audience :: Financial and Insurance Industry
 Classifier: Intended Audience :: Legal Industry
 Classifier: License :: OSI Approved :: GNU General Public License (GPL)
 Classifier: Natural Language :: Bulgarian
+Classifier: Natural Language :: Catalan
 Classifier: Natural Language :: Czech
 Classifier: Natural Language :: Dutch
 Classifier: Natural Language :: English
diff --git a/trytond_purchase.egg-info/SOURCES.txt b/trytond_purchase.egg-info/SOURCES.txt
index 8504cf4..8e0a17a 100644
--- a/trytond_purchase.egg-info/SOURCES.txt
+++ b/trytond_purchase.egg-info/SOURCES.txt
@@ -37,4 +37,22 @@ trytond_purchase.egg-info/dependency_links.txt
 trytond_purchase.egg-info/entry_points.txt
 trytond_purchase.egg-info/not-zip-safe
 trytond_purchase.egg-info/requires.txt
-trytond_purchase.egg-info/top_level.txt
\ No newline at end of file
+trytond_purchase.egg-info/top_level.txt
+view/configuration_form.xml
+view/handle_invoice_exception_ask_form.xml
+view/handle_shipment_exception_ask_form.xml
+view/move_form.xml
+view/move_list_shipment.xml
+view/product_list_purchase_line.xml
+view/product_supplier_form.xml
+view/product_supplier_price_form.xml
+view/product_supplier_price_tree.xml
+view/product_supplier_tree.xml
+view/product_supplier_tree_sequence.xml
+view/purchase_form.xml
+view/purchase_line_form.xml
+view/purchase_line_tree.xml
+view/purchase_line_tree_sequence.xml
+view/purchase_tree.xml
+view/template_form.xml
+view/template_tree.xml
\ No newline at end of file
diff --git a/trytond_purchase.egg-info/requires.txt b/trytond_purchase.egg-info/requires.txt
index f0ae06a..54d6265 100644
--- a/trytond_purchase.egg-info/requires.txt
+++ b/trytond_purchase.egg-info/requires.txt
@@ -1,9 +1,9 @@
-trytond_account >= 2.6, < 2.7
-trytond_account_invoice >= 2.6, < 2.7
-trytond_account_product >= 2.6, < 2.7
-trytond_company >= 2.6, < 2.7
-trytond_currency >= 2.6, < 2.7
-trytond_party >= 2.6, < 2.7
-trytond_product >= 2.6, < 2.7
-trytond_stock >= 2.6, < 2.7
-trytond >= 2.6, < 2.7
\ No newline at end of file
+trytond_account >= 2.8, < 2.9
+trytond_account_invoice >= 2.8, < 2.9
+trytond_account_product >= 2.8, < 2.9
+trytond_company >= 2.8, < 2.9
+trytond_currency >= 2.8, < 2.9
+trytond_party >= 2.8, < 2.9
+trytond_product >= 2.8, < 2.9
+trytond_stock >= 2.8, < 2.9
+trytond >= 2.8, < 2.9
\ No newline at end of file
diff --git a/view/configuration_form.xml b/view/configuration_form.xml
new file mode 100644
index 0000000..8c37150
--- /dev/null
+++ b/view/configuration_form.xml
@@ -0,0 +1,9 @@
+<?xml version="1.0"?>
+<!-- This file is part of Tryton.  The COPYRIGHT file at the top level of
+this repository contains the full copyright notices and license terms. -->
+<form string="Purchase Configuration">
+    <label name="purchase_sequence"/>
+    <field name="purchase_sequence"/>
+    <label name="purchase_invoice_method" />
+    <field name="purchase_invoice_method" />
+</form>
diff --git a/view/handle_invoice_exception_ask_form.xml b/view/handle_invoice_exception_ask_form.xml
new file mode 100644
index 0000000..bb0cf4a
--- /dev/null
+++ b/view/handle_invoice_exception_ask_form.xml
@@ -0,0 +1,9 @@
+<?xml version="1.0"?>
+<!-- This file is part of Tryton.  The COPYRIGHT file at the top level of
+this repository contains the full copyright notices and license terms. -->
+<form string="Handle Invoice Exception" col="2">
+    <image name="tryton-dialog-information" xexpand="0" xfill="0"/>
+    <label string="Choose invoices to recreate" id="choose"
+        yalign="0.0" xalign="0.0" xexpand="1"/>
+    <field name="recreate_invoices" colspan="2"/>
+</form>
diff --git a/view/handle_shipment_exception_ask_form.xml b/view/handle_shipment_exception_ask_form.xml
new file mode 100644
index 0000000..5319d45
--- /dev/null
+++ b/view/handle_shipment_exception_ask_form.xml
@@ -0,0 +1,10 @@
+<?xml version="1.0"?>
+<!-- This file is part of Tryton.  The COPYRIGHT file at the top level of
+this repository contains the full copyright notices and license terms. -->
+<form string="Handle shipment Exception" col="2">
+    <image name="tryton-dialog-information" xexpand="0" xfill="0"/>
+    <label string="Choose move to recreate" id="choose"
+        yalign="0.0" xalign="0.0" xexpand="1"/>
+    <field name="recreate_moves" colspan="2"
+        view_ids="stock.move_view_tree"/>
+</form>
diff --git a/view/move_form.xml b/view/move_form.xml
new file mode 100644
index 0000000..aaf6709
--- /dev/null
+++ b/view/move_form.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0"?>
+<!-- This file is part of Tryton.  The COPYRIGHT file at the top level of
+this repository contains the full copyright notices and license terms. -->
+<data>
+    <xpath expr="/form/field[@name='uom']" position="after">
+        <label name="purchase_quantity"/>
+        <field name="purchase_quantity"/>
+        <label name="purchase_unit"/>
+        <field name="purchase_unit"/>
+    </xpath>
+    <xpath expr="/form/field[@name='currency']" position="after">
+        <label name="purchase_unit_price"/>
+        <field name="purchase_unit_price"/>
+        <label name="purchase_currency"/>
+        <field name="purchase_currency"/>
+    </xpath>
+    <xpath expr="/form/field[@name='effective_date']" position="after">
+        <label name="purchase"/>
+        <field name="purchase"/>
+        <newline/>
+    </xpath>
+    <xpath expr="/form/field[@name='unit_digits']" position="after">
+        <field name="purchase_unit_digits" invisible="1" colspan="4"/>
+    </xpath>
+</data>
diff --git a/view/move_list_shipment.xml b/view/move_list_shipment.xml
new file mode 100644
index 0000000..e9d8741
--- /dev/null
+++ b/view/move_list_shipment.xml
@@ -0,0 +1,13 @@
+<?xml version="1.0"?>
+<!-- This file is part of Tryton.  The COPYRIGHT file at the top level of
+this repository contains the full copyright notices and license terms. -->
+<tree string="Moves">
+    <field name="product"/>
+    <field name="from_location"/>
+    <field name="to_location"/>
+    <field name="quantity"/>
+    <field name="uom"/>
+    <field name="state"/>
+    <field name="purchase_exception_state"/>
+    <field name="unit_digits" tree_invisible="1"/>
+</tree>
diff --git a/view/product_list_purchase_line.xml b/view/product_list_purchase_line.xml
new file mode 100644
index 0000000..5c638ca
--- /dev/null
+++ b/view/product_list_purchase_line.xml
@@ -0,0 +1,13 @@
+<?xml version="1.0"?>
+<!-- This file is part of Tryton.  The COPYRIGHT file at the top level of
+this repository contains the full copyright notices and license terms. -->
+<tree string="Products">
+    <field name="template"/>
+    <field name="code"/>
+    <field name="list_price_uom"/>
+    <field name="cost_price_uom"/>
+    <field name="quantity"/>
+    <field name="forecast_quantity"/>
+    <field name="default_uom"/>
+    <field name="active"/>
+</tree>
diff --git a/view/product_supplier_form.xml b/view/product_supplier_form.xml
new file mode 100644
index 0000000..ee69174
--- /dev/null
+++ b/view/product_supplier_form.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0"?>
+<!-- This file is part of Tryton.  The COPYRIGHT file at the top level of
+this repository contains the full copyright notices and license terms. -->
+<form string="Product Supplier">
+    <label name="product"/>
+    <field name="product" colspan="3"/>
+    <label name="party"/>
+    <field name="party"/>
+    <label name="sequence"/>
+    <field name="sequence"/>
+    <label name="name"/>
+    <field name="name"/>
+    <label name="code"/>
+    <field name="code"/>
+    <label name="delivery_time"/>
+    <field name="delivery_time"/>
+    <newline/>
+    <label name="currency"/>
+    <field name="currency"/>
+    <field name="prices" colspan="4"/>
+</form>
diff --git a/view/product_supplier_price_form.xml b/view/product_supplier_price_form.xml
new file mode 100644
index 0000000..6237a12
--- /dev/null
+++ b/view/product_supplier_price_form.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0"?>
+<!-- This file is part of Tryton.  The COPYRIGHT file at the top level of
+this repository contains the full copyright notices and license terms. -->
+<form string="Product Supplier Price" col="6">
+    <label name="product_supplier"/>
+    <field name="product_supplier" colspan="5"/>
+    <label name="quantity"/>
+    <field name="quantity"/>
+    <label name="unit_price"/>
+    <field name="unit_price"/>
+</form>
diff --git a/view/product_supplier_price_tree.xml b/view/product_supplier_price_tree.xml
new file mode 100644
index 0000000..4dbf5a9
--- /dev/null
+++ b/view/product_supplier_price_tree.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0"?>
+<!-- This file is part of Tryton.  The COPYRIGHT file at the top level of
+this repository contains the full copyright notices and license terms. -->
+<tree string="Product Supplier Prices">
+    <field name="product_supplier"/>
+    <field name="quantity"/>
+    <field name="unit_price"/>
+</tree>
diff --git a/view/product_supplier_tree.xml b/view/product_supplier_tree.xml
new file mode 100644
index 0000000..1f9cf9e
--- /dev/null
+++ b/view/product_supplier_tree.xml
@@ -0,0 +1,10 @@
+<?xml version="1.0"?>
+<!-- This file is part of Tryton.  The COPYRIGHT file at the top level of
+this repository contains the full copyright notices and license terms. -->
+<tree string="Product Suppliers">
+    <field name="product"/>
+    <field name="party"/>
+    <field name="name"/>
+    <field name="code"/>
+    <field name="sequence"/>
+</tree>
diff --git a/view/product_supplier_tree_sequence.xml b/view/product_supplier_tree_sequence.xml
new file mode 100644
index 0000000..f3ae6f6
--- /dev/null
+++ b/view/product_supplier_tree_sequence.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0"?>
+<!-- This file is part of Tryton.  The COPYRIGHT file at the top level of
+this repository contains the full copyright notices and license terms. -->
+<tree string="Product Suppliers" sequence="sequence">
+    <field name="party"/>
+    <field name="name"/>
+    <field name="code"/>
+</tree>
diff --git a/view/purchase_form.xml b/view/purchase_form.xml
new file mode 100644
index 0000000..20263d1
--- /dev/null
+++ b/view/purchase_form.xml
@@ -0,0 +1,79 @@
+<?xml version="1.0"?>
+<!-- This file is part of Tryton.  The COPYRIGHT file at the top level of
+this repository contains the full copyright notices and license terms. -->
+<form string="Purchase" col="6">
+    <label name="party"/>
+    <field name="party"/>
+    <label name="invoice_address"/>
+    <field name="invoice_address"/>
+    <label name="supplier_reference"/>
+    <field name="supplier_reference"/>
+    <label name="description"/>
+    <field name="description" colspan="3"/>
+    <label name="reference"/>
+    <field name="reference"/>
+    <notebook colspan="6">
+        <page string="Purchase" id="purchase">
+            <label name="purchase_date"/>
+            <field name="purchase_date"/>
+            <label name="payment_term"/>
+            <field name="payment_term"/>
+            <label name="warehouse"/>
+            <field name="warehouse"/>
+            <label name="currency"/>
+            <field name="currency"/>
+            <field name="lines" colspan="4"
+                view_ids="purchase.purchase_line_view_tree_sequence"/>
+            <group col="2" colspan="2" id="states">
+                <label name="invoice_state"/>
+                <field name="invoice_state"/>
+                <label name="shipment_state"/>
+                <field name="shipment_state"/>
+                <label name="state"/>
+                <field name="state"/>
+            </group>
+            <group col="2" colspan="2" id="amount_buttons">
+                <label name="untaxed_amount" xalign="1.0" xexpand="1"/>
+                <field name="untaxed_amount" xalign="1.0" xexpand="0"/>
+                <label name="tax_amount" xalign="1.0" xexpand="1"/>
+                <field name="tax_amount" xalign="1.0" xexpand="0"/>
+                <label name="total_amount" xalign="1.0" xexpand="1"/>
+                <field name="total_amount" xalign="1.0" xexpand="0"/>
+                <group col="6" colspan="2" id="buttons">
+                    <button name="cancel" string="Cancel"
+                        icon="tryton-cancel"/>
+                    <button name="draft" string="Draft"/>
+                    <button name="quote" string="Quote"
+                        icon="tryton-go-next"/>
+                    <button name="handle_invoice_exception"
+                            string="Handle Invoice Exception"
+                            icon="tryton-go-next"/>
+                    <button name="handle_shipment_exception"
+                            string="Handle Shipment Exception"
+                            icon="tryton-go-next"/>
+                    <button name="confirm" string="Confirm"
+                        icon="tryton-ok"/>
+                </group>
+            </group>
+        </page>
+        <page string="Other Info" id="info">
+            <label name="company"/>
+            <field name="company"/>
+            <label name="invoice_method"/>
+            <field name="invoice_method"/>
+            <separator name="comment" colspan="4"/>
+            <field name="comment" colspan="4" spell="Eval('party_lang')"/>
+        </page>
+        <page string="Invoices" id="invoices">
+            <field name="invoices" colspan="4"/>
+        </page>
+        <page string="Shipments" id="shipments">
+            <field name="moves" colspan="4"
+                view_ids="purchase.move_view_list_shipment"/>
+            <field name="shipments" colspan="4"/>
+            <field name="shipment_returns" colspan="4"/>
+        </page>
+    </notebook>
+    <field name="currency_digits" invisible="1" colspan="6"/>
+    <field name="party_lang" invisible="1" colspan="6"/>
+</form>
diff --git a/view/purchase_line_form.xml b/view/purchase_line_form.xml
new file mode 100644
index 0000000..cda5196
--- /dev/null
+++ b/view/purchase_line_form.xml
@@ -0,0 +1,39 @@
+<?xml version="1.0"?>
+<!-- This file is part of Tryton.  The COPYRIGHT file at the top level of
+this repository contains the full copyright notices and license terms. -->
+<form string="Purchase Line" cursor="product">
+    <label name="purchase"/>
+    <field name="purchase" colspan="3"/>
+    <notebook colspan="4">
+        <page string="General" id="general">
+            <label name="type"/>
+            <field name="type"/>
+            <label name="sequence"/>
+            <field name="sequence"/>
+            <label name="product"/>
+            <field name="product"
+                view_ids="purchase.product_view_list_purchase_line"/>
+            <newline/>
+            <label name="description"/>
+            <field name="description" colspan="3"
+                spell="Get(Eval('_parent_purchase', {}), 'party_lang')"/>
+            <label name="quantity"/>
+            <field name="quantity"/>
+            <label name="unit"/>
+            <field name="unit"/>
+            <label name="unit_price"/>
+            <field name="unit_price"/>
+            <label name="amount"/>
+            <field name="amount"/>
+            <label name="delivery_date"/>
+            <field name="delivery_date"/>
+            <field name="taxes" colspan="4"/>
+        </page>
+        <page string="Notes" id="notes">
+            <separator name="note" colspan="4"/>
+            <field name="note" colspan="4"
+                spell="Get(Eval('_parent_purchase', {}), 'party_lang')"/>
+        </page>
+    </notebook>
+    <field name="unit_digits" invisible="1" colspan="4"/>
+</form>
diff --git a/view/purchase_line_tree.xml b/view/purchase_line_tree.xml
new file mode 100644
index 0000000..369b3f7
--- /dev/null
+++ b/view/purchase_line_tree.xml
@@ -0,0 +1,15 @@
+<?xml version="1.0"?>
+<!-- This file is part of Tryton.  The COPYRIGHT file at the top level of
+this repository contains the full copyright notices and license terms. -->
+<tree string="Purchase Lines">
+    <field name="purchase"/>
+    <field name="type"/>
+    <field name="product"/>
+    <field name="description"/>
+    <field name="quantity"/>
+    <field name="unit"/>
+    <field name="unit_price"/>
+    <field name="taxes"/>
+    <field name="amount"/>
+    <field name="unit_digits" tree_invisible="1"/>
+</tree>
diff --git a/view/purchase_line_tree_sequence.xml b/view/purchase_line_tree_sequence.xml
new file mode 100644
index 0000000..60eac86
--- /dev/null
+++ b/view/purchase_line_tree_sequence.xml
@@ -0,0 +1,15 @@
+<?xml version="1.0"?>
+<!-- This file is part of Tryton.  The COPYRIGHT file at the top level of
+this repository contains the full copyright notices and license terms. -->
+<tree string="Lines" sequence="sequence">
+    <field name="type"/>
+    <field name="product"/>
+    <field name="description"/>
+    <field name="quantity"/>
+    <field name="unit"/>
+    <field name="unit_price"/>
+    <field name="taxes"/>
+    <field name="amount" expand="1"/>
+    <field name="sequence" tree_invisible="1"/>
+    <field name="unit_digits" tree_invisible="1"/>
+</tree>
diff --git a/view/purchase_tree.xml b/view/purchase_tree.xml
new file mode 100644
index 0000000..7778ed4
--- /dev/null
+++ b/view/purchase_tree.xml
@@ -0,0 +1,19 @@
+<?xml version="1.0"?>
+<!-- This file is part of Tryton.  The COPYRIGHT file at the top level of
+this repository contains the full copyright notices and license terms. -->
+<tree string="Purchases">
+    <field name="reference"/>
+    <field name="supplier_reference"/>
+    <field name="purchase_date"/>
+    <field name="party"/>
+    <field name="warehouse"/>
+    <field name="currency"/>
+    <field name="untaxed_amount"/>
+    <field name="total_amount"/>
+    <field name="state"/>
+    <field name="invoice_state"/>
+    <field name="shipment_state"/>
+    <field name="description"/>
+    <field name="currency_digits" tree_invisible="1"/>
+    <field name="create_date" tree_invisible="1"/>
+</tree>
diff --git a/view/template_form.xml b/view/template_form.xml
new file mode 100644
index 0000000..2afde82
--- /dev/null
+++ b/view/template_form.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0"?>
+<!-- This file is part of Tryton.  The COPYRIGHT file at the top level of
+this repository contains the full copyright notices and license terms. -->
+<data>
+    <xpath
+        expr="/form/notebook/page[@id='general']/field[@name='cost_price_method']"
+        position="after">
+        <label name="purchasable"/>
+        <field name="purchasable"/>
+    </xpath>
+    <xpath expr="/form/notebook/page[@id='general']" position="after">
+        <page string="Suppliers"
+            states="{'invisible': Not(Bool(Eval('purchasable')))}"
+            id="suppliers">
+            <label name="purchasable"/>
+            <field name="purchasable"/>
+            <label name="purchase_uom"/>
+            <field name="purchase_uom"/>
+            <field name="product_suppliers" colspan="4"
+                view_ids="purchase.product_supplier_view_tree_sequence"/>
+        </page>
+    </xpath>
+</data>
diff --git a/view/template_tree.xml b/view/template_tree.xml
new file mode 100644
index 0000000..c4fd34d
--- /dev/null
+++ b/view/template_tree.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0"?>
+<!-- This file is part of Tryton.  The COPYRIGHT file at the top level of
+this repository contains the full copyright notices and license terms. -->
+<data>
+    <xpath expr="/tree/field[@name='default_uom']" position="after">
+        <field name="purchasable"/>
+    </xpath>
+</data>
commit 91c3ddee2f43b4a5bf715f91c8eeb89a6ebc431e
Author: Mathias Behrle <mathiasb at m9s.biz>
Date:   Fri Feb 15 20:50:43 2013 +0100

    Adding upstream version 2.6.1.

diff --git a/CHANGELOG b/CHANGELOG
index 99fd87c..7f55da7 100644
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -1,3 +1,6 @@
+Version 2.6.1 - 2012-12-23
+* Bug fixes (see mercurial logs for details)
+
 Version 2.6.0 - 2012-10-22
 * Bug fixes (see mercurial logs for details)
 * Manage negative amount in purchase
diff --git a/PKG-INFO b/PKG-INFO
index e6eec6b..ee5c3e1 100644
--- a/PKG-INFO
+++ b/PKG-INFO
@@ -1,6 +1,6 @@
-Metadata-Version: 1.0
+Metadata-Version: 1.1
 Name: trytond_purchase
-Version: 2.6.0
+Version: 2.6.1
 Summary: Tryton module for purchase
 Home-page: http://www.tryton.org/
 Author: Tryton
diff --git a/purchase.py b/purchase.py
index b78c906..6b1dce4 100644
--- a/purchase.py
+++ b/purchase.py
@@ -1502,7 +1502,6 @@ class ProductSupplier(ModelSQL, ModelView):
     def compute_supply_date(self, date=None):
         '''
         Compute the supply date for the Product Supplier at the given date
-            and the next supply date
         '''
         Date = Pool().get('ir.date')
 
diff --git a/tryton.cfg b/tryton.cfg
index 1bd8331..675c575 100644
--- a/tryton.cfg
+++ b/tryton.cfg
@@ -1,5 +1,5 @@
 [tryton]
-version=2.6.0
+version=2.6.1
 depends:
     account
     account_invoice
diff --git a/trytond_purchase.egg-info/PKG-INFO b/trytond_purchase.egg-info/PKG-INFO
index dc1ad4c..a581e0d 100644
--- a/trytond_purchase.egg-info/PKG-INFO
+++ b/trytond_purchase.egg-info/PKG-INFO
@@ -1,6 +1,6 @@
-Metadata-Version: 1.0
+Metadata-Version: 1.1
 Name: trytond-purchase
-Version: 2.6.0
+Version: 2.6.1
 Summary: Tryton module for purchase
 Home-page: http://www.tryton.org/
 Author: Tryton
commit 486ba2b6d2c68546d4eaa9b54ab1e6330712e335
Author: Mathias Behrle <mathiasb at m9s.biz>
Date:   Tue Oct 23 19:53:41 2012 +0200

    Adding upstream version 2.6.0.

diff --git a/CHANGELOG b/CHANGELOG
index 1403435..99fd87c 100644
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -1,5 +1,6 @@
-Version 2.4.1 - 2012-09-02
+Version 2.6.0 - 2012-10-22
 * Bug fixes (see mercurial logs for details)
+* Manage negative amount in purchase
 
 Version 2.4.0 - 2012-04-24
 * Bug fixes (see mercurial logs for details)
diff --git a/MANIFEST.in b/MANIFEST.in
index 32879df..97a9596 100644
--- a/MANIFEST.in
+++ b/MANIFEST.in
@@ -4,6 +4,7 @@ include TODO
 include COPYRIGHT
 include CHANGELOG
 include LICENSE
+include tryton.cfg
 include *.xml
 include *.odt
 include locale/*.po
diff --git a/PKG-INFO b/PKG-INFO
index 83c8e19..e6eec6b 100644
--- a/PKG-INFO
+++ b/PKG-INFO
@@ -1,23 +1,48 @@
 Metadata-Version: 1.0
 Name: trytond_purchase
-Version: 2.4.1
-Summary: Define purchase order.
-Add product supplier and purchase informations.
-Define the purchase price as the supplier price or the cost price.
-
-With the possibilities:
-    - to follow invoice and shipment states from the purchase order.
-    - to define invoice method:
-        - Manual
-        - Based On Order
-        - Based On Shipment
-
+Version: 2.6.0
+Summary: Tryton module for purchase
 Home-page: http://www.tryton.org/
-Author: B2CK
-Author-email: info at b2ck.com
+Author: Tryton
+Author-email: UNKNOWN
 License: GPL-3
-Download-URL: http://downloads.tryton.org/2.4/
-Description: UNKNOWN
+Download-URL: http://downloads.tryton.org/2.6/
+Description: trytond_purchase
+        ================
+        
+        The purchase module of the Tryton application platform.
+        
+        Installing
+        ----------
+        
+        See INSTALL
+        
+        Support
+        -------
+        
+        If you encounter any problems with Tryton, please don't hesitate to ask
+        questions on the Tryton bug tracker, mailing list, wiki or IRC channel:
+        
+          http://bugs.tryton.org/
+          http://groups.tryton.org/
+          http://wiki.tryton.org/
+          irc://irc.freenode.net/tryton
+        
+        License
+        -------
+        
+        See LICENSE
+        
+        Copyright
+        ---------
+        
+        See COPYRIGHT
+        
+        
+        For more information please visit the Tryton web site:
+        
+          http://www.tryton.org/
+        
 Platform: UNKNOWN
 Classifier: Development Status :: 5 - Production/Stable
 Classifier: Environment :: Plugins
diff --git a/README b/README
index 7e233b2..624c11b 100644
--- a/README
+++ b/README
@@ -2,7 +2,6 @@ trytond_purchase
 ================
 
 The purchase module of the Tryton application platform.
-See __tryton__.py
 
 Installing
 ----------
diff --git a/__init__.py b/__init__.py
index 981f76a..2001f59 100644
--- a/__init__.py
+++ b/__init__.py
@@ -1,6 +1,43 @@
 #This file is part of Tryton.  The COPYRIGHT file at the top level of
 #this repository contains the full copyright notices and license terms.
 
+from trytond.pool import Pool
 from .purchase import *
 from .configuration import *
 from .invoice import *
+from .stock import *
+
+
+def register():
+    Pool.register(
+        Purchase,
+        PurchaseInvoice,
+        PurchaseIgnoredInvoice,
+        PurchaseRecreadtedInvoice,
+        PurchaseLine,
+        PurchaseLineTax,
+        PurchaseLineInvoiceLine,
+        PurchaseLineIgnoredMove,
+        PurchaseLineRecreatedMove,
+        Template,
+        Product,
+        ProductSupplier,
+        ProductSupplierPrice,
+        ShipmentIn,
+        ShipmentInReturn,
+        Move,
+        HandleShipmentExceptionAsk,
+        HandleInvoiceExceptionAsk,
+        Configuration,
+        Invoice,
+        InvoiceLine,
+        module='purchase', type_='model')
+    Pool.register(
+        PurchaseReport,
+        module='purchase', type_='report')
+    Pool.register(
+        OpenSupplier,
+        HandleShipmentException,
+        HandleInvoiceException,
+        OpenProductQuantitiesByWarehouse,
+        module='purchase', type_='wizard')
diff --git a/__tryton__.py b/__tryton__.py
deleted file mode 100644
index a470ab7..0000000
--- a/__tryton__.py
+++ /dev/null
@@ -1,137 +0,0 @@
-#This file is part of Tryton.  The COPYRIGHT file at the top level of
-#this repository contains the full copyright notices and license terms.
-{
-    'name': 'Purchase',
-    'name_bg_BG': 'Покупки',
-    'name_ca_ES': 'Compres',
-    'name_de_DE': 'Einkauf',
-    'name_es_AR': 'Compras',
-    'name_es_CO': 'Compras',
-    'name_es_ES': 'Compras',
-    'name_fr_FR': 'Achat',
-    'version': '2.4.1',
-    'author': 'B2CK',
-    'email': 'info at b2ck.com',
-    'website': 'http://www.tryton.org/',
-    'description': '''Define purchase order.
-Add product supplier and purchase informations.
-Define the purchase price as the supplier price or the cost price.
-
-With the possibilities:
-    - to follow invoice and shipment states from the purchase order.
-    - to define invoice method:
-        - Manual
-        - Based On Order
-        - Based On Shipment
-''',
-    'description_bg_BG': ''' Задаване на поръчки за покупки.
- - Добавяне на доставчици на продукти и информация за покупки.
- - Задаване на цената на покупка като цена на доствчик или фабричната цена.
-
-Със следните възможности:
-    - проследяване на фактури и състоянията на доставката от поръчка за покупка
-    - задаване на начини на фактуриране:
-        - Ръчно
-        - Въз основа на поръчка
-        - Въз основа на доставка
-''',
-    'description_ca_ES': '''- Defineix comandes de compra.
-- Afegeix informació de proveïdor i de compra als productes.
-- Defineix el preu de compra com el preu de proveïdor o preu de cost.
-
-Amb la possibilitat de:
-
-- Seguir l'estat de facturació i enviament des de la comanda de compra.
-- Definir el mètode de facturació:
-    - Manual
-    - Basat en la comanda de compra
-    - Basat en l'albarà de sortida
-''',
-    'description_de_DE': ''' - Dient der Erstellung von Einkaufsvorgängen (Entwurf, Angebot, Auftrag).
- - Fügt den Artikeln Lieferanten und Einkaufsinformationen hinzu.
- - Erlaubt die Definition des Einkaufspreises als Lieferpreis oder Einkaufspreis.
- - Fügt eine Lieferantenliste hinzu.
-
-Ermöglicht:
-    - die Verfolgung des Status von Rechnungsstellung und Versand für Einkäufe
-    - die Festlegung der Methode für die Rechnungsstellung:
-        - Manuell
-        - Nach Auftrag
-        - Nach Lieferung
-''',
-    'description_es_AR': '''Define órdenes de compra.
- - Añade información de proveedor y de compra de un producto.
- - Define el precio de compra como el precio del proveedor o el precio de coste.
-
- - Con la posibilidad de:
-    - seguir el estado de facturación y envio desde la orden de compra.
-    - definir el método de facturación:
-        - Manual
-        - Basado en orden
-        - Basado en envio
-''',
-    'description_es_CO': ''' - Definición de orden de compras.
- - Se añade información de proveedor y de compra de un producto.
- - Se define el precio de compra con el precio de proveedor o costo.
-
- - Con la posibilidad de:
-    - seguir el estado de facturación y empaque desde la orden de compra.
-    - elegir el método de facturación:
-        - Manual
-        - Basado en Orden
-        - Basado en Empaque
-''',
-    'description_es_ES': '''- Define pedidos de compra.
-- Añade información de proveedor y de compra a los productos.
-- Define el precio de compra como el precio del proveedor o el precio de coste.
-
-Con la posibilidad de:
-    - Seguir el estado de facturación y envío desde el pedido de compra.
-    - Definir el método de facturación:
-        - Manual
-        - Basado en el pedido
-        - Basado en el envío
-''',
-    'description_fr_FR': '''Defini l'ordre d'achat.
-Ajoute les fournisseurs et les informations d'achat sur le produit.
-Défini un prix d'achat par fournisseur et un prix de revient.
-
-Avec la possibilité:
-    - de suivre les états de la facture et du colis depuis la commande d'achat.
-    - de choisir la méthode de facturation:
-        - Manuelle
-        - Sur base de la commande
-        - Sur base du colis
-''',
-    'depends': [
-        'company',
-        'party',
-        'stock',
-        'account',
-        'product',
-        'account_invoice',
-        'res',
-        'ir',
-        'currency',
-        'account_product',
-    ],
-    'xml': [
-        'purchase.xml',
-        'configuration.xml',
-        'party.xml',
-        'stock.xml',
-        'product.xml',
-    ],
-    'translation': [
-        'locale/bg_BG.po',
-        'locale/ca_ES.po',
-        'locale/cs_CZ.po',
-        'locale/de_DE.po',
-        'locale/es_AR.po',
-        'locale/es_CO.po',
-        'locale/es_ES.po',
-        'locale/fr_FR.po',
-        'locale/nl_NL.po',
-        'locale/ru_RU.po',
-    ],
-}
diff --git a/configuration.py b/configuration.py
index 3974ee2..4987a16 100644
--- a/configuration.py
+++ b/configuration.py
@@ -3,12 +3,12 @@
 from trytond.model import ModelView, ModelSQL, ModelSingleton, fields
 from trytond.pyson import Eval, Bool
 
+__all__ = ['Configuration']
+
 
 class Configuration(ModelSingleton, ModelSQL, ModelView):
     'Purchase Configuration'
-    _name = 'purchase.configuration'
-    _description = __doc__
-
+    __name__ = 'purchase.configuration'
     purchase_sequence = fields.Property(fields.Many2One('ir.sequence',
             'Purchase Reference Sequence', domain=[
                 ('company', 'in',
@@ -22,5 +22,3 @@ class Configuration(ModelSingleton, ModelSQL, ModelView):
                 ], 'Invoice Method', states={
                 'required': Bool(Eval('context', {}).get('company', 0)),
                 }))
-
-Configuration()
diff --git a/doc/index.rst b/doc/index.rst
index 99512af..f2da3d7 100644
--- a/doc/index.rst
+++ b/doc/index.rst
@@ -65,6 +65,7 @@ of them are optional or completed with sensible default values:
 - Invoices: The list of related invoices.
 - Moves: The list of related stock moves.
 - Shipments: The list of related shipments.
+- Return Shipments: The list of the related shipment returns.
 
 The *Purchase* report allow to print the purchase orders or to send
 them by mail.
diff --git a/invoice.py b/invoice.py
index e1e9e08..bf7c732 100644
--- a/invoice.py
+++ b/invoice.py
@@ -1,50 +1,115 @@
 #This file is part of Tryton.  The COPYRIGHT file at the top level of
 #this repository contains the full copyright notices and license terms.
-from trytond.model import Model, fields
-from trytond.pool import Pool
+from trytond.model import ModelView, Workflow, fields
+from trytond.pool import Pool, PoolMeta
+from trytond.transaction import Transaction
 
+__all__ = ['Invoice', 'InvoiceLine']
+__metaclass__ = PoolMeta
 
-class Invoice(Model):
-    _name = 'account.invoice'
 
+class Invoice:
+    __name__ = 'account.invoice'
+    purchase_exception_state = fields.Function(fields.Selection([
+        ('', ''),
+        ('ignored', 'Ignored'),
+        ('recreated', 'Recreated'),
+        ], 'Exception State'), 'get_purchase_exception_state')
     purchases = fields.Many2Many('purchase.purchase-account.invoice',
             'invoice', 'purchase', 'Purchases', readonly=True)
 
-    def copy(self, ids, default=None):
+    @classmethod
+    def __setup__(cls):
+        super(Invoice, cls).__setup__()
+        cls._error_messages.update({
+                'delete_purchase_invoice': 'You can not delete invoices ' \
+                    'that come from a purchase!',
+                'reset_invoice_purchase': 'You cannot reset to draft ' \
+                        'an invoice generated by a purchase.',
+                })
+
+    @classmethod
+    def get_purchase_exception_state(cls, invoices, name):
+        Purchase = Pool().get('purchase.purchase')
+        with Transaction().set_user(0, set_context=True):
+            purchases = Purchase.search([
+                    ('invoices', 'in', [i.id for i in invoices]),
+                    ])
+
+        recreated = tuple(i for p in purchases for i in p.invoices_recreated)
+        ignored = tuple(i for p in purchases for i in p.invoices_ignored)
+
+        res = {}
+        for invoice in invoices:
+            if invoice in recreated:
+                res[invoice.id] = 'recreated'
+            elif invoice in ignored:
+                res[invoice.id] = 'ignored'
+            else:
+                res[invoice.id] = ''
+        return res
+
+    @classmethod
+    def delete(cls, invoices):
+        cursor = Transaction().cursor
+        if invoices:
+            cursor.execute('SELECT id FROM purchase_invoices_rel ' \
+                'WHERE invoice IN (' + ','.join(('%s',) * len(invoices)) + ')',
+                [i.id for i in invoices])
+        if cursor.fetchone():
+            cls.raise_user_error('delete_purchase_invoice')
+        super(Invoice, cls).delete(invoices)
+
+    @classmethod
+    def copy(cls, invoices, default=None):
         if default is None:
             default = {}
         default = default.copy()
         default.setdefault('purchases', None)
-        return super(Invoice, self).copy(ids, default=default)
+        return super(Invoice, cls).copy(invoices, default=default)
 
-    def paid(self, ids):
-        pool = Pool()
-        purchase_obj = pool.get('purchase.purchase')
-        super(Invoice, self).paid(ids)
-        invoices = self.browse(ids)
-        purchase_obj.process([p.id for i in invoices for p in i.purchases])
+    @classmethod
+    @ModelView.button
+    @Workflow.transition('draft')
+    def draft(cls, invoices):
+        Purchase = Pool().get('purchase.purchase')
+        with Transaction().set_user(0, set_context=True):
+            purchases = Purchase.search([
+                    ('invoices', 'in', [i.id for i in invoices]),
+                    ])
+        if purchases:
+            cls.raise_user_error('reset_invoice_purchase')
 
-    def cancel(self, ids):
-        pool = Pool()
-        purchase_obj = pool.get('purchase.purchase')
-        super(Invoice, self).cancel(ids)
-        invoices = self.browse(ids)
-        purchase_obj.process([p.id for i in invoices for p in i.purchases])
+        return super(Invoice, cls).draft(invoices)
 
-Invoice()
+    @classmethod
+    def paid(cls, invoices):
+        pool = Pool()
+        Purchase = pool.get('purchase.purchase')
+        super(Invoice, cls).paid(invoices)
+        with Transaction().set_user(0, set_context=True):
+            Purchase.process([p for i in cls.browse(invoices)
+                    for p in i.purchases])
 
+    @classmethod
+    def cancel(cls, invoices):
+        pool = Pool()
+        Purchase = pool.get('purchase.purchase')
+        super(Invoice, cls).cancel(invoices)
+        with Transaction().set_user(0, set_context=True):
+            Purchase.process([p for i in cls.browse(invoices)
+                    for p in i.purchases])
 
-class InvoiceLine(Model):
-    _name = 'account.invoice.line'
 
+class InvoiceLine:
+    __name__ = 'account.invoice.line'
     purchase_lines = fields.Many2Many('purchase.line-account.invoice.line',
             'invoice_line', 'purchase_line', 'Purchase Lines', readonly=True)
 
-    def copy(self, ids, default=None):
+    @classmethod
+    def copy(cls, lines, default=None):
         if default is None:
             default = {}
         default = default.copy()
         default.setdefault('purchase_lines', None)
-        return super(InvoiceLine, self).copy(ids, default=default)
-
-InvoiceLine()
+        return super(InvoiceLine, cls).copy(lines, default=default)
diff --git a/locale/bg_BG.po b/locale/bg_BG.po
index 464320e..fd940ae 100644
--- a/locale/bg_BG.po
+++ b/locale/bg_BG.po
@@ -31,7 +31,7 @@ msgstr "Местонахождението на доставчика е задъ
 
 msgctxt "error:purchase.purchase:"
 msgid "A warehouse must be defined for the quotation."
-msgstr ""
+msgstr "При запитване е необходимо да се укаже склад"
 
 msgctxt "error:purchase.purchase:"
 msgid "Invoice addresses must be defined for the quotation."
@@ -43,7 +43,12 @@ msgstr "Липсва \"Разходна сметка\" за партньор \"%
 
 msgctxt "error:purchase.purchase:"
 msgid "Purchase \"%s\" must be cancelled before deletion!"
-msgstr "Покупка \"%s\" трябва да бъде отказана преди да жъде изтрита!"
+msgstr "Преди да бъде изтрита покупка \"%s\" трябва да бъде прекратена!"
+
+#, fuzzy
+msgctxt "error:stock.shipment.in.return:"
+msgid "You cannot reset to draft a move generated by a purchase."
+msgstr "Не може да преместите в проект движение създадено от покупка."
 
 msgctxt "error:stock.shipment.in:"
 msgid "You cannot reset to draft a move generated by a purchase."
@@ -143,7 +148,7 @@ msgstr "Създадено от"
 
 msgctxt "field:purchase.line,delivery_date:"
 msgid "Delivery Date"
-msgstr ""
+msgstr "Дата на доставка"
 
 msgctxt "field:purchase.line,description:"
 msgid "Description"
@@ -191,7 +196,7 @@ msgstr "Продукт"
 
 msgctxt "field:purchase.line,product_uom_category:"
 msgid "Product Uom Category"
-msgstr ""
+msgstr "Категория мер. ед. на продукт"
 
 msgctxt "field:purchase.line,purchase:"
 msgid "Purchase"
@@ -553,6 +558,11 @@ msgctxt "field:purchase.purchase,reference:"
 msgid "Reference"
 msgstr "Отпратка"
 
+#, fuzzy
+msgctxt "field:purchase.purchase,shipment_returns:"
+msgid "Shipment Returns"
+msgstr "Върнати доставки"
+
 msgctxt "field:purchase.purchase,shipment_state:"
 msgid "Shipment State"
 msgstr "Състояние на пратка"
@@ -793,6 +803,11 @@ msgctxt "model:ir.action,name:act_purchase_form_quotation"
 msgid "Purchases in Quotation"
 msgstr "Покупки в запитване"
 
+#, fuzzy
+msgctxt "model:ir.action,name:act_return_form"
+msgid "Returns"
+msgstr "Връщане"
+
 msgctxt "model:ir.action,name:act_shipment_form"
 msgid "Shipments"
 msgstr "Изпращания"
@@ -857,12 +872,10 @@ msgctxt "model:purchase.configuration,name:"
 msgid "Purchase Configuration"
 msgstr "Конфигуриране на покупка"
 
-#, fuzzy
 msgctxt "model:purchase.handle.invoice.exception.ask,name:"
 msgid "Handle Invoice Exception"
 msgstr "Обработване на грешка в фактура"
 
-#, fuzzy
 msgctxt "model:purchase.handle.shipment.exception.ask,name:"
 msgid "Handle Shipment Exception"
 msgstr "Обработване за грешка при пратка"
@@ -1233,7 +1246,7 @@ msgstr "Запитване"
 
 msgctxt "view:purchase.purchase:"
 msgid "Quote"
-msgstr ""
+msgstr "Запитване"
 
 msgctxt "view:purchase.purchase:"
 msgid "Shipments"
@@ -1258,3 +1271,13 @@ msgstr "Отказ"
 msgctxt "wizard_button:purchase.handle.shipment.exception,ask,handle:"
 msgid "Ok"
 msgstr "Добре"
+
+#, fuzzy
+msgctxt "wizard_button:stock.product_quantities_warehouse,start,end:"
+msgid "Cancel"
+msgstr "Отказване"
+
+#, fuzzy
+msgctxt "wizard_button:stock.product_quantities_warehouse,start,open_:"
+msgid "Open"
+msgstr "Отваряне"
diff --git a/locale/ca_ES.po b/locale/ca_ES.po
index 52f9594..50e8e20 100644
--- a/locale/ca_ES.po
+++ b/locale/ca_ES.po
@@ -4,7 +4,7 @@ msgstr "Content-Type: text/plain; charset=utf-8\n"
 
 msgctxt "error:account.invoice:"
 msgid "You can not delete invoices that come from a purchase!"
-msgstr "No pot esborrar factures que vénen d'una compra"
+msgstr "No pot esborrar factures que vénen d'una compra."
 
 msgctxt "error:account.invoice:"
 msgid "You cannot reset to draft an invoice generated by a purchase."
@@ -18,31 +18,35 @@ msgstr ""
 
 msgctxt "error:purchase.line:"
 msgid "It misses an \"Account Expense\" on product \"%s\"!"
-msgstr "Fa falta un «Compte de despeses» del producte «%s»"
+msgstr "Fa falta un \"Compte de despeses\" del producte \"%s\"."
 
 msgctxt "error:purchase.line:"
 msgid "It misses an \"account expense\" default property!"
-msgstr "Fa falta la propietat predeterminada de «Compte de despeses»"
+msgstr "Fa falta la propietat predeterminada de \"Compte de despeses\"."
 
 msgctxt "error:purchase.line:"
 msgid "The supplier location is required!"
-msgstr "Es necessita la ubicació del proveïdor"
+msgstr "Es necessita la ubicació del proveïdor."
 
 msgctxt "error:purchase.purchase:"
 msgid "A warehouse must be defined for the quotation."
-msgstr ""
+msgstr "Ha d'indicar un magatzem en el pressupost."
 
 msgctxt "error:purchase.purchase:"
 msgid "Invoice addresses must be defined for the quotation."
-msgstr "Ha de definir les adreces per a la cotització."
+msgstr "Ha de definir les adreces de facturació."
 
 msgctxt "error:purchase.purchase:"
 msgid "It misses an \"Account Payable\" on the party \"%s\"!"
-msgstr "Al tercer «%s» li fa falta un «Compte de pagaments»"
+msgstr "Al tercer \"%s\" li fa falta un \"Compte de pagaments\"."
 
 msgctxt "error:purchase.purchase:"
 msgid "Purchase \"%s\" must be cancelled before deletion!"
-msgstr ""
+msgstr "Al tercer \"%s\" li falta un \"Compte a pagar\"."
+
+msgctxt "error:stock.shipment.in.return:"
+msgid "You cannot reset to draft a move generated by a purchase."
+msgstr "No pot restablir a esborrany un moviment generat per una compra."
 
 msgctxt "error:stock.shipment.in:"
 msgid "You cannot reset to draft a move generated by a purchase."
@@ -52,12 +56,10 @@ msgctxt "field:account.invoice,purchase_exception_state:"
 msgid "Exception State"
 msgstr "Estat excepció"
 
-#, fuzzy
 msgctxt "field:account.invoice,purchases:"
 msgid "Purchases"
 msgstr "Compres"
 
-#, fuzzy
 msgctxt "field:account.invoice.line,purchase_lines:"
 msgid "Purchase Lines"
 msgstr "Línies de compra"
@@ -68,7 +70,7 @@ msgstr "Proveïdors"
 
 msgctxt "field:product.template,purchasable:"
 msgid "Purchasable"
-msgstr "Comprable"
+msgstr "Es pot comprar"
 
 msgctxt "field:product.template,purchase_uom:"
 msgid "Purchase UOM"
@@ -76,46 +78,43 @@ msgstr "UdM de compra"
 
 msgctxt "field:purchase.configuration,create_date:"
 msgid "Create Date"
-msgstr ""
+msgstr "Data creació"
 
-#, fuzzy
 msgctxt "field:purchase.configuration,create_uid:"
 msgid "Create User"
-msgstr "Crear usuari"
+msgstr "Usuari creació"
 
 msgctxt "field:purchase.configuration,id:"
 msgid "ID"
-msgstr ""
+msgstr "ID"
 
-#, fuzzy
 msgctxt "field:purchase.configuration,purchase_invoice_method:"
 msgid "Invoice Method"
 msgstr "Mètode de facturació"
 
 msgctxt "field:purchase.configuration,purchase_sequence:"
 msgid "Purchase Reference Sequence"
-msgstr ""
+msgstr "Seqüència comanda de compra"
 
-#, fuzzy
 msgctxt "field:purchase.configuration,rec_name:"
 msgid "Name"
-msgstr "Nom del camp"
+msgstr "Nom"
 
 msgctxt "field:purchase.configuration,write_date:"
 msgid "Write Date"
-msgstr ""
+msgstr "Data modificació"
 
 msgctxt "field:purchase.configuration,write_uid:"
 msgid "Write User"
-msgstr ""
+msgstr "Usuari modificació"
 
 msgctxt "field:purchase.handle.invoice.exception.ask,domain_invoices:"
 msgid "Domain Invoices"
-msgstr "Factures de domini"
+msgstr "Domini de les factures"
 
 msgctxt "field:purchase.handle.invoice.exception.ask,id:"
 msgid "ID"
-msgstr ""
+msgstr "ID"
 
 msgctxt "field:purchase.handle.invoice.exception.ask,recreate_invoices:"
 msgid "Recreate Invoices"
@@ -123,11 +122,11 @@ msgstr "Refer factures"
 
 msgctxt "field:purchase.handle.shipment.exception.ask,domain_moves:"
 msgid "Domain Moves"
-msgstr "Moviments de domini"
+msgstr "Domini dels moviments"
 
 msgctxt "field:purchase.handle.shipment.exception.ask,id:"
 msgid "ID"
-msgstr ""
+msgstr "ID"
 
 msgctxt "field:purchase.handle.shipment.exception.ask,recreate_moves:"
 msgid "Recreate Moves"
@@ -139,29 +138,27 @@ msgstr "Quantitat"
 
 msgctxt "field:purchase.line,create_date:"
 msgid "Create Date"
-msgstr ""
+msgstr "Data creació"
 
-#, fuzzy
 msgctxt "field:purchase.line,create_uid:"
 msgid "Create User"
-msgstr "Crear usuari"
+msgstr "Usuari creació"
 
 msgctxt "field:purchase.line,delivery_date:"
 msgid "Delivery Date"
-msgstr ""
+msgstr "Data de lliurament"
 
 msgctxt "field:purchase.line,description:"
 msgid "Description"
 msgstr "Descripció"
 
-#, fuzzy
 msgctxt "field:purchase.line,from_location:"
 msgid "From Location"
 msgstr "Des de la ubicació"
 
 msgctxt "field:purchase.line,id:"
 msgid "ID"
-msgstr ""
+msgstr "ID"
 
 msgctxt "field:purchase.line,invoice_lines:"
 msgid "Invoice Lines"
@@ -169,7 +166,7 @@ msgstr "Línies de factura"
 
 msgctxt "field:purchase.line,move_done:"
 msgid "Moves Done"
-msgstr "Moviments acabats"
+msgstr "Moviments finalitzats"
 
 msgctxt "field:purchase.line,move_exception:"
 msgid "Moves Exception"
@@ -197,7 +194,7 @@ msgstr "Producte"
 
 msgctxt "field:purchase.line,product_uom_category:"
 msgid "Product Uom Category"
-msgstr ""
+msgstr "Categoria UdM del producte"
 
 msgctxt "field:purchase.line,purchase:"
 msgid "Purchase"
@@ -219,7 +216,6 @@ msgctxt "field:purchase.line,taxes:"
 msgid "Taxes"
 msgstr "Impostos"
 
-#, fuzzy
 msgctxt "field:purchase.line,to_location:"
 msgid "To Location"
 msgstr "A la ubicació"
@@ -234,7 +230,7 @@ msgstr "Unitat"
 
 msgctxt "field:purchase.line,unit_digits:"
 msgid "Unit Digits"
-msgstr "Dígits unitaris"
+msgstr "Decimals unitaris"
 
 msgctxt "field:purchase.line,unit_price:"
 msgid "Unit Price"
@@ -242,24 +238,23 @@ msgstr "Preu unitari"
 
 msgctxt "field:purchase.line,write_date:"
 msgid "Write Date"
-msgstr ""
+msgstr "Data modificació"
 
 msgctxt "field:purchase.line,write_uid:"
 msgid "Write User"
-msgstr ""
+msgstr "Usuari modificació"
 
 msgctxt "field:purchase.line-account.invoice.line,create_date:"
 msgid "Create Date"
-msgstr ""
+msgstr "Data creació"
 
-#, fuzzy
 msgctxt "field:purchase.line-account.invoice.line,create_uid:"
 msgid "Create User"
-msgstr "Crear usuari"
+msgstr "Usuari creació"
 
 msgctxt "field:purchase.line-account.invoice.line,id:"
 msgid "ID"
-msgstr ""
+msgstr "ID"
 
 msgctxt "field:purchase.line-account.invoice.line,invoice_line:"
 msgid "Invoice Line"
@@ -275,24 +270,23 @@ msgstr "Nom"
 
 msgctxt "field:purchase.line-account.invoice.line,write_date:"
 msgid "Write Date"
-msgstr ""
+msgstr "Data modificació"
 
 msgctxt "field:purchase.line-account.invoice.line,write_uid:"
 msgid "Write User"
-msgstr ""
+msgstr "Usuari modificació"
 
 msgctxt "field:purchase.line-account.tax,create_date:"
 msgid "Create Date"
-msgstr ""
+msgstr "Data creació"
 
-#, fuzzy
 msgctxt "field:purchase.line-account.tax,create_uid:"
 msgid "Create User"
-msgstr "Crear usuari"
+msgstr "Usuari creació"
 
 msgctxt "field:purchase.line-account.tax,id:"
 msgid "ID"
-msgstr ""
+msgstr "ID"
 
 msgctxt "field:purchase.line-account.tax,line:"
 msgid "Purchase Line"
@@ -308,24 +302,23 @@ msgstr "Impost"
 
 msgctxt "field:purchase.line-account.tax,write_date:"
 msgid "Write Date"
-msgstr ""
+msgstr "Data modificació"
 
 msgctxt "field:purchase.line-account.tax,write_uid:"
 msgid "Write User"
-msgstr ""
+msgstr "Usuari modificació"
 
 msgctxt "field:purchase.line-ignored-stock.move,create_date:"
 msgid "Create Date"
-msgstr ""
+msgstr "Data creació"
 
-#, fuzzy
 msgctxt "field:purchase.line-ignored-stock.move,create_uid:"
 msgid "Create User"
-msgstr "Crear usuari"
+msgstr "Usuari creació"
 
 msgctxt "field:purchase.line-ignored-stock.move,id:"
 msgid "ID"
-msgstr ""
+msgstr "ID"
 
 msgctxt "field:purchase.line-ignored-stock.move,move:"
 msgid "Move"
@@ -341,24 +334,23 @@ msgstr "Nom"
 
 msgctxt "field:purchase.line-ignored-stock.move,write_date:"
 msgid "Write Date"
-msgstr ""
+msgstr "Data modificació"
 
 msgctxt "field:purchase.line-ignored-stock.move,write_uid:"
 msgid "Write User"
-msgstr ""
+msgstr "Usuari modificació"
 
 msgctxt "field:purchase.line-recreated-stock.move,create_date:"
 msgid "Create Date"
-msgstr ""
+msgstr "Data creació"
 
-#, fuzzy
 msgctxt "field:purchase.line-recreated-stock.move,create_uid:"
 msgid "Create User"
-msgstr "Crear usuari"
+msgstr "Usuari creació"
 
 msgctxt "field:purchase.line-recreated-stock.move,id:"
 msgid "ID"
-msgstr ""
+msgstr "ID"
 
 msgctxt "field:purchase.line-recreated-stock.move,move:"
 msgid "Move"
@@ -374,11 +366,11 @@ msgstr "Nom"
 
 msgctxt "field:purchase.line-recreated-stock.move,write_date:"
 msgid "Write Date"
-msgstr ""
+msgstr "Data modificació"
 
 msgctxt "field:purchase.line-recreated-stock.move,write_uid:"
 msgid "Write User"
-msgstr ""
+msgstr "Usuari modificació"
 
 msgctxt "field:purchase.product_supplier,code:"
 msgid "Code"
@@ -390,17 +382,15 @@ msgstr "Companyia"
 
 msgctxt "field:purchase.product_supplier,create_date:"
 msgid "Create Date"
-msgstr ""
+msgstr "Data creació"
 
-#, fuzzy
 msgctxt "field:purchase.product_supplier,create_uid:"
 msgid "Create User"
-msgstr "Crear usuari"
+msgstr "Usuari creació"
 
-#, fuzzy
 msgctxt "field:purchase.product_supplier,currency:"
 msgid "Currency"
-msgstr "Gestió de divises"
+msgstr "Moneda"
 
 msgctxt "field:purchase.product_supplier,delivery_time:"
 msgid "Delivery Time"
@@ -408,7 +398,7 @@ msgstr "Temps d'enviament"
 
 msgctxt "field:purchase.product_supplier,id:"
 msgid "ID"
-msgstr ""
+msgstr "ID"
 
 msgctxt "field:purchase.product_supplier,name:"
 msgid "Name"
@@ -436,24 +426,23 @@ msgstr "Seqüència"
 
 msgctxt "field:purchase.product_supplier,write_date:"
 msgid "Write Date"
-msgstr ""
+msgstr "Data modificació"
 
 msgctxt "field:purchase.product_supplier,write_uid:"
 msgid "Write User"
-msgstr ""
+msgstr "Usuari modificació"
 
 msgctxt "field:purchase.product_supplier.price,create_date:"
 msgid "Create Date"
-msgstr ""
+msgstr "Data creació"
 
-#, fuzzy
 msgctxt "field:purchase.product_supplier.price,create_uid:"
 msgid "Create User"
-msgstr "Crear usuari"
+msgstr "Usuari creació"
 
 msgctxt "field:purchase.product_supplier.price,id:"
 msgid "ID"
-msgstr ""
+msgstr "ID"
 
 msgctxt "field:purchase.product_supplier.price,product_supplier:"
 msgid "Supplier"
@@ -473,11 +462,11 @@ msgstr "Preu unitari"
 
 msgctxt "field:purchase.product_supplier.price,write_date:"
 msgid "Write Date"
-msgstr ""
+msgstr "Data modificació"
 
 msgctxt "field:purchase.product_supplier.price,write_uid:"
 msgid "Write User"
-msgstr ""
+msgstr "Usuari modificació"
 
 msgctxt "field:purchase.purchase,comment:"
 msgid "Comment"
@@ -489,20 +478,19 @@ msgstr "Empresa"
 
 msgctxt "field:purchase.purchase,create_date:"
 msgid "Create Date"
-msgstr ""
+msgstr "Data creació"
 
-#, fuzzy
 msgctxt "field:purchase.purchase,create_uid:"
 msgid "Create User"
-msgstr "Crear usuari"
+msgstr "Usuari creació"
 
 msgctxt "field:purchase.purchase,currency:"
 msgid "Currency"
-msgstr "Divisa"
+msgstr "Moneda"
 
 msgctxt "field:purchase.purchase,currency_digits:"
 msgid "Currency Digits"
-msgstr "Dígits de la divisa"
+msgstr "Decimals de la moneda"
 
 msgctxt "field:purchase.purchase,description:"
 msgid "Description"
@@ -510,7 +498,7 @@ msgstr "Descripció"
 
 msgctxt "field:purchase.purchase,id:"
 msgid "ID"
-msgstr ""
+msgstr "ID"
 
 msgctxt "field:purchase.purchase,invoice_address:"
 msgid "Invoice Address"
@@ -546,7 +534,7 @@ msgstr "Moviments"
 
 msgctxt "field:purchase.purchase,party:"
 msgid "Party"
-msgstr "Tercers"
+msgstr "Tercer"
 
 msgctxt "field:purchase.purchase,party_lang:"
 msgid "Party Language"
@@ -554,7 +542,7 @@ msgstr "Idioma del tercer"
 
 msgctxt "field:purchase.purchase,payment_term:"
 msgid "Payment Term"
-msgstr "Terme de pagament"
+msgstr "Termini de pagament"
 
 msgctxt "field:purchase.purchase,purchase_date:"
 msgid "Purchase Date"
@@ -568,6 +556,10 @@ msgctxt "field:purchase.purchase,reference:"
 msgid "Reference"
 msgstr "Referència"
 
+msgctxt "field:purchase.purchase,shipment_returns:"
+msgid "Shipment Returns"
+msgstr "Albarans de devolució"
+
 msgctxt "field:purchase.purchase,shipment_state:"
 msgid "Shipment State"
 msgstr "Estat d'enviament"
@@ -590,7 +582,7 @@ msgstr "Impost"
 
 msgctxt "field:purchase.purchase,tax_amount_cache:"
 msgid "Tax Cache"
-msgstr ""
+msgstr "Impostos precalculado"
 
 msgctxt "field:purchase.purchase,total_amount:"
 msgid "Total"
@@ -598,7 +590,7 @@ msgstr "Total"
 
 msgctxt "field:purchase.purchase,total_amount_cache:"
 msgid "Total Cache"
-msgstr ""
+msgstr "Total precalculado"
 
 msgctxt "field:purchase.purchase,untaxed_amount:"
 msgid "Untaxed"
@@ -606,7 +598,7 @@ msgstr "Sense impost"
 
 msgctxt "field:purchase.purchase,untaxed_amount_cache:"
 msgid "Untaxed Cache"
-msgstr ""
+msgstr "Base imposable precalculada"
 
 msgctxt "field:purchase.purchase,warehouse:"
 msgid "Warehouse"
@@ -614,24 +606,23 @@ msgstr "Magatzem"
 
 msgctxt "field:purchase.purchase,write_date:"
 msgid "Write Date"
-msgstr ""
+msgstr "Data modificació"
 
 msgctxt "field:purchase.purchase,write_uid:"
 msgid "Write User"
-msgstr ""
+msgstr "Usuari modificació"
 
 msgctxt "field:purchase.purchase-account.invoice,create_date:"
 msgid "Create Date"
-msgstr ""
+msgstr "Data creació"
 
-#, fuzzy
 msgctxt "field:purchase.purchase-account.invoice,create_uid:"
 msgid "Create User"
-msgstr "Crear usuari"
+msgstr "Usuari creació"
 
 msgctxt "field:purchase.purchase-account.invoice,id:"
 msgid "ID"
-msgstr ""
+msgstr "ID"
 
 msgctxt "field:purchase.purchase-account.invoice,invoice:"
 msgid "Invoice"
@@ -647,24 +638,23 @@ msgstr "Nom"
 
 msgctxt "field:purchase.purchase-account.invoice,write_date:"
 msgid "Write Date"
-msgstr ""
+msgstr "Data modificació"
 
 msgctxt "field:purchase.purchase-account.invoice,write_uid:"
 msgid "Write User"
-msgstr ""
+msgstr "Usuari modificació"
 
 msgctxt "field:purchase.purchase-ignored-account.invoice,create_date:"
 msgid "Create Date"
-msgstr ""
+msgstr "Data creació"
 
-#, fuzzy
 msgctxt "field:purchase.purchase-ignored-account.invoice,create_uid:"
 msgid "Create User"
-msgstr "Crear usuari"
+msgstr "Usuari creació"
 
 msgctxt "field:purchase.purchase-ignored-account.invoice,id:"
 msgid "ID"
-msgstr ""
+msgstr "ID"
 
 msgctxt "field:purchase.purchase-ignored-account.invoice,invoice:"
 msgid "Invoice"
@@ -680,24 +670,23 @@ msgstr "Nom"
 
 msgctxt "field:purchase.purchase-ignored-account.invoice,write_date:"
 msgid "Write Date"
-msgstr ""
+msgstr "Data modificació"
 
 msgctxt "field:purchase.purchase-ignored-account.invoice,write_uid:"
 msgid "Write User"
-msgstr ""
+msgstr "Usuari modificació"
 
 msgctxt "field:purchase.purchase-recreated-account.invoice,create_date:"
 msgid "Create Date"
-msgstr ""
+msgstr "Data creació"
 
-#, fuzzy
 msgctxt "field:purchase.purchase-recreated-account.invoice,create_uid:"
 msgid "Create User"
-msgstr "Crear usuari"
+msgstr "Usuari creació"
 
 msgctxt "field:purchase.purchase-recreated-account.invoice,id:"
 msgid "ID"
-msgstr ""
+msgstr "ID"
 
 msgctxt "field:purchase.purchase-recreated-account.invoice,invoice:"
 msgid "Invoice"
@@ -713,11 +702,11 @@ msgstr "Nom"
 
 msgctxt "field:purchase.purchase-recreated-account.invoice,write_date:"
 msgid "Write Date"
-msgstr ""
+msgstr "Data modificació"
 
 msgctxt "field:purchase.purchase-recreated-account.invoice,write_uid:"
 msgid "Write User"
-msgstr ""
+msgstr "Usuari modificació"
 
 msgctxt "field:stock.move,purchase:"
 msgid "Purchase"
@@ -725,13 +714,12 @@ msgstr "Compra"
 
 msgctxt "field:stock.move,purchase_currency:"
 msgid "Purchase Currency"
-msgstr "Divisa de compra"
+msgstr "Moneda de compra"
 
 msgctxt "field:stock.move,purchase_exception_state:"
 msgid "Exception State"
 msgstr "Estat excepció"
 
-#, fuzzy
 msgctxt "field:stock.move,purchase_line:"
 msgid "Purchase Line"
 msgstr "Línia de compra"
@@ -787,7 +775,7 @@ msgstr "Tercers associats amb compres"
 
 msgctxt "model:ir.action,name:act_purchase_configuration_form"
 msgid "Purchase Configuration"
-msgstr ""
+msgstr "Configuració compres"
 
 msgctxt "model:ir.action,name:act_purchase_form"
 msgid "Purchases"
@@ -807,7 +795,11 @@ msgstr "Compres en esborrany"
 
 msgctxt "model:ir.action,name:act_purchase_form_quotation"
 msgid "Purchases in Quotation"
-msgstr "Compres en cotització"
+msgstr "Compres en pressupost"
+
+msgctxt "model:ir.action,name:act_return_form"
+msgid "Returns"
+msgstr "Retorna"
 
 msgctxt "model:ir.action,name:act_shipment_form"
 msgid "Shipments"
@@ -837,14 +829,13 @@ msgctxt "model:ir.ui.menu,name:menu_configuration"
 msgid "Configuration"
 msgstr "Configuració"
 
-#, fuzzy
 msgctxt "model:ir.ui.menu,name:menu_purchase"
 msgid "Purchase"
-msgstr "Gestió de compres"
+msgstr "Compres"
 
 msgctxt "model:ir.ui.menu,name:menu_purchase_configuration"
 msgid "Purchase Configuration"
-msgstr ""
+msgstr "Configuració compres"
 
 msgctxt "model:ir.ui.menu,name:menu_purchase_form"
 msgid "Purchases"
@@ -852,15 +843,15 @@ msgstr "Compres"
 
 msgctxt "model:ir.ui.menu,name:menu_purchase_form_confirmed"
 msgid "Confirmed Purchases"
-msgstr "Compres confirmades"
+msgstr "Confirmades"
 
 msgctxt "model:ir.ui.menu,name:menu_purchase_form_draft"
 msgid "Draft Purchases"
-msgstr "Compres en esborrany"
+msgstr "Esborrany"
 
 msgctxt "model:ir.ui.menu,name:menu_purchase_form_quotation"
 msgid "Purchases in Quotation"
-msgstr "Compres en cotització"
+msgstr "Pressupost"
 
 msgctxt "model:ir.ui.menu,name:menu_reporting"
 msgid "Reporting"
@@ -872,17 +863,15 @@ msgstr "Tercers associats amb compres"
 
 msgctxt "model:purchase.configuration,name:"
 msgid "Purchase Configuration"
-msgstr ""
+msgstr "Configuració compres"
 
-#, fuzzy
 msgctxt "model:purchase.handle.invoice.exception.ask,name:"
 msgid "Handle Invoice Exception"
-msgstr "Excepció de factura - Petició"
+msgstr "Gestiona excepció de factura"
 
-#, fuzzy
 msgctxt "model:purchase.handle.shipment.exception.ask,name:"
 msgid "Handle Shipment Exception"
-msgstr "Excepció d'enviament - Petició"
+msgstr "Gestiona excepció d'enviament"
 
 msgctxt "model:purchase.line,name:"
 msgid "Purchase Line"
@@ -898,7 +887,7 @@ msgstr "Línia de compra - Impost"
 
 msgctxt "model:purchase.line-ignored-stock.move,name:"
 msgid "Purchase Line - Ignored Move"
-msgstr "Línia de compra - Moviment Ignorat"
+msgstr "Línia de compra - Moviment ignorat"
 
 msgctxt "model:purchase.line-recreated-stock.move,name:"
 msgid "Purchase Line - Ignored Move"
@@ -966,7 +955,7 @@ msgstr "Telèfon:"
 
 msgctxt "odt:purchase.purchase:"
 msgid "Purchase Order N°:"
-msgstr "Nº de comanda de compra:"
+msgstr "Comanda de compra Nº:"
 
 msgctxt "odt:purchase.purchase:"
 msgid "Quantity"
@@ -974,7 +963,7 @@ msgstr "Quantitat"
 
 msgctxt "odt:purchase.purchase:"
 msgid "Request for Quotation N°:"
-msgstr "Sol·licitud de pressupost nº:"
+msgstr "Sol·licitud de pressupost Nº:"
 
 msgctxt "odt:purchase.purchase:"
 msgid "Taxes"
@@ -986,7 +975,7 @@ msgstr "Impostos:"
 
 msgctxt "odt:purchase.purchase:"
 msgid "Total (excl. taxes):"
-msgstr "Total (sense impostos):"
+msgstr "Base imposable:"
 
 msgctxt "odt:purchase.purchase:"
 msgid "Total:"
@@ -998,15 +987,16 @@ msgstr "Preu unitari"
 
 msgctxt "odt:purchase.purchase:"
 msgid "VAT Number:"
-msgstr ""
+msgstr "IVA:"
 
 msgctxt "odt:purchase.purchase:"
 msgid "VAT:"
 msgstr "IVA:"
 
+#, fuzzy
 msgctxt "selection:account.invoice,purchase_exception_state:"
 msgid ""
-msgstr ""
+msgstr "Servidor"
 
 msgctxt "selection:account.invoice,purchase_exception_state:"
 msgid "Ignored"
@@ -1016,17 +1006,14 @@ msgctxt "selection:account.invoice,purchase_exception_state:"
 msgid "Recreated"
 msgstr "Refet"
 
-#, fuzzy
 msgctxt "selection:purchase.configuration,purchase_invoice_method:"
 msgid "Based On Order"
-msgstr "Basat en l'ordre"
+msgstr "Basat en la comanda"
 
-#, fuzzy
 msgctxt "selection:purchase.configuration,purchase_invoice_method:"
 msgid "Based On Shipment"
 msgstr "Basat en l'enviament"
 
-#, fuzzy
 msgctxt "selection:purchase.configuration,purchase_invoice_method:"
 msgid "Manual"
 msgstr "Manual"
@@ -1049,11 +1036,11 @@ msgstr "Títol"
 
 msgctxt "selection:purchase.purchase,invoice_method:"
 msgid "Based On Order"
-msgstr "Basat en comandes"
+msgstr "Basat en la comanda"
 
 msgctxt "selection:purchase.purchase,invoice_method:"
 msgid "Based On Shipment"
-msgstr "Basat en enviaments"
+msgstr "Basat en l'enviament"
 
 msgctxt "selection:purchase.purchase,invoice_method:"
 msgid "Manual"
@@ -1101,7 +1088,7 @@ msgstr "Confirmat"
 
 msgctxt "selection:purchase.purchase,state:"
 msgid "Done"
-msgstr "Acabada"
+msgstr "Finalitzat"
 
 msgctxt "selection:purchase.purchase,state:"
 msgid "Draft"
@@ -1111,9 +1098,10 @@ msgctxt "selection:purchase.purchase,state:"
 msgid "Quotation"
 msgstr "Pressupost"
 
+#, fuzzy
 msgctxt "selection:stock.move,purchase_exception_state:"
 msgid ""
-msgstr ""
+msgstr "Servidor"
 
 msgctxt "selection:stock.move,purchase_exception_state:"
 msgid "Ignored"
@@ -1141,7 +1129,7 @@ msgstr "Proveïdors"
 
 msgctxt "view:purchase.configuration:"
 msgid "Purchase Configuration"
-msgstr ""
+msgstr "Configuració compres"
 
 msgctxt "view:purchase.handle.invoice.exception.ask:"
 msgid "Choose invoices to recreate"
@@ -1149,9 +1137,8 @@ msgstr "Seleccioni les factures a recrear"
 
 msgctxt "view:purchase.handle.invoice.exception.ask:"
 msgid "Handle Invoice Exception"
-msgstr "Gestionar l'excepció de factura"
+msgstr "Gestiona l'excepció de factura"
 
-#, fuzzy
 msgctxt "view:purchase.handle.shipment.exception.ask:"
 msgid "Choose move to recreate"
 msgstr "Esculli un moviment a refer"
@@ -1162,17 +1149,16 @@ msgstr "Triar moviments a recrear"
 
 msgctxt "view:purchase.handle.shipment.exception.ask:"
 msgid "Handle shipment Exception"
-msgstr "Gestionar excepcions d'enviament"
+msgstr "Gestiona excepcions d'enviament"
 
 msgctxt "view:purchase.handle.shipment.exception.ask:"
 msgid "Recreated Moves"
-msgstr "Moviments recreats"
+msgstr "Refer moviments"
 
 msgctxt "view:purchase.line:"
 msgid "General"
 msgstr "General"
 
-#, fuzzy
 msgctxt "view:purchase.line:"
 msgid "Lines"
 msgstr "Línies"
@@ -1211,11 +1197,11 @@ msgstr "Proveïdors de productes"
 
 msgctxt "view:purchase.purchase:"
 msgid "Cancel"
-msgstr "Cancel·lar"
+msgstr "Cancel·la"
 
 msgctxt "view:purchase.purchase:"
 msgid "Confirm"
-msgstr "Confirmar"
+msgstr "Confirma"
 
 msgctxt "view:purchase.purchase:"
 msgid "Draft"
@@ -1223,11 +1209,11 @@ msgstr "Esborrany"
 
 msgctxt "view:purchase.purchase:"
 msgid "Handle Invoice Exception"
-msgstr "Gestionar l'excepció de factura"
+msgstr "Gestiona l'excepció de factura"
 
 msgctxt "view:purchase.purchase:"
 msgid "Handle Shipment Exception"
-msgstr "Gestionar excepció d'enviament"
+msgstr "Gestiona excepció d'enviament"
 
 msgctxt "view:purchase.purchase:"
 msgid "Invoices"
@@ -1259,33 +1245,36 @@ msgstr "Pressupost"
 
 msgctxt "view:purchase.purchase:"
 msgid "Quote"
-msgstr ""
+msgstr "Pressupost"
 
 msgctxt "view:purchase.purchase:"
 msgid "Shipments"
 msgstr "Enviaments"
 
-#, fuzzy
 msgctxt "view:stock.move:"
 msgid "Moves"
 msgstr "Moviments"
 
-#, fuzzy
 msgctxt "wizard_button:purchase.handle.invoice.exception,ask,end:"
 msgid "Cancel"
-msgstr "Cancel·lar"
+msgstr "Cancel·la"
 
-#, fuzzy
 msgctxt "wizard_button:purchase.handle.invoice.exception,ask,handle:"
 msgid "Ok"
-msgstr "Acceptar"
+msgstr "Accepta"
 
-#, fuzzy
 msgctxt "wizard_button:purchase.handle.shipment.exception,ask,end:"
 msgid "Cancel"
-msgstr "Cancel·lar"
+msgstr "Cancel·la"
 
-#, fuzzy
 msgctxt "wizard_button:purchase.handle.shipment.exception,ask,handle:"
 msgid "Ok"
-msgstr "Acceptar"
+msgstr "Accepta"
+
+msgctxt "wizard_button:stock.product_quantities_warehouse,start,end:"
+msgid "Cancel"
+msgstr "Cancel·la"
+
+msgctxt "wizard_button:stock.product_quantities_warehouse,start,open_:"
+msgid "Open"
+msgstr "Obrir"
diff --git a/locale/cs_CZ.po b/locale/cs_CZ.po
index 289e216..591270b 100644
--- a/locale/cs_CZ.po
+++ b/locale/cs_CZ.po
@@ -43,6 +43,10 @@ msgctxt "error:purchase.purchase:"
 msgid "Purchase \"%s\" must be cancelled before deletion!"
 msgstr ""
 
+msgctxt "error:stock.shipment.in.return:"
+msgid "You cannot reset to draft a move generated by a purchase."
+msgstr ""
+
 msgctxt "error:stock.shipment.in:"
 msgid "You cannot reset to draft a move generated by a purchase."
 msgstr ""
@@ -551,6 +555,10 @@ msgctxt "field:purchase.purchase,reference:"
 msgid "Reference"
 msgstr ""
 
+msgctxt "field:purchase.purchase,shipment_returns:"
+msgid "Shipment Returns"
+msgstr ""
+
 msgctxt "field:purchase.purchase,shipment_state:"
 msgid "Shipment State"
 msgstr ""
@@ -788,6 +796,10 @@ msgctxt "model:ir.action,name:act_purchase_form_quotation"
 msgid "Purchases in Quotation"
 msgstr ""
 
+msgctxt "model:ir.action,name:act_return_form"
+msgid "Returns"
+msgstr ""
+
 msgctxt "model:ir.action,name:act_shipment_form"
 msgid "Shipments"
 msgstr ""
@@ -1247,3 +1259,11 @@ msgstr ""
 msgctxt "wizard_button:purchase.handle.shipment.exception,ask,handle:"
 msgid "Ok"
 msgstr ""
+
+msgctxt "wizard_button:stock.product_quantities_warehouse,start,end:"
+msgid "Cancel"
+msgstr ""
+
+msgctxt "wizard_button:stock.product_quantities_warehouse,start,open_:"
+msgid "Open"
+msgstr ""
diff --git a/locale/de_DE.po b/locale/de_DE.po
index a2976eb..8dd4b88 100644
--- a/locale/de_DE.po
+++ b/locale/de_DE.po
@@ -48,6 +48,12 @@ msgctxt "error:purchase.purchase:"
 msgid "Purchase \"%s\" must be cancelled before deletion!"
 msgstr "Einkauf \"%s\" muss annulliert werden, bevor er gelöscht werden kann."
 
+msgctxt "error:stock.shipment.in.return:"
+msgid "You cannot reset to draft a move generated by a purchase."
+msgstr ""
+"Eine durch einen Einkauf generierte Bewegung kann nicht auf Entwurf "
+"zurückgesetzt werden."
+
 msgctxt "error:stock.shipment.in:"
 msgid "You cannot reset to draft a move generated by a purchase."
 msgstr ""
@@ -558,6 +564,10 @@ msgctxt "field:purchase.purchase,reference:"
 msgid "Reference"
 msgstr "Beleg-Nr."
 
+msgctxt "field:purchase.purchase,shipment_returns:"
+msgid "Shipment Returns"
+msgstr "Lieferposten Rückgaben"
+
 msgctxt "field:purchase.purchase,shipment_state:"
 msgid "Shipment State"
 msgstr "Lieferstatus"
@@ -799,6 +809,10 @@ msgctxt "model:ir.action,name:act_purchase_form_quotation"
 msgid "Purchases in Quotation"
 msgstr "Angebote Einkäufe"
 
+msgctxt "model:ir.action,name:act_return_form"
+msgid "Returns"
+msgstr "Rückgaben"
+
 msgctxt "model:ir.action,name:act_shipment_form"
 msgid "Shipments"
 msgstr "Lieferposten"
@@ -1286,3 +1300,11 @@ msgstr "Abbrechen"
 msgctxt "wizard_button:purchase.handle.shipment.exception,ask,handle:"
 msgid "Ok"
 msgstr "OK"
+
+msgctxt "wizard_button:stock.product_quantities_warehouse,start,end:"
+msgid "Cancel"
+msgstr "Abbrechen"
+
+msgctxt "wizard_button:stock.product_quantities_warehouse,start,open_:"
+msgid "Open"
+msgstr "Öffnen"
diff --git a/locale/es_AR.po b/locale/es_AR.po
index e7d66b3..c50f435 100644
--- a/locale/es_AR.po
+++ b/locale/es_AR.po
@@ -42,7 +42,12 @@ msgstr "¡A la entidad «%s» le hace falta una «Cuenta de pagos»!"
 
 msgctxt "error:purchase.purchase:"
 msgid "Purchase \"%s\" must be cancelled before deletion!"
-msgstr "¡Compra \"%s\" debe ser cancelada antes de eliminar!"
+msgstr "¡Compra «%s» debe ser cancelada antes de eliminar!"
+
+msgctxt "error:stock.shipment.in.return:"
+msgid "You cannot reset to draft a move generated by a purchase."
+msgstr ""
+"No puede restablecer a borrador un movimiento generado por una compra."
 
 msgctxt "error:stock.shipment.in:"
 msgid "You cannot reset to draft a move generated by a purchase."
@@ -553,6 +558,10 @@ msgctxt "field:purchase.purchase,reference:"
 msgid "Reference"
 msgstr "Referencia"
 
+msgctxt "field:purchase.purchase,shipment_returns:"
+msgid "Shipment Returns"
+msgstr "Devolución de Envío"
+
 msgctxt "field:purchase.purchase,shipment_state:"
 msgid "Shipment State"
 msgstr "Estado de envío"
@@ -790,6 +799,10 @@ msgctxt "model:ir.action,name:act_purchase_form_quotation"
 msgid "Purchases in Quotation"
 msgstr "Compras en cotización"
 
+msgctxt "model:ir.action,name:act_return_form"
+msgid "Returns"
+msgstr "Devolución"
+
 msgctxt "model:ir.action,name:act_shipment_form"
 msgid "Shipments"
 msgstr "Envíos"
@@ -804,7 +817,7 @@ msgstr "Gestionar excepción de factura"
 
 msgctxt "model:ir.action,name:wizard_shipment_handle_exception"
 msgid "Handle Shipment Exception"
-msgstr "Gestionar excepción de envio"
+msgstr "Gestionar excepción de envío"
 
 msgctxt "model:ir.sequence,name:sequence_purchase"
 msgid "Purchase"
@@ -1000,7 +1013,7 @@ msgstr "Basado en orden"
 
 msgctxt "selection:purchase.configuration,purchase_invoice_method:"
 msgid "Based On Shipment"
-msgstr "Basado en envio"
+msgstr "Basado en envío"
 
 msgctxt "selection:purchase.configuration,purchase_invoice_method:"
 msgid "Manual"
@@ -1257,3 +1270,11 @@ msgstr "Cancelar"
 msgctxt "wizard_button:purchase.handle.shipment.exception,ask,handle:"
 msgid "Ok"
 msgstr "Aceptar"
+
+msgctxt "wizard_button:stock.product_quantities_warehouse,start,end:"
+msgid "Cancel"
+msgstr "Cancelar"
+
+msgctxt "wizard_button:stock.product_quantities_warehouse,start,open_:"
+msgid "Open"
+msgstr "Abrir"
diff --git a/locale/es_CO.po b/locale/es_CO.po
index cdb944f..df02e64 100644
--- a/locale/es_CO.po
+++ b/locale/es_CO.po
@@ -4,63 +4,68 @@ msgstr "Content-Type: text/plain; charset=utf-8\n"
 
 msgctxt "error:account.invoice:"
 msgid "You can not delete invoices that come from a purchase!"
-msgstr "¡No puede borrar facturas que vienen de una compra!"
+msgstr "No puede eliminar facturas que vienen de una compra."
 
 msgctxt "error:account.invoice:"
 msgid "You cannot reset to draft an invoice generated by a purchase."
-msgstr "No puede regresar a borrador una factura generada por una compra."
+msgstr "No puede restablecer a borrador una factura generada por una compra."
 
 msgctxt "error:product.template:"
 msgid ""
 "Purchase prices are based on the purchase uom, are you sure to change it?"
 msgstr ""
-"Los precios de compra están basados en la UdM de compra,¿desea cambiarlo?"
+"Los precios de compra están basados en la UdM de compra. ¿Desea cambiarlo?"
 
 msgctxt "error:purchase.line:"
 msgid "It misses an \"Account Expense\" on product \"%s\"!"
-msgstr "¡Hace falta una \"Cuenta de Gasto\" del producto \"%s\"!"
+msgstr "Al producto \"%s\" le falta una \"Cuenta de gastos\"."
 
 msgctxt "error:purchase.line:"
 msgid "It misses an \"account expense\" default property!"
-msgstr "¡Hace falta una propiedad predeterminada de \"cuenta de gastos\"!"
+msgstr "Falta una propiedad por defecto de \"Cuenta de gastos\"."
 
 msgctxt "error:purchase.line:"
 msgid "The supplier location is required!"
-msgstr "¡Se requiere el lugar del proveedor!"
+msgstr "La locación de proveedor es requerida."
 
 msgctxt "error:purchase.purchase:"
 msgid "A warehouse must be defined for the quotation."
-msgstr ""
+msgstr "Debe indicar un almacén en el presupuesto."
 
 msgctxt "error:purchase.purchase:"
 msgid "Invoice addresses must be defined for the quotation."
-msgstr "Debe definir las direcciones para la cotización."
+msgstr "Debe indicar la dirección de facturación en la cotización."
 
 msgctxt "error:purchase.purchase:"
 msgid "It misses an \"Account Payable\" on the party \"%s\"!"
-msgstr "¡Al tercero le hace falta una \"Cuenta de Pagos\"!"
+msgstr "Al tercero \"%s\" le falta una \"Cuenta a pagar\"."
 
 msgctxt "error:purchase.purchase:"
 msgid "Purchase \"%s\" must be cancelled before deletion!"
+msgstr "La compra \"%s\" debe ser cancelada antes de ser eliminada."
+
+#, fuzzy
+msgctxt "error:stock.shipment.in.return:"
+msgid "You cannot reset to draft a move generated by a purchase."
 msgstr ""
+"No puede restablecer a borrador un movimiento generado por una compra."
 
 msgctxt "error:stock.shipment.in:"
 msgid "You cannot reset to draft a move generated by a purchase."
-msgstr "No puede revertir a borrador un movimiento generado por una compra."
+msgstr ""
+"No puede restablecer a borrador un movimiento generado por una compra."
 
 msgctxt "field:account.invoice,purchase_exception_state:"
 msgid "Exception State"
-msgstr "Estado Excepción"
+msgstr "Estado excepción"
 
-#, fuzzy
 msgctxt "field:account.invoice,purchases:"
 msgid "Purchases"
 msgstr "Compras"
 
-#, fuzzy
 msgctxt "field:account.invoice.line,purchase_lines:"
 msgid "Purchase Lines"
-msgstr "Líneas de Compra"
+msgstr "Líneas de compra"
 
 msgctxt "field:product.template,product_suppliers:"
 msgid "Suppliers"
@@ -72,66 +77,63 @@ msgstr "Comprable"
 
 msgctxt "field:product.template,purchase_uom:"
 msgid "Purchase UOM"
-msgstr "UdM de Compra"
+msgstr "UdM de compra"
 
 msgctxt "field:purchase.configuration,create_date:"
 msgid "Create Date"
-msgstr ""
+msgstr "Fecha creación"
 
-#, fuzzy
 msgctxt "field:purchase.configuration,create_uid:"
 msgid "Create User"
-msgstr "Crear usuario"
+msgstr "Usuario creación"
 
 msgctxt "field:purchase.configuration,id:"
 msgid "ID"
-msgstr ""
+msgstr "ID"
 
-#, fuzzy
 msgctxt "field:purchase.configuration,purchase_invoice_method:"
 msgid "Invoice Method"
-msgstr "Método de Facturación"
+msgstr "Método de facturación"
 
 msgctxt "field:purchase.configuration,purchase_sequence:"
 msgid "Purchase Reference Sequence"
-msgstr ""
+msgstr "Secuencia pedidos de compra"
 
-#, fuzzy
 msgctxt "field:purchase.configuration,rec_name:"
 msgid "Name"
-msgstr "Nombre de Contacto"
+msgstr "Nombre"
 
 msgctxt "field:purchase.configuration,write_date:"
 msgid "Write Date"
-msgstr ""
+msgstr "Fecha modificación"
 
 msgctxt "field:purchase.configuration,write_uid:"
 msgid "Write User"
-msgstr ""
+msgstr "Usuario modificación"
 
 msgctxt "field:purchase.handle.invoice.exception.ask,domain_invoices:"
 msgid "Domain Invoices"
-msgstr "Rango de facturas"
+msgstr "Dominio de facturas"
 
 msgctxt "field:purchase.handle.invoice.exception.ask,id:"
 msgid "ID"
-msgstr ""
+msgstr "ID"
 
 msgctxt "field:purchase.handle.invoice.exception.ask,recreate_invoices:"
 msgid "Recreate Invoices"
-msgstr "Rehacer facturas"
+msgstr "Recrear facturas"
 
 msgctxt "field:purchase.handle.shipment.exception.ask,domain_moves:"
 msgid "Domain Moves"
-msgstr "Rango de movimientos"
+msgstr "Dominio de movimientos"
 
 msgctxt "field:purchase.handle.shipment.exception.ask,id:"
 msgid "ID"
-msgstr ""
+msgstr "ID"
 
 msgctxt "field:purchase.handle.shipment.exception.ask,recreate_moves:"
 msgid "Recreate Moves"
-msgstr "Rehacer movimientos"
+msgstr "Recrear movimientos"
 
 msgctxt "field:purchase.line,amount:"
 msgid "Amount"
@@ -139,41 +141,39 @@ msgstr "Cantidad"
 
 msgctxt "field:purchase.line,create_date:"
 msgid "Create Date"
-msgstr ""
+msgstr "Fecha creación"
 
-#, fuzzy
 msgctxt "field:purchase.line,create_uid:"
 msgid "Create User"
-msgstr "Crear usuario"
+msgstr "Usuario creación"
 
 msgctxt "field:purchase.line,delivery_date:"
 msgid "Delivery Date"
-msgstr ""
+msgstr "Fecha de entrega"
 
 msgctxt "field:purchase.line,description:"
 msgid "Description"
 msgstr "Descripción"
 
-#, fuzzy
 msgctxt "field:purchase.line,from_location:"
 msgid "From Location"
-msgstr "Lugar Inicial"
+msgstr "Desde locación"
 
 msgctxt "field:purchase.line,id:"
 msgid "ID"
-msgstr ""
+msgstr "ID"
 
 msgctxt "field:purchase.line,invoice_lines:"
 msgid "Invoice Lines"
-msgstr "Líneas de Factura"
+msgstr "Líneas de factura"
 
 msgctxt "field:purchase.line,move_done:"
 msgid "Moves Done"
-msgstr "Movimientos Hechos"
+msgstr "Movimientos realizados"
 
 msgctxt "field:purchase.line,move_exception:"
 msgid "Moves Exception"
-msgstr "Exepción de Movimientos"
+msgstr "Exepción de movimientos"
 
 msgctxt "field:purchase.line,moves:"
 msgid "Moves"
@@ -181,7 +181,7 @@ msgstr "Movimientos"
 
 msgctxt "field:purchase.line,moves_ignored:"
 msgid "Ignored Moves"
-msgstr "Movimientos Ignorados"
+msgstr "Movimientos ignorados"
 
 msgctxt "field:purchase.line,moves_recreated:"
 msgid "Recreated Moves"
@@ -197,7 +197,7 @@ msgstr "Producto"
 
 msgctxt "field:purchase.line,product_uom_category:"
 msgid "Product Uom Category"
-msgstr ""
+msgstr "Categoría UdM del producto"
 
 msgctxt "field:purchase.line,purchase:"
 msgid "Purchase"
@@ -219,10 +219,9 @@ msgctxt "field:purchase.line,taxes:"
 msgid "Taxes"
 msgstr "Impuestos"
 
-#, fuzzy
 msgctxt "field:purchase.line,to_location:"
 msgid "To Location"
-msgstr "Al Lugar:"
+msgstr "A locación"
 
 msgctxt "field:purchase.line,type:"
 msgid "Type"
@@ -234,40 +233,39 @@ msgstr "Unidad"
 
 msgctxt "field:purchase.line,unit_digits:"
 msgid "Unit Digits"
-msgstr "Dígitos Unitarios"
+msgstr "Dígitos de Unidad"
 
 msgctxt "field:purchase.line,unit_price:"
 msgid "Unit Price"
-msgstr "Precio Unitario"
+msgstr "Precio unitario"
 
 msgctxt "field:purchase.line,write_date:"
 msgid "Write Date"
-msgstr ""
+msgstr "Fecha modificación"
 
 msgctxt "field:purchase.line,write_uid:"
 msgid "Write User"
-msgstr ""
+msgstr "Usuario modificación"
 
 msgctxt "field:purchase.line-account.invoice.line,create_date:"
 msgid "Create Date"
-msgstr ""
+msgstr "Fecha creación"
 
-#, fuzzy
 msgctxt "field:purchase.line-account.invoice.line,create_uid:"
 msgid "Create User"
-msgstr "Crear usuario"
+msgstr "Usuario creación"
 
 msgctxt "field:purchase.line-account.invoice.line,id:"
 msgid "ID"
-msgstr ""
+msgstr "ID"
 
 msgctxt "field:purchase.line-account.invoice.line,invoice_line:"
 msgid "Invoice Line"
-msgstr "Línea de Factura"
+msgstr "Línea de factura"
 
 msgctxt "field:purchase.line-account.invoice.line,purchase_line:"
 msgid "Purchase Line"
-msgstr "Línea de Compra"
+msgstr "Línea de compra"
 
 msgctxt "field:purchase.line-account.invoice.line,rec_name:"
 msgid "Name"
@@ -275,24 +273,23 @@ msgstr "Nombre"
 
 msgctxt "field:purchase.line-account.invoice.line,write_date:"
 msgid "Write Date"
-msgstr ""
+msgstr "Fecha modificación"
 
 msgctxt "field:purchase.line-account.invoice.line,write_uid:"
 msgid "Write User"
-msgstr ""
+msgstr "Usuario modificación"
 
 msgctxt "field:purchase.line-account.tax,create_date:"
 msgid "Create Date"
-msgstr ""
+msgstr "Fecha creación"
 
-#, fuzzy
 msgctxt "field:purchase.line-account.tax,create_uid:"
 msgid "Create User"
-msgstr "Crear usuario"
+msgstr "Usuario creación"
 
 msgctxt "field:purchase.line-account.tax,id:"
 msgid "ID"
-msgstr ""
+msgstr "ID"
 
 msgctxt "field:purchase.line-account.tax,line:"
 msgid "Purchase Line"
@@ -308,24 +305,23 @@ msgstr "Impuesto"
 
 msgctxt "field:purchase.line-account.tax,write_date:"
 msgid "Write Date"
-msgstr ""
+msgstr "Fecha modificación"
 
 msgctxt "field:purchase.line-account.tax,write_uid:"
 msgid "Write User"
-msgstr ""
+msgstr "Usuario modificación"
 
 msgctxt "field:purchase.line-ignored-stock.move,create_date:"
 msgid "Create Date"
-msgstr ""
+msgstr "Fecha creación"
 
-#, fuzzy
 msgctxt "field:purchase.line-ignored-stock.move,create_uid:"
 msgid "Create User"
-msgstr "Crear usuario"
+msgstr "Usuario creación"
 
 msgctxt "field:purchase.line-ignored-stock.move,id:"
 msgid "ID"
-msgstr ""
+msgstr "ID"
 
 msgctxt "field:purchase.line-ignored-stock.move,move:"
 msgid "Move"
@@ -333,7 +329,7 @@ msgstr "Movimiento"
 
 msgctxt "field:purchase.line-ignored-stock.move,purchase_line:"
 msgid "Purchase Line"
-msgstr "Línea de Compra"
+msgstr "Línea de compra"
 
 msgctxt "field:purchase.line-ignored-stock.move,rec_name:"
 msgid "Name"
@@ -341,24 +337,23 @@ msgstr "Nombre"
 
 msgctxt "field:purchase.line-ignored-stock.move,write_date:"
 msgid "Write Date"
-msgstr ""
+msgstr "Fecha modificación"
 
 msgctxt "field:purchase.line-ignored-stock.move,write_uid:"
 msgid "Write User"
-msgstr ""
+msgstr "Usuario modificación"
 
 msgctxt "field:purchase.line-recreated-stock.move,create_date:"
 msgid "Create Date"
-msgstr ""
+msgstr "Fecha creación"
 
-#, fuzzy
 msgctxt "field:purchase.line-recreated-stock.move,create_uid:"
 msgid "Create User"
-msgstr "Crear usuario"
+msgstr "Usuario creación"
 
 msgctxt "field:purchase.line-recreated-stock.move,id:"
 msgid "ID"
-msgstr ""
+msgstr "ID"
 
 msgctxt "field:purchase.line-recreated-stock.move,move:"
 msgid "Move"
@@ -366,7 +361,7 @@ msgstr "Movimiento"
 
 msgctxt "field:purchase.line-recreated-stock.move,purchase_line:"
 msgid "Purchase Line"
-msgstr "Línea de Compra"
+msgstr "Línea de compra"
 
 msgctxt "field:purchase.line-recreated-stock.move,rec_name:"
 msgid "Name"
@@ -374,11 +369,11 @@ msgstr "Nombre"
 
 msgctxt "field:purchase.line-recreated-stock.move,write_date:"
 msgid "Write Date"
-msgstr ""
+msgstr "Fecha modificación"
 
 msgctxt "field:purchase.line-recreated-stock.move,write_uid:"
 msgid "Write User"
-msgstr ""
+msgstr "Usuario modificación"
 
 msgctxt "field:purchase.product_supplier,code:"
 msgid "Code"
@@ -386,29 +381,27 @@ msgstr "Código"
 
 msgctxt "field:purchase.product_supplier,company:"
 msgid "Company"
-msgstr "Compañía"
+msgstr "Compañia"
 
 msgctxt "field:purchase.product_supplier,create_date:"
 msgid "Create Date"
-msgstr ""
+msgstr "Fecha creación"
 
-#, fuzzy
 msgctxt "field:purchase.product_supplier,create_uid:"
 msgid "Create User"
-msgstr "Crear usuario"
+msgstr "Usuario creación"
 
-#, fuzzy
 msgctxt "field:purchase.product_supplier,currency:"
 msgid "Currency"
 msgstr "Moneda"
 
 msgctxt "field:purchase.product_supplier,delivery_time:"
 msgid "Delivery Time"
-msgstr "Tiempo de Envío"
+msgstr "Tiempo de envío"
 
 msgctxt "field:purchase.product_supplier,id:"
 msgid "ID"
-msgstr ""
+msgstr "ID"
 
 msgctxt "field:purchase.product_supplier,name:"
 msgid "Name"
@@ -436,24 +429,23 @@ msgstr "Secuencia"
 
 msgctxt "field:purchase.product_supplier,write_date:"
 msgid "Write Date"
-msgstr ""
+msgstr "Fecha modificación"
 
 msgctxt "field:purchase.product_supplier,write_uid:"
 msgid "Write User"
-msgstr ""
+msgstr "Usuario modificación"
 
 msgctxt "field:purchase.product_supplier.price,create_date:"
 msgid "Create Date"
-msgstr ""
+msgstr "Fecha creación"
 
-#, fuzzy
 msgctxt "field:purchase.product_supplier.price,create_uid:"
 msgid "Create User"
-msgstr "Crear usuario"
+msgstr "Usuario creación"
 
 msgctxt "field:purchase.product_supplier.price,id:"
 msgid "ID"
-msgstr ""
+msgstr "ID"
 
 msgctxt "field:purchase.product_supplier.price,product_supplier:"
 msgid "Supplier"
@@ -473,11 +465,11 @@ msgstr "Precio Unitario"
 
 msgctxt "field:purchase.product_supplier.price,write_date:"
 msgid "Write Date"
-msgstr ""
+msgstr "Fecha modificación"
 
 msgctxt "field:purchase.product_supplier.price,write_uid:"
 msgid "Write User"
-msgstr ""
+msgstr "Usuario modificación"
 
 msgctxt "field:purchase.purchase,comment:"
 msgid "Comment"
@@ -485,16 +477,15 @@ msgstr "Comentario"
 
 msgctxt "field:purchase.purchase,company:"
 msgid "Company"
-msgstr "Compañía"
+msgstr "Compañia"
 
 msgctxt "field:purchase.purchase,create_date:"
 msgid "Create Date"
-msgstr ""
+msgstr "Fecha creación"
 
-#, fuzzy
 msgctxt "field:purchase.purchase,create_uid:"
 msgid "Create User"
-msgstr "Crear usuario"
+msgstr "Usuario creación"
 
 msgctxt "field:purchase.purchase,currency:"
 msgid "Currency"
@@ -502,7 +493,7 @@ msgstr "Moneda"
 
 msgctxt "field:purchase.purchase,currency_digits:"
 msgid "Currency Digits"
-msgstr "Dígitos de Moneda"
+msgstr "Decimales de la Moneda"
 
 msgctxt "field:purchase.purchase,description:"
 msgid "Description"
@@ -510,19 +501,19 @@ msgstr "Descripción"
 
 msgctxt "field:purchase.purchase,id:"
 msgid "ID"
-msgstr ""
+msgstr "ID"
 
 msgctxt "field:purchase.purchase,invoice_address:"
 msgid "Invoice Address"
-msgstr "Dirección de Facturación"
+msgstr "Dirección de facturación"
 
 msgctxt "field:purchase.purchase,invoice_method:"
 msgid "Invoice Method"
-msgstr "Método de Facturación"
+msgstr "Método de facturación"
 
 msgctxt "field:purchase.purchase,invoice_state:"
 msgid "Invoice State"
-msgstr "Estado de Factura"
+msgstr "Estado factura"
 
 msgctxt "field:purchase.purchase,invoices:"
 msgid "Invoices"
@@ -530,7 +521,7 @@ msgstr "Facturas"
 
 msgctxt "field:purchase.purchase,invoices_ignored:"
 msgid "Ignored Invoices"
-msgstr "Facturas Ignoradas"
+msgstr "Facturas ignoradas"
 
 msgctxt "field:purchase.purchase,invoices_recreated:"
 msgid "Recreated Invoices"
@@ -546,19 +537,19 @@ msgstr "Movimientos"
 
 msgctxt "field:purchase.purchase,party:"
 msgid "Party"
-msgstr "Terceros"
+msgstr "Tercero"
 
 msgctxt "field:purchase.purchase,party_lang:"
 msgid "Party Language"
-msgstr "Idioma del Tercero"
+msgstr "Idioma del tercero"
 
 msgctxt "field:purchase.purchase,payment_term:"
 msgid "Payment Term"
-msgstr "Término de Pago"
+msgstr "Plazo de pago"
 
 msgctxt "field:purchase.purchase,purchase_date:"
 msgid "Purchase Date"
-msgstr "Fecha de Compra"
+msgstr "Fecha de compra"
 
 msgctxt "field:purchase.purchase,rec_name:"
 msgid "Name"
@@ -568,13 +559,18 @@ msgctxt "field:purchase.purchase,reference:"
 msgid "Reference"
 msgstr "Referencia"
 
+#, fuzzy
+msgctxt "field:purchase.purchase,shipment_returns:"
+msgid "Shipment Returns"
+msgstr "Devolución"
+
 msgctxt "field:purchase.purchase,shipment_state:"
 msgid "Shipment State"
 msgstr "Estado de Envío"
 
 msgctxt "field:purchase.purchase,shipments:"
 msgid "Shipments"
-msgstr "Envíos"
+msgstr "Envios"
 
 msgctxt "field:purchase.purchase,state:"
 msgid "State"
@@ -590,7 +586,7 @@ msgstr "Impuesto"
 
 msgctxt "field:purchase.purchase,tax_amount_cache:"
 msgid "Tax Cache"
-msgstr ""
+msgstr "Impuestos precalculado"
 
 msgctxt "field:purchase.purchase,total_amount:"
 msgid "Total"
@@ -598,40 +594,39 @@ msgstr "Total"
 
 msgctxt "field:purchase.purchase,total_amount_cache:"
 msgid "Total Cache"
-msgstr ""
+msgstr "Total precalculado"
 
 msgctxt "field:purchase.purchase,untaxed_amount:"
 msgid "Untaxed"
-msgstr "Sin Impuesto"
+msgstr "Base Sin Impuesto"
 
 msgctxt "field:purchase.purchase,untaxed_amount_cache:"
 msgid "Untaxed Cache"
-msgstr ""
+msgstr "Base imponible precalculado"
 
 msgctxt "field:purchase.purchase,warehouse:"
 msgid "Warehouse"
-msgstr "Depósito"
+msgstr "Almacén"
 
 msgctxt "field:purchase.purchase,write_date:"
 msgid "Write Date"
-msgstr ""
+msgstr "Fecha modificación"
 
 msgctxt "field:purchase.purchase,write_uid:"
 msgid "Write User"
-msgstr ""
+msgstr "Usuario modificación"
 
 msgctxt "field:purchase.purchase-account.invoice,create_date:"
 msgid "Create Date"
-msgstr ""
+msgstr "Fecha creación"
 
-#, fuzzy
 msgctxt "field:purchase.purchase-account.invoice,create_uid:"
 msgid "Create User"
-msgstr "Crear usuario"
+msgstr "Usuario creación"
 
 msgctxt "field:purchase.purchase-account.invoice,id:"
 msgid "ID"
-msgstr ""
+msgstr "ID"
 
 msgctxt "field:purchase.purchase-account.invoice,invoice:"
 msgid "Invoice"
@@ -647,24 +642,23 @@ msgstr "Nombre"
 
 msgctxt "field:purchase.purchase-account.invoice,write_date:"
 msgid "Write Date"
-msgstr ""
+msgstr "Fecha modificación"
 
 msgctxt "field:purchase.purchase-account.invoice,write_uid:"
 msgid "Write User"
-msgstr ""
+msgstr "Usuario modificación"
 
 msgctxt "field:purchase.purchase-ignored-account.invoice,create_date:"
 msgid "Create Date"
-msgstr ""
+msgstr "Fecha creación"
 
-#, fuzzy
 msgctxt "field:purchase.purchase-ignored-account.invoice,create_uid:"
 msgid "Create User"
-msgstr "Crear usuario"
+msgstr "Usuario creación"
 
 msgctxt "field:purchase.purchase-ignored-account.invoice,id:"
 msgid "ID"
-msgstr ""
+msgstr "ID"
 
 msgctxt "field:purchase.purchase-ignored-account.invoice,invoice:"
 msgid "Invoice"
@@ -680,24 +674,23 @@ msgstr "Nombre"
 
 msgctxt "field:purchase.purchase-ignored-account.invoice,write_date:"
 msgid "Write Date"
-msgstr ""
+msgstr "Fecha modificación"
 
 msgctxt "field:purchase.purchase-ignored-account.invoice,write_uid:"
 msgid "Write User"
-msgstr ""
+msgstr "Usuario modificación"
 
 msgctxt "field:purchase.purchase-recreated-account.invoice,create_date:"
 msgid "Create Date"
-msgstr ""
+msgstr "Fecha creación"
 
-#, fuzzy
 msgctxt "field:purchase.purchase-recreated-account.invoice,create_uid:"
 msgid "Create User"
-msgstr "Crear usuario"
+msgstr "Usuario creación"
 
 msgctxt "field:purchase.purchase-recreated-account.invoice,id:"
 msgid "ID"
-msgstr ""
+msgstr "ID"
 
 msgctxt "field:purchase.purchase-recreated-account.invoice,invoice:"
 msgid "Invoice"
@@ -713,11 +706,11 @@ msgstr "Nombre"
 
 msgctxt "field:purchase.purchase-recreated-account.invoice,write_date:"
 msgid "Write Date"
-msgstr ""
+msgstr "Fecha modificación"
 
 msgctxt "field:purchase.purchase-recreated-account.invoice,write_uid:"
 msgid "Write User"
-msgstr ""
+msgstr "Usuario modificación"
 
 msgctxt "field:stock.move,purchase:"
 msgid "Purchase"
@@ -729,9 +722,8 @@ msgstr "Moneda de Compra"
 
 msgctxt "field:stock.move,purchase_exception_state:"
 msgid "Exception State"
-msgstr "Estado Excepción"
+msgstr "Estado excepción"
 
-#, fuzzy
 msgctxt "field:stock.move,purchase_line:"
 msgid "Purchase Line"
 msgstr "Línea de Compra"
@@ -746,15 +738,15 @@ msgstr "Unidad de Compra"
 
 msgctxt "field:stock.move,purchase_unit_digits:"
 msgid "Purchase Unit Digits"
-msgstr "Dígitos de Unidad de Compra"
+msgstr "Decimales de la unidad de compra"
 
 msgctxt "field:stock.move,purchase_unit_price:"
 msgid "Purchase Unit Price"
-msgstr "Precio Unitario de Compra"
+msgstr "Precio unitario de compra"
 
 msgctxt "field:stock.move,purchase_visible:"
 msgid "Purchase Visible"
-msgstr ""
+msgstr "Compra visible"
 
 msgctxt "field:stock.move,supplier:"
 msgid "Supplier"
@@ -763,19 +755,21 @@ msgstr "Proveedor"
 msgctxt "help:purchase.handle.invoice.exception.ask,recreate_invoices:"
 msgid ""
 "The selected invoices will be recreated. The other ones will be ignored."
-msgstr "La factura seleccionada será recreada. Las otras serán ignoradas."
+msgstr ""
+"Las facturas seleccionadas serán recreadas. Las otras serán ignoradas."
 
 msgctxt "help:purchase.handle.shipment.exception.ask,recreate_moves:"
 msgid "The selected moves will be recreated. The other ones will be ignored."
-msgstr "Se recrearán los movimientos seleccionados. Los demás se ignorarán."
+msgstr ""
+"Los movimientos seleccionados serán recreados. Los otros serán ignorados."
 
 msgctxt "help:purchase.product_supplier,delivery_time:"
 msgid "In number of days"
-msgstr "En número de días"
+msgstr "En número de días."
 
 msgctxt "help:purchase.product_supplier.price,quantity:"
 msgid "Minimal quantity"
-msgstr "Cantidad Mínima"
+msgstr "Cantidad mínima."
 
 msgctxt "model:ir.action,name:act_invoice_form"
 msgid "Invoices"
@@ -783,11 +777,11 @@ msgstr "Facturas"
 
 msgctxt "model:ir.action,name:act_open_supplier"
 msgid "Parties associated to Purchases"
-msgstr "Terceros Asociados a Compras"
+msgstr "Terceros asociados a compras"
 
 msgctxt "model:ir.action,name:act_purchase_configuration_form"
 msgid "Purchase Configuration"
-msgstr ""
+msgstr "Configuración Compras"
 
 msgctxt "model:ir.action,name:act_purchase_form"
 msgid "Purchases"
@@ -799,7 +793,7 @@ msgstr "Compras"
 
 msgctxt "model:ir.action,name:act_purchase_form_confirmed"
 msgid "Confirmed Purchases"
-msgstr "Compras confirmadas"
+msgstr "Compras Confirmadas"
 
 msgctxt "model:ir.action,name:act_purchase_form_draft"
 msgid "Draft Purchases"
@@ -807,7 +801,12 @@ msgstr "Compras en Borrador"
 
 msgctxt "model:ir.action,name:act_purchase_form_quotation"
 msgid "Purchases in Quotation"
-msgstr "Cotizaciones de Compras"
+msgstr "Compras en Cotización"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_return_form"
+msgid "Returns"
+msgstr "Devolución"
 
 msgctxt "model:ir.action,name:act_shipment_form"
 msgid "Shipments"
@@ -819,32 +818,31 @@ msgstr "Compra"
 
 msgctxt "model:ir.action,name:wizard_invoice_handle_exception"
 msgid "Handle Invoice Exception"
-msgstr "Tratar Excepción de Factura"
+msgstr "Gestionar Excepción de Factura"
 
 msgctxt "model:ir.action,name:wizard_shipment_handle_exception"
 msgid "Handle Shipment Exception"
-msgstr "Tratar Excepción de Envío"
+msgstr "Gestionar Excepción de Envío"
 
 msgctxt "model:ir.sequence,name:sequence_purchase"
 msgid "Purchase"
-msgstr "Compras"
+msgstr "Compra"
 
 msgctxt "model:ir.sequence.type,name:sequence_type_purchase"
 msgid "Purchase"
-msgstr "Compras"
+msgstr "Compra"
 
 msgctxt "model:ir.ui.menu,name:menu_configuration"
 msgid "Configuration"
 msgstr "Configuración"
 
-#, fuzzy
 msgctxt "model:ir.ui.menu,name:menu_purchase"
 msgid "Purchase"
-msgstr "Gestión de Compras"
+msgstr "Compras"
 
 msgctxt "model:ir.ui.menu,name:menu_purchase_configuration"
 msgid "Purchase Configuration"
-msgstr ""
+msgstr "Configuration Compras"
 
 msgctxt "model:ir.ui.menu,name:menu_purchase_form"
 msgid "Purchases"
@@ -852,7 +850,7 @@ msgstr "Compras"
 
 msgctxt "model:ir.ui.menu,name:menu_purchase_form_confirmed"
 msgid "Confirmed Purchases"
-msgstr "Compras confirmadas"
+msgstr "Compras Confirmadas"
 
 msgctxt "model:ir.ui.menu,name:menu_purchase_form_draft"
 msgid "Draft Purchases"
@@ -860,29 +858,27 @@ msgstr "Compras en Borrador"
 
 msgctxt "model:ir.ui.menu,name:menu_purchase_form_quotation"
 msgid "Purchases in Quotation"
-msgstr "Cotizaciones de Compras"
+msgstr "Compras en Cotización"
 
 msgctxt "model:ir.ui.menu,name:menu_reporting"
 msgid "Reporting"
-msgstr "Reportes"
+msgstr "Informes"
 
 msgctxt "model:ir.ui.menu,name:menu_supplier"
 msgid "Parties associated to Purchases"
-msgstr "Terceros Asociados a Compras"
+msgstr "Terceros asociados a compras"
 
 msgctxt "model:purchase.configuration,name:"
 msgid "Purchase Configuration"
-msgstr ""
+msgstr "Configuración compras"
 
-#, fuzzy
 msgctxt "model:purchase.handle.invoice.exception.ask,name:"
 msgid "Handle Invoice Exception"
-msgstr "Pregunta de Excepción de Factura"
+msgstr "Gestionar Excepción de factura"
 
-#, fuzzy
 msgctxt "model:purchase.handle.shipment.exception.ask,name:"
 msgid "Handle Shipment Exception"
-msgstr "Preguntar Excepción de Envío"
+msgstr "Gestionar Excepción de envío"
 
 msgctxt "model:purchase.line,name:"
 msgid "Purchase Line"
@@ -894,15 +890,15 @@ msgstr "Línea de Compra - Línea de Factura"
 
 msgctxt "model:purchase.line-account.tax,name:"
 msgid "Purchase Line - Tax"
-msgstr "Línea de Compra - Impuesto"
+msgstr "Línea de compra - Impuesto"
 
 msgctxt "model:purchase.line-ignored-stock.move,name:"
 msgid "Purchase Line - Ignored Move"
-msgstr "Línea de Compra - Movimiento Ignorado"
+msgstr "Línea de compra - Movimiento ignorado"
 
 msgctxt "model:purchase.line-recreated-stock.move,name:"
 msgid "Purchase Line - Ignored Move"
-msgstr "Línea de Compra - Movimiento Ignorado"
+msgstr "Línea de compra - Movimiento ignorado"
 
 msgctxt "model:purchase.product_supplier,name:"
 msgid "Product Supplier"
@@ -910,7 +906,7 @@ msgstr "Proveedor de Producto"
 
 msgctxt "model:purchase.product_supplier.price,name:"
 msgid "Product Supplier Price"
-msgstr "Precio del Proveedor de Producto"
+msgstr "Precio del Proveedor del Producto"
 
 msgctxt "model:purchase.purchase,name:"
 msgid "Purchase"
@@ -922,11 +918,11 @@ msgstr "Compra - Factura"
 
 msgctxt "model:purchase.purchase-ignored-account.invoice,name:"
 msgid "Purchase - Ignored Invoice"
-msgstr "Compra - Factura Ignorada"
+msgstr "Compra - Factura ignorada"
 
 msgctxt "model:purchase.purchase-recreated-account.invoice,name:"
 msgid "Purchase - Recreated Invoice"
-msgstr "Compra - Factura Recreada"
+msgstr "Compra - Factura recreada"
 
 msgctxt "model:res.group,name:group_purchase"
 msgid "Purchase"
@@ -934,7 +930,7 @@ msgstr "Compras"
 
 msgctxt "model:res.group,name:group_purchase_admin"
 msgid "Purchase Administrator"
-msgstr "Administrador de Compra"
+msgstr "Administrador de compras"
 
 msgctxt "odt:purchase.purchase:"
 msgid "Amount"
@@ -954,7 +950,7 @@ msgstr "Descripción:"
 
 msgctxt "odt:purchase.purchase:"
 msgid "Draft Purchase Order"
-msgstr "Borrador de Orden de Compra"
+msgstr "Pedido de compra en borrador"
 
 msgctxt "odt:purchase.purchase:"
 msgid "E-Mail:"
@@ -966,7 +962,7 @@ msgstr "Teléfono:"
 
 msgctxt "odt:purchase.purchase:"
 msgid "Purchase Order N°:"
-msgstr "Nº de Orden de Compra:"
+msgstr "Pedido de compra Nº:"
 
 msgctxt "odt:purchase.purchase:"
 msgid "Quantity"
@@ -974,7 +970,7 @@ msgstr "Cantidad"
 
 msgctxt "odt:purchase.purchase:"
 msgid "Request for Quotation N°:"
-msgstr "Solicitud de Factura Nº:"
+msgstr "Solicitud de presupuesto Nº:"
 
 msgctxt "odt:purchase.purchase:"
 msgid "Taxes"
@@ -982,11 +978,11 @@ msgstr "Impuestos"
 
 msgctxt "odt:purchase.purchase:"
 msgid "Taxes:"
-msgstr "Impuestos"
+msgstr "Impuestos:"
 
 msgctxt "odt:purchase.purchase:"
 msgid "Total (excl. taxes):"
-msgstr "Total(excl. impuestos):"
+msgstr "Base (Sin Impuesto):"
 
 msgctxt "odt:purchase.purchase:"
 msgid "Total:"
@@ -998,7 +994,7 @@ msgstr "Precio Unitario"
 
 msgctxt "odt:purchase.purchase:"
 msgid "VAT Number:"
-msgstr ""
+msgstr "NIT:"
 
 msgctxt "odt:purchase.purchase:"
 msgid "VAT:"
@@ -1006,7 +1002,7 @@ msgstr "NIT:"
 
 msgctxt "selection:account.invoice,purchase_exception_state:"
 msgid ""
-msgstr ""
+msgstr "Cuenta de impuesto"
 
 msgctxt "selection:account.invoice,purchase_exception_state:"
 msgid "Ignored"
@@ -1014,19 +1010,16 @@ msgstr "Ignorado"
 
 msgctxt "selection:account.invoice,purchase_exception_state:"
 msgid "Recreated"
-msgstr "Rehecho"
+msgstr "Recreada"
 
-#, fuzzy
 msgctxt "selection:purchase.configuration,purchase_invoice_method:"
 msgid "Based On Order"
-msgstr "Basado en Orden"
+msgstr "Basado en el pedido"
 
-#, fuzzy
 msgctxt "selection:purchase.configuration,purchase_invoice_method:"
 msgid "Based On Shipment"
-msgstr "Basado en Envío"
+msgstr "Basado en el envío"
 
-#, fuzzy
 msgctxt "selection:purchase.configuration,purchase_invoice_method:"
 msgid "Manual"
 msgstr "Manual"
@@ -1049,11 +1042,11 @@ msgstr "Título"
 
 msgctxt "selection:purchase.purchase,invoice_method:"
 msgid "Based On Order"
-msgstr "Basado en Orden"
+msgstr "Basado en el pedido"
 
 msgctxt "selection:purchase.purchase,invoice_method:"
 msgid "Based On Shipment"
-msgstr "Basado en Envío"
+msgstr "Basado en el envío"
 
 msgctxt "selection:purchase.purchase,invoice_method:"
 msgid "Manual"
@@ -1069,11 +1062,11 @@ msgstr "Ninguno"
 
 msgctxt "selection:purchase.purchase,invoice_state:"
 msgid "Paid"
-msgstr "Pagado"
+msgstr "Pagada"
 
 msgctxt "selection:purchase.purchase,invoice_state:"
 msgid "Waiting"
-msgstr "En Espera"
+msgstr "En espera"
 
 msgctxt "selection:purchase.purchase,shipment_state:"
 msgid "Exception"
@@ -1085,23 +1078,23 @@ msgstr "Ninguno"
 
 msgctxt "selection:purchase.purchase,shipment_state:"
 msgid "Received"
-msgstr "Recibido"
+msgstr "Recibida"
 
 msgctxt "selection:purchase.purchase,shipment_state:"
 msgid "Waiting"
-msgstr "En Espera"
+msgstr "En espera"
 
 msgctxt "selection:purchase.purchase,state:"
 msgid "Canceled"
-msgstr "Cancelado"
+msgstr "Cancelada"
 
 msgctxt "selection:purchase.purchase,state:"
 msgid "Confirmed"
-msgstr "Confirmado"
+msgstr "Confirmada"
 
 msgctxt "selection:purchase.purchase,state:"
 msgid "Done"
-msgstr "Hecho"
+msgstr "Realizada"
 
 msgctxt "selection:purchase.purchase,state:"
 msgid "Draft"
@@ -1113,7 +1106,7 @@ msgstr "Cotización"
 
 msgctxt "selection:stock.move,purchase_exception_state:"
 msgid ""
-msgstr ""
+msgstr "Cuenta de impuesto"
 
 msgctxt "selection:stock.move,purchase_exception_state:"
 msgid "Ignored"
@@ -1121,7 +1114,7 @@ msgstr "Ignorado"
 
 msgctxt "selection:stock.move,purchase_exception_state:"
 msgid "Recreated"
-msgstr "Rehecho"
+msgstr "Recreado"
 
 msgctxt "view:product.product:"
 msgid "Products"
@@ -1133,7 +1126,7 @@ msgstr "Proveedores"
 
 msgctxt "view:product.template:"
 msgid "Product Suppliers"
-msgstr "Proveedores de Productos"
+msgstr "Proveedores de productos"
 
 msgctxt "view:product.template:"
 msgid "Suppliers"
@@ -1141,28 +1134,27 @@ msgstr "Proveedores"
 
 msgctxt "view:purchase.configuration:"
 msgid "Purchase Configuration"
-msgstr ""
+msgstr "Configuración de Compras"
 
 msgctxt "view:purchase.handle.invoice.exception.ask:"
 msgid "Choose invoices to recreate"
-msgstr "Escoja una factura a rehacer"
+msgstr "Seleccione facturas a recrear"
 
 msgctxt "view:purchase.handle.invoice.exception.ask:"
 msgid "Handle Invoice Exception"
-msgstr "Manejar excepción de factura"
+msgstr "Gestionar excepción de factura"
 
-#, fuzzy
 msgctxt "view:purchase.handle.shipment.exception.ask:"
 msgid "Choose move to recreate"
-msgstr "Escoja un movimiento a rehacer"
+msgstr "Seleccione movimientos a recrear"
 
 msgctxt "view:purchase.handle.shipment.exception.ask:"
 msgid "Choose moves to recreate"
-msgstr "Elegir movimientos a recrear"
+msgstr "Seleccione movimientos a recrear"
 
 msgctxt "view:purchase.handle.shipment.exception.ask:"
 msgid "Handle shipment Exception"
-msgstr "Maneje Excepciones de envío"
+msgstr "Gestionar excepción de envío"
 
 msgctxt "view:purchase.handle.shipment.exception.ask:"
 msgid "Recreated Moves"
@@ -1172,10 +1164,9 @@ msgctxt "view:purchase.line:"
 msgid "General"
 msgstr "General"
 
-#, fuzzy
 msgctxt "view:purchase.line:"
 msgid "Lines"
-msgstr "Líneas de Inventario"
+msgstr "Líneas"
 
 msgctxt "view:purchase.line:"
 msgid "Notes"
@@ -1187,27 +1178,27 @@ msgstr "Productos"
 
 msgctxt "view:purchase.line:"
 msgid "Purchase Line"
-msgstr "Línea de Compra"
+msgstr "Línea de compra"
 
 msgctxt "view:purchase.line:"
 msgid "Purchase Lines"
-msgstr "Líneas de Compra"
+msgstr "Líneas de compra"
 
 msgctxt "view:purchase.product_supplier.price:"
 msgid "Product Supplier Price"
-msgstr "Precio del Proveedor del Producto"
+msgstr "Precio del proveedor del producto"
 
 msgctxt "view:purchase.product_supplier.price:"
 msgid "Product Supplier Prices"
-msgstr "Precios del Proveedor del Producto"
+msgstr "Precios del proveedor del producto"
 
 msgctxt "view:purchase.product_supplier:"
 msgid "Product Supplier"
-msgstr "Proveedor del Producto"
+msgstr "Proveedor del producto"
 
 msgctxt "view:purchase.product_supplier:"
 msgid "Product Suppliers"
-msgstr "Proveedores de Productos"
+msgstr "Proveedores de producto"
 
 msgctxt "view:purchase.purchase:"
 msgid "Cancel"
@@ -1223,11 +1214,11 @@ msgstr "Borrador"
 
 msgctxt "view:purchase.purchase:"
 msgid "Handle Invoice Exception"
-msgstr "Manejar excepción de factura"
+msgstr "Gestionar excepción de factura"
 
 msgctxt "view:purchase.purchase:"
 msgid "Handle Shipment Exception"
-msgstr "Tratar Excepción de Envío"
+msgstr "Gestionar excepción de envío"
 
 msgctxt "view:purchase.purchase:"
 msgid "Invoices"
@@ -1243,7 +1234,7 @@ msgstr "Movimientos"
 
 msgctxt "view:purchase.purchase:"
 msgid "Other Info"
-msgstr "Información Adicional"
+msgstr "Info Adicional"
 
 msgctxt "view:purchase.purchase:"
 msgid "Purchase"
@@ -1259,33 +1250,36 @@ msgstr "Cotización"
 
 msgctxt "view:purchase.purchase:"
 msgid "Quote"
-msgstr ""
+msgstr "Presupuesto"
 
 msgctxt "view:purchase.purchase:"
 msgid "Shipments"
-msgstr "Envíos"
+msgstr "Envios"
 
-#, fuzzy
 msgctxt "view:stock.move:"
 msgid "Moves"
 msgstr "Movimientos"
 
-#, fuzzy
 msgctxt "wizard_button:purchase.handle.invoice.exception,ask,end:"
 msgid "Cancel"
 msgstr "Cancelar"
 
-#, fuzzy
 msgctxt "wizard_button:purchase.handle.invoice.exception,ask,handle:"
 msgid "Ok"
 msgstr "Aceptar"
 
-#, fuzzy
 msgctxt "wizard_button:purchase.handle.shipment.exception,ask,end:"
 msgid "Cancel"
 msgstr "Cancelar"
 
-#, fuzzy
 msgctxt "wizard_button:purchase.handle.shipment.exception,ask,handle:"
 msgid "Ok"
 msgstr "Aceptar"
+
+msgctxt "wizard_button:stock.product_quantities_warehouse,start,end:"
+msgid "Cancel"
+msgstr "Cancelar"
+
+msgctxt "wizard_button:stock.product_quantities_warehouse,start,open_:"
+msgid "Open"
+msgstr "Abrir"
diff --git a/locale/es_ES.po b/locale/es_ES.po
index 532f308..3d62601 100644
--- a/locale/es_ES.po
+++ b/locale/es_ES.po
@@ -44,6 +44,11 @@ msgctxt "error:purchase.purchase:"
 msgid "Purchase \"%s\" must be cancelled before deletion!"
 msgstr "La compra \"%s\" debe ser cancelada antes de ser eliminada."
 
+msgctxt "error:stock.shipment.in.return:"
+msgid "You cannot reset to draft a move generated by a purchase."
+msgstr ""
+"No puede restablecer a borrador un movimiento generado por una compra."
+
 msgctxt "error:stock.shipment.in:"
 msgid "You cannot reset to draft a move generated by a purchase."
 msgstr ""
@@ -387,7 +392,7 @@ msgstr "Usuario creación"
 
 msgctxt "field:purchase.product_supplier,currency:"
 msgid "Currency"
-msgstr "Divisa"
+msgstr "Moneda"
 
 msgctxt "field:purchase.product_supplier,delivery_time:"
 msgid "Delivery Time"
@@ -483,11 +488,11 @@ msgstr "Usuario creación"
 
 msgctxt "field:purchase.purchase,currency:"
 msgid "Currency"
-msgstr "Divisa"
+msgstr "Moneda"
 
 msgctxt "field:purchase.purchase,currency_digits:"
 msgid "Currency Digits"
-msgstr "Decimales de la divisa"
+msgstr "Decimales de la moneda"
 
 msgctxt "field:purchase.purchase,description:"
 msgid "Description"
@@ -553,6 +558,10 @@ msgctxt "field:purchase.purchase,reference:"
 msgid "Reference"
 msgstr "Referencia"
 
+msgctxt "field:purchase.purchase,shipment_returns:"
+msgid "Shipment Returns"
+msgstr "Albaranes de devolución"
+
 msgctxt "field:purchase.purchase,shipment_state:"
 msgid "Shipment State"
 msgstr "Estado envío"
@@ -707,7 +716,7 @@ msgstr "Compra"
 
 msgctxt "field:stock.move,purchase_currency:"
 msgid "Purchase Currency"
-msgstr "Divisa de compra"
+msgstr "Moneda de compra"
 
 msgctxt "field:stock.move,purchase_exception_state:"
 msgid "Exception State"
@@ -786,11 +795,15 @@ msgstr "Compras confirmadas"
 
 msgctxt "model:ir.action,name:act_purchase_form_draft"
 msgid "Draft Purchases"
-msgstr "Compras borrador"
+msgstr "Compras en borrador"
 
 msgctxt "model:ir.action,name:act_purchase_form_quotation"
 msgid "Purchases in Quotation"
-msgstr "Compras presupuestadas"
+msgstr "Compras en presupuesto"
+
+msgctxt "model:ir.action,name:act_return_form"
+msgid "Returns"
+msgstr "Devolver"
 
 msgctxt "model:ir.action,name:act_shipment_form"
 msgid "Shipments"
@@ -826,7 +839,7 @@ msgstr "Compras"
 
 msgctxt "model:ir.ui.menu,name:menu_purchase_configuration"
 msgid "Purchase Configuration"
-msgstr "Compras"
+msgstr "Configuración compras"
 
 msgctxt "model:ir.ui.menu,name:menu_purchase_form"
 msgid "Purchases"
@@ -834,15 +847,15 @@ msgstr "Compras"
 
 msgctxt "model:ir.ui.menu,name:menu_purchase_form_confirmed"
 msgid "Confirmed Purchases"
-msgstr "Compras confirmadas"
+msgstr "Confirmadas"
 
 msgctxt "model:ir.ui.menu,name:menu_purchase_form_draft"
 msgid "Draft Purchases"
-msgstr "Compras borrador"
+msgstr "Borrador"
 
 msgctxt "model:ir.ui.menu,name:menu_purchase_form_quotation"
 msgid "Purchases in Quotation"
-msgstr "Compras presupuestadas"
+msgstr "Presupuestadas"
 
 msgctxt "model:ir.ui.menu,name:menu_reporting"
 msgid "Reporting"
@@ -856,12 +869,10 @@ msgctxt "model:purchase.configuration,name:"
 msgid "Purchase Configuration"
 msgstr "Configuración compras"
 
-#, fuzzy
 msgctxt "model:purchase.handle.invoice.exception.ask,name:"
 msgid "Handle Invoice Exception"
 msgstr "Gestionar excepción de factura"
 
-#, fuzzy
 msgctxt "model:purchase.handle.shipment.exception.ask,name:"
 msgid "Handle Shipment Exception"
 msgstr "Gestionar excepción de envío"
@@ -1261,3 +1272,11 @@ msgstr "Cancelar"
 msgctxt "wizard_button:purchase.handle.shipment.exception,ask,handle:"
 msgid "Ok"
 msgstr "Aceptar"
+
+msgctxt "wizard_button:stock.product_quantities_warehouse,start,end:"
+msgid "Cancel"
+msgstr "Cancelar"
+
+msgctxt "wizard_button:stock.product_quantities_warehouse,start,open_:"
+msgid "Open"
+msgstr "Abrir"
diff --git a/locale/fr_FR.po b/locale/fr_FR.po
index df91b19..3f87827 100644
--- a/locale/fr_FR.po
+++ b/locale/fr_FR.po
@@ -80,6 +80,10 @@ msgctxt "error:purchase.purchase:"
 msgid "Purchase \"%s\" must be cancelled before deletion!"
 msgstr "L'achat \"%s\" doit être annulé avant suppression"
 
+msgctxt "error:stock.shipment.in.return:"
+msgid "You cannot reset to draft a move generated by a purchase."
+msgstr "Vous ne pouvez pas réinitialiser un mouvement généré par un achat."
+
 msgctxt "error:stock.shipment.in:"
 msgid "You cannot reset to draft a move generated by a purchase."
 msgstr "Vous ne pouvez pas réinitialiser un mouvement généré par un achat."
@@ -592,6 +596,10 @@ msgctxt "field:purchase.purchase,reference:"
 msgid "Reference"
 msgstr "Référence"
 
+msgctxt "field:purchase.purchase,shipment_returns:"
+msgid "Shipment Returns"
+msgstr "Retours d'expédition"
+
 msgctxt "field:purchase.purchase,shipment_state:"
 msgid "Shipment State"
 msgstr "État de l'expédition"
@@ -831,6 +839,10 @@ msgctxt "model:ir.action,name:act_purchase_form_quotation"
 msgid "Purchases in Quotation"
 msgstr "Devis"
 
+msgctxt "model:ir.action,name:act_return_form"
+msgid "Returns"
+msgstr "Retours"
+
 msgctxt "model:ir.action,name:act_shipment_form"
 msgid "Shipments"
 msgstr "Expéditions"
@@ -873,7 +885,7 @@ msgstr "Achats"
 
 msgctxt "model:ir.ui.menu,name:menu_purchase_form_confirmed"
 msgid "Confirmed Purchases"
-msgstr "Achats confirmé"
+msgstr "Achats confirmés"
 
 msgctxt "model:ir.ui.menu,name:menu_purchase_form_draft"
 msgid "Draft Purchases"
@@ -1590,3 +1602,11 @@ msgstr "Annuler"
 msgctxt "wizard_button:purchase.handle.shipment.exception,ask,handle:"
 msgid "Ok"
 msgstr "Ok"
+
+msgctxt "wizard_button:stock.product_quantities_warehouse,start,end:"
+msgid "Cancel"
+msgstr "Annuler"
+
+msgctxt "wizard_button:stock.product_quantities_warehouse,start,open_:"
+msgid "Open"
+msgstr "Ouvrir"
diff --git a/locale/nl_NL.po b/locale/nl_NL.po
index 9c43757..c5a50b3 100644
--- a/locale/nl_NL.po
+++ b/locale/nl_NL.po
@@ -43,6 +43,10 @@ msgctxt "error:purchase.purchase:"
 msgid "Purchase \"%s\" must be cancelled before deletion!"
 msgstr ""
 
+msgctxt "error:stock.shipment.in.return:"
+msgid "You cannot reset to draft a move generated by a purchase."
+msgstr ""
+
 msgctxt "error:stock.shipment.in:"
 msgid "You cannot reset to draft a move generated by a purchase."
 msgstr ""
@@ -614,6 +618,10 @@ msgctxt "field:purchase.purchase,reference:"
 msgid "Reference"
 msgstr "Referentie"
 
+msgctxt "field:purchase.purchase,shipment_returns:"
+msgid "Shipment Returns"
+msgstr ""
+
 #, fuzzy
 msgctxt "field:purchase.purchase,shipment_state:"
 msgid "Shipment State"
@@ -870,6 +878,10 @@ msgctxt "model:ir.action,name:act_purchase_form_quotation"
 msgid "Purchases in Quotation"
 msgstr ""
 
+msgctxt "model:ir.action,name:act_return_form"
+msgid "Returns"
+msgstr ""
+
 #, fuzzy
 msgctxt "model:ir.action,name:act_shipment_form"
 msgid "Shipments"
@@ -1398,3 +1410,13 @@ msgstr "Annuleren"
 msgctxt "wizard_button:purchase.handle.shipment.exception,ask,handle:"
 msgid "Ok"
 msgstr "Oké"
+
+#, fuzzy
+msgctxt "wizard_button:stock.product_quantities_warehouse,start,end:"
+msgid "Cancel"
+msgstr "Annuleren"
+
+#, fuzzy
+msgctxt "wizard_button:stock.product_quantities_warehouse,start,open_:"
+msgid "Open"
+msgstr "Open"
diff --git a/locale/ru_RU.po b/locale/ru_RU.po
index 921286a..acd777d 100644
--- a/locale/ru_RU.po
+++ b/locale/ru_RU.po
@@ -43,6 +43,10 @@ msgctxt "error:purchase.purchase:"
 msgid "Purchase \"%s\" must be cancelled before deletion!"
 msgstr ""
 
+msgctxt "error:stock.shipment.in.return:"
+msgid "You cannot reset to draft a move generated by a purchase."
+msgstr ""
+
 msgctxt "error:stock.shipment.in:"
 msgid "You cannot reset to draft a move generated by a purchase."
 msgstr ""
@@ -591,6 +595,10 @@ msgctxt "field:purchase.purchase,reference:"
 msgid "Reference"
 msgstr "Ссылка"
 
+msgctxt "field:purchase.purchase,shipment_returns:"
+msgid "Shipment Returns"
+msgstr ""
+
 msgctxt "field:purchase.purchase,shipment_state:"
 msgid "Shipment State"
 msgstr ""
@@ -834,6 +842,10 @@ msgctxt "model:ir.action,name:act_purchase_form_quotation"
 msgid "Purchases in Quotation"
 msgstr ""
 
+msgctxt "model:ir.action,name:act_return_form"
+msgid "Returns"
+msgstr ""
+
 msgctxt "model:ir.action,name:act_shipment_form"
 msgid "Shipments"
 msgstr ""
@@ -1326,3 +1338,13 @@ msgstr "Отменить"
 msgctxt "wizard_button:purchase.handle.shipment.exception,ask,handle:"
 msgid "Ok"
 msgstr "Да"
+
+#, fuzzy
+msgctxt "wizard_button:stock.product_quantities_warehouse,start,end:"
+msgid "Cancel"
+msgstr "Отменить"
+
+#, fuzzy
+msgctxt "wizard_button:stock.product_quantities_warehouse,start,open_:"
+msgid "Open"
+msgstr "Открыть"
diff --git a/purchase.py b/purchase.py
index 2e9d146..b78c906 100644
--- a/purchase.py
+++ b/purchase.py
@@ -1,18 +1,27 @@
 #This file is part of Tryton.  The COPYRIGHT file at the top level of
 #this repository contains the full copyright notices and license terms.
 import datetime
-import copy
 from decimal import Decimal
 from trytond.model import Workflow, ModelView, ModelSQL, fields
 from trytond.modules.company import CompanyReport
 from trytond.wizard import Wizard, StateAction, StateView, StateTransition, \
     Button
 from trytond.backend import TableHandler
-from trytond.pyson import Eval, Bool, If, PYSONEncoder
+from trytond.pyson import Eval, Bool, If, PYSONEncoder, Id
 from trytond.transaction import Transaction
-from trytond.pool import Pool
+from trytond.pool import Pool, PoolMeta
 from trytond.config import CONFIG
 
+__all__ = ['Purchase', 'PurchaseInvoice', 'PurchaseIgnoredInvoice',
+    'PurchaseRecreadtedInvoice', 'PurchaseLine', 'PurchaseLineTax',
+    'PurchaseLineInvoiceLine', 'PurchaseLineIgnoredMove',
+    'PurchaseLineRecreatedMove', 'PurchaseReport', 'Template', 'Product',
+    'ProductSupplier', 'ProductSupplierPrice', 'ShipmentIn',
+    'ShipmentInReturn', 'Move', 'OpenSupplier', 'HandleShipmentExceptionAsk',
+    'HandleShipmentException', 'HandleInvoiceExceptionAsk',
+    'HandleInvoiceException']
+__metaclass__ = PoolMeta
+
 _STATES = {
     'readonly': Eval('state') != 'draft',
     }
@@ -21,10 +30,8 @@ _DEPENDS = ['state']
 
 class Purchase(Workflow, ModelSQL, ModelView):
     'Purchase'
-    _name = 'purchase.purchase'
+    __name__ = 'purchase.purchase'
     _rec_name = 'reference'
-    _description = __doc__
-
     company = fields.Many2One('company.company', 'Company', required=True,
         states={
             'readonly': (Eval('state') != 'draft') | Eval('lines', [0]),
@@ -57,7 +64,7 @@ class Purchase(Workflow, ModelSQL, ModelView):
             required=True, states=_STATES, on_change=['party', 'payment_term'],
             select=True, depends=_DEPENDS)
     party_lang = fields.Function(fields.Char('Party Language',
-        on_change_with=['party']), 'get_function_fields')
+            on_change_with=['party']), 'on_change_with_party_lang')
     invoice_address = fields.Many2One('party.address', 'Invoice Address',
         domain=[('party', '=', Eval('party'))], states=_STATES,
         depends=['state', 'party'])
@@ -71,7 +78,7 @@ class Purchase(Workflow, ModelSQL, ModelView):
             },
         depends=['state'])
     currency_digits = fields.Function(fields.Integer('Currency Digits',
-        on_change_with=['currency']), 'get_function_fields')
+            on_change_with=['currency']), 'on_change_with_currency_digits')
     lines = fields.One2Many('purchase.line', 'purchase', 'Lines',
         states=_STATES, on_change=['lines', 'currency', 'party'],
         depends=_DEPENDS)
@@ -121,15 +128,19 @@ class Purchase(Workflow, ModelSQL, ModelView):
             ('exception', 'Exception'),
             ], 'Shipment State', readonly=True, required=True)
     shipments = fields.Function(fields.One2Many('stock.shipment.in', None,
-        'Shipments'), 'get_function_fields')
+            'Shipments'), 'get_shipments')
+    shipment_returns = fields.Function(
+        fields.One2Many('stock.shipment.in.return', None, 'Shipment Returns'),
+        'get_shipment_returns')
     moves = fields.Function(fields.One2Many('stock.move', None, 'Moves'),
-            'get_function_fields')
-
-    def __init__(self):
-        super(Purchase, self).__init__()
-        self._order.insert(0, ('purchase_date', 'DESC'))
-        self._order.insert(1, ('id', 'DESC'))
-        self._error_messages.update({
+        'get_moves')
+
+    @classmethod
+    def __setup__(cls):
+        super(Purchase, cls).__setup__()
+        cls._order.insert(0, ('purchase_date', 'DESC'))
+        cls._order.insert(1, ('id', 'DESC'))
+        cls._error_messages.update({
                 'invoice_addresse_required': 'Invoice addresses must be '
                 'defined for the quotation.',
                 'warehouse_required': 'A warehouse must be defined for the ' \
@@ -138,21 +149,24 @@ class Purchase(Workflow, ModelSQL, ModelView):
                         'an "Account Payable" on the party "%s"!',
                 'delete_cancel': 'Purchase "%s" must be cancelled before '\
                     'deletion!',
-            })
-        self._transitions |= set((
+                })
+        cls._transitions |= set((
                 ('draft', 'quotation'),
                 ('quotation', 'confirmed'),
                 ('confirmed', 'confirmed'),
                 ('draft', 'cancel'),
                 ('quotation', 'cancel'),
                 ('quotation', 'draft'),
+                ('cancel', 'draft'),
                 ))
-        self._buttons.update({
+        cls._buttons.update({
                 'cancel': {
                     'invisible': ~Eval('state').in_(['draft', 'quotation']),
                     },
                 'draft': {
-                    'invisible': Eval('state') != 'quotation',
+                    'invisible': ~Eval('state').in_(['cancel', 'quotation']),
+                    'icon': If(Eval('state') == 'cancel', 'tryton-clear',
+                        'tryton-go-previous'),
                     },
                 'quote': {
                     'invisible': Eval('state') != 'draft',
@@ -161,11 +175,24 @@ class Purchase(Workflow, ModelSQL, ModelView):
                 'confirm': {
                     'invisible': Eval('state') != 'quotation',
                     },
+                'handle_invoice_exception': {
+                    'invisible': ((Eval('invoice_state') != 'exception')
+                        | (Eval('state') == 'cancel')),
+                    'readonly': ~Eval('groups', []).contains(
+                        Id('purchase', 'group_purchase')),
+                    },
+                'handle_shipment_exception': {
+                    'invisible': ((Eval('shipment_state') != 'exception')
+                        | (Eval('state') == 'cancel')),
+                    'readonly': ~Eval('groups', []).contains(
+                        Id('purchase', 'group_purchase')),
+                    },
                 })
         # The states where amounts are cached
-        self._states_cached = ['confirmed', 'done', 'cancel']
+        cls._states_cached = ['confirmed', 'done', 'cancel']
 
-    def init(self, module_name):
+    @classmethod
+    def __register__(cls, module_name):
         cursor = Transaction().cursor
         # Migration from 1.2: packing renamed into shipment
         cursor.execute("UPDATE ir_model_data "\
@@ -178,18 +205,18 @@ class Purchase(Workflow, ModelSQL, ModelView):
                 "WHERE (relation like '%%packing%%' "\
                     "OR name like '%%packing%%') AND module = %s",
                 (module_name,))
-        table = TableHandler(cursor, self, module_name)
+        table = TableHandler(cursor, cls, module_name)
         table.column_rename('packing_state', 'shipment_state')
 
-        super(Purchase, self).init(module_name)
+        super(Purchase, cls).__register__(module_name)
 
         # Migration from 1.2: rename packing to shipment in
         # invoice_method values
-        cursor.execute("UPDATE " + self._table + " "\
+        cursor.execute("UPDATE " + cls._table + " "\
                 "SET invoice_method = 'shipment' "\
                 "WHERE invoice_method = 'packing'")
 
-        table = TableHandler(cursor, self, module_name)
+        table = TableHandler(cursor, cls, module_name)
         # Migration from 2.2: warehouse is no more required
         table.not_null_action('warehouse', 'remove')
 
@@ -197,72 +224,79 @@ class Purchase(Workflow, ModelSQL, ModelView):
         table.not_null_action('purchase_date', 'remove')
 
         # Add index on create_date
-        table = TableHandler(cursor, self, module_name)
+        table = TableHandler(cursor, cls, module_name)
         table.index_action('create_date', action='add')
 
-    def default_payment_term(self):
-        payment_term_obj = Pool().get('account.invoice.payment_term')
-        payment_term_ids = payment_term_obj.search(self.payment_term.domain)
-        if len(payment_term_ids) == 1:
-            return payment_term_ids[0]
-
-    def default_warehouse(self):
-        location_obj = Pool().get('stock.location')
-        location_ids = location_obj.search(self.warehouse.domain)
-        if len(location_ids) == 1:
-            return location_ids[0]
-
-    def default_company(self):
+    @classmethod
+    def default_payment_term(cls):
+        PaymentTerm = Pool().get('account.invoice.payment_term')
+        payment_terms = PaymentTerm.search(cls.payment_term.domain)
+        if len(payment_terms) == 1:
+            return payment_terms[0].id
+
+    @classmethod
+    def default_warehouse(cls):
+        Location = Pool().get('stock.location')
+        locations = Location.search(cls.warehouse.domain)
+        if len(locations) == 1:
+            return locations[0].id
+
+    @staticmethod
+    def default_company():
         return Transaction().context.get('company')
 
-    def default_state(self):
+    @staticmethod
+    def default_state():
         return 'draft'
 
-    def default_currency(self):
-        company_obj = Pool().get('company.company')
+    @staticmethod
+    def default_currency():
+        Company = Pool().get('company.company')
         company = Transaction().context.get('company')
         if company:
-            company = company_obj.browse(company)
+            company = Company(company)
             return company.currency.id
 
-    def default_currency_digits(self):
-        company_obj = Pool().get('company.company')
+    @staticmethod
+    def default_currency_digits():
+        Company = Pool().get('company.company')
         company = Transaction().context.get('company')
         if company:
-            company = company_obj.browse(company)
+            company = Company(company)
             return company.currency.digits
         return 2
 
-    def default_invoice_method(self):
-        configuration_obj = Pool().get('purchase.configuration')
-        configuration = configuration_obj.browse(1)
+    @staticmethod
+    def default_invoice_method():
+        Configuration = Pool().get('purchase.configuration')
+        configuration = Configuration(1)
         return configuration.purchase_invoice_method
 
-    def default_invoice_state(self):
+    @staticmethod
+    def default_invoice_state():
         return 'none'
 
-    def default_shipment_state(self):
+    @staticmethod
+    def default_shipment_state():
         return 'none'
 
-    def on_change_party(self, vals):
+    def on_change_party(self):
         pool = Pool()
-        party_obj = pool.get('party.party')
-        address_obj = pool.get('party.address')
-        payment_term_obj = pool.get('account.invoice.payment_term')
-        currency_obj = pool.get('currency.currency')
+        PaymentTerm = pool.get('account.invoice.payment_term')
+        Currency = pool.get('currency.currency')
         cursor = Transaction().cursor
-        res = {
+        changes = {
             'invoice_address': None,
             'payment_term': None,
             'currency': self.default_currency(),
             'currency_digits': self.default_currency_digits(),
-        }
-        if vals.get('party'):
-            party = party_obj.browse(vals['party'])
-            res['invoice_address'] = party_obj.address_get(party.id,
-                    type='invoice')
-            if party.supplier_payment_term:
-                res['payment_term'] = party.supplier_payment_term.id
+            }
+        invoice_address = None
+        payment_term = None
+        if self.party:
+            invoice_address = self.party.address_get(type='invoice')
+            if self.party.supplier_payment_term:
+                payment_term = self.party.supplier_payment_term
 
             subquery = cursor.limit_clause('SELECT currency '
                 'FROM "' + self._table + '" '
@@ -270,223 +304,139 @@ class Purchase(Workflow, ModelSQL, ModelView):
                 'ORDER BY id DESC', 10)
             cursor.execute('SELECT currency FROM (' + subquery + ') AS p '
                 'GROUP BY currency '
-                'ORDER BY COUNT(1) DESC', (party.id,))
+                'ORDER BY COUNT(1) DESC', (self.party.id,))
             row = cursor.fetchone()
             if row:
                 currency_id, = row
-                currency = currency_obj.browse(currency_id)
-                res['currency'] = currency.id
-                res['currency_digits'] = currency.digits
-
-        if res['invoice_address']:
-            res['invoice_address.rec_name'] = address_obj.browse(
-                    res['invoice_address']).rec_name
-        if not res['payment_term']:
-            res['payment_term'] = self.default_payment_term()
-        if res['payment_term']:
-            res['payment_term.rec_name'] = payment_term_obj.browse(
-                    res['payment_term']).rec_name
-        return res
+                currency = Currency(currency_id)
+                changes['currency'] = currency.id
+                changes['currency_digits'] = currency.digits
 
-    def on_change_with_currency_digits(self, vals):
-        currency_obj = Pool().get('currency.currency')
-        if vals.get('currency'):
-            currency = currency_obj.browse(vals['currency'])
-            return currency.digits
-        return 2
-
-    def get_currency_digits(self, purchases):
-        '''
-        Return the number of digits of the currency for each purchases
+        if invoice_address:
+            changes['invoice_address'] = invoice_address.id
+            changes['invoice_address.rec_name'] = invoice_address.rec_name
+        else:
+            changes['invoice_address'] = None
+        if payment_term:
+            changes['payment_term'] = payment_term.id
+            changes['payment_term.rec_name'] = payment_term.rec_name
+        else:
+            changes['payment_term'] = self.default_payment_term()
+            if changes['payment_term']:
+                changes['payment_term.rec_name'] = PaymentTerm(
+                    changes['payment_term']).rec_name
+        return changes
 
-        :param purchases: a BrowseRecordList of purchases
-        :return: a dictionary with purchase id as key and
-            number of digits as value
-        '''
-        res = {}
-        for purchase in purchases:
-            res[purchase.id] = purchase.currency.digits
-        return res
+    def on_change_with_currency_digits(self, name=None):
+        if self.currency:
+            return self.currency.digits
+        return 2
 
-    def on_change_with_party_lang(self, vals):
-        party_obj = Pool().get('party.party')
-        if vals.get('party'):
-            party = party_obj.browse(vals['party'])
-            if party.lang:
-                return party.lang.code
+    def on_change_with_party_lang(self, name=None):
+        if self.party:
+            if self.party.lang:
+                return self.party.lang.code
         return CONFIG['language']
 
-    def get_tax_context(self, purchase):
-        party_obj = Pool().get('party.party')
-        res = {}
-        if isinstance(purchase, dict):
-            if purchase.get('party'):
-                party = party_obj.browse(purchase['party'])
-                if party.lang:
-                    res['language'] = party.lang.code
-        else:
-            if purchase.party.lang:
-                res['language'] = purchase.party.lang.code
-        return res
+    def get_tax_context(self):
+        context = {}
+        if self.party and self.party.lang:
+            context['language'] = self.party.lang.code
+        return context
 
-    def on_change_lines(self, vals):
+    def on_change_lines(self):
         pool = Pool()
-        currency_obj = pool.get('currency.currency')
-        tax_obj = pool.get('account.tax')
-        invoice_obj = pool.get('account.invoice')
+        Tax = pool.get('account.tax')
+        Invoice = pool.get('account.invoice')
 
-        res = {
+        changes = {
             'untaxed_amount': Decimal('0.0'),
             'tax_amount': Decimal('0.0'),
             'total_amount': Decimal('0.0'),
-        }
-        currency = None
-        if vals.get('currency'):
-            currency = currency_obj.browse(vals['currency'])
-        if vals.get('lines'):
-            context = self.get_tax_context(vals)
+            }
+        if self.lines:
+            context = self.get_tax_context()
             taxes = {}
-            for line in vals['lines']:
-                if line.get('type', 'line') != 'line':
+            for line in self.lines:
+                if getattr(line, 'type', 'line') != 'line':
                     continue
-                res['untaxed_amount'] += line.get('amount') or Decimal(0)
+                changes['untaxed_amount'] += line.amount or Decimal(0)
 
                 with Transaction().set_context(context):
-                    tax_list = tax_obj.compute(line.get('taxes', []),
-                            line.get('unit_price') or Decimal('0.0'),
-                            line.get('quantity') or 0.0)
+                    tax_list = Tax.compute(getattr(line, 'taxes', []),
+                        line.unit_price or Decimal('0.0'),
+                        line.quantity or 0.0)
                 for tax in tax_list:
-                    key, val = invoice_obj._compute_tax(tax, 'in_invoice')
+                    key, val = Invoice._compute_tax(tax, 'in_invoice')
                     if not key in taxes:
                         taxes[key] = val['amount']
                     else:
                         taxes[key] += val['amount']
-            if currency:
+            if self.currency:
                 for value in taxes.itervalues():
-                    res['tax_amount'] += currency_obj.round(currency, value)
-        if currency:
-            res['untaxed_amount'] = currency_obj.round(currency,
-                    res['untaxed_amount'])
-            res['tax_amount'] = currency_obj.round(currency, res['tax_amount'])
-        res['total_amount'] = res['untaxed_amount'] + res['tax_amount']
-        if currency:
-            res['total_amount'] = currency_obj.round(currency,
-                    res['total_amount'])
-        return res
-
-    def get_function_fields(self, ids, names):
-        '''
-        Function to compute function fields for purchase ids.
-
-        :param ids: the ids of the purchases
-        :param names: the list of field name to compute
-        :param args: optional argument
-        :return: a dictionary with all field names as key and
-            a dictionary as value with id as key
-        '''
-        res = {}
-        purchases = self.browse(ids)
-        if 'currency_digits' in names:
-            res['currency_digits'] = self.get_currency_digits(purchases)
-        if 'party_lang' in names:
-            res['party_lang'] = self.get_party_lang(purchases)
-        if 'shipments' in names:
-            res['shipments'] = self.get_shipments(purchases)
-        if 'moves' in names:
-            res['moves'] = self.get_moves(purchases)
-        return res
-
-    def get_party_lang(self, purchases):
-        '''
-        Return the language code of the party of each purchases
-
-        :param purchases: a BrowseRecordList of purchases
-        :return: a dictionary with purchase id as key and
-            a language code as value
-        '''
-        res = {}
-        for purchase in purchases:
-            if purchase.party.lang:
-                res[purchase.id] = purchase.party.lang.code
-            else:
-                res[purchase.id] = CONFIG['language']
-        return res
+                    changes['tax_amount'] += self.currency.round(value)
+        if self.currency:
+            changes['untaxed_amount'] = self.currency.round(
+                changes['untaxed_amount'])
+            changes['tax_amount'] = self.currency.round(changes['tax_amount'])
+        changes['total_amount'] = (changes['untaxed_amount']
+            + changes['tax_amount'])
+        if self.currency:
+            changes['total_amount'] = self.currency.round(
+                changes['total_amount'])
+        return changes
 
-    def get_untaxed_amount(self, ids, name):
+    def get_untaxed_amount(self, name):
         '''
         Return the untaxed amount for each purchases
         '''
-        currency_obj = Pool().get('currency.currency')
-        amounts = {}
-        for purchase in self.browse(ids):
-            if (purchase.state in self._states_cached
-                    and purchase.untaxed_amount_cache is not None):
-                amounts[purchase.id] = purchase.untaxed_amount_cache
-                continue
-            amount = sum((l.amount for l in purchase.lines
-                    if l.type == 'line'), Decimal(0))
-            amounts[purchase.id] = currency_obj.round(purchase.currency,
-                    amount)
-        return amounts
-
-    def get_tax_amount(self, ids, name):
-        '''
-        Return the tax amount for each purchases
-        '''
+        if (self.state in self._states_cached
+                and self.untaxed_amount_cache is not None):
+            return self.untaxed_amount_cache
+        amount = sum((l.amount for l in self.lines
+                if l.type == 'line'), Decimal(0))
+        return self.currency.round(amount)
+
+    def get_tax_amount(self, name):
         pool = Pool()
-        currency_obj = pool.get('currency.currency')
-        tax_obj = pool.get('account.tax')
-        invoice_obj = pool.get('account.invoice')
-
-        amounts = {}
-        for purchase in self.browse(ids):
-            if (purchase.state in self._states_cached
-                    and purchase.tax_amount_cache is not None):
-                amounts[purchase.id] = purchase.tax_amount_cache
+        Tax = pool.get('account.tax')
+        Invoice = pool.get('account.invoice')
+
+        if (self.state in self._states_cached
+                and self.tax_amount_cache is not None):
+            return self.tax_amount_cache
+        context = self.get_tax_context()
+        taxes = {}
+        for line in self.lines:
+            if line.type != 'line':
                 continue
-            context = self.get_tax_context(purchase)
-            taxes = {}
-            for line in purchase.lines:
-                if line.type != 'line':
-                    continue
-                with Transaction().set_context(context):
-                    tax_list = tax_obj.compute([t.id for t in line.taxes],
-                            line.unit_price, line.quantity)
-                # Don't round on each line to handle rounding error
-                for tax in tax_list:
-                    key, val = invoice_obj._compute_tax(tax, 'in_invoice')
-                    if not key in taxes:
-                        taxes[key] = val['amount']
-                    else:
-                        taxes[key] += val['amount']
-            amount = sum((currency_obj.round(purchase.currency, tax)
-                    for tax in taxes.itervalues()), Decimal(0))
-            amounts[purchase.id] = currency_obj.round(purchase.currency,
-                amount)
-        return amounts
-
-    def get_total_amount(self, ids, name):
-        '''
-        Return the total amount of each purchases
-        '''
-        currency_obj = Pool().get('currency.currency')
-        amounts = {}
-        for purchase in self.browse(ids):
-            if (purchase.state in self._states_cached
-                    and purchase.total_amount_cache is not None):
-                amounts[purchase.id] = purchase.total_amount_cache
-                continue
-            amounts[purchase.id] = currency_obj.round(purchase.currency,
-                    purchase.untaxed_amount + purchase.tax_amount)
-        return amounts
-
-    def get_invoice_state(self, purchase):
+            with Transaction().set_context(context):
+                tax_list = Tax.compute(line.taxes, line.unit_price,
+                    line.quantity)
+            # Don't round on each line to handle rounding error
+            for tax in tax_list:
+                key, val = Invoice._compute_tax(tax, 'in_invoice')
+                if not key in taxes:
+                    taxes[key] = val['amount']
+                else:
+                    taxes[key] += val['amount']
+        amount = sum((self.currency.round(tax) for tax in taxes.itervalues()),
+            Decimal(0))
+        return self.currency.round(amount)
+
+    def get_total_amount(self, name):
+        if (self.state in self._states_cached
+                and self.total_amount_cache is not None):
+            return self.total_amount_cache
+        return self.currency.round(self.untaxed_amount + self.tax_amount)
+
+    def get_invoice_state(self):
         '''
         Return the invoice state for the purchase.
         '''
-        skip_ids = set(x.id for x in purchase.invoices_ignored)
-        skip_ids.update(x.id for x in purchase.invoices_recreated)
-        invoices = [i for i in purchase.invoices if i.id not in skip_ids]
+        skip_ids = set(x.id for x in self.invoices_ignored)
+        skip_ids.update(x.id for x in self.invoices_recreated)
+        invoices = [i for i in self.invoices if i.id not in skip_ids]
         if invoices:
             if any(i.state == 'cancel' for i in invoices):
                 return 'exception'
@@ -496,93 +446,76 @@ class Purchase(Workflow, ModelSQL, ModelView):
                 return 'waiting'
         return 'none'
 
-    def set_invoice_state(self, purchase):
+    def set_invoice_state(self):
         '''
         Set the invoice state.
         '''
-        state = self.get_invoice_state(purchase)
-        if purchase.invoice_state != state:
-            self.write(purchase.id, {
+        state = self.get_invoice_state()
+        if self.invoice_state != state:
+            self.write([self], {
                     'invoice_state': state,
                     })
 
-    def get_shipments(self, purchases):
-        '''
-        Return the shipments for the purchases.
-
-        :param purchases: a BrowseRecordList of purchases
-        :return: a dictionary with purchase id as key and
-            a list of shipment_in id as value
-        '''
-        res = {}
-        for purchase in purchases:
-            res[purchase.id] = []
-            for line in purchase.lines:
+    def get_shipments_returns(attribute):
+        "Computes the returns or shipments"
+        def method(self, name):
+            shipments = []
+            for line in self.lines:
                 for move in line.moves:
-                    if move.shipment_in:
-                        if move.shipment_in.id not in res[purchase.id]:
-                            res[purchase.id].append(move.shipment_in.id)
-        return res
+                    ship_or_return = getattr(move, attribute)
+                    if bool(ship_or_return):
+                        if ship_or_return.id not in shipments:
+                            shipments.append(ship_or_return.id)
+            return shipments
+        return method
 
-    def get_moves(self, purchases):
-        '''
-        Return the moves for the purchases.
+    get_shipments = get_shipments_returns('shipment_in')
+    get_shipment_returns = get_shipments_returns('shipment_in_return')
 
-        :param purchases: a BrowseRecordList of purchases
-        :return: a dictionary with purchase id as key and
-            a list of moves id as value
-        '''
-        res = {}
-        for purchase in purchases:
-            res[purchase.id] = []
-            for line in purchase.lines:
-                res[purchase.id].extend([x.id for x in line.moves])
-        return res
+    def get_moves(self, name):
+        return [m.id for l in self.lines for m in l.moves]
 
-    def get_shipment_state(self, purchase):
+    def get_shipment_state(self):
         '''
         Return the shipment state for the purchase.
         '''
-        if purchase.moves:
-            if any(l.move_exception for l in purchase.lines):
+        if self.moves:
+            if any(l.move_exception for l in self.lines):
                 return 'exception'
-            elif all(l.move_done for l in purchase.lines):
+            elif all(l.move_done for l in self.lines):
                 return 'received'
             else:
                 return 'waiting'
         return 'none'
 
-    def set_shipment_state(self, purchase):
+    def set_shipment_state(self):
         '''
         Set the shipment state.
         '''
-        state = self.get_shipment_state(purchase)
-        if purchase.shipment_state != state:
-            self.write(purchase.id, {
+        state = self.get_shipment_state()
+        if self.shipment_state != state:
+            self.write([self], {
                     'shipment_state': state,
                     })
 
-    def get_rec_name(self, ids, name):
-        if not ids:
-            return {}
-        res = {}
-        for purchase in self.browse(ids):
-            res[purchase.id] = purchase.reference or str(purchase.id) \
-                    + ' - ' + purchase.party.name
-        return res
+    def get_rec_name(self, name):
+        return (self.reference or str(self.id)
+            + ' - ' + self.party.name)
 
-    def search_rec_name(self, name, clause):
+    @classmethod
+    def search_rec_name(cls, name, clause):
         names = clause[2].split(' - ', 1)
-        ids = self.search(['OR',
-            ('reference', clause[1], names[0]),
-            ('supplier_reference', clause[1], names[0]),
-            ], order=[])
-        res = [('id', 'in', ids)]
+        purchases = cls.search(['OR',
+                ('reference', clause[1], names[0]),
+                ('supplier_reference', clause[1], names[0]),
+                ], order=[])
+        res = [('id', 'in', [p.id for p in purchases])]
         if len(names) != 1 and names[1]:
             res.append(('party', clause[1], names[1]))
         return res
 
-    def copy(self, ids, default=None):
+    @classmethod
+    def copy(cls, purchases, default=None):
         if default is None:
             default = {}
         default = default.copy()
@@ -593,255 +526,281 @@ class Purchase(Workflow, ModelSQL, ModelView):
         default['invoices_ignored'] = None
         default['shipment_state'] = 'none'
         default.setdefault('purchase_date', None)
-        return super(Purchase, self).copy(ids, default=default)
-
-    def check_for_quotation(self, ids):
-        purchases = self.browse(ids)
-        for purchase in purchases:
-            if not purchase.invoice_address:
-                self.raise_user_error('invoice_addresse_required')
-            for line in purchase.lines:
-                if (not line.to_location
-                        and line.product
-                        and line.product.type in ('goods', 'assets')):
-                    self.raise_user_error('warehouse_required')
-
-    def set_reference(self, ids):
+        return super(Purchase, cls).copy(purchases, default=default)
+
+    def check_for_quotation(self):
+        if not self.invoice_address:
+            self.raise_user_error('invoice_addresse_required')
+        for line in self.lines:
+            if (not line.to_location
+                    and line.product
+                    and line.product.type in ('goods', 'assets')):
+                self.raise_user_error('warehouse_required')
+
+    @classmethod
+    def set_reference(cls, purchases):
         '''
         Fill the reference field with the purchase sequence
         '''
-        sequence_obj = Pool().get('ir.sequence')
-        config_obj = Pool().get('purchase.configuration')
+        pool = Pool()
+        Sequence = pool.get('ir.sequence')
+        Config = pool.get('purchase.configuration')
 
-        config = config_obj.browse(1)
-        purchases = self.browse(ids)
+        config = Config(1)
         for purchase in purchases:
             if purchase.reference:
                 continue
-            reference = sequence_obj.get_id(config.purchase_sequence.id)
-            self.write(purchase.id, {
-                'reference': reference,
-                })
+            reference = Sequence.get_id(config.purchase_sequence.id)
+            cls.write([purchase], {
+                    'reference': reference,
+                    })
 
-    def set_purchase_date(self, ids):
-        date_obj = Pool().get('ir.date')
-        for purchase in self.browse(ids):
+    @classmethod
+    def set_purchase_date(cls, purchases):
+        Date = Pool().get('ir.date')
+        for purchase in purchases:
             if not purchase.purchase_date:
-                self.write(purchase.id, {
-                    'purchase_date': date_obj.today(),
-                    })
+                cls.write([purchase], {
+                        'purchase_date': Date.today(),
+                        })
 
-    def store_cache(self, ids):
-        for purchase in self.browse(ids):
-            self.write(purchase.id, {
+    @classmethod
+    def store_cache(cls, purchases):
+        for purchase in purchases:
+            cls.write([purchase], {
                     'untaxed_amount_cache': purchase.untaxed_amount,
                     'tax_amount_cache': purchase.tax_amount,
                     'total_amount_cache': purchase.total_amount,
                     })
 
-    def _get_invoice_line_purchase_line(self, purchase):
+    def _get_invoice_line_purchase_line(self, invoice_type):
         '''
-        Return invoice line values for each purchase lines
-
-        :param purchase: a BrowseRecord of the purchase
-        :return: a dictionary with invoiced purchase line id as key
-            and a list of invoice line values as value
+        Return invoice line for each purchase lines
         '''
-        line_obj = Pool().get('purchase.line')
         res = {}
-        for line in purchase.lines:
-            val = line_obj.get_invoice_line(line)
+        for line in self.lines:
+            val = line.get_invoice_line(invoice_type)
             if val:
                 res[line.id] = val
         return res
 
-    def _get_invoice_purchase(self, purchase):
+    def _get_invoice_purchase(self, invoice_type):
         '''
-        Return invoice values for purchase
-
-        :param purchase: the BrowseRecord of the purchase
-
-        :return: a dictionary with purchase fields as key and
-            purchase values as value
+        Return invoice of type invoice_type
         '''
-        journal_obj = Pool().get('account.journal')
-
-        journal_id = journal_obj.search([
-            ('type', '=', 'expense'),
-            ], limit=1)
-        if journal_id:
-            journal_id = journal_id[0]
-
-        res = {
-            'company': purchase.company.id,
-            'type': 'in_invoice',
-            'reference': purchase.reference,
-            'journal': journal_id,
-            'party': purchase.party.id,
-            'invoice_address': purchase.invoice_address.id,
-            'currency': purchase.currency.id,
-            'account': purchase.party.account_payable.id,
-            'payment_term': purchase.payment_term.id,
-        }
-        return res
+        pool = Pool()
+        Journal = pool.get('account.journal')
+        Invoice = pool.get('account.invoice')
+
+        journals = Journal.search([
+                ('type', '=', 'expense'),
+                ], limit=1)
+        if journals:
+            journal, = journals
+        else:
+            journal = None
 
-    def create_invoice(self, purchase):
+        with Transaction().set_user(0, set_context=True):
+            return Invoice(
+                company=self.company,
+                type=invoice_type,
+                reference=self.reference,
+                journal=journal,
+                party=self.party,
+                invoice_address=self.invoice_address,
+                currency=self.currency,
+                account=self.party.account_payable,
+                payment_term=self.payment_term,
+                )
+
+    def create_invoice(self, invoice_type):
         '''
-        Create an invoice for the purchase and return the id
+        Create an invoice for the purchase and return it
         '''
         pool = Pool()
-        invoice_obj = pool.get('account.invoice')
-        invoice_line_obj = pool.get('account.invoice.line')
-        purchase_line_obj = pool.get('purchase.line')
+        Invoice = pool.get('account.invoice')
+        PurchaseLine = pool.get('purchase.line')
 
-        if purchase.invoice_method == 'manual':
+        if self.invoice_method == 'manual':
             return
 
-        if not purchase.party.account_payable:
+        if not self.party.account_payable:
             self.raise_user_error('missing_account_payable',
-                    error_args=(purchase.party.rec_name,))
+                    error_args=(self.party.rec_name,))
 
-        invoice_lines = self._get_invoice_line_purchase_line(purchase)
+        invoice_lines = self._get_invoice_line_purchase_line(invoice_type)
         if not invoice_lines:
             return
 
-        vals = self._get_invoice_purchase(purchase)
-        with Transaction().set_user(0, set_context=True):
-            invoice_id = invoice_obj.create(vals)
+        invoice = self._get_invoice_purchase(invoice_type)
+        invoice.save()
 
-        for line in purchase.lines:
+        for line in self.lines:
             if line.id not in invoice_lines:
                 continue
-            for vals in invoice_lines[line.id]:
-                vals['invoice'] = invoice_id
-                with Transaction().set_user(0, set_context=True):
-                    invoice_line_id = invoice_line_obj.create(vals)
-                purchase_line_obj.write(line.id, {
-                    'invoice_lines': [('add', invoice_line_id)],
-                    })
+            for invoice_line in invoice_lines[line.id]:
+                invoice_line.invoice = invoice.id
+                invoice_line.save()
+                PurchaseLine.write([line], {
+                        'invoice_lines': [('add', [invoice_line.id])],
+                        })
 
         with Transaction().set_user(0, set_context=True):
-            invoice_obj.update_taxes([invoice_id])
+            Invoice.update_taxes([invoice])
 
-        self.write(purchase.id, {
-            'invoices': [('add', invoice_id)],
-        })
-        return invoice_id
+        self.write([self], {
+                'invoices': [('add', [invoice.id])],
+                })
+        return invoice
 
-    def create_move(self, purchase):
+    def create_move(self, move_type):
         '''
         Create move for each purchase lines
         '''
-        line_obj = Pool().get('purchase.line')
+        new_moves = []
+        for line in self.lines:
+            if (line.quantity >= 0) != (move_type == 'in'):
+                continue
+            move = line.create_move()
+            if move:
+                new_moves.append(move)
+        return new_moves
 
-        for line in purchase.lines:
-            line_obj.create_move(line)
+    def _get_return_shipment(self):
+        ShipmentInReturn = Pool().get('stock.shipment.in.return')
+        with Transaction().set_user(0, set_context=True):
+            return ShipmentInReturn(
+                company=self.company,
+                reference=self.reference,
+                from_location=self.warehouse.storage_location,
+                to_location=self.party.supplier_location,
+                )
+
+    def create_return_shipment(self, return_moves):
+        '''
+        Create return shipment and return the shipment id
+        '''
+        ShipmentInReturn = Pool().get('stock.shipment.in.return')
+        return_shipment = self._get_return_shipment()
+        return_shipment.moves = return_moves
+        return_shipment.save()
+        with Transaction().set_user(0, set_context=True):
+            ShipmentInReturn.wait([return_shipment])
+        return return_shipment
 
-    def is_done(self, purchase):
-        return ((purchase.invoice_state == 'paid'
-                or purchase.invoice_method == 'manual')
-            and purchase.shipment_state == 'received')
+    def is_done(self):
+        return ((self.invoice_state == 'paid'
+                or self.invoice_method == 'manual')
+            and self.shipment_state == 'received')
 
-    def delete(self, ids):
-        if isinstance(ids, (int, long)):
-            ids = [ids]
+    @classmethod
+    def delete(cls, purchases):
         # Cancel before delete
-        self.cancel(ids)
-        for purchase in self.browse(ids):
+        cls.cancel(purchases)
+        for purchase in purchases:
             if purchase.state != 'cancel':
-                self.raise_user_error('delete_cancel', purchase.rec_name)
-        return super(Purchase, self).delete(ids)
+                cls.raise_user_error('delete_cancel', purchase.rec_name)
+        super(Purchase, cls).delete(purchases)
 
+    @classmethod
     @ModelView.button
     @Workflow.transition('cancel')
-    def cancel(self, ids):
-        self.store_cache(ids)
+    def cancel(cls, purchases):
+        cls.store_cache(purchases)
 
+    @classmethod
     @ModelView.button
     @Workflow.transition('draft')
-    def draft(self, ids):
+    def draft(cls, purchases):
         pass
 
+    @classmethod
     @ModelView.button
     @Workflow.transition('quotation')
-    def quote(self, ids):
-        self.check_for_quotation(ids)
-        self.set_reference(ids)
+    def quote(cls, purchases):
+        for purchase in purchases:
+            purchase.check_for_quotation()
+        cls.set_reference(purchases)
 
+    @classmethod
     @ModelView.button
     @Workflow.transition('confirmed')
-    def confirm(self, ids):
-        self.set_purchase_date(ids)
-        self.store_cache(ids)
-        self.process(ids)
+    def confirm(cls, purchases):
+        cls.set_purchase_date(purchases)
+        cls.store_cache(purchases)
+        cls.process(purchases)
+
+    @classmethod
+    @ModelView.button_action('purchase.wizard_invoice_handle_exception')
+    def handle_invoice_exception(cls, purchases):
+        pass
 
-    def process(self, ids):
+    @classmethod
+    @ModelView.button_action('purchase.wizard_shipment_handle_exception')
+    def handle_shipment_exception(cls, purchases):
+        pass
+
+    @classmethod
+    def process(cls, purchases):
         done = []
-        for purchase in self.browse(ids):
+        for purchase in purchases:
             if purchase.state in ('done', 'cancel'):
                 continue
-            self.create_invoice(purchase)
-            self.set_invoice_state(purchase)
-            self.create_move(purchase)
-            self.set_shipment_state(purchase)
-            if self.is_done(purchase):
-                done.append(purchase.id)
+            purchase.create_invoice('in_invoice')
+            purchase.create_invoice('in_credit_note')
+            purchase.set_invoice_state()
+            purchase.create_move('in')
+            return_moves = purchase.create_move('return')
+            if return_moves:
+                purchase.create_return_shipment(return_moves)
+            purchase.set_shipment_state()
+            if purchase.is_done():
+                done.append(purchase)
         if done:
-            self.write(done, {
+            cls.write(done, {
                     'state': 'done',
                     })
 
-Purchase()
-
 
 class PurchaseInvoice(ModelSQL):
     'Purchase - Invoice'
-    _name = 'purchase.purchase-account.invoice'
+    __name__ = 'purchase.purchase-account.invoice'
     _table = 'purchase_invoices_rel'
-    _description = __doc__
     purchase = fields.Many2One('purchase.purchase', 'Purchase',
             ondelete='CASCADE', select=True, required=True)
     invoice = fields.Many2One('account.invoice', 'Invoice',
             ondelete='RESTRICT', select=True, required=True)
 
-PurchaseInvoice()
 
-
-class PuchaseIgnoredInvoice(ModelSQL):
+class PurchaseIgnoredInvoice(ModelSQL):
     'Purchase - Ignored Invoice'
-    _name = 'purchase.purchase-ignored-account.invoice'
+    __name__ = 'purchase.purchase-ignored-account.invoice'
     _table = 'purchase_invoice_ignored_rel'
-    _description = __doc__
     purchase = fields.Many2One('purchase.purchase', 'Purchase',
             ondelete='CASCADE', select=True, required=True)
     invoice = fields.Many2One('account.invoice', 'Invoice',
             ondelete='RESTRICT', select=True, required=True)
 
-PuchaseIgnoredInvoice()
-
 
 class PurchaseRecreadtedInvoice(ModelSQL):
     'Purchase - Recreated Invoice'
-    _name = 'purchase.purchase-recreated-account.invoice'
+    __name__ = 'purchase.purchase-recreated-account.invoice'
     _table = 'purchase_invoice_recreated_rel'
-    _description = __doc__
     purchase = fields.Many2One('purchase.purchase', 'Purchase',
             ondelete='CASCADE', select=True, required=True)
     invoice = fields.Many2One('account.invoice', 'Invoice',
             ondelete='RESTRICT', select=True, required=True)
 
-PurchaseRecreadtedInvoice()
-
 
 class PurchaseLine(ModelSQL, ModelView):
     'Purchase Line'
-    _name = 'purchase.line'
+    __name__ = 'purchase.line'
     _rec_name = 'description'
-    _description = __doc__
-
     purchase = fields.Many2One('purchase.purchase', 'Purchase',
             ondelete='CASCADE', select=True, required=True)
-    sequence = fields.Integer('Sequence', required=True)
+    sequence = fields.Integer('Sequence',
+        order_field='(%(table)s.sequence IS NULL) %(order)s, '
+        '%(table)s.sequence %(order)s')
     type = fields.Selection([
         ('line', 'Line'),
         ('subtotal', 'Subtotal'),
@@ -855,7 +814,8 @@ class PurchaseLine(ModelSQL, ModelView):
             'required': Eval('type') == 'line',
             'readonly': ~Eval('_parent_purchase'),
             }, on_change=['product', 'quantity', 'unit',
-            '_parent_purchase.currency', '_parent_purchase.party'],
+            '_parent_purchase.currency', '_parent_purchase.party',
+            '_parent_purchase.purchase_date'],
         depends=['unit_digits', 'type'])
     unit = fields.Many2One('product.uom', 'Unit',
         states={
@@ -872,14 +832,15 @@ class PurchaseLine(ModelSQL, ModelView):
             '_parent_purchase.party'],
         depends=['product', 'type', 'product_uom_category'])
     unit_digits = fields.Function(fields.Integer('Unit Digits',
-        on_change_with=['unit']), 'get_unit_digits')
+            on_change_with=['unit']), 'on_change_with_unit_digits')
     product = fields.Many2One('product.product', 'Product',
         domain=[('purchasable', '=', True)],
         states={
             'invisible': Eval('type') != 'line',
             'readonly': ~Eval('_parent_purchase'),
             }, on_change=['product', 'unit', 'quantity', 'description',
-            '_parent_purchase.party', '_parent_purchase.currency'],
+            '_parent_purchase.party', '_parent_purchase.currency',
+            '_parent_purchase.purchase_date'],
         context={
             'locations': If(Bool(Eval('_parent_purchase', {}).get(
                         'warehouse')),
@@ -893,7 +854,7 @@ class PurchaseLine(ModelSQL, ModelView):
     product_uom_category = fields.Function(
         fields.Many2One('product.uom.category', 'Product Uom Category',
             on_change_with=['product']),
-        'get_product_uom_category')
+        'on_change_with_product_uom_category')
     unit_price = fields.Numeric('Unit Price', digits=(16, 4),
         states={
             'invisible': Eval('type') != 'line',
@@ -933,12 +894,13 @@ class PurchaseLine(ModelSQL, ModelView):
     delivery_date = fields.Function(fields.Date('Delivery Date',
             on_change_with=['product', '_parent_purchase.purchase_date',
                 '_parent_purchase.party']),
-        'get_delivery_date')
+        'on_change_with_delivery_date')
 
-    def __init__(self):
-        super(PurchaseLine, self).__init__()
-        self._order.insert(0, ('sequence', 'ASC'))
-        self._error_messages.update({
+    @classmethod
+    def __setup__(cls):
+        super(PurchaseLine, cls).__setup__()
+        cls._order.insert(0, ('sequence', 'ASC'))
+        cls._error_messages.update({
             'supplier_location_required': 'The supplier location is required!',
             'missing_account_expense': 'It misses ' \
                     'an "Account Expense" on product "%s"!',
@@ -946,343 +908,273 @@ class PurchaseLine(ModelSQL, ModelView):
                     'an "account expense" default property!',
             })
 
-    def init(self, module_name):
-        super(PurchaseLine, self).init(module_name)
+    @classmethod
+    def __register__(cls, module_name):
+        super(PurchaseLine, cls).__register__(module_name)
         cursor = Transaction().cursor
-        table = TableHandler(cursor, self, module_name)
+        table = TableHandler(cursor, cls, module_name)
 
         # Migration from 1.0 comment change into note
         if table.column_exist('comment'):
-            cursor.execute('UPDATE "' + self._table + '" ' \
+            cursor.execute('UPDATE "' + cls._table + '" ' \
                     'SET note = comment')
             table.drop_column('comment', exception=True)
 
-    def default_type(self):
-        return 'line'
+        # Migration from 2.4: drop required on sequence
+        table.not_null_action('sequence', action='remove')
 
-    def get_move_done(self, ids, name):
-        uom_obj = Pool().get('product.uom')
-        res = {}
-        for line in self.browse(ids):
-            val = True
-            if not line.product:
-                res[line.id] = True
-                continue
-            if line.product.type == 'service':
-                res[line.id] = True
-                continue
-            skip_ids = set(x.id for x in line.moves_recreated + \
-                                line.moves_ignored)
-            quantity = line.quantity
-            for move in line.moves:
-                if move.state != 'done' \
-                        and move.id not in skip_ids:
-                    val = False
-                    break
-                quantity -= uom_obj.compute_qty(move.uom, move.quantity,
-                        line.unit)
-            if val:
-                if quantity > 0.0:
-                    val = False
-            res[line.id] = val
-        return res
+    @staticmethod
+    def default_type():
+        return 'line'
 
-    def get_move_exception(self, ids, name):
-        res = {}
-        for line in self.browse(ids):
-            val = False
-            skip_ids = set(x.id for x in line.moves_ignored + \
-                               line.moves_recreated)
-            for move in line.moves:
-                if move.state == 'cancel' \
-                        and move.id not in skip_ids:
-                    val = True
-                    break
-            res[line.id] = val
-        return res
+    def get_move_done(self, name):
+        Uom = Pool().get('product.uom')
+        done = True
+        if not self.product:
+            return True
+        if self.product.type == 'service':
+            return True
+        skip_ids = set(x.id for x in self.moves_recreated
+            + self.moves_ignored)
+        quantity = self.quantity
+        for move in self.moves:
+            if move.state != 'done' \
+                    and move.id not in skip_ids:
+                done = False
+                break
+            quantity -= Uom.compute_qty(move.uom, move.quantity, self.unit)
+        if done:
+            if quantity > 0.0:
+                done = False
+        return done
+
+    def get_move_exception(self, name):
+        skip_ids = set(x.id for x in self.moves_ignored
+            + self.moves_recreated)
+        for move in self.moves:
+            if move.state == 'cancel' \
+                    and move.id not in skip_ids:
+                return True
+        return False
 
-    def on_change_with_unit_digits(self, vals):
-        uom_obj = Pool().get('product.uom')
-        if vals.get('unit'):
-            uom = uom_obj.browse(vals['unit'])
-            return uom.digits
+    def on_change_with_unit_digits(self, name=None):
+        if self.unit:
+            return self.unit.digits
         return 2
 
-    def get_unit_digits(self, ids, name):
-        res = {}
-        for line in self.browse(ids):
-            if line.unit:
-                res[line.id] = line.unit.digits
-            else:
-                res[line.id] = 2
-        return res
-
-    def _get_tax_rule_pattern(self, party, vals):
+    def _get_tax_rule_pattern(self):
         '''
         Get tax rule pattern
-
-        :param party: the BrowseRecord of the party
-        :param vals: a dictionary with value from on_change
-        :return: a dictionary to use as pattern for tax rule
         '''
-        res = {}
-        return res
+        return {}
 
-    def on_change_product(self, vals):
-        pool = Pool()
-        party_obj = pool.get('party.party')
-        product_obj = pool.get('product.product')
-        tax_rule_obj = pool.get('account.tax.rule')
+    def _get_context_purchase_price(self):
+        context = {}
+        if getattr(self, 'purchase', None):
+            if getattr(self.purchase, 'currency', None):
+                context['currency'] = self.purchase.currency.id
+            if getattr(self.purchase, 'party', None):
+                context['supplier'] = self.purchase.party.id
+            if getattr(self.purchase, 'purchase_date', None):
+                context['purchase_date'] = self.purchase.purchase_date
+        if self.unit:
+            context['uom'] = self.unit.id
+        else:
+            self.product.purchase_uom.id
+        return context
+
+    def on_change_product(self):
+        Product = Pool().get('product.product')
 
-        if not vals.get('product'):
+        if not self.product:
             return {}
         res = {}
 
         context = {}
         party = None
-        if vals.get('_parent_purchase.party'):
-            party = party_obj.browse(vals['_parent_purchase.party'])
+        if self.purchase and self.purchase.party:
+            party = self.purchase.party
             if party.lang:
                 context['language'] = party.lang.code
 
-        product = product_obj.browse(vals['product'])
+        category = self.product.purchase_uom.category
+        if not self.unit or self.unit not in category.uoms:
+            res['unit'] = self.product.purchase_uom.id
+            self.unit = self.product.purchase_uom
+            res['unit.rec_name'] = self.product.purchase_uom.rec_name
+            res['unit_digits'] = self.product.purchase_uom.digits
 
-        context2 = {}
-        if vals.get('_parent_purchase.currency'):
-            context2['currency'] = vals['_parent_purchase.currency']
-        if vals.get('_parent_purchase.party'):
-            context2['supplier'] = vals['_parent_purchase.party']
-        if vals.get('unit'):
-            context2['uom'] = vals['unit']
-        else:
-            context2['uom'] = product.purchase_uom.id
-        if vals.get('_parent_purchase.purchase_date'):
-            context2['purchase_date'] = vals['_parent_purchase.purchase_date']
-        with Transaction().set_context(context2):
-            res['unit_price'] = product_obj.get_purchase_price([product.id],
-                    vals.get('quantity') or 0)[product.id]
+        with Transaction().set_context(self._get_context_purchase_price()):
+            res['unit_price'] = Product.get_purchase_price([self.product],
+                self.quantity or 0)[self.product.id]
             if res['unit_price']:
                 res['unit_price'] = res['unit_price'].quantize(
-                    Decimal(1) / 10 ** self.unit_price.digits[1])
+                    Decimal(1) / 10 ** self.__class__.unit_price.digits[1])
         res['taxes'] = []
-        pattern = self._get_tax_rule_pattern(party, vals)
-        for tax in product.supplier_taxes_used:
+        pattern = self._get_tax_rule_pattern()
+        for tax in self.product.supplier_taxes_used:
             if party and party.supplier_tax_rule:
-                tax_ids = tax_rule_obj.apply(party.supplier_tax_rule, tax,
-                        pattern)
+                tax_ids = party.supplier_tax_rule.apply(tax, pattern)
                 if tax_ids:
                     res['taxes'].extend(tax_ids)
                 continue
             res['taxes'].append(tax.id)
         if party and party.supplier_tax_rule:
-            tax_ids = tax_rule_obj.apply(party.supplier_tax_rule, None,
-                    pattern)
+            tax_ids = party.supplier_tax_rule.apply(None, pattern)
             if tax_ids:
                 res['taxes'].extend(tax_ids)
 
-        if not vals.get('description'):
+        if not self.description:
             with Transaction().set_context(context):
-                res['description'] = product_obj.browse(product.id).rec_name
-
-        category = product.purchase_uom.category
-        if not vals.get('unit') \
-                or vals.get('unit') not in [x.id for x in category.uoms]:
-            res['unit'] = product.purchase_uom.id
-            res['unit.rec_name'] = product.purchase_uom.rec_name
-            res['unit_digits'] = product.purchase_uom.digits
-
-        vals = vals.copy()
-        vals['unit_price'] = res['unit_price']
-        vals['type'] = 'line'
-        res['amount'] = self.on_change_with_amount(vals)
+                res['description'] = Product(self.product.id).rec_name
+
+        self.unit_price = res['unit_price']
+        self.type = 'line'
+        res['amount'] = self.on_change_with_amount()
         return res
 
-    def on_change_with_product_uom_category(self, values):
-        pool = Pool()
-        product_obj = pool.get('product.product')
-        if values.get('product'):
-            product = product_obj.browse(values['product'])
-            return product.default_uom_category.id
-
-    def get_product_uom_category(self, ids, name):
-        categories = {}
-        for line in self.browse(ids):
-            if line.product:
-                categories[line.id] = line.product.default_uom_category.id
-            else:
-                categories[line.id] = None
-        return categories
+    def on_change_with_product_uom_category(self, name=None):
+        if self.product:
+            return self.product.default_uom_category.id
 
-    def on_change_quantity(self, vals):
-        product_obj = Pool().get('product.product')
+    def on_change_quantity(self):
+        Product = Pool().get('product.product')
 
-        if not vals.get('product'):
+        if not self.product:
             return {}
         res = {}
 
-        context = {}
-        if vals.get('_parent_purchase.currency'):
-            context['currency'] = vals['_parent_purchase.currency']
-        if vals.get('_parent_purchase.party'):
-            context['supplier'] = vals['_parent_purchase.party']
-        if vals.get('_parent_purchase.purchase_date'):
-            context['purchase_date'] = vals['_parent_purchase.purchase_date']
-        if vals.get('unit'):
-            context['uom'] = vals['unit']
-        with Transaction().set_context(context):
-            res['unit_price'] = product_obj.get_purchase_price(
-                    [vals['product']], vals.get('quantity') or 0
-                    )[vals['product']]
+        with Transaction().set_context(self._get_context_purchase_price()):
+            res['unit_price'] = Product.get_purchase_price([self.product],
+                self.quantity or 0)[self.product.id]
             if res['unit_price']:
                 res['unit_price'] = res['unit_price'].quantize(
-                    Decimal(1) / 10 ** self.unit_price.digits[1])
+                    Decimal(1) / 10 ** self.__class__.unit_price.digits[1])
         return res
 
-    def on_change_unit(self, vals):
-        return self.on_change_quantity(vals)
-
-    def on_change_with_amount(self, vals):
-        currency_obj = Pool().get('currency.currency')
-        if vals.get('type') == 'line':
-            currency = vals.get('_parent_purchase.currency')
-            if currency and isinstance(currency, (int, long)):
-                currency = currency_obj.browse(
-                        vals['_parent_purchase.currency'])
-            amount = Decimal(str(vals.get('quantity') or '0.0')) * \
-                    (vals.get('unit_price') or Decimal('0.0'))
+    def on_change_unit(self):
+        return self.on_change_quantity()
+
+    def on_change_with_amount(self):
+        if self.type == 'line':
+            currency = self.purchase.currency if self.purchase else None
+            amount = Decimal(str(self.quantity or '0.0')) * \
+                (self.unit_price or Decimal('0.0'))
             if currency:
-                return currency_obj.round(currency, amount)
+                return currency.round(amount)
             return amount
         return Decimal('0.0')
 
-    def get_amount(self, ids, name):
-        currency_obj = Pool().get('currency.currency')
-        res = {}
-        for line in self.browse(ids):
-            if line.type == 'line':
-                res[line.id] = currency_obj.round(line.purchase.currency,
-                        Decimal(str(line.quantity)) * line.unit_price)
-            elif line.type == 'subtotal':
-                res[line.id] = Decimal('0.0')
-                for line2 in line.purchase.lines:
-                    if line2.type == 'line':
-                        res[line.id] += currency_obj.round(
-                            line2.purchase.currency,
-                            Decimal(str(line2.quantity)) * line2.unit_price)
-                    elif line2.type == 'subtotal':
-                        if line.id == line2.id:
-                            break
-                        res[line.id] = Decimal('0.0')
-            else:
-                res[line.id] = Decimal('0.0')
-        return res
+    def get_amount(self, name):
+        if self.type == 'line':
+            return self.purchase.currency.round(
+                Decimal(str(self.quantity)) * self.unit_price)
+        elif self.type == 'subtotal':
+            amount = Decimal('0.0')
+            for line2 in self.purchase.lines:
+                if line2.type == 'line':
+                    amount += line2.purchase.currency.round(
+                        Decimal(str(line2.quantity)) * line2.unit_price)
+                elif line2.type == 'subtotal':
+                    if self == line2:
+                        break
+                    amount = Decimal('0.0')
+            return amount
+        return Decimal('0.0')
 
-    def get_from_location(self, ids, name):
-        result = {}
-        for line in self.browse(ids):
-            result[line.id] = line.purchase.party.supplier_location.id
-        return result
-
-    def get_to_location(self, ids, name):
-        result = {}
-        for line in self.browse(ids):
-            if line.purchase.warehouse:
-                result[line.id] = line.purchase.warehouse.input_location.id
-            else:
-                result[line.id] = None
-        return result
-
-    def _compute_delivery_date(self, product, party, date):
-        product_supplier_obj = Pool().get('purchase.product_supplier')
-        if product and product.product_suppliers:
-            for product_supplier in product.product_suppliers:
-                if product_supplier.party.id == party.id:
-                    return product_supplier_obj.compute_supply_date(
-                        product_supplier, date=date)
-
-    def on_change_with_delivery_date(self, values):
-        pool = Pool()
-        product_obj = pool.get('product.product')
-        party_obj = pool.get('party.party')
-        if values.get('product') and values.get('_parent_purchase.party'):
-            product = product_obj.browse(values['product'])
-            party = party_obj.browse(values['_parent_purchase.party'])
-            return self._compute_delivery_date(product, party,
-                values.get('_parent_purchase.purchase_date'))
-
-    def get_delivery_date(self, ids, name):
-        dates = {}
-        for line in self.browse(ids):
-            dates[line.id] = self._compute_delivery_date(line.product,
-                line.purchase.party, line.purchase.purchase_date)
-        return dates
-
-    def get_invoice_line(self, line):
-        '''
-        Return invoice line values for purchase line
+    def get_from_location(self, name):
+        if self.quantity >= 0:
+            return self.purchase.party.supplier_location.id
+        elif self.purchase.warehouse:
+            return self.purchase.warehouse.storage_location.id
 
-        :param line: a BrowseRecord of the purchase line
-        :return: a list of invoice line values
+    def get_to_location(self, name):
+        if self.quantity >= 0:
+            if self.purchase.warehouse:
+                return self.purchase.warehouse.input_location.id
+        else:
+            return self.purchase.party.supplier_location.id
+
+    def on_change_with_delivery_date(self, name=None):
+        if (self.product
+                and self.purchase and self.purchase.party
+                and self.product.product_suppliers):
+            date = self.purchase.purchase_date if self.purchase else None
+            for product_supplier in self.product.product_suppliers:
+                if product_supplier.party == self.purchase.party:
+                    return product_supplier.compute_supply_date(date=date)
+
+    def get_invoice_line(self, invoice_type):
         '''
-        uom_obj = Pool().get('product.uom')
-        property_obj = Pool().get('ir.property')
+        Return a list of invoice line for purchase line
+        '''
+        pool = Pool()
+        Uom = pool.get('product.uom')
+        Property = pool.get('ir.property')
+        InvoiceLine = pool.get('account.invoice.line')
 
-        res = {}
-        res['sequence'] = line.sequence
-        res['type'] = line.type
-        res['description'] = line.description
-        res['note'] = line.note
-        if line.type != 'line':
-            if (line.purchase.invoice_method == 'order'
-                    and (all(l.quantity >= 0 for l in line.sale.lines
-                            if l.type == 'line')
-                        or all(l.quantity <= 0 for l in line.sale.lines
-                            if l.type == 'line'))):
-                return [res]
+        with Transaction().set_user(0, set_context=True):
+            invoice_line = InvoiceLine()
+        invoice_line.type = self.type
+        invoice_line.description = self.description
+        invoice_line.note = self.note
+        if self.type != 'line':
+            if (self.purchase.invoice_method == 'order'
+                    and ((all(l.quantity >= 0 for l in self.purchase.lines
+                                if l.type == 'line')
+                            and invoice_type == 'in_invoice')
+                        or (all(l.quantity <= 0 for l in self.purchase.lines
+                                if l.type == 'line')
+                            and invoice_type == 'in_credit_note'))):
+                return [invoice_line]
             else:
                 return []
-        if (line.purchase.invoice_method == 'order'
-                or not line.product
-                or line.product.type == 'service'):
-            quantity = line.quantity
+        if (invoice_type == 'in_invoice') != (self.quantity >= 0):
+            return []
+
+        if (self.purchase.invoice_method == 'order'
+                or not self.product
+                or self.product.type == 'service'):
+            quantity = abs(self.quantity)
         else:
             quantity = 0.0
-            for move in line.moves:
+            for move in self.moves:
                 if move.state == 'done':
-                    quantity += uom_obj.compute_qty(move.uom, move.quantity,
-                            line.unit)
+                    quantity += Uom.compute_qty(move.uom, move.quantity,
+                        self.unit)
 
-        skip_ids = set(l.id for i in line.purchase.invoices_recreated
+        skip_ids = set(l.id for i in self.purchase.invoices_recreated
             for l in i.lines)
-        for invoice_line in line.invoice_lines:
-            if invoice_line.type != 'line':
+        for old_invoice_line in self.invoice_lines:
+            if old_invoice_line.type != 'line':
                 continue
-            if invoice_line.id not in skip_ids:
-                quantity -= uom_obj.compute_qty(invoice_line.unit,
-                        invoice_line.quantity, line.unit)
-        res['quantity'] = quantity
+            if old_invoice_line.id not in skip_ids:
+                quantity -= Uom.compute_qty(old_invoice_line.unit,
+                        old_invoice_line.quantity, self.unit)
+        invoice_line.quantity = quantity
 
-        if res['quantity'] <= 0.0:
+        if invoice_line.quantity <= 0.0:
             return []
-        res['unit'] = line.unit.id
-        res['product'] = line.product.id
-        res['unit_price'] = line.unit_price
-        res['taxes'] = [('set', [x.id for x in line.taxes])]
-        if line.product:
-            res['account'] = line.product.account_expense_used.id
-            if not res['account']:
+        invoice_line.unit = self.unit
+        invoice_line.product = self.product
+        invoice_line.unit_price = self.unit_price
+        invoice_line.taxes = self.taxes
+        if self.product:
+            invoice_line.account = self.product.account_expense_used
+            if not invoice_line.account:
                 self.raise_user_error('missing_account_expense',
-                        error_args=(line.product.rec_name,))
+                        error_args=(self.product.rec_name,))
         else:
             for model in ('product.template', 'product.category'):
-                res['account'] = property_obj.get('account_expense', model)
-                if res['account']:
+                invoice_line.account = Property.get('account_expense', model)
+                if invoice_line.account:
                     break
-            if not res['account']:
+            if not invoice_line.account:
                 self.raise_user_error('missing_account_expense_property')
-        return [res]
+        return [invoice_line]
 
-    def copy(self, ids, default=None):
+    @classmethod
+    def copy(cls, lines, default=None):
         if default is None:
             default = {}
         default = default.copy()
@@ -1290,127 +1182,108 @@ class PurchaseLine(ModelSQL, ModelView):
         default['moves_ignored'] = None
         default['moves_recreated'] = None
         default['invoice_lines'] = None
-        return super(PurchaseLine, self).copy(ids, default=default)
+        return super(PurchaseLine, cls).copy(lines, default=default)
 
-    def get_move(self, line):
+    def get_move(self):
         '''
         Return move values for purchase line
         '''
         pool = Pool()
-        uom_obj = pool.get('product.uom')
+        Uom = pool.get('product.uom')
+        Move = pool.get('stock.move')
 
-        vals = {}
-        if line.type != 'line':
+        if self.type != 'line':
             return
-        if not line.product:
+        if not self.product:
             return
-        if line.product.type == 'service':
+        if self.product.type == 'service':
             return
-        skip_ids = set(x.id for x in line.moves_recreated)
-        quantity = line.quantity
-        for move in line.moves:
-            if move.id not in skip_ids:
-                quantity -= uom_obj.compute_qty(move.uom, move.quantity,
-                        line.unit)
+        skip = set(self.moves_recreated)
+        quantity = abs(self.quantity)
+        for move in self.moves:
+            if move not in skip:
+                quantity -= Uom.compute_qty(move.uom, move.quantity,
+                    self.unit)
         if quantity <= 0.0:
             return
-        if not line.purchase.party.supplier_location:
+        if not self.purchase.party.supplier_location:
             self.raise_user_error('supplier_location_required')
-        vals['quantity'] = quantity
-        vals['uom'] = line.unit.id
-        vals['product'] = line.product.id
-        vals['from_location'] = line.from_location.id
-        vals['to_location'] = line.to_location.id
-        vals['state'] = 'draft'
-        vals['company'] = line.purchase.company.id
-        vals['unit_price'] = line.unit_price
-        vals['currency'] = line.purchase.currency.id
-        vals['planned_date'] = line.delivery_date
-        return vals
-
-    def create_move(self, line):
+        with Transaction().set_user(0, set_context=True):
+            move = Move()
+        move.quantity = quantity
+        move.uom = self.unit
+        move.product = self.product
+        move.from_location = self.from_location
+        move.to_location = self.to_location
+        move.state = 'draft'
+        move.company = self.purchase.company
+        move.unit_price = self.unit_price
+        move.currency = self.purchase.currency
+        move.planned_date = self.delivery_date
+        return move
+
+    def create_move(self):
         '''
         Create move line
         '''
-        pool = Pool()
-        move_obj = pool.get('stock.move')
-
-        vals = self.get_move(line)
-        if not vals:
+        move = self.get_move()
+        if not move:
             return
+        move.save()
         with Transaction().set_user(0, set_context=True):
-            move_id = move_obj.create(vals)
-
-            self.write(line.id, {
-                'moves': [('add', move_id)],
-            })
-        return move_id
-
-PurchaseLine()
+            self.write([self], {
+                    'moves': [('add', [move.id])],
+                    })
+        return move
 
 
 class PurchaseLineTax(ModelSQL):
     'Purchase Line - Tax'
-    _name = 'purchase.line-account.tax'
+    __name__ = 'purchase.line-account.tax'
     _table = 'purchase_line_account_tax'
-    _description = __doc__
     line = fields.Many2One('purchase.line', 'Purchase Line',
             ondelete='CASCADE', select=True, required=True,
             domain=[('type', '=', 'line')])
     tax = fields.Many2One('account.tax', 'Tax', ondelete='RESTRICT',
             select=True, required=True, domain=[('parent', '=', None)])
 
-PurchaseLineTax()
-
 
 class PurchaseLineInvoiceLine(ModelSQL):
     'Purchase Line - Invoice Line'
-    _name = 'purchase.line-account.invoice.line'
+    __name__ = 'purchase.line-account.invoice.line'
     _table = 'purchase_line_invoice_lines_rel'
-    _description = __doc__
     purchase_line = fields.Many2One('purchase.line', 'Purchase Line',
             ondelete='CASCADE', select=True, required=True)
     invoice_line = fields.Many2One('account.invoice.line', 'Invoice Line',
             ondelete='RESTRICT', select=True, required=True)
 
-PurchaseLineInvoiceLine()
-
 
 class PurchaseLineIgnoredMove(ModelSQL):
     'Purchase Line - Ignored Move'
-    _name = 'purchase.line-ignored-stock.move'
+    __name__ = 'purchase.line-ignored-stock.move'
     _table = 'purchase_line_moves_ignored_rel'
-    _description = __doc__
     purchase_line = fields.Many2One('purchase.line', 'Purchase Line',
             ondelete='CASCADE', select=True, required=True)
     move = fields.Many2One('stock.move', 'Move', ondelete='RESTRICT',
             select=True, required=True)
 
-PurchaseLineIgnoredMove()
-
 
 class PurchaseLineRecreatedMove(ModelSQL):
     'Purchase Line - Ignored Move'
-    _name = 'purchase.line-recreated-stock.move'
+    __name__ = 'purchase.line-recreated-stock.move'
     _table = 'purchase_line_moves_recreated_rel'
-    _description = __doc__
     purchase_line = fields.Many2One('purchase.line', 'Purchase Line',
             ondelete='CASCADE', select=True, required=True)
     move = fields.Many2One('stock.move', 'Move', ondelete='RESTRICT',
             select=True, required=True)
 
-PurchaseLineRecreatedMove()
-
 
 class PurchaseReport(CompanyReport):
-    _name = 'purchase.purchase'
+    __name__ = 'purchase.purchase'
 
-PurchaseReport()
-
-
-class Template(ModelSQL, ModelView):
-    _name = "product.template"
 
+class Template:
+    __name__ = "product.template"
     purchasable = fields.Boolean('Purchasable', states={
             'readonly': ~Eval('active', True),
             }, depends=['active'])
@@ -1429,54 +1302,41 @@ class Template(ModelSQL, ModelView):
         on_change_with=['default_uom', 'purchase_uom', 'purchasable'],
         depends=['active', 'purchasable', 'default_uom_category'])
 
-    def __init__(self):
-        super(Template, self).__init__()
-        self._error_messages.update({
+    @classmethod
+    def __setup__(cls):
+        super(Template, cls).__setup__()
+        cls._error_messages.update({
                 'change_purchase_uom': 'Purchase prices are based ' \
                     'on the purchase uom, are you sure to change it?',
             })
-        self.account_expense = copy.copy(self.account_expense)
-        self.account_expense.states = copy.copy(self.account_expense.states)
         required = ~Eval('account_category') & Eval('purchasable', False)
-        if not self.account_expense.states.get('required'):
-            self.account_expense.states['required'] = required
+        if not cls.account_expense.states.get('required'):
+            cls.account_expense.states['required'] = required
         else:
-            self.account_expense.states['required'] = (
-                self.account_expense.states['required'] | required)
-        if 'account_category' not in self.account_expense.depends:
-            self.account_expense = copy.copy(self.account_expense)
-            self.account_expense.depends = \
-                    copy.copy(self.account_expense.depends)
-            self.account_expense.depends.append('account_category')
-        if 'purchasable' not in self.account_expense.depends:
-            self.account_expense = copy.copy(self.account_expense)
-            self.account_expense.depends = \
-                    copy.copy(self.account_expense.depends)
-            self.account_expense.depends.append('purchasable')
-        self._reset_columns()
-
-    def default_purchasable(self):
+            cls.account_expense.states['required'] = (
+                cls.account_expense.states['required'] | required)
+        if 'account_category' not in cls.account_expense.depends:
+            cls.account_expense.depends.append('account_category')
+        if 'purchasable' not in cls.account_expense.depends:
+            cls.account_expense.depends.append('purchasable')
+
+    @staticmethod
+    def default_purchasable():
         return Transaction().context.get('purchasable') or False
 
-    def on_change_with_purchase_uom(self, vals):
-        uom_obj = Pool().get('product.uom')
-        res = None
-
-        if vals.get('default_uom'):
-            default_uom = uom_obj.browse(vals['default_uom'])
-            if vals.get('purchase_uom'):
-                purchase_uom = uom_obj.browse(vals['purchase_uom'])
-                if default_uom.category.id == purchase_uom.category.id:
-                    res = purchase_uom.id
+    def on_change_with_purchase_uom(self):
+        if self.default_uom:
+            if self.purchase_uom:
+                if self.default_uom.category == self.purchase_uom.category:
+                    return self.purchase_uom.id
                 else:
-                    res = default_uom.id
+                    return self.default_uom.id
             else:
-                res = default_uom.id
-        return res
+                return self.default_uom.id
 
-    def write(self, ids, vals):
+    @classmethod
+    def write(cls, templates, vals):
         if vals.get("purchase_uom"):
-            templates = self.browse(ids)
             for template in templates:
                 if not template.purchase_uom:
                     continue
@@ -1485,53 +1345,47 @@ class Template(ModelSQL, ModelView):
                 for product in template.products:
                     if not product.product_suppliers:
                         continue
-                    self.raise_user_warning(
+                    cls.raise_user_warning(
                             '%s at product_template' % template.id,
                             'change_purchase_uom')
+        super(Template, cls).write(templates, vals)
 
-        return super(Template, self).write(ids, vals)
 
-Template()
+class Product:
+    __name__ = 'product.product'
 
-
-class Product(ModelSQL, ModelView):
-    _name = 'product.product'
-
-    def get_purchase_price(self, ids, quantity=0):
+    @classmethod
+    def get_purchase_price(cls, products, quantity=0):
         '''
         Return purchase price for product ids.
         The context that can have as keys:
             uom: the unit of measure
             supplier: the supplier party id
             currency: the currency id for the returned price
-
-        :param ids: the product ids
-        :param quantity: the quantity of products
-        :return: a dictionary with for each product ids keys the computed price
         '''
         pool = Pool()
-        uom_obj = pool.get('product.uom')
-        user_obj = pool.get('res.user')
-        currency_obj = pool.get('currency.currency')
-        date_obj = pool.get('ir.date')
+        Uom = pool.get('product.uom')
+        User = pool.get('res.user')
+        Currency = pool.get('currency.currency')
+        Date = pool.get('ir.date')
 
-        today = date_obj.today()
+        today = Date.today()
         res = {}
 
         uom = None
         if Transaction().context.get('uom'):
-            uom = uom_obj.browse(Transaction().context['uom'])
+            uom = Uom(Transaction().context['uom'])
 
         currency = None
         if Transaction().context.get('currency'):
-            currency = currency_obj.browse(Transaction().context['currency'])
+            currency = Currency(Transaction().context['currency'])
 
-        user = user_obj.browse(Transaction().user)
+        user = User(Transaction().user)
 
-        for product in self.browse(ids):
+        for product in products:
             res[product.id] = product.cost_price
             default_uom = product.default_uom
-            default_currency = (user.company.currency.id if user.company
+            default_currency = (user.company.currency if user.company
                 else None)
             if not uom:
                 uom = default_uom
@@ -1541,36 +1395,34 @@ class Product(ModelSQL, ModelView):
                 for product_supplier in product.product_suppliers:
                     if product_supplier.party.id == supplier_id:
                         for price in product_supplier.prices:
-                            if uom_obj.compute_qty(product.purchase_uom,
+                            if Uom.compute_qty(product.purchase_uom,
                                     price.quantity, uom) <= quantity:
                                 res[product.id] = price.unit_price
                                 default_uom = product.purchase_uom
-                                default_currency = product_supplier.currency.id
+                                default_currency = product_supplier.currency
                         break
-            res[product.id] = uom_obj.compute_price(default_uom,
-                    res[product.id], uom)
+            res[product.id] = Uom.compute_price(default_uom, res[product.id],
+                uom)
             if currency and default_currency:
                 date = Transaction().context.get('purchase_date') or today
                 with Transaction().set_context(date=date):
-                    res[product.id] = currency_obj.compute(default_currency,
-                        res[product.id], currency.id, round=False)
+                    res[product.id] = Currency.compute(default_currency,
+                        res[product.id], currency, round=False)
         return res
 
-Product()
-
 
 class ProductSupplier(ModelSQL, ModelView):
     'Product Supplier'
-    _name = 'purchase.product_supplier'
-    _description = __doc__
-
+    __name__ = 'purchase.product_supplier'
     product = fields.Many2One('product.template', 'Product', required=True,
             ondelete='CASCADE', select=True)
     party = fields.Many2One('party.party', 'Supplier', required=True,
             ondelete='CASCADE', select=True, on_change=['party'])
     name = fields.Char('Name', size=None, translate=True, select=True)
     code = fields.Char('Code', size=None, select=True)
-    sequence = fields.Integer('Sequence', required=True)
+    sequence = fields.Integer('Sequence',
+        order_field='(%(table)s.sequence IS NULL) %(order)s, '
+        '%(table)s.sequence %(order)s')
     prices = fields.One2Many('purchase.product_supplier.price',
             'product_supplier', 'Prices')
     company = fields.Many2One('company.company', 'Company', required=True,
@@ -1584,185 +1436,221 @@ class ProductSupplier(ModelSQL, ModelView):
     currency = fields.Many2One('currency.currency', 'Currency', required=True,
         ondelete='RESTRICT')
 
-    def __init__(self):
-        super(ProductSupplier, self).__init__()
-        self._order.insert(0, ('sequence', 'ASC'))
+    @classmethod
+    def __setup__(cls):
+        super(ProductSupplier, cls).__setup__()
+        cls._order.insert(0, ('sequence', 'ASC'))
 
-    def init(self, module_name):
+    @classmethod
+    def __register__(cls, module_name):
         cursor = Transaction().cursor
-        table = TableHandler(cursor, self, module_name)
+        table = TableHandler(cursor, cls, module_name)
 
         # Migration from 2.2 new field currency
         created_currency = table.column_exist('currency')
 
-        super(ProductSupplier, self).init(module_name)
+        super(ProductSupplier, cls).__register__(module_name)
 
         # Migration from 2.2 fill currency
         if not created_currency:
-            company_obj = Pool().get('company.company')
+            Company = Pool().get('company.company')
             limit = cursor.IN_MAX
-            cursor.execute('SELECT count(id) FROM "' + self._table + '"')
+            cursor.execute('SELECT count(id) FROM "' + cls._table + '"')
             product_supplier_count, = cursor.fetchone()
             for offset in range(0, product_supplier_count, limit):
                 cursor.execute(cursor.limit_clause(
                         'SELECT p.id, c.currency '
-                        'FROM "' + self._table + '" AS p '
-                        'INNER JOIN "' + company_obj._table + '" AS c '
+                        'FROM "' + cls._table + '" AS p '
+                        'INNER JOIN "' + Company._table + '" AS c '
                             'ON p.company = c.id '
                         'ORDER BY p.id',
                         limit, offset))
                 for product_supplier_id, currency_id in cursor.fetchall():
-                    cursor.execute('UPDATE "' + self._table + '" '
+                    cursor.execute('UPDATE "' + cls._table + '" '
                         'SET currency = %s '
                         'WHERE id = %s', (currency_id, product_supplier_id))
 
-    def default_company(self):
+        # Migration from 2.4: drop required on sequence
+        table.not_null_action('sequence', action='remove')
+
+    @staticmethod
+    def default_company():
         return Transaction().context.get('company')
 
-    def default_currency(self):
-        company_obj = Pool().get('company.company')
-        company = None
+    @staticmethod
+    def default_currency():
+        Company = Pool().get('company.company')
         if Transaction().context.get('company'):
-            company = company_obj.browse(Transaction().context['company'])
+            company = Company(Transaction().context['company'])
             return company.currency.id
 
-    def on_change_party(self, values):
+    def on_change_party(self):
         cursor = Transaction().cursor
         changes = {
             'currency': self.default_currency(),
             }
-        if values.get('party'):
+        if self.party:
             cursor.execute('SELECT currency FROM "' + self._table + '" '
                 'WHERE party = %s '
                 'GROUP BY currency '
-                'ORDER BY COUNT(1) DESC', (values['party'],))
+                'ORDER BY COUNT(1) DESC', (self.party.id,))
             row = cursor.fetchone()
             if row:
                 changes['currency'], = row
         return changes
 
-    def compute_supply_date(self, product_supplier, date=None):
+    def compute_supply_date(self, date=None):
         '''
         Compute the supply date for the Product Supplier at the given date
             and the next supply date
-
-        :param product_supplier: a BrowseRecord of the Product Supplier
-        :param date: the date of the purchase if None the current date
-        :return: the supply date
         '''
-        date_obj = Pool().get('ir.date')
+        Date = Pool().get('ir.date')
 
         if not date:
-            date = date_obj.today()
-        if not product_supplier.delivery_time:
+            date = Date.today()
+        if not self.delivery_time:
             return datetime.date.max
-        return date + datetime.timedelta(product_supplier.delivery_time)
+        return date + datetime.timedelta(self.delivery_time)
 
-    def compute_purchase_date(self, product_supplier, date):
+    def compute_purchase_date(self, date):
         '''
         Compute the purchase date for the Product Supplier at the given date
-
-        :param product_supplier: a BrowseRecord of the Product Supplier
-        :param date: the date of the supply
-        :return: the purchase date
         '''
-        date_obj = Pool().get('ir.date')
-
-        if not product_supplier.delivery_time:
-            return date_obj.today()
-        return date - datetime.timedelta(product_supplier.delivery_time)
+        Date = Pool().get('ir.date')
 
-ProductSupplier()
+        if not self.delivery_time:
+            return Date.today()
+        return date - datetime.timedelta(self.delivery_time)
 
 
 class ProductSupplierPrice(ModelSQL, ModelView):
     'Product Supplier Price'
-    _name = 'purchase.product_supplier.price'
-    _description = __doc__
-
+    __name__ = 'purchase.product_supplier.price'
     product_supplier = fields.Many2One('purchase.product_supplier',
             'Supplier', required=True, ondelete='CASCADE')
     quantity = fields.Float('Quantity', required=True, help='Minimal quantity')
     unit_price = fields.Numeric('Unit Price', required=True, digits=(16, 4))
 
-    def __init__(self):
-        super(ProductSupplierPrice, self).__init__()
-        self._order.insert(0, ('quantity', 'ASC'))
+    @classmethod
+    def __setup__(cls):
+        super(ProductSupplierPrice, cls).__setup__()
+        cls._order.insert(0, ('quantity', 'ASC'))
 
-    def default_quantity(self):
+    @staticmethod
+    def default_quantity():
         return 0.0
 
-ProductSupplierPrice()
-
 
-class ShipmentIn(ModelSQL, ModelView):
-    _name = 'stock.shipment.in'
+class ShipmentIn:
+    __name__ = 'stock.shipment.in'
 
-    def __init__(self):
-        super(ShipmentIn, self).__init__()
-        self.incoming_moves = copy.copy(self.incoming_moves)
+    @classmethod
+    def __setup__(cls):
+        super(ShipmentIn, cls).__setup__()
         add_remove = [
             ('supplier', '=', Eval('supplier')),
-        ]
-        if not self.incoming_moves.add_remove:
-            self.incoming_moves.add_remove = add_remove
+            ]
+        if not cls.incoming_moves.add_remove:
+            cls.incoming_moves.add_remove = add_remove
         else:
-            self.incoming_moves.add_remove = \
-                    copy.copy(self.incoming_moves.add_remove)
-            self.incoming_moves.add_remove = [
+            cls.incoming_moves.add_remove = [
                 add_remove,
-                self.incoming_moves.add_remove,
-            ]
-        self._reset_columns()
+                cls.incoming_moves.add_remove,
+                ]
 
-        self._error_messages.update({
+        cls._error_messages.update({
                 'reset_move': 'You cannot reset to draft a move generated '\
                     'by a purchase.',
             })
 
-    def write(self, ids, vals):
-        purchase_obj = Pool().get('purchase.purchase')
-        purchase_line_obj = Pool().get('purchase.line')
+    @classmethod
+    def write(cls, shipments, vals):
+        pool = Pool()
+        Purchase = pool.get('purchase.purchase')
+        PurchaseLine = pool.get('purchase.line')
 
-        res = super(ShipmentIn, self).write(ids, vals)
+        super(ShipmentIn, cls).write(shipments, vals)
 
         if 'state' in vals and vals['state'] in ('received', 'cancel'):
-            purchase_ids = []
+            purchases = []
             move_ids = []
-            if isinstance(ids, (int, long)):
-                ids = [ids]
-            for shipment in self.browse(ids):
+            for shipment in shipments:
                 move_ids.extend([x.id for x in shipment.incoming_moves])
 
-            purchase_line_ids = purchase_line_obj.search([
-                ('moves', 'in', move_ids),
-                ])
-            if purchase_line_ids:
-                for purchase_line in purchase_line_obj.browse(
-                        purchase_line_ids):
-                    if purchase_line.purchase.id not in purchase_ids:
-                        purchase_ids.append(purchase_line.purchase.id)
+            purchase_lines = PurchaseLine.search([
+                    ('moves', 'in', move_ids),
+                    ])
+            if purchase_lines:
+                for purchase_line in purchase_lines:
+                    if purchase_line.purchase not in purchases:
+                        purchases.append(purchase_line.purchase)
 
             with Transaction().set_user(0, set_context=True):
-                purchase_obj.process(purchase_ids)
-        return res
+                purchases = Purchase.browse([p.id for p in purchases])
+            Purchase.process(purchases)
 
+    @classmethod
     @ModelView.button
     @Workflow.transition('draft')
-    def draft(self, ids):
-        for shipment in self.browse(ids):
+    def draft(cls, shipments):
+        for shipment in shipments:
             for move in shipment.incoming_moves:
                 if move.state == 'cancel' and move.purchase_line:
-                    self.raise_user_error('reset_move')
+                    cls.raise_user_error('reset_move')
 
-        return super(ShipmentIn, self).draft(ids)
+        return super(ShipmentIn, cls).draft(shipments)
 
-ShipmentIn()
 
+class ShipmentInReturn:
+    __name__ = 'stock.shipment.in.return'
 
-class Move(ModelSQL, ModelView):
-    _name = 'stock.move'
+    @classmethod
+    def __setup__(cls):
+        super(ShipmentInReturn, cls).__setup__()
+        cls._error_messages.update({
+                'reset_move': 'You cannot reset to draft a move generated '\
+                    'by a purchase.',
+                })
+
+    @classmethod
+    def write(cls, shipments, vals):
+        pool = Pool()
+        Purchase = pool.get('purchase.purchase')
+        PurchaseLine = pool.get('purchase.line')
+
+        super(ShipmentInReturn, cls).write(shipments, vals)
+
+        if 'state' in vals and vals['state'] == 'done':
+            move_ids = []
+            for shipment in shipments:
+                move_ids.extend([x.id for x in shipment.moves])
+
+            purchase_lines = PurchaseLine.search([
+                    ('moves', 'in', move_ids),
+                    ])
+            purchases = set()
+            if purchase_lines:
+                for purchase_line in purchase_lines:
+                    purchases.add(purchase_line.purchase)
 
+            with Transaction().set_user(0, set_context=True):
+                purchases = Purchase.browse([p.id for p in purchases])
+            Purchase.process(purchases)
+
+    @classmethod
+    @ModelView.button
+    @Workflow.transition('draft')
+    def draft(cls, shipments):
+        for shipment in shipments:
+            for move in shipment.moves:
+                if move.state == 'cancel' and move.purchase_line:
+                    cls.raise_user_error('reset_move')
+
+        return super(ShipmentInReturn, cls).draft(shipments)
+
+
+class Move(ModelSQL, ModelView):
+    __name__ = 'stock.move'
     purchase_line = fields.Many2One('purchase.line', 'Purchase Line',
         select=True, states={
             'readonly': Eval('state') != 'draft',
@@ -1795,7 +1683,7 @@ class Move(ModelSQL, ModelView):
                 'invisible': ~Eval('purchase_visible', False),
                 }, depends=['purchase_visible']), 'get_purchase_fields')
     purchase_visible = fields.Function(fields.Boolean('Purchase Visible',
-        on_change_with=['from_location']), 'get_purchase_visible')
+        on_change_with=['from_location']), 'on_change_with_purchase_visible')
     supplier = fields.Function(fields.Many2One('party.party', 'Supplier',
         select=True), 'get_supplier', searcher='search_supplier')
     purchase_exception_state = fields.Function(fields.Selection([
@@ -1804,203 +1692,102 @@ class Move(ModelSQL, ModelView):
         ('recreated', 'Recreated'),
         ], 'Exception State'), 'get_purchase_exception_state')
 
-    def get_purchase(self, ids, name):
-        res = {}
-        for move in self.browse(ids):
-            res[move.id] = None
-            if move.purchase_line:
-                res[move.id] = move.purchase_line.purchase.id
-        return res
-
-    def get_purchase_exception_state(self, ids, name):
-        res = {}.fromkeys(ids, '')
-        for move in self.browse(ids):
-            if not move.purchase_line:
-                continue
-            if move.id in (x.id for x in move.purchase_line.moves_recreated):
-                res[move.id] = 'recreated'
-            if move.id in (x.id for x in move.purchase_line.moves_ignored):
-                res[move.id] = 'ignored'
-        return res
-
-    def search_purchase(self, name, clause):
-        return [('purchase_line.' + name,) + clause[1:]]
-
-    def get_purchase_fields(self, ids, names):
-        res = {}
-        for name in names:
-            res[name] = {}
-
-        for move in self.browse(ids):
-            for name in res.keys():
-                if name[9:] == 'quantity':
-                    res[name][move.id] = 0.0
-                elif name[9:] == 'unit_digits':
-                    res[name][move.id] = 2
-                else:
-                    res[name][move.id] = None
-            if move.purchase_line:
-                for name in res.keys():
-                    if name[9:] == 'currency':
-                        res[name][move.id] = move.purchase_line.\
-                                purchase.currency.id
-                    elif name[9:] in ('quantity', 'unit_digits', 'unit_price'):
-                        res[name][move.id] = move.purchase_line[name[9:]]
-                    else:
-                        res[name][move.id] = move.purchase_line[name[9:]].id
-        return res
-
-    def on_change_with_purchase_visible(self, vals):
-        location_obj = Pool().get('stock.location')
-        if vals.get('from_location'):
-            from_location = location_obj.browse(vals['from_location'])
-            if from_location.type == 'supplier':
+    def get_purchase(self, name):
+        if self.purchase_line:
+            return self.purchase_line.purchase.id
+
+    def get_purchase_exception_state(self, name):
+        if not self.purchase_line:
+            return ''
+        if self in self.purchase_line.moves_recreated:
+            return 'recreated'
+        if self in self.purchase_line.moves_ignored:
+            return 'ignored'
+
+    @classmethod
+    def search_purchase(cls, name, clause):
+        return [('purchase_line.' + name,) + tuple(clause[1:])]
+
+    def get_purchase_fields(self, name):
+        if self.purchase_line:
+            if name[9:] == 'currency':
+                return self.purchase_line.purchase.currency.id
+            elif name[9:] in ('quantity', 'unit_digits', 'unit_price'):
+                return getattr(self.purchase_line, name[9:])
+            else:
+                return getattr(self.purchase_line, name[9:]).id
+        else:
+            if name[9:] == 'quantity':
+                return 0.0
+            elif name[9:] == 'unit_digits':
+                return 2
+
+    def on_change_with_purchase_visible(self, name=None):
+        if self.from_location:
+            if self.from_location.type == 'supplier':
                 return True
         return False
 
-    def get_purchase_visible(self, ids, name):
-        res = {}
-        for move in self.browse(ids):
-            res[move.id] = False
-            if move.from_location.type == 'supplier':
-                res[move.id] = True
-        return res
+    def get_supplier(self, name):
+        if self.purchase_line:
+            return self.purchase_line.purchase.party.id
 
-    def get_supplier(self, ids, name):
-        res = {}
-        for move in self.browse(ids):
-            res[move.id] = None
-            if move.purchase_line:
-                res[move.id] = move.purchase_line.purchase.party.id
-        return res
+    @classmethod
+    def search_supplier(cls, name, clause):
+        return [('purchase_line.purchase.party',) + tuple(clause[1:])]
 
-    def search_supplier(self, name, clause):
-        return [('purchase_line.purchase.party',) + clause[1:]]
-
-    def write(self, ids, vals):
-        purchase_obj = Pool().get('purchase.purchase')
-        purchase_line_obj = Pool().get('purchase.line')
+    @classmethod
+    def write(cls, moves, vals):
+        pool = Pool()
+        Purchase = pool.get('purchase.purchase')
+        PurchaseLine = pool.get('purchase.line')
 
-        res = super(Move, self).write(ids, vals)
+        super(Move, cls).write(moves, vals)
         if 'state' in vals and vals['state'] in ('cancel',):
-            if isinstance(ids, (int, long)):
-                ids = [ids]
-            purchase_ids = set()
-            purchase_line_ids = purchase_line_obj.search([
-                ('moves', 'in', ids),
-                ])
-            if purchase_line_ids:
-                for purchase_line in purchase_line_obj.browse(
-                        purchase_line_ids):
-                    purchase_ids.add(purchase_line.purchase.id)
-            if purchase_ids:
+            purchases = set()
+            purchase_lines = PurchaseLine.search([
+                    ('moves', 'in', [m.id for m in moves]),
+                    ])
+            if purchase_lines:
+                for purchase_line in purchase_lines:
+                    purchases.add(purchase_line.purchase)
+            if purchases:
                 with Transaction().set_user(0, set_context=True):
-                    purchase_obj.process(list(purchase_ids))
-        return res
+                    purchases = Purchase.browse([p.id for p in purchases])
+                Purchase.process(purchases)
 
-    def delete(self, ids):
-        purchase_obj = Pool().get('purchase.purchase')
-        purchase_line_obj = Pool().get('purchase.line')
-
-        if isinstance(ids, (int, long)):
-            ids = [ids]
+    @classmethod
+    def delete(cls, moves):
+        pool = Pool()
+        Purchase = pool.get('purchase.purchase')
+        PurchaseLine = pool.get('purchase.line')
 
-        purchase_ids = set()
-        purchase_line_ids = purchase_line_obj.search([
-            ('moves', 'in', ids),
-            ])
+        purchases = set()
+        purchase_lines = PurchaseLine.search([
+                ('moves', 'in', [m.id for m in moves]),
+                ])
 
-        res = super(Move, self).delete(ids)
+        super(Move, cls).delete(moves)
 
-        if purchase_line_ids:
-            for purchase_line in purchase_line_obj.browse(purchase_line_ids):
-                purchase_ids.add(purchase_line.purchase.id)
-            if purchase_ids:
+        if purchase_lines:
+            for purchase_line in purchase_lines:
+                purchases.add(purchase_line.purchase)
+            if purchases:
                 with Transaction().set_user(0, set_context=True):
-                    purchase_obj.process(list(purchase_ids))
-        return res
-Move()
-
-
-class Invoice(ModelSQL, ModelView):
-    _name = 'account.invoice'
-
-    purchase_exception_state = fields.Function(fields.Selection([
-        ('', ''),
-        ('ignored', 'Ignored'),
-        ('recreated', 'Recreated'),
-        ], 'Exception State'), 'get_purchase_exception_state')
-
-    def __init__(self):
-        super(Invoice, self).__init__()
-        self._error_messages.update({
-                'delete_purchase_invoice': 'You can not delete invoices ' \
-                    'that come from a purchase!',
-                'reset_invoice_purchase': 'You cannot reset to draft ' \
-                        'an invoice generated by a purchase.',
-            })
-
-    @ModelView.button
-    @Workflow.transition('draft')
-    def draft(self, ids):
-        purchase_obj = Pool().get('purchase.purchase')
-        purchase_ids = purchase_obj.search([
-            ('invoices', 'in', ids),
-            ])
-
-        if purchase_ids:
-            self.raise_user_error('reset_invoice_purchase')
-
-        return super(Invoice, self).draft(ids)
-
-    def get_purchase_exception_state(self, ids, name):
-        purchase_obj = Pool().get('purchase.purchase')
-        purchase_ids = purchase_obj.search([
-            ('invoices', 'in', ids),
-            ])
-
-        purchases = purchase_obj.browse(purchase_ids)
-
-        recreated_ids = tuple(i.id for p in purchases
-            for i in p.invoices_recreated)
-        ignored_ids = tuple(i.id for p in purchases
-            for i in p.invoices_ignored)
-
-        res = {}.fromkeys(ids, '')
-        for invoice in self.browse(ids):
-            if invoice.id in recreated_ids:
-                res[invoice.id] = 'recreated'
-            elif invoice.id in ignored_ids:
-                res[invoice.id] = 'ignored'
-
-        return res
-
-    def delete(self, ids):
-        cursor = Transaction().cursor
-        if not ids:
-            return True
-        if isinstance(ids, (int, long)):
-            ids = [ids]
-        cursor.execute('SELECT id FROM purchase_invoices_rel ' \
-                'WHERE invoice IN (' + ','.join(('%s',) * len(ids)) + ')',
-                ids)
-        if cursor.fetchone():
-            self.raise_user_error('delete_purchase_invoice')
-        return super(Invoice, self).delete(ids)
-
-Invoice()
+                    purchases = Purchase.browse([p.id for p in purchases])
+                Purchase.process(purchases)
 
 
 class OpenSupplier(Wizard):
     'Open Suppliers'
-    _name = 'purchase.open_supplier'
+    __name__ = 'purchase.open_supplier'
     start_state = 'open_'
     open_ = StateAction('party.act_party_form')
 
-    def do_open_(self, session, action):
+    def do_open_(self, action):
         pool = Pool()
-        model_data_obj = pool.get('ir.model.data')
-        wizard_obj = pool.get('ir.action.wizard')
+        ModelData = pool.get('ir.model.data')
+        Wizard = pool.get('ir.action.wizard')
         cursor = Transaction().cursor
 
         cursor.execute("SELECT DISTINCT(party) FROM purchase_purchase")
@@ -2008,25 +1795,20 @@ class OpenSupplier(Wizard):
         action['pyson_domain'] = PYSONEncoder().encode(
             [('id', 'in', supplier_ids)])
 
-        model_data_ids = model_data_obj.search([
-            ('fs_id', '=', 'act_open_supplier'),
-            ('module', '=', 'purchase'),
-            ('inherit', '=', None),
-            ], limit=1)
-        model_data = model_data_obj.browse(model_data_ids[0])
-        wizard = wizard_obj.browse(model_data.db_id)
+        model_data, = ModelData.search([
+                ('fs_id', '=', 'act_open_supplier'),
+                ('module', '=', 'purchase'),
+                ('inherit', '=', None),
+                ], limit=1)
+        wizard = Wizard(model_data.db_id)
 
         action['name'] = wizard.name
         return action, {}
 
-OpenSupplier()
-
 
 class HandleShipmentExceptionAsk(ModelView):
     'Handle Shipment Exception'
-    _name = 'purchase.handle.shipment.exception.ask'
-    _description = __doc__
-
+    __name__ = 'purchase.handle.shipment.exception.ask'
     recreate_moves = fields.Many2Many(
         'stock.move', None, None, 'Recreate Moves',
         domain=[('id', 'in', Eval('domain_moves'))], depends=['domain_moves'],
@@ -2035,21 +1817,20 @@ class HandleShipmentExceptionAsk(ModelView):
     domain_moves = fields.Many2Many(
         'stock.move', None, None, 'Domain Moves')
 
-    def init(self, module_name):
+    @classmethod
+    def __register__(cls, module_name):
         cursor = Transaction().cursor
         # Migration from 1.2: packing renamed into shipment
         cursor.execute("UPDATE ir_model "\
                 "SET model = REPLACE(model, 'packing', 'shipment') "\
                 "WHERE model like '%%packing%%' AND module = %s",
                 (module_name,))
-        super(HandleShipmentExceptionAsk, self).init(module_name)
-
-HandleShipmentExceptionAsk()
+        super(HandleShipmentExceptionAsk, cls).__register__(module_name)
 
 
 class HandleShipmentException(Wizard):
     'Handle Shipment Exception'
-    _name = 'purchase.handle.shipment.exception'
+    __name__ = 'purchase.handle.shipment.exception'
     start_state = 'ask'
     ask = StateView('purchase.handle.shipment.exception.ask',
         'purchase.handle_shipment_exception_ask_view_form', [
@@ -2058,61 +1839,56 @@ class HandleShipmentException(Wizard):
             ])
     handle = StateTransition()
 
-    def default_ask(self, session, fields):
-        purchase_obj = Pool().get('purchase.purchase')
+    def default_ask(self, fields):
+        Purchase = Pool().get('purchase.purchase')
 
-        purchase = purchase_obj.browse(Transaction().context['active_id'])
+        purchase = Purchase(Transaction().context['active_id'])
 
         moves = []
         for line in purchase.lines:
-            skip_ids = set(x.id for x in line.moves_ignored + \
-                               line.moves_recreated)
+            skip = set(line.moves_ignored + line.moves_recreated)
             for move in line.moves:
-                if move.state == 'cancel' and move.id not in skip_ids:
+                if move.state == 'cancel' and move not in skip:
                     moves.append(move.id)
         return {
             'to_recreate': moves,
             'domain_moves': moves,
             }
 
-    def transition_handle(self, session):
+    def transition_handle(self):
         pool = Pool()
-        purchase_obj = pool.get('purchase.purchase')
-        purchase_line_obj = pool.get('purchase.line')
-        to_recreate = [x.id for x in session.ask.recreate_moves]
-        domain_moves = [x.id for x in session.ask.domain_moves]
+        Purchase = pool.get('purchase.purchase')
+        PurchaseLine = pool.get('purchase.line')
+        to_recreate = self.ask.recreate_moves
+        domain_moves = self.ask.domain_moves
 
-        purchase = purchase_obj.browse(Transaction().context['active_id'])
+        purchase = Purchase(Transaction().context['active_id'])
 
         for line in purchase.lines:
             moves_ignored = []
             moves_recreated = []
-            skip_ids = set(x.id for x in line.moves_ignored)
-            skip_ids.update(x.id for x in line.moves_recreated)
+            skip = set(line.moves_ignored)
+            skip.update(line.moves_recreated)
             for move in line.moves:
-                if move.id not in domain_moves or move.id in skip_ids:
+                if move not in domain_moves or move in skip:
                     continue
-                if move.id in to_recreate:
+                if move in to_recreate:
                     moves_recreated.append(move.id)
                 else:
                     moves_ignored.append(move.id)
 
-            purchase_line_obj.write(line.id, {
+            PurchaseLine.write([line], {
                 'moves_ignored': [('add', moves_ignored)],
                 'moves_recreated': [('add', moves_recreated)],
                 })
 
-        purchase_obj.process([purchase.id])
+        Purchase.process([purchase])
         return 'end'
 
-HandleShipmentException()
-
 
 class HandleInvoiceExceptionAsk(ModelView):
     'Handle Invoice Exception'
-    _name = 'purchase.handle.invoice.exception.ask'
-    _description = __doc__
-
+    __name__ = 'purchase.handle.invoice.exception.ask'
     recreate_invoices = fields.Many2Many(
         'account.invoice', None, None, 'Recreate Invoices',
         domain=[('id', 'in', Eval('domain_invoices'))],
@@ -2122,12 +1898,10 @@ class HandleInvoiceExceptionAsk(ModelView):
     domain_invoices = fields.Many2Many(
         'account.invoice', None, None, 'Domain Invoices')
 
-HandleInvoiceExceptionAsk()
-
 
 class HandleInvoiceException(Wizard):
     'Handle Invoice Exception'
-    _name = 'purchase.handle.invoice.exception'
+    __name__ = 'purchase.handle.invoice.exception'
     start_state = 'ask'
     ask = StateView('purchase.handle.invoice.exception.ask',
         'purchase.handle_invoice_exception_ask_view_form', [
@@ -2136,46 +1910,44 @@ class HandleInvoiceException(Wizard):
             ])
     handle = StateTransition()
 
-    def default_ask(self, session, fields):
-        purchase_obj = Pool().get('purchase.purchase')
+    def default_ask(self, fields):
+        Purchase = Pool().get('purchase.purchase')
 
-        purchase = purchase_obj.browse(Transaction().context['active_id'])
-        skip_ids = set(x.id for x in purchase.invoices_ignored)
-        skip_ids.update(x.id for x in purchase.invoices_recreated)
+        purchase = Purchase(Transaction().context['active_id'])
+        skip = set(purchase.invoices_ignored)
+        skip.update(purchase.invoices_recreated)
         invoices = []
         for invoice in purchase.invoices:
-            if invoice.state == 'cancel' and invoice.id not in skip_ids:
+            if invoice.state == 'cancel' and invoice not in skip:
                 invoices.append(invoice.id)
         return {
             'to_recreate': invoices,
             'domain_invoices': invoices,
             }
 
-    def transition_handle(self, session):
-        purchase_obj = Pool().get('purchase.purchase')
-        to_recreate = [x.id for x in session.ask.recreate_invoices]
-        domain_invoices = [x.id for x in session.ask.domain_invoices]
+    def transition_handle(self):
+        Purchase = Pool().get('purchase.purchase')
+        to_recreate = self.ask.recreate_invoices
+        domain_invoices = self.ask.domain_invoices
 
-        purchase = purchase_obj.browse(Transaction().context['active_id'])
+        purchase = Purchase(Transaction().context['active_id'])
 
-        skip_ids = set(x.id for x in purchase.invoices_ignored)
-        skip_ids.update(x.id for x in purchase.invoices_recreated)
+        skip = set(purchase.invoices_ignored)
+        skip.update(purchase.invoices_recreated)
         invoices_ignored = []
         invoices_recreated = []
         for invoice in purchase.invoices:
-            if invoice.id not in domain_invoices or invoice.id in skip_ids:
+            if invoice not in domain_invoices or invoice in skip:
                 continue
-            if invoice.id in to_recreate:
+            if invoice in to_recreate:
                 invoices_recreated.append(invoice.id)
             else:
                 invoices_ignored.append(invoice.id)
 
-        purchase_obj.write(purchase.id, {
+        Purchase.write([purchase], {
             'invoices_ignored': [('add', invoices_ignored)],
             'invoices_recreated': [('add', invoices_recreated)],
             })
 
-        purchase_obj.process([purchase.id])
+        Purchase.process([purchase])
         return 'end'
-
-HandleInvoiceException()
diff --git a/purchase.xml b/purchase.xml
index 93227ba..bffd186 100644
--- a/purchase.xml
+++ b/purchase.xml
@@ -99,23 +99,18 @@ this repository contains the full copyright notices and license terms. -->
                                 <label name="total_amount" xalign="1.0" xexpand="1"/>
                                 <field name="total_amount" xalign="1.0" xexpand="0"/>
                                 <group col="6" colspan="2" id="buttons">
-                                    <button name="cancel" type="object" string="Cancel"
+                                    <button name="cancel" string="Cancel"
                                         icon="tryton-cancel"/>
-                                    <button name="draft" type="object" string="Draft"
-                                        icon="tryton-go-previous"/>
-                                    <button name="quote" type="object" string="Quote"
+                                    <button name="draft" string="Draft"/>
+                                    <button name="quote" string="Quote"
                                         icon="tryton-go-next"/>
-                                    <button name="%(wizard_invoice_handle_exception)d"
+                                    <button name="handle_invoice_exception"
                                             string="Handle Invoice Exception"
-                                            type="action"
-                                            states="{'invisible': Or(Not(Equal(Eval('invoice_state'), 'exception')), Equal(Eval('state'), 'cancel')), 'readonly': Not(In(%(group_purchase)d, Eval('groups', [])))}"
                                             icon="tryton-go-next"/>
-                                    <button name="%(wizard_shipment_handle_exception)d"
+                                    <button name="handle_shipment_exception"
                                             string="Handle Shipment Exception"
-                                            type="action"
-                                            states="{'invisible': Or(Not(Equal(Eval('shipment_state'), 'exception')), Equal(Eval('state'), 'cancel')), 'readonly': Not(In(%(group_purchase)d, Eval('groups', [])))}"
                                             icon="tryton-go-next"/>
-                                    <button name="confirm" type="object" string="Confirm"
+                                    <button name="confirm" string="Confirm"
                                         icon="tryton-ok"/>
                                 </group>
                             </group>
@@ -135,6 +130,7 @@ this repository contains the full copyright notices and license terms. -->
                             <field name="moves" colspan="4"
                                 view_ids="purchase.move_view_list_shipment"/>
                             <field name="shipments" colspan="4"/>
+                            <field name="shipment_returns" colspan="4"/>
                         </page>
                     </notebook>
                     <field name="currency_digits" invisible="1" colspan="6"/>
@@ -179,6 +175,17 @@ this repository contains the full copyright notices and license terms. -->
             <field name="model">purchase.purchase,-1</field>
             <field name="action" ref="act_shipment_form"/>
         </record>
+        <record model="ir.action.act_window" id="act_return_form">
+            <field name="name">Returns</field>
+            <field name="res_model">stock.shipment.in.return</field>
+            <field name="domain">[("id", "in", Eval('shipment_returns'))]</field>
+        </record>
+        <record model="ir.action.keyword"
+            id="act_open_shipment_return_keyword1">
+            <field name="keyword">form_relate</field>
+            <field name="model">purchase.purchase,-1</field>
+            <field name="action" ref="act_return_form"/>
+        </record>
         <record model="ir.action.act_window" id="act_invoice_form">
             <field name="name">Invoices</field>
             <field name="res_model">account.invoice</field>
@@ -204,7 +211,7 @@ this repository contains the full copyright notices and license terms. -->
                         id="choose"
                         yalign="0.0" xalign="0.0" xexpand="1"/>
                     <field name="recreate_moves" colspan="2"
-                        view_ids="stock.move_view_tree_simple"/>
+                        view_ids="stock.move_view_tree"/>
                 </form>
                 ]]>
             </field>
@@ -738,5 +745,14 @@ this repository contains the full copyright notices and license terms. -->
             <field name="perm_delete" eval="False"/>
         </record>
 
+        <record model="ir.model.access" id="access_shipment_in_return_group_purchase">
+            <field name="model" search="[('model', '=', 'stock.shipment.in.return')]"/>
+            <field name="group" ref="group_purchase"/>
+            <field name="perm_read" eval="True"/>
+            <field name="perm_write" eval="False"/>
+            <field name="perm_create" eval="False"/>
+            <field name="perm_delete" eval="False"/>
+        </record>
+
     </data>
 </tryton>
diff --git a/setup.py b/setup.py
index a0ddb80..551b517 100644
--- a/setup.py
+++ b/setup.py
@@ -4,8 +4,19 @@
 
 from setuptools import setup
 import re
+import os
+import ConfigParser
 
-info = eval(open('__tryton__.py').read())
+
+def read(fname):
+    return open(os.path.join(os.path.dirname(__file__), fname)).read()
+
+config = ConfigParser.ConfigParser()
+config.readfp(open('tryton.cfg'))
+info = dict(config.items('tryton'))
+for key in ('depends', 'extras_depend', 'xml'):
+    if key in info:
+        info[key] = info[key].strip().splitlines()
 major_version, minor_version, _ = info.get('version', '0.0.1').split('.', 2)
 major_version = int(major_version)
 minor_version = int(minor_version)
@@ -21,22 +32,21 @@ requires.append('trytond >= %s.%s, < %s.%s' %
 
 setup(name='trytond_purchase',
     version=info.get('version', '0.0.1'),
-    description=info.get('description', ''),
-    author=info.get('author', ''),
-    author_email=info.get('email', ''),
-    url=info.get('website', ''),
+    description='Tryton module for purchase',
+    long_description=read('README'),
+    author='Tryton',
+    url='http://www.tryton.org/',
     download_url="http://downloads.tryton.org/" + \
-            info.get('version', '0.0.1').rsplit('.', 1)[0] + '/',
+        info.get('version', '0.0.1').rsplit('.', 1)[0] + '/',
     package_dir={'trytond.modules.purchase': '.'},
     packages=[
         'trytond.modules.purchase',
         'trytond.modules.purchase.tests',
-    ],
+        ],
     package_data={
         'trytond.modules.purchase': info.get('xml', []) \
-                + info.get('translation', []) \
-                + ['purchase.odt'],
-    },
+            + ['tryton.cfg', 'locale/*.po', 'purchase.odt'],
+        },
     classifiers=[
         'Development Status :: 5 - Production/Stable',
         'Environment :: Plugins',
@@ -58,7 +68,7 @@ setup(name='trytond_purchase',
         'Programming Language :: Python :: 2.7',
         'Topic :: Office/Business',
         'Topic :: Office/Business :: Financial :: Accounting',
-    ],
+        ],
     license='GPL-3',
     install_requires=requires,
     zip_safe=False,
@@ -68,4 +78,4 @@ setup(name='trytond_purchase',
     """,
     test_suite='tests',
     test_loader='trytond.test_loader:Loader',
-)
+    )
diff --git a/stock.py b/stock.py
new file mode 100644
index 0000000..18ccf22
--- /dev/null
+++ b/stock.py
@@ -0,0 +1,36 @@
+#This file is part of Tryton.  The COPYRIGHT file at the top level of
+#this repository contains the full copyright notices and license terms.
+import datetime
+
+from trytond.wizard import Wizard
+from trytond.pool import Pool
+from trytond.transaction import Transaction
+from trytond.pyson import PYSONDecoder, PYSONEncoder
+
+__all__ = ['OpenProductQuantitiesByWarehouse']
+
+
+class OpenProductQuantitiesByWarehouse(Wizard):
+    __name__ = 'stock.product_quantities_warehouse'
+
+    def do_open_(self, action):
+        Product = Pool().get('product.product')
+
+        action, data = super(OpenProductQuantitiesByWarehouse,
+            self).do_open_(action)
+
+        product = Product(Transaction().context['active_id'])
+        if product.product_suppliers:
+            product_supplier = product.product_suppliers[0]
+            supply_date = product_supplier.compute_supply_date()
+            if supply_date != datetime.date.max:
+                search_value = \
+                    PYSONDecoder().decode(action['pyson_search_value'])
+                clause = ('date', '<=', supply_date)
+                if search_value and search_value[0] != 'OR':
+                    search_value.append(clause)
+                else:
+                    search_value = [search_value, clause]
+                action['pyson_search_value'] = PYSONEncoder().encode(
+                    search_value)
+        return action, data
diff --git a/stock.xml b/stock.xml
index dad46a1..a5dedcf 100644
--- a/stock.xml
+++ b/stock.xml
@@ -22,5 +22,23 @@ this repository contains the full copyright notices and license terms. -->
                 ]]>
             </field>
         </record>
+
+        <record model="ir.model.access" id="access_purchase_group_stock">
+            <field name="model" search="[('model', '=', 'purchase.purchase')]"/>
+            <field name="group" ref="stock.group_stock"/>
+            <field name="perm_read" eval="True"/>
+            <field name="perm_write" eval="False"/>
+            <field name="perm_create" eval="False"/>
+            <field name="perm_delete" eval="False"/>
+        </record>
+
+        <record model="ir.model.access" id="access_purchase_line_group_stock">
+            <field name="model" search="[('model', '=', 'purchase.line')]"/>
+            <field name="group" ref="stock.group_stock"/>
+            <field name="perm_read" eval="True"/>
+            <field name="perm_write" eval="False"/>
+            <field name="perm_create" eval="False"/>
+            <field name="perm_delete" eval="False"/>
+        </record>
     </data>
 </tryton>
diff --git a/tests/test_purchase.py b/tests/test_purchase.py
index 4ed2b7b..a672a91 100644
--- a/tests/test_purchase.py
+++ b/tests/test_purchase.py
@@ -10,8 +10,10 @@ if os.path.isdir(DIR):
     sys.path.insert(0, os.path.dirname(DIR))
 
 import unittest
+import doctest
 import trytond.tests.test_tryton
 from trytond.tests.test_tryton import test_view, test_depends
+from trytond.backend.sqlite.database import Database as SQLiteDatabase
 
 
 class PurchaseTestCase(unittest.TestCase):
@@ -35,10 +37,23 @@ class PurchaseTestCase(unittest.TestCase):
         test_depends()
 
 
+def doctest_dropdb(test):
+    database = SQLiteDatabase().connect()
+    cursor = database.cursor(autocommit=True)
+    try:
+        database.drop(cursor, ':memory:')
+        cursor.commit()
+    finally:
+        cursor.close()
+
+
 def suite():
     suite = trytond.tests.test_tryton.suite()
     suite.addTests(unittest.TestLoader().loadTestsFromTestCase(
         PurchaseTestCase))
+    suite.addTests(doctest.DocFileSuite('scenario_purchase.rst',
+            setUp=doctest_dropdb, tearDown=doctest_dropdb, encoding='UTF-8',
+            optionflags=doctest.REPORT_ONLY_FIRST_FAILURE))
     return suite
 
 if __name__ == '__main__':
diff --git a/tryton.cfg b/tryton.cfg
new file mode 100644
index 0000000..1bd8331
--- /dev/null
+++ b/tryton.cfg
@@ -0,0 +1,19 @@
+[tryton]
+version=2.6.0
+depends:
+    account
+    account_invoice
+    account_product
+    company
+    currency
+    ir
+    party
+    product
+    res
+    stock
+xml:
+    purchase.xml
+    configuration.xml
+    party.xml
+    stock.xml
+    product.xml
diff --git a/trytond_purchase.egg-info/PKG-INFO b/trytond_purchase.egg-info/PKG-INFO
index d3105ac..dc1ad4c 100644
--- a/trytond_purchase.egg-info/PKG-INFO
+++ b/trytond_purchase.egg-info/PKG-INFO
@@ -1,23 +1,48 @@
 Metadata-Version: 1.0
 Name: trytond-purchase
-Version: 2.4.1
-Summary: Define purchase order.
-Add product supplier and purchase informations.
-Define the purchase price as the supplier price or the cost price.
-
-With the possibilities:
-    - to follow invoice and shipment states from the purchase order.
-    - to define invoice method:
-        - Manual
-        - Based On Order
-        - Based On Shipment
-
+Version: 2.6.0
+Summary: Tryton module for purchase
 Home-page: http://www.tryton.org/
-Author: B2CK
-Author-email: info at b2ck.com
+Author: Tryton
+Author-email: UNKNOWN
 License: GPL-3
-Download-URL: http://downloads.tryton.org/2.4/
-Description: UNKNOWN
+Download-URL: http://downloads.tryton.org/2.6/
+Description: trytond_purchase
+        ================
+        
+        The purchase module of the Tryton application platform.
+        
+        Installing
+        ----------
+        
+        See INSTALL
+        
+        Support
+        -------
+        
+        If you encounter any problems with Tryton, please don't hesitate to ask
+        questions on the Tryton bug tracker, mailing list, wiki or IRC channel:
+        
+          http://bugs.tryton.org/
+          http://groups.tryton.org/
+          http://wiki.tryton.org/
+          irc://irc.freenode.net/tryton
+        
+        License
+        -------
+        
+        See LICENSE
+        
+        Copyright
+        ---------
+        
+        See COPYRIGHT
+        
+        
+        For more information please visit the Tryton web site:
+        
+          http://www.tryton.org/
+        
 Platform: UNKNOWN
 Classifier: Development Status :: 5 - Production/Stable
 Classifier: Environment :: Plugins
diff --git a/trytond_purchase.egg-info/SOURCES.txt b/trytond_purchase.egg-info/SOURCES.txt
index 2aafab6..8504cf4 100644
--- a/trytond_purchase.egg-info/SOURCES.txt
+++ b/trytond_purchase.egg-info/SOURCES.txt
@@ -12,11 +12,12 @@ purchase.odt
 purchase.xml
 setup.py
 stock.xml
+tryton.cfg
 ./__init__.py
-./__tryton__.py
 ./configuration.py
 ./invoice.py
 ./purchase.py
+./stock.py
 ./tests/__init__.py
 ./tests/test_purchase.py
 doc/index.rst
diff --git a/trytond_purchase.egg-info/requires.txt b/trytond_purchase.egg-info/requires.txt
index a073a56..f0ae06a 100644
--- a/trytond_purchase.egg-info/requires.txt
+++ b/trytond_purchase.egg-info/requires.txt
@@ -1,9 +1,9 @@
-trytond_company >= 2.4, < 2.5
-trytond_party >= 2.4, < 2.5
-trytond_stock >= 2.4, < 2.5
-trytond_account >= 2.4, < 2.5
-trytond_product >= 2.4, < 2.5
-trytond_account_invoice >= 2.4, < 2.5
-trytond_currency >= 2.4, < 2.5
-trytond_account_product >= 2.4, < 2.5
-trytond >= 2.4, < 2.5
\ No newline at end of file
+trytond_account >= 2.6, < 2.7
+trytond_account_invoice >= 2.6, < 2.7
+trytond_account_product >= 2.6, < 2.7
+trytond_company >= 2.6, < 2.7
+trytond_currency >= 2.6, < 2.7
+trytond_party >= 2.6, < 2.7
+trytond_product >= 2.6, < 2.7
+trytond_stock >= 2.6, < 2.7
+trytond >= 2.6, < 2.7
\ No newline at end of file
commit b704a79f0727b61c437daec37582ae2484e4fcfd
Author: Mathias Behrle <mathiasb at m9s.biz>
Date:   Tue Sep 11 13:16:48 2012 +0200

    Adding upstream version 2.4.1.

diff --git a/CHANGELOG b/CHANGELOG
index 0b8e7f2..1403435 100644
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -1,3 +1,6 @@
+Version 2.4.1 - 2012-09-02
+* Bug fixes (see mercurial logs for details)
+
 Version 2.4.0 - 2012-04-24
 * Bug fixes (see mercurial logs for details)
 * Add cache on amount fields in readonly states
diff --git a/PKG-INFO b/PKG-INFO
index 046cc2c..83c8e19 100644
--- a/PKG-INFO
+++ b/PKG-INFO
@@ -1,6 +1,6 @@
 Metadata-Version: 1.0
 Name: trytond_purchase
-Version: 2.4.0
+Version: 2.4.1
 Summary: Define purchase order.
 Add product supplier and purchase informations.
 Define the purchase price as the supplier price or the cost price.
diff --git a/__tryton__.py b/__tryton__.py
index 1de5676..a470ab7 100644
--- a/__tryton__.py
+++ b/__tryton__.py
@@ -9,7 +9,7 @@
     'name_es_CO': 'Compras',
     'name_es_ES': 'Compras',
     'name_fr_FR': 'Achat',
-    'version': '2.4.0',
+    'version': '2.4.1',
     'author': 'B2CK',
     'email': 'info at b2ck.com',
     'website': 'http://www.tryton.org/',
diff --git a/purchase.py b/purchase.py
index 49cf25c..2e9d146 100644
--- a/purchase.py
+++ b/purchase.py
@@ -149,10 +149,7 @@ class Purchase(Workflow, ModelSQL, ModelView):
                 ))
         self._buttons.update({
                 'cancel': {
-                    'invisible': ((Eval('state') == 'cancel')
-                        | (~Eval('state').in_(['draft', 'quotation'])
-                            & (Eval('invoice_state') != 'exception')
-                            & (Eval('shipment_state') != 'exception'))),
+                    'invisible': ~Eval('state').in_(['draft', 'quotation']),
                     },
                 'draft': {
                     'invisible': Eval('state') != 'quotation',
@@ -356,8 +353,8 @@ class Purchase(Workflow, ModelSQL, ModelView):
 
                 with Transaction().set_context(context):
                     tax_list = tax_obj.compute(line.get('taxes', []),
-                            line.get('unit_price', Decimal('0.0')),
-                            line.get('quantity', 0.0))
+                            line.get('unit_price') or Decimal('0.0'),
+                            line.get('quantity') or 0.0)
                 for tax in tax_list:
                     key, val = invoice_obj._compute_tax(tax, 'in_invoice')
                     if not key in taxes:
@@ -697,6 +694,9 @@ class Purchase(Workflow, ModelSQL, ModelView):
         invoice_line_obj = pool.get('account.invoice.line')
         purchase_line_obj = pool.get('purchase.line')
 
+        if purchase.invoice_method == 'manual':
+            return
+
         if not purchase.party.account_payable:
             self.raise_user_error('missing_account_payable',
                     error_args=(purchase.party.rec_name,))
@@ -738,7 +738,8 @@ class Purchase(Workflow, ModelSQL, ModelView):
             line_obj.create_move(line)
 
     def is_done(self, purchase):
-        return (purchase.invoice_state == 'paid'
+        return ((purchase.invoice_state == 'paid'
+                or purchase.invoice_method == 'manual')
             and purchase.shipment_state == 'received')
 
     def delete(self, ids):
@@ -1059,7 +1060,7 @@ class PurchaseLine(ModelSQL, ModelView):
             context2['purchase_date'] = vals['_parent_purchase.purchase_date']
         with Transaction().set_context(context2):
             res['unit_price'] = product_obj.get_purchase_price([product.id],
-                    vals.get('quantity', 0))[product.id]
+                    vals.get('quantity') or 0)[product.id]
             if res['unit_price']:
                 res['unit_price'] = res['unit_price'].quantize(
                     Decimal(1) / 10 ** self.unit_price.digits[1])
@@ -1130,7 +1131,7 @@ class PurchaseLine(ModelSQL, ModelView):
             context['uom'] = vals['unit']
         with Transaction().set_context(context):
             res['unit_price'] = product_obj.get_purchase_price(
-                    [vals['product']], vals.get('quantity', 0)
+                    [vals['product']], vals.get('quantity') or 0
                     )[vals['product']]
             if res['unit_price']:
                 res['unit_price'] = res['unit_price'].quantize(
@@ -1251,17 +1252,12 @@ class PurchaseLine(ModelSQL, ModelView):
                     quantity += uom_obj.compute_qty(move.uom, move.quantity,
                             line.unit)
 
-        if line.purchase.invoices_ignored:
-            ignored_ids = set(
-                l.id for i in line.purchase.invoices_ignored for l in i.lines)
-        else:
-            ignored_ids = ()
+        skip_ids = set(l.id for i in line.purchase.invoices_recreated
+            for l in i.lines)
         for invoice_line in line.invoice_lines:
             if invoice_line.type != 'line':
                 continue
-            if ((invoice_line.invoice and
-                    invoice_line.invoice.state != 'cancel') or
-                invoice_line.id in ignored_ids):
+            if invoice_line.id not in skip_ids:
                 quantity -= uom_obj.compute_qty(invoice_line.unit,
                         invoice_line.quantity, line.unit)
         res['quantity'] = quantity
@@ -2107,6 +2103,7 @@ class HandleShipmentException(Wizard):
                 })
 
         purchase_obj.process([purchase.id])
+        return 'end'
 
 HandleShipmentException()
 
@@ -2179,5 +2176,6 @@ class HandleInvoiceException(Wizard):
             })
 
         purchase_obj.process([purchase.id])
+        return 'end'
 
 HandleInvoiceException()
diff --git a/trytond_purchase.egg-info/PKG-INFO b/trytond_purchase.egg-info/PKG-INFO
index 30b0cb2..d3105ac 100644
--- a/trytond_purchase.egg-info/PKG-INFO
+++ b/trytond_purchase.egg-info/PKG-INFO
@@ -1,6 +1,6 @@
 Metadata-Version: 1.0
 Name: trytond-purchase
-Version: 2.4.0
+Version: 2.4.1
 Summary: Define purchase order.
 Add product supplier and purchase informations.
 Define the purchase price as the supplier price or the cost price.
commit 2b3f9efec7280f8d9351412858e2226a9df921e6
Author: Mathias Behrle <mathiasb at m9s.biz>
Date:   Tue Apr 24 19:31:02 2012 +0200

    Adding upstream version 2.4.0.

diff --git a/CHANGELOG b/CHANGELOG
index 9e84f65..0b8e7f2 100644
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -1,3 +1,14 @@
+Version 2.4.0 - 2012-04-24
+* Bug fixes (see mercurial logs for details)
+* Add cache on amount fields in readonly states
+* Use the most used currency by party on the 10 last records as default value
+  for purchase and product_supplier
+* Add currency on product_supplier
+* Add a Function field delivery_date to purchase line
+* Purchase date is required only at confirmation
+* compute_supply_date returns only one date
+* warehouse is not always required
+
 Version 2.2.0 - 2011-10-25
 * Bug fixes (see mercurial logs for details)
 
diff --git a/COPYRIGHT b/COPYRIGHT
index a9feb41..ede3fac 100644
--- a/COPYRIGHT
+++ b/COPYRIGHT
@@ -1,6 +1,6 @@
-Copyright (C) 2008-2011 Cédric Krier.
-Copyright (C) 2008-2011 Bertrand Chenal.
-Copyright (C) 2008-2011 B2CK SPRL.
+Copyright (C) 2008-2012 Cédric Krier.
+Copyright (C) 2008-2012 Bertrand Chenal.
+Copyright (C) 2008-2012 B2CK SPRL.
 Copyright (C) 2004-2008 Tiny SPRL.
 
 This program is free software: you can redistribute it and/or modify
diff --git a/INSTALL b/INSTALL
index 762cf21..c52e5fb 100644
--- a/INSTALL
+++ b/INSTALL
@@ -4,7 +4,7 @@ Installing trytond_purchase
 Prerequisites
 -------------
 
- * Python 2.5 or later (http://www.python.org/)
+ * Python 2.6 or later (http://www.python.org/)
  * trytond (http://www.tryton.org/)
  * trytond_company (http://www.tryton.org/)
  * trytond_party (http://www.tryton.org/)
diff --git a/PKG-INFO b/PKG-INFO
index 0ced27d..046cc2c 100644
--- a/PKG-INFO
+++ b/PKG-INFO
@@ -1,6 +1,6 @@
 Metadata-Version: 1.0
 Name: trytond_purchase
-Version: 2.2.0
+Version: 2.4.0
 Summary: Define purchase order.
 Add product supplier and purchase informations.
 Define the purchase price as the supplier price or the cost price.
@@ -16,7 +16,7 @@ Home-page: http://www.tryton.org/
 Author: B2CK
 Author-email: info at b2ck.com
 License: GPL-3
-Download-URL: http://downloads.tryton.org/2.2/
+Download-URL: http://downloads.tryton.org/2.4/
 Description: UNKNOWN
 Platform: UNKNOWN
 Classifier: Development Status :: 5 - Production/Stable
diff --git a/__init__.py b/__init__.py
index 5c8fb9f..981f76a 100644
--- a/__init__.py
+++ b/__init__.py
@@ -1,6 +1,6 @@
 #This file is part of Tryton.  The COPYRIGHT file at the top level of
 #this repository contains the full copyright notices and license terms.
 
-from purchase import *
-from configuration import *
-from invoice import *
+from .purchase import *
+from .configuration import *
+from .invoice import *
diff --git a/__tryton__.py b/__tryton__.py
index 57f5d5f..1de5676 100644
--- a/__tryton__.py
+++ b/__tryton__.py
@@ -3,11 +3,13 @@
 {
     'name': 'Purchase',
     'name_bg_BG': 'Покупки',
+    'name_ca_ES': 'Compres',
     'name_de_DE': 'Einkauf',
+    'name_es_AR': 'Compras',
     'name_es_CO': 'Compras',
     'name_es_ES': 'Compras',
     'name_fr_FR': 'Achat',
-    'version': '2.2.0',
+    'version': '2.4.0',
     'author': 'B2CK',
     'email': 'info at b2ck.com',
     'website': 'http://www.tryton.org/',
@@ -33,6 +35,18 @@ With the possibilities:
         - Въз основа на поръчка
         - Въз основа на доставка
 ''',
+    'description_ca_ES': '''- Defineix comandes de compra.
+- Afegeix informació de proveïdor i de compra als productes.
+- Defineix el preu de compra com el preu de proveïdor o preu de cost.
+
+Amb la possibilitat de:
+
+- Seguir l'estat de facturació i enviament des de la comanda de compra.
+- Definir el mètode de facturació:
+    - Manual
+    - Basat en la comanda de compra
+    - Basat en l'albarà de sortida
+''',
     'description_de_DE': ''' - Dient der Erstellung von Einkaufsvorgängen (Entwurf, Angebot, Auftrag).
  - Fügt den Artikeln Lieferanten und Einkaufsinformationen hinzu.
  - Erlaubt die Definition des Einkaufspreises als Lieferpreis oder Einkaufspreis.
@@ -45,6 +59,17 @@ Ermöglicht:
         - Nach Auftrag
         - Nach Lieferung
 ''',
+    'description_es_AR': '''Define órdenes de compra.
+ - Añade información de proveedor y de compra de un producto.
+ - Define el precio de compra como el precio del proveedor o el precio de coste.
+
+ - Con la posibilidad de:
+    - seguir el estado de facturación y envio desde la orden de compra.
+    - definir el método de facturación:
+        - Manual
+        - Basado en orden
+        - Basado en envio
+''',
     'description_es_CO': ''' - Definición de orden de compras.
  - Se añade información de proveedor y de compra de un producto.
  - Se define el precio de compra con el precio de proveedor o costo.
@@ -56,16 +81,16 @@ Ermöglicht:
         - Basado en Orden
         - Basado en Empaque
 ''',
-    'description_es_ES': '''Define ordenes de compra.
- - Añade información de proveedor y de compra de un producto.
- - Define el precio de compra como el precio del proveedor o el precio de coste.
+    'description_es_ES': '''- Define pedidos de compra.
+- Añade información de proveedor y de compra a los productos.
+- Define el precio de compra como el precio del proveedor o el precio de coste.
 
- - Con la posibilidad de:
-    - seguir el estado de facturación y envio desde la orden de compra.
-    - definir el método de facturación:
+Con la posibilidad de:
+    - Seguir el estado de facturación y envío desde el pedido de compra.
+    - Definir el método de facturación:
         - Manual
-        - Basado en orden
-        - Basado en envio
+        - Basado en el pedido
+        - Basado en el envío
 ''',
     'description_fr_FR': '''Defini l'ordre d'achat.
 Ajoute les fournisseurs et les informations d'achat sur le produit.
@@ -85,7 +110,6 @@ Avec la possibilité:
         'account',
         'product',
         'account_invoice',
-        'workflow',
         'res',
         'ir',
         'currency',
@@ -95,11 +119,15 @@ Avec la possibilité:
         'purchase.xml',
         'configuration.xml',
         'party.xml',
+        'stock.xml',
+        'product.xml',
     ],
     'translation': [
         'locale/bg_BG.po',
+        'locale/ca_ES.po',
         'locale/cs_CZ.po',
         'locale/de_DE.po',
+        'locale/es_AR.po',
         'locale/es_CO.po',
         'locale/es_ES.po',
         'locale/fr_FR.po',
diff --git a/configuration.py b/configuration.py
index ccdae35..3974ee2 100644
--- a/configuration.py
+++ b/configuration.py
@@ -12,7 +12,7 @@ class Configuration(ModelSingleton, ModelSQL, ModelView):
     purchase_sequence = fields.Property(fields.Many2One('ir.sequence',
             'Purchase Reference Sequence', domain=[
                 ('company', 'in',
-                    [Eval('context', {}).get('company', 0), False]),
+                    [Eval('context', {}).get('company', 0), None]),
                 ('code', '=', 'purchase.purchase'),
                 ], required=True))
     purchase_invoice_method = fields.Property(fields.Selection([
diff --git a/configuration.xml b/configuration.xml
index dc837cd..8c2ad6e 100644
--- a/configuration.xml
+++ b/configuration.xml
@@ -32,14 +32,12 @@ this repository contains the full copyright notices and license terms. -->
             id="menu_purchase_configuration" icon="tryton-list"/>
 
         <record model="ir.property" id="property_purchase_sequence">
-            <field name="name">purchase_sequence</field>
             <field name="field"
                 search="[('model.model', '=', 'purchase.configuration'), ('name', '=', 'purchase_sequence')]"/>
             <field name="value" eval="'ir.sequence,' + str(ref('sequence_purchase'))"/>
         </record>
         <record model="ir.property"
             id="property_purchase_invoice_method">
-            <field name="name">purchase_invoice_method</field>
             <field name="field"
                search="[('model.model', '=', 'purchase.configuration'), ('name', '=', 'purchase_invoice_method')]" />
            <field name="value">,order</field>
diff --git a/invoice.py b/invoice.py
index 07e14b8..e1e9e08 100644
--- a/invoice.py
+++ b/invoice.py
@@ -1,21 +1,50 @@
 #This file is part of Tryton.  The COPYRIGHT file at the top level of
 #this repository contains the full copyright notices and license terms.
-from trytond.model import ModelView, ModelSQL, fields
+from trytond.model import Model, fields
+from trytond.pool import Pool
 
 
-class Invoice(ModelSQL, ModelView):
+class Invoice(Model):
     _name = 'account.invoice'
 
     purchases = fields.Many2Many('purchase.purchase-account.invoice',
             'invoice', 'purchase', 'Purchases', readonly=True)
 
+    def copy(self, ids, default=None):
+        if default is None:
+            default = {}
+        default = default.copy()
+        default.setdefault('purchases', None)
+        return super(Invoice, self).copy(ids, default=default)
+
+    def paid(self, ids):
+        pool = Pool()
+        purchase_obj = pool.get('purchase.purchase')
+        super(Invoice, self).paid(ids)
+        invoices = self.browse(ids)
+        purchase_obj.process([p.id for i in invoices for p in i.purchases])
+
+    def cancel(self, ids):
+        pool = Pool()
+        purchase_obj = pool.get('purchase.purchase')
+        super(Invoice, self).cancel(ids)
+        invoices = self.browse(ids)
+        purchase_obj.process([p.id for i in invoices for p in i.purchases])
+
 Invoice()
 
 
-class InvoiceLine(ModelSQL, ModelView):
+class InvoiceLine(Model):
     _name = 'account.invoice.line'
 
     purchase_lines = fields.Many2Many('purchase.line-account.invoice.line',
             'invoice_line', 'purchase_line', 'Purchase Lines', readonly=True)
 
+    def copy(self, ids, default=None):
+        if default is None:
+            default = {}
+        default = default.copy()
+        default.setdefault('purchase_lines', None)
+        return super(InvoiceLine, self).copy(ids, default=default)
+
 InvoiceLine()
diff --git a/locale/bg_BG.po b/locale/bg_BG.po
index e6a5e57..464320e 100644
--- a/locale/bg_BG.po
+++ b/locale/bg_BG.po
@@ -2,490 +2,762 @@
 msgid ""
 msgstr "Content-Type: text/plain; charset=utf-8\n"
 
-msgctxt "error:account.invoice:0"
+msgctxt "error:account.invoice:"
 msgid "You can not delete invoices that come from a purchase!"
 msgstr "Не може да изтривате фактури които идват от покупка!"
 
-msgctxt "error:account.invoice:0"
+msgctxt "error:account.invoice:"
 msgid "You cannot reset to draft an invoice generated by a purchase."
 msgstr "Не може да прехвърляте в проект фактура генерирана при покупка."
 
-msgctxt "error:product.template:0"
+msgctxt "error:product.template:"
 msgid ""
 "Purchase prices are based on the purchase uom, are you sure to change it?"
 msgstr ""
 "Покупните цени се основават мер, ед, на покупката, сигурни ли сте че искате "
 "да я смените?"
 
-msgctxt "error:purchase.line:0"
+msgctxt "error:purchase.line:"
 msgid "It misses an \"Account Expense\" on product \"%s\"!"
 msgstr "Не е зададена \"Сметка за разходи\" за продукт \"%s\"!"
 
-msgctxt "error:purchase.line:0"
+msgctxt "error:purchase.line:"
 msgid "It misses an \"account expense\" default property!"
 msgstr "Няма е зададено свойство по подразбиране \"Сметка за разходи\"!"
 
-msgctxt "error:purchase.line:0"
+msgctxt "error:purchase.line:"
 msgid "The supplier location is required!"
 msgstr "Местонахождението на доставчика е задължително!"
 
-msgctxt "error:purchase.purchase:0"
+msgctxt "error:purchase.purchase:"
+msgid "A warehouse must be defined for the quotation."
+msgstr ""
+
+msgctxt "error:purchase.purchase:"
 msgid "Invoice addresses must be defined for the quotation."
 msgstr "За запитването трябва да бъдат зададени адреси за фактуриране ."
 
-msgctxt "error:purchase.purchase:0"
+msgctxt "error:purchase.purchase:"
 msgid "It misses an \"Account Payable\" on the party \"%s\"!"
 msgstr "Липсва \"Разходна сметка\" за партньор \"%s\"!"
 
-msgctxt "error:stock.shipment.in:0"
+msgctxt "error:purchase.purchase:"
+msgid "Purchase \"%s\" must be cancelled before deletion!"
+msgstr "Покупка \"%s\" трябва да бъде отказана преди да жъде изтрита!"
+
+msgctxt "error:stock.shipment.in:"
 msgid "You cannot reset to draft a move generated by a purchase."
 msgstr "Не може да преместите в проект движение създадено от покупка."
 
-msgctxt "field:account.invoice,purchase_exception_state:0"
+msgctxt "field:account.invoice,purchase_exception_state:"
 msgid "Exception State"
 msgstr "Състояние на грешка"
 
-msgctxt "field:account.invoice,purchases:0"
+msgctxt "field:account.invoice,purchases:"
 msgid "Purchases"
 msgstr "Покупки"
 
-msgctxt "field:account.invoice.line,purchase_lines:0"
+msgctxt "field:account.invoice.line,purchase_lines:"
 msgid "Purchase Lines"
 msgstr "Редове от покупка"
 
-msgctxt "field:product.template,product_suppliers:0"
+msgctxt "field:product.template,product_suppliers:"
 msgid "Suppliers"
 msgstr "Доставчици"
 
-msgctxt "field:product.template,purchasable:0"
+msgctxt "field:product.template,purchasable:"
 msgid "Purchasable"
 msgstr "Купуваем"
 
-msgctxt "field:product.template,purchase_uom:0"
+msgctxt "field:product.template,purchase_uom:"
 msgid "Purchase UOM"
 msgstr "Мер. ед. на покупка"
 
-msgctxt "field:purchase.configuration,purchase_invoice_method:0"
+msgctxt "field:purchase.configuration,create_date:"
+msgid "Create Date"
+msgstr "Създадено на"
+
+msgctxt "field:purchase.configuration,create_uid:"
+msgid "Create User"
+msgstr "Създадено от"
+
+msgctxt "field:purchase.configuration,id:"
+msgid "ID"
+msgstr "ID"
+
+msgctxt "field:purchase.configuration,purchase_invoice_method:"
 msgid "Invoice Method"
 msgstr "Начин на фактуриране"
 
-msgctxt "field:purchase.configuration,purchase_sequence:0"
+msgctxt "field:purchase.configuration,purchase_sequence:"
 msgid "Purchase Reference Sequence"
 msgstr "Последователност за отпратка на покупка"
 
-msgctxt "field:purchase.configuration,rec_name:0"
+msgctxt "field:purchase.configuration,rec_name:"
 msgid "Name"
 msgstr "Име"
 
-msgctxt "field:purchase.handle.invoice.exception.ask,domain_invoices:0"
+msgctxt "field:purchase.configuration,write_date:"
+msgid "Write Date"
+msgstr "Променено на"
+
+msgctxt "field:purchase.configuration,write_uid:"
+msgid "Write User"
+msgstr "Променено от"
+
+msgctxt "field:purchase.handle.invoice.exception.ask,domain_invoices:"
 msgid "Domain Invoices"
 msgstr "Фактури на домейн"
 
-msgctxt "field:purchase.handle.invoice.exception.ask,recreate_invoices:0"
+msgctxt "field:purchase.handle.invoice.exception.ask,id:"
+msgid "ID"
+msgstr "ID"
+
+msgctxt "field:purchase.handle.invoice.exception.ask,recreate_invoices:"
 msgid "Recreate Invoices"
 msgstr "Наново създаване на фактури"
 
-msgctxt "field:purchase.handle.shipment.exception.ask,domain_moves:0"
+msgctxt "field:purchase.handle.shipment.exception.ask,domain_moves:"
 msgid "Domain Moves"
 msgstr "Движение на домейн"
 
-msgctxt "field:purchase.handle.shipment.exception.ask,recreate_moves:0"
+msgctxt "field:purchase.handle.shipment.exception.ask,id:"
+msgid "ID"
+msgstr "ID"
+
+msgctxt "field:purchase.handle.shipment.exception.ask,recreate_moves:"
 msgid "Recreate Moves"
 msgstr "Наново създаване на движения"
 
-msgctxt "field:purchase.line,amount:0"
+msgctxt "field:purchase.line,amount:"
 msgid "Amount"
 msgstr "Сума"
 
-msgctxt "field:purchase.line,description:0"
+msgctxt "field:purchase.line,create_date:"
+msgid "Create Date"
+msgstr "Създадено на"
+
+msgctxt "field:purchase.line,create_uid:"
+msgid "Create User"
+msgstr "Създадено от"
+
+msgctxt "field:purchase.line,delivery_date:"
+msgid "Delivery Date"
+msgstr ""
+
+msgctxt "field:purchase.line,description:"
 msgid "Description"
 msgstr "Описание"
 
-msgctxt "field:purchase.line,invoice_lines:0"
+msgctxt "field:purchase.line,from_location:"
+msgid "From Location"
+msgstr "От местонахождение"
+
+msgctxt "field:purchase.line,id:"
+msgid "ID"
+msgstr "ID"
+
+msgctxt "field:purchase.line,invoice_lines:"
 msgid "Invoice Lines"
 msgstr "Редове от фактура"
 
-msgctxt "field:purchase.line,move_done:0"
+msgctxt "field:purchase.line,move_done:"
 msgid "Moves Done"
 msgstr "Направени движения"
 
-msgctxt "field:purchase.line,move_exception:0"
+msgctxt "field:purchase.line,move_exception:"
 msgid "Moves Exception"
 msgstr "Грешка при движение"
 
-msgctxt "field:purchase.line,moves:0"
+msgctxt "field:purchase.line,moves:"
 msgid "Moves"
 msgstr "Движения"
 
-msgctxt "field:purchase.line,moves_ignored:0"
+msgctxt "field:purchase.line,moves_ignored:"
 msgid "Ignored Moves"
 msgstr "Игнорирани движения"
 
-msgctxt "field:purchase.line,moves_recreated:0"
+msgctxt "field:purchase.line,moves_recreated:"
 msgid "Recreated Moves"
 msgstr "Наново създаване на движения"
 
-msgctxt "field:purchase.line,note:0"
+msgctxt "field:purchase.line,note:"
 msgid "Note"
 msgstr "Бележка"
 
-msgctxt "field:purchase.line,product:0"
+msgctxt "field:purchase.line,product:"
 msgid "Product"
 msgstr "Продукт"
 
-msgctxt "field:purchase.line,purchase:0"
+msgctxt "field:purchase.line,product_uom_category:"
+msgid "Product Uom Category"
+msgstr ""
+
+msgctxt "field:purchase.line,purchase:"
 msgid "Purchase"
 msgstr "Покупка"
 
-msgctxt "field:purchase.line,quantity:0"
+msgctxt "field:purchase.line,quantity:"
 msgid "Quantity"
 msgstr "Количество"
 
-msgctxt "field:purchase.line,rec_name:0"
+msgctxt "field:purchase.line,rec_name:"
 msgid "Name"
 msgstr "Име"
 
-msgctxt "field:purchase.line,sequence:0"
+msgctxt "field:purchase.line,sequence:"
 msgid "Sequence"
 msgstr "Последователност"
 
-msgctxt "field:purchase.line,taxes:0"
+msgctxt "field:purchase.line,taxes:"
 msgid "Taxes"
 msgstr "Данъци"
 
-msgctxt "field:purchase.line,type:0"
+msgctxt "field:purchase.line,to_location:"
+msgid "To Location"
+msgstr "Към местонахождение"
+
+msgctxt "field:purchase.line,type:"
 msgid "Type"
 msgstr "Вид"
 
-msgctxt "field:purchase.line,unit:0"
+msgctxt "field:purchase.line,unit:"
 msgid "Unit"
 msgstr "Единица"
 
-msgctxt "field:purchase.line,unit_digits:0"
+msgctxt "field:purchase.line,unit_digits:"
 msgid "Unit Digits"
 msgstr "Десетични единици"
 
-msgctxt "field:purchase.line,unit_price:0"
+msgctxt "field:purchase.line,unit_price:"
 msgid "Unit Price"
 msgstr "Единична цена"
 
-msgctxt "field:purchase.line-account.invoice.line,invoice_line:0"
+msgctxt "field:purchase.line,write_date:"
+msgid "Write Date"
+msgstr "Променено на"
+
+msgctxt "field:purchase.line,write_uid:"
+msgid "Write User"
+msgstr "Променено от"
+
+msgctxt "field:purchase.line-account.invoice.line,create_date:"
+msgid "Create Date"
+msgstr "Създадено на"
+
+msgctxt "field:purchase.line-account.invoice.line,create_uid:"
+msgid "Create User"
+msgstr "Създадено от"
+
+msgctxt "field:purchase.line-account.invoice.line,id:"
+msgid "ID"
+msgstr "ID"
+
+msgctxt "field:purchase.line-account.invoice.line,invoice_line:"
 msgid "Invoice Line"
 msgstr "Ред от фактура"
 
-msgctxt "field:purchase.line-account.invoice.line,purchase_line:0"
+msgctxt "field:purchase.line-account.invoice.line,purchase_line:"
 msgid "Purchase Line"
 msgstr "Ред от покупка"
 
-msgctxt "field:purchase.line-account.invoice.line,rec_name:0"
+msgctxt "field:purchase.line-account.invoice.line,rec_name:"
 msgid "Name"
 msgstr "Име"
 
-msgctxt "field:purchase.line-account.tax,line:0"
+msgctxt "field:purchase.line-account.invoice.line,write_date:"
+msgid "Write Date"
+msgstr "Променено на"
+
+msgctxt "field:purchase.line-account.invoice.line,write_uid:"
+msgid "Write User"
+msgstr "Променено от"
+
+msgctxt "field:purchase.line-account.tax,create_date:"
+msgid "Create Date"
+msgstr "Създадено на"
+
+msgctxt "field:purchase.line-account.tax,create_uid:"
+msgid "Create User"
+msgstr "Създадено от"
+
+msgctxt "field:purchase.line-account.tax,id:"
+msgid "ID"
+msgstr "ID"
+
+msgctxt "field:purchase.line-account.tax,line:"
 msgid "Purchase Line"
 msgstr "Ред от покупка"
 
-msgctxt "field:purchase.line-account.tax,rec_name:0"
+msgctxt "field:purchase.line-account.tax,rec_name:"
 msgid "Name"
 msgstr "Име"
 
-msgctxt "field:purchase.line-account.tax,tax:0"
+msgctxt "field:purchase.line-account.tax,tax:"
 msgid "Tax"
 msgstr "Данък"
 
-msgctxt "field:purchase.line-ignored-stock.move,move:0"
+msgctxt "field:purchase.line-account.tax,write_date:"
+msgid "Write Date"
+msgstr "Променено на"
+
+msgctxt "field:purchase.line-account.tax,write_uid:"
+msgid "Write User"
+msgstr "Променено от"
+
+msgctxt "field:purchase.line-ignored-stock.move,create_date:"
+msgid "Create Date"
+msgstr "Създадено на"
+
+msgctxt "field:purchase.line-ignored-stock.move,create_uid:"
+msgid "Create User"
+msgstr "Създадено от"
+
+msgctxt "field:purchase.line-ignored-stock.move,id:"
+msgid "ID"
+msgstr "ID"
+
+msgctxt "field:purchase.line-ignored-stock.move,move:"
 msgid "Move"
 msgstr "Движение"
 
-msgctxt "field:purchase.line-ignored-stock.move,purchase_line:0"
+msgctxt "field:purchase.line-ignored-stock.move,purchase_line:"
 msgid "Purchase Line"
 msgstr "Ред от покупка"
 
-msgctxt "field:purchase.line-ignored-stock.move,rec_name:0"
+msgctxt "field:purchase.line-ignored-stock.move,rec_name:"
 msgid "Name"
 msgstr "Име"
 
-msgctxt "field:purchase.line-recreated-stock.move,move:0"
+msgctxt "field:purchase.line-ignored-stock.move,write_date:"
+msgid "Write Date"
+msgstr "Променено на"
+
+msgctxt "field:purchase.line-ignored-stock.move,write_uid:"
+msgid "Write User"
+msgstr "Променено от"
+
+msgctxt "field:purchase.line-recreated-stock.move,create_date:"
+msgid "Create Date"
+msgstr "Създадено на"
+
+msgctxt "field:purchase.line-recreated-stock.move,create_uid:"
+msgid "Create User"
+msgstr "Създадено от"
+
+msgctxt "field:purchase.line-recreated-stock.move,id:"
+msgid "ID"
+msgstr "ID"
+
+msgctxt "field:purchase.line-recreated-stock.move,move:"
 msgid "Move"
 msgstr "Движение"
 
-msgctxt "field:purchase.line-recreated-stock.move,purchase_line:0"
+msgctxt "field:purchase.line-recreated-stock.move,purchase_line:"
 msgid "Purchase Line"
 msgstr "Ред от покупка"
 
-msgctxt "field:purchase.line-recreated-stock.move,rec_name:0"
+msgctxt "field:purchase.line-recreated-stock.move,rec_name:"
 msgid "Name"
 msgstr "Име"
 
-msgctxt "field:purchase.product_supplier,code:0"
+msgctxt "field:purchase.line-recreated-stock.move,write_date:"
+msgid "Write Date"
+msgstr "Променено на"
+
+msgctxt "field:purchase.line-recreated-stock.move,write_uid:"
+msgid "Write User"
+msgstr "Променено от"
+
+msgctxt "field:purchase.product_supplier,code:"
 msgid "Code"
 msgstr "Код"
 
-msgctxt "field:purchase.product_supplier,company:0"
+msgctxt "field:purchase.product_supplier,company:"
 msgid "Company"
 msgstr "Фирма"
 
-msgctxt "field:purchase.product_supplier,delivery_time:0"
+msgctxt "field:purchase.product_supplier,create_date:"
+msgid "Create Date"
+msgstr "Създадено на"
+
+msgctxt "field:purchase.product_supplier,create_uid:"
+msgid "Create User"
+msgstr "Създадено от"
+
+msgctxt "field:purchase.product_supplier,currency:"
+msgid "Currency"
+msgstr "Валута"
+
+msgctxt "field:purchase.product_supplier,delivery_time:"
 msgid "Delivery Time"
 msgstr "Време за доставка"
 
-msgctxt "field:purchase.product_supplier,name:0"
+msgctxt "field:purchase.product_supplier,id:"
+msgid "ID"
+msgstr "ID"
+
+msgctxt "field:purchase.product_supplier,name:"
 msgid "Name"
 msgstr "Име"
 
-msgctxt "field:purchase.product_supplier,party:0"
+msgctxt "field:purchase.product_supplier,party:"
 msgid "Supplier"
 msgstr "Доставчик"
 
-msgctxt "field:purchase.product_supplier,prices:0"
+msgctxt "field:purchase.product_supplier,prices:"
 msgid "Prices"
 msgstr "Цени"
 
-msgctxt "field:purchase.product_supplier,product:0"
+msgctxt "field:purchase.product_supplier,product:"
 msgid "Product"
 msgstr "Продукт"
 
-msgctxt "field:purchase.product_supplier,rec_name:0"
+msgctxt "field:purchase.product_supplier,rec_name:"
 msgid "Name"
 msgstr "Име"
 
-msgctxt "field:purchase.product_supplier,sequence:0"
+msgctxt "field:purchase.product_supplier,sequence:"
 msgid "Sequence"
 msgstr "Последователност"
 
-msgctxt "field:purchase.product_supplier.price,product_supplier:0"
+msgctxt "field:purchase.product_supplier,write_date:"
+msgid "Write Date"
+msgstr "Променено на"
+
+msgctxt "field:purchase.product_supplier,write_uid:"
+msgid "Write User"
+msgstr "Променено от"
+
+msgctxt "field:purchase.product_supplier.price,create_date:"
+msgid "Create Date"
+msgstr "Създадено на"
+
+msgctxt "field:purchase.product_supplier.price,create_uid:"
+msgid "Create User"
+msgstr "Създадено от"
+
+msgctxt "field:purchase.product_supplier.price,id:"
+msgid "ID"
+msgstr "ID"
+
+msgctxt "field:purchase.product_supplier.price,product_supplier:"
 msgid "Supplier"
 msgstr "Доставчик"
 
-msgctxt "field:purchase.product_supplier.price,quantity:0"
+msgctxt "field:purchase.product_supplier.price,quantity:"
 msgid "Quantity"
 msgstr "Количество"
 
-msgctxt "field:purchase.product_supplier.price,rec_name:0"
+msgctxt "field:purchase.product_supplier.price,rec_name:"
 msgid "Name"
 msgstr "Име"
 
-msgctxt "field:purchase.product_supplier.price,unit_price:0"
+msgctxt "field:purchase.product_supplier.price,unit_price:"
 msgid "Unit Price"
 msgstr "Единична цена"
 
-msgctxt "field:purchase.purchase,comment:0"
+msgctxt "field:purchase.product_supplier.price,write_date:"
+msgid "Write Date"
+msgstr "Променено на"
+
+msgctxt "field:purchase.product_supplier.price,write_uid:"
+msgid "Write User"
+msgstr "Променено от"
+
+msgctxt "field:purchase.purchase,comment:"
 msgid "Comment"
 msgstr "Коментар"
 
-msgctxt "field:purchase.purchase,company:0"
+msgctxt "field:purchase.purchase,company:"
 msgid "Company"
 msgstr "Фирма"
 
-msgctxt "field:purchase.purchase,currency:0"
+msgctxt "field:purchase.purchase,create_date:"
+msgid "Create Date"
+msgstr "Създадено на"
+
+msgctxt "field:purchase.purchase,create_uid:"
+msgid "Create User"
+msgstr "Създадено от"
+
+msgctxt "field:purchase.purchase,currency:"
 msgid "Currency"
 msgstr "Валута"
 
-msgctxt "field:purchase.purchase,currency_digits:0"
+msgctxt "field:purchase.purchase,currency_digits:"
 msgid "Currency Digits"
 msgstr "Цифри за валута"
 
-msgctxt "field:purchase.purchase,description:0"
+msgctxt "field:purchase.purchase,description:"
 msgid "Description"
 msgstr "Описание"
 
-msgctxt "field:purchase.purchase,invoice_address:0"
+msgctxt "field:purchase.purchase,id:"
+msgid "ID"
+msgstr "ID"
+
+msgctxt "field:purchase.purchase,invoice_address:"
 msgid "Invoice Address"
 msgstr "Адрес за фактура"
 
-msgctxt "field:purchase.purchase,invoice_exception:0"
-msgid "Invoices Exception"
-msgstr "Грешка при фактури"
-
-msgctxt "field:purchase.purchase,invoice_method:0"
+msgctxt "field:purchase.purchase,invoice_method:"
 msgid "Invoice Method"
 msgstr "Начин на фактуриране"
 
-msgctxt "field:purchase.purchase,invoice_paid:0"
-msgid "Invoices Paid"
-msgstr "Платени фактури"
-
-msgctxt "field:purchase.purchase,invoice_state:0"
+msgctxt "field:purchase.purchase,invoice_state:"
 msgid "Invoice State"
 msgstr "Състояние на фактура"
 
-msgctxt "field:purchase.purchase,invoices:0"
+msgctxt "field:purchase.purchase,invoices:"
 msgid "Invoices"
 msgstr "Фактури"
 
-msgctxt "field:purchase.purchase,invoices_ignored:0"
+msgctxt "field:purchase.purchase,invoices_ignored:"
 msgid "Ignored Invoices"
 msgstr "Игнорирани фактури"
 
-msgctxt "field:purchase.purchase,invoices_recreated:0"
+msgctxt "field:purchase.purchase,invoices_recreated:"
 msgid "Recreated Invoices"
 msgstr "Наново създадени на фактури"
 
-msgctxt "field:purchase.purchase,lines:0"
+msgctxt "field:purchase.purchase,lines:"
 msgid "Lines"
 msgstr "Редове"
 
-msgctxt "field:purchase.purchase,moves:0"
+msgctxt "field:purchase.purchase,moves:"
 msgid "Moves"
 msgstr "Движения"
 
-msgctxt "field:purchase.purchase,party:0"
+msgctxt "field:purchase.purchase,party:"
 msgid "Party"
 msgstr "Партньор"
 
-msgctxt "field:purchase.purchase,party_lang:0"
+msgctxt "field:purchase.purchase,party_lang:"
 msgid "Party Language"
 msgstr "Език на партньор"
 
-msgctxt "field:purchase.purchase,payment_term:0"
+msgctxt "field:purchase.purchase,payment_term:"
 msgid "Payment Term"
 msgstr "Условие за плащане"
 
-msgctxt "field:purchase.purchase,purchase_date:0"
+msgctxt "field:purchase.purchase,purchase_date:"
 msgid "Purchase Date"
 msgstr "Дата на покупка"
 
-msgctxt "field:purchase.purchase,rec_name:0"
+msgctxt "field:purchase.purchase,rec_name:"
 msgid "Name"
 msgstr "Име"
 
-msgctxt "field:purchase.purchase,reference:0"
+msgctxt "field:purchase.purchase,reference:"
 msgid "Reference"
 msgstr "Отпратка"
 
-msgctxt "field:purchase.purchase,shipment_done:0"
-msgid "Shipment Done"
-msgstr "Направена пратка"
-
-msgctxt "field:purchase.purchase,shipment_exception:0"
-msgid "Shipments Exception"
-msgstr "Грешка при пратка"
-
-msgctxt "field:purchase.purchase,shipment_state:0"
+msgctxt "field:purchase.purchase,shipment_state:"
 msgid "Shipment State"
 msgstr "Състояние на пратка"
 
-msgctxt "field:purchase.purchase,shipments:0"
+msgctxt "field:purchase.purchase,shipments:"
 msgid "Shipments"
 msgstr "Изпращания"
 
-msgctxt "field:purchase.purchase,state:0"
+msgctxt "field:purchase.purchase,state:"
 msgid "State"
 msgstr "Състояние"
 
-msgctxt "field:purchase.purchase,supplier_reference:0"
+msgctxt "field:purchase.purchase,supplier_reference:"
 msgid "Supplier Reference"
 msgstr "Отпратка към доставчик"
 
-msgctxt "field:purchase.purchase,tax_amount:0"
+msgctxt "field:purchase.purchase,tax_amount:"
 msgid "Tax"
 msgstr "Данък"
 
-msgctxt "field:purchase.purchase,total_amount:0"
+msgctxt "field:purchase.purchase,tax_amount_cache:"
+msgid "Tax Cache"
+msgstr "Данък в брой"
+
+msgctxt "field:purchase.purchase,total_amount:"
 msgid "Total"
 msgstr "Общо"
 
-msgctxt "field:purchase.purchase,untaxed_amount:0"
+msgctxt "field:purchase.purchase,total_amount_cache:"
+msgid "Total Cache"
+msgstr "Общо налични"
+
+msgctxt "field:purchase.purchase,untaxed_amount:"
 msgid "Untaxed"
 msgstr "Необложен с данък"
 
-msgctxt "field:purchase.purchase,warehouse:0"
+msgctxt "field:purchase.purchase,untaxed_amount_cache:"
+msgid "Untaxed Cache"
+msgstr "Наличност преди данъци"
+
+msgctxt "field:purchase.purchase,warehouse:"
 msgid "Warehouse"
 msgstr "Склад"
 
-msgctxt "field:purchase.purchase-account.invoice,invoice:0"
+msgctxt "field:purchase.purchase,write_date:"
+msgid "Write Date"
+msgstr "Променено на"
+
+msgctxt "field:purchase.purchase,write_uid:"
+msgid "Write User"
+msgstr "Променено от"
+
+msgctxt "field:purchase.purchase-account.invoice,create_date:"
+msgid "Create Date"
+msgstr "Създадено на"
+
+msgctxt "field:purchase.purchase-account.invoice,create_uid:"
+msgid "Create User"
+msgstr "Създадено от"
+
+msgctxt "field:purchase.purchase-account.invoice,id:"
+msgid "ID"
+msgstr "ID"
+
+msgctxt "field:purchase.purchase-account.invoice,invoice:"
 msgid "Invoice"
 msgstr "Фактура"
 
-msgctxt "field:purchase.purchase-account.invoice,purchase:0"
+msgctxt "field:purchase.purchase-account.invoice,purchase:"
 msgid "Purchase"
 msgstr "Покупка"
 
-msgctxt "field:purchase.purchase-account.invoice,rec_name:0"
+msgctxt "field:purchase.purchase-account.invoice,rec_name:"
 msgid "Name"
 msgstr "Име"
 
-msgctxt "field:purchase.purchase-ignored-account.invoice,invoice:0"
+msgctxt "field:purchase.purchase-account.invoice,write_date:"
+msgid "Write Date"
+msgstr "Променено на"
+
+msgctxt "field:purchase.purchase-account.invoice,write_uid:"
+msgid "Write User"
+msgstr "Променено от"
+
+msgctxt "field:purchase.purchase-ignored-account.invoice,create_date:"
+msgid "Create Date"
+msgstr "Създадено на"
+
+msgctxt "field:purchase.purchase-ignored-account.invoice,create_uid:"
+msgid "Create User"
+msgstr "Създадено от"
+
+msgctxt "field:purchase.purchase-ignored-account.invoice,id:"
+msgid "ID"
+msgstr "ID"
+
+msgctxt "field:purchase.purchase-ignored-account.invoice,invoice:"
 msgid "Invoice"
 msgstr "Фактура"
 
-msgctxt "field:purchase.purchase-ignored-account.invoice,purchase:0"
+msgctxt "field:purchase.purchase-ignored-account.invoice,purchase:"
 msgid "Purchase"
 msgstr "Покупка"
 
-msgctxt "field:purchase.purchase-ignored-account.invoice,rec_name:0"
+msgctxt "field:purchase.purchase-ignored-account.invoice,rec_name:"
 msgid "Name"
 msgstr "Име"
 
-msgctxt "field:purchase.purchase-recreated-account.invoice,invoice:0"
+msgctxt "field:purchase.purchase-ignored-account.invoice,write_date:"
+msgid "Write Date"
+msgstr "Променено на"
+
+msgctxt "field:purchase.purchase-ignored-account.invoice,write_uid:"
+msgid "Write User"
+msgstr "Променено от"
+
+msgctxt "field:purchase.purchase-recreated-account.invoice,create_date:"
+msgid "Create Date"
+msgstr "Създадено на"
+
+msgctxt "field:purchase.purchase-recreated-account.invoice,create_uid:"
+msgid "Create User"
+msgstr "Създадено от"
+
+msgctxt "field:purchase.purchase-recreated-account.invoice,id:"
+msgid "ID"
+msgstr "ID"
+
+msgctxt "field:purchase.purchase-recreated-account.invoice,invoice:"
 msgid "Invoice"
 msgstr "Фактура"
 
-msgctxt "field:purchase.purchase-recreated-account.invoice,purchase:0"
+msgctxt "field:purchase.purchase-recreated-account.invoice,purchase:"
 msgid "Purchase"
 msgstr "Покупка"
 
-msgctxt "field:purchase.purchase-recreated-account.invoice,rec_name:0"
+msgctxt "field:purchase.purchase-recreated-account.invoice,rec_name:"
 msgid "Name"
 msgstr "Име"
 
-msgctxt "field:stock.move,purchase:0"
+msgctxt "field:purchase.purchase-recreated-account.invoice,write_date:"
+msgid "Write Date"
+msgstr "Променено на"
+
+msgctxt "field:purchase.purchase-recreated-account.invoice,write_uid:"
+msgid "Write User"
+msgstr "Променено от"
+
+msgctxt "field:stock.move,purchase:"
 msgid "Purchase"
 msgstr "Покупка"
 
-msgctxt "field:stock.move,purchase_currency:0"
+msgctxt "field:stock.move,purchase_currency:"
 msgid "Purchase Currency"
 msgstr "Валута на покупка"
 
-msgctxt "field:stock.move,purchase_exception_state:0"
+msgctxt "field:stock.move,purchase_exception_state:"
 msgid "Exception State"
 msgstr "Състояние на грешка"
 
-msgctxt "field:stock.move,purchase_line:0"
+msgctxt "field:stock.move,purchase_line:"
 msgid "Purchase Line"
 msgstr "Ред от покупка"
 
-msgctxt "field:stock.move,purchase_quantity:0"
+msgctxt "field:stock.move,purchase_quantity:"
 msgid "Purchase Quantity"
 msgstr "Количество на покупка"
 
-msgctxt "field:stock.move,purchase_unit:0"
+msgctxt "field:stock.move,purchase_unit:"
 msgid "Purchase Unit"
 msgstr "Единица на покупка"
 
-msgctxt "field:stock.move,purchase_unit_digits:0"
+msgctxt "field:stock.move,purchase_unit_digits:"
 msgid "Purchase Unit Digits"
 msgstr "Десетични единици на покупка"
 
-msgctxt "field:stock.move,purchase_unit_price:0"
+msgctxt "field:stock.move,purchase_unit_price:"
 msgid "Purchase Unit Price"
 msgstr "Единична цена при покупка"
 
-msgctxt "field:stock.move,purchase_visible:0"
+msgctxt "field:stock.move,purchase_visible:"
 msgid "Purchase Visible"
 msgstr "Покупката е видима"
 
-msgctxt "field:stock.move,supplier:0"
+msgctxt "field:stock.move,supplier:"
 msgid "Supplier"
 msgstr "Доставчик"
 
-msgctxt "help:purchase.handle.invoice.exception.ask,recreate_invoices:0"
+msgctxt "help:purchase.handle.invoice.exception.ask,recreate_invoices:"
 msgid ""
 "The selected invoices will be recreated. The other ones will be ignored."
 msgstr ""
 "Избраните фактури ще бъдат наново създадени. Останалите ще бъдат игнорирани."
 
-msgctxt "help:purchase.handle.shipment.exception.ask,recreate_moves:0"
+msgctxt "help:purchase.handle.shipment.exception.ask,recreate_moves:"
 msgid "The selected moves will be recreated. The other ones will be ignored."
 msgstr ""
 "Избраните движение ще бъдат наново създадени, Останалите ще бъдат "
 "игнорирани."
 
-msgctxt "help:purchase.product_supplier,delivery_time:0"
+msgctxt "help:purchase.product_supplier,delivery_time:"
 msgid "In number of days"
 msgstr "В брой дни"
 
-msgctxt "help:purchase.product_supplier.price,quantity:0"
+msgctxt "help:purchase.product_supplier.price,quantity:"
 msgid "Minimal quantity"
 msgstr "Минимално количество"
 
@@ -549,7 +821,6 @@ msgctxt "model:ir.ui.menu,name:menu_configuration"
 msgid "Configuration"
 msgstr "Конфигурация"
 
-#, fuzzy
 msgctxt "model:ir.ui.menu,name:menu_purchase"
 msgid "Purchase"
 msgstr "Управление на покупки"
@@ -582,59 +853,61 @@ msgctxt "model:ir.ui.menu,name:menu_supplier"
 msgid "Parties associated to Purchases"
 msgstr "Партньори свързани с покупки"
 
-msgctxt "model:purchase.configuration,name:0"
+msgctxt "model:purchase.configuration,name:"
 msgid "Purchase Configuration"
 msgstr "Конфигуриране на покупка"
 
-msgctxt "model:purchase.handle.invoice.exception.ask,name:0"
-msgid "Invoice Exception Ask"
-msgstr "Запитване за грешка в фактура"
+#, fuzzy
+msgctxt "model:purchase.handle.invoice.exception.ask,name:"
+msgid "Handle Invoice Exception"
+msgstr "Обработване на грешка в фактура"
 
-msgctxt "model:purchase.handle.shipment.exception.ask,name:0"
-msgid "Shipment Exception Ask"
-msgstr "Запитване за грешка при пратка"
+#, fuzzy
+msgctxt "model:purchase.handle.shipment.exception.ask,name:"
+msgid "Handle Shipment Exception"
+msgstr "Обработване за грешка при пратка"
 
-msgctxt "model:purchase.line,name:0"
+msgctxt "model:purchase.line,name:"
 msgid "Purchase Line"
 msgstr "Ред от покупка"
 
-msgctxt "model:purchase.line-account.invoice.line,name:0"
+msgctxt "model:purchase.line-account.invoice.line,name:"
 msgid "Purchase Line - Invoice Line"
 msgstr "Ред от покупка - Ред от фактура"
 
-msgctxt "model:purchase.line-account.tax,name:0"
+msgctxt "model:purchase.line-account.tax,name:"
 msgid "Purchase Line - Tax"
 msgstr "Ред от покупка - Данък"
 
-msgctxt "model:purchase.line-ignored-stock.move,name:0"
+msgctxt "model:purchase.line-ignored-stock.move,name:"
 msgid "Purchase Line - Ignored Move"
 msgstr "Ред от покупка - Игнорирано движение"
 
-msgctxt "model:purchase.line-recreated-stock.move,name:0"
+msgctxt "model:purchase.line-recreated-stock.move,name:"
 msgid "Purchase Line - Ignored Move"
 msgstr "Ред от покупка - Игнорирано движение"
 
-msgctxt "model:purchase.product_supplier,name:0"
+msgctxt "model:purchase.product_supplier,name:"
 msgid "Product Supplier"
 msgstr "Доставчик на продукт"
 
-msgctxt "model:purchase.product_supplier.price,name:0"
+msgctxt "model:purchase.product_supplier.price,name:"
 msgid "Product Supplier Price"
 msgstr "Цена на доставчик на продукт"
 
-msgctxt "model:purchase.purchase,name:0"
+msgctxt "model:purchase.purchase,name:"
 msgid "Purchase"
 msgstr "Покупка"
 
-msgctxt "model:purchase.purchase-account.invoice,name:0"
+msgctxt "model:purchase.purchase-account.invoice,name:"
 msgid "Purchase - Invoice"
 msgstr "Покупка - Фактура"
 
-msgctxt "model:purchase.purchase-ignored-account.invoice,name:0"
+msgctxt "model:purchase.purchase-ignored-account.invoice,name:"
 msgid "Purchase - Ignored Invoice"
 msgstr "Покупка - Игнорирана фактура"
 
-msgctxt "model:purchase.purchase-recreated-account.invoice,name:0"
+msgctxt "model:purchase.purchase-recreated-account.invoice,name:"
 msgid "Purchase - Recreated Invoice"
 msgstr "Покупка - Наново създаване на фактури"
 
@@ -646,409 +919,342 @@ msgctxt "model:res.group,name:group_purchase_admin"
 msgid "Purchase Administrator"
 msgstr "Отгоровник за покупки"
 
-msgctxt "model:workflow,name:purchase_workflow"
-msgid "Purchase workflow"
-msgstr "Работен процес на покупка"
-
-msgctxt "model:workflow.activity,name:purchase_activity_cancel"
-msgid "Canceled"
-msgstr "Отказан"
-
-msgctxt "model:workflow.activity,name:purchase_activity_confirmed"
-msgid "Confirmed"
-msgstr "Потвърден"
-
-msgctxt "model:workflow.activity,name:purchase_activity_done"
-msgid "Done"
-msgstr "Приключен"
-
-msgctxt "model:workflow.activity,name:purchase_activity_draft"
-msgid "Draft"
-msgstr "Проект"
-
-msgctxt "model:workflow.activity,name:purchase_activity_invoice_done"
-msgid "Invoice Done"
-msgstr "Направени фактури"
-
-msgctxt "model:workflow.activity,name:purchase_activity_invoice_method"
-msgid "Invoice Method"
-msgstr "Начин на фактуриране"
-
-msgctxt "model:workflow.activity,name:purchase_activity_invoice_method_done"
-msgid "Invoice Method Done"
-msgstr "Направен начин на фактуриране"
-
-msgctxt ""
-"model:workflow.activity,name:purchase_activity_invoice_purchase_exception"
-msgid "Invoice Exception"
-msgstr "Грешка при фактура"
-
-msgctxt "model:workflow.activity,name:purchase_activity_invoice_shipment"
-msgid "Invoice Shipment"
-msgstr "Фактуриране на пратка"
-
-msgctxt "model:workflow.activity,name:purchase_activity_invoice_shipment_done"
-msgid "Invoice Shipment Done"
-msgstr "Направено фактуриране на пратка"
-
-msgctxt ""
-"model:workflow.activity,name:purchase_activity_invoice_shipment_exception"
-msgid "Invoice Shipment Exception"
-msgstr "Грешка при фактуриране на пратка"
-
-msgctxt ""
-"model:workflow.activity,name:purchase_activity_invoice_shipment_method"
-msgid "Invoice Shipment Method"
-msgstr "Начин на фактуриране на изпращане"
-
-msgctxt ""
-"model:workflow.activity,name:purchase_activity_invoice_shipment_method_done"
-msgid "Invoice Shipment Method Done"
-msgstr "Направено фактуриране на начина на изпращане"
-
-msgctxt "model:workflow.activity,name:purchase_activity_quotation"
-msgid "Quotation"
-msgstr "Запитване"
-
-msgctxt "model:workflow.activity,name:purchase_activity_shipment_exception"
-msgid "Shipment Exception"
-msgstr "Грешка при пратка"
-
-msgctxt ""
-"model:workflow.activity,name:purchase_activity_waiting_invoice_purchase"
-msgid "Waiting Invoice"
-msgstr "Очакващи фактура"
-
-msgctxt ""
-"model:workflow.activity,name:purchase_activity_waiting_invoice_shipment"
-msgid "Waiting Invoice Shipment"
-msgstr "Изчакващи фактури за пратки"
-
-msgctxt "model:workflow.activity,name:purchase_activity_waiting_shipment"
-msgid "Waiting Shipment"
-msgstr "Очаква изпращане"
-
-msgctxt "odt:purchase.purchase:0"
+msgctxt "odt:purchase.purchase:"
 msgid "Amount"
 msgstr "Сума"
 
-msgctxt "odt:purchase.purchase:0"
+msgctxt "odt:purchase.purchase:"
 msgid "Date:"
 msgstr "Дата:"
 
-msgctxt "odt:purchase.purchase:0"
+msgctxt "odt:purchase.purchase:"
 msgid "Description"
 msgstr "Описание"
 
-msgctxt "odt:purchase.purchase:0"
+msgctxt "odt:purchase.purchase:"
 msgid "Description:"
 msgstr "Описание:"
 
-msgctxt "odt:purchase.purchase:0"
+msgctxt "odt:purchase.purchase:"
 msgid "Draft Purchase Order"
 msgstr "Проект на поръчка за покупка"
 
-msgctxt "odt:purchase.purchase:0"
+msgctxt "odt:purchase.purchase:"
 msgid "E-Mail:"
 msgstr "E-Mail:"
 
-msgctxt "odt:purchase.purchase:0"
+msgctxt "odt:purchase.purchase:"
 msgid "Phone:"
 msgstr "Телефон:"
 
-msgctxt "odt:purchase.purchase:0"
+msgctxt "odt:purchase.purchase:"
 msgid "Purchase Order N°:"
 msgstr "Поръчка за покупка N°:"
 
-msgctxt "odt:purchase.purchase:0"
+msgctxt "odt:purchase.purchase:"
 msgid "Quantity"
 msgstr "Количество"
 
-msgctxt "odt:purchase.purchase:0"
+msgctxt "odt:purchase.purchase:"
 msgid "Request for Quotation N°:"
 msgstr "Заявки за запитване N°:"
 
-msgctxt "odt:purchase.purchase:0"
+msgctxt "odt:purchase.purchase:"
 msgid "Taxes"
 msgstr "Данъци"
 
-msgctxt "odt:purchase.purchase:0"
+msgctxt "odt:purchase.purchase:"
 msgid "Taxes:"
 msgstr "Данъци:"
 
-msgctxt "odt:purchase.purchase:0"
+msgctxt "odt:purchase.purchase:"
 msgid "Total (excl. taxes):"
 msgstr "Общо (без данъци):"
 
-msgctxt "odt:purchase.purchase:0"
+msgctxt "odt:purchase.purchase:"
 msgid "Total:"
 msgstr "Общо:"
 
-msgctxt "odt:purchase.purchase:0"
+msgctxt "odt:purchase.purchase:"
 msgid "Unit Price"
 msgstr "Единична цена"
 
-msgctxt "odt:purchase.purchase:0"
+msgctxt "odt:purchase.purchase:"
 msgid "VAT Number:"
-msgstr ""
+msgstr "ДДС номер:"
 
-msgctxt "odt:purchase.purchase:0"
+msgctxt "odt:purchase.purchase:"
 msgid "VAT:"
 msgstr "ДДС:"
 
-msgctxt "selection:account.invoice,purchase_exception_state:0"
+msgctxt "selection:account.invoice,purchase_exception_state:"
 msgid ""
 msgstr ""
 
-msgctxt "selection:account.invoice,purchase_exception_state:0"
+msgctxt "selection:account.invoice,purchase_exception_state:"
 msgid "Ignored"
 msgstr "Игнорирано"
 
-msgctxt "selection:account.invoice,purchase_exception_state:0"
+msgctxt "selection:account.invoice,purchase_exception_state:"
 msgid "Recreated"
 msgstr "Създаден наново"
 
-msgctxt "selection:purchase.configuration,purchase_invoice_method:0"
+msgctxt "selection:purchase.configuration,purchase_invoice_method:"
 msgid "Based On Order"
 msgstr "Въз основа на поръчка"
 
-msgctxt "selection:purchase.configuration,purchase_invoice_method:0"
+msgctxt "selection:purchase.configuration,purchase_invoice_method:"
 msgid "Based On Shipment"
 msgstr "Въз основа на изпращане"
 
-msgctxt "selection:purchase.configuration,purchase_invoice_method:0"
+msgctxt "selection:purchase.configuration,purchase_invoice_method:"
 msgid "Manual"
 msgstr "Ръчно"
 
-msgctxt "selection:purchase.line,type:0"
+msgctxt "selection:purchase.line,type:"
 msgid "Comment"
 msgstr "Коментар"
 
-msgctxt "selection:purchase.line,type:0"
+msgctxt "selection:purchase.line,type:"
 msgid "Line"
 msgstr "Ред"
 
-msgctxt "selection:purchase.line,type:0"
+msgctxt "selection:purchase.line,type:"
 msgid "Subtotal"
 msgstr "Междинна сума"
 
-msgctxt "selection:purchase.line,type:0"
+msgctxt "selection:purchase.line,type:"
 msgid "Title"
 msgstr "Заглавие"
 
-msgctxt "selection:purchase.purchase,invoice_method:0"
+msgctxt "selection:purchase.purchase,invoice_method:"
 msgid "Based On Order"
 msgstr "Въз основа на поръчка"
 
-msgctxt "selection:purchase.purchase,invoice_method:0"
+msgctxt "selection:purchase.purchase,invoice_method:"
 msgid "Based On Shipment"
 msgstr "Въз основа на изпращане"
 
-msgctxt "selection:purchase.purchase,invoice_method:0"
+msgctxt "selection:purchase.purchase,invoice_method:"
 msgid "Manual"
 msgstr "Ръчно"
 
-msgctxt "selection:purchase.purchase,invoice_state:0"
+msgctxt "selection:purchase.purchase,invoice_state:"
 msgid "Exception"
 msgstr "Грешка"
 
-msgctxt "selection:purchase.purchase,invoice_state:0"
+msgctxt "selection:purchase.purchase,invoice_state:"
 msgid "None"
 msgstr "Няма"
 
-msgctxt "selection:purchase.purchase,invoice_state:0"
+msgctxt "selection:purchase.purchase,invoice_state:"
 msgid "Paid"
 msgstr "Платен"
 
-msgctxt "selection:purchase.purchase,invoice_state:0"
+msgctxt "selection:purchase.purchase,invoice_state:"
 msgid "Waiting"
 msgstr "Изчакващ"
 
-msgctxt "selection:purchase.purchase,shipment_state:0"
+msgctxt "selection:purchase.purchase,shipment_state:"
 msgid "Exception"
 msgstr "Грешка"
 
-msgctxt "selection:purchase.purchase,shipment_state:0"
+msgctxt "selection:purchase.purchase,shipment_state:"
 msgid "None"
 msgstr "Няма"
 
-msgctxt "selection:purchase.purchase,shipment_state:0"
+msgctxt "selection:purchase.purchase,shipment_state:"
 msgid "Received"
 msgstr "Получен"
 
-msgctxt "selection:purchase.purchase,shipment_state:0"
+msgctxt "selection:purchase.purchase,shipment_state:"
 msgid "Waiting"
 msgstr "Изчакващ"
 
-msgctxt "selection:purchase.purchase,state:0"
+msgctxt "selection:purchase.purchase,state:"
 msgid "Canceled"
 msgstr "Отказан"
 
-msgctxt "selection:purchase.purchase,state:0"
+msgctxt "selection:purchase.purchase,state:"
 msgid "Confirmed"
 msgstr "Потвърден"
 
-msgctxt "selection:purchase.purchase,state:0"
+msgctxt "selection:purchase.purchase,state:"
 msgid "Done"
 msgstr "Приключен"
 
-msgctxt "selection:purchase.purchase,state:0"
+msgctxt "selection:purchase.purchase,state:"
 msgid "Draft"
 msgstr "Проект"
 
-msgctxt "selection:purchase.purchase,state:0"
+msgctxt "selection:purchase.purchase,state:"
 msgid "Quotation"
 msgstr "Запитване"
 
-msgctxt "selection:stock.move,purchase_exception_state:0"
+msgctxt "selection:stock.move,purchase_exception_state:"
 msgid ""
 msgstr ""
 
-msgctxt "selection:stock.move,purchase_exception_state:0"
+msgctxt "selection:stock.move,purchase_exception_state:"
 msgid "Ignored"
 msgstr "Игнорирано"
 
-msgctxt "selection:stock.move,purchase_exception_state:0"
+msgctxt "selection:stock.move,purchase_exception_state:"
 msgid "Recreated"
 msgstr "Създаден наново"
 
-msgctxt "view:product.template:0"
+msgctxt "view:product.product:"
+msgid "Products"
+msgstr "Продукти"
+
+msgctxt "view:product.template:"
 msgid "Product Suppliers"
 msgstr "Доставчици на продукт"
 
-msgctxt "view:product.template:0"
+msgctxt "view:product.template:"
 msgid "Suppliers"
 msgstr "Доставчици"
 
-msgctxt "view:purchase.configuration:0"
+msgctxt "view:purchase.configuration:"
 msgid "Purchase Configuration"
 msgstr "Конфигуриране на покупка"
 
-msgctxt "view:purchase.handle.invoice.exception.ask:0"
+msgctxt "view:purchase.handle.invoice.exception.ask:"
 msgid "Choose invoices to recreate"
 msgstr "Избор на фактури за ново създаване"
 
-msgctxt "view:purchase.handle.invoice.exception.ask:0"
+msgctxt "view:purchase.handle.invoice.exception.ask:"
 msgid "Handle Invoice Exception"
 msgstr "Обработка на грешка към фактура"
 
-#, fuzzy
-msgctxt "view:purchase.handle.shipment.exception.ask:0"
+msgctxt "view:purchase.handle.shipment.exception.ask:"
 msgid "Choose move to recreate"
 msgstr "Избор на движение за ново създаване"
 
-msgctxt "view:purchase.handle.shipment.exception.ask:0"
+msgctxt "view:purchase.handle.shipment.exception.ask:"
 msgid "Choose moves to recreate"
 msgstr "Избор на движения за ново създаване"
 
-msgctxt "view:purchase.handle.shipment.exception.ask:0"
+msgctxt "view:purchase.handle.shipment.exception.ask:"
 msgid "Handle shipment Exception"
 msgstr "Обработване на грешка при изпращане"
 
-msgctxt "view:purchase.handle.shipment.exception.ask:0"
+msgctxt "view:purchase.handle.shipment.exception.ask:"
 msgid "Recreated Moves"
 msgstr "Наново създаване на движения"
 
-msgctxt "view:purchase.line:0"
+msgctxt "view:purchase.line:"
 msgid "General"
 msgstr "Основен"
 
-msgctxt "view:purchase.line:0"
+msgctxt "view:purchase.line:"
+msgid "Lines"
+msgstr "Редове"
+
+msgctxt "view:purchase.line:"
 msgid "Notes"
 msgstr "Бележки"
 
-msgctxt "view:purchase.line:0"
+msgctxt "view:purchase.line:"
 msgid "Products"
 msgstr "Продукти"
 
-msgctxt "view:purchase.line:0"
+msgctxt "view:purchase.line:"
 msgid "Purchase Line"
 msgstr "Ред от покупка"
 
-msgctxt "view:purchase.line:0"
+msgctxt "view:purchase.line:"
 msgid "Purchase Lines"
 msgstr "Редове от покупка"
 
-msgctxt "view:purchase.product_supplier.price:0"
+msgctxt "view:purchase.product_supplier.price:"
 msgid "Product Supplier Price"
 msgstr "Цена на доставчик на продукт"
 
-msgctxt "view:purchase.product_supplier.price:0"
+msgctxt "view:purchase.product_supplier.price:"
 msgid "Product Supplier Prices"
 msgstr "Цена на доставчик на продукт"
 
-msgctxt "view:purchase.product_supplier:0"
+msgctxt "view:purchase.product_supplier:"
 msgid "Product Supplier"
 msgstr "Доставчик на продукт"
 
-msgctxt "view:purchase.product_supplier:0"
+msgctxt "view:purchase.product_supplier:"
 msgid "Product Suppliers"
 msgstr "Доставчици на продукт"
 
-msgctxt "view:purchase.purchase:0"
+msgctxt "view:purchase.purchase:"
 msgid "Cancel"
 msgstr "Отказ"
 
-msgctxt "view:purchase.purchase:0"
+msgctxt "view:purchase.purchase:"
 msgid "Confirm"
 msgstr "Потвърждаване"
 
-msgctxt "view:purchase.purchase:0"
+msgctxt "view:purchase.purchase:"
 msgid "Draft"
 msgstr "Проект"
 
-msgctxt "view:purchase.purchase:0"
+msgctxt "view:purchase.purchase:"
 msgid "Handle Invoice Exception"
 msgstr "Обработка на грешка към фактура"
 
-msgctxt "view:purchase.purchase:0"
+msgctxt "view:purchase.purchase:"
 msgid "Handle Shipment Exception"
 msgstr "Обработване на грешка при изпращане"
 
-msgctxt "view:purchase.purchase:0"
+msgctxt "view:purchase.purchase:"
 msgid "Invoices"
 msgstr "Фактури"
 
-msgctxt "view:purchase.purchase:0"
+msgctxt "view:purchase.purchase:"
 msgid "Lines"
 msgstr "Редове"
 
-msgctxt "view:purchase.purchase:0"
+msgctxt "view:purchase.purchase:"
 msgid "Moves"
 msgstr "Движения"
 
-msgctxt "view:purchase.purchase:0"
+msgctxt "view:purchase.purchase:"
 msgid "Other Info"
 msgstr "Друга информация"
 
-msgctxt "view:purchase.purchase:0"
+msgctxt "view:purchase.purchase:"
 msgid "Purchase"
 msgstr "Покупка"
 
-msgctxt "view:purchase.purchase:0"
+msgctxt "view:purchase.purchase:"
 msgid "Purchases"
 msgstr "Покупки"
 
-msgctxt "view:purchase.purchase:0"
+msgctxt "view:purchase.purchase:"
 msgid "Quotation"
 msgstr "Запитване"
 
-msgctxt "view:purchase.purchase:0"
+msgctxt "view:purchase.purchase:"
+msgid "Quote"
+msgstr ""
+
+msgctxt "view:purchase.purchase:"
 msgid "Shipments"
 msgstr "Изпращане"
 
-msgctxt "wizard_button:purchase.handle.invoice.exception,init,end:0"
+msgctxt "view:stock.move:"
+msgid "Moves"
+msgstr "Движения"
+
+msgctxt "wizard_button:purchase.handle.invoice.exception,ask,end:"
 msgid "Cancel"
 msgstr "Отказ"
 
-msgctxt "wizard_button:purchase.handle.invoice.exception,init,ok:0"
+msgctxt "wizard_button:purchase.handle.invoice.exception,ask,handle:"
 msgid "Ok"
 msgstr "Добре"
 
-msgctxt "wizard_button:purchase.handle.shipment.exception,init,end:0"
+msgctxt "wizard_button:purchase.handle.shipment.exception,ask,end:"
 msgid "Cancel"
 msgstr "Отказ"
 
-msgctxt "wizard_button:purchase.handle.shipment.exception,init,ok:0"
+msgctxt "wizard_button:purchase.handle.shipment.exception,ask,handle:"
 msgid "Ok"
 msgstr "Добре"
diff --git a/locale/ca_ES.po b/locale/ca_ES.po
new file mode 100644
index 0000000..52f9594
--- /dev/null
+++ b/locale/ca_ES.po
@@ -0,0 +1,1291 @@
+# 
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "error:account.invoice:"
+msgid "You can not delete invoices that come from a purchase!"
+msgstr "No pot esborrar factures que vénen d'una compra"
+
+msgctxt "error:account.invoice:"
+msgid "You cannot reset to draft an invoice generated by a purchase."
+msgstr "No pot canviar a esborrany una factura generada per una compra."
+
+msgctxt "error:product.template:"
+msgid ""
+"Purchase prices are based on the purchase uom, are you sure to change it?"
+msgstr ""
+"Els preus de compra estan basats en la UdM de compra, desitja canviar-ho?"
+
+msgctxt "error:purchase.line:"
+msgid "It misses an \"Account Expense\" on product \"%s\"!"
+msgstr "Fa falta un «Compte de despeses» del producte «%s»"
+
+msgctxt "error:purchase.line:"
+msgid "It misses an \"account expense\" default property!"
+msgstr "Fa falta la propietat predeterminada de «Compte de despeses»"
+
+msgctxt "error:purchase.line:"
+msgid "The supplier location is required!"
+msgstr "Es necessita la ubicació del proveïdor"
+
+msgctxt "error:purchase.purchase:"
+msgid "A warehouse must be defined for the quotation."
+msgstr ""
+
+msgctxt "error:purchase.purchase:"
+msgid "Invoice addresses must be defined for the quotation."
+msgstr "Ha de definir les adreces per a la cotització."
+
+msgctxt "error:purchase.purchase:"
+msgid "It misses an \"Account Payable\" on the party \"%s\"!"
+msgstr "Al tercer «%s» li fa falta un «Compte de pagaments»"
+
+msgctxt "error:purchase.purchase:"
+msgid "Purchase \"%s\" must be cancelled before deletion!"
+msgstr ""
+
+msgctxt "error:stock.shipment.in:"
+msgid "You cannot reset to draft a move generated by a purchase."
+msgstr "No pot restablir a esborrany un moviment generat per una compra."
+
+msgctxt "field:account.invoice,purchase_exception_state:"
+msgid "Exception State"
+msgstr "Estat excepció"
+
+#, fuzzy
+msgctxt "field:account.invoice,purchases:"
+msgid "Purchases"
+msgstr "Compres"
+
+#, fuzzy
+msgctxt "field:account.invoice.line,purchase_lines:"
+msgid "Purchase Lines"
+msgstr "Línies de compra"
+
+msgctxt "field:product.template,product_suppliers:"
+msgid "Suppliers"
+msgstr "Proveïdors"
+
+msgctxt "field:product.template,purchasable:"
+msgid "Purchasable"
+msgstr "Comprable"
+
+msgctxt "field:product.template,purchase_uom:"
+msgid "Purchase UOM"
+msgstr "UdM de compra"
+
+msgctxt "field:purchase.configuration,create_date:"
+msgid "Create Date"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:purchase.configuration,create_uid:"
+msgid "Create User"
+msgstr "Crear usuari"
+
+msgctxt "field:purchase.configuration,id:"
+msgid "ID"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:purchase.configuration,purchase_invoice_method:"
+msgid "Invoice Method"
+msgstr "Mètode de facturació"
+
+msgctxt "field:purchase.configuration,purchase_sequence:"
+msgid "Purchase Reference Sequence"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:purchase.configuration,rec_name:"
+msgid "Name"
+msgstr "Nom del camp"
+
+msgctxt "field:purchase.configuration,write_date:"
+msgid "Write Date"
+msgstr ""
+
+msgctxt "field:purchase.configuration,write_uid:"
+msgid "Write User"
+msgstr ""
+
+msgctxt "field:purchase.handle.invoice.exception.ask,domain_invoices:"
+msgid "Domain Invoices"
+msgstr "Factures de domini"
+
+msgctxt "field:purchase.handle.invoice.exception.ask,id:"
+msgid "ID"
+msgstr ""
+
+msgctxt "field:purchase.handle.invoice.exception.ask,recreate_invoices:"
+msgid "Recreate Invoices"
+msgstr "Refer factures"
+
+msgctxt "field:purchase.handle.shipment.exception.ask,domain_moves:"
+msgid "Domain Moves"
+msgstr "Moviments de domini"
+
+msgctxt "field:purchase.handle.shipment.exception.ask,id:"
+msgid "ID"
+msgstr ""
+
+msgctxt "field:purchase.handle.shipment.exception.ask,recreate_moves:"
+msgid "Recreate Moves"
+msgstr "Refer moviments"
+
+msgctxt "field:purchase.line,amount:"
+msgid "Amount"
+msgstr "Quantitat"
+
+msgctxt "field:purchase.line,create_date:"
+msgid "Create Date"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:purchase.line,create_uid:"
+msgid "Create User"
+msgstr "Crear usuari"
+
+msgctxt "field:purchase.line,delivery_date:"
+msgid "Delivery Date"
+msgstr ""
+
+msgctxt "field:purchase.line,description:"
+msgid "Description"
+msgstr "Descripció"
+
+#, fuzzy
+msgctxt "field:purchase.line,from_location:"
+msgid "From Location"
+msgstr "Des de la ubicació"
+
+msgctxt "field:purchase.line,id:"
+msgid "ID"
+msgstr ""
+
+msgctxt "field:purchase.line,invoice_lines:"
+msgid "Invoice Lines"
+msgstr "Línies de factura"
+
+msgctxt "field:purchase.line,move_done:"
+msgid "Moves Done"
+msgstr "Moviments acabats"
+
+msgctxt "field:purchase.line,move_exception:"
+msgid "Moves Exception"
+msgstr "Excepció de moviments"
+
+msgctxt "field:purchase.line,moves:"
+msgid "Moves"
+msgstr "Moviments"
+
+msgctxt "field:purchase.line,moves_ignored:"
+msgid "Ignored Moves"
+msgstr "Moviments ignorats"
+
+msgctxt "field:purchase.line,moves_recreated:"
+msgid "Recreated Moves"
+msgstr "Refer moviments"
+
+msgctxt "field:purchase.line,note:"
+msgid "Note"
+msgstr "Nota"
+
+msgctxt "field:purchase.line,product:"
+msgid "Product"
+msgstr "Producte"
+
+msgctxt "field:purchase.line,product_uom_category:"
+msgid "Product Uom Category"
+msgstr ""
+
+msgctxt "field:purchase.line,purchase:"
+msgid "Purchase"
+msgstr "Compra"
+
+msgctxt "field:purchase.line,quantity:"
+msgid "Quantity"
+msgstr "Quantitat"
+
+msgctxt "field:purchase.line,rec_name:"
+msgid "Name"
+msgstr "Nom"
+
+msgctxt "field:purchase.line,sequence:"
+msgid "Sequence"
+msgstr "Seqüència"
+
+msgctxt "field:purchase.line,taxes:"
+msgid "Taxes"
+msgstr "Impostos"
+
+#, fuzzy
+msgctxt "field:purchase.line,to_location:"
+msgid "To Location"
+msgstr "A la ubicació"
+
+msgctxt "field:purchase.line,type:"
+msgid "Type"
+msgstr "Tipus"
+
+msgctxt "field:purchase.line,unit:"
+msgid "Unit"
+msgstr "Unitat"
+
+msgctxt "field:purchase.line,unit_digits:"
+msgid "Unit Digits"
+msgstr "Dígits unitaris"
+
+msgctxt "field:purchase.line,unit_price:"
+msgid "Unit Price"
+msgstr "Preu unitari"
+
+msgctxt "field:purchase.line,write_date:"
+msgid "Write Date"
+msgstr ""
+
+msgctxt "field:purchase.line,write_uid:"
+msgid "Write User"
+msgstr ""
+
+msgctxt "field:purchase.line-account.invoice.line,create_date:"
+msgid "Create Date"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:purchase.line-account.invoice.line,create_uid:"
+msgid "Create User"
+msgstr "Crear usuari"
+
+msgctxt "field:purchase.line-account.invoice.line,id:"
+msgid "ID"
+msgstr ""
+
+msgctxt "field:purchase.line-account.invoice.line,invoice_line:"
+msgid "Invoice Line"
+msgstr "Línia de factura"
+
+msgctxt "field:purchase.line-account.invoice.line,purchase_line:"
+msgid "Purchase Line"
+msgstr "Línia de compra"
+
+msgctxt "field:purchase.line-account.invoice.line,rec_name:"
+msgid "Name"
+msgstr "Nom"
+
+msgctxt "field:purchase.line-account.invoice.line,write_date:"
+msgid "Write Date"
+msgstr ""
+
+msgctxt "field:purchase.line-account.invoice.line,write_uid:"
+msgid "Write User"
+msgstr ""
+
+msgctxt "field:purchase.line-account.tax,create_date:"
+msgid "Create Date"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:purchase.line-account.tax,create_uid:"
+msgid "Create User"
+msgstr "Crear usuari"
+
+msgctxt "field:purchase.line-account.tax,id:"
+msgid "ID"
+msgstr ""
+
+msgctxt "field:purchase.line-account.tax,line:"
+msgid "Purchase Line"
+msgstr "Línia de compra"
+
+msgctxt "field:purchase.line-account.tax,rec_name:"
+msgid "Name"
+msgstr "Nom"
+
+msgctxt "field:purchase.line-account.tax,tax:"
+msgid "Tax"
+msgstr "Impost"
+
+msgctxt "field:purchase.line-account.tax,write_date:"
+msgid "Write Date"
+msgstr ""
+
+msgctxt "field:purchase.line-account.tax,write_uid:"
+msgid "Write User"
+msgstr ""
+
+msgctxt "field:purchase.line-ignored-stock.move,create_date:"
+msgid "Create Date"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:purchase.line-ignored-stock.move,create_uid:"
+msgid "Create User"
+msgstr "Crear usuari"
+
+msgctxt "field:purchase.line-ignored-stock.move,id:"
+msgid "ID"
+msgstr ""
+
+msgctxt "field:purchase.line-ignored-stock.move,move:"
+msgid "Move"
+msgstr "Moviment"
+
+msgctxt "field:purchase.line-ignored-stock.move,purchase_line:"
+msgid "Purchase Line"
+msgstr "Línia de compra"
+
+msgctxt "field:purchase.line-ignored-stock.move,rec_name:"
+msgid "Name"
+msgstr "Nom"
+
+msgctxt "field:purchase.line-ignored-stock.move,write_date:"
+msgid "Write Date"
+msgstr ""
+
+msgctxt "field:purchase.line-ignored-stock.move,write_uid:"
+msgid "Write User"
+msgstr ""
+
+msgctxt "field:purchase.line-recreated-stock.move,create_date:"
+msgid "Create Date"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:purchase.line-recreated-stock.move,create_uid:"
+msgid "Create User"
+msgstr "Crear usuari"
+
+msgctxt "field:purchase.line-recreated-stock.move,id:"
+msgid "ID"
+msgstr ""
+
+msgctxt "field:purchase.line-recreated-stock.move,move:"
+msgid "Move"
+msgstr "Moviment"
+
+msgctxt "field:purchase.line-recreated-stock.move,purchase_line:"
+msgid "Purchase Line"
+msgstr "Línia de compra"
+
+msgctxt "field:purchase.line-recreated-stock.move,rec_name:"
+msgid "Name"
+msgstr "Nom"
+
+msgctxt "field:purchase.line-recreated-stock.move,write_date:"
+msgid "Write Date"
+msgstr ""
+
+msgctxt "field:purchase.line-recreated-stock.move,write_uid:"
+msgid "Write User"
+msgstr ""
+
+msgctxt "field:purchase.product_supplier,code:"
+msgid "Code"
+msgstr "Codi"
+
+msgctxt "field:purchase.product_supplier,company:"
+msgid "Company"
+msgstr "Companyia"
+
+msgctxt "field:purchase.product_supplier,create_date:"
+msgid "Create Date"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:purchase.product_supplier,create_uid:"
+msgid "Create User"
+msgstr "Crear usuari"
+
+#, fuzzy
+msgctxt "field:purchase.product_supplier,currency:"
+msgid "Currency"
+msgstr "Gestió de divises"
+
+msgctxt "field:purchase.product_supplier,delivery_time:"
+msgid "Delivery Time"
+msgstr "Temps d'enviament"
+
+msgctxt "field:purchase.product_supplier,id:"
+msgid "ID"
+msgstr ""
+
+msgctxt "field:purchase.product_supplier,name:"
+msgid "Name"
+msgstr "Nom"
+
+msgctxt "field:purchase.product_supplier,party:"
+msgid "Supplier"
+msgstr "Proveïdor"
+
+msgctxt "field:purchase.product_supplier,prices:"
+msgid "Prices"
+msgstr "Preus"
+
+msgctxt "field:purchase.product_supplier,product:"
+msgid "Product"
+msgstr "Producte"
+
+msgctxt "field:purchase.product_supplier,rec_name:"
+msgid "Name"
+msgstr "Nom"
+
+msgctxt "field:purchase.product_supplier,sequence:"
+msgid "Sequence"
+msgstr "Seqüència"
+
+msgctxt "field:purchase.product_supplier,write_date:"
+msgid "Write Date"
+msgstr ""
+
+msgctxt "field:purchase.product_supplier,write_uid:"
+msgid "Write User"
+msgstr ""
+
+msgctxt "field:purchase.product_supplier.price,create_date:"
+msgid "Create Date"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:purchase.product_supplier.price,create_uid:"
+msgid "Create User"
+msgstr "Crear usuari"
+
+msgctxt "field:purchase.product_supplier.price,id:"
+msgid "ID"
+msgstr ""
+
+msgctxt "field:purchase.product_supplier.price,product_supplier:"
+msgid "Supplier"
+msgstr "Proveïdor"
+
+msgctxt "field:purchase.product_supplier.price,quantity:"
+msgid "Quantity"
+msgstr "Quantitat"
+
+msgctxt "field:purchase.product_supplier.price,rec_name:"
+msgid "Name"
+msgstr "Nom"
+
+msgctxt "field:purchase.product_supplier.price,unit_price:"
+msgid "Unit Price"
+msgstr "Preu unitari"
+
+msgctxt "field:purchase.product_supplier.price,write_date:"
+msgid "Write Date"
+msgstr ""
+
+msgctxt "field:purchase.product_supplier.price,write_uid:"
+msgid "Write User"
+msgstr ""
+
+msgctxt "field:purchase.purchase,comment:"
+msgid "Comment"
+msgstr "Comentari"
+
+msgctxt "field:purchase.purchase,company:"
+msgid "Company"
+msgstr "Empresa"
+
+msgctxt "field:purchase.purchase,create_date:"
+msgid "Create Date"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:purchase.purchase,create_uid:"
+msgid "Create User"
+msgstr "Crear usuari"
+
+msgctxt "field:purchase.purchase,currency:"
+msgid "Currency"
+msgstr "Divisa"
+
+msgctxt "field:purchase.purchase,currency_digits:"
+msgid "Currency Digits"
+msgstr "Dígits de la divisa"
+
+msgctxt "field:purchase.purchase,description:"
+msgid "Description"
+msgstr "Descripció"
+
+msgctxt "field:purchase.purchase,id:"
+msgid "ID"
+msgstr ""
+
+msgctxt "field:purchase.purchase,invoice_address:"
+msgid "Invoice Address"
+msgstr "Adreça de facturació"
+
+msgctxt "field:purchase.purchase,invoice_method:"
+msgid "Invoice Method"
+msgstr "Mètode de facturació"
+
+msgctxt "field:purchase.purchase,invoice_state:"
+msgid "Invoice State"
+msgstr "Estat de factura"
+
+msgctxt "field:purchase.purchase,invoices:"
+msgid "Invoices"
+msgstr "Factures"
+
+msgctxt "field:purchase.purchase,invoices_ignored:"
+msgid "Ignored Invoices"
+msgstr "Factures ignorades"
+
+msgctxt "field:purchase.purchase,invoices_recreated:"
+msgid "Recreated Invoices"
+msgstr "Factures recreades"
+
+msgctxt "field:purchase.purchase,lines:"
+msgid "Lines"
+msgstr "Línies"
+
+msgctxt "field:purchase.purchase,moves:"
+msgid "Moves"
+msgstr "Moviments"
+
+msgctxt "field:purchase.purchase,party:"
+msgid "Party"
+msgstr "Tercers"
+
+msgctxt "field:purchase.purchase,party_lang:"
+msgid "Party Language"
+msgstr "Idioma del tercer"
+
+msgctxt "field:purchase.purchase,payment_term:"
+msgid "Payment Term"
+msgstr "Terme de pagament"
+
+msgctxt "field:purchase.purchase,purchase_date:"
+msgid "Purchase Date"
+msgstr "Data de compra"
+
+msgctxt "field:purchase.purchase,rec_name:"
+msgid "Name"
+msgstr "Nom"
+
+msgctxt "field:purchase.purchase,reference:"
+msgid "Reference"
+msgstr "Referència"
+
+msgctxt "field:purchase.purchase,shipment_state:"
+msgid "Shipment State"
+msgstr "Estat d'enviament"
+
+msgctxt "field:purchase.purchase,shipments:"
+msgid "Shipments"
+msgstr "Enviaments"
+
+msgctxt "field:purchase.purchase,state:"
+msgid "State"
+msgstr "Estat"
+
+msgctxt "field:purchase.purchase,supplier_reference:"
+msgid "Supplier Reference"
+msgstr "Referència de proveïdor"
+
+msgctxt "field:purchase.purchase,tax_amount:"
+msgid "Tax"
+msgstr "Impost"
+
+msgctxt "field:purchase.purchase,tax_amount_cache:"
+msgid "Tax Cache"
+msgstr ""
+
+msgctxt "field:purchase.purchase,total_amount:"
+msgid "Total"
+msgstr "Total"
+
+msgctxt "field:purchase.purchase,total_amount_cache:"
+msgid "Total Cache"
+msgstr ""
+
+msgctxt "field:purchase.purchase,untaxed_amount:"
+msgid "Untaxed"
+msgstr "Sense impost"
+
+msgctxt "field:purchase.purchase,untaxed_amount_cache:"
+msgid "Untaxed Cache"
+msgstr ""
+
+msgctxt "field:purchase.purchase,warehouse:"
+msgid "Warehouse"
+msgstr "Magatzem"
+
+msgctxt "field:purchase.purchase,write_date:"
+msgid "Write Date"
+msgstr ""
+
+msgctxt "field:purchase.purchase,write_uid:"
+msgid "Write User"
+msgstr ""
+
+msgctxt "field:purchase.purchase-account.invoice,create_date:"
+msgid "Create Date"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:purchase.purchase-account.invoice,create_uid:"
+msgid "Create User"
+msgstr "Crear usuari"
+
+msgctxt "field:purchase.purchase-account.invoice,id:"
+msgid "ID"
+msgstr ""
+
+msgctxt "field:purchase.purchase-account.invoice,invoice:"
+msgid "Invoice"
+msgstr "Factura"
+
+msgctxt "field:purchase.purchase-account.invoice,purchase:"
+msgid "Purchase"
+msgstr "Compra"
+
+msgctxt "field:purchase.purchase-account.invoice,rec_name:"
+msgid "Name"
+msgstr "Nom"
+
+msgctxt "field:purchase.purchase-account.invoice,write_date:"
+msgid "Write Date"
+msgstr ""
+
+msgctxt "field:purchase.purchase-account.invoice,write_uid:"
+msgid "Write User"
+msgstr ""
+
+msgctxt "field:purchase.purchase-ignored-account.invoice,create_date:"
+msgid "Create Date"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:purchase.purchase-ignored-account.invoice,create_uid:"
+msgid "Create User"
+msgstr "Crear usuari"
+
+msgctxt "field:purchase.purchase-ignored-account.invoice,id:"
+msgid "ID"
+msgstr ""
+
+msgctxt "field:purchase.purchase-ignored-account.invoice,invoice:"
+msgid "Invoice"
+msgstr "Factura"
+
+msgctxt "field:purchase.purchase-ignored-account.invoice,purchase:"
+msgid "Purchase"
+msgstr "Compra"
+
+msgctxt "field:purchase.purchase-ignored-account.invoice,rec_name:"
+msgid "Name"
+msgstr "Nom"
+
+msgctxt "field:purchase.purchase-ignored-account.invoice,write_date:"
+msgid "Write Date"
+msgstr ""
+
+msgctxt "field:purchase.purchase-ignored-account.invoice,write_uid:"
+msgid "Write User"
+msgstr ""
+
+msgctxt "field:purchase.purchase-recreated-account.invoice,create_date:"
+msgid "Create Date"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:purchase.purchase-recreated-account.invoice,create_uid:"
+msgid "Create User"
+msgstr "Crear usuari"
+
+msgctxt "field:purchase.purchase-recreated-account.invoice,id:"
+msgid "ID"
+msgstr ""
+
+msgctxt "field:purchase.purchase-recreated-account.invoice,invoice:"
+msgid "Invoice"
+msgstr "Factura"
+
+msgctxt "field:purchase.purchase-recreated-account.invoice,purchase:"
+msgid "Purchase"
+msgstr "Compra"
+
+msgctxt "field:purchase.purchase-recreated-account.invoice,rec_name:"
+msgid "Name"
+msgstr "Nom"
+
+msgctxt "field:purchase.purchase-recreated-account.invoice,write_date:"
+msgid "Write Date"
+msgstr ""
+
+msgctxt "field:purchase.purchase-recreated-account.invoice,write_uid:"
+msgid "Write User"
+msgstr ""
+
+msgctxt "field:stock.move,purchase:"
+msgid "Purchase"
+msgstr "Compra"
+
+msgctxt "field:stock.move,purchase_currency:"
+msgid "Purchase Currency"
+msgstr "Divisa de compra"
+
+msgctxt "field:stock.move,purchase_exception_state:"
+msgid "Exception State"
+msgstr "Estat excepció"
+
+#, fuzzy
+msgctxt "field:stock.move,purchase_line:"
+msgid "Purchase Line"
+msgstr "Línia de compra"
+
+msgctxt "field:stock.move,purchase_quantity:"
+msgid "Purchase Quantity"
+msgstr "Quantitat de compra"
+
+msgctxt "field:stock.move,purchase_unit:"
+msgid "Purchase Unit"
+msgstr "Unitat de compra"
+
+msgctxt "field:stock.move,purchase_unit_digits:"
+msgid "Purchase Unit Digits"
+msgstr "Decimals de la unitat de compra"
+
+msgctxt "field:stock.move,purchase_unit_price:"
+msgid "Purchase Unit Price"
+msgstr "Preu de la unitat de compra"
+
+msgctxt "field:stock.move,purchase_visible:"
+msgid "Purchase Visible"
+msgstr "Compra visible"
+
+msgctxt "field:stock.move,supplier:"
+msgid "Supplier"
+msgstr "Proveïdor"
+
+msgctxt "help:purchase.handle.invoice.exception.ask,recreate_invoices:"
+msgid ""
+"The selected invoices will be recreated. The other ones will be ignored."
+msgstr "La factura seleccionada serà recreada. Les altres seran ignorades."
+
+msgctxt "help:purchase.handle.shipment.exception.ask,recreate_moves:"
+msgid "The selected moves will be recreated. The other ones will be ignored."
+msgstr "Els moviments seleccionats es refaran. Els altres s'ignoraran."
+
+msgctxt "help:purchase.product_supplier,delivery_time:"
+msgid "In number of days"
+msgstr "En nombre de dies"
+
+msgctxt "help:purchase.product_supplier.price,quantity:"
+msgid "Minimal quantity"
+msgstr "Quantitat mínima"
+
+msgctxt "model:ir.action,name:act_invoice_form"
+msgid "Invoices"
+msgstr "Factures"
+
+msgctxt "model:ir.action,name:act_open_supplier"
+msgid "Parties associated to Purchases"
+msgstr "Tercers associats amb compres"
+
+msgctxt "model:ir.action,name:act_purchase_configuration_form"
+msgid "Purchase Configuration"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_purchase_form"
+msgid "Purchases"
+msgstr "Compres"
+
+msgctxt "model:ir.action,name:act_purchase_form2"
+msgid "Purchases"
+msgstr "Compres"
+
+msgctxt "model:ir.action,name:act_purchase_form_confirmed"
+msgid "Confirmed Purchases"
+msgstr "Compres confirmades"
+
+msgctxt "model:ir.action,name:act_purchase_form_draft"
+msgid "Draft Purchases"
+msgstr "Compres en esborrany"
+
+msgctxt "model:ir.action,name:act_purchase_form_quotation"
+msgid "Purchases in Quotation"
+msgstr "Compres en cotització"
+
+msgctxt "model:ir.action,name:act_shipment_form"
+msgid "Shipments"
+msgstr "Enviaments"
+
+msgctxt "model:ir.action,name:report_purchase"
+msgid "Purchase"
+msgstr "Compra"
+
+msgctxt "model:ir.action,name:wizard_invoice_handle_exception"
+msgid "Handle Invoice Exception"
+msgstr "Gestionar excepció de factura"
+
+msgctxt "model:ir.action,name:wizard_shipment_handle_exception"
+msgid "Handle Shipment Exception"
+msgstr "Gestionar excepció d'enviament"
+
+msgctxt "model:ir.sequence,name:sequence_purchase"
+msgid "Purchase"
+msgstr "Compra"
+
+msgctxt "model:ir.sequence.type,name:sequence_type_purchase"
+msgid "Purchase"
+msgstr "Compra"
+
+msgctxt "model:ir.ui.menu,name:menu_configuration"
+msgid "Configuration"
+msgstr "Configuració"
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_purchase"
+msgid "Purchase"
+msgstr "Gestió de compres"
+
+msgctxt "model:ir.ui.menu,name:menu_purchase_configuration"
+msgid "Purchase Configuration"
+msgstr ""
+
+msgctxt "model:ir.ui.menu,name:menu_purchase_form"
+msgid "Purchases"
+msgstr "Compres"
+
+msgctxt "model:ir.ui.menu,name:menu_purchase_form_confirmed"
+msgid "Confirmed Purchases"
+msgstr "Compres confirmades"
+
+msgctxt "model:ir.ui.menu,name:menu_purchase_form_draft"
+msgid "Draft Purchases"
+msgstr "Compres en esborrany"
+
+msgctxt "model:ir.ui.menu,name:menu_purchase_form_quotation"
+msgid "Purchases in Quotation"
+msgstr "Compres en cotització"
+
+msgctxt "model:ir.ui.menu,name:menu_reporting"
+msgid "Reporting"
+msgstr "Informes"
+
+msgctxt "model:ir.ui.menu,name:menu_supplier"
+msgid "Parties associated to Purchases"
+msgstr "Tercers associats amb compres"
+
+msgctxt "model:purchase.configuration,name:"
+msgid "Purchase Configuration"
+msgstr ""
+
+#, fuzzy
+msgctxt "model:purchase.handle.invoice.exception.ask,name:"
+msgid "Handle Invoice Exception"
+msgstr "Excepció de factura - Petició"
+
+#, fuzzy
+msgctxt "model:purchase.handle.shipment.exception.ask,name:"
+msgid "Handle Shipment Exception"
+msgstr "Excepció d'enviament - Petició"
+
+msgctxt "model:purchase.line,name:"
+msgid "Purchase Line"
+msgstr "Línia de compra"
+
+msgctxt "model:purchase.line-account.invoice.line,name:"
+msgid "Purchase Line - Invoice Line"
+msgstr "Línia de compra - Línia de factura"
+
+msgctxt "model:purchase.line-account.tax,name:"
+msgid "Purchase Line - Tax"
+msgstr "Línia de compra - Impost"
+
+msgctxt "model:purchase.line-ignored-stock.move,name:"
+msgid "Purchase Line - Ignored Move"
+msgstr "Línia de compra - Moviment Ignorat"
+
+msgctxt "model:purchase.line-recreated-stock.move,name:"
+msgid "Purchase Line - Ignored Move"
+msgstr "Línia de compra - Moviment ignorat"
+
+msgctxt "model:purchase.product_supplier,name:"
+msgid "Product Supplier"
+msgstr "Proveïdor de producte"
+
+msgctxt "model:purchase.product_supplier.price,name:"
+msgid "Product Supplier Price"
+msgstr "Preu del proveïdor del producte"
+
+msgctxt "model:purchase.purchase,name:"
+msgid "Purchase"
+msgstr "Compra"
+
+msgctxt "model:purchase.purchase-account.invoice,name:"
+msgid "Purchase - Invoice"
+msgstr "Compra - Factura"
+
+msgctxt "model:purchase.purchase-ignored-account.invoice,name:"
+msgid "Purchase - Ignored Invoice"
+msgstr "Compra - Factura ignorada"
+
+msgctxt "model:purchase.purchase-recreated-account.invoice,name:"
+msgid "Purchase - Recreated Invoice"
+msgstr "Compra - Factura recreada"
+
+msgctxt "model:res.group,name:group_purchase"
+msgid "Purchase"
+msgstr "Compra"
+
+msgctxt "model:res.group,name:group_purchase_admin"
+msgid "Purchase Administrator"
+msgstr "Administrador de compra"
+
+msgctxt "odt:purchase.purchase:"
+msgid "Amount"
+msgstr "Quantitat"
+
+msgctxt "odt:purchase.purchase:"
+msgid "Date:"
+msgstr "Data:"
+
+msgctxt "odt:purchase.purchase:"
+msgid "Description"
+msgstr "Descripció"
+
+msgctxt "odt:purchase.purchase:"
+msgid "Description:"
+msgstr "Descripció:"
+
+msgctxt "odt:purchase.purchase:"
+msgid "Draft Purchase Order"
+msgstr "Comanda de compra en esborrany"
+
+msgctxt "odt:purchase.purchase:"
+msgid "E-Mail:"
+msgstr "Correu electrònic:"
+
+msgctxt "odt:purchase.purchase:"
+msgid "Phone:"
+msgstr "Telèfon:"
+
+msgctxt "odt:purchase.purchase:"
+msgid "Purchase Order N°:"
+msgstr "Nº de comanda de compra:"
+
+msgctxt "odt:purchase.purchase:"
+msgid "Quantity"
+msgstr "Quantitat"
+
+msgctxt "odt:purchase.purchase:"
+msgid "Request for Quotation N°:"
+msgstr "Sol·licitud de pressupost nº:"
+
+msgctxt "odt:purchase.purchase:"
+msgid "Taxes"
+msgstr "Impostos"
+
+msgctxt "odt:purchase.purchase:"
+msgid "Taxes:"
+msgstr "Impostos:"
+
+msgctxt "odt:purchase.purchase:"
+msgid "Total (excl. taxes):"
+msgstr "Total (sense impostos):"
+
+msgctxt "odt:purchase.purchase:"
+msgid "Total:"
+msgstr "Total:"
+
+msgctxt "odt:purchase.purchase:"
+msgid "Unit Price"
+msgstr "Preu unitari"
+
+msgctxt "odt:purchase.purchase:"
+msgid "VAT Number:"
+msgstr ""
+
+msgctxt "odt:purchase.purchase:"
+msgid "VAT:"
+msgstr "IVA:"
+
+msgctxt "selection:account.invoice,purchase_exception_state:"
+msgid ""
+msgstr ""
+
+msgctxt "selection:account.invoice,purchase_exception_state:"
+msgid "Ignored"
+msgstr "Ignorat"
+
+msgctxt "selection:account.invoice,purchase_exception_state:"
+msgid "Recreated"
+msgstr "Refet"
+
+#, fuzzy
+msgctxt "selection:purchase.configuration,purchase_invoice_method:"
+msgid "Based On Order"
+msgstr "Basat en l'ordre"
+
+#, fuzzy
+msgctxt "selection:purchase.configuration,purchase_invoice_method:"
+msgid "Based On Shipment"
+msgstr "Basat en l'enviament"
+
+#, fuzzy
+msgctxt "selection:purchase.configuration,purchase_invoice_method:"
+msgid "Manual"
+msgstr "Manual"
+
+msgctxt "selection:purchase.line,type:"
+msgid "Comment"
+msgstr "Comentari"
+
+msgctxt "selection:purchase.line,type:"
+msgid "Line"
+msgstr "Línia"
+
+msgctxt "selection:purchase.line,type:"
+msgid "Subtotal"
+msgstr "Subtotal"
+
+msgctxt "selection:purchase.line,type:"
+msgid "Title"
+msgstr "Títol"
+
+msgctxt "selection:purchase.purchase,invoice_method:"
+msgid "Based On Order"
+msgstr "Basat en comandes"
+
+msgctxt "selection:purchase.purchase,invoice_method:"
+msgid "Based On Shipment"
+msgstr "Basat en enviaments"
+
+msgctxt "selection:purchase.purchase,invoice_method:"
+msgid "Manual"
+msgstr "Manual"
+
+msgctxt "selection:purchase.purchase,invoice_state:"
+msgid "Exception"
+msgstr "Excepció"
+
+msgctxt "selection:purchase.purchase,invoice_state:"
+msgid "None"
+msgstr "Cap"
+
+msgctxt "selection:purchase.purchase,invoice_state:"
+msgid "Paid"
+msgstr "Pagat"
+
+msgctxt "selection:purchase.purchase,invoice_state:"
+msgid "Waiting"
+msgstr "En espera"
+
+msgctxt "selection:purchase.purchase,shipment_state:"
+msgid "Exception"
+msgstr "Excepció"
+
+msgctxt "selection:purchase.purchase,shipment_state:"
+msgid "None"
+msgstr "Cap"
+
+msgctxt "selection:purchase.purchase,shipment_state:"
+msgid "Received"
+msgstr "Rebut"
+
+msgctxt "selection:purchase.purchase,shipment_state:"
+msgid "Waiting"
+msgstr "En espera"
+
+msgctxt "selection:purchase.purchase,state:"
+msgid "Canceled"
+msgstr "Cancel·lat"
+
+msgctxt "selection:purchase.purchase,state:"
+msgid "Confirmed"
+msgstr "Confirmat"
+
+msgctxt "selection:purchase.purchase,state:"
+msgid "Done"
+msgstr "Acabada"
+
+msgctxt "selection:purchase.purchase,state:"
+msgid "Draft"
+msgstr "Esborrany"
+
+msgctxt "selection:purchase.purchase,state:"
+msgid "Quotation"
+msgstr "Pressupost"
+
+msgctxt "selection:stock.move,purchase_exception_state:"
+msgid ""
+msgstr ""
+
+msgctxt "selection:stock.move,purchase_exception_state:"
+msgid "Ignored"
+msgstr "Ignorat"
+
+msgctxt "selection:stock.move,purchase_exception_state:"
+msgid "Recreated"
+msgstr "Refet"
+
+msgctxt "view:product.product:"
+msgid "Products"
+msgstr "Productes"
+
+msgctxt "view:product.product:"
+msgid "Suppliers"
+msgstr "Proveïdors"
+
+msgctxt "view:product.template:"
+msgid "Product Suppliers"
+msgstr "Proveïdors de productes"
+
+msgctxt "view:product.template:"
+msgid "Suppliers"
+msgstr "Proveïdors"
+
+msgctxt "view:purchase.configuration:"
+msgid "Purchase Configuration"
+msgstr ""
+
+msgctxt "view:purchase.handle.invoice.exception.ask:"
+msgid "Choose invoices to recreate"
+msgstr "Seleccioni les factures a recrear"
+
+msgctxt "view:purchase.handle.invoice.exception.ask:"
+msgid "Handle Invoice Exception"
+msgstr "Gestionar l'excepció de factura"
+
+#, fuzzy
+msgctxt "view:purchase.handle.shipment.exception.ask:"
+msgid "Choose move to recreate"
+msgstr "Esculli un moviment a refer"
+
+msgctxt "view:purchase.handle.shipment.exception.ask:"
+msgid "Choose moves to recreate"
+msgstr "Triar moviments a recrear"
+
+msgctxt "view:purchase.handle.shipment.exception.ask:"
+msgid "Handle shipment Exception"
+msgstr "Gestionar excepcions d'enviament"
+
+msgctxt "view:purchase.handle.shipment.exception.ask:"
+msgid "Recreated Moves"
+msgstr "Moviments recreats"
+
+msgctxt "view:purchase.line:"
+msgid "General"
+msgstr "General"
+
+#, fuzzy
+msgctxt "view:purchase.line:"
+msgid "Lines"
+msgstr "Línies"
+
+msgctxt "view:purchase.line:"
+msgid "Notes"
+msgstr "Notes"
+
+msgctxt "view:purchase.line:"
+msgid "Products"
+msgstr "Productes"
+
+msgctxt "view:purchase.line:"
+msgid "Purchase Line"
+msgstr "Línia de compra"
+
+msgctxt "view:purchase.line:"
+msgid "Purchase Lines"
+msgstr "Línies de compra"
+
+msgctxt "view:purchase.product_supplier.price:"
+msgid "Product Supplier Price"
+msgstr "Preu del proveïdor del producte"
+
+msgctxt "view:purchase.product_supplier.price:"
+msgid "Product Supplier Prices"
+msgstr "Preus del proveïdor del producte"
+
+msgctxt "view:purchase.product_supplier:"
+msgid "Product Supplier"
+msgstr "Proveïdor del producte"
+
+msgctxt "view:purchase.product_supplier:"
+msgid "Product Suppliers"
+msgstr "Proveïdors de productes"
+
+msgctxt "view:purchase.purchase:"
+msgid "Cancel"
+msgstr "Cancel·lar"
+
+msgctxt "view:purchase.purchase:"
+msgid "Confirm"
+msgstr "Confirmar"
+
+msgctxt "view:purchase.purchase:"
+msgid "Draft"
+msgstr "Esborrany"
+
+msgctxt "view:purchase.purchase:"
+msgid "Handle Invoice Exception"
+msgstr "Gestionar l'excepció de factura"
+
+msgctxt "view:purchase.purchase:"
+msgid "Handle Shipment Exception"
+msgstr "Gestionar excepció d'enviament"
+
+msgctxt "view:purchase.purchase:"
+msgid "Invoices"
+msgstr "Factures"
+
+msgctxt "view:purchase.purchase:"
+msgid "Lines"
+msgstr "Línies"
+
+msgctxt "view:purchase.purchase:"
+msgid "Moves"
+msgstr "Moviments"
+
+msgctxt "view:purchase.purchase:"
+msgid "Other Info"
+msgstr "Informació addicional"
+
+msgctxt "view:purchase.purchase:"
+msgid "Purchase"
+msgstr "Compra"
+
+msgctxt "view:purchase.purchase:"
+msgid "Purchases"
+msgstr "Compres"
+
+msgctxt "view:purchase.purchase:"
+msgid "Quotation"
+msgstr "Pressupost"
+
+msgctxt "view:purchase.purchase:"
+msgid "Quote"
+msgstr ""
+
+msgctxt "view:purchase.purchase:"
+msgid "Shipments"
+msgstr "Enviaments"
+
+#, fuzzy
+msgctxt "view:stock.move:"
+msgid "Moves"
+msgstr "Moviments"
+
+#, fuzzy
+msgctxt "wizard_button:purchase.handle.invoice.exception,ask,end:"
+msgid "Cancel"
+msgstr "Cancel·lar"
+
+#, fuzzy
+msgctxt "wizard_button:purchase.handle.invoice.exception,ask,handle:"
+msgid "Ok"
+msgstr "Acceptar"
+
+#, fuzzy
+msgctxt "wizard_button:purchase.handle.shipment.exception,ask,end:"
+msgid "Cancel"
+msgstr "Cancel·lar"
+
+#, fuzzy
+msgctxt "wizard_button:purchase.handle.shipment.exception,ask,handle:"
+msgid "Ok"
+msgstr "Acceptar"
diff --git a/locale/cs_CZ.po b/locale/cs_CZ.po
index ad6d700..289e216 100644
--- a/locale/cs_CZ.po
+++ b/locale/cs_CZ.po
@@ -2,485 +2,757 @@
 msgid ""
 msgstr "Content-Type: text/plain; charset=utf-8\n"
 
-msgctxt "error:account.invoice:0"
+msgctxt "error:account.invoice:"
 msgid "You can not delete invoices that come from a purchase!"
 msgstr ""
 
-msgctxt "error:account.invoice:0"
+msgctxt "error:account.invoice:"
 msgid "You cannot reset to draft an invoice generated by a purchase."
 msgstr ""
 
-msgctxt "error:product.template:0"
+msgctxt "error:product.template:"
 msgid ""
 "Purchase prices are based on the purchase uom, are you sure to change it?"
 msgstr ""
 
-msgctxt "error:purchase.line:0"
+msgctxt "error:purchase.line:"
 msgid "It misses an \"Account Expense\" on product \"%s\"!"
 msgstr ""
 
-msgctxt "error:purchase.line:0"
+msgctxt "error:purchase.line:"
 msgid "It misses an \"account expense\" default property!"
 msgstr ""
 
-msgctxt "error:purchase.line:0"
+msgctxt "error:purchase.line:"
 msgid "The supplier location is required!"
 msgstr ""
 
-msgctxt "error:purchase.purchase:0"
+msgctxt "error:purchase.purchase:"
+msgid "A warehouse must be defined for the quotation."
+msgstr ""
+
+msgctxt "error:purchase.purchase:"
 msgid "Invoice addresses must be defined for the quotation."
 msgstr ""
 
-msgctxt "error:purchase.purchase:0"
+msgctxt "error:purchase.purchase:"
 msgid "It misses an \"Account Payable\" on the party \"%s\"!"
 msgstr ""
 
-msgctxt "error:stock.shipment.in:0"
+msgctxt "error:purchase.purchase:"
+msgid "Purchase \"%s\" must be cancelled before deletion!"
+msgstr ""
+
+msgctxt "error:stock.shipment.in:"
 msgid "You cannot reset to draft a move generated by a purchase."
 msgstr ""
 
-msgctxt "field:account.invoice,purchase_exception_state:0"
+msgctxt "field:account.invoice,purchase_exception_state:"
 msgid "Exception State"
 msgstr ""
 
-msgctxt "field:account.invoice,purchases:0"
+msgctxt "field:account.invoice,purchases:"
 msgid "Purchases"
 msgstr ""
 
-msgctxt "field:account.invoice.line,purchase_lines:0"
+msgctxt "field:account.invoice.line,purchase_lines:"
 msgid "Purchase Lines"
 msgstr ""
 
-msgctxt "field:product.template,product_suppliers:0"
+msgctxt "field:product.template,product_suppliers:"
 msgid "Suppliers"
 msgstr ""
 
-msgctxt "field:product.template,purchasable:0"
+msgctxt "field:product.template,purchasable:"
 msgid "Purchasable"
 msgstr ""
 
-msgctxt "field:product.template,purchase_uom:0"
+msgctxt "field:product.template,purchase_uom:"
 msgid "Purchase UOM"
 msgstr ""
 
-msgctxt "field:purchase.configuration,purchase_invoice_method:0"
+msgctxt "field:purchase.configuration,create_date:"
+msgid "Create Date"
+msgstr ""
+
+msgctxt "field:purchase.configuration,create_uid:"
+msgid "Create User"
+msgstr ""
+
+msgctxt "field:purchase.configuration,id:"
+msgid "ID"
+msgstr ""
+
+msgctxt "field:purchase.configuration,purchase_invoice_method:"
 msgid "Invoice Method"
 msgstr ""
 
-msgctxt "field:purchase.configuration,purchase_sequence:0"
+msgctxt "field:purchase.configuration,purchase_sequence:"
 msgid "Purchase Reference Sequence"
 msgstr ""
 
-msgctxt "field:purchase.configuration,rec_name:0"
+msgctxt "field:purchase.configuration,rec_name:"
 msgid "Name"
 msgstr ""
 
-msgctxt "field:purchase.handle.invoice.exception.ask,domain_invoices:0"
+msgctxt "field:purchase.configuration,write_date:"
+msgid "Write Date"
+msgstr ""
+
+msgctxt "field:purchase.configuration,write_uid:"
+msgid "Write User"
+msgstr ""
+
+msgctxt "field:purchase.handle.invoice.exception.ask,domain_invoices:"
 msgid "Domain Invoices"
 msgstr ""
 
-msgctxt "field:purchase.handle.invoice.exception.ask,recreate_invoices:0"
+msgctxt "field:purchase.handle.invoice.exception.ask,id:"
+msgid "ID"
+msgstr ""
+
+msgctxt "field:purchase.handle.invoice.exception.ask,recreate_invoices:"
 msgid "Recreate Invoices"
 msgstr ""
 
-msgctxt "field:purchase.handle.shipment.exception.ask,domain_moves:0"
+msgctxt "field:purchase.handle.shipment.exception.ask,domain_moves:"
 msgid "Domain Moves"
 msgstr ""
 
-msgctxt "field:purchase.handle.shipment.exception.ask,recreate_moves:0"
+msgctxt "field:purchase.handle.shipment.exception.ask,id:"
+msgid "ID"
+msgstr ""
+
+msgctxt "field:purchase.handle.shipment.exception.ask,recreate_moves:"
 msgid "Recreate Moves"
 msgstr ""
 
-msgctxt "field:purchase.line,amount:0"
+msgctxt "field:purchase.line,amount:"
 msgid "Amount"
 msgstr ""
 
-msgctxt "field:purchase.line,description:0"
+msgctxt "field:purchase.line,create_date:"
+msgid "Create Date"
+msgstr ""
+
+msgctxt "field:purchase.line,create_uid:"
+msgid "Create User"
+msgstr ""
+
+msgctxt "field:purchase.line,delivery_date:"
+msgid "Delivery Date"
+msgstr ""
+
+msgctxt "field:purchase.line,description:"
 msgid "Description"
 msgstr ""
 
-msgctxt "field:purchase.line,invoice_lines:0"
+msgctxt "field:purchase.line,from_location:"
+msgid "From Location"
+msgstr ""
+
+msgctxt "field:purchase.line,id:"
+msgid "ID"
+msgstr ""
+
+msgctxt "field:purchase.line,invoice_lines:"
 msgid "Invoice Lines"
 msgstr ""
 
-msgctxt "field:purchase.line,move_done:0"
+msgctxt "field:purchase.line,move_done:"
 msgid "Moves Done"
 msgstr ""
 
-msgctxt "field:purchase.line,move_exception:0"
+msgctxt "field:purchase.line,move_exception:"
 msgid "Moves Exception"
 msgstr ""
 
-msgctxt "field:purchase.line,moves:0"
+msgctxt "field:purchase.line,moves:"
 msgid "Moves"
 msgstr ""
 
-msgctxt "field:purchase.line,moves_ignored:0"
+msgctxt "field:purchase.line,moves_ignored:"
 msgid "Ignored Moves"
 msgstr ""
 
-msgctxt "field:purchase.line,moves_recreated:0"
+msgctxt "field:purchase.line,moves_recreated:"
 msgid "Recreated Moves"
 msgstr ""
 
-msgctxt "field:purchase.line,note:0"
+msgctxt "field:purchase.line,note:"
 msgid "Note"
 msgstr ""
 
-msgctxt "field:purchase.line,product:0"
+msgctxt "field:purchase.line,product:"
 msgid "Product"
 msgstr ""
 
-msgctxt "field:purchase.line,purchase:0"
+msgctxt "field:purchase.line,product_uom_category:"
+msgid "Product Uom Category"
+msgstr ""
+
+msgctxt "field:purchase.line,purchase:"
 msgid "Purchase"
 msgstr ""
 
-msgctxt "field:purchase.line,quantity:0"
+msgctxt "field:purchase.line,quantity:"
 msgid "Quantity"
 msgstr ""
 
-msgctxt "field:purchase.line,rec_name:0"
+msgctxt "field:purchase.line,rec_name:"
 msgid "Name"
 msgstr ""
 
-msgctxt "field:purchase.line,sequence:0"
+msgctxt "field:purchase.line,sequence:"
 msgid "Sequence"
 msgstr ""
 
-msgctxt "field:purchase.line,taxes:0"
+msgctxt "field:purchase.line,taxes:"
 msgid "Taxes"
 msgstr ""
 
-msgctxt "field:purchase.line,type:0"
+msgctxt "field:purchase.line,to_location:"
+msgid "To Location"
+msgstr ""
+
+msgctxt "field:purchase.line,type:"
 msgid "Type"
 msgstr ""
 
-msgctxt "field:purchase.line,unit:0"
+msgctxt "field:purchase.line,unit:"
 msgid "Unit"
 msgstr ""
 
-msgctxt "field:purchase.line,unit_digits:0"
+msgctxt "field:purchase.line,unit_digits:"
 msgid "Unit Digits"
 msgstr ""
 
-msgctxt "field:purchase.line,unit_price:0"
+msgctxt "field:purchase.line,unit_price:"
 msgid "Unit Price"
 msgstr ""
 
-msgctxt "field:purchase.line-account.invoice.line,invoice_line:0"
+msgctxt "field:purchase.line,write_date:"
+msgid "Write Date"
+msgstr ""
+
+msgctxt "field:purchase.line,write_uid:"
+msgid "Write User"
+msgstr ""
+
+msgctxt "field:purchase.line-account.invoice.line,create_date:"
+msgid "Create Date"
+msgstr ""
+
+msgctxt "field:purchase.line-account.invoice.line,create_uid:"
+msgid "Create User"
+msgstr ""
+
+msgctxt "field:purchase.line-account.invoice.line,id:"
+msgid "ID"
+msgstr ""
+
+msgctxt "field:purchase.line-account.invoice.line,invoice_line:"
 msgid "Invoice Line"
 msgstr ""
 
-msgctxt "field:purchase.line-account.invoice.line,purchase_line:0"
+msgctxt "field:purchase.line-account.invoice.line,purchase_line:"
 msgid "Purchase Line"
 msgstr ""
 
-msgctxt "field:purchase.line-account.invoice.line,rec_name:0"
+msgctxt "field:purchase.line-account.invoice.line,rec_name:"
 msgid "Name"
 msgstr ""
 
-msgctxt "field:purchase.line-account.tax,line:0"
+msgctxt "field:purchase.line-account.invoice.line,write_date:"
+msgid "Write Date"
+msgstr ""
+
+msgctxt "field:purchase.line-account.invoice.line,write_uid:"
+msgid "Write User"
+msgstr ""
+
+msgctxt "field:purchase.line-account.tax,create_date:"
+msgid "Create Date"
+msgstr ""
+
+msgctxt "field:purchase.line-account.tax,create_uid:"
+msgid "Create User"
+msgstr ""
+
+msgctxt "field:purchase.line-account.tax,id:"
+msgid "ID"
+msgstr ""
+
+msgctxt "field:purchase.line-account.tax,line:"
 msgid "Purchase Line"
 msgstr ""
 
-msgctxt "field:purchase.line-account.tax,rec_name:0"
+msgctxt "field:purchase.line-account.tax,rec_name:"
 msgid "Name"
 msgstr ""
 
-msgctxt "field:purchase.line-account.tax,tax:0"
+msgctxt "field:purchase.line-account.tax,tax:"
 msgid "Tax"
 msgstr ""
 
-msgctxt "field:purchase.line-ignored-stock.move,move:0"
+msgctxt "field:purchase.line-account.tax,write_date:"
+msgid "Write Date"
+msgstr ""
+
+msgctxt "field:purchase.line-account.tax,write_uid:"
+msgid "Write User"
+msgstr ""
+
+msgctxt "field:purchase.line-ignored-stock.move,create_date:"
+msgid "Create Date"
+msgstr ""
+
+msgctxt "field:purchase.line-ignored-stock.move,create_uid:"
+msgid "Create User"
+msgstr ""
+
+msgctxt "field:purchase.line-ignored-stock.move,id:"
+msgid "ID"
+msgstr ""
+
+msgctxt "field:purchase.line-ignored-stock.move,move:"
 msgid "Move"
 msgstr ""
 
-msgctxt "field:purchase.line-ignored-stock.move,purchase_line:0"
+msgctxt "field:purchase.line-ignored-stock.move,purchase_line:"
 msgid "Purchase Line"
 msgstr ""
 
-msgctxt "field:purchase.line-ignored-stock.move,rec_name:0"
+msgctxt "field:purchase.line-ignored-stock.move,rec_name:"
 msgid "Name"
 msgstr ""
 
-msgctxt "field:purchase.line-recreated-stock.move,move:0"
+msgctxt "field:purchase.line-ignored-stock.move,write_date:"
+msgid "Write Date"
+msgstr ""
+
+msgctxt "field:purchase.line-ignored-stock.move,write_uid:"
+msgid "Write User"
+msgstr ""
+
+msgctxt "field:purchase.line-recreated-stock.move,create_date:"
+msgid "Create Date"
+msgstr ""
+
+msgctxt "field:purchase.line-recreated-stock.move,create_uid:"
+msgid "Create User"
+msgstr ""
+
+msgctxt "field:purchase.line-recreated-stock.move,id:"
+msgid "ID"
+msgstr ""
+
+msgctxt "field:purchase.line-recreated-stock.move,move:"
 msgid "Move"
 msgstr ""
 
-msgctxt "field:purchase.line-recreated-stock.move,purchase_line:0"
+msgctxt "field:purchase.line-recreated-stock.move,purchase_line:"
 msgid "Purchase Line"
 msgstr ""
 
-msgctxt "field:purchase.line-recreated-stock.move,rec_name:0"
+msgctxt "field:purchase.line-recreated-stock.move,rec_name:"
 msgid "Name"
 msgstr ""
 
-msgctxt "field:purchase.product_supplier,code:0"
+msgctxt "field:purchase.line-recreated-stock.move,write_date:"
+msgid "Write Date"
+msgstr ""
+
+msgctxt "field:purchase.line-recreated-stock.move,write_uid:"
+msgid "Write User"
+msgstr ""
+
+msgctxt "field:purchase.product_supplier,code:"
 msgid "Code"
 msgstr ""
 
-msgctxt "field:purchase.product_supplier,company:0"
+msgctxt "field:purchase.product_supplier,company:"
 msgid "Company"
 msgstr ""
 
-msgctxt "field:purchase.product_supplier,delivery_time:0"
+msgctxt "field:purchase.product_supplier,create_date:"
+msgid "Create Date"
+msgstr ""
+
+msgctxt "field:purchase.product_supplier,create_uid:"
+msgid "Create User"
+msgstr ""
+
+msgctxt "field:purchase.product_supplier,currency:"
+msgid "Currency"
+msgstr ""
+
+msgctxt "field:purchase.product_supplier,delivery_time:"
 msgid "Delivery Time"
 msgstr ""
 
-msgctxt "field:purchase.product_supplier,name:0"
+msgctxt "field:purchase.product_supplier,id:"
+msgid "ID"
+msgstr ""
+
+msgctxt "field:purchase.product_supplier,name:"
 msgid "Name"
 msgstr ""
 
-msgctxt "field:purchase.product_supplier,party:0"
+msgctxt "field:purchase.product_supplier,party:"
 msgid "Supplier"
 msgstr ""
 
-msgctxt "field:purchase.product_supplier,prices:0"
+msgctxt "field:purchase.product_supplier,prices:"
 msgid "Prices"
 msgstr ""
 
-msgctxt "field:purchase.product_supplier,product:0"
+msgctxt "field:purchase.product_supplier,product:"
 msgid "Product"
 msgstr ""
 
-msgctxt "field:purchase.product_supplier,rec_name:0"
+msgctxt "field:purchase.product_supplier,rec_name:"
 msgid "Name"
 msgstr ""
 
-msgctxt "field:purchase.product_supplier,sequence:0"
+msgctxt "field:purchase.product_supplier,sequence:"
 msgid "Sequence"
 msgstr ""
 
-msgctxt "field:purchase.product_supplier.price,product_supplier:0"
+msgctxt "field:purchase.product_supplier,write_date:"
+msgid "Write Date"
+msgstr ""
+
+msgctxt "field:purchase.product_supplier,write_uid:"
+msgid "Write User"
+msgstr ""
+
+msgctxt "field:purchase.product_supplier.price,create_date:"
+msgid "Create Date"
+msgstr ""
+
+msgctxt "field:purchase.product_supplier.price,create_uid:"
+msgid "Create User"
+msgstr ""
+
+msgctxt "field:purchase.product_supplier.price,id:"
+msgid "ID"
+msgstr ""
+
+msgctxt "field:purchase.product_supplier.price,product_supplier:"
 msgid "Supplier"
 msgstr ""
 
-msgctxt "field:purchase.product_supplier.price,quantity:0"
+msgctxt "field:purchase.product_supplier.price,quantity:"
 msgid "Quantity"
 msgstr ""
 
-msgctxt "field:purchase.product_supplier.price,rec_name:0"
+msgctxt "field:purchase.product_supplier.price,rec_name:"
 msgid "Name"
 msgstr ""
 
-msgctxt "field:purchase.product_supplier.price,unit_price:0"
+msgctxt "field:purchase.product_supplier.price,unit_price:"
 msgid "Unit Price"
 msgstr ""
 
-msgctxt "field:purchase.purchase,comment:0"
+msgctxt "field:purchase.product_supplier.price,write_date:"
+msgid "Write Date"
+msgstr ""
+
+msgctxt "field:purchase.product_supplier.price,write_uid:"
+msgid "Write User"
+msgstr ""
+
+msgctxt "field:purchase.purchase,comment:"
 msgid "Comment"
 msgstr ""
 
-msgctxt "field:purchase.purchase,company:0"
+msgctxt "field:purchase.purchase,company:"
 msgid "Company"
 msgstr ""
 
-msgctxt "field:purchase.purchase,currency:0"
+msgctxt "field:purchase.purchase,create_date:"
+msgid "Create Date"
+msgstr ""
+
+msgctxt "field:purchase.purchase,create_uid:"
+msgid "Create User"
+msgstr ""
+
+msgctxt "field:purchase.purchase,currency:"
 msgid "Currency"
 msgstr ""
 
-msgctxt "field:purchase.purchase,currency_digits:0"
+msgctxt "field:purchase.purchase,currency_digits:"
 msgid "Currency Digits"
 msgstr ""
 
-msgctxt "field:purchase.purchase,description:0"
+msgctxt "field:purchase.purchase,description:"
 msgid "Description"
 msgstr ""
 
-msgctxt "field:purchase.purchase,invoice_address:0"
-msgid "Invoice Address"
+msgctxt "field:purchase.purchase,id:"
+msgid "ID"
 msgstr ""
 
-msgctxt "field:purchase.purchase,invoice_exception:0"
-msgid "Invoices Exception"
+msgctxt "field:purchase.purchase,invoice_address:"
+msgid "Invoice Address"
 msgstr ""
 
-msgctxt "field:purchase.purchase,invoice_method:0"
+msgctxt "field:purchase.purchase,invoice_method:"
 msgid "Invoice Method"
 msgstr ""
 
-msgctxt "field:purchase.purchase,invoice_paid:0"
-msgid "Invoices Paid"
-msgstr ""
-
-msgctxt "field:purchase.purchase,invoice_state:0"
+msgctxt "field:purchase.purchase,invoice_state:"
 msgid "Invoice State"
 msgstr ""
 
-msgctxt "field:purchase.purchase,invoices:0"
+msgctxt "field:purchase.purchase,invoices:"
 msgid "Invoices"
 msgstr ""
 
-msgctxt "field:purchase.purchase,invoices_ignored:0"
+msgctxt "field:purchase.purchase,invoices_ignored:"
 msgid "Ignored Invoices"
 msgstr ""
 
-msgctxt "field:purchase.purchase,invoices_recreated:0"
+msgctxt "field:purchase.purchase,invoices_recreated:"
 msgid "Recreated Invoices"
 msgstr ""
 
-msgctxt "field:purchase.purchase,lines:0"
+msgctxt "field:purchase.purchase,lines:"
 msgid "Lines"
 msgstr ""
 
-msgctxt "field:purchase.purchase,moves:0"
+msgctxt "field:purchase.purchase,moves:"
 msgid "Moves"
 msgstr ""
 
-msgctxt "field:purchase.purchase,party:0"
+msgctxt "field:purchase.purchase,party:"
 msgid "Party"
 msgstr ""
 
-msgctxt "field:purchase.purchase,party_lang:0"
+msgctxt "field:purchase.purchase,party_lang:"
 msgid "Party Language"
 msgstr ""
 
-msgctxt "field:purchase.purchase,payment_term:0"
+msgctxt "field:purchase.purchase,payment_term:"
 msgid "Payment Term"
 msgstr ""
 
-msgctxt "field:purchase.purchase,purchase_date:0"
+msgctxt "field:purchase.purchase,purchase_date:"
 msgid "Purchase Date"
 msgstr ""
 
-msgctxt "field:purchase.purchase,rec_name:0"
+msgctxt "field:purchase.purchase,rec_name:"
 msgid "Name"
 msgstr ""
 
-msgctxt "field:purchase.purchase,reference:0"
+msgctxt "field:purchase.purchase,reference:"
 msgid "Reference"
 msgstr ""
 
-msgctxt "field:purchase.purchase,shipment_done:0"
-msgid "Shipment Done"
-msgstr ""
-
-msgctxt "field:purchase.purchase,shipment_exception:0"
-msgid "Shipments Exception"
-msgstr ""
-
-msgctxt "field:purchase.purchase,shipment_state:0"
+msgctxt "field:purchase.purchase,shipment_state:"
 msgid "Shipment State"
 msgstr ""
 
-msgctxt "field:purchase.purchase,shipments:0"
+msgctxt "field:purchase.purchase,shipments:"
 msgid "Shipments"
 msgstr ""
 
-msgctxt "field:purchase.purchase,state:0"
+msgctxt "field:purchase.purchase,state:"
 msgid "State"
 msgstr ""
 
-msgctxt "field:purchase.purchase,supplier_reference:0"
+msgctxt "field:purchase.purchase,supplier_reference:"
 msgid "Supplier Reference"
 msgstr ""
 
-msgctxt "field:purchase.purchase,tax_amount:0"
+msgctxt "field:purchase.purchase,tax_amount:"
 msgid "Tax"
 msgstr ""
 
-msgctxt "field:purchase.purchase,total_amount:0"
+msgctxt "field:purchase.purchase,tax_amount_cache:"
+msgid "Tax Cache"
+msgstr ""
+
+msgctxt "field:purchase.purchase,total_amount:"
 msgid "Total"
 msgstr ""
 
-msgctxt "field:purchase.purchase,untaxed_amount:0"
+msgctxt "field:purchase.purchase,total_amount_cache:"
+msgid "Total Cache"
+msgstr ""
+
+msgctxt "field:purchase.purchase,untaxed_amount:"
 msgid "Untaxed"
 msgstr ""
 
-msgctxt "field:purchase.purchase,warehouse:0"
+msgctxt "field:purchase.purchase,untaxed_amount_cache:"
+msgid "Untaxed Cache"
+msgstr ""
+
+msgctxt "field:purchase.purchase,warehouse:"
 msgid "Warehouse"
 msgstr ""
 
-msgctxt "field:purchase.purchase-account.invoice,invoice:0"
+msgctxt "field:purchase.purchase,write_date:"
+msgid "Write Date"
+msgstr ""
+
+msgctxt "field:purchase.purchase,write_uid:"
+msgid "Write User"
+msgstr ""
+
+msgctxt "field:purchase.purchase-account.invoice,create_date:"
+msgid "Create Date"
+msgstr ""
+
+msgctxt "field:purchase.purchase-account.invoice,create_uid:"
+msgid "Create User"
+msgstr ""
+
+msgctxt "field:purchase.purchase-account.invoice,id:"
+msgid "ID"
+msgstr ""
+
+msgctxt "field:purchase.purchase-account.invoice,invoice:"
 msgid "Invoice"
 msgstr ""
 
-msgctxt "field:purchase.purchase-account.invoice,purchase:0"
+msgctxt "field:purchase.purchase-account.invoice,purchase:"
 msgid "Purchase"
 msgstr ""
 
-msgctxt "field:purchase.purchase-account.invoice,rec_name:0"
+msgctxt "field:purchase.purchase-account.invoice,rec_name:"
 msgid "Name"
 msgstr ""
 
-msgctxt "field:purchase.purchase-ignored-account.invoice,invoice:0"
+msgctxt "field:purchase.purchase-account.invoice,write_date:"
+msgid "Write Date"
+msgstr ""
+
+msgctxt "field:purchase.purchase-account.invoice,write_uid:"
+msgid "Write User"
+msgstr ""
+
+msgctxt "field:purchase.purchase-ignored-account.invoice,create_date:"
+msgid "Create Date"
+msgstr ""
+
+msgctxt "field:purchase.purchase-ignored-account.invoice,create_uid:"
+msgid "Create User"
+msgstr ""
+
+msgctxt "field:purchase.purchase-ignored-account.invoice,id:"
+msgid "ID"
+msgstr ""
+
+msgctxt "field:purchase.purchase-ignored-account.invoice,invoice:"
 msgid "Invoice"
 msgstr ""
 
-msgctxt "field:purchase.purchase-ignored-account.invoice,purchase:0"
+msgctxt "field:purchase.purchase-ignored-account.invoice,purchase:"
 msgid "Purchase"
 msgstr ""
 
-msgctxt "field:purchase.purchase-ignored-account.invoice,rec_name:0"
+msgctxt "field:purchase.purchase-ignored-account.invoice,rec_name:"
 msgid "Name"
 msgstr ""
 
-msgctxt "field:purchase.purchase-recreated-account.invoice,invoice:0"
+msgctxt "field:purchase.purchase-ignored-account.invoice,write_date:"
+msgid "Write Date"
+msgstr ""
+
+msgctxt "field:purchase.purchase-ignored-account.invoice,write_uid:"
+msgid "Write User"
+msgstr ""
+
+msgctxt "field:purchase.purchase-recreated-account.invoice,create_date:"
+msgid "Create Date"
+msgstr ""
+
+msgctxt "field:purchase.purchase-recreated-account.invoice,create_uid:"
+msgid "Create User"
+msgstr ""
+
+msgctxt "field:purchase.purchase-recreated-account.invoice,id:"
+msgid "ID"
+msgstr ""
+
+msgctxt "field:purchase.purchase-recreated-account.invoice,invoice:"
 msgid "Invoice"
 msgstr ""
 
-msgctxt "field:purchase.purchase-recreated-account.invoice,purchase:0"
+msgctxt "field:purchase.purchase-recreated-account.invoice,purchase:"
 msgid "Purchase"
 msgstr ""
 
-msgctxt "field:purchase.purchase-recreated-account.invoice,rec_name:0"
+msgctxt "field:purchase.purchase-recreated-account.invoice,rec_name:"
 msgid "Name"
 msgstr ""
 
-msgctxt "field:stock.move,purchase:0"
+msgctxt "field:purchase.purchase-recreated-account.invoice,write_date:"
+msgid "Write Date"
+msgstr ""
+
+msgctxt "field:purchase.purchase-recreated-account.invoice,write_uid:"
+msgid "Write User"
+msgstr ""
+
+msgctxt "field:stock.move,purchase:"
 msgid "Purchase"
 msgstr ""
 
-msgctxt "field:stock.move,purchase_currency:0"
+msgctxt "field:stock.move,purchase_currency:"
 msgid "Purchase Currency"
 msgstr ""
 
-msgctxt "field:stock.move,purchase_exception_state:0"
+msgctxt "field:stock.move,purchase_exception_state:"
 msgid "Exception State"
 msgstr ""
 
-msgctxt "field:stock.move,purchase_line:0"
+msgctxt "field:stock.move,purchase_line:"
 msgid "Purchase Line"
 msgstr ""
 
-msgctxt "field:stock.move,purchase_quantity:0"
+msgctxt "field:stock.move,purchase_quantity:"
 msgid "Purchase Quantity"
 msgstr ""
 
-msgctxt "field:stock.move,purchase_unit:0"
+msgctxt "field:stock.move,purchase_unit:"
 msgid "Purchase Unit"
 msgstr ""
 
-msgctxt "field:stock.move,purchase_unit_digits:0"
+msgctxt "field:stock.move,purchase_unit_digits:"
 msgid "Purchase Unit Digits"
 msgstr ""
 
-msgctxt "field:stock.move,purchase_unit_price:0"
+msgctxt "field:stock.move,purchase_unit_price:"
 msgid "Purchase Unit Price"
 msgstr ""
 
-msgctxt "field:stock.move,purchase_visible:0"
+msgctxt "field:stock.move,purchase_visible:"
 msgid "Purchase Visible"
 msgstr ""
 
-msgctxt "field:stock.move,supplier:0"
+msgctxt "field:stock.move,supplier:"
 msgid "Supplier"
 msgstr ""
 
-msgctxt "help:purchase.handle.invoice.exception.ask,recreate_invoices:0"
+msgctxt "help:purchase.handle.invoice.exception.ask,recreate_invoices:"
 msgid ""
 "The selected invoices will be recreated. The other ones will be ignored."
 msgstr ""
 
-msgctxt "help:purchase.handle.shipment.exception.ask,recreate_moves:0"
+msgctxt "help:purchase.handle.shipment.exception.ask,recreate_moves:"
 msgid "The selected moves will be recreated. The other ones will be ignored."
 msgstr ""
 
-msgctxt "help:purchase.product_supplier,delivery_time:0"
+msgctxt "help:purchase.product_supplier,delivery_time:"
 msgid "In number of days"
 msgstr ""
 
-msgctxt "help:purchase.product_supplier.price,quantity:0"
+msgctxt "help:purchase.product_supplier.price,quantity:"
 msgid "Minimal quantity"
 msgstr ""
 
@@ -576,59 +848,59 @@ msgctxt "model:ir.ui.menu,name:menu_supplier"
 msgid "Parties associated to Purchases"
 msgstr ""
 
-msgctxt "model:purchase.configuration,name:0"
+msgctxt "model:purchase.configuration,name:"
 msgid "Purchase Configuration"
 msgstr ""
 
-msgctxt "model:purchase.handle.invoice.exception.ask,name:0"
-msgid "Invoice Exception Ask"
+msgctxt "model:purchase.handle.invoice.exception.ask,name:"
+msgid "Handle Invoice Exception"
 msgstr ""
 
-msgctxt "model:purchase.handle.shipment.exception.ask,name:0"
-msgid "Shipment Exception Ask"
+msgctxt "model:purchase.handle.shipment.exception.ask,name:"
+msgid "Handle Shipment Exception"
 msgstr ""
 
-msgctxt "model:purchase.line,name:0"
+msgctxt "model:purchase.line,name:"
 msgid "Purchase Line"
 msgstr ""
 
-msgctxt "model:purchase.line-account.invoice.line,name:0"
+msgctxt "model:purchase.line-account.invoice.line,name:"
 msgid "Purchase Line - Invoice Line"
 msgstr ""
 
-msgctxt "model:purchase.line-account.tax,name:0"
+msgctxt "model:purchase.line-account.tax,name:"
 msgid "Purchase Line - Tax"
 msgstr ""
 
-msgctxt "model:purchase.line-ignored-stock.move,name:0"
+msgctxt "model:purchase.line-ignored-stock.move,name:"
 msgid "Purchase Line - Ignored Move"
 msgstr ""
 
-msgctxt "model:purchase.line-recreated-stock.move,name:0"
+msgctxt "model:purchase.line-recreated-stock.move,name:"
 msgid "Purchase Line - Ignored Move"
 msgstr ""
 
-msgctxt "model:purchase.product_supplier,name:0"
+msgctxt "model:purchase.product_supplier,name:"
 msgid "Product Supplier"
 msgstr ""
 
-msgctxt "model:purchase.product_supplier.price,name:0"
+msgctxt "model:purchase.product_supplier.price,name:"
 msgid "Product Supplier Price"
 msgstr ""
 
-msgctxt "model:purchase.purchase,name:0"
+msgctxt "model:purchase.purchase,name:"
 msgid "Purchase"
 msgstr ""
 
-msgctxt "model:purchase.purchase-account.invoice,name:0"
+msgctxt "model:purchase.purchase-account.invoice,name:"
 msgid "Purchase - Invoice"
 msgstr ""
 
-msgctxt "model:purchase.purchase-ignored-account.invoice,name:0"
+msgctxt "model:purchase.purchase-ignored-account.invoice,name:"
 msgid "Purchase - Ignored Invoice"
 msgstr ""
 
-msgctxt "model:purchase.purchase-recreated-account.invoice,name:0"
+msgctxt "model:purchase.purchase-recreated-account.invoice,name:"
 msgid "Purchase - Recreated Invoice"
 msgstr ""
 
@@ -640,404 +912,338 @@ msgctxt "model:res.group,name:group_purchase_admin"
 msgid "Purchase Administrator"
 msgstr ""
 
-msgctxt "model:workflow,name:purchase_workflow"
-msgid "Purchase workflow"
-msgstr ""
-
-msgctxt "model:workflow.activity,name:purchase_activity_cancel"
-msgid "Canceled"
-msgstr ""
-
-msgctxt "model:workflow.activity,name:purchase_activity_confirmed"
-msgid "Confirmed"
-msgstr ""
-
-msgctxt "model:workflow.activity,name:purchase_activity_done"
-msgid "Done"
-msgstr ""
-
-msgctxt "model:workflow.activity,name:purchase_activity_draft"
-msgid "Draft"
-msgstr ""
-
-msgctxt "model:workflow.activity,name:purchase_activity_invoice_done"
-msgid "Invoice Done"
-msgstr ""
-
-msgctxt "model:workflow.activity,name:purchase_activity_invoice_method"
-msgid "Invoice Method"
-msgstr ""
-
-msgctxt "model:workflow.activity,name:purchase_activity_invoice_method_done"
-msgid "Invoice Method Done"
-msgstr ""
-
-msgctxt ""
-"model:workflow.activity,name:purchase_activity_invoice_purchase_exception"
-msgid "Invoice Exception"
-msgstr ""
-
-msgctxt "model:workflow.activity,name:purchase_activity_invoice_shipment"
-msgid "Invoice Shipment"
-msgstr ""
-
-msgctxt "model:workflow.activity,name:purchase_activity_invoice_shipment_done"
-msgid "Invoice Shipment Done"
-msgstr ""
-
-msgctxt ""
-"model:workflow.activity,name:purchase_activity_invoice_shipment_exception"
-msgid "Invoice Shipment Exception"
-msgstr ""
-
-msgctxt ""
-"model:workflow.activity,name:purchase_activity_invoice_shipment_method"
-msgid "Invoice Shipment Method"
-msgstr ""
-
-msgctxt ""
-"model:workflow.activity,name:purchase_activity_invoice_shipment_method_done"
-msgid "Invoice Shipment Method Done"
-msgstr ""
-
-msgctxt "model:workflow.activity,name:purchase_activity_quotation"
-msgid "Quotation"
-msgstr ""
-
-msgctxt "model:workflow.activity,name:purchase_activity_shipment_exception"
-msgid "Shipment Exception"
-msgstr ""
-
-msgctxt ""
-"model:workflow.activity,name:purchase_activity_waiting_invoice_purchase"
-msgid "Waiting Invoice"
-msgstr ""
-
-msgctxt ""
-"model:workflow.activity,name:purchase_activity_waiting_invoice_shipment"
-msgid "Waiting Invoice Shipment"
-msgstr ""
-
-msgctxt "model:workflow.activity,name:purchase_activity_waiting_shipment"
-msgid "Waiting Shipment"
-msgstr ""
-
-msgctxt "odt:purchase.purchase:0"
+msgctxt "odt:purchase.purchase:"
 msgid "Amount"
 msgstr ""
 
-msgctxt "odt:purchase.purchase:0"
+msgctxt "odt:purchase.purchase:"
 msgid "Date:"
 msgstr ""
 
-msgctxt "odt:purchase.purchase:0"
+msgctxt "odt:purchase.purchase:"
 msgid "Description"
 msgstr ""
 
-msgctxt "odt:purchase.purchase:0"
+msgctxt "odt:purchase.purchase:"
 msgid "Description:"
 msgstr ""
 
-msgctxt "odt:purchase.purchase:0"
+msgctxt "odt:purchase.purchase:"
 msgid "Draft Purchase Order"
 msgstr ""
 
-msgctxt "odt:purchase.purchase:0"
+msgctxt "odt:purchase.purchase:"
 msgid "E-Mail:"
 msgstr ""
 
-msgctxt "odt:purchase.purchase:0"
+msgctxt "odt:purchase.purchase:"
 msgid "Phone:"
 msgstr ""
 
-msgctxt "odt:purchase.purchase:0"
+msgctxt "odt:purchase.purchase:"
 msgid "Purchase Order N°:"
 msgstr ""
 
-msgctxt "odt:purchase.purchase:0"
+msgctxt "odt:purchase.purchase:"
 msgid "Quantity"
 msgstr ""
 
-msgctxt "odt:purchase.purchase:0"
+msgctxt "odt:purchase.purchase:"
 msgid "Request for Quotation N°:"
 msgstr ""
 
-msgctxt "odt:purchase.purchase:0"
+msgctxt "odt:purchase.purchase:"
 msgid "Taxes"
 msgstr ""
 
-msgctxt "odt:purchase.purchase:0"
+msgctxt "odt:purchase.purchase:"
 msgid "Taxes:"
 msgstr ""
 
-msgctxt "odt:purchase.purchase:0"
+msgctxt "odt:purchase.purchase:"
 msgid "Total (excl. taxes):"
 msgstr ""
 
-msgctxt "odt:purchase.purchase:0"
+msgctxt "odt:purchase.purchase:"
 msgid "Total:"
 msgstr ""
 
-msgctxt "odt:purchase.purchase:0"
+msgctxt "odt:purchase.purchase:"
 msgid "Unit Price"
 msgstr ""
 
-msgctxt "odt:purchase.purchase:0"
+msgctxt "odt:purchase.purchase:"
 msgid "VAT Number:"
 msgstr ""
 
-msgctxt "odt:purchase.purchase:0"
+msgctxt "odt:purchase.purchase:"
 msgid "VAT:"
 msgstr ""
 
-msgctxt "selection:account.invoice,purchase_exception_state:0"
+msgctxt "selection:account.invoice,purchase_exception_state:"
 msgid ""
 msgstr ""
 
-msgctxt "selection:account.invoice,purchase_exception_state:0"
+msgctxt "selection:account.invoice,purchase_exception_state:"
 msgid "Ignored"
 msgstr ""
 
-msgctxt "selection:account.invoice,purchase_exception_state:0"
+msgctxt "selection:account.invoice,purchase_exception_state:"
 msgid "Recreated"
 msgstr ""
 
-msgctxt "selection:purchase.configuration,purchase_invoice_method:0"
+msgctxt "selection:purchase.configuration,purchase_invoice_method:"
 msgid "Based On Order"
 msgstr ""
 
-msgctxt "selection:purchase.configuration,purchase_invoice_method:0"
+msgctxt "selection:purchase.configuration,purchase_invoice_method:"
 msgid "Based On Shipment"
 msgstr ""
 
-msgctxt "selection:purchase.configuration,purchase_invoice_method:0"
+msgctxt "selection:purchase.configuration,purchase_invoice_method:"
 msgid "Manual"
 msgstr ""
 
-msgctxt "selection:purchase.line,type:0"
+msgctxt "selection:purchase.line,type:"
 msgid "Comment"
 msgstr ""
 
-msgctxt "selection:purchase.line,type:0"
+msgctxt "selection:purchase.line,type:"
 msgid "Line"
 msgstr ""
 
-msgctxt "selection:purchase.line,type:0"
+msgctxt "selection:purchase.line,type:"
 msgid "Subtotal"
 msgstr ""
 
-msgctxt "selection:purchase.line,type:0"
+msgctxt "selection:purchase.line,type:"
 msgid "Title"
 msgstr ""
 
-msgctxt "selection:purchase.purchase,invoice_method:0"
+msgctxt "selection:purchase.purchase,invoice_method:"
 msgid "Based On Order"
 msgstr ""
 
-msgctxt "selection:purchase.purchase,invoice_method:0"
+msgctxt "selection:purchase.purchase,invoice_method:"
 msgid "Based On Shipment"
 msgstr ""
 
-msgctxt "selection:purchase.purchase,invoice_method:0"
+msgctxt "selection:purchase.purchase,invoice_method:"
 msgid "Manual"
 msgstr ""
 
-msgctxt "selection:purchase.purchase,invoice_state:0"
+msgctxt "selection:purchase.purchase,invoice_state:"
 msgid "Exception"
 msgstr ""
 
-msgctxt "selection:purchase.purchase,invoice_state:0"
+msgctxt "selection:purchase.purchase,invoice_state:"
 msgid "None"
 msgstr ""
 
-msgctxt "selection:purchase.purchase,invoice_state:0"
+msgctxt "selection:purchase.purchase,invoice_state:"
 msgid "Paid"
 msgstr ""
 
-msgctxt "selection:purchase.purchase,invoice_state:0"
+msgctxt "selection:purchase.purchase,invoice_state:"
 msgid "Waiting"
 msgstr ""
 
-msgctxt "selection:purchase.purchase,shipment_state:0"
+msgctxt "selection:purchase.purchase,shipment_state:"
 msgid "Exception"
 msgstr ""
 
-msgctxt "selection:purchase.purchase,shipment_state:0"
+msgctxt "selection:purchase.purchase,shipment_state:"
 msgid "None"
 msgstr ""
 
-msgctxt "selection:purchase.purchase,shipment_state:0"
+msgctxt "selection:purchase.purchase,shipment_state:"
 msgid "Received"
 msgstr ""
 
-msgctxt "selection:purchase.purchase,shipment_state:0"
+msgctxt "selection:purchase.purchase,shipment_state:"
 msgid "Waiting"
 msgstr ""
 
-msgctxt "selection:purchase.purchase,state:0"
+msgctxt "selection:purchase.purchase,state:"
 msgid "Canceled"
 msgstr ""
 
-msgctxt "selection:purchase.purchase,state:0"
+msgctxt "selection:purchase.purchase,state:"
 msgid "Confirmed"
 msgstr ""
 
-msgctxt "selection:purchase.purchase,state:0"
+msgctxt "selection:purchase.purchase,state:"
 msgid "Done"
 msgstr ""
 
-msgctxt "selection:purchase.purchase,state:0"
+msgctxt "selection:purchase.purchase,state:"
 msgid "Draft"
 msgstr ""
 
-msgctxt "selection:purchase.purchase,state:0"
+msgctxt "selection:purchase.purchase,state:"
 msgid "Quotation"
 msgstr ""
 
-msgctxt "selection:stock.move,purchase_exception_state:0"
+msgctxt "selection:stock.move,purchase_exception_state:"
 msgid ""
 msgstr ""
 
-msgctxt "selection:stock.move,purchase_exception_state:0"
+msgctxt "selection:stock.move,purchase_exception_state:"
 msgid "Ignored"
 msgstr ""
 
-msgctxt "selection:stock.move,purchase_exception_state:0"
+msgctxt "selection:stock.move,purchase_exception_state:"
 msgid "Recreated"
 msgstr ""
 
-msgctxt "view:product.template:0"
+msgctxt "view:product.product:"
+msgid "Products"
+msgstr ""
+
+msgctxt "view:product.template:"
 msgid "Product Suppliers"
 msgstr ""
 
-msgctxt "view:product.template:0"
+msgctxt "view:product.template:"
 msgid "Suppliers"
 msgstr ""
 
-msgctxt "view:purchase.configuration:0"
+msgctxt "view:purchase.configuration:"
 msgid "Purchase Configuration"
 msgstr ""
 
-msgctxt "view:purchase.handle.invoice.exception.ask:0"
+msgctxt "view:purchase.handle.invoice.exception.ask:"
 msgid "Choose invoices to recreate"
 msgstr ""
 
-msgctxt "view:purchase.handle.invoice.exception.ask:0"
+msgctxt "view:purchase.handle.invoice.exception.ask:"
 msgid "Handle Invoice Exception"
 msgstr ""
 
-msgctxt "view:purchase.handle.shipment.exception.ask:0"
+msgctxt "view:purchase.handle.shipment.exception.ask:"
 msgid "Choose move to recreate"
 msgstr ""
 
-msgctxt "view:purchase.handle.shipment.exception.ask:0"
+msgctxt "view:purchase.handle.shipment.exception.ask:"
 msgid "Handle shipment Exception"
 msgstr ""
 
-msgctxt "view:purchase.handle.shipment.exception.ask:0"
+msgctxt "view:purchase.handle.shipment.exception.ask:"
 msgid "Recreated Moves"
 msgstr ""
 
-msgctxt "view:purchase.line:0"
+msgctxt "view:purchase.line:"
 msgid "General"
 msgstr ""
 
-msgctxt "view:purchase.line:0"
+msgctxt "view:purchase.line:"
+msgid "Lines"
+msgstr ""
+
+msgctxt "view:purchase.line:"
 msgid "Notes"
 msgstr ""
 
-msgctxt "view:purchase.line:0"
+msgctxt "view:purchase.line:"
 msgid "Products"
 msgstr ""
 
-msgctxt "view:purchase.line:0"
+msgctxt "view:purchase.line:"
 msgid "Purchase Line"
 msgstr ""
 
-msgctxt "view:purchase.line:0"
+msgctxt "view:purchase.line:"
 msgid "Purchase Lines"
 msgstr ""
 
-msgctxt "view:purchase.product_supplier.price:0"
+msgctxt "view:purchase.product_supplier.price:"
 msgid "Product Supplier Price"
 msgstr ""
 
-msgctxt "view:purchase.product_supplier.price:0"
+msgctxt "view:purchase.product_supplier.price:"
 msgid "Product Supplier Prices"
 msgstr ""
 
-msgctxt "view:purchase.product_supplier:0"
+msgctxt "view:purchase.product_supplier:"
 msgid "Product Supplier"
 msgstr ""
 
-msgctxt "view:purchase.product_supplier:0"
+msgctxt "view:purchase.product_supplier:"
 msgid "Product Suppliers"
 msgstr ""
 
-msgctxt "view:purchase.purchase:0"
+msgctxt "view:purchase.purchase:"
 msgid "Cancel"
 msgstr ""
 
-msgctxt "view:purchase.purchase:0"
+msgctxt "view:purchase.purchase:"
 msgid "Confirm"
 msgstr ""
 
-msgctxt "view:purchase.purchase:0"
+msgctxt "view:purchase.purchase:"
 msgid "Draft"
 msgstr ""
 
-msgctxt "view:purchase.purchase:0"
+msgctxt "view:purchase.purchase:"
 msgid "Handle Invoice Exception"
 msgstr ""
 
-msgctxt "view:purchase.purchase:0"
+msgctxt "view:purchase.purchase:"
 msgid "Handle Shipment Exception"
 msgstr ""
 
-msgctxt "view:purchase.purchase:0"
+msgctxt "view:purchase.purchase:"
 msgid "Invoices"
 msgstr ""
 
-msgctxt "view:purchase.purchase:0"
+msgctxt "view:purchase.purchase:"
 msgid "Lines"
 msgstr ""
 
-msgctxt "view:purchase.purchase:0"
+msgctxt "view:purchase.purchase:"
 msgid "Moves"
 msgstr ""
 
-msgctxt "view:purchase.purchase:0"
+msgctxt "view:purchase.purchase:"
 msgid "Other Info"
 msgstr ""
 
-msgctxt "view:purchase.purchase:0"
+msgctxt "view:purchase.purchase:"
 msgid "Purchase"
 msgstr ""
 
-msgctxt "view:purchase.purchase:0"
+msgctxt "view:purchase.purchase:"
 msgid "Purchases"
 msgstr ""
 
-msgctxt "view:purchase.purchase:0"
+msgctxt "view:purchase.purchase:"
 msgid "Quotation"
 msgstr ""
 
-msgctxt "view:purchase.purchase:0"
+msgctxt "view:purchase.purchase:"
+msgid "Quote"
+msgstr ""
+
+msgctxt "view:purchase.purchase:"
 msgid "Shipments"
 msgstr ""
 
-msgctxt "wizard_button:purchase.handle.invoice.exception,init,end:0"
+msgctxt "view:stock.move:"
+msgid "Moves"
+msgstr ""
+
+msgctxt "wizard_button:purchase.handle.invoice.exception,ask,end:"
 msgid "Cancel"
 msgstr ""
 
-msgctxt "wizard_button:purchase.handle.invoice.exception,init,ok:0"
+msgctxt "wizard_button:purchase.handle.invoice.exception,ask,handle:"
 msgid "Ok"
 msgstr ""
 
-msgctxt "wizard_button:purchase.handle.shipment.exception,init,end:0"
+msgctxt "wizard_button:purchase.handle.shipment.exception,ask,end:"
 msgid "Cancel"
 msgstr ""
 
-msgctxt "wizard_button:purchase.handle.shipment.exception,init,ok:0"
+msgctxt "wizard_button:purchase.handle.shipment.exception,ask,handle:"
 msgid "Ok"
 msgstr ""
diff --git a/locale/de_DE.po b/locale/de_DE.po
index 8b11d49..a2976eb 100644
--- a/locale/de_DE.po
+++ b/locale/de_DE.po
@@ -2,496 +2,768 @@
 msgid ""
 msgstr "Content-Type: text/plain; charset=utf-8\n"
 
-msgctxt "error:account.invoice:0"
+msgctxt "error:account.invoice:"
 msgid "You can not delete invoices that come from a purchase!"
 msgstr ""
 "Durch einen Einkauf generierte Rechnungen können nicht gelöscht werden!"
 
-msgctxt "error:account.invoice:0"
+msgctxt "error:account.invoice:"
 msgid "You cannot reset to draft an invoice generated by a purchase."
 msgstr ""
 "Eine durch einen Einkauf generierte Bewegung kann nicht auf Entwurf "
 "zurückgesetzt werden."
 
-msgctxt "error:product.template:0"
+msgctxt "error:product.template:"
 msgid ""
 "Purchase prices are based on the purchase uom, are you sure to change it?"
 msgstr ""
 "Einkaufspreise basieren auf der Maßeinheit für den Einkauf.\n"
 "Soll sie wirklich geändert werden?"
 
-msgctxt "error:purchase.line:0"
+msgctxt "error:purchase.line:"
 msgid "It misses an \"Account Expense\" on product \"%s\"!"
 msgstr "Es ist ken Aufwandskonto für Artikel \"%s\" definiert!"
 
-msgctxt "error:purchase.line:0"
+msgctxt "error:purchase.line:"
 msgid "It misses an \"account expense\" default property!"
 msgstr "Es ist keine Standardeigenschaft für das Aufwandskonto definiert!"
 
-msgctxt "error:purchase.line:0"
+msgctxt "error:purchase.line:"
 msgid "The supplier location is required!"
 msgstr "Der Lagerort des Lieferanten muss eingegeben werden!"
 
-msgctxt "error:purchase.purchase:0"
+msgctxt "error:purchase.purchase:"
+msgid "A warehouse must be defined for the quotation."
+msgstr "Für eine Angebotsanfrage muss ein Warenlager angegeben werden"
+
+msgctxt "error:purchase.purchase:"
 msgid "Invoice addresses must be defined for the quotation."
 msgstr "Die Rechnungsadresse muss für ein Angebot angegeben werden."
 
-msgctxt "error:purchase.purchase:0"
+msgctxt "error:purchase.purchase:"
 msgid "It misses an \"Account Payable\" on the party \"%s\"!"
 msgstr "Es ist kein Verbindlichkeitskonto für Partei \"%s\" definiert!"
 
-msgctxt "error:stock.shipment.in:0"
+msgctxt "error:purchase.purchase:"
+msgid "Purchase \"%s\" must be cancelled before deletion!"
+msgstr "Einkauf \"%s\" muss annulliert werden, bevor er gelöscht werden kann."
+
+msgctxt "error:stock.shipment.in:"
 msgid "You cannot reset to draft a move generated by a purchase."
 msgstr ""
 "Eine durch einen Einkauf generierte Bewegung kann nicht auf Entwurf "
 "zurückgesetzt werden."
 
-msgctxt "field:account.invoice,purchase_exception_state:0"
+msgctxt "field:account.invoice,purchase_exception_state:"
 msgid "Exception State"
 msgstr "Status Vorbehalt"
 
-msgctxt "field:account.invoice,purchases:0"
+msgctxt "field:account.invoice,purchases:"
 msgid "Purchases"
 msgstr "Einkäufe"
 
-msgctxt "field:account.invoice.line,purchase_lines:0"
+msgctxt "field:account.invoice.line,purchase_lines:"
 msgid "Purchase Lines"
 msgstr "Positionen Einkauf"
 
-msgctxt "field:product.template,product_suppliers:0"
+msgctxt "field:product.template,product_suppliers:"
 msgid "Suppliers"
 msgstr "Lieferanten"
 
-msgctxt "field:product.template,purchasable:0"
+msgctxt "field:product.template,purchasable:"
 msgid "Purchasable"
 msgstr "Käuflich"
 
-msgctxt "field:product.template,purchase_uom:0"
+msgctxt "field:product.template,purchase_uom:"
 msgid "Purchase UOM"
 msgstr "Einheit Einkauf"
 
-msgctxt "field:purchase.configuration,purchase_invoice_method:0"
+msgctxt "field:purchase.configuration,create_date:"
+msgid "Create Date"
+msgstr "Erstellungsdatum"
+
+msgctxt "field:purchase.configuration,create_uid:"
+msgid "Create User"
+msgstr "Erstellt durch"
+
+msgctxt "field:purchase.configuration,id:"
+msgid "ID"
+msgstr "ID"
+
+msgctxt "field:purchase.configuration,purchase_invoice_method:"
 msgid "Invoice Method"
 msgstr "Rechnungsstellung Einkauf"
 
-msgctxt "field:purchase.configuration,purchase_sequence:0"
+msgctxt "field:purchase.configuration,purchase_sequence:"
 msgid "Purchase Reference Sequence"
 msgstr "Nummernkreis Einkauf"
 
-msgctxt "field:purchase.configuration,rec_name:0"
+msgctxt "field:purchase.configuration,rec_name:"
 msgid "Name"
 msgstr "Name"
 
-msgctxt "field:purchase.handle.invoice.exception.ask,domain_invoices:0"
+msgctxt "field:purchase.configuration,write_date:"
+msgid "Write Date"
+msgstr "Zuletzt geändert"
+
+msgctxt "field:purchase.configuration,write_uid:"
+msgid "Write User"
+msgstr "Letzte Änderung durch"
+
+msgctxt "field:purchase.handle.invoice.exception.ask,domain_invoices:"
 msgid "Domain Invoices"
 msgstr "Wertebereich Rechnungen (Domain)"
 
-msgctxt "field:purchase.handle.invoice.exception.ask,recreate_invoices:0"
+msgctxt "field:purchase.handle.invoice.exception.ask,id:"
+msgid "ID"
+msgstr "ID"
+
+msgctxt "field:purchase.handle.invoice.exception.ask,recreate_invoices:"
 msgid "Recreate Invoices"
 msgstr "Rechnungen nachbilden"
 
-msgctxt "field:purchase.handle.shipment.exception.ask,domain_moves:0"
+msgctxt "field:purchase.handle.shipment.exception.ask,domain_moves:"
 msgid "Domain Moves"
 msgstr "Wertebereich Bewegungen (Domain)"
 
-msgctxt "field:purchase.handle.shipment.exception.ask,recreate_moves:0"
+msgctxt "field:purchase.handle.shipment.exception.ask,id:"
+msgid "ID"
+msgstr "ID"
+
+msgctxt "field:purchase.handle.shipment.exception.ask,recreate_moves:"
 msgid "Recreate Moves"
 msgstr "Bewegungen nachbilden"
 
-msgctxt "field:purchase.line,amount:0"
+msgctxt "field:purchase.line,amount:"
 msgid "Amount"
 msgstr "Betrag"
 
-msgctxt "field:purchase.line,description:0"
+msgctxt "field:purchase.line,create_date:"
+msgid "Create Date"
+msgstr "Erstellungsdatum"
+
+msgctxt "field:purchase.line,create_uid:"
+msgid "Create User"
+msgstr "Erstellt durch"
+
+msgctxt "field:purchase.line,delivery_date:"
+msgid "Delivery Date"
+msgstr "Lieferdatum"
+
+msgctxt "field:purchase.line,description:"
 msgid "Description"
 msgstr "Bezeichnung"
 
-msgctxt "field:purchase.line,invoice_lines:0"
+msgctxt "field:purchase.line,from_location:"
+msgid "From Location"
+msgstr "Von Lagerort"
+
+msgctxt "field:purchase.line,id:"
+msgid "ID"
+msgstr "ID"
+
+msgctxt "field:purchase.line,invoice_lines:"
 msgid "Invoice Lines"
 msgstr "Rechnungspositionen"
 
-msgctxt "field:purchase.line,move_done:0"
+msgctxt "field:purchase.line,move_done:"
 msgid "Moves Done"
 msgstr "Bewegungen erledigt"
 
-msgctxt "field:purchase.line,move_exception:0"
+msgctxt "field:purchase.line,move_exception:"
 msgid "Moves Exception"
 msgstr "Bewegungsvorbehalt"
 
-msgctxt "field:purchase.line,moves:0"
+msgctxt "field:purchase.line,moves:"
 msgid "Moves"
 msgstr "Bewegungen"
 
-msgctxt "field:purchase.line,moves_ignored:0"
+msgctxt "field:purchase.line,moves_ignored:"
 msgid "Ignored Moves"
 msgstr "Ignorierte Bewegungen"
 
-msgctxt "field:purchase.line,moves_recreated:0"
+msgctxt "field:purchase.line,moves_recreated:"
 msgid "Recreated Moves"
 msgstr "Nachgebildete Bewegungen"
 
-msgctxt "field:purchase.line,note:0"
+msgctxt "field:purchase.line,note:"
 msgid "Note"
 msgstr "Notiz"
 
-msgctxt "field:purchase.line,product:0"
+msgctxt "field:purchase.line,product:"
 msgid "Product"
 msgstr "Artikel"
 
-msgctxt "field:purchase.line,purchase:0"
+msgctxt "field:purchase.line,product_uom_category:"
+msgid "Product Uom Category"
+msgstr "Artikel Maßeinheit Kategorie"
+
+msgctxt "field:purchase.line,purchase:"
 msgid "Purchase"
 msgstr "Einkauf"
 
-msgctxt "field:purchase.line,quantity:0"
+msgctxt "field:purchase.line,quantity:"
 msgid "Quantity"
 msgstr "Anzahl"
 
-msgctxt "field:purchase.line,rec_name:0"
+msgctxt "field:purchase.line,rec_name:"
 msgid "Name"
 msgstr "Name"
 
-msgctxt "field:purchase.line,sequence:0"
+msgctxt "field:purchase.line,sequence:"
 msgid "Sequence"
 msgstr "Reihenfolge"
 
-msgctxt "field:purchase.line,taxes:0"
+msgctxt "field:purchase.line,taxes:"
 msgid "Taxes"
 msgstr "Steuern"
 
-msgctxt "field:purchase.line,type:0"
+msgctxt "field:purchase.line,to_location:"
+msgid "To Location"
+msgstr "Zu Lagerort"
+
+msgctxt "field:purchase.line,type:"
 msgid "Type"
 msgstr "Typ"
 
-msgctxt "field:purchase.line,unit:0"
+msgctxt "field:purchase.line,unit:"
 msgid "Unit"
 msgstr "Einheit"
 
-msgctxt "field:purchase.line,unit_digits:0"
+msgctxt "field:purchase.line,unit_digits:"
 msgid "Unit Digits"
 msgstr "Anzahl Stellen"
 
-msgctxt "field:purchase.line,unit_price:0"
+msgctxt "field:purchase.line,unit_price:"
 msgid "Unit Price"
 msgstr "Einzelpreis"
 
-msgctxt "field:purchase.line-account.invoice.line,invoice_line:0"
+msgctxt "field:purchase.line,write_date:"
+msgid "Write Date"
+msgstr "Zuletzt geändert"
+
+msgctxt "field:purchase.line,write_uid:"
+msgid "Write User"
+msgstr "Letzte Änderung durch"
+
+msgctxt "field:purchase.line-account.invoice.line,create_date:"
+msgid "Create Date"
+msgstr "Erstellungsdatum"
+
+msgctxt "field:purchase.line-account.invoice.line,create_uid:"
+msgid "Create User"
+msgstr "Erstellt durch"
+
+msgctxt "field:purchase.line-account.invoice.line,id:"
+msgid "ID"
+msgstr "ID"
+
+msgctxt "field:purchase.line-account.invoice.line,invoice_line:"
 msgid "Invoice Line"
 msgstr "Rechnungsposition"
 
-msgctxt "field:purchase.line-account.invoice.line,purchase_line:0"
+msgctxt "field:purchase.line-account.invoice.line,purchase_line:"
 msgid "Purchase Line"
 msgstr "Position Einkauf"
 
-msgctxt "field:purchase.line-account.invoice.line,rec_name:0"
+msgctxt "field:purchase.line-account.invoice.line,rec_name:"
 msgid "Name"
 msgstr "Name"
 
-msgctxt "field:purchase.line-account.tax,line:0"
+msgctxt "field:purchase.line-account.invoice.line,write_date:"
+msgid "Write Date"
+msgstr "Zuletzt geändert"
+
+msgctxt "field:purchase.line-account.invoice.line,write_uid:"
+msgid "Write User"
+msgstr "Letzte Änderung durch"
+
+msgctxt "field:purchase.line-account.tax,create_date:"
+msgid "Create Date"
+msgstr "Erstellungsdatum"
+
+msgctxt "field:purchase.line-account.tax,create_uid:"
+msgid "Create User"
+msgstr "Erstellt durch"
+
+msgctxt "field:purchase.line-account.tax,id:"
+msgid "ID"
+msgstr "ID"
+
+msgctxt "field:purchase.line-account.tax,line:"
 msgid "Purchase Line"
 msgstr "Position Einkauf"
 
-msgctxt "field:purchase.line-account.tax,rec_name:0"
+msgctxt "field:purchase.line-account.tax,rec_name:"
 msgid "Name"
 msgstr "Name"
 
-msgctxt "field:purchase.line-account.tax,tax:0"
+msgctxt "field:purchase.line-account.tax,tax:"
 msgid "Tax"
 msgstr "Steuer"
 
-msgctxt "field:purchase.line-ignored-stock.move,move:0"
+msgctxt "field:purchase.line-account.tax,write_date:"
+msgid "Write Date"
+msgstr "Zuletzt geändert"
+
+msgctxt "field:purchase.line-account.tax,write_uid:"
+msgid "Write User"
+msgstr "Letzte Änderung durch"
+
+msgctxt "field:purchase.line-ignored-stock.move,create_date:"
+msgid "Create Date"
+msgstr "Erstellungsdatum"
+
+msgctxt "field:purchase.line-ignored-stock.move,create_uid:"
+msgid "Create User"
+msgstr "Erstellt durch"
+
+msgctxt "field:purchase.line-ignored-stock.move,id:"
+msgid "ID"
+msgstr "ID"
+
+msgctxt "field:purchase.line-ignored-stock.move,move:"
 msgid "Move"
 msgstr "Bewegung"
 
-msgctxt "field:purchase.line-ignored-stock.move,purchase_line:0"
+msgctxt "field:purchase.line-ignored-stock.move,purchase_line:"
 msgid "Purchase Line"
 msgstr "Position Einkauf"
 
-msgctxt "field:purchase.line-ignored-stock.move,rec_name:0"
+msgctxt "field:purchase.line-ignored-stock.move,rec_name:"
 msgid "Name"
 msgstr "Name"
 
-msgctxt "field:purchase.line-recreated-stock.move,move:0"
+msgctxt "field:purchase.line-ignored-stock.move,write_date:"
+msgid "Write Date"
+msgstr "Zuletzt geändert"
+
+msgctxt "field:purchase.line-ignored-stock.move,write_uid:"
+msgid "Write User"
+msgstr "Letzte Änderung durch"
+
+msgctxt "field:purchase.line-recreated-stock.move,create_date:"
+msgid "Create Date"
+msgstr "Erstellungsdatum"
+
+msgctxt "field:purchase.line-recreated-stock.move,create_uid:"
+msgid "Create User"
+msgstr "Erstellt durch"
+
+msgctxt "field:purchase.line-recreated-stock.move,id:"
+msgid "ID"
+msgstr "ID"
+
+msgctxt "field:purchase.line-recreated-stock.move,move:"
 msgid "Move"
 msgstr "Bewegung"
 
-msgctxt "field:purchase.line-recreated-stock.move,purchase_line:0"
+msgctxt "field:purchase.line-recreated-stock.move,purchase_line:"
 msgid "Purchase Line"
 msgstr "Position Einkauf"
 
-msgctxt "field:purchase.line-recreated-stock.move,rec_name:0"
+msgctxt "field:purchase.line-recreated-stock.move,rec_name:"
 msgid "Name"
 msgstr "Name"
 
-msgctxt "field:purchase.product_supplier,code:0"
+msgctxt "field:purchase.line-recreated-stock.move,write_date:"
+msgid "Write Date"
+msgstr "Zuletzt geändert"
+
+msgctxt "field:purchase.line-recreated-stock.move,write_uid:"
+msgid "Write User"
+msgstr "Letzte Änderung durch"
+
+msgctxt "field:purchase.product_supplier,code:"
 msgid "Code"
 msgstr "Artikelnummer Lieferant"
 
-msgctxt "field:purchase.product_supplier,company:0"
+msgctxt "field:purchase.product_supplier,company:"
 msgid "Company"
 msgstr "Lieferfirma"
 
-msgctxt "field:purchase.product_supplier,delivery_time:0"
+msgctxt "field:purchase.product_supplier,create_date:"
+msgid "Create Date"
+msgstr "Erstellungsdatum"
+
+msgctxt "field:purchase.product_supplier,create_uid:"
+msgid "Create User"
+msgstr "Erstellt durch"
+
+msgctxt "field:purchase.product_supplier,currency:"
+msgid "Currency"
+msgstr "Währung"
+
+msgctxt "field:purchase.product_supplier,delivery_time:"
 msgid "Delivery Time"
 msgstr "Lieferfrist"
 
-msgctxt "field:purchase.product_supplier,name:0"
+msgctxt "field:purchase.product_supplier,id:"
+msgid "ID"
+msgstr "ID"
+
+msgctxt "field:purchase.product_supplier,name:"
 msgid "Name"
 msgstr "Name"
 
-msgctxt "field:purchase.product_supplier,party:0"
+msgctxt "field:purchase.product_supplier,party:"
 msgid "Supplier"
 msgstr "Lieferant"
 
-msgctxt "field:purchase.product_supplier,prices:0"
+msgctxt "field:purchase.product_supplier,prices:"
 msgid "Prices"
 msgstr "Preise"
 
-msgctxt "field:purchase.product_supplier,product:0"
+msgctxt "field:purchase.product_supplier,product:"
 msgid "Product"
 msgstr "Artikel"
 
-msgctxt "field:purchase.product_supplier,rec_name:0"
+msgctxt "field:purchase.product_supplier,rec_name:"
 msgid "Name"
 msgstr "Name"
 
-msgctxt "field:purchase.product_supplier,sequence:0"
+msgctxt "field:purchase.product_supplier,sequence:"
 msgid "Sequence"
 msgstr "Reihenfolge"
 
-msgctxt "field:purchase.product_supplier.price,product_supplier:0"
+msgctxt "field:purchase.product_supplier,write_date:"
+msgid "Write Date"
+msgstr "Zuletzt geändert"
+
+msgctxt "field:purchase.product_supplier,write_uid:"
+msgid "Write User"
+msgstr "Letzte Änderung durch"
+
+msgctxt "field:purchase.product_supplier.price,create_date:"
+msgid "Create Date"
+msgstr "Erstellungsdatum"
+
+msgctxt "field:purchase.product_supplier.price,create_uid:"
+msgid "Create User"
+msgstr "Erstellt durch"
+
+msgctxt "field:purchase.product_supplier.price,id:"
+msgid "ID"
+msgstr "ID"
+
+msgctxt "field:purchase.product_supplier.price,product_supplier:"
 msgid "Supplier"
 msgstr "Lieferant"
 
-msgctxt "field:purchase.product_supplier.price,quantity:0"
+msgctxt "field:purchase.product_supplier.price,quantity:"
 msgid "Quantity"
 msgstr "Anzahl"
 
-msgctxt "field:purchase.product_supplier.price,rec_name:0"
+msgctxt "field:purchase.product_supplier.price,rec_name:"
 msgid "Name"
 msgstr "Name"
 
-msgctxt "field:purchase.product_supplier.price,unit_price:0"
+msgctxt "field:purchase.product_supplier.price,unit_price:"
 msgid "Unit Price"
 msgstr "Einzelpreis"
 
-msgctxt "field:purchase.purchase,comment:0"
+msgctxt "field:purchase.product_supplier.price,write_date:"
+msgid "Write Date"
+msgstr "Zuletzt geändert"
+
+msgctxt "field:purchase.product_supplier.price,write_uid:"
+msgid "Write User"
+msgstr "Letzte Änderung durch"
+
+msgctxt "field:purchase.purchase,comment:"
 msgid "Comment"
 msgstr "Kommentar"
 
-msgctxt "field:purchase.purchase,company:0"
+msgctxt "field:purchase.purchase,company:"
 msgid "Company"
 msgstr "Unternehmen"
 
-msgctxt "field:purchase.purchase,currency:0"
+msgctxt "field:purchase.purchase,create_date:"
+msgid "Create Date"
+msgstr "Erstellungsdatum"
+
+msgctxt "field:purchase.purchase,create_uid:"
+msgid "Create User"
+msgstr "Erstellt durch"
+
+msgctxt "field:purchase.purchase,currency:"
 msgid "Currency"
 msgstr "Währung"
 
-msgctxt "field:purchase.purchase,currency_digits:0"
+msgctxt "field:purchase.purchase,currency_digits:"
 msgid "Currency Digits"
 msgstr "Währung (signifikante Stellen)"
 
-msgctxt "field:purchase.purchase,description:0"
+msgctxt "field:purchase.purchase,description:"
 msgid "Description"
 msgstr "Beschreibung"
 
-msgctxt "field:purchase.purchase,invoice_address:0"
+msgctxt "field:purchase.purchase,id:"
+msgid "ID"
+msgstr "ID"
+
+msgctxt "field:purchase.purchase,invoice_address:"
 msgid "Invoice Address"
 msgstr "Rechnungsadresse"
 
-msgctxt "field:purchase.purchase,invoice_exception:0"
-msgid "Invoices Exception"
-msgstr "Rechnungsvorbehalt"
-
-msgctxt "field:purchase.purchase,invoice_method:0"
+msgctxt "field:purchase.purchase,invoice_method:"
 msgid "Invoice Method"
 msgstr "Rechnungsstellung"
 
-msgctxt "field:purchase.purchase,invoice_paid:0"
-msgid "Invoices Paid"
-msgstr "Bezahlte Rechnungen"
-
-msgctxt "field:purchase.purchase,invoice_state:0"
+msgctxt "field:purchase.purchase,invoice_state:"
 msgid "Invoice State"
 msgstr "Rechnungsstatus"
 
-msgctxt "field:purchase.purchase,invoices:0"
+msgctxt "field:purchase.purchase,invoices:"
 msgid "Invoices"
 msgstr "Rechnungen"
 
-msgctxt "field:purchase.purchase,invoices_ignored:0"
+msgctxt "field:purchase.purchase,invoices_ignored:"
 msgid "Ignored Invoices"
 msgstr "Ignorierte Rechnungen"
 
-msgctxt "field:purchase.purchase,invoices_recreated:0"
+msgctxt "field:purchase.purchase,invoices_recreated:"
 msgid "Recreated Invoices"
 msgstr "Nachgebildete Rechnungen"
 
-msgctxt "field:purchase.purchase,lines:0"
+msgctxt "field:purchase.purchase,lines:"
 msgid "Lines"
 msgstr "Positionen"
 
-msgctxt "field:purchase.purchase,moves:0"
+msgctxt "field:purchase.purchase,moves:"
 msgid "Moves"
 msgstr "Bewegungen"
 
-msgctxt "field:purchase.purchase,party:0"
+msgctxt "field:purchase.purchase,party:"
 msgid "Party"
 msgstr "Partei"
 
-msgctxt "field:purchase.purchase,party_lang:0"
+msgctxt "field:purchase.purchase,party_lang:"
 msgid "Party Language"
 msgstr "Sprache Partei"
 
-msgctxt "field:purchase.purchase,payment_term:0"
+msgctxt "field:purchase.purchase,payment_term:"
 msgid "Payment Term"
 msgstr "Zahlungsbedingung"
 
-msgctxt "field:purchase.purchase,purchase_date:0"
+msgctxt "field:purchase.purchase,purchase_date:"
 msgid "Purchase Date"
 msgstr "Kaufdatum"
 
-msgctxt "field:purchase.purchase,rec_name:0"
+msgctxt "field:purchase.purchase,rec_name:"
 msgid "Name"
 msgstr "Name"
 
-msgctxt "field:purchase.purchase,reference:0"
+msgctxt "field:purchase.purchase,reference:"
 msgid "Reference"
 msgstr "Beleg-Nr."
 
-msgctxt "field:purchase.purchase,shipment_done:0"
-msgid "Shipment Done"
-msgstr "Lieferposten erledigt"
-
-msgctxt "field:purchase.purchase,shipment_exception:0"
-msgid "Shipments Exception"
-msgstr "Lieferungsvorbehalt"
-
-msgctxt "field:purchase.purchase,shipment_state:0"
+msgctxt "field:purchase.purchase,shipment_state:"
 msgid "Shipment State"
 msgstr "Lieferstatus"
 
-msgctxt "field:purchase.purchase,shipments:0"
+msgctxt "field:purchase.purchase,shipments:"
 msgid "Shipments"
 msgstr "Lieferposten"
 
-msgctxt "field:purchase.purchase,state:0"
+msgctxt "field:purchase.purchase,state:"
 msgid "State"
 msgstr "Status"
 
-msgctxt "field:purchase.purchase,supplier_reference:0"
+msgctxt "field:purchase.purchase,supplier_reference:"
 msgid "Supplier Reference"
 msgstr "Beleg-Nr. Lieferant"
 
-msgctxt "field:purchase.purchase,tax_amount:0"
+msgctxt "field:purchase.purchase,tax_amount:"
 msgid "Tax"
 msgstr "Steuer"
 
-msgctxt "field:purchase.purchase,total_amount:0"
+msgctxt "field:purchase.purchase,tax_amount_cache:"
+msgid "Tax Cache"
+msgstr "Steuer Cache"
+
+msgctxt "field:purchase.purchase,total_amount:"
 msgid "Total"
 msgstr "Gesamt"
 
-msgctxt "field:purchase.purchase,untaxed_amount:0"
+msgctxt "field:purchase.purchase,total_amount_cache:"
+msgid "Total Cache"
+msgstr "Gesamt Cache"
+
+msgctxt "field:purchase.purchase,untaxed_amount:"
 msgid "Untaxed"
 msgstr "Netto"
 
-msgctxt "field:purchase.purchase,warehouse:0"
+msgctxt "field:purchase.purchase,untaxed_amount_cache:"
+msgid "Untaxed Cache"
+msgstr "Netto Cache"
+
+msgctxt "field:purchase.purchase,warehouse:"
 msgid "Warehouse"
 msgstr "Warenlager"
 
-msgctxt "field:purchase.purchase-account.invoice,invoice:0"
+msgctxt "field:purchase.purchase,write_date:"
+msgid "Write Date"
+msgstr "Zuletzt geändert"
+
+msgctxt "field:purchase.purchase,write_uid:"
+msgid "Write User"
+msgstr "Letzte Änderung durch"
+
+msgctxt "field:purchase.purchase-account.invoice,create_date:"
+msgid "Create Date"
+msgstr "Erstellungsdatum"
+
+msgctxt "field:purchase.purchase-account.invoice,create_uid:"
+msgid "Create User"
+msgstr "Erstellt durch"
+
+msgctxt "field:purchase.purchase-account.invoice,id:"
+msgid "ID"
+msgstr "ID"
+
+msgctxt "field:purchase.purchase-account.invoice,invoice:"
 msgid "Invoice"
 msgstr "Rechnung"
 
-msgctxt "field:purchase.purchase-account.invoice,purchase:0"
+msgctxt "field:purchase.purchase-account.invoice,purchase:"
 msgid "Purchase"
 msgstr "Einkauf"
 
-msgctxt "field:purchase.purchase-account.invoice,rec_name:0"
+msgctxt "field:purchase.purchase-account.invoice,rec_name:"
 msgid "Name"
 msgstr "Name"
 
-msgctxt "field:purchase.purchase-ignored-account.invoice,invoice:0"
+msgctxt "field:purchase.purchase-account.invoice,write_date:"
+msgid "Write Date"
+msgstr "Zuletzt geändert"
+
+msgctxt "field:purchase.purchase-account.invoice,write_uid:"
+msgid "Write User"
+msgstr "Letzte Änderung durch"
+
+msgctxt "field:purchase.purchase-ignored-account.invoice,create_date:"
+msgid "Create Date"
+msgstr "Erstellungsdatum"
+
+msgctxt "field:purchase.purchase-ignored-account.invoice,create_uid:"
+msgid "Create User"
+msgstr "Erstellt durch"
+
+msgctxt "field:purchase.purchase-ignored-account.invoice,id:"
+msgid "ID"
+msgstr "ID"
+
+msgctxt "field:purchase.purchase-ignored-account.invoice,invoice:"
 msgid "Invoice"
 msgstr "Rechnung"
 
-msgctxt "field:purchase.purchase-ignored-account.invoice,purchase:0"
+msgctxt "field:purchase.purchase-ignored-account.invoice,purchase:"
 msgid "Purchase"
 msgstr "Einkauf"
 
-msgctxt "field:purchase.purchase-ignored-account.invoice,rec_name:0"
+msgctxt "field:purchase.purchase-ignored-account.invoice,rec_name:"
 msgid "Name"
 msgstr "Name"
 
-msgctxt "field:purchase.purchase-recreated-account.invoice,invoice:0"
+msgctxt "field:purchase.purchase-ignored-account.invoice,write_date:"
+msgid "Write Date"
+msgstr "Zuletzt geändert"
+
+msgctxt "field:purchase.purchase-ignored-account.invoice,write_uid:"
+msgid "Write User"
+msgstr "Letzte Änderung durch"
+
+msgctxt "field:purchase.purchase-recreated-account.invoice,create_date:"
+msgid "Create Date"
+msgstr "Erstellungsdatum"
+
+msgctxt "field:purchase.purchase-recreated-account.invoice,create_uid:"
+msgid "Create User"
+msgstr "Erstellt durch"
+
+msgctxt "field:purchase.purchase-recreated-account.invoice,id:"
+msgid "ID"
+msgstr "ID"
+
+msgctxt "field:purchase.purchase-recreated-account.invoice,invoice:"
 msgid "Invoice"
 msgstr "Rechnung"
 
-msgctxt "field:purchase.purchase-recreated-account.invoice,purchase:0"
+msgctxt "field:purchase.purchase-recreated-account.invoice,purchase:"
 msgid "Purchase"
 msgstr "Einkauf"
 
-msgctxt "field:purchase.purchase-recreated-account.invoice,rec_name:0"
+msgctxt "field:purchase.purchase-recreated-account.invoice,rec_name:"
 msgid "Name"
 msgstr "Name"
 
-msgctxt "field:stock.move,purchase:0"
+msgctxt "field:purchase.purchase-recreated-account.invoice,write_date:"
+msgid "Write Date"
+msgstr "Zuletzt geändert"
+
+msgctxt "field:purchase.purchase-recreated-account.invoice,write_uid:"
+msgid "Write User"
+msgstr "Letzte Änderung durch"
+
+msgctxt "field:stock.move,purchase:"
 msgid "Purchase"
 msgstr "Einkauf"
 
-msgctxt "field:stock.move,purchase_currency:0"
+msgctxt "field:stock.move,purchase_currency:"
 msgid "Purchase Currency"
 msgstr "Einkaufswährung"
 
-msgctxt "field:stock.move,purchase_exception_state:0"
+msgctxt "field:stock.move,purchase_exception_state:"
 msgid "Exception State"
 msgstr "Status Vorbehalt"
 
-msgctxt "field:stock.move,purchase_line:0"
+msgctxt "field:stock.move,purchase_line:"
 msgid "Purchase Line"
 msgstr "Position Einkauf"
 
-msgctxt "field:stock.move,purchase_quantity:0"
+msgctxt "field:stock.move,purchase_quantity:"
 msgid "Purchase Quantity"
 msgstr "Anzahl Einkauf"
 
-msgctxt "field:stock.move,purchase_unit:0"
+msgctxt "field:stock.move,purchase_unit:"
 msgid "Purchase Unit"
 msgstr "Einheit Einkauf"
 
-msgctxt "field:stock.move,purchase_unit_digits:0"
+msgctxt "field:stock.move,purchase_unit_digits:"
 msgid "Purchase Unit Digits"
 msgstr "Anzahl Stellen Einkauf"
 
-msgctxt "field:stock.move,purchase_unit_price:0"
+msgctxt "field:stock.move,purchase_unit_price:"
 msgid "Purchase Unit Price"
 msgstr "Einzelpreis Einkauf"
 
-msgctxt "field:stock.move,purchase_visible:0"
+msgctxt "field:stock.move,purchase_visible:"
 msgid "Purchase Visible"
 msgstr "Verkauf sichtbar"
 
-msgctxt "field:stock.move,supplier:0"
+msgctxt "field:stock.move,supplier:"
 msgid "Supplier"
 msgstr "Lieferant"
 
-msgctxt "help:purchase.handle.invoice.exception.ask,recreate_invoices:0"
+msgctxt "help:purchase.handle.invoice.exception.ask,recreate_invoices:"
 msgid ""
 "The selected invoices will be recreated. The other ones will be ignored."
 msgstr ""
 "Die ausgewählten Rechnungen werden nachgebildet. Alle anderen werden "
 "ignoriert."
 
-msgctxt "help:purchase.handle.shipment.exception.ask,recreate_moves:0"
+msgctxt "help:purchase.handle.shipment.exception.ask,recreate_moves:"
 msgid "The selected moves will be recreated. The other ones will be ignored."
 msgstr ""
 "Die ausgewählten Bewegungen werden nachgebildet. Alle anderen werden "
 "ignoriert."
 
-msgctxt "help:purchase.product_supplier,delivery_time:0"
+msgctxt "help:purchase.product_supplier,delivery_time:"
 msgid "In number of days"
 msgstr "In Anzahl von Tagen"
 
-msgctxt "help:purchase.product_supplier.price,quantity:0"
+msgctxt "help:purchase.product_supplier.price,quantity:"
 msgid "Minimal quantity"
 msgstr "Minimale Anzahl"
 
@@ -587,59 +859,59 @@ msgctxt "model:ir.ui.menu,name:menu_supplier"
 msgid "Parties associated to Purchases"
 msgstr "Parteien: Einkäufen zugeordnet"
 
-msgctxt "model:purchase.configuration,name:0"
+msgctxt "model:purchase.configuration,name:"
 msgid "Purchase Configuration"
 msgstr "Einstellungen Einkauf"
 
-msgctxt "model:purchase.handle.invoice.exception.ask,name:0"
-msgid "Invoice Exception Ask"
+msgctxt "model:purchase.handle.invoice.exception.ask,name:"
+msgid "Handle Invoice Exception"
 msgstr "Nachfrage Rechnungsvorbehalt"
 
-msgctxt "model:purchase.handle.shipment.exception.ask,name:0"
-msgid "Shipment Exception Ask"
+msgctxt "model:purchase.handle.shipment.exception.ask,name:"
+msgid "Handle Shipment Exception"
 msgstr "Nachfrage Liefervorbehalt"
 
-msgctxt "model:purchase.line,name:0"
+msgctxt "model:purchase.line,name:"
 msgid "Purchase Line"
 msgstr "Einkauf Position"
 
-msgctxt "model:purchase.line-account.invoice.line,name:0"
+msgctxt "model:purchase.line-account.invoice.line,name:"
 msgid "Purchase Line - Invoice Line"
 msgstr "Position Einkauf - Rechnungsposition"
 
-msgctxt "model:purchase.line-account.tax,name:0"
+msgctxt "model:purchase.line-account.tax,name:"
 msgid "Purchase Line - Tax"
 msgstr "Position Einkauf - Steuer"
 
-msgctxt "model:purchase.line-ignored-stock.move,name:0"
+msgctxt "model:purchase.line-ignored-stock.move,name:"
 msgid "Purchase Line - Ignored Move"
 msgstr "Position Einkauf - Bewegung Ignoriert"
 
-msgctxt "model:purchase.line-recreated-stock.move,name:0"
+msgctxt "model:purchase.line-recreated-stock.move,name:"
 msgid "Purchase Line - Ignored Move"
 msgstr "Position Einkauf - Bewegung Nachgebildet"
 
-msgctxt "model:purchase.product_supplier,name:0"
+msgctxt "model:purchase.product_supplier,name:"
 msgid "Product Supplier"
 msgstr "Artikel Lieferant"
 
-msgctxt "model:purchase.product_supplier.price,name:0"
+msgctxt "model:purchase.product_supplier.price,name:"
 msgid "Product Supplier Price"
 msgstr "Artikel Einkaufspreis"
 
-msgctxt "model:purchase.purchase,name:0"
+msgctxt "model:purchase.purchase,name:"
 msgid "Purchase"
 msgstr "Einkauf"
 
-msgctxt "model:purchase.purchase-account.invoice,name:0"
+msgctxt "model:purchase.purchase-account.invoice,name:"
 msgid "Purchase - Invoice"
 msgstr "Einkauf - Rechnung"
 
-msgctxt "model:purchase.purchase-ignored-account.invoice,name:0"
+msgctxt "model:purchase.purchase-ignored-account.invoice,name:"
 msgid "Purchase - Ignored Invoice"
 msgstr "Einkauf - Rechnung Ignoriert"
 
-msgctxt "model:purchase.purchase-recreated-account.invoice,name:0"
+msgctxt "model:purchase.purchase-recreated-account.invoice,name:"
 msgid "Purchase - Recreated Invoice"
 msgstr "Einkauf - Rechnung Nachgebildet"
 
@@ -651,432 +923,366 @@ msgctxt "model:res.group,name:group_purchase_admin"
 msgid "Purchase Administrator"
 msgstr "Einkauf Administration"
 
-msgctxt "model:workflow,name:purchase_workflow"
-msgid "Purchase workflow"
-msgstr "Workflow Einkauf"
-
-msgctxt "model:workflow.activity,name:purchase_activity_cancel"
-msgid "Canceled"
-msgstr "Annulliert"
-
-msgctxt "model:workflow.activity,name:purchase_activity_confirmed"
-msgid "Confirmed"
-msgstr "Beauftragt"
-
-msgctxt "model:workflow.activity,name:purchase_activity_done"
-msgid "Done"
-msgstr "Erledigt"
-
-msgctxt "model:workflow.activity,name:purchase_activity_draft"
-msgid "Draft"
-msgstr "Entwurf"
-
-msgctxt "model:workflow.activity,name:purchase_activity_invoice_done"
-msgid "Invoice Done"
-msgstr "Rechnung erledigt"
-
-msgctxt "model:workflow.activity,name:purchase_activity_invoice_method"
-msgid "Invoice Method"
-msgstr "Rechnungsstellung"
-
-msgctxt "model:workflow.activity,name:purchase_activity_invoice_method_done"
-msgid "Invoice Method Done"
-msgstr "Rechnungsstellung erledigt"
-
-msgctxt ""
-"model:workflow.activity,name:purchase_activity_invoice_purchase_exception"
-msgid "Invoice Exception"
-msgstr "Rechnungsvorbehalt"
-
-msgctxt "model:workflow.activity,name:purchase_activity_invoice_shipment"
-msgid "Invoice Shipment"
-msgstr "Rechnung Lieferposten"
-
-msgctxt "model:workflow.activity,name:purchase_activity_invoice_shipment_done"
-msgid "Invoice Shipment Done"
-msgstr "Rechnung Lieferposten erledigt"
-
-msgctxt ""
-"model:workflow.activity,name:purchase_activity_invoice_shipment_exception"
-msgid "Invoice Shipment Exception"
-msgstr "Rechnung Lieferposten Vorbehalt"
-
-msgctxt ""
-"model:workflow.activity,name:purchase_activity_invoice_shipment_method"
-msgid "Invoice Shipment Method"
-msgstr "Rechnung Liefermethode"
-
-msgctxt ""
-"model:workflow.activity,name:purchase_activity_invoice_shipment_method_done"
-msgid "Invoice Shipment Method Done"
-msgstr "Rechnung Liefermethode erledigt"
-
-msgctxt "model:workflow.activity,name:purchase_activity_quotation"
-msgid "Quotation"
-msgstr "Angebot"
-
-msgctxt "model:workflow.activity,name:purchase_activity_shipment_exception"
-msgid "Shipment Exception"
-msgstr "Lieferposten Vorbehalt"
-
-msgctxt ""
-"model:workflow.activity,name:purchase_activity_waiting_invoice_purchase"
-msgid "Waiting Invoice"
-msgstr "Rechnung Wartend"
-
-msgctxt ""
-"model:workflow.activity,name:purchase_activity_waiting_invoice_shipment"
-msgid "Waiting Invoice Shipment"
-msgstr "Rechnung Lieferposten Wartend"
-
-msgctxt "model:workflow.activity,name:purchase_activity_waiting_shipment"
-msgid "Waiting Shipment"
-msgstr "Lieferposten Wartend"
-
-msgctxt "odt:purchase.purchase:0"
+msgctxt "odt:purchase.purchase:"
 msgid "Amount"
 msgstr "Betrag"
 
-msgctxt "odt:purchase.purchase:0"
+msgctxt "odt:purchase.purchase:"
 msgid "Date:"
 msgstr "Datum:"
 
-msgctxt "odt:purchase.purchase:0"
+msgctxt "odt:purchase.purchase:"
 msgid "Description"
 msgstr "Bezeichnung"
 
-msgctxt "odt:purchase.purchase:0"
+msgctxt "odt:purchase.purchase:"
 msgid "Description:"
 msgstr "Bezeichnung:"
 
-msgctxt "odt:purchase.purchase:0"
+msgctxt "odt:purchase.purchase:"
 msgid "Draft Purchase Order"
 msgstr "Auftrag (Entwurf)"
 
-msgctxt "odt:purchase.purchase:0"
+msgctxt "odt:purchase.purchase:"
 msgid "E-Mail:"
 msgstr "E-Mail:"
 
-msgctxt "odt:purchase.purchase:0"
+msgctxt "odt:purchase.purchase:"
 msgid "Phone:"
 msgstr "Telefon:"
 
-msgctxt "odt:purchase.purchase:0"
+msgctxt "odt:purchase.purchase:"
 msgid "Purchase Order N°:"
 msgstr "Auftrag Nr. "
 
-msgctxt "odt:purchase.purchase:0"
+msgctxt "odt:purchase.purchase:"
 msgid "Quantity"
 msgstr "Anzahl"
 
-msgctxt "odt:purchase.purchase:0"
+msgctxt "odt:purchase.purchase:"
 msgid "Request for Quotation N°:"
 msgstr "Angebotsanfrage Nr.:"
 
-msgctxt "odt:purchase.purchase:0"
+msgctxt "odt:purchase.purchase:"
 msgid "Taxes"
 msgstr "Steuern"
 
-msgctxt "odt:purchase.purchase:0"
+msgctxt "odt:purchase.purchase:"
 msgid "Taxes:"
 msgstr "Steuern:"
 
-msgctxt "odt:purchase.purchase:0"
+msgctxt "odt:purchase.purchase:"
 msgid "Total (excl. taxes):"
 msgstr "Netto:"
 
-msgctxt "odt:purchase.purchase:0"
+msgctxt "odt:purchase.purchase:"
 msgid "Total:"
 msgstr "Gesamt:"
 
-msgctxt "odt:purchase.purchase:0"
+msgctxt "odt:purchase.purchase:"
 msgid "Unit Price"
 msgstr "Einzelpreis"
 
-msgctxt "odt:purchase.purchase:0"
+msgctxt "odt:purchase.purchase:"
 msgid "VAT Number:"
 msgstr "USt-ID-Nr.:"
 
-msgctxt "odt:purchase.purchase:0"
+msgctxt "odt:purchase.purchase:"
 msgid "VAT:"
 msgstr "USt.:"
 
-msgctxt "selection:account.invoice,purchase_exception_state:0"
+msgctxt "selection:account.invoice,purchase_exception_state:"
 msgid ""
 msgstr ""
 
-msgctxt "selection:account.invoice,purchase_exception_state:0"
+msgctxt "selection:account.invoice,purchase_exception_state:"
 msgid "Ignored"
 msgstr "Ignoriert"
 
-msgctxt "selection:account.invoice,purchase_exception_state:0"
+msgctxt "selection:account.invoice,purchase_exception_state:"
 msgid "Recreated"
 msgstr "Nachgebildet"
 
-msgctxt "selection:purchase.configuration,purchase_invoice_method:0"
+msgctxt "selection:purchase.configuration,purchase_invoice_method:"
 msgid "Based On Order"
 msgstr "Bei Beauftragung"
 
-msgctxt "selection:purchase.configuration,purchase_invoice_method:0"
+msgctxt "selection:purchase.configuration,purchase_invoice_method:"
 msgid "Based On Shipment"
 msgstr "Bei Lieferung"
 
-msgctxt "selection:purchase.configuration,purchase_invoice_method:0"
+msgctxt "selection:purchase.configuration,purchase_invoice_method:"
 msgid "Manual"
 msgstr "Manuell"
 
-msgctxt "selection:purchase.line,type:0"
+msgctxt "selection:purchase.line,type:"
 msgid "Comment"
 msgstr "Kommentar"
 
-msgctxt "selection:purchase.line,type:0"
+msgctxt "selection:purchase.line,type:"
 msgid "Line"
 msgstr "Position"
 
-msgctxt "selection:purchase.line,type:0"
+msgctxt "selection:purchase.line,type:"
 msgid "Subtotal"
 msgstr "Zwischensumme"
 
-msgctxt "selection:purchase.line,type:0"
+msgctxt "selection:purchase.line,type:"
 msgid "Title"
 msgstr "Überschrift"
 
-msgctxt "selection:purchase.purchase,invoice_method:0"
+msgctxt "selection:purchase.purchase,invoice_method:"
 msgid "Based On Order"
 msgstr "Bei Beauftragung"
 
-msgctxt "selection:purchase.purchase,invoice_method:0"
+msgctxt "selection:purchase.purchase,invoice_method:"
 msgid "Based On Shipment"
 msgstr "Bei Lieferung"
 
-msgctxt "selection:purchase.purchase,invoice_method:0"
+msgctxt "selection:purchase.purchase,invoice_method:"
 msgid "Manual"
 msgstr "Manuell"
 
-msgctxt "selection:purchase.purchase,invoice_state:0"
+msgctxt "selection:purchase.purchase,invoice_state:"
 msgid "Exception"
 msgstr "Vorbehalt"
 
-msgctxt "selection:purchase.purchase,invoice_state:0"
+msgctxt "selection:purchase.purchase,invoice_state:"
 msgid "None"
 msgstr "Kein"
 
-msgctxt "selection:purchase.purchase,invoice_state:0"
+msgctxt "selection:purchase.purchase,invoice_state:"
 msgid "Paid"
 msgstr "Bezahlt"
 
-msgctxt "selection:purchase.purchase,invoice_state:0"
+msgctxt "selection:purchase.purchase,invoice_state:"
 msgid "Waiting"
 msgstr "Wartend"
 
-msgctxt "selection:purchase.purchase,shipment_state:0"
+msgctxt "selection:purchase.purchase,shipment_state:"
 msgid "Exception"
 msgstr "Vorbehalt"
 
-msgctxt "selection:purchase.purchase,shipment_state:0"
+msgctxt "selection:purchase.purchase,shipment_state:"
 msgid "None"
 msgstr "Kein"
 
-msgctxt "selection:purchase.purchase,shipment_state:0"
+msgctxt "selection:purchase.purchase,shipment_state:"
 msgid "Received"
 msgstr "Erhalten"
 
-msgctxt "selection:purchase.purchase,shipment_state:0"
+msgctxt "selection:purchase.purchase,shipment_state:"
 msgid "Waiting"
 msgstr "Wartend"
 
-msgctxt "selection:purchase.purchase,state:0"
+msgctxt "selection:purchase.purchase,state:"
 msgid "Canceled"
 msgstr "Annulliert"
 
-msgctxt "selection:purchase.purchase,state:0"
+msgctxt "selection:purchase.purchase,state:"
 msgid "Confirmed"
 msgstr "Beauftragt"
 
-msgctxt "selection:purchase.purchase,state:0"
+msgctxt "selection:purchase.purchase,state:"
 msgid "Done"
 msgstr "Erledigt"
 
-msgctxt "selection:purchase.purchase,state:0"
+msgctxt "selection:purchase.purchase,state:"
 msgid "Draft"
 msgstr "Entwurf"
 
-msgctxt "selection:purchase.purchase,state:0"
+msgctxt "selection:purchase.purchase,state:"
 msgid "Quotation"
 msgstr "Angebot"
 
-msgctxt "selection:stock.move,purchase_exception_state:0"
+msgctxt "selection:stock.move,purchase_exception_state:"
 msgid ""
 msgstr ""
 
-msgctxt "selection:stock.move,purchase_exception_state:0"
+msgctxt "selection:stock.move,purchase_exception_state:"
 msgid "Ignored"
 msgstr "Ignoriert"
 
-msgctxt "selection:stock.move,purchase_exception_state:0"
+msgctxt "selection:stock.move,purchase_exception_state:"
 msgid "Recreated"
 msgstr "Nachgebildet"
 
-msgctxt "view:product.product:0"
+msgctxt "view:product.product:"
 msgid "Product Suppliers"
 msgstr "Lieferanten"
 
-msgctxt "view:product.product:0"
+msgctxt "view:product.product:"
+msgid "Products"
+msgstr "Artikel"
+
+msgctxt "view:product.product:"
 msgid "Suppliers"
 msgstr "Lieferanten"
 
-msgctxt "view:product.template:0"
+msgctxt "view:product.template:"
 msgid "Product Suppliers"
 msgstr "Lieferanten"
 
-msgctxt "view:product.template:0"
+msgctxt "view:product.template:"
 msgid "Suppliers"
 msgstr "Lieferanten"
 
-msgctxt "view:purchase.configuration:0"
+msgctxt "view:purchase.configuration:"
 msgid "Purchase Configuration"
 msgstr "Einstellungen Einkauf"
 
-msgctxt "view:purchase.handle.invoice.exception.ask:0"
+msgctxt "view:purchase.handle.invoice.exception.ask:"
 msgid "Choose invoices to duplicate"
 msgstr "Auswahl Rechnungen für Duplizierung"
 
-msgctxt "view:purchase.handle.invoice.exception.ask:0"
+msgctxt "view:purchase.handle.invoice.exception.ask:"
 msgid "Choose invoices to recreate"
 msgstr "Rechnungen zum Nachbilden auswählen"
 
-msgctxt "view:purchase.handle.invoice.exception.ask:0"
+msgctxt "view:purchase.handle.invoice.exception.ask:"
 msgid "Handle Invoice Exception"
 msgstr "Rechnungsvorbehalt bearbeiten"
 
-msgctxt "view:purchase.handle.shipment.exception.ask:0"
+msgctxt "view:purchase.handle.shipment.exception.ask:"
 msgid "Choose move to duplicate"
 msgstr "Auswahl Bewegungen für Duplizierung"
 
-msgctxt "view:purchase.handle.shipment.exception.ask:0"
+msgctxt "view:purchase.handle.shipment.exception.ask:"
 msgid "Choose move to recreate"
 msgstr "Bewegungen zum Nachbilden auswählen"
 
-msgctxt "view:purchase.handle.shipment.exception.ask:0"
+msgctxt "view:purchase.handle.shipment.exception.ask:"
 msgid "Choose moves to recreate"
 msgstr "Auswahl Bewegungen zur Nachbildung"
 
-msgctxt "view:purchase.handle.shipment.exception.ask:0"
+msgctxt "view:purchase.handle.shipment.exception.ask:"
 msgid "Duplicate Moves"
 msgstr "Bewegungen duplizieren"
 
-msgctxt "view:purchase.handle.shipment.exception.ask:0"
+msgctxt "view:purchase.handle.shipment.exception.ask:"
 msgid "Handle shipment Exception"
 msgstr "Liefervorbehalt bearbeiten"
 
-msgctxt "view:purchase.handle.shipment.exception.ask:0"
+msgctxt "view:purchase.handle.shipment.exception.ask:"
 msgid "Recreated Moves"
 msgstr "Nachgebildete Bewegungen"
 
-msgctxt "view:purchase.line:0"
+msgctxt "view:purchase.line:"
 msgid "General"
 msgstr "Allgemein"
 
-msgctxt "view:purchase.line:0"
+msgctxt "view:purchase.line:"
+msgid "Lines"
+msgstr "Zeilen"
+
+msgctxt "view:purchase.line:"
 msgid "Notes"
 msgstr "Notizen"
 
-msgctxt "view:purchase.line:0"
+msgctxt "view:purchase.line:"
 msgid "Products"
 msgstr "Artikel"
 
-msgctxt "view:purchase.line:0"
+msgctxt "view:purchase.line:"
 msgid "Purchase Line"
 msgstr "Position Einkauf"
 
-msgctxt "view:purchase.line:0"
+msgctxt "view:purchase.line:"
 msgid "Purchase Lines"
 msgstr "Positionen Einkauf"
 
-msgctxt "view:purchase.product_supplier.price:0"
+msgctxt "view:purchase.product_supplier.price:"
 msgid "Product Supplier Price"
 msgstr "Einkaufspreis"
 
-msgctxt "view:purchase.product_supplier.price:0"
+msgctxt "view:purchase.product_supplier.price:"
 msgid "Product Supplier Prices"
 msgstr "Einkaufspreise"
 
-msgctxt "view:purchase.product_supplier:0"
+msgctxt "view:purchase.product_supplier:"
 msgid "Product Supplier"
 msgstr "Lieferant"
 
-msgctxt "view:purchase.product_supplier:0"
+msgctxt "view:purchase.product_supplier:"
 msgid "Product Suppliers"
 msgstr "Lieferanten"
 
-msgctxt "view:purchase.purchase:0"
+msgctxt "view:purchase.purchase:"
 msgid "Cancel"
 msgstr "Annullieren"
 
-msgctxt "view:purchase.purchase:0"
+msgctxt "view:purchase.purchase:"
 msgid "Confirm"
 msgstr "Beauftragen"
 
-msgctxt "view:purchase.purchase:0"
+msgctxt "view:purchase.purchase:"
 msgid "Draft"
 msgstr "Entwurf"
 
-msgctxt "view:purchase.purchase:0"
+msgctxt "view:purchase.purchase:"
 msgid "Handle Invoice Exception"
 msgstr "Rechnungsvorbehalt bearbeiten"
 
-msgctxt "view:purchase.purchase:0"
+msgctxt "view:purchase.purchase:"
 msgid "Handle Shipment Exception"
 msgstr "Liefervorbehalt bearbeiten"
 
-msgctxt "view:purchase.purchase:0"
+msgctxt "view:purchase.purchase:"
 msgid "Ignore Invoice Exception"
 msgstr "Rechnungsvorbehalt ignorieren"
 
-msgctxt "view:purchase.purchase:0"
+msgctxt "view:purchase.purchase:"
 msgid "Invoices"
 msgstr "Rechnungen"
 
-msgctxt "view:purchase.purchase:0"
+msgctxt "view:purchase.purchase:"
 msgid "Lines"
 msgstr "Positionen"
 
-msgctxt "view:purchase.purchase:0"
+msgctxt "view:purchase.purchase:"
 msgid "Moves"
 msgstr "Bewegungen"
 
-msgctxt "view:purchase.purchase:0"
+msgctxt "view:purchase.purchase:"
 msgid "Other Info"
 msgstr "Sonstiges"
 
-msgctxt "view:purchase.purchase:0"
+msgctxt "view:purchase.purchase:"
 msgid "Purchase"
 msgstr "Einkauf"
 
-msgctxt "view:purchase.purchase:0"
+msgctxt "view:purchase.purchase:"
 msgid "Purchases"
 msgstr "Einkäufe"
 
-msgctxt "view:purchase.purchase:0"
+msgctxt "view:purchase.purchase:"
 msgid "Quotation"
 msgstr "Angebot"
 
-msgctxt "view:purchase.purchase:0"
+msgctxt "view:purchase.purchase:"
+msgid "Quote"
+msgstr "Angebot"
+
+msgctxt "view:purchase.purchase:"
 msgid "Shipments"
 msgstr "Lieferposten"
 
-msgctxt "wizard_button:purchase.handle.invoice.exception,init,end:0"
+msgctxt "view:stock.move:"
+msgid "Moves"
+msgstr "Lagerbewegungen"
+
+msgctxt "wizard_button:purchase.handle.invoice.exception,ask,end:"
 msgid "Cancel"
 msgstr "Abbrechen"
 
-msgctxt "wizard_button:purchase.handle.invoice.exception,init,ok:0"
+msgctxt "wizard_button:purchase.handle.invoice.exception,ask,handle:"
 msgid "Ok"
 msgstr "OK"
 
-msgctxt "wizard_button:purchase.handle.shipment.exception,init,end:0"
+msgctxt "wizard_button:purchase.handle.shipment.exception,ask,end:"
 msgid "Cancel"
 msgstr "Abbrechen"
 
-msgctxt "wizard_button:purchase.handle.shipment.exception,init,ok:0"
+msgctxt "wizard_button:purchase.handle.shipment.exception,ask,handle:"
 msgid "Ok"
 msgstr "OK"
diff --git a/locale/es_AR.po b/locale/es_AR.po
new file mode 100644
index 0000000..e7d66b3
--- /dev/null
+++ b/locale/es_AR.po
@@ -0,0 +1,1259 @@
+# 
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "error:account.invoice:"
+msgid "You can not delete invoices that come from a purchase!"
+msgstr "¡No puede borrar facturas que vienen de una compra!"
+
+msgctxt "error:account.invoice:"
+msgid "You cannot reset to draft an invoice generated by a purchase."
+msgstr "No puede cambiar a borrador una factura generada por una compra."
+
+msgctxt "error:product.template:"
+msgid ""
+"Purchase prices are based on the purchase uom, are you sure to change it?"
+msgstr ""
+"Los precios de compra están basados en la UdM de compra, ¿desea cambiarlo?"
+
+msgctxt "error:purchase.line:"
+msgid "It misses an \"Account Expense\" on product \"%s\"!"
+msgstr "¡Hace falta una «Cuenta de gasto» del producto «%s»!"
+
+msgctxt "error:purchase.line:"
+msgid "It misses an \"account expense\" default property!"
+msgstr "¡Hace falta la propiedad predeterminada de «cuenta de gastos»!"
+
+msgctxt "error:purchase.line:"
+msgid "The supplier location is required!"
+msgstr "¡Se necesita la ubicación del proveedor!"
+
+msgctxt "error:purchase.purchase:"
+msgid "A warehouse must be defined for the quotation."
+msgstr "Un almacén debe estar definido para el presupuesto."
+
+msgctxt "error:purchase.purchase:"
+msgid "Invoice addresses must be defined for the quotation."
+msgstr "Debe definir las direcciones para la cotización."
+
+msgctxt "error:purchase.purchase:"
+msgid "It misses an \"Account Payable\" on the party \"%s\"!"
+msgstr "¡A la entidad «%s» le hace falta una «Cuenta de pagos»!"
+
+msgctxt "error:purchase.purchase:"
+msgid "Purchase \"%s\" must be cancelled before deletion!"
+msgstr "¡Compra \"%s\" debe ser cancelada antes de eliminar!"
+
+msgctxt "error:stock.shipment.in:"
+msgid "You cannot reset to draft a move generated by a purchase."
+msgstr ""
+"No puede restablecer a borrador un movimiento generado por una compra."
+
+msgctxt "field:account.invoice,purchase_exception_state:"
+msgid "Exception State"
+msgstr "Estado excepción"
+
+msgctxt "field:account.invoice,purchases:"
+msgid "Purchases"
+msgstr "Compras"
+
+msgctxt "field:account.invoice.line,purchase_lines:"
+msgid "Purchase Lines"
+msgstr "Líneas de compra"
+
+msgctxt "field:product.template,product_suppliers:"
+msgid "Suppliers"
+msgstr "Proveedores"
+
+msgctxt "field:product.template,purchasable:"
+msgid "Purchasable"
+msgstr "Comprable"
+
+msgctxt "field:product.template,purchase_uom:"
+msgid "Purchase UOM"
+msgstr "UdM de compra"
+
+msgctxt "field:purchase.configuration,create_date:"
+msgid "Create Date"
+msgstr "Fecha creación"
+
+msgctxt "field:purchase.configuration,create_uid:"
+msgid "Create User"
+msgstr "Usuario creación"
+
+msgctxt "field:purchase.configuration,id:"
+msgid "ID"
+msgstr "ID"
+
+msgctxt "field:purchase.configuration,purchase_invoice_method:"
+msgid "Invoice Method"
+msgstr "Método de facturación"
+
+msgctxt "field:purchase.configuration,purchase_sequence:"
+msgid "Purchase Reference Sequence"
+msgstr "Secuencia de Referencia de Compra"
+
+msgctxt "field:purchase.configuration,rec_name:"
+msgid "Name"
+msgstr "Nombre del campo"
+
+msgctxt "field:purchase.configuration,write_date:"
+msgid "Write Date"
+msgstr "Fecha modificación"
+
+msgctxt "field:purchase.configuration,write_uid:"
+msgid "Write User"
+msgstr "Usuario modificación"
+
+msgctxt "field:purchase.handle.invoice.exception.ask,domain_invoices:"
+msgid "Domain Invoices"
+msgstr "Facturas de dominio"
+
+msgctxt "field:purchase.handle.invoice.exception.ask,id:"
+msgid "ID"
+msgstr "ID"
+
+msgctxt "field:purchase.handle.invoice.exception.ask,recreate_invoices:"
+msgid "Recreate Invoices"
+msgstr "Rehacer facturas"
+
+msgctxt "field:purchase.handle.shipment.exception.ask,domain_moves:"
+msgid "Domain Moves"
+msgstr "Movimientos de dominio"
+
+msgctxt "field:purchase.handle.shipment.exception.ask,id:"
+msgid "ID"
+msgstr "ID"
+
+msgctxt "field:purchase.handle.shipment.exception.ask,recreate_moves:"
+msgid "Recreate Moves"
+msgstr "Rehacer movimientos"
+
+msgctxt "field:purchase.line,amount:"
+msgid "Amount"
+msgstr "Cantidad"
+
+msgctxt "field:purchase.line,create_date:"
+msgid "Create Date"
+msgstr "Fecha creación"
+
+msgctxt "field:purchase.line,create_uid:"
+msgid "Create User"
+msgstr "Usuario creación"
+
+msgctxt "field:purchase.line,delivery_date:"
+msgid "Delivery Date"
+msgstr "Fecha de Entrega"
+
+msgctxt "field:purchase.line,description:"
+msgid "Description"
+msgstr "Descripción"
+
+msgctxt "field:purchase.line,from_location:"
+msgid "From Location"
+msgstr "De ubicación"
+
+msgctxt "field:purchase.line,id:"
+msgid "ID"
+msgstr "ID"
+
+msgctxt "field:purchase.line,invoice_lines:"
+msgid "Invoice Lines"
+msgstr "Líneas de factura"
+
+msgctxt "field:purchase.line,move_done:"
+msgid "Moves Done"
+msgstr "Movimientos terminados"
+
+msgctxt "field:purchase.line,move_exception:"
+msgid "Moves Exception"
+msgstr "Exepción de movimientos"
+
+msgctxt "field:purchase.line,moves:"
+msgid "Moves"
+msgstr "Movimientos"
+
+msgctxt "field:purchase.line,moves_ignored:"
+msgid "Ignored Moves"
+msgstr "Movimientos ignorados"
+
+msgctxt "field:purchase.line,moves_recreated:"
+msgid "Recreated Moves"
+msgstr "Rehacer movimientos"
+
+msgctxt "field:purchase.line,note:"
+msgid "Note"
+msgstr "Nota"
+
+msgctxt "field:purchase.line,product:"
+msgid "Product"
+msgstr "Producto"
+
+msgctxt "field:purchase.line,product_uom_category:"
+msgid "Product Uom Category"
+msgstr "Categoría UdM del producto"
+
+msgctxt "field:purchase.line,purchase:"
+msgid "Purchase"
+msgstr "Compra"
+
+msgctxt "field:purchase.line,quantity:"
+msgid "Quantity"
+msgstr "Cantidad"
+
+msgctxt "field:purchase.line,rec_name:"
+msgid "Name"
+msgstr "Nombre"
+
+msgctxt "field:purchase.line,sequence:"
+msgid "Sequence"
+msgstr "Secuencia"
+
+msgctxt "field:purchase.line,taxes:"
+msgid "Taxes"
+msgstr "Impuestos"
+
+msgctxt "field:purchase.line,to_location:"
+msgid "To Location"
+msgstr "A ubicación"
+
+msgctxt "field:purchase.line,type:"
+msgid "Type"
+msgstr "Tipo"
+
+msgctxt "field:purchase.line,unit:"
+msgid "Unit"
+msgstr "Unidad"
+
+msgctxt "field:purchase.line,unit_digits:"
+msgid "Unit Digits"
+msgstr "Dígitos unitarios"
+
+msgctxt "field:purchase.line,unit_price:"
+msgid "Unit Price"
+msgstr "Precio unitario"
+
+msgctxt "field:purchase.line,write_date:"
+msgid "Write Date"
+msgstr "Fecha modificación"
+
+msgctxt "field:purchase.line,write_uid:"
+msgid "Write User"
+msgstr "Usuario modificación"
+
+msgctxt "field:purchase.line-account.invoice.line,create_date:"
+msgid "Create Date"
+msgstr "Fecha creación"
+
+msgctxt "field:purchase.line-account.invoice.line,create_uid:"
+msgid "Create User"
+msgstr "Usuario creación"
+
+msgctxt "field:purchase.line-account.invoice.line,id:"
+msgid "ID"
+msgstr "ID"
+
+msgctxt "field:purchase.line-account.invoice.line,invoice_line:"
+msgid "Invoice Line"
+msgstr "Línea de factura"
+
+msgctxt "field:purchase.line-account.invoice.line,purchase_line:"
+msgid "Purchase Line"
+msgstr "Línea de compra"
+
+msgctxt "field:purchase.line-account.invoice.line,rec_name:"
+msgid "Name"
+msgstr "Nombre"
+
+msgctxt "field:purchase.line-account.invoice.line,write_date:"
+msgid "Write Date"
+msgstr "Fecha modificación"
+
+msgctxt "field:purchase.line-account.invoice.line,write_uid:"
+msgid "Write User"
+msgstr "Usuario modificación"
+
+msgctxt "field:purchase.line-account.tax,create_date:"
+msgid "Create Date"
+msgstr "Fecha creación"
+
+msgctxt "field:purchase.line-account.tax,create_uid:"
+msgid "Create User"
+msgstr "Usuario creación"
+
+msgctxt "field:purchase.line-account.tax,id:"
+msgid "ID"
+msgstr "ID"
+
+msgctxt "field:purchase.line-account.tax,line:"
+msgid "Purchase Line"
+msgstr "Línea de compra"
+
+msgctxt "field:purchase.line-account.tax,rec_name:"
+msgid "Name"
+msgstr "Nombre"
+
+msgctxt "field:purchase.line-account.tax,tax:"
+msgid "Tax"
+msgstr "Impuesto"
+
+msgctxt "field:purchase.line-account.tax,write_date:"
+msgid "Write Date"
+msgstr "Fecha modificación"
+
+msgctxt "field:purchase.line-account.tax,write_uid:"
+msgid "Write User"
+msgstr "Usuario modificación"
+
+msgctxt "field:purchase.line-ignored-stock.move,create_date:"
+msgid "Create Date"
+msgstr "Fecha creación"
+
+msgctxt "field:purchase.line-ignored-stock.move,create_uid:"
+msgid "Create User"
+msgstr "Usuario creación"
+
+msgctxt "field:purchase.line-ignored-stock.move,id:"
+msgid "ID"
+msgstr "ID"
+
+msgctxt "field:purchase.line-ignored-stock.move,move:"
+msgid "Move"
+msgstr "Movimiento"
+
+msgctxt "field:purchase.line-ignored-stock.move,purchase_line:"
+msgid "Purchase Line"
+msgstr "Línea de compra"
+
+msgctxt "field:purchase.line-ignored-stock.move,rec_name:"
+msgid "Name"
+msgstr "Nombre"
+
+msgctxt "field:purchase.line-ignored-stock.move,write_date:"
+msgid "Write Date"
+msgstr "Fecha modificación"
+
+msgctxt "field:purchase.line-ignored-stock.move,write_uid:"
+msgid "Write User"
+msgstr "Usuario modificación"
+
+msgctxt "field:purchase.line-recreated-stock.move,create_date:"
+msgid "Create Date"
+msgstr "Fecha creación"
+
+msgctxt "field:purchase.line-recreated-stock.move,create_uid:"
+msgid "Create User"
+msgstr "Usuario creación"
+
+msgctxt "field:purchase.line-recreated-stock.move,id:"
+msgid "ID"
+msgstr "ID"
+
+msgctxt "field:purchase.line-recreated-stock.move,move:"
+msgid "Move"
+msgstr "Movimiento"
+
+msgctxt "field:purchase.line-recreated-stock.move,purchase_line:"
+msgid "Purchase Line"
+msgstr "Línea de compra"
+
+msgctxt "field:purchase.line-recreated-stock.move,rec_name:"
+msgid "Name"
+msgstr "Nombre"
+
+msgctxt "field:purchase.line-recreated-stock.move,write_date:"
+msgid "Write Date"
+msgstr "Fecha modificación"
+
+msgctxt "field:purchase.line-recreated-stock.move,write_uid:"
+msgid "Write User"
+msgstr "Usuario modificación"
+
+msgctxt "field:purchase.product_supplier,code:"
+msgid "Code"
+msgstr "Código"
+
+msgctxt "field:purchase.product_supplier,company:"
+msgid "Company"
+msgstr "Compañía"
+
+msgctxt "field:purchase.product_supplier,create_date:"
+msgid "Create Date"
+msgstr "Fecha creación"
+
+msgctxt "field:purchase.product_supplier,create_uid:"
+msgid "Create User"
+msgstr "Usuario creación"
+
+msgctxt "field:purchase.product_supplier,currency:"
+msgid "Currency"
+msgstr "Gestión de divisas"
+
+msgctxt "field:purchase.product_supplier,delivery_time:"
+msgid "Delivery Time"
+msgstr "Tiempo de envío"
+
+msgctxt "field:purchase.product_supplier,id:"
+msgid "ID"
+msgstr "ID"
+
+msgctxt "field:purchase.product_supplier,name:"
+msgid "Name"
+msgstr "Nombre"
+
+msgctxt "field:purchase.product_supplier,party:"
+msgid "Supplier"
+msgstr "Proveedor"
+
+msgctxt "field:purchase.product_supplier,prices:"
+msgid "Prices"
+msgstr "Precios"
+
+msgctxt "field:purchase.product_supplier,product:"
+msgid "Product"
+msgstr "Producto"
+
+msgctxt "field:purchase.product_supplier,rec_name:"
+msgid "Name"
+msgstr "Nombre"
+
+msgctxt "field:purchase.product_supplier,sequence:"
+msgid "Sequence"
+msgstr "Secuencia"
+
+msgctxt "field:purchase.product_supplier,write_date:"
+msgid "Write Date"
+msgstr "Fecha modificación"
+
+msgctxt "field:purchase.product_supplier,write_uid:"
+msgid "Write User"
+msgstr "Usuario modificación"
+
+msgctxt "field:purchase.product_supplier.price,create_date:"
+msgid "Create Date"
+msgstr "Fecha creación"
+
+msgctxt "field:purchase.product_supplier.price,create_uid:"
+msgid "Create User"
+msgstr "Usuario creación"
+
+msgctxt "field:purchase.product_supplier.price,id:"
+msgid "ID"
+msgstr "ID"
+
+msgctxt "field:purchase.product_supplier.price,product_supplier:"
+msgid "Supplier"
+msgstr "Proveedor"
+
+msgctxt "field:purchase.product_supplier.price,quantity:"
+msgid "Quantity"
+msgstr "Cantidad"
+
+msgctxt "field:purchase.product_supplier.price,rec_name:"
+msgid "Name"
+msgstr "Nombre"
+
+msgctxt "field:purchase.product_supplier.price,unit_price:"
+msgid "Unit Price"
+msgstr "Precio unitario"
+
+msgctxt "field:purchase.product_supplier.price,write_date:"
+msgid "Write Date"
+msgstr "Fecha modificación"
+
+msgctxt "field:purchase.product_supplier.price,write_uid:"
+msgid "Write User"
+msgstr "Usuario modificación"
+
+msgctxt "field:purchase.purchase,comment:"
+msgid "Comment"
+msgstr "Comentario"
+
+msgctxt "field:purchase.purchase,company:"
+msgid "Company"
+msgstr "Empresa"
+
+msgctxt "field:purchase.purchase,create_date:"
+msgid "Create Date"
+msgstr "Fecha creación"
+
+msgctxt "field:purchase.purchase,create_uid:"
+msgid "Create User"
+msgstr "Usuario creación"
+
+msgctxt "field:purchase.purchase,currency:"
+msgid "Currency"
+msgstr "Divisa"
+
+msgctxt "field:purchase.purchase,currency_digits:"
+msgid "Currency Digits"
+msgstr "Dígitos de la divisa"
+
+msgctxt "field:purchase.purchase,description:"
+msgid "Description"
+msgstr "Descripción"
+
+msgctxt "field:purchase.purchase,id:"
+msgid "ID"
+msgstr "ID"
+
+msgctxt "field:purchase.purchase,invoice_address:"
+msgid "Invoice Address"
+msgstr "Dirección de facturación"
+
+msgctxt "field:purchase.purchase,invoice_method:"
+msgid "Invoice Method"
+msgstr "Método de facturación"
+
+msgctxt "field:purchase.purchase,invoice_state:"
+msgid "Invoice State"
+msgstr "Estado de factura"
+
+msgctxt "field:purchase.purchase,invoices:"
+msgid "Invoices"
+msgstr "Facturas"
+
+msgctxt "field:purchase.purchase,invoices_ignored:"
+msgid "Ignored Invoices"
+msgstr "Facturas ignoradas"
+
+msgctxt "field:purchase.purchase,invoices_recreated:"
+msgid "Recreated Invoices"
+msgstr "Facturas recreadas"
+
+msgctxt "field:purchase.purchase,lines:"
+msgid "Lines"
+msgstr "Líneas"
+
+msgctxt "field:purchase.purchase,moves:"
+msgid "Moves"
+msgstr "Movimientos"
+
+msgctxt "field:purchase.purchase,party:"
+msgid "Party"
+msgstr "Entidades"
+
+msgctxt "field:purchase.purchase,party_lang:"
+msgid "Party Language"
+msgstr "Idioma de la entidad"
+
+msgctxt "field:purchase.purchase,payment_term:"
+msgid "Payment Term"
+msgstr "Término de pago"
+
+msgctxt "field:purchase.purchase,purchase_date:"
+msgid "Purchase Date"
+msgstr "Fecha de compra"
+
+msgctxt "field:purchase.purchase,rec_name:"
+msgid "Name"
+msgstr "Nombre"
+
+msgctxt "field:purchase.purchase,reference:"
+msgid "Reference"
+msgstr "Referencia"
+
+msgctxt "field:purchase.purchase,shipment_state:"
+msgid "Shipment State"
+msgstr "Estado de envío"
+
+msgctxt "field:purchase.purchase,shipments:"
+msgid "Shipments"
+msgstr "Envíos"
+
+msgctxt "field:purchase.purchase,state:"
+msgid "State"
+msgstr "Estado"
+
+msgctxt "field:purchase.purchase,supplier_reference:"
+msgid "Supplier Reference"
+msgstr "Referencia de proveedor"
+
+msgctxt "field:purchase.purchase,tax_amount:"
+msgid "Tax"
+msgstr "Impuesto"
+
+msgctxt "field:purchase.purchase,tax_amount_cache:"
+msgid "Tax Cache"
+msgstr "Caché de Impuestos"
+
+msgctxt "field:purchase.purchase,total_amount:"
+msgid "Total"
+msgstr "Total"
+
+msgctxt "field:purchase.purchase,total_amount_cache:"
+msgid "Total Cache"
+msgstr "Caché Total"
+
+msgctxt "field:purchase.purchase,untaxed_amount:"
+msgid "Untaxed"
+msgstr "Sin impuesto"
+
+msgctxt "field:purchase.purchase,untaxed_amount_cache:"
+msgid "Untaxed Cache"
+msgstr "Caché Libre de Impuestos"
+
+msgctxt "field:purchase.purchase,warehouse:"
+msgid "Warehouse"
+msgstr "Almacén"
+
+msgctxt "field:purchase.purchase,write_date:"
+msgid "Write Date"
+msgstr "Fecha modificación"
+
+msgctxt "field:purchase.purchase,write_uid:"
+msgid "Write User"
+msgstr "Usuario modificación"
+
+msgctxt "field:purchase.purchase-account.invoice,create_date:"
+msgid "Create Date"
+msgstr "Fecha creación"
+
+msgctxt "field:purchase.purchase-account.invoice,create_uid:"
+msgid "Create User"
+msgstr "Usuario creación"
+
+msgctxt "field:purchase.purchase-account.invoice,id:"
+msgid "ID"
+msgstr "ID"
+
+msgctxt "field:purchase.purchase-account.invoice,invoice:"
+msgid "Invoice"
+msgstr "Factura"
+
+msgctxt "field:purchase.purchase-account.invoice,purchase:"
+msgid "Purchase"
+msgstr "Compra"
+
+msgctxt "field:purchase.purchase-account.invoice,rec_name:"
+msgid "Name"
+msgstr "Nombre"
+
+msgctxt "field:purchase.purchase-account.invoice,write_date:"
+msgid "Write Date"
+msgstr "Fecha modificación"
+
+msgctxt "field:purchase.purchase-account.invoice,write_uid:"
+msgid "Write User"
+msgstr "Usuario modificación"
+
+msgctxt "field:purchase.purchase-ignored-account.invoice,create_date:"
+msgid "Create Date"
+msgstr "Fecha creación"
+
+msgctxt "field:purchase.purchase-ignored-account.invoice,create_uid:"
+msgid "Create User"
+msgstr "Usuario creación"
+
+msgctxt "field:purchase.purchase-ignored-account.invoice,id:"
+msgid "ID"
+msgstr "ID"
+
+msgctxt "field:purchase.purchase-ignored-account.invoice,invoice:"
+msgid "Invoice"
+msgstr "Factura"
+
+msgctxt "field:purchase.purchase-ignored-account.invoice,purchase:"
+msgid "Purchase"
+msgstr "Compra"
+
+msgctxt "field:purchase.purchase-ignored-account.invoice,rec_name:"
+msgid "Name"
+msgstr "Nombre"
+
+msgctxt "field:purchase.purchase-ignored-account.invoice,write_date:"
+msgid "Write Date"
+msgstr "Fecha modificación"
+
+msgctxt "field:purchase.purchase-ignored-account.invoice,write_uid:"
+msgid "Write User"
+msgstr "Usuario modificación"
+
+msgctxt "field:purchase.purchase-recreated-account.invoice,create_date:"
+msgid "Create Date"
+msgstr "Fecha creación"
+
+msgctxt "field:purchase.purchase-recreated-account.invoice,create_uid:"
+msgid "Create User"
+msgstr "Usuario creación"
+
+msgctxt "field:purchase.purchase-recreated-account.invoice,id:"
+msgid "ID"
+msgstr "ID"
+
+msgctxt "field:purchase.purchase-recreated-account.invoice,invoice:"
+msgid "Invoice"
+msgstr "Factura"
+
+msgctxt "field:purchase.purchase-recreated-account.invoice,purchase:"
+msgid "Purchase"
+msgstr "Compra"
+
+msgctxt "field:purchase.purchase-recreated-account.invoice,rec_name:"
+msgid "Name"
+msgstr "Nombre"
+
+msgctxt "field:purchase.purchase-recreated-account.invoice,write_date:"
+msgid "Write Date"
+msgstr "Fecha modificación"
+
+msgctxt "field:purchase.purchase-recreated-account.invoice,write_uid:"
+msgid "Write User"
+msgstr "Usuario modificación"
+
+msgctxt "field:stock.move,purchase:"
+msgid "Purchase"
+msgstr "Compra"
+
+msgctxt "field:stock.move,purchase_currency:"
+msgid "Purchase Currency"
+msgstr "Divisa de compra"
+
+msgctxt "field:stock.move,purchase_exception_state:"
+msgid "Exception State"
+msgstr "Estado excepción"
+
+msgctxt "field:stock.move,purchase_line:"
+msgid "Purchase Line"
+msgstr "Línea de compra"
+
+msgctxt "field:stock.move,purchase_quantity:"
+msgid "Purchase Quantity"
+msgstr "Cantidad de compra"
+
+msgctxt "field:stock.move,purchase_unit:"
+msgid "Purchase Unit"
+msgstr "Unidad de compra"
+
+msgctxt "field:stock.move,purchase_unit_digits:"
+msgid "Purchase Unit Digits"
+msgstr "Decimales de la unidad de compra"
+
+msgctxt "field:stock.move,purchase_unit_price:"
+msgid "Purchase Unit Price"
+msgstr "Precio de la unidad de compra"
+
+msgctxt "field:stock.move,purchase_visible:"
+msgid "Purchase Visible"
+msgstr "Compra visible"
+
+msgctxt "field:stock.move,supplier:"
+msgid "Supplier"
+msgstr "Proveedor"
+
+msgctxt "help:purchase.handle.invoice.exception.ask,recreate_invoices:"
+msgid ""
+"The selected invoices will be recreated. The other ones will be ignored."
+msgstr "La factura seleccionada será recreada. Las otras serán ignoradas."
+
+msgctxt "help:purchase.handle.shipment.exception.ask,recreate_moves:"
+msgid "The selected moves will be recreated. The other ones will be ignored."
+msgstr "Los movimientos seleccionados se reharán. Los demás se ignorarán."
+
+msgctxt "help:purchase.product_supplier,delivery_time:"
+msgid "In number of days"
+msgstr "En número de días"
+
+msgctxt "help:purchase.product_supplier.price,quantity:"
+msgid "Minimal quantity"
+msgstr "Cantidad mínima"
+
+msgctxt "model:ir.action,name:act_invoice_form"
+msgid "Invoices"
+msgstr "Facturas"
+
+msgctxt "model:ir.action,name:act_open_supplier"
+msgid "Parties associated to Purchases"
+msgstr "Entidades asociadas con compras"
+
+msgctxt "model:ir.action,name:act_purchase_configuration_form"
+msgid "Purchase Configuration"
+msgstr "Configuración de Compra"
+
+msgctxt "model:ir.action,name:act_purchase_form"
+msgid "Purchases"
+msgstr "Compras"
+
+msgctxt "model:ir.action,name:act_purchase_form2"
+msgid "Purchases"
+msgstr "Compras"
+
+msgctxt "model:ir.action,name:act_purchase_form_confirmed"
+msgid "Confirmed Purchases"
+msgstr "Compras confirmadas"
+
+msgctxt "model:ir.action,name:act_purchase_form_draft"
+msgid "Draft Purchases"
+msgstr "Compras en borrador"
+
+msgctxt "model:ir.action,name:act_purchase_form_quotation"
+msgid "Purchases in Quotation"
+msgstr "Compras en cotización"
+
+msgctxt "model:ir.action,name:act_shipment_form"
+msgid "Shipments"
+msgstr "Envíos"
+
+msgctxt "model:ir.action,name:report_purchase"
+msgid "Purchase"
+msgstr "Compra"
+
+msgctxt "model:ir.action,name:wizard_invoice_handle_exception"
+msgid "Handle Invoice Exception"
+msgstr "Gestionar excepción de factura"
+
+msgctxt "model:ir.action,name:wizard_shipment_handle_exception"
+msgid "Handle Shipment Exception"
+msgstr "Gestionar excepción de envio"
+
+msgctxt "model:ir.sequence,name:sequence_purchase"
+msgid "Purchase"
+msgstr "Compra"
+
+msgctxt "model:ir.sequence.type,name:sequence_type_purchase"
+msgid "Purchase"
+msgstr "Compra"
+
+msgctxt "model:ir.ui.menu,name:menu_configuration"
+msgid "Configuration"
+msgstr "Configuración"
+
+msgctxt "model:ir.ui.menu,name:menu_purchase"
+msgid "Purchase"
+msgstr "Gestión de compras"
+
+msgctxt "model:ir.ui.menu,name:menu_purchase_configuration"
+msgid "Purchase Configuration"
+msgstr "Configuración de Compra"
+
+msgctxt "model:ir.ui.menu,name:menu_purchase_form"
+msgid "Purchases"
+msgstr "Compras"
+
+msgctxt "model:ir.ui.menu,name:menu_purchase_form_confirmed"
+msgid "Confirmed Purchases"
+msgstr "Compras confirmadas"
+
+msgctxt "model:ir.ui.menu,name:menu_purchase_form_draft"
+msgid "Draft Purchases"
+msgstr "Compras en borrador"
+
+msgctxt "model:ir.ui.menu,name:menu_purchase_form_quotation"
+msgid "Purchases in Quotation"
+msgstr "Compras en cotización"
+
+msgctxt "model:ir.ui.menu,name:menu_reporting"
+msgid "Reporting"
+msgstr "Informes"
+
+msgctxt "model:ir.ui.menu,name:menu_supplier"
+msgid "Parties associated to Purchases"
+msgstr "Entidades asociadas con compras"
+
+msgctxt "model:purchase.configuration,name:"
+msgid "Purchase Configuration"
+msgstr "Configuración de Compra"
+
+msgctxt "model:purchase.handle.invoice.exception.ask,name:"
+msgid "Handle Invoice Exception"
+msgstr "Factura de excepción - Petición"
+
+msgctxt "model:purchase.handle.shipment.exception.ask,name:"
+msgid "Handle Shipment Exception"
+msgstr "Envio de excepcion - Petición"
+
+msgctxt "model:purchase.line,name:"
+msgid "Purchase Line"
+msgstr "Línea de compra"
+
+msgctxt "model:purchase.line-account.invoice.line,name:"
+msgid "Purchase Line - Invoice Line"
+msgstr "Línea de compra - Línea de factura"
+
+msgctxt "model:purchase.line-account.tax,name:"
+msgid "Purchase Line - Tax"
+msgstr "Línea de compra - Impuesto"
+
+msgctxt "model:purchase.line-ignored-stock.move,name:"
+msgid "Purchase Line - Ignored Move"
+msgstr "Línea de compra - Movimiento Ignorado"
+
+msgctxt "model:purchase.line-recreated-stock.move,name:"
+msgid "Purchase Line - Ignored Move"
+msgstr "Línea de compra - Movimiento ignorado"
+
+msgctxt "model:purchase.product_supplier,name:"
+msgid "Product Supplier"
+msgstr "Proveedor de producto"
+
+msgctxt "model:purchase.product_supplier.price,name:"
+msgid "Product Supplier Price"
+msgstr "Precio del proveedor del producto"
+
+msgctxt "model:purchase.purchase,name:"
+msgid "Purchase"
+msgstr "Compra"
+
+msgctxt "model:purchase.purchase-account.invoice,name:"
+msgid "Purchase - Invoice"
+msgstr "Compra - Factura"
+
+msgctxt "model:purchase.purchase-ignored-account.invoice,name:"
+msgid "Purchase - Ignored Invoice"
+msgstr "Compra - Factura ignorada"
+
+msgctxt "model:purchase.purchase-recreated-account.invoice,name:"
+msgid "Purchase - Recreated Invoice"
+msgstr "Compra - Factura recreada"
+
+msgctxt "model:res.group,name:group_purchase"
+msgid "Purchase"
+msgstr "Compra"
+
+msgctxt "model:res.group,name:group_purchase_admin"
+msgid "Purchase Administrator"
+msgstr "Administrador de compra"
+
+msgctxt "odt:purchase.purchase:"
+msgid "Amount"
+msgstr "Cantidad"
+
+msgctxt "odt:purchase.purchase:"
+msgid "Date:"
+msgstr "Fecha:"
+
+msgctxt "odt:purchase.purchase:"
+msgid "Description"
+msgstr "Descripción"
+
+msgctxt "odt:purchase.purchase:"
+msgid "Description:"
+msgstr "Descripción:"
+
+msgctxt "odt:purchase.purchase:"
+msgid "Draft Purchase Order"
+msgstr "Orden de compra en borrador"
+
+msgctxt "odt:purchase.purchase:"
+msgid "E-Mail:"
+msgstr "Correo electrónico:"
+
+msgctxt "odt:purchase.purchase:"
+msgid "Phone:"
+msgstr "Teléfono:"
+
+msgctxt "odt:purchase.purchase:"
+msgid "Purchase Order N°:"
+msgstr "Nº de orden de compra:"
+
+msgctxt "odt:purchase.purchase:"
+msgid "Quantity"
+msgstr "Cantidad"
+
+msgctxt "odt:purchase.purchase:"
+msgid "Request for Quotation N°:"
+msgstr "Solicitud de presupuesto Nº:"
+
+msgctxt "odt:purchase.purchase:"
+msgid "Taxes"
+msgstr "Impuestos"
+
+msgctxt "odt:purchase.purchase:"
+msgid "Taxes:"
+msgstr "Impuestos:"
+
+msgctxt "odt:purchase.purchase:"
+msgid "Total (excl. taxes):"
+msgstr "Total (sin impuestos):"
+
+msgctxt "odt:purchase.purchase:"
+msgid "Total:"
+msgstr "Total:"
+
+msgctxt "odt:purchase.purchase:"
+msgid "Unit Price"
+msgstr "Precio unitario"
+
+msgctxt "odt:purchase.purchase:"
+msgid "VAT Number:"
+msgstr "CUIT:"
+
+msgctxt "odt:purchase.purchase:"
+msgid "VAT:"
+msgstr "CUIT:"
+
+msgctxt "selection:account.invoice,purchase_exception_state:"
+msgid ""
+msgstr ""
+
+msgctxt "selection:account.invoice,purchase_exception_state:"
+msgid "Ignored"
+msgstr "Ignorado"
+
+msgctxt "selection:account.invoice,purchase_exception_state:"
+msgid "Recreated"
+msgstr "Rehecho"
+
+msgctxt "selection:purchase.configuration,purchase_invoice_method:"
+msgid "Based On Order"
+msgstr "Basado en orden"
+
+msgctxt "selection:purchase.configuration,purchase_invoice_method:"
+msgid "Based On Shipment"
+msgstr "Basado en envio"
+
+msgctxt "selection:purchase.configuration,purchase_invoice_method:"
+msgid "Manual"
+msgstr "Manual"
+
+msgctxt "selection:purchase.line,type:"
+msgid "Comment"
+msgstr "Comentario"
+
+msgctxt "selection:purchase.line,type:"
+msgid "Line"
+msgstr "Línea"
+
+msgctxt "selection:purchase.line,type:"
+msgid "Subtotal"
+msgstr "Subtotal"
+
+msgctxt "selection:purchase.line,type:"
+msgid "Title"
+msgstr "Título"
+
+msgctxt "selection:purchase.purchase,invoice_method:"
+msgid "Based On Order"
+msgstr "Basado en orden"
+
+msgctxt "selection:purchase.purchase,invoice_method:"
+msgid "Based On Shipment"
+msgstr "Basado en envio"
+
+msgctxt "selection:purchase.purchase,invoice_method:"
+msgid "Manual"
+msgstr "Manual"
+
+msgctxt "selection:purchase.purchase,invoice_state:"
+msgid "Exception"
+msgstr "Excepción"
+
+msgctxt "selection:purchase.purchase,invoice_state:"
+msgid "None"
+msgstr "Ninguno"
+
+msgctxt "selection:purchase.purchase,invoice_state:"
+msgid "Paid"
+msgstr "Pagado"
+
+msgctxt "selection:purchase.purchase,invoice_state:"
+msgid "Waiting"
+msgstr "En espera"
+
+msgctxt "selection:purchase.purchase,shipment_state:"
+msgid "Exception"
+msgstr "Excepción"
+
+msgctxt "selection:purchase.purchase,shipment_state:"
+msgid "None"
+msgstr "Ninguno"
+
+msgctxt "selection:purchase.purchase,shipment_state:"
+msgid "Received"
+msgstr "Recibido"
+
+msgctxt "selection:purchase.purchase,shipment_state:"
+msgid "Waiting"
+msgstr "En espera"
+
+msgctxt "selection:purchase.purchase,state:"
+msgid "Canceled"
+msgstr "Cancelado"
+
+msgctxt "selection:purchase.purchase,state:"
+msgid "Confirmed"
+msgstr "Confirmado"
+
+msgctxt "selection:purchase.purchase,state:"
+msgid "Done"
+msgstr "Terminada"
+
+msgctxt "selection:purchase.purchase,state:"
+msgid "Draft"
+msgstr "Borrador"
+
+msgctxt "selection:purchase.purchase,state:"
+msgid "Quotation"
+msgstr "Presupuesto"
+
+msgctxt "selection:stock.move,purchase_exception_state:"
+msgid ""
+msgstr ""
+
+msgctxt "selection:stock.move,purchase_exception_state:"
+msgid "Ignored"
+msgstr "Ignorado"
+
+msgctxt "selection:stock.move,purchase_exception_state:"
+msgid "Recreated"
+msgstr "Rehecho"
+
+msgctxt "view:product.product:"
+msgid "Products"
+msgstr "Productos"
+
+msgctxt "view:product.product:"
+msgid "Suppliers"
+msgstr "Proveedores"
+
+msgctxt "view:product.template:"
+msgid "Product Suppliers"
+msgstr "Proveedores de productos"
+
+msgctxt "view:product.template:"
+msgid "Suppliers"
+msgstr "Proveedores"
+
+msgctxt "view:purchase.configuration:"
+msgid "Purchase Configuration"
+msgstr "Configuración de Compra"
+
+msgctxt "view:purchase.handle.invoice.exception.ask:"
+msgid "Choose invoices to recreate"
+msgstr "Seleccione las facturas a recrear"
+
+msgctxt "view:purchase.handle.invoice.exception.ask:"
+msgid "Handle Invoice Exception"
+msgstr "Manejar excepción de factura"
+
+msgctxt "view:purchase.handle.shipment.exception.ask:"
+msgid "Choose move to recreate"
+msgstr "Escoja un movimiento a rehacer"
+
+msgctxt "view:purchase.handle.shipment.exception.ask:"
+msgid "Choose moves to recreate"
+msgstr "Elegir movimientos a recrear"
+
+msgctxt "view:purchase.handle.shipment.exception.ask:"
+msgid "Handle shipment Exception"
+msgstr "Gestionar excepciones de envio"
+
+msgctxt "view:purchase.handle.shipment.exception.ask:"
+msgid "Recreated Moves"
+msgstr "Movimientos recreados"
+
+msgctxt "view:purchase.line:"
+msgid "General"
+msgstr "General"
+
+msgctxt "view:purchase.line:"
+msgid "Lines"
+msgstr "Líneas"
+
+msgctxt "view:purchase.line:"
+msgid "Notes"
+msgstr "Notas"
+
+msgctxt "view:purchase.line:"
+msgid "Products"
+msgstr "Productos"
+
+msgctxt "view:purchase.line:"
+msgid "Purchase Line"
+msgstr "Línea de compra"
+
+msgctxt "view:purchase.line:"
+msgid "Purchase Lines"
+msgstr "Líneas de compra"
+
+msgctxt "view:purchase.product_supplier.price:"
+msgid "Product Supplier Price"
+msgstr "Precio del proveedor del producto"
+
+msgctxt "view:purchase.product_supplier.price:"
+msgid "Product Supplier Prices"
+msgstr "Precios del proveedor del producto"
+
+msgctxt "view:purchase.product_supplier:"
+msgid "Product Supplier"
+msgstr "Proveedor del producto"
+
+msgctxt "view:purchase.product_supplier:"
+msgid "Product Suppliers"
+msgstr "Proveedores de productos"
+
+msgctxt "view:purchase.purchase:"
+msgid "Cancel"
+msgstr "Cancelar"
+
+msgctxt "view:purchase.purchase:"
+msgid "Confirm"
+msgstr "Confirmar"
+
+msgctxt "view:purchase.purchase:"
+msgid "Draft"
+msgstr "Borrador"
+
+msgctxt "view:purchase.purchase:"
+msgid "Handle Invoice Exception"
+msgstr "Gestionar excepción de factura"
+
+msgctxt "view:purchase.purchase:"
+msgid "Handle Shipment Exception"
+msgstr "Gestionar excepción de envios"
+
+msgctxt "view:purchase.purchase:"
+msgid "Invoices"
+msgstr "Facturas"
+
+msgctxt "view:purchase.purchase:"
+msgid "Lines"
+msgstr "Líneas"
+
+msgctxt "view:purchase.purchase:"
+msgid "Moves"
+msgstr "Movimientos"
+
+msgctxt "view:purchase.purchase:"
+msgid "Other Info"
+msgstr "Información adicional"
+
+msgctxt "view:purchase.purchase:"
+msgid "Purchase"
+msgstr "Compra"
+
+msgctxt "view:purchase.purchase:"
+msgid "Purchases"
+msgstr "Compras"
+
+msgctxt "view:purchase.purchase:"
+msgid "Quotation"
+msgstr "Presupuesto"
+
+msgctxt "view:purchase.purchase:"
+msgid "Quote"
+msgstr "Presupuestar"
+
+msgctxt "view:purchase.purchase:"
+msgid "Shipments"
+msgstr "Envíos"
+
+msgctxt "view:stock.move:"
+msgid "Moves"
+msgstr "Movimientos"
+
+msgctxt "wizard_button:purchase.handle.invoice.exception,ask,end:"
+msgid "Cancel"
+msgstr "Cancelar"
+
+msgctxt "wizard_button:purchase.handle.invoice.exception,ask,handle:"
+msgid "Ok"
+msgstr "Aceptar"
+
+msgctxt "wizard_button:purchase.handle.shipment.exception,ask,end:"
+msgid "Cancel"
+msgstr "Cancelar"
+
+msgctxt "wizard_button:purchase.handle.shipment.exception,ask,handle:"
+msgid "Ok"
+msgstr "Aceptar"
diff --git a/locale/es_CO.po b/locale/es_CO.po
index 0d56658..cdb944f 100644
--- a/locale/es_CO.po
+++ b/locale/es_CO.po
@@ -2,491 +2,778 @@
 msgid ""
 msgstr "Content-Type: text/plain; charset=utf-8\n"
 
-msgctxt "error:account.invoice:0"
+msgctxt "error:account.invoice:"
 msgid "You can not delete invoices that come from a purchase!"
 msgstr "¡No puede borrar facturas que vienen de una compra!"
 
-msgctxt "error:account.invoice:0"
+msgctxt "error:account.invoice:"
 msgid "You cannot reset to draft an invoice generated by a purchase."
 msgstr "No puede regresar a borrador una factura generada por una compra."
 
-msgctxt "error:product.template:0"
+msgctxt "error:product.template:"
 msgid ""
 "Purchase prices are based on the purchase uom, are you sure to change it?"
 msgstr ""
 "Los precios de compra están basados en la UdM de compra,¿desea cambiarlo?"
 
-msgctxt "error:purchase.line:0"
+msgctxt "error:purchase.line:"
 msgid "It misses an \"Account Expense\" on product \"%s\"!"
 msgstr "¡Hace falta una \"Cuenta de Gasto\" del producto \"%s\"!"
 
-msgctxt "error:purchase.line:0"
+msgctxt "error:purchase.line:"
 msgid "It misses an \"account expense\" default property!"
 msgstr "¡Hace falta una propiedad predeterminada de \"cuenta de gastos\"!"
 
-msgctxt "error:purchase.line:0"
+msgctxt "error:purchase.line:"
 msgid "The supplier location is required!"
 msgstr "¡Se requiere el lugar del proveedor!"
 
-msgctxt "error:purchase.purchase:0"
+msgctxt "error:purchase.purchase:"
+msgid "A warehouse must be defined for the quotation."
+msgstr ""
+
+msgctxt "error:purchase.purchase:"
 msgid "Invoice addresses must be defined for the quotation."
 msgstr "Debe definir las direcciones para la cotización."
 
-msgctxt "error:purchase.purchase:0"
+msgctxt "error:purchase.purchase:"
 msgid "It misses an \"Account Payable\" on the party \"%s\"!"
 msgstr "¡Al tercero le hace falta una \"Cuenta de Pagos\"!"
 
-msgctxt "error:stock.shipment.in:0"
+msgctxt "error:purchase.purchase:"
+msgid "Purchase \"%s\" must be cancelled before deletion!"
+msgstr ""
+
+msgctxt "error:stock.shipment.in:"
 msgid "You cannot reset to draft a move generated by a purchase."
 msgstr "No puede revertir a borrador un movimiento generado por una compra."
 
-msgctxt "field:account.invoice,purchase_exception_state:0"
+msgctxt "field:account.invoice,purchase_exception_state:"
 msgid "Exception State"
 msgstr "Estado Excepción"
 
 #, fuzzy
-msgctxt "field:account.invoice,purchases:0"
+msgctxt "field:account.invoice,purchases:"
 msgid "Purchases"
 msgstr "Compras"
 
 #, fuzzy
-msgctxt "field:account.invoice.line,purchase_lines:0"
+msgctxt "field:account.invoice.line,purchase_lines:"
 msgid "Purchase Lines"
 msgstr "Líneas de Compra"
 
-msgctxt "field:product.template,product_suppliers:0"
+msgctxt "field:product.template,product_suppliers:"
 msgid "Suppliers"
 msgstr "Proveedores"
 
-msgctxt "field:product.template,purchasable:0"
+msgctxt "field:product.template,purchasable:"
 msgid "Purchasable"
 msgstr "Comprable"
 
-msgctxt "field:product.template,purchase_uom:0"
+msgctxt "field:product.template,purchase_uom:"
 msgid "Purchase UOM"
 msgstr "UdM de Compra"
 
+msgctxt "field:purchase.configuration,create_date:"
+msgid "Create Date"
+msgstr ""
+
 #, fuzzy
-msgctxt "field:purchase.configuration,purchase_invoice_method:0"
+msgctxt "field:purchase.configuration,create_uid:"
+msgid "Create User"
+msgstr "Crear usuario"
+
+msgctxt "field:purchase.configuration,id:"
+msgid "ID"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:purchase.configuration,purchase_invoice_method:"
 msgid "Invoice Method"
 msgstr "Método de Facturación"
 
-msgctxt "field:purchase.configuration,purchase_sequence:0"
+msgctxt "field:purchase.configuration,purchase_sequence:"
 msgid "Purchase Reference Sequence"
 msgstr ""
 
 #, fuzzy
-msgctxt "field:purchase.configuration,rec_name:0"
+msgctxt "field:purchase.configuration,rec_name:"
 msgid "Name"
 msgstr "Nombre de Contacto"
 
-msgctxt "field:purchase.handle.invoice.exception.ask,domain_invoices:0"
+msgctxt "field:purchase.configuration,write_date:"
+msgid "Write Date"
+msgstr ""
+
+msgctxt "field:purchase.configuration,write_uid:"
+msgid "Write User"
+msgstr ""
+
+msgctxt "field:purchase.handle.invoice.exception.ask,domain_invoices:"
 msgid "Domain Invoices"
 msgstr "Rango de facturas"
 
-msgctxt "field:purchase.handle.invoice.exception.ask,recreate_invoices:0"
+msgctxt "field:purchase.handle.invoice.exception.ask,id:"
+msgid "ID"
+msgstr ""
+
+msgctxt "field:purchase.handle.invoice.exception.ask,recreate_invoices:"
 msgid "Recreate Invoices"
 msgstr "Rehacer facturas"
 
-msgctxt "field:purchase.handle.shipment.exception.ask,domain_moves:0"
+msgctxt "field:purchase.handle.shipment.exception.ask,domain_moves:"
 msgid "Domain Moves"
 msgstr "Rango de movimientos"
 
-msgctxt "field:purchase.handle.shipment.exception.ask,recreate_moves:0"
+msgctxt "field:purchase.handle.shipment.exception.ask,id:"
+msgid "ID"
+msgstr ""
+
+msgctxt "field:purchase.handle.shipment.exception.ask,recreate_moves:"
 msgid "Recreate Moves"
 msgstr "Rehacer movimientos"
 
-msgctxt "field:purchase.line,amount:0"
+msgctxt "field:purchase.line,amount:"
 msgid "Amount"
 msgstr "Cantidad"
 
-msgctxt "field:purchase.line,description:0"
+msgctxt "field:purchase.line,create_date:"
+msgid "Create Date"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:purchase.line,create_uid:"
+msgid "Create User"
+msgstr "Crear usuario"
+
+msgctxt "field:purchase.line,delivery_date:"
+msgid "Delivery Date"
+msgstr ""
+
+msgctxt "field:purchase.line,description:"
 msgid "Description"
 msgstr "Descripción"
 
-msgctxt "field:purchase.line,invoice_lines:0"
+#, fuzzy
+msgctxt "field:purchase.line,from_location:"
+msgid "From Location"
+msgstr "Lugar Inicial"
+
+msgctxt "field:purchase.line,id:"
+msgid "ID"
+msgstr ""
+
+msgctxt "field:purchase.line,invoice_lines:"
 msgid "Invoice Lines"
 msgstr "Líneas de Factura"
 
-msgctxt "field:purchase.line,move_done:0"
+msgctxt "field:purchase.line,move_done:"
 msgid "Moves Done"
 msgstr "Movimientos Hechos"
 
-msgctxt "field:purchase.line,move_exception:0"
+msgctxt "field:purchase.line,move_exception:"
 msgid "Moves Exception"
 msgstr "Exepción de Movimientos"
 
-msgctxt "field:purchase.line,moves:0"
+msgctxt "field:purchase.line,moves:"
 msgid "Moves"
 msgstr "Movimientos"
 
-msgctxt "field:purchase.line,moves_ignored:0"
+msgctxt "field:purchase.line,moves_ignored:"
 msgid "Ignored Moves"
 msgstr "Movimientos Ignorados"
 
-msgctxt "field:purchase.line,moves_recreated:0"
+msgctxt "field:purchase.line,moves_recreated:"
 msgid "Recreated Moves"
 msgstr "Movimientos recreados"
 
-msgctxt "field:purchase.line,note:0"
+msgctxt "field:purchase.line,note:"
 msgid "Note"
 msgstr "Nota"
 
-msgctxt "field:purchase.line,product:0"
+msgctxt "field:purchase.line,product:"
 msgid "Product"
 msgstr "Producto"
 
-msgctxt "field:purchase.line,purchase:0"
+msgctxt "field:purchase.line,product_uom_category:"
+msgid "Product Uom Category"
+msgstr ""
+
+msgctxt "field:purchase.line,purchase:"
 msgid "Purchase"
 msgstr "Compra"
 
-msgctxt "field:purchase.line,quantity:0"
+msgctxt "field:purchase.line,quantity:"
 msgid "Quantity"
 msgstr "Cantidad"
 
-msgctxt "field:purchase.line,rec_name:0"
+msgctxt "field:purchase.line,rec_name:"
 msgid "Name"
 msgstr "Nombre"
 
-msgctxt "field:purchase.line,sequence:0"
+msgctxt "field:purchase.line,sequence:"
 msgid "Sequence"
 msgstr "Secuencia"
 
-msgctxt "field:purchase.line,taxes:0"
+msgctxt "field:purchase.line,taxes:"
 msgid "Taxes"
 msgstr "Impuestos"
 
-msgctxt "field:purchase.line,type:0"
+#, fuzzy
+msgctxt "field:purchase.line,to_location:"
+msgid "To Location"
+msgstr "Al Lugar:"
+
+msgctxt "field:purchase.line,type:"
 msgid "Type"
 msgstr "Tipo"
 
-msgctxt "field:purchase.line,unit:0"
+msgctxt "field:purchase.line,unit:"
 msgid "Unit"
 msgstr "Unidad"
 
-msgctxt "field:purchase.line,unit_digits:0"
+msgctxt "field:purchase.line,unit_digits:"
 msgid "Unit Digits"
 msgstr "Dígitos Unitarios"
 
-msgctxt "field:purchase.line,unit_price:0"
+msgctxt "field:purchase.line,unit_price:"
 msgid "Unit Price"
 msgstr "Precio Unitario"
 
-msgctxt "field:purchase.line-account.invoice.line,invoice_line:0"
+msgctxt "field:purchase.line,write_date:"
+msgid "Write Date"
+msgstr ""
+
+msgctxt "field:purchase.line,write_uid:"
+msgid "Write User"
+msgstr ""
+
+msgctxt "field:purchase.line-account.invoice.line,create_date:"
+msgid "Create Date"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:purchase.line-account.invoice.line,create_uid:"
+msgid "Create User"
+msgstr "Crear usuario"
+
+msgctxt "field:purchase.line-account.invoice.line,id:"
+msgid "ID"
+msgstr ""
+
+msgctxt "field:purchase.line-account.invoice.line,invoice_line:"
 msgid "Invoice Line"
 msgstr "Línea de Factura"
 
-msgctxt "field:purchase.line-account.invoice.line,purchase_line:0"
+msgctxt "field:purchase.line-account.invoice.line,purchase_line:"
 msgid "Purchase Line"
 msgstr "Línea de Compra"
 
-msgctxt "field:purchase.line-account.invoice.line,rec_name:0"
+msgctxt "field:purchase.line-account.invoice.line,rec_name:"
 msgid "Name"
 msgstr "Nombre"
 
-msgctxt "field:purchase.line-account.tax,line:0"
+msgctxt "field:purchase.line-account.invoice.line,write_date:"
+msgid "Write Date"
+msgstr ""
+
+msgctxt "field:purchase.line-account.invoice.line,write_uid:"
+msgid "Write User"
+msgstr ""
+
+msgctxt "field:purchase.line-account.tax,create_date:"
+msgid "Create Date"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:purchase.line-account.tax,create_uid:"
+msgid "Create User"
+msgstr "Crear usuario"
+
+msgctxt "field:purchase.line-account.tax,id:"
+msgid "ID"
+msgstr ""
+
+msgctxt "field:purchase.line-account.tax,line:"
 msgid "Purchase Line"
 msgstr "Línea de Compra"
 
-msgctxt "field:purchase.line-account.tax,rec_name:0"
+msgctxt "field:purchase.line-account.tax,rec_name:"
 msgid "Name"
 msgstr "Nombre"
 
-msgctxt "field:purchase.line-account.tax,tax:0"
+msgctxt "field:purchase.line-account.tax,tax:"
 msgid "Tax"
 msgstr "Impuesto"
 
-msgctxt "field:purchase.line-ignored-stock.move,move:0"
+msgctxt "field:purchase.line-account.tax,write_date:"
+msgid "Write Date"
+msgstr ""
+
+msgctxt "field:purchase.line-account.tax,write_uid:"
+msgid "Write User"
+msgstr ""
+
+msgctxt "field:purchase.line-ignored-stock.move,create_date:"
+msgid "Create Date"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:purchase.line-ignored-stock.move,create_uid:"
+msgid "Create User"
+msgstr "Crear usuario"
+
+msgctxt "field:purchase.line-ignored-stock.move,id:"
+msgid "ID"
+msgstr ""
+
+msgctxt "field:purchase.line-ignored-stock.move,move:"
 msgid "Move"
 msgstr "Movimiento"
 
-msgctxt "field:purchase.line-ignored-stock.move,purchase_line:0"
+msgctxt "field:purchase.line-ignored-stock.move,purchase_line:"
 msgid "Purchase Line"
 msgstr "Línea de Compra"
 
-msgctxt "field:purchase.line-ignored-stock.move,rec_name:0"
+msgctxt "field:purchase.line-ignored-stock.move,rec_name:"
 msgid "Name"
 msgstr "Nombre"
 
-msgctxt "field:purchase.line-recreated-stock.move,move:0"
+msgctxt "field:purchase.line-ignored-stock.move,write_date:"
+msgid "Write Date"
+msgstr ""
+
+msgctxt "field:purchase.line-ignored-stock.move,write_uid:"
+msgid "Write User"
+msgstr ""
+
+msgctxt "field:purchase.line-recreated-stock.move,create_date:"
+msgid "Create Date"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:purchase.line-recreated-stock.move,create_uid:"
+msgid "Create User"
+msgstr "Crear usuario"
+
+msgctxt "field:purchase.line-recreated-stock.move,id:"
+msgid "ID"
+msgstr ""
+
+msgctxt "field:purchase.line-recreated-stock.move,move:"
 msgid "Move"
 msgstr "Movimiento"
 
-msgctxt "field:purchase.line-recreated-stock.move,purchase_line:0"
+msgctxt "field:purchase.line-recreated-stock.move,purchase_line:"
 msgid "Purchase Line"
 msgstr "Línea de Compra"
 
-msgctxt "field:purchase.line-recreated-stock.move,rec_name:0"
+msgctxt "field:purchase.line-recreated-stock.move,rec_name:"
 msgid "Name"
 msgstr "Nombre"
 
-msgctxt "field:purchase.product_supplier,code:0"
+msgctxt "field:purchase.line-recreated-stock.move,write_date:"
+msgid "Write Date"
+msgstr ""
+
+msgctxt "field:purchase.line-recreated-stock.move,write_uid:"
+msgid "Write User"
+msgstr ""
+
+msgctxt "field:purchase.product_supplier,code:"
 msgid "Code"
 msgstr "Código"
 
-msgctxt "field:purchase.product_supplier,company:0"
+msgctxt "field:purchase.product_supplier,company:"
 msgid "Company"
 msgstr "Compañía"
 
-msgctxt "field:purchase.product_supplier,delivery_time:0"
+msgctxt "field:purchase.product_supplier,create_date:"
+msgid "Create Date"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:purchase.product_supplier,create_uid:"
+msgid "Create User"
+msgstr "Crear usuario"
+
+#, fuzzy
+msgctxt "field:purchase.product_supplier,currency:"
+msgid "Currency"
+msgstr "Moneda"
+
+msgctxt "field:purchase.product_supplier,delivery_time:"
 msgid "Delivery Time"
 msgstr "Tiempo de Envío"
 
-msgctxt "field:purchase.product_supplier,name:0"
+msgctxt "field:purchase.product_supplier,id:"
+msgid "ID"
+msgstr ""
+
+msgctxt "field:purchase.product_supplier,name:"
 msgid "Name"
 msgstr "Nombre"
 
-msgctxt "field:purchase.product_supplier,party:0"
+msgctxt "field:purchase.product_supplier,party:"
 msgid "Supplier"
 msgstr "Proveedor"
 
-msgctxt "field:purchase.product_supplier,prices:0"
+msgctxt "field:purchase.product_supplier,prices:"
 msgid "Prices"
 msgstr "Precios"
 
-msgctxt "field:purchase.product_supplier,product:0"
+msgctxt "field:purchase.product_supplier,product:"
 msgid "Product"
 msgstr "Producto"
 
-msgctxt "field:purchase.product_supplier,rec_name:0"
+msgctxt "field:purchase.product_supplier,rec_name:"
 msgid "Name"
 msgstr "Nombre"
 
-msgctxt "field:purchase.product_supplier,sequence:0"
+msgctxt "field:purchase.product_supplier,sequence:"
 msgid "Sequence"
 msgstr "Secuencia"
 
-msgctxt "field:purchase.product_supplier.price,product_supplier:0"
+msgctxt "field:purchase.product_supplier,write_date:"
+msgid "Write Date"
+msgstr ""
+
+msgctxt "field:purchase.product_supplier,write_uid:"
+msgid "Write User"
+msgstr ""
+
+msgctxt "field:purchase.product_supplier.price,create_date:"
+msgid "Create Date"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:purchase.product_supplier.price,create_uid:"
+msgid "Create User"
+msgstr "Crear usuario"
+
+msgctxt "field:purchase.product_supplier.price,id:"
+msgid "ID"
+msgstr ""
+
+msgctxt "field:purchase.product_supplier.price,product_supplier:"
 msgid "Supplier"
 msgstr "Proveedor"
 
-msgctxt "field:purchase.product_supplier.price,quantity:0"
+msgctxt "field:purchase.product_supplier.price,quantity:"
 msgid "Quantity"
 msgstr "Cantidad"
 
-msgctxt "field:purchase.product_supplier.price,rec_name:0"
+msgctxt "field:purchase.product_supplier.price,rec_name:"
 msgid "Name"
 msgstr "Nombre"
 
-msgctxt "field:purchase.product_supplier.price,unit_price:0"
+msgctxt "field:purchase.product_supplier.price,unit_price:"
 msgid "Unit Price"
 msgstr "Precio Unitario"
 
-msgctxt "field:purchase.purchase,comment:0"
+msgctxt "field:purchase.product_supplier.price,write_date:"
+msgid "Write Date"
+msgstr ""
+
+msgctxt "field:purchase.product_supplier.price,write_uid:"
+msgid "Write User"
+msgstr ""
+
+msgctxt "field:purchase.purchase,comment:"
 msgid "Comment"
 msgstr "Comentario"
 
-msgctxt "field:purchase.purchase,company:0"
+msgctxt "field:purchase.purchase,company:"
 msgid "Company"
 msgstr "Compañía"
 
-msgctxt "field:purchase.purchase,currency:0"
+msgctxt "field:purchase.purchase,create_date:"
+msgid "Create Date"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:purchase.purchase,create_uid:"
+msgid "Create User"
+msgstr "Crear usuario"
+
+msgctxt "field:purchase.purchase,currency:"
 msgid "Currency"
 msgstr "Moneda"
 
-msgctxt "field:purchase.purchase,currency_digits:0"
+msgctxt "field:purchase.purchase,currency_digits:"
 msgid "Currency Digits"
 msgstr "Dígitos de Moneda"
 
-msgctxt "field:purchase.purchase,description:0"
+msgctxt "field:purchase.purchase,description:"
 msgid "Description"
 msgstr "Descripción"
 
-msgctxt "field:purchase.purchase,invoice_address:0"
+msgctxt "field:purchase.purchase,id:"
+msgid "ID"
+msgstr ""
+
+msgctxt "field:purchase.purchase,invoice_address:"
 msgid "Invoice Address"
 msgstr "Dirección de Facturación"
 
-msgctxt "field:purchase.purchase,invoice_exception:0"
-msgid "Invoices Exception"
-msgstr "Excepción de Facturación"
-
-msgctxt "field:purchase.purchase,invoice_method:0"
+msgctxt "field:purchase.purchase,invoice_method:"
 msgid "Invoice Method"
 msgstr "Método de Facturación"
 
-msgctxt "field:purchase.purchase,invoice_paid:0"
-msgid "Invoices Paid"
-msgstr "Facturas Pagadas"
-
-msgctxt "field:purchase.purchase,invoice_state:0"
+msgctxt "field:purchase.purchase,invoice_state:"
 msgid "Invoice State"
 msgstr "Estado de Factura"
 
-msgctxt "field:purchase.purchase,invoices:0"
+msgctxt "field:purchase.purchase,invoices:"
 msgid "Invoices"
 msgstr "Facturas"
 
-msgctxt "field:purchase.purchase,invoices_ignored:0"
+msgctxt "field:purchase.purchase,invoices_ignored:"
 msgid "Ignored Invoices"
 msgstr "Facturas Ignoradas"
 
-msgctxt "field:purchase.purchase,invoices_recreated:0"
+msgctxt "field:purchase.purchase,invoices_recreated:"
 msgid "Recreated Invoices"
 msgstr "Facturas recreadas"
 
-msgctxt "field:purchase.purchase,lines:0"
+msgctxt "field:purchase.purchase,lines:"
 msgid "Lines"
 msgstr "Líneas"
 
-msgctxt "field:purchase.purchase,moves:0"
+msgctxt "field:purchase.purchase,moves:"
 msgid "Moves"
 msgstr "Movimientos"
 
-msgctxt "field:purchase.purchase,party:0"
+msgctxt "field:purchase.purchase,party:"
 msgid "Party"
 msgstr "Terceros"
 
-msgctxt "field:purchase.purchase,party_lang:0"
+msgctxt "field:purchase.purchase,party_lang:"
 msgid "Party Language"
 msgstr "Idioma del Tercero"
 
-msgctxt "field:purchase.purchase,payment_term:0"
+msgctxt "field:purchase.purchase,payment_term:"
 msgid "Payment Term"
 msgstr "Término de Pago"
 
-msgctxt "field:purchase.purchase,purchase_date:0"
+msgctxt "field:purchase.purchase,purchase_date:"
 msgid "Purchase Date"
 msgstr "Fecha de Compra"
 
-msgctxt "field:purchase.purchase,rec_name:0"
+msgctxt "field:purchase.purchase,rec_name:"
 msgid "Name"
 msgstr "Nombre"
 
-msgctxt "field:purchase.purchase,reference:0"
+msgctxt "field:purchase.purchase,reference:"
 msgid "Reference"
 msgstr "Referencia"
 
-msgctxt "field:purchase.purchase,shipment_done:0"
-msgid "Shipment Done"
-msgstr "Envío Finalizado"
-
-msgctxt "field:purchase.purchase,shipment_exception:0"
-msgid "Shipments Exception"
-msgstr "Excepción de Envío"
-
-msgctxt "field:purchase.purchase,shipment_state:0"
+msgctxt "field:purchase.purchase,shipment_state:"
 msgid "Shipment State"
 msgstr "Estado de Envío"
 
-msgctxt "field:purchase.purchase,shipments:0"
+msgctxt "field:purchase.purchase,shipments:"
 msgid "Shipments"
 msgstr "Envíos"
 
-msgctxt "field:purchase.purchase,state:0"
+msgctxt "field:purchase.purchase,state:"
 msgid "State"
 msgstr "Estado"
 
-msgctxt "field:purchase.purchase,supplier_reference:0"
+msgctxt "field:purchase.purchase,supplier_reference:"
 msgid "Supplier Reference"
 msgstr "Referencia de Proveedor"
 
-msgctxt "field:purchase.purchase,tax_amount:0"
+msgctxt "field:purchase.purchase,tax_amount:"
 msgid "Tax"
 msgstr "Impuesto"
 
-msgctxt "field:purchase.purchase,total_amount:0"
+msgctxt "field:purchase.purchase,tax_amount_cache:"
+msgid "Tax Cache"
+msgstr ""
+
+msgctxt "field:purchase.purchase,total_amount:"
 msgid "Total"
 msgstr "Total"
 
-msgctxt "field:purchase.purchase,untaxed_amount:0"
+msgctxt "field:purchase.purchase,total_amount_cache:"
+msgid "Total Cache"
+msgstr ""
+
+msgctxt "field:purchase.purchase,untaxed_amount:"
 msgid "Untaxed"
 msgstr "Sin Impuesto"
 
-msgctxt "field:purchase.purchase,warehouse:0"
+msgctxt "field:purchase.purchase,untaxed_amount_cache:"
+msgid "Untaxed Cache"
+msgstr ""
+
+msgctxt "field:purchase.purchase,warehouse:"
 msgid "Warehouse"
 msgstr "Depósito"
 
-msgctxt "field:purchase.purchase-account.invoice,invoice:0"
+msgctxt "field:purchase.purchase,write_date:"
+msgid "Write Date"
+msgstr ""
+
+msgctxt "field:purchase.purchase,write_uid:"
+msgid "Write User"
+msgstr ""
+
+msgctxt "field:purchase.purchase-account.invoice,create_date:"
+msgid "Create Date"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:purchase.purchase-account.invoice,create_uid:"
+msgid "Create User"
+msgstr "Crear usuario"
+
+msgctxt "field:purchase.purchase-account.invoice,id:"
+msgid "ID"
+msgstr ""
+
+msgctxt "field:purchase.purchase-account.invoice,invoice:"
 msgid "Invoice"
 msgstr "Factura"
 
-msgctxt "field:purchase.purchase-account.invoice,purchase:0"
+msgctxt "field:purchase.purchase-account.invoice,purchase:"
 msgid "Purchase"
 msgstr "Compra"
 
-msgctxt "field:purchase.purchase-account.invoice,rec_name:0"
+msgctxt "field:purchase.purchase-account.invoice,rec_name:"
 msgid "Name"
 msgstr "Nombre"
 
-msgctxt "field:purchase.purchase-ignored-account.invoice,invoice:0"
+msgctxt "field:purchase.purchase-account.invoice,write_date:"
+msgid "Write Date"
+msgstr ""
+
+msgctxt "field:purchase.purchase-account.invoice,write_uid:"
+msgid "Write User"
+msgstr ""
+
+msgctxt "field:purchase.purchase-ignored-account.invoice,create_date:"
+msgid "Create Date"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:purchase.purchase-ignored-account.invoice,create_uid:"
+msgid "Create User"
+msgstr "Crear usuario"
+
+msgctxt "field:purchase.purchase-ignored-account.invoice,id:"
+msgid "ID"
+msgstr ""
+
+msgctxt "field:purchase.purchase-ignored-account.invoice,invoice:"
 msgid "Invoice"
 msgstr "Factura"
 
-msgctxt "field:purchase.purchase-ignored-account.invoice,purchase:0"
+msgctxt "field:purchase.purchase-ignored-account.invoice,purchase:"
 msgid "Purchase"
 msgstr "Compra"
 
-msgctxt "field:purchase.purchase-ignored-account.invoice,rec_name:0"
+msgctxt "field:purchase.purchase-ignored-account.invoice,rec_name:"
 msgid "Name"
 msgstr "Nombre"
 
-msgctxt "field:purchase.purchase-recreated-account.invoice,invoice:0"
+msgctxt "field:purchase.purchase-ignored-account.invoice,write_date:"
+msgid "Write Date"
+msgstr ""
+
+msgctxt "field:purchase.purchase-ignored-account.invoice,write_uid:"
+msgid "Write User"
+msgstr ""
+
+msgctxt "field:purchase.purchase-recreated-account.invoice,create_date:"
+msgid "Create Date"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:purchase.purchase-recreated-account.invoice,create_uid:"
+msgid "Create User"
+msgstr "Crear usuario"
+
+msgctxt "field:purchase.purchase-recreated-account.invoice,id:"
+msgid "ID"
+msgstr ""
+
+msgctxt "field:purchase.purchase-recreated-account.invoice,invoice:"
 msgid "Invoice"
 msgstr "Factura"
 
-msgctxt "field:purchase.purchase-recreated-account.invoice,purchase:0"
+msgctxt "field:purchase.purchase-recreated-account.invoice,purchase:"
 msgid "Purchase"
 msgstr "Compra"
 
-msgctxt "field:purchase.purchase-recreated-account.invoice,rec_name:0"
+msgctxt "field:purchase.purchase-recreated-account.invoice,rec_name:"
 msgid "Name"
 msgstr "Nombre"
 
-msgctxt "field:stock.move,purchase:0"
+msgctxt "field:purchase.purchase-recreated-account.invoice,write_date:"
+msgid "Write Date"
+msgstr ""
+
+msgctxt "field:purchase.purchase-recreated-account.invoice,write_uid:"
+msgid "Write User"
+msgstr ""
+
+msgctxt "field:stock.move,purchase:"
 msgid "Purchase"
 msgstr "Compra"
 
-msgctxt "field:stock.move,purchase_currency:0"
+msgctxt "field:stock.move,purchase_currency:"
 msgid "Purchase Currency"
 msgstr "Moneda de Compra"
 
-msgctxt "field:stock.move,purchase_exception_state:0"
+msgctxt "field:stock.move,purchase_exception_state:"
 msgid "Exception State"
 msgstr "Estado Excepción"
 
 #, fuzzy
-msgctxt "field:stock.move,purchase_line:0"
+msgctxt "field:stock.move,purchase_line:"
 msgid "Purchase Line"
 msgstr "Línea de Compra"
 
-msgctxt "field:stock.move,purchase_quantity:0"
+msgctxt "field:stock.move,purchase_quantity:"
 msgid "Purchase Quantity"
 msgstr "Cantidad de Compra"
 
-msgctxt "field:stock.move,purchase_unit:0"
+msgctxt "field:stock.move,purchase_unit:"
 msgid "Purchase Unit"
 msgstr "Unidad de Compra"
 
-msgctxt "field:stock.move,purchase_unit_digits:0"
+msgctxt "field:stock.move,purchase_unit_digits:"
 msgid "Purchase Unit Digits"
 msgstr "Dígitos de Unidad de Compra"
 
-msgctxt "field:stock.move,purchase_unit_price:0"
+msgctxt "field:stock.move,purchase_unit_price:"
 msgid "Purchase Unit Price"
 msgstr "Precio Unitario de Compra"
 
-msgctxt "field:stock.move,purchase_visible:0"
+msgctxt "field:stock.move,purchase_visible:"
 msgid "Purchase Visible"
 msgstr ""
 
-msgctxt "field:stock.move,supplier:0"
+msgctxt "field:stock.move,supplier:"
 msgid "Supplier"
 msgstr "Proveedor"
 
-msgctxt "help:purchase.handle.invoice.exception.ask,recreate_invoices:0"
+msgctxt "help:purchase.handle.invoice.exception.ask,recreate_invoices:"
 msgid ""
 "The selected invoices will be recreated. The other ones will be ignored."
 msgstr "La factura seleccionada será recreada. Las otras serán ignoradas."
 
-msgctxt "help:purchase.handle.shipment.exception.ask,recreate_moves:0"
+msgctxt "help:purchase.handle.shipment.exception.ask,recreate_moves:"
 msgid "The selected moves will be recreated. The other ones will be ignored."
 msgstr "Se recrearán los movimientos seleccionados. Los demás se ignorarán."
 
-msgctxt "help:purchase.product_supplier,delivery_time:0"
+msgctxt "help:purchase.product_supplier,delivery_time:"
 msgid "In number of days"
 msgstr "En número de días"
 
-msgctxt "help:purchase.product_supplier.price,quantity:0"
+msgctxt "help:purchase.product_supplier.price,quantity:"
 msgid "Minimal quantity"
 msgstr "Cantidad Mínima"
 
@@ -583,59 +870,61 @@ msgctxt "model:ir.ui.menu,name:menu_supplier"
 msgid "Parties associated to Purchases"
 msgstr "Terceros Asociados a Compras"
 
-msgctxt "model:purchase.configuration,name:0"
+msgctxt "model:purchase.configuration,name:"
 msgid "Purchase Configuration"
 msgstr ""
 
-msgctxt "model:purchase.handle.invoice.exception.ask,name:0"
-msgid "Invoice Exception Ask"
+#, fuzzy
+msgctxt "model:purchase.handle.invoice.exception.ask,name:"
+msgid "Handle Invoice Exception"
 msgstr "Pregunta de Excepción de Factura"
 
-msgctxt "model:purchase.handle.shipment.exception.ask,name:0"
-msgid "Shipment Exception Ask"
+#, fuzzy
+msgctxt "model:purchase.handle.shipment.exception.ask,name:"
+msgid "Handle Shipment Exception"
 msgstr "Preguntar Excepción de Envío"
 
-msgctxt "model:purchase.line,name:0"
+msgctxt "model:purchase.line,name:"
 msgid "Purchase Line"
 msgstr "Línea de Compra"
 
-msgctxt "model:purchase.line-account.invoice.line,name:0"
+msgctxt "model:purchase.line-account.invoice.line,name:"
 msgid "Purchase Line - Invoice Line"
 msgstr "Línea de Compra - Línea de Factura"
 
-msgctxt "model:purchase.line-account.tax,name:0"
+msgctxt "model:purchase.line-account.tax,name:"
 msgid "Purchase Line - Tax"
 msgstr "Línea de Compra - Impuesto"
 
-msgctxt "model:purchase.line-ignored-stock.move,name:0"
+msgctxt "model:purchase.line-ignored-stock.move,name:"
 msgid "Purchase Line - Ignored Move"
 msgstr "Línea de Compra - Movimiento Ignorado"
 
-msgctxt "model:purchase.line-recreated-stock.move,name:0"
+msgctxt "model:purchase.line-recreated-stock.move,name:"
 msgid "Purchase Line - Ignored Move"
 msgstr "Línea de Compra - Movimiento Ignorado"
 
-msgctxt "model:purchase.product_supplier,name:0"
+msgctxt "model:purchase.product_supplier,name:"
 msgid "Product Supplier"
 msgstr "Proveedor de Producto"
 
-msgctxt "model:purchase.product_supplier.price,name:0"
+msgctxt "model:purchase.product_supplier.price,name:"
 msgid "Product Supplier Price"
 msgstr "Precio del Proveedor de Producto"
 
-msgctxt "model:purchase.purchase,name:0"
+msgctxt "model:purchase.purchase,name:"
 msgid "Purchase"
 msgstr "Compra"
 
-msgctxt "model:purchase.purchase-account.invoice,name:0"
+msgctxt "model:purchase.purchase-account.invoice,name:"
 msgid "Purchase - Invoice"
 msgstr "Compra - Factura"
 
-msgctxt "model:purchase.purchase-ignored-account.invoice,name:0"
+msgctxt "model:purchase.purchase-ignored-account.invoice,name:"
 msgid "Purchase - Ignored Invoice"
 msgstr "Compra - Factura Ignorada"
 
-msgctxt "model:purchase.purchase-recreated-account.invoice,name:0"
+msgctxt "model:purchase.purchase-recreated-account.invoice,name:"
 msgid "Purchase - Recreated Invoice"
 msgstr "Compra - Factura Recreada"
 
@@ -647,420 +936,356 @@ msgctxt "model:res.group,name:group_purchase_admin"
 msgid "Purchase Administrator"
 msgstr "Administrador de Compra"
 
-msgctxt "model:workflow,name:purchase_workflow"
-msgid "Purchase workflow"
-msgstr "Flujo de Trabajo de Compras"
-
-msgctxt "model:workflow.activity,name:purchase_activity_cancel"
-msgid "Canceled"
-msgstr "Cancelado"
-
-msgctxt "model:workflow.activity,name:purchase_activity_confirmed"
-msgid "Confirmed"
-msgstr "Confirmado"
-
-msgctxt "model:workflow.activity,name:purchase_activity_done"
-msgid "Done"
-msgstr "Hecho"
-
-msgctxt "model:workflow.activity,name:purchase_activity_draft"
-msgid "Draft"
-msgstr "Borrador"
-
-msgctxt "model:workflow.activity,name:purchase_activity_invoice_done"
-msgid "Invoice Done"
-msgstr "Factura Completa"
-
-msgctxt "model:workflow.activity,name:purchase_activity_invoice_method"
-msgid "Invoice Method"
-msgstr "Método de Facturación"
-
-msgctxt "model:workflow.activity,name:purchase_activity_invoice_method_done"
-msgid "Invoice Method Done"
-msgstr "Método de Factura Completo"
-
-msgctxt ""
-"model:workflow.activity,name:purchase_activity_invoice_purchase_exception"
-msgid "Invoice Exception"
-msgstr "Excepción de Factura"
-
-msgctxt "model:workflow.activity,name:purchase_activity_invoice_shipment"
-msgid "Invoice Shipment"
-msgstr "Envío de Factura"
-
-msgctxt "model:workflow.activity,name:purchase_activity_invoice_shipment_done"
-msgid "Invoice Shipment Done"
-msgstr "Envío de Factura Completo"
-
-msgctxt ""
-"model:workflow.activity,name:purchase_activity_invoice_shipment_exception"
-msgid "Invoice Shipment Exception"
-msgstr "Excepción de Envío de Factura"
-
-msgctxt ""
-"model:workflow.activity,name:purchase_activity_invoice_shipment_method"
-msgid "Invoice Shipment Method"
-msgstr "Método de Envío de Factura"
-
-msgctxt ""
-"model:workflow.activity,name:purchase_activity_invoice_shipment_method_done"
-msgid "Invoice Shipment Method Done"
-msgstr "Método de Envío de Factura Completo"
-
-msgctxt "model:workflow.activity,name:purchase_activity_quotation"
-msgid "Quotation"
-msgstr "Cotización"
-
-msgctxt "model:workflow.activity,name:purchase_activity_shipment_exception"
-msgid "Shipment Exception"
-msgstr "Excepción de Envío"
-
-msgctxt ""
-"model:workflow.activity,name:purchase_activity_waiting_invoice_purchase"
-msgid "Waiting Invoice"
-msgstr "Esperando Factura"
-
-msgctxt ""
-"model:workflow.activity,name:purchase_activity_waiting_invoice_shipment"
-msgid "Waiting Invoice Shipment"
-msgstr "Esperando Envío de Factura"
-
-msgctxt "model:workflow.activity,name:purchase_activity_waiting_shipment"
-msgid "Waiting Shipment"
-msgstr "Esperando Envío"
-
-msgctxt "odt:purchase.purchase:0"
+msgctxt "odt:purchase.purchase:"
 msgid "Amount"
 msgstr "Cantidad"
 
-msgctxt "odt:purchase.purchase:0"
+msgctxt "odt:purchase.purchase:"
 msgid "Date:"
 msgstr "Fecha:"
 
-msgctxt "odt:purchase.purchase:0"
+msgctxt "odt:purchase.purchase:"
 msgid "Description"
 msgstr "Descripción"
 
-msgctxt "odt:purchase.purchase:0"
+msgctxt "odt:purchase.purchase:"
 msgid "Description:"
 msgstr "Descripción:"
 
-msgctxt "odt:purchase.purchase:0"
+msgctxt "odt:purchase.purchase:"
 msgid "Draft Purchase Order"
 msgstr "Borrador de Orden de Compra"
 
-msgctxt "odt:purchase.purchase:0"
+msgctxt "odt:purchase.purchase:"
 msgid "E-Mail:"
 msgstr "Correo electrónico:"
 
-msgctxt "odt:purchase.purchase:0"
+msgctxt "odt:purchase.purchase:"
 msgid "Phone:"
 msgstr "Teléfono:"
 
-msgctxt "odt:purchase.purchase:0"
+msgctxt "odt:purchase.purchase:"
 msgid "Purchase Order N°:"
 msgstr "Nº de Orden de Compra:"
 
-msgctxt "odt:purchase.purchase:0"
+msgctxt "odt:purchase.purchase:"
 msgid "Quantity"
 msgstr "Cantidad"
 
-msgctxt "odt:purchase.purchase:0"
+msgctxt "odt:purchase.purchase:"
 msgid "Request for Quotation N°:"
 msgstr "Solicitud de Factura Nº:"
 
-msgctxt "odt:purchase.purchase:0"
+msgctxt "odt:purchase.purchase:"
 msgid "Taxes"
 msgstr "Impuestos"
 
-msgctxt "odt:purchase.purchase:0"
+msgctxt "odt:purchase.purchase:"
 msgid "Taxes:"
 msgstr "Impuestos"
 
-msgctxt "odt:purchase.purchase:0"
+msgctxt "odt:purchase.purchase:"
 msgid "Total (excl. taxes):"
 msgstr "Total(excl. impuestos):"
 
-msgctxt "odt:purchase.purchase:0"
+msgctxt "odt:purchase.purchase:"
 msgid "Total:"
 msgstr "Total:"
 
-msgctxt "odt:purchase.purchase:0"
+msgctxt "odt:purchase.purchase:"
 msgid "Unit Price"
 msgstr "Precio Unitario"
 
-msgctxt "odt:purchase.purchase:0"
+msgctxt "odt:purchase.purchase:"
 msgid "VAT Number:"
 msgstr ""
 
-msgctxt "odt:purchase.purchase:0"
+msgctxt "odt:purchase.purchase:"
 msgid "VAT:"
 msgstr "NIT:"
 
-msgctxt "selection:account.invoice,purchase_exception_state:0"
+msgctxt "selection:account.invoice,purchase_exception_state:"
 msgid ""
 msgstr ""
 
-msgctxt "selection:account.invoice,purchase_exception_state:0"
+msgctxt "selection:account.invoice,purchase_exception_state:"
 msgid "Ignored"
 msgstr "Ignorado"
 
-msgctxt "selection:account.invoice,purchase_exception_state:0"
+msgctxt "selection:account.invoice,purchase_exception_state:"
 msgid "Recreated"
 msgstr "Rehecho"
 
 #, fuzzy
-msgctxt "selection:purchase.configuration,purchase_invoice_method:0"
+msgctxt "selection:purchase.configuration,purchase_invoice_method:"
 msgid "Based On Order"
 msgstr "Basado en Orden"
 
 #, fuzzy
-msgctxt "selection:purchase.configuration,purchase_invoice_method:0"
+msgctxt "selection:purchase.configuration,purchase_invoice_method:"
 msgid "Based On Shipment"
 msgstr "Basado en Envío"
 
 #, fuzzy
-msgctxt "selection:purchase.configuration,purchase_invoice_method:0"
+msgctxt "selection:purchase.configuration,purchase_invoice_method:"
 msgid "Manual"
 msgstr "Manual"
 
-msgctxt "selection:purchase.line,type:0"
+msgctxt "selection:purchase.line,type:"
 msgid "Comment"
 msgstr "Comentario"
 
-msgctxt "selection:purchase.line,type:0"
+msgctxt "selection:purchase.line,type:"
 msgid "Line"
 msgstr "Línea"
 
-msgctxt "selection:purchase.line,type:0"
+msgctxt "selection:purchase.line,type:"
 msgid "Subtotal"
 msgstr "Subtotal"
 
-msgctxt "selection:purchase.line,type:0"
+msgctxt "selection:purchase.line,type:"
 msgid "Title"
 msgstr "Título"
 
-msgctxt "selection:purchase.purchase,invoice_method:0"
+msgctxt "selection:purchase.purchase,invoice_method:"
 msgid "Based On Order"
 msgstr "Basado en Orden"
 
-msgctxt "selection:purchase.purchase,invoice_method:0"
+msgctxt "selection:purchase.purchase,invoice_method:"
 msgid "Based On Shipment"
 msgstr "Basado en Envío"
 
-msgctxt "selection:purchase.purchase,invoice_method:0"
+msgctxt "selection:purchase.purchase,invoice_method:"
 msgid "Manual"
 msgstr "Manual"
 
-msgctxt "selection:purchase.purchase,invoice_state:0"
+msgctxt "selection:purchase.purchase,invoice_state:"
 msgid "Exception"
 msgstr "Excepción"
 
-msgctxt "selection:purchase.purchase,invoice_state:0"
+msgctxt "selection:purchase.purchase,invoice_state:"
 msgid "None"
 msgstr "Ninguno"
 
-msgctxt "selection:purchase.purchase,invoice_state:0"
+msgctxt "selection:purchase.purchase,invoice_state:"
 msgid "Paid"
 msgstr "Pagado"
 
-msgctxt "selection:purchase.purchase,invoice_state:0"
+msgctxt "selection:purchase.purchase,invoice_state:"
 msgid "Waiting"
 msgstr "En Espera"
 
-msgctxt "selection:purchase.purchase,shipment_state:0"
+msgctxt "selection:purchase.purchase,shipment_state:"
 msgid "Exception"
 msgstr "Excepción"
 
-msgctxt "selection:purchase.purchase,shipment_state:0"
+msgctxt "selection:purchase.purchase,shipment_state:"
 msgid "None"
 msgstr "Ninguno"
 
-msgctxt "selection:purchase.purchase,shipment_state:0"
+msgctxt "selection:purchase.purchase,shipment_state:"
 msgid "Received"
 msgstr "Recibido"
 
-msgctxt "selection:purchase.purchase,shipment_state:0"
+msgctxt "selection:purchase.purchase,shipment_state:"
 msgid "Waiting"
 msgstr "En Espera"
 
-msgctxt "selection:purchase.purchase,state:0"
+msgctxt "selection:purchase.purchase,state:"
 msgid "Canceled"
 msgstr "Cancelado"
 
-msgctxt "selection:purchase.purchase,state:0"
+msgctxt "selection:purchase.purchase,state:"
 msgid "Confirmed"
 msgstr "Confirmado"
 
-msgctxt "selection:purchase.purchase,state:0"
+msgctxt "selection:purchase.purchase,state:"
 msgid "Done"
 msgstr "Hecho"
 
-msgctxt "selection:purchase.purchase,state:0"
+msgctxt "selection:purchase.purchase,state:"
 msgid "Draft"
 msgstr "Borrador"
 
-msgctxt "selection:purchase.purchase,state:0"
+msgctxt "selection:purchase.purchase,state:"
 msgid "Quotation"
 msgstr "Cotización"
 
-msgctxt "selection:stock.move,purchase_exception_state:0"
+msgctxt "selection:stock.move,purchase_exception_state:"
 msgid ""
 msgstr ""
 
-msgctxt "selection:stock.move,purchase_exception_state:0"
+msgctxt "selection:stock.move,purchase_exception_state:"
 msgid "Ignored"
 msgstr "Ignorado"
 
-msgctxt "selection:stock.move,purchase_exception_state:0"
+msgctxt "selection:stock.move,purchase_exception_state:"
 msgid "Recreated"
 msgstr "Rehecho"
 
-msgctxt "view:product.product:0"
+msgctxt "view:product.product:"
 msgid "Products"
 msgstr "Productos"
 
-msgctxt "view:product.product:0"
+msgctxt "view:product.product:"
 msgid "Suppliers"
 msgstr "Proveedores"
 
-msgctxt "view:product.template:0"
+msgctxt "view:product.template:"
 msgid "Product Suppliers"
 msgstr "Proveedores de Productos"
 
-msgctxt "view:product.template:0"
+msgctxt "view:product.template:"
 msgid "Suppliers"
 msgstr "Proveedores"
 
-msgctxt "view:purchase.configuration:0"
+msgctxt "view:purchase.configuration:"
 msgid "Purchase Configuration"
 msgstr ""
 
-msgctxt "view:purchase.handle.invoice.exception.ask:0"
+msgctxt "view:purchase.handle.invoice.exception.ask:"
 msgid "Choose invoices to recreate"
 msgstr "Escoja una factura a rehacer"
 
-msgctxt "view:purchase.handle.invoice.exception.ask:0"
+msgctxt "view:purchase.handle.invoice.exception.ask:"
 msgid "Handle Invoice Exception"
 msgstr "Manejar excepción de factura"
 
 #, fuzzy
-msgctxt "view:purchase.handle.shipment.exception.ask:0"
+msgctxt "view:purchase.handle.shipment.exception.ask:"
 msgid "Choose move to recreate"
 msgstr "Escoja un movimiento a rehacer"
 
-msgctxt "view:purchase.handle.shipment.exception.ask:0"
+msgctxt "view:purchase.handle.shipment.exception.ask:"
 msgid "Choose moves to recreate"
 msgstr "Elegir movimientos a recrear"
 
-msgctxt "view:purchase.handle.shipment.exception.ask:0"
+msgctxt "view:purchase.handle.shipment.exception.ask:"
 msgid "Handle shipment Exception"
 msgstr "Maneje Excepciones de envío"
 
-msgctxt "view:purchase.handle.shipment.exception.ask:0"
+msgctxt "view:purchase.handle.shipment.exception.ask:"
 msgid "Recreated Moves"
 msgstr "Movimientos recreados"
 
-msgctxt "view:purchase.line:0"
+msgctxt "view:purchase.line:"
 msgid "General"
 msgstr "General"
 
-msgctxt "view:purchase.line:0"
+#, fuzzy
+msgctxt "view:purchase.line:"
+msgid "Lines"
+msgstr "Líneas de Inventario"
+
+msgctxt "view:purchase.line:"
 msgid "Notes"
 msgstr "Notas"
 
-msgctxt "view:purchase.line:0"
+msgctxt "view:purchase.line:"
 msgid "Products"
 msgstr "Productos"
 
-msgctxt "view:purchase.line:0"
+msgctxt "view:purchase.line:"
 msgid "Purchase Line"
 msgstr "Línea de Compra"
 
-msgctxt "view:purchase.line:0"
+msgctxt "view:purchase.line:"
 msgid "Purchase Lines"
 msgstr "Líneas de Compra"
 
-msgctxt "view:purchase.product_supplier.price:0"
+msgctxt "view:purchase.product_supplier.price:"
 msgid "Product Supplier Price"
 msgstr "Precio del Proveedor del Producto"
 
-msgctxt "view:purchase.product_supplier.price:0"
+msgctxt "view:purchase.product_supplier.price:"
 msgid "Product Supplier Prices"
 msgstr "Precios del Proveedor del Producto"
 
-msgctxt "view:purchase.product_supplier:0"
+msgctxt "view:purchase.product_supplier:"
 msgid "Product Supplier"
 msgstr "Proveedor del Producto"
 
-msgctxt "view:purchase.product_supplier:0"
+msgctxt "view:purchase.product_supplier:"
 msgid "Product Suppliers"
 msgstr "Proveedores de Productos"
 
-msgctxt "view:purchase.purchase:0"
+msgctxt "view:purchase.purchase:"
 msgid "Cancel"
 msgstr "Cancelar"
 
-msgctxt "view:purchase.purchase:0"
+msgctxt "view:purchase.purchase:"
 msgid "Confirm"
 msgstr "Confirmar"
 
-msgctxt "view:purchase.purchase:0"
+msgctxt "view:purchase.purchase:"
 msgid "Draft"
 msgstr "Borrador"
 
-msgctxt "view:purchase.purchase:0"
+msgctxt "view:purchase.purchase:"
 msgid "Handle Invoice Exception"
 msgstr "Manejar excepción de factura"
 
-msgctxt "view:purchase.purchase:0"
+msgctxt "view:purchase.purchase:"
 msgid "Handle Shipment Exception"
 msgstr "Tratar Excepción de Envío"
 
-msgctxt "view:purchase.purchase:0"
+msgctxt "view:purchase.purchase:"
 msgid "Invoices"
 msgstr "Facturas"
 
-msgctxt "view:purchase.purchase:0"
+msgctxt "view:purchase.purchase:"
 msgid "Lines"
 msgstr "Líneas"
 
-msgctxt "view:purchase.purchase:0"
+msgctxt "view:purchase.purchase:"
 msgid "Moves"
 msgstr "Movimientos"
 
-msgctxt "view:purchase.purchase:0"
+msgctxt "view:purchase.purchase:"
 msgid "Other Info"
 msgstr "Información Adicional"
 
-msgctxt "view:purchase.purchase:0"
+msgctxt "view:purchase.purchase:"
 msgid "Purchase"
 msgstr "Compra"
 
-msgctxt "view:purchase.purchase:0"
+msgctxt "view:purchase.purchase:"
 msgid "Purchases"
 msgstr "Compras"
 
-msgctxt "view:purchase.purchase:0"
+msgctxt "view:purchase.purchase:"
 msgid "Quotation"
 msgstr "Cotización"
 
-msgctxt "view:purchase.purchase:0"
+msgctxt "view:purchase.purchase:"
+msgid "Quote"
+msgstr ""
+
+msgctxt "view:purchase.purchase:"
 msgid "Shipments"
 msgstr "Envíos"
 
-msgctxt "wizard_button:purchase.handle.invoice.exception,init,end:0"
+#, fuzzy
+msgctxt "view:stock.move:"
+msgid "Moves"
+msgstr "Movimientos"
+
+#, fuzzy
+msgctxt "wizard_button:purchase.handle.invoice.exception,ask,end:"
 msgid "Cancel"
 msgstr "Cancelar"
 
-msgctxt "wizard_button:purchase.handle.invoice.exception,init,ok:0"
+#, fuzzy
+msgctxt "wizard_button:purchase.handle.invoice.exception,ask,handle:"
 msgid "Ok"
 msgstr "Aceptar"
 
-msgctxt "wizard_button:purchase.handle.shipment.exception,init,end:0"
+#, fuzzy
+msgctxt "wizard_button:purchase.handle.shipment.exception,ask,end:"
 msgid "Cancel"
 msgstr "Cancelar"
 
-msgctxt "wizard_button:purchase.handle.shipment.exception,init,ok:0"
+#, fuzzy
+msgctxt "wizard_button:purchase.handle.shipment.exception,ask,handle:"
 msgid "Ok"
 msgstr "Aceptar"
diff --git a/locale/es_ES.po b/locale/es_ES.po
index 68a7538..532f308 100644
--- a/locale/es_ES.po
+++ b/locale/es_ES.po
@@ -2,494 +2,763 @@
 msgid ""
 msgstr "Content-Type: text/plain; charset=utf-8\n"
 
-msgctxt "error:account.invoice:0"
+msgctxt "error:account.invoice:"
 msgid "You can not delete invoices that come from a purchase!"
-msgstr "No puede borrar facturas que vienen de una compra"
+msgstr "No puede eliminar facturas que vienen de una compra."
 
-msgctxt "error:account.invoice:0"
+msgctxt "error:account.invoice:"
 msgid "You cannot reset to draft an invoice generated by a purchase."
-msgstr "No puede cambiar a borrador una factura generada por una compra."
+msgstr "No puede restablecer a borrador una factura generada por una compra."
 
-msgctxt "error:product.template:0"
+msgctxt "error:product.template:"
 msgid ""
 "Purchase prices are based on the purchase uom, are you sure to change it?"
 msgstr ""
-"Los precios de compra están basados en la UdM de compra, ¿desea cambiarlo?"
+"Los precios de compra están basados en la UdM de compra. ¿Desea cambiarlo?"
 
-msgctxt "error:purchase.line:0"
+msgctxt "error:purchase.line:"
 msgid "It misses an \"Account Expense\" on product \"%s\"!"
-msgstr "Hace falta una «Cuenta de gasto» del producto «%s»"
+msgstr "Al producto \"%s\" le falta una \"Cuenta de gastos\"."
 
-msgctxt "error:purchase.line:0"
+msgctxt "error:purchase.line:"
 msgid "It misses an \"account expense\" default property!"
-msgstr "Hace falta la propiedad predeterminada de «cuenta de gastos»"
+msgstr "Falta una propiedad por defecto de \"Cuenta de gastos\"."
 
-msgctxt "error:purchase.line:0"
+msgctxt "error:purchase.line:"
 msgid "The supplier location is required!"
-msgstr "Se necesita la ubicación del proveedor"
+msgstr "La ubicación de proveedor es requerida."
 
-msgctxt "error:purchase.purchase:0"
+msgctxt "error:purchase.purchase:"
+msgid "A warehouse must be defined for the quotation."
+msgstr "Debe indicar un almacén en el presupuesto."
+
+msgctxt "error:purchase.purchase:"
 msgid "Invoice addresses must be defined for the quotation."
-msgstr "Debe definir las direcciones para la cotización."
+msgstr "Debe indicar la dirección de facturación en el presupuesto."
 
-msgctxt "error:purchase.purchase:0"
+msgctxt "error:purchase.purchase:"
 msgid "It misses an \"Account Payable\" on the party \"%s\"!"
-msgstr "Al tercero «%s» le hace falta una «Cuenta de pagos»"
+msgstr "Al tercero \"%s\" le falta una \"Cuenta a pagar\"."
+
+msgctxt "error:purchase.purchase:"
+msgid "Purchase \"%s\" must be cancelled before deletion!"
+msgstr "La compra \"%s\" debe ser cancelada antes de ser eliminada."
 
-msgctxt "error:stock.shipment.in:0"
+msgctxt "error:stock.shipment.in:"
 msgid "You cannot reset to draft a move generated by a purchase."
 msgstr ""
 "No puede restablecer a borrador un movimiento generado por una compra."
 
-msgctxt "field:account.invoice,purchase_exception_state:0"
+msgctxt "field:account.invoice,purchase_exception_state:"
 msgid "Exception State"
 msgstr "Estado excepción"
 
-#, fuzzy
-msgctxt "field:account.invoice,purchases:0"
+msgctxt "field:account.invoice,purchases:"
 msgid "Purchases"
 msgstr "Compras"
 
-#, fuzzy
-msgctxt "field:account.invoice.line,purchase_lines:0"
+msgctxt "field:account.invoice.line,purchase_lines:"
 msgid "Purchase Lines"
 msgstr "Líneas de compra"
 
-msgctxt "field:product.template,product_suppliers:0"
+msgctxt "field:product.template,product_suppliers:"
 msgid "Suppliers"
 msgstr "Proveedores"
 
-msgctxt "field:product.template,purchasable:0"
+msgctxt "field:product.template,purchasable:"
 msgid "Purchasable"
-msgstr "Comprable"
+msgstr "Puede ser comprado"
 
-msgctxt "field:product.template,purchase_uom:0"
+msgctxt "field:product.template,purchase_uom:"
 msgid "Purchase UOM"
 msgstr "UdM de compra"
 
-#, fuzzy
-msgctxt "field:purchase.configuration,purchase_invoice_method:0"
+msgctxt "field:purchase.configuration,create_date:"
+msgid "Create Date"
+msgstr "Fecha creación"
+
+msgctxt "field:purchase.configuration,create_uid:"
+msgid "Create User"
+msgstr "Usuario creación"
+
+msgctxt "field:purchase.configuration,id:"
+msgid "ID"
+msgstr "ID"
+
+msgctxt "field:purchase.configuration,purchase_invoice_method:"
 msgid "Invoice Method"
 msgstr "Método de facturación"
 
-msgctxt "field:purchase.configuration,purchase_sequence:0"
+msgctxt "field:purchase.configuration,purchase_sequence:"
 msgid "Purchase Reference Sequence"
-msgstr ""
+msgstr "Secuencia pedidos de compra"
 
-#, fuzzy
-msgctxt "field:purchase.configuration,rec_name:0"
+msgctxt "field:purchase.configuration,rec_name:"
 msgid "Name"
-msgstr "Nombre del campo"
+msgstr "Nombre"
+
+msgctxt "field:purchase.configuration,write_date:"
+msgid "Write Date"
+msgstr "Fecha modificación"
+
+msgctxt "field:purchase.configuration,write_uid:"
+msgid "Write User"
+msgstr "Usuario modificación"
 
-msgctxt "field:purchase.handle.invoice.exception.ask,domain_invoices:0"
+msgctxt "field:purchase.handle.invoice.exception.ask,domain_invoices:"
 msgid "Domain Invoices"
-msgstr "Facturas de dominio"
+msgstr "Dominio de facturas"
 
-msgctxt "field:purchase.handle.invoice.exception.ask,recreate_invoices:0"
+msgctxt "field:purchase.handle.invoice.exception.ask,id:"
+msgid "ID"
+msgstr "ID"
+
+msgctxt "field:purchase.handle.invoice.exception.ask,recreate_invoices:"
 msgid "Recreate Invoices"
-msgstr "Rehacer facturas"
+msgstr "Recrear facturas"
 
-msgctxt "field:purchase.handle.shipment.exception.ask,domain_moves:0"
+msgctxt "field:purchase.handle.shipment.exception.ask,domain_moves:"
 msgid "Domain Moves"
-msgstr "Movimientos de dominio"
+msgstr "Dominio de movimientos"
+
+msgctxt "field:purchase.handle.shipment.exception.ask,id:"
+msgid "ID"
+msgstr "ID"
 
-msgctxt "field:purchase.handle.shipment.exception.ask,recreate_moves:0"
+msgctxt "field:purchase.handle.shipment.exception.ask,recreate_moves:"
 msgid "Recreate Moves"
-msgstr "Rehacer movimientos"
+msgstr "Recrear movimientos"
 
-msgctxt "field:purchase.line,amount:0"
+msgctxt "field:purchase.line,amount:"
 msgid "Amount"
-msgstr "Cantidad"
+msgstr "Importe"
+
+msgctxt "field:purchase.line,create_date:"
+msgid "Create Date"
+msgstr "Fecha creación"
+
+msgctxt "field:purchase.line,create_uid:"
+msgid "Create User"
+msgstr "Usuario creación"
+
+msgctxt "field:purchase.line,delivery_date:"
+msgid "Delivery Date"
+msgstr "Fecha de entrega"
 
-msgctxt "field:purchase.line,description:0"
+msgctxt "field:purchase.line,description:"
 msgid "Description"
 msgstr "Descripción"
 
-msgctxt "field:purchase.line,invoice_lines:0"
+msgctxt "field:purchase.line,from_location:"
+msgid "From Location"
+msgstr "Desde ubicación"
+
+msgctxt "field:purchase.line,id:"
+msgid "ID"
+msgstr "ID"
+
+msgctxt "field:purchase.line,invoice_lines:"
 msgid "Invoice Lines"
 msgstr "Líneas de factura"
 
-msgctxt "field:purchase.line,move_done:0"
+msgctxt "field:purchase.line,move_done:"
 msgid "Moves Done"
-msgstr "Movimientos terminados"
+msgstr "Movimientos realizados"
 
-msgctxt "field:purchase.line,move_exception:0"
+msgctxt "field:purchase.line,move_exception:"
 msgid "Moves Exception"
 msgstr "Exepción de movimientos"
 
-msgctxt "field:purchase.line,moves:0"
+msgctxt "field:purchase.line,moves:"
 msgid "Moves"
 msgstr "Movimientos"
 
-msgctxt "field:purchase.line,moves_ignored:0"
+msgctxt "field:purchase.line,moves_ignored:"
 msgid "Ignored Moves"
 msgstr "Movimientos ignorados"
 
-msgctxt "field:purchase.line,moves_recreated:0"
+msgctxt "field:purchase.line,moves_recreated:"
 msgid "Recreated Moves"
-msgstr "Rehacer movimientos"
+msgstr "Movimientos recreados"
 
-msgctxt "field:purchase.line,note:0"
+msgctxt "field:purchase.line,note:"
 msgid "Note"
 msgstr "Nota"
 
-msgctxt "field:purchase.line,product:0"
+msgctxt "field:purchase.line,product:"
 msgid "Product"
 msgstr "Producto"
 
-msgctxt "field:purchase.line,purchase:0"
+msgctxt "field:purchase.line,product_uom_category:"
+msgid "Product Uom Category"
+msgstr "Categoría UdM del producto"
+
+msgctxt "field:purchase.line,purchase:"
 msgid "Purchase"
 msgstr "Compra"
 
-msgctxt "field:purchase.line,quantity:0"
+msgctxt "field:purchase.line,quantity:"
 msgid "Quantity"
 msgstr "Cantidad"
 
-msgctxt "field:purchase.line,rec_name:0"
+msgctxt "field:purchase.line,rec_name:"
 msgid "Name"
 msgstr "Nombre"
 
-msgctxt "field:purchase.line,sequence:0"
+msgctxt "field:purchase.line,sequence:"
 msgid "Sequence"
 msgstr "Secuencia"
 
-msgctxt "field:purchase.line,taxes:0"
+msgctxt "field:purchase.line,taxes:"
 msgid "Taxes"
 msgstr "Impuestos"
 
-msgctxt "field:purchase.line,type:0"
+msgctxt "field:purchase.line,to_location:"
+msgid "To Location"
+msgstr "A ubicación"
+
+msgctxt "field:purchase.line,type:"
 msgid "Type"
 msgstr "Tipo"
 
-msgctxt "field:purchase.line,unit:0"
+msgctxt "field:purchase.line,unit:"
 msgid "Unit"
 msgstr "Unidad"
 
-msgctxt "field:purchase.line,unit_digits:0"
+msgctxt "field:purchase.line,unit_digits:"
 msgid "Unit Digits"
-msgstr "Dígitos unitarios"
+msgstr "Dígitos unidad"
 
-msgctxt "field:purchase.line,unit_price:0"
+msgctxt "field:purchase.line,unit_price:"
 msgid "Unit Price"
-msgstr "Precio unitario"
+msgstr "Precio unidad"
+
+msgctxt "field:purchase.line,write_date:"
+msgid "Write Date"
+msgstr "Fecha modificación"
+
+msgctxt "field:purchase.line,write_uid:"
+msgid "Write User"
+msgstr "Usuario modificación"
+
+msgctxt "field:purchase.line-account.invoice.line,create_date:"
+msgid "Create Date"
+msgstr "Fecha creación"
+
+msgctxt "field:purchase.line-account.invoice.line,create_uid:"
+msgid "Create User"
+msgstr "Usuario creación"
+
+msgctxt "field:purchase.line-account.invoice.line,id:"
+msgid "ID"
+msgstr "ID"
 
-msgctxt "field:purchase.line-account.invoice.line,invoice_line:0"
+msgctxt "field:purchase.line-account.invoice.line,invoice_line:"
 msgid "Invoice Line"
 msgstr "Línea de factura"
 
-msgctxt "field:purchase.line-account.invoice.line,purchase_line:0"
+msgctxt "field:purchase.line-account.invoice.line,purchase_line:"
 msgid "Purchase Line"
 msgstr "Línea de compra"
 
-msgctxt "field:purchase.line-account.invoice.line,rec_name:0"
+msgctxt "field:purchase.line-account.invoice.line,rec_name:"
 msgid "Name"
 msgstr "Nombre"
 
-msgctxt "field:purchase.line-account.tax,line:0"
+msgctxt "field:purchase.line-account.invoice.line,write_date:"
+msgid "Write Date"
+msgstr "Fecha modificación"
+
+msgctxt "field:purchase.line-account.invoice.line,write_uid:"
+msgid "Write User"
+msgstr "Usuario modificación"
+
+msgctxt "field:purchase.line-account.tax,create_date:"
+msgid "Create Date"
+msgstr "Fecha creación"
+
+msgctxt "field:purchase.line-account.tax,create_uid:"
+msgid "Create User"
+msgstr "Usuario creación"
+
+msgctxt "field:purchase.line-account.tax,id:"
+msgid "ID"
+msgstr "ID"
+
+msgctxt "field:purchase.line-account.tax,line:"
 msgid "Purchase Line"
 msgstr "Línea de compra"
 
-msgctxt "field:purchase.line-account.tax,rec_name:0"
+msgctxt "field:purchase.line-account.tax,rec_name:"
 msgid "Name"
 msgstr "Nombre"
 
-msgctxt "field:purchase.line-account.tax,tax:0"
+msgctxt "field:purchase.line-account.tax,tax:"
 msgid "Tax"
 msgstr "Impuesto"
 
-msgctxt "field:purchase.line-ignored-stock.move,move:0"
+msgctxt "field:purchase.line-account.tax,write_date:"
+msgid "Write Date"
+msgstr "Fecha modificación"
+
+msgctxt "field:purchase.line-account.tax,write_uid:"
+msgid "Write User"
+msgstr "Usuario modificación"
+
+msgctxt "field:purchase.line-ignored-stock.move,create_date:"
+msgid "Create Date"
+msgstr "Fecha creación"
+
+msgctxt "field:purchase.line-ignored-stock.move,create_uid:"
+msgid "Create User"
+msgstr "Usuario creación"
+
+msgctxt "field:purchase.line-ignored-stock.move,id:"
+msgid "ID"
+msgstr "ID"
+
+msgctxt "field:purchase.line-ignored-stock.move,move:"
 msgid "Move"
 msgstr "Movimiento"
 
-msgctxt "field:purchase.line-ignored-stock.move,purchase_line:0"
+msgctxt "field:purchase.line-ignored-stock.move,purchase_line:"
 msgid "Purchase Line"
 msgstr "Línea de compra"
 
-msgctxt "field:purchase.line-ignored-stock.move,rec_name:0"
+msgctxt "field:purchase.line-ignored-stock.move,rec_name:"
 msgid "Name"
 msgstr "Nombre"
 
-msgctxt "field:purchase.line-recreated-stock.move,move:0"
+msgctxt "field:purchase.line-ignored-stock.move,write_date:"
+msgid "Write Date"
+msgstr "Fecha modificación"
+
+msgctxt "field:purchase.line-ignored-stock.move,write_uid:"
+msgid "Write User"
+msgstr "Usuario modificación"
+
+msgctxt "field:purchase.line-recreated-stock.move,create_date:"
+msgid "Create Date"
+msgstr "Fecha creación"
+
+msgctxt "field:purchase.line-recreated-stock.move,create_uid:"
+msgid "Create User"
+msgstr "Usuario creación"
+
+msgctxt "field:purchase.line-recreated-stock.move,id:"
+msgid "ID"
+msgstr "ID"
+
+msgctxt "field:purchase.line-recreated-stock.move,move:"
 msgid "Move"
 msgstr "Movimiento"
 
-msgctxt "field:purchase.line-recreated-stock.move,purchase_line:0"
+msgctxt "field:purchase.line-recreated-stock.move,purchase_line:"
 msgid "Purchase Line"
 msgstr "Línea de compra"
 
-msgctxt "field:purchase.line-recreated-stock.move,rec_name:0"
+msgctxt "field:purchase.line-recreated-stock.move,rec_name:"
 msgid "Name"
 msgstr "Nombre"
 
-msgctxt "field:purchase.product_supplier,code:0"
+msgctxt "field:purchase.line-recreated-stock.move,write_date:"
+msgid "Write Date"
+msgstr "Fecha modificación"
+
+msgctxt "field:purchase.line-recreated-stock.move,write_uid:"
+msgid "Write User"
+msgstr "Usuario modificación"
+
+msgctxt "field:purchase.product_supplier,code:"
 msgid "Code"
 msgstr "Código"
 
-msgctxt "field:purchase.product_supplier,company:0"
+msgctxt "field:purchase.product_supplier,company:"
 msgid "Company"
-msgstr "Compañía"
+msgstr "Empresa"
+
+msgctxt "field:purchase.product_supplier,create_date:"
+msgid "Create Date"
+msgstr "Fecha creación"
 
-msgctxt "field:purchase.product_supplier,delivery_time:0"
+msgctxt "field:purchase.product_supplier,create_uid:"
+msgid "Create User"
+msgstr "Usuario creación"
+
+msgctxt "field:purchase.product_supplier,currency:"
+msgid "Currency"
+msgstr "Divisa"
+
+msgctxt "field:purchase.product_supplier,delivery_time:"
 msgid "Delivery Time"
 msgstr "Tiempo de envío"
 
-msgctxt "field:purchase.product_supplier,name:0"
+msgctxt "field:purchase.product_supplier,id:"
+msgid "ID"
+msgstr "ID"
+
+msgctxt "field:purchase.product_supplier,name:"
 msgid "Name"
 msgstr "Nombre"
 
-msgctxt "field:purchase.product_supplier,party:0"
+msgctxt "field:purchase.product_supplier,party:"
 msgid "Supplier"
 msgstr "Proveedor"
 
-msgctxt "field:purchase.product_supplier,prices:0"
+msgctxt "field:purchase.product_supplier,prices:"
 msgid "Prices"
 msgstr "Precios"
 
-msgctxt "field:purchase.product_supplier,product:0"
+msgctxt "field:purchase.product_supplier,product:"
 msgid "Product"
 msgstr "Producto"
 
-msgctxt "field:purchase.product_supplier,rec_name:0"
+msgctxt "field:purchase.product_supplier,rec_name:"
 msgid "Name"
 msgstr "Nombre"
 
-msgctxt "field:purchase.product_supplier,sequence:0"
+msgctxt "field:purchase.product_supplier,sequence:"
 msgid "Sequence"
 msgstr "Secuencia"
 
-msgctxt "field:purchase.product_supplier.price,product_supplier:0"
+msgctxt "field:purchase.product_supplier,write_date:"
+msgid "Write Date"
+msgstr "Fecha modificación"
+
+msgctxt "field:purchase.product_supplier,write_uid:"
+msgid "Write User"
+msgstr "Usuario modificación"
+
+msgctxt "field:purchase.product_supplier.price,create_date:"
+msgid "Create Date"
+msgstr "Fecha creación"
+
+msgctxt "field:purchase.product_supplier.price,create_uid:"
+msgid "Create User"
+msgstr "Usuario creación"
+
+msgctxt "field:purchase.product_supplier.price,id:"
+msgid "ID"
+msgstr "ID"
+
+msgctxt "field:purchase.product_supplier.price,product_supplier:"
 msgid "Supplier"
 msgstr "Proveedor"
 
-msgctxt "field:purchase.product_supplier.price,quantity:0"
+msgctxt "field:purchase.product_supplier.price,quantity:"
 msgid "Quantity"
 msgstr "Cantidad"
 
-msgctxt "field:purchase.product_supplier.price,rec_name:0"
+msgctxt "field:purchase.product_supplier.price,rec_name:"
 msgid "Name"
 msgstr "Nombre"
 
-msgctxt "field:purchase.product_supplier.price,unit_price:0"
+msgctxt "field:purchase.product_supplier.price,unit_price:"
 msgid "Unit Price"
-msgstr "Precio unitario"
+msgstr "Precio unidad"
+
+msgctxt "field:purchase.product_supplier.price,write_date:"
+msgid "Write Date"
+msgstr "Fecha modificación"
+
+msgctxt "field:purchase.product_supplier.price,write_uid:"
+msgid "Write User"
+msgstr "Usuario modificación"
 
-msgctxt "field:purchase.purchase,comment:0"
+msgctxt "field:purchase.purchase,comment:"
 msgid "Comment"
 msgstr "Comentario"
 
-msgctxt "field:purchase.purchase,company:0"
+msgctxt "field:purchase.purchase,company:"
 msgid "Company"
 msgstr "Empresa"
 
-msgctxt "field:purchase.purchase,currency:0"
+msgctxt "field:purchase.purchase,create_date:"
+msgid "Create Date"
+msgstr "Fecha creación"
+
+msgctxt "field:purchase.purchase,create_uid:"
+msgid "Create User"
+msgstr "Usuario creación"
+
+msgctxt "field:purchase.purchase,currency:"
 msgid "Currency"
 msgstr "Divisa"
 
-msgctxt "field:purchase.purchase,currency_digits:0"
+msgctxt "field:purchase.purchase,currency_digits:"
 msgid "Currency Digits"
-msgstr "Dígitos de la divisa"
+msgstr "Decimales de la divisa"
 
-msgctxt "field:purchase.purchase,description:0"
+msgctxt "field:purchase.purchase,description:"
 msgid "Description"
 msgstr "Descripción"
 
-msgctxt "field:purchase.purchase,invoice_address:0"
+msgctxt "field:purchase.purchase,id:"
+msgid "ID"
+msgstr "ID"
+
+msgctxt "field:purchase.purchase,invoice_address:"
 msgid "Invoice Address"
 msgstr "Dirección de facturación"
 
-msgctxt "field:purchase.purchase,invoice_exception:0"
-msgid "Invoices Exception"
-msgstr "Excepción de facturaciones"
-
-msgctxt "field:purchase.purchase,invoice_method:0"
+msgctxt "field:purchase.purchase,invoice_method:"
 msgid "Invoice Method"
 msgstr "Método de facturación"
 
-msgctxt "field:purchase.purchase,invoice_paid:0"
-msgid "Invoices Paid"
-msgstr "Facturas pagadas"
-
-msgctxt "field:purchase.purchase,invoice_state:0"
+msgctxt "field:purchase.purchase,invoice_state:"
 msgid "Invoice State"
-msgstr "Estado de factura"
+msgstr "Estado factura"
 
-msgctxt "field:purchase.purchase,invoices:0"
+msgctxt "field:purchase.purchase,invoices:"
 msgid "Invoices"
 msgstr "Facturas"
 
-msgctxt "field:purchase.purchase,invoices_ignored:0"
+msgctxt "field:purchase.purchase,invoices_ignored:"
 msgid "Ignored Invoices"
 msgstr "Facturas ignoradas"
 
-msgctxt "field:purchase.purchase,invoices_recreated:0"
+msgctxt "field:purchase.purchase,invoices_recreated:"
 msgid "Recreated Invoices"
 msgstr "Facturas recreadas"
 
-msgctxt "field:purchase.purchase,lines:0"
+msgctxt "field:purchase.purchase,lines:"
 msgid "Lines"
 msgstr "Líneas"
 
-msgctxt "field:purchase.purchase,moves:0"
+msgctxt "field:purchase.purchase,moves:"
 msgid "Moves"
 msgstr "Movimientos"
 
-msgctxt "field:purchase.purchase,party:0"
+msgctxt "field:purchase.purchase,party:"
 msgid "Party"
-msgstr "Terceros"
+msgstr "Tercero"
 
-msgctxt "field:purchase.purchase,party_lang:0"
+msgctxt "field:purchase.purchase,party_lang:"
 msgid "Party Language"
 msgstr "Idioma del tercero"
 
-msgctxt "field:purchase.purchase,payment_term:0"
+msgctxt "field:purchase.purchase,payment_term:"
 msgid "Payment Term"
-msgstr "Término de pago"
+msgstr "Plazo de pago"
 
-msgctxt "field:purchase.purchase,purchase_date:0"
+msgctxt "field:purchase.purchase,purchase_date:"
 msgid "Purchase Date"
 msgstr "Fecha de compra"
 
-msgctxt "field:purchase.purchase,rec_name:0"
+msgctxt "field:purchase.purchase,rec_name:"
 msgid "Name"
 msgstr "Nombre"
 
-msgctxt "field:purchase.purchase,reference:0"
+msgctxt "field:purchase.purchase,reference:"
 msgid "Reference"
 msgstr "Referencia"
 
-msgctxt "field:purchase.purchase,shipment_done:0"
-msgid "Shipment Done"
-msgstr "Envío terminado"
-
-msgctxt "field:purchase.purchase,shipment_exception:0"
-msgid "Shipments Exception"
-msgstr "Excepción de envios"
-
-msgctxt "field:purchase.purchase,shipment_state:0"
+msgctxt "field:purchase.purchase,shipment_state:"
 msgid "Shipment State"
-msgstr "Estado de envío"
+msgstr "Estado envío"
 
-msgctxt "field:purchase.purchase,shipments:0"
+msgctxt "field:purchase.purchase,shipments:"
 msgid "Shipments"
-msgstr "Envíos"
+msgstr "Albaranes"
 
-msgctxt "field:purchase.purchase,state:0"
+msgctxt "field:purchase.purchase,state:"
 msgid "State"
 msgstr "Estado"
 
-msgctxt "field:purchase.purchase,supplier_reference:0"
+msgctxt "field:purchase.purchase,supplier_reference:"
 msgid "Supplier Reference"
 msgstr "Referencia de proveedor"
 
-msgctxt "field:purchase.purchase,tax_amount:0"
+msgctxt "field:purchase.purchase,tax_amount:"
 msgid "Tax"
 msgstr "Impuesto"
 
-msgctxt "field:purchase.purchase,total_amount:0"
+msgctxt "field:purchase.purchase,tax_amount_cache:"
+msgid "Tax Cache"
+msgstr "Impuestos precalculado"
+
+msgctxt "field:purchase.purchase,total_amount:"
 msgid "Total"
 msgstr "Total"
 
-msgctxt "field:purchase.purchase,untaxed_amount:0"
+msgctxt "field:purchase.purchase,total_amount_cache:"
+msgid "Total Cache"
+msgstr "Total precalculado"
+
+msgctxt "field:purchase.purchase,untaxed_amount:"
 msgid "Untaxed"
-msgstr "Sin impuesto"
+msgstr "Base imponible"
+
+msgctxt "field:purchase.purchase,untaxed_amount_cache:"
+msgid "Untaxed Cache"
+msgstr "Base imponible precalculado"
 
-msgctxt "field:purchase.purchase,warehouse:0"
+msgctxt "field:purchase.purchase,warehouse:"
 msgid "Warehouse"
 msgstr "Almacén"
 
-msgctxt "field:purchase.purchase-account.invoice,invoice:0"
+msgctxt "field:purchase.purchase,write_date:"
+msgid "Write Date"
+msgstr "Fecha modificación"
+
+msgctxt "field:purchase.purchase,write_uid:"
+msgid "Write User"
+msgstr "Usuario modificación"
+
+msgctxt "field:purchase.purchase-account.invoice,create_date:"
+msgid "Create Date"
+msgstr "Fecha creación"
+
+msgctxt "field:purchase.purchase-account.invoice,create_uid:"
+msgid "Create User"
+msgstr "Usuario creación"
+
+msgctxt "field:purchase.purchase-account.invoice,id:"
+msgid "ID"
+msgstr "ID"
+
+msgctxt "field:purchase.purchase-account.invoice,invoice:"
 msgid "Invoice"
 msgstr "Factura"
 
-msgctxt "field:purchase.purchase-account.invoice,purchase:0"
+msgctxt "field:purchase.purchase-account.invoice,purchase:"
 msgid "Purchase"
 msgstr "Compra"
 
-msgctxt "field:purchase.purchase-account.invoice,rec_name:0"
+msgctxt "field:purchase.purchase-account.invoice,rec_name:"
 msgid "Name"
 msgstr "Nombre"
 
-msgctxt "field:purchase.purchase-ignored-account.invoice,invoice:0"
+msgctxt "field:purchase.purchase-account.invoice,write_date:"
+msgid "Write Date"
+msgstr "Fecha modificación"
+
+msgctxt "field:purchase.purchase-account.invoice,write_uid:"
+msgid "Write User"
+msgstr "Usuario modificación"
+
+msgctxt "field:purchase.purchase-ignored-account.invoice,create_date:"
+msgid "Create Date"
+msgstr "Fecha creación"
+
+msgctxt "field:purchase.purchase-ignored-account.invoice,create_uid:"
+msgid "Create User"
+msgstr "Usuario creación"
+
+msgctxt "field:purchase.purchase-ignored-account.invoice,id:"
+msgid "ID"
+msgstr "ID"
+
+msgctxt "field:purchase.purchase-ignored-account.invoice,invoice:"
 msgid "Invoice"
 msgstr "Factura"
 
-msgctxt "field:purchase.purchase-ignored-account.invoice,purchase:0"
+msgctxt "field:purchase.purchase-ignored-account.invoice,purchase:"
 msgid "Purchase"
 msgstr "Compra"
 
-msgctxt "field:purchase.purchase-ignored-account.invoice,rec_name:0"
+msgctxt "field:purchase.purchase-ignored-account.invoice,rec_name:"
 msgid "Name"
 msgstr "Nombre"
 
-msgctxt "field:purchase.purchase-recreated-account.invoice,invoice:0"
+msgctxt "field:purchase.purchase-ignored-account.invoice,write_date:"
+msgid "Write Date"
+msgstr "Fecha modificación"
+
+msgctxt "field:purchase.purchase-ignored-account.invoice,write_uid:"
+msgid "Write User"
+msgstr "Usuario modificación"
+
+msgctxt "field:purchase.purchase-recreated-account.invoice,create_date:"
+msgid "Create Date"
+msgstr "Fecha creación"
+
+msgctxt "field:purchase.purchase-recreated-account.invoice,create_uid:"
+msgid "Create User"
+msgstr "Usuario creación"
+
+msgctxt "field:purchase.purchase-recreated-account.invoice,id:"
+msgid "ID"
+msgstr "ID"
+
+msgctxt "field:purchase.purchase-recreated-account.invoice,invoice:"
 msgid "Invoice"
 msgstr "Factura"
 
-msgctxt "field:purchase.purchase-recreated-account.invoice,purchase:0"
+msgctxt "field:purchase.purchase-recreated-account.invoice,purchase:"
 msgid "Purchase"
 msgstr "Compra"
 
-msgctxt "field:purchase.purchase-recreated-account.invoice,rec_name:0"
+msgctxt "field:purchase.purchase-recreated-account.invoice,rec_name:"
 msgid "Name"
 msgstr "Nombre"
 
-msgctxt "field:stock.move,purchase:0"
+msgctxt "field:purchase.purchase-recreated-account.invoice,write_date:"
+msgid "Write Date"
+msgstr "Fecha modificación"
+
+msgctxt "field:purchase.purchase-recreated-account.invoice,write_uid:"
+msgid "Write User"
+msgstr "Usuario modificación"
+
+msgctxt "field:stock.move,purchase:"
 msgid "Purchase"
 msgstr "Compra"
 
-msgctxt "field:stock.move,purchase_currency:0"
+msgctxt "field:stock.move,purchase_currency:"
 msgid "Purchase Currency"
 msgstr "Divisa de compra"
 
-msgctxt "field:stock.move,purchase_exception_state:0"
+msgctxt "field:stock.move,purchase_exception_state:"
 msgid "Exception State"
 msgstr "Estado excepción"
 
-#, fuzzy
-msgctxt "field:stock.move,purchase_line:0"
+msgctxt "field:stock.move,purchase_line:"
 msgid "Purchase Line"
 msgstr "Línea de compra"
 
-msgctxt "field:stock.move,purchase_quantity:0"
+msgctxt "field:stock.move,purchase_quantity:"
 msgid "Purchase Quantity"
 msgstr "Cantidad de compra"
 
-msgctxt "field:stock.move,purchase_unit:0"
+msgctxt "field:stock.move,purchase_unit:"
 msgid "Purchase Unit"
 msgstr "Unidad de compra"
 
-msgctxt "field:stock.move,purchase_unit_digits:0"
+msgctxt "field:stock.move,purchase_unit_digits:"
 msgid "Purchase Unit Digits"
 msgstr "Decimales de la unidad de compra"
 
-msgctxt "field:stock.move,purchase_unit_price:0"
+msgctxt "field:stock.move,purchase_unit_price:"
 msgid "Purchase Unit Price"
-msgstr "Precio de la unidad de compra"
+msgstr "Precio unidad de compra"
 
-msgctxt "field:stock.move,purchase_visible:0"
+msgctxt "field:stock.move,purchase_visible:"
 msgid "Purchase Visible"
 msgstr "Compra visible"
 
-msgctxt "field:stock.move,supplier:0"
+msgctxt "field:stock.move,supplier:"
 msgid "Supplier"
 msgstr "Proveedor"
 
-msgctxt "help:purchase.handle.invoice.exception.ask,recreate_invoices:0"
+msgctxt "help:purchase.handle.invoice.exception.ask,recreate_invoices:"
 msgid ""
 "The selected invoices will be recreated. The other ones will be ignored."
-msgstr "La factura seleccionada será recreada. Las otras serán ignoradas."
+msgstr ""
+"Las facturas seleccionadas serán recreadas. Las otras serán ignoradas."
 
-msgctxt "help:purchase.handle.shipment.exception.ask,recreate_moves:0"
+msgctxt "help:purchase.handle.shipment.exception.ask,recreate_moves:"
 msgid "The selected moves will be recreated. The other ones will be ignored."
-msgstr "Los movimientos seleccionados se reharán. Los demás se ignorarán."
+msgstr ""
+"Los movimientos seleccionados serán recreados. Los otros serán ignorados."
 
-msgctxt "help:purchase.product_supplier,delivery_time:0"
+msgctxt "help:purchase.product_supplier,delivery_time:"
 msgid "In number of days"
-msgstr "En número de días"
+msgstr "En número de días."
 
-msgctxt "help:purchase.product_supplier.price,quantity:0"
+msgctxt "help:purchase.product_supplier.price,quantity:"
 msgid "Minimal quantity"
-msgstr "Cantidad mínima"
+msgstr "Cantidad mínima."
 
 msgctxt "model:ir.action,name:act_invoice_form"
 msgid "Invoices"
@@ -497,11 +766,11 @@ msgstr "Facturas"
 
 msgctxt "model:ir.action,name:act_open_supplier"
 msgid "Parties associated to Purchases"
-msgstr "Terceros asociados con compras"
+msgstr "Terceros asociados a compras"
 
 msgctxt "model:ir.action,name:act_purchase_configuration_form"
 msgid "Purchase Configuration"
-msgstr ""
+msgstr "Configuración compras"
 
 msgctxt "model:ir.action,name:act_purchase_form"
 msgid "Purchases"
@@ -517,11 +786,11 @@ msgstr "Compras confirmadas"
 
 msgctxt "model:ir.action,name:act_purchase_form_draft"
 msgid "Draft Purchases"
-msgstr "Compras en borrador"
+msgstr "Compras borrador"
 
 msgctxt "model:ir.action,name:act_purchase_form_quotation"
 msgid "Purchases in Quotation"
-msgstr "Compras en cotización"
+msgstr "Compras presupuestadas"
 
 msgctxt "model:ir.action,name:act_shipment_form"
 msgid "Shipments"
@@ -537,7 +806,7 @@ msgstr "Gestionar excepción de factura"
 
 msgctxt "model:ir.action,name:wizard_shipment_handle_exception"
 msgid "Handle Shipment Exception"
-msgstr "Gestionar excepción de envio"
+msgstr "Gestionar excepción de envío"
 
 msgctxt "model:ir.sequence,name:sequence_purchase"
 msgid "Purchase"
@@ -551,14 +820,13 @@ msgctxt "model:ir.ui.menu,name:menu_configuration"
 msgid "Configuration"
 msgstr "Configuración"
 
-#, fuzzy
 msgctxt "model:ir.ui.menu,name:menu_purchase"
 msgid "Purchase"
-msgstr "Gestión de compras"
+msgstr "Compras"
 
 msgctxt "model:ir.ui.menu,name:menu_purchase_configuration"
 msgid "Purchase Configuration"
-msgstr ""
+msgstr "Compras"
 
 msgctxt "model:ir.ui.menu,name:menu_purchase_form"
 msgid "Purchases"
@@ -570,11 +838,11 @@ msgstr "Compras confirmadas"
 
 msgctxt "model:ir.ui.menu,name:menu_purchase_form_draft"
 msgid "Draft Purchases"
-msgstr "Compras en borrador"
+msgstr "Compras borrador"
 
 msgctxt "model:ir.ui.menu,name:menu_purchase_form_quotation"
 msgid "Purchases in Quotation"
-msgstr "Compras en cotización"
+msgstr "Compras presupuestadas"
 
 msgctxt "model:ir.ui.menu,name:menu_reporting"
 msgid "Reporting"
@@ -582,486 +850,414 @@ msgstr "Informes"
 
 msgctxt "model:ir.ui.menu,name:menu_supplier"
 msgid "Parties associated to Purchases"
-msgstr "Terceros asociados con compras"
+msgstr "Terceros asociados a compras"
 
-msgctxt "model:purchase.configuration,name:0"
+msgctxt "model:purchase.configuration,name:"
 msgid "Purchase Configuration"
-msgstr ""
+msgstr "Configuración compras"
 
-msgctxt "model:purchase.handle.invoice.exception.ask,name:0"
-msgid "Invoice Exception Ask"
-msgstr "Factura de excepcion - Petición"
+#, fuzzy
+msgctxt "model:purchase.handle.invoice.exception.ask,name:"
+msgid "Handle Invoice Exception"
+msgstr "Gestionar excepción de factura"
 
-msgctxt "model:purchase.handle.shipment.exception.ask,name:0"
-msgid "Shipment Exception Ask"
-msgstr "Envio de excepcion - Petición"
+#, fuzzy
+msgctxt "model:purchase.handle.shipment.exception.ask,name:"
+msgid "Handle Shipment Exception"
+msgstr "Gestionar excepción de envío"
 
-msgctxt "model:purchase.line,name:0"
+msgctxt "model:purchase.line,name:"
 msgid "Purchase Line"
 msgstr "Línea de compra"
 
-msgctxt "model:purchase.line-account.invoice.line,name:0"
+msgctxt "model:purchase.line-account.invoice.line,name:"
 msgid "Purchase Line - Invoice Line"
 msgstr "Línea de compra - Línea de factura"
 
-msgctxt "model:purchase.line-account.tax,name:0"
+msgctxt "model:purchase.line-account.tax,name:"
 msgid "Purchase Line - Tax"
 msgstr "Línea de compra - Impuesto"
 
-msgctxt "model:purchase.line-ignored-stock.move,name:0"
+msgctxt "model:purchase.line-ignored-stock.move,name:"
 msgid "Purchase Line - Ignored Move"
-msgstr "Línea de compra - Movimiento Ignorado"
+msgstr "Línea de compra - Movimiento ignorado"
 
-msgctxt "model:purchase.line-recreated-stock.move,name:0"
+msgctxt "model:purchase.line-recreated-stock.move,name:"
 msgid "Purchase Line - Ignored Move"
 msgstr "Línea de compra - Movimiento ignorado"
 
-msgctxt "model:purchase.product_supplier,name:0"
+msgctxt "model:purchase.product_supplier,name:"
 msgid "Product Supplier"
 msgstr "Proveedor de producto"
 
-msgctxt "model:purchase.product_supplier.price,name:0"
+msgctxt "model:purchase.product_supplier.price,name:"
 msgid "Product Supplier Price"
 msgstr "Precio del proveedor del producto"
 
-msgctxt "model:purchase.purchase,name:0"
+msgctxt "model:purchase.purchase,name:"
 msgid "Purchase"
 msgstr "Compra"
 
-msgctxt "model:purchase.purchase-account.invoice,name:0"
+msgctxt "model:purchase.purchase-account.invoice,name:"
 msgid "Purchase - Invoice"
 msgstr "Compra - Factura"
 
-msgctxt "model:purchase.purchase-ignored-account.invoice,name:0"
+msgctxt "model:purchase.purchase-ignored-account.invoice,name:"
 msgid "Purchase - Ignored Invoice"
 msgstr "Compra - Factura ignorada"
 
-msgctxt "model:purchase.purchase-recreated-account.invoice,name:0"
+msgctxt "model:purchase.purchase-recreated-account.invoice,name:"
 msgid "Purchase - Recreated Invoice"
 msgstr "Compra - Factura recreada"
 
 msgctxt "model:res.group,name:group_purchase"
 msgid "Purchase"
-msgstr "Compra"
+msgstr "Compras"
 
 msgctxt "model:res.group,name:group_purchase_admin"
 msgid "Purchase Administrator"
-msgstr "Administrador de compra"
-
-msgctxt "model:workflow,name:purchase_workflow"
-msgid "Purchase workflow"
-msgstr "Flujo de trabajo de compra"
+msgstr "Administración de compras"
 
-msgctxt "model:workflow.activity,name:purchase_activity_cancel"
-msgid "Canceled"
-msgstr "Cancelado"
-
-msgctxt "model:workflow.activity,name:purchase_activity_confirmed"
-msgid "Confirmed"
-msgstr "Confirmado"
-
-msgctxt "model:workflow.activity,name:purchase_activity_done"
-msgid "Done"
-msgstr "Terminada"
-
-msgctxt "model:workflow.activity,name:purchase_activity_draft"
-msgid "Draft"
-msgstr "Borrador"
-
-msgctxt "model:workflow.activity,name:purchase_activity_invoice_done"
-msgid "Invoice Done"
-msgstr "Factura terminada"
-
-msgctxt "model:workflow.activity,name:purchase_activity_invoice_method"
-msgid "Invoice Method"
-msgstr "Método de facturación"
-
-msgctxt "model:workflow.activity,name:purchase_activity_invoice_method_done"
-msgid "Invoice Method Done"
-msgstr "Método de factura terminado"
-
-msgctxt ""
-"model:workflow.activity,name:purchase_activity_invoice_purchase_exception"
-msgid "Invoice Exception"
-msgstr "Factura de excepción"
-
-msgctxt "model:workflow.activity,name:purchase_activity_invoice_shipment"
-msgid "Invoice Shipment"
-msgstr "Envío de factura"
-
-msgctxt "model:workflow.activity,name:purchase_activity_invoice_shipment_done"
-msgid "Invoice Shipment Done"
-msgstr "Envío de factura terminado"
-
-msgctxt ""
-"model:workflow.activity,name:purchase_activity_invoice_shipment_exception"
-msgid "Invoice Shipment Exception"
-msgstr "Excepción de envío de factura"
-
-msgctxt ""
-"model:workflow.activity,name:purchase_activity_invoice_shipment_method"
-msgid "Invoice Shipment Method"
-msgstr "Método de envio de factura"
-
-msgctxt ""
-"model:workflow.activity,name:purchase_activity_invoice_shipment_method_done"
-msgid "Invoice Shipment Method Done"
-msgstr "Método de envío de factura terminado"
-
-msgctxt "model:workflow.activity,name:purchase_activity_quotation"
-msgid "Quotation"
-msgstr "Cotización"
-
-msgctxt "model:workflow.activity,name:purchase_activity_shipment_exception"
-msgid "Shipment Exception"
-msgstr "Excepción de envio"
-
-msgctxt ""
-"model:workflow.activity,name:purchase_activity_waiting_invoice_purchase"
-msgid "Waiting Invoice"
-msgstr "Esperando factura"
-
-msgctxt ""
-"model:workflow.activity,name:purchase_activity_waiting_invoice_shipment"
-msgid "Waiting Invoice Shipment"
-msgstr "Esperando envío de factura"
-
-msgctxt "model:workflow.activity,name:purchase_activity_waiting_shipment"
-msgid "Waiting Shipment"
-msgstr "Esperando envio"
-
-msgctxt "odt:purchase.purchase:0"
+msgctxt "odt:purchase.purchase:"
 msgid "Amount"
-msgstr "Cantidad"
+msgstr "Importe"
 
-msgctxt "odt:purchase.purchase:0"
+msgctxt "odt:purchase.purchase:"
 msgid "Date:"
 msgstr "Fecha:"
 
-msgctxt "odt:purchase.purchase:0"
+msgctxt "odt:purchase.purchase:"
 msgid "Description"
 msgstr "Descripción"
 
-msgctxt "odt:purchase.purchase:0"
+msgctxt "odt:purchase.purchase:"
 msgid "Description:"
 msgstr "Descripción:"
 
-msgctxt "odt:purchase.purchase:0"
+msgctxt "odt:purchase.purchase:"
 msgid "Draft Purchase Order"
-msgstr "Orden de compra en borrador"
+msgstr "Pedido de compra borrador"
 
-msgctxt "odt:purchase.purchase:0"
+msgctxt "odt:purchase.purchase:"
 msgid "E-Mail:"
 msgstr "Correo electrónico:"
 
-msgctxt "odt:purchase.purchase:0"
+msgctxt "odt:purchase.purchase:"
 msgid "Phone:"
 msgstr "Teléfono:"
 
-msgctxt "odt:purchase.purchase:0"
+msgctxt "odt:purchase.purchase:"
 msgid "Purchase Order N°:"
-msgstr "Nº de orden de compra:"
+msgstr "Pedido de compra Nº:"
 
-msgctxt "odt:purchase.purchase:0"
+msgctxt "odt:purchase.purchase:"
 msgid "Quantity"
 msgstr "Cantidad"
 
-msgctxt "odt:purchase.purchase:0"
+msgctxt "odt:purchase.purchase:"
 msgid "Request for Quotation N°:"
 msgstr "Solicitud de presupuesto Nº:"
 
-msgctxt "odt:purchase.purchase:0"
+msgctxt "odt:purchase.purchase:"
 msgid "Taxes"
 msgstr "Impuestos"
 
-msgctxt "odt:purchase.purchase:0"
+msgctxt "odt:purchase.purchase:"
 msgid "Taxes:"
 msgstr "Impuestos:"
 
-msgctxt "odt:purchase.purchase:0"
+msgctxt "odt:purchase.purchase:"
 msgid "Total (excl. taxes):"
-msgstr "Total (sin impuestos):"
+msgstr "Base imponible:"
 
-msgctxt "odt:purchase.purchase:0"
+msgctxt "odt:purchase.purchase:"
 msgid "Total:"
 msgstr "Total:"
 
-msgctxt "odt:purchase.purchase:0"
+msgctxt "odt:purchase.purchase:"
 msgid "Unit Price"
-msgstr "Precio unitario"
+msgstr "Precio unidad"
 
-msgctxt "odt:purchase.purchase:0"
+msgctxt "odt:purchase.purchase:"
 msgid "VAT Number:"
-msgstr ""
+msgstr "CIF/NIF:"
 
-msgctxt "odt:purchase.purchase:0"
+msgctxt "odt:purchase.purchase:"
 msgid "VAT:"
 msgstr "IVA:"
 
-msgctxt "selection:account.invoice,purchase_exception_state:0"
+msgctxt "selection:account.invoice,purchase_exception_state:"
 msgid ""
 msgstr ""
 
-msgctxt "selection:account.invoice,purchase_exception_state:0"
+msgctxt "selection:account.invoice,purchase_exception_state:"
 msgid "Ignored"
 msgstr "Ignorado"
 
-msgctxt "selection:account.invoice,purchase_exception_state:0"
+msgctxt "selection:account.invoice,purchase_exception_state:"
 msgid "Recreated"
-msgstr "Rehecho"
+msgstr "Recreada"
 
-#, fuzzy
-msgctxt "selection:purchase.configuration,purchase_invoice_method:0"
+msgctxt "selection:purchase.configuration,purchase_invoice_method:"
 msgid "Based On Order"
-msgstr "Basado en orden"
+msgstr "Basado en el pedido"
 
-#, fuzzy
-msgctxt "selection:purchase.configuration,purchase_invoice_method:0"
+msgctxt "selection:purchase.configuration,purchase_invoice_method:"
 msgid "Based On Shipment"
-msgstr "Basado en envio"
+msgstr "Basado en el envío"
 
-#, fuzzy
-msgctxt "selection:purchase.configuration,purchase_invoice_method:0"
+msgctxt "selection:purchase.configuration,purchase_invoice_method:"
 msgid "Manual"
 msgstr "Manual"
 
-msgctxt "selection:purchase.line,type:0"
+msgctxt "selection:purchase.line,type:"
 msgid "Comment"
 msgstr "Comentario"
 
-msgctxt "selection:purchase.line,type:0"
+msgctxt "selection:purchase.line,type:"
 msgid "Line"
 msgstr "Línea"
 
-msgctxt "selection:purchase.line,type:0"
+msgctxt "selection:purchase.line,type:"
 msgid "Subtotal"
 msgstr "Subtotal"
 
-msgctxt "selection:purchase.line,type:0"
+msgctxt "selection:purchase.line,type:"
 msgid "Title"
 msgstr "Título"
 
-msgctxt "selection:purchase.purchase,invoice_method:0"
+msgctxt "selection:purchase.purchase,invoice_method:"
 msgid "Based On Order"
-msgstr "Basado en orden"
+msgstr "Basado en el pedido"
 
-msgctxt "selection:purchase.purchase,invoice_method:0"
+msgctxt "selection:purchase.purchase,invoice_method:"
 msgid "Based On Shipment"
-msgstr "Basado en envio"
+msgstr "Basado en el envío"
 
-msgctxt "selection:purchase.purchase,invoice_method:0"
+msgctxt "selection:purchase.purchase,invoice_method:"
 msgid "Manual"
 msgstr "Manual"
 
-msgctxt "selection:purchase.purchase,invoice_state:0"
+msgctxt "selection:purchase.purchase,invoice_state:"
 msgid "Exception"
 msgstr "Excepción"
 
-msgctxt "selection:purchase.purchase,invoice_state:0"
+msgctxt "selection:purchase.purchase,invoice_state:"
 msgid "None"
 msgstr "Ninguno"
 
-msgctxt "selection:purchase.purchase,invoice_state:0"
+msgctxt "selection:purchase.purchase,invoice_state:"
 msgid "Paid"
-msgstr "Pagado"
+msgstr "Pagada"
 
-msgctxt "selection:purchase.purchase,invoice_state:0"
+msgctxt "selection:purchase.purchase,invoice_state:"
 msgid "Waiting"
 msgstr "En espera"
 
-msgctxt "selection:purchase.purchase,shipment_state:0"
+msgctxt "selection:purchase.purchase,shipment_state:"
 msgid "Exception"
 msgstr "Excepción"
 
-msgctxt "selection:purchase.purchase,shipment_state:0"
+msgctxt "selection:purchase.purchase,shipment_state:"
 msgid "None"
 msgstr "Ninguno"
 
-msgctxt "selection:purchase.purchase,shipment_state:0"
+msgctxt "selection:purchase.purchase,shipment_state:"
 msgid "Received"
-msgstr "Recibido"
+msgstr "Recibida"
 
-msgctxt "selection:purchase.purchase,shipment_state:0"
+msgctxt "selection:purchase.purchase,shipment_state:"
 msgid "Waiting"
 msgstr "En espera"
 
-msgctxt "selection:purchase.purchase,state:0"
+msgctxt "selection:purchase.purchase,state:"
 msgid "Canceled"
-msgstr "Cancelado"
+msgstr "Cancelada"
 
-msgctxt "selection:purchase.purchase,state:0"
+msgctxt "selection:purchase.purchase,state:"
 msgid "Confirmed"
-msgstr "Confirmado"
+msgstr "Confirmada"
 
-msgctxt "selection:purchase.purchase,state:0"
+msgctxt "selection:purchase.purchase,state:"
 msgid "Done"
-msgstr "Terminada"
+msgstr "Realizada"
 
-msgctxt "selection:purchase.purchase,state:0"
+msgctxt "selection:purchase.purchase,state:"
 msgid "Draft"
 msgstr "Borrador"
 
-msgctxt "selection:purchase.purchase,state:0"
+msgctxt "selection:purchase.purchase,state:"
 msgid "Quotation"
 msgstr "Presupuesto"
 
-msgctxt "selection:stock.move,purchase_exception_state:0"
+msgctxt "selection:stock.move,purchase_exception_state:"
 msgid ""
 msgstr ""
 
-msgctxt "selection:stock.move,purchase_exception_state:0"
+msgctxt "selection:stock.move,purchase_exception_state:"
 msgid "Ignored"
 msgstr "Ignorado"
 
-msgctxt "selection:stock.move,purchase_exception_state:0"
+msgctxt "selection:stock.move,purchase_exception_state:"
 msgid "Recreated"
-msgstr "Rehecho"
+msgstr "Recreado"
 
-msgctxt "view:product.product:0"
+msgctxt "view:product.product:"
 msgid "Products"
 msgstr "Productos"
 
-msgctxt "view:product.product:0"
+msgctxt "view:product.product:"
 msgid "Suppliers"
 msgstr "Proveedores"
 
-msgctxt "view:product.template:0"
+msgctxt "view:product.template:"
 msgid "Product Suppliers"
 msgstr "Proveedores de productos"
 
-msgctxt "view:product.template:0"
+msgctxt "view:product.template:"
 msgid "Suppliers"
 msgstr "Proveedores"
 
-msgctxt "view:purchase.configuration:0"
+msgctxt "view:purchase.configuration:"
 msgid "Purchase Configuration"
-msgstr ""
+msgstr "Configuración compras"
 
-msgctxt "view:purchase.handle.invoice.exception.ask:0"
+msgctxt "view:purchase.handle.invoice.exception.ask:"
 msgid "Choose invoices to recreate"
-msgstr "Seleccione las facturas a recrear"
+msgstr "Seleccione facturas a recrear"
 
-msgctxt "view:purchase.handle.invoice.exception.ask:0"
+msgctxt "view:purchase.handle.invoice.exception.ask:"
 msgid "Handle Invoice Exception"
-msgstr "Manejar excepción de factura"
+msgstr "Gestionar excepción de factura"
 
-#, fuzzy
-msgctxt "view:purchase.handle.shipment.exception.ask:0"
+msgctxt "view:purchase.handle.shipment.exception.ask:"
 msgid "Choose move to recreate"
-msgstr "Escoja un movimiento a rehacer"
+msgstr "Seleccione movimientos a recrear"
 
-msgctxt "view:purchase.handle.shipment.exception.ask:0"
+msgctxt "view:purchase.handle.shipment.exception.ask:"
 msgid "Choose moves to recreate"
-msgstr "Elegir movimientos a recrear"
+msgstr "Seleccione movimientos a recrear"
 
-msgctxt "view:purchase.handle.shipment.exception.ask:0"
+msgctxt "view:purchase.handle.shipment.exception.ask:"
 msgid "Handle shipment Exception"
-msgstr "Gestionar excepciones de envio"
+msgstr "Gestionar excepción de envío"
 
-msgctxt "view:purchase.handle.shipment.exception.ask:0"
+msgctxt "view:purchase.handle.shipment.exception.ask:"
 msgid "Recreated Moves"
 msgstr "Movimientos recreados"
 
-msgctxt "view:purchase.line:0"
+msgctxt "view:purchase.line:"
 msgid "General"
 msgstr "General"
 
-msgctxt "view:purchase.line:0"
+msgctxt "view:purchase.line:"
+msgid "Lines"
+msgstr "Líneas"
+
+msgctxt "view:purchase.line:"
 msgid "Notes"
 msgstr "Notas"
 
-msgctxt "view:purchase.line:0"
+msgctxt "view:purchase.line:"
 msgid "Products"
 msgstr "Productos"
 
-msgctxt "view:purchase.line:0"
+msgctxt "view:purchase.line:"
 msgid "Purchase Line"
 msgstr "Línea de compra"
 
-msgctxt "view:purchase.line:0"
+msgctxt "view:purchase.line:"
 msgid "Purchase Lines"
 msgstr "Líneas de compra"
 
-msgctxt "view:purchase.product_supplier.price:0"
+msgctxt "view:purchase.product_supplier.price:"
 msgid "Product Supplier Price"
 msgstr "Precio del proveedor del producto"
 
-msgctxt "view:purchase.product_supplier.price:0"
+msgctxt "view:purchase.product_supplier.price:"
 msgid "Product Supplier Prices"
 msgstr "Precios del proveedor del producto"
 
-msgctxt "view:purchase.product_supplier:0"
+msgctxt "view:purchase.product_supplier:"
 msgid "Product Supplier"
 msgstr "Proveedor del producto"
 
-msgctxt "view:purchase.product_supplier:0"
+msgctxt "view:purchase.product_supplier:"
 msgid "Product Suppliers"
-msgstr "Proveedores de productos"
+msgstr "Proveedores de producto"
 
-msgctxt "view:purchase.purchase:0"
+msgctxt "view:purchase.purchase:"
 msgid "Cancel"
 msgstr "Cancelar"
 
-msgctxt "view:purchase.purchase:0"
+msgctxt "view:purchase.purchase:"
 msgid "Confirm"
 msgstr "Confirmar"
 
-msgctxt "view:purchase.purchase:0"
+msgctxt "view:purchase.purchase:"
 msgid "Draft"
 msgstr "Borrador"
 
-msgctxt "view:purchase.purchase:0"
+msgctxt "view:purchase.purchase:"
 msgid "Handle Invoice Exception"
 msgstr "Gestionar excepción de factura"
 
-msgctxt "view:purchase.purchase:0"
+msgctxt "view:purchase.purchase:"
 msgid "Handle Shipment Exception"
-msgstr "Gestionar excepción de envios"
+msgstr "Gestionar excepción de envío"
 
-msgctxt "view:purchase.purchase:0"
+msgctxt "view:purchase.purchase:"
 msgid "Invoices"
 msgstr "Facturas"
 
-msgctxt "view:purchase.purchase:0"
+msgctxt "view:purchase.purchase:"
 msgid "Lines"
 msgstr "Líneas"
 
-msgctxt "view:purchase.purchase:0"
+msgctxt "view:purchase.purchase:"
 msgid "Moves"
 msgstr "Movimientos"
 
-msgctxt "view:purchase.purchase:0"
+msgctxt "view:purchase.purchase:"
 msgid "Other Info"
 msgstr "Información adicional"
 
-msgctxt "view:purchase.purchase:0"
+msgctxt "view:purchase.purchase:"
 msgid "Purchase"
 msgstr "Compra"
 
-msgctxt "view:purchase.purchase:0"
+msgctxt "view:purchase.purchase:"
 msgid "Purchases"
 msgstr "Compras"
 
-msgctxt "view:purchase.purchase:0"
+msgctxt "view:purchase.purchase:"
 msgid "Quotation"
 msgstr "Presupuesto"
 
-msgctxt "view:purchase.purchase:0"
+msgctxt "view:purchase.purchase:"
+msgid "Quote"
+msgstr "Presupuesto"
+
+msgctxt "view:purchase.purchase:"
 msgid "Shipments"
-msgstr "Envíos"
+msgstr "Albaranes"
+
+msgctxt "view:stock.move:"
+msgid "Moves"
+msgstr "Movimientos"
 
-msgctxt "wizard_button:purchase.handle.invoice.exception,init,end:0"
+msgctxt "wizard_button:purchase.handle.invoice.exception,ask,end:"
 msgid "Cancel"
 msgstr "Cancelar"
 
-msgctxt "wizard_button:purchase.handle.invoice.exception,init,ok:0"
+msgctxt "wizard_button:purchase.handle.invoice.exception,ask,handle:"
 msgid "Ok"
 msgstr "Aceptar"
 
-msgctxt "wizard_button:purchase.handle.shipment.exception,init,end:0"
+msgctxt "wizard_button:purchase.handle.shipment.exception,ask,end:"
 msgid "Cancel"
 msgstr "Cancelar"
 
-msgctxt "wizard_button:purchase.handle.shipment.exception,init,ok:0"
+msgctxt "wizard_button:purchase.handle.shipment.exception,ask,handle:"
 msgid "Ok"
 msgstr "Aceptar"
diff --git a/locale/fr_FR.po b/locale/fr_FR.po
index 3b8dd25..df91b19 100644
--- a/locale/fr_FR.po
+++ b/locale/fr_FR.po
@@ -2,489 +2,800 @@
 msgid ""
 msgstr "Content-Type: text/plain; charset=utf-8\n"
 
-msgctxt "error:account.invoice:0"
+msgctxt "error:account.invoice:"
 msgid "You can not delete invoices that come from a purchase!"
 msgstr "Vous ne pouvez pas supprimer une facture qui provient d'un achat"
 
-msgctxt "error:account.invoice:0"
+msgctxt "error:account.invoice:"
+msgid "You can not delete invoices that come from a purchase!"
+msgstr "Vous ne pouvez pas supprimer une facture qui provient d'un achat"
+
+msgctxt "error:account.invoice:"
+msgid "You cannot reset to draft an invoice generated by a purchase."
+msgstr "Vous ne pouvez pas réinitialiser une facture générée par un achat."
+
+msgctxt "error:account.invoice:"
 msgid "You cannot reset to draft an invoice generated by a purchase."
 msgstr "Vous ne pouvez pas réinitialiser une facture générée par un achat."
 
-msgctxt "error:product.template:0"
+msgctxt "error:product.template:"
 msgid ""
 "Purchase prices are based on the purchase uom, are you sure to change it?"
 msgstr ""
-"Les prix d'achat sont basé sur l'UDM d'achat, êtes-vous sur de vouloir la "
+"Les prix d'achat sont basé sur l'UDM d'achat, êtes-vous sûr de vouloir la "
 "modifier ?"
 
-msgctxt "error:purchase.line:0"
+msgctxt "error:product.template:"
+msgid ""
+"Purchase prices are based on the purchase uom, are you sure to change it?"
+msgstr ""
+"Les prix d'achat sont basé sur l'UDM d'achat, êtes-vous sûr de vouloir la "
+"modifier ?"
+
+msgctxt "error:purchase.line:"
 msgid "It misses an \"Account Expense\" on product \"%s\"!"
 msgstr "Il manque un compte de charge sur le produit \"%s\" !"
 
-msgctxt "error:purchase.line:0"
+msgctxt "error:purchase.line:"
+msgid "It misses an \"Account Expense\" on product \"%s\"!"
+msgstr "Il manque un compte de charge sur le produit \"%s\" !"
+
+msgctxt "error:purchase.line:"
+msgid "It misses an \"account expense\" default property!"
+msgstr "il manque une propriété par défaut \"compte de charge\" !"
+
+msgctxt "error:purchase.line:"
 msgid "It misses an \"account expense\" default property!"
 msgstr "il manque une propriété par défaut \"compte de charge\" !"
 
-msgctxt "error:purchase.line:0"
+msgctxt "error:purchase.line:"
 msgid "The supplier location is required!"
 msgstr "L'emplacement fournisseur est requis !"
 
-msgctxt "error:purchase.purchase:0"
+msgctxt "error:purchase.line:"
+msgid "The supplier location is required!"
+msgstr "L'emplacement fournisseur est requis !"
+
+msgctxt "error:purchase.purchase:"
+msgid "A warehouse must be defined for the quotation."
+msgstr "Un entrepôt doit être défini pour le devis"
+
+msgctxt "error:purchase.purchase:"
 msgid "Invoice addresses must be defined for the quotation."
 msgstr "L'adresse de facturation doit être définie pour le devis."
 
-msgctxt "error:purchase.purchase:0"
+msgctxt "error:purchase.purchase:"
+msgid "Invoice addresses must be defined for the quotation."
+msgstr "L'adresse de facturation doit être définie pour le devis."
+
+msgctxt "error:purchase.purchase:"
+msgid "It misses an \"Account Payable\" on the party \"%s\"!"
+msgstr "Il manque un compte à payer sur le tiers \"%s\" !"
+
+msgctxt "error:purchase.purchase:"
 msgid "It misses an \"Account Payable\" on the party \"%s\"!"
 msgstr "Il manque un compte à payer sur le tiers \"%s\" !"
 
-msgctxt "error:stock.shipment.in:0"
+msgctxt "error:purchase.purchase:"
+msgid "Purchase \"%s\" must be cancelled before deletion!"
+msgstr "L'achat \"%s\" doit être annulé avant suppression"
+
+msgctxt "error:stock.shipment.in:"
 msgid "You cannot reset to draft a move generated by a purchase."
 msgstr "Vous ne pouvez pas réinitialiser un mouvement généré par un achat."
 
-msgctxt "field:account.invoice,purchase_exception_state:0"
+msgctxt "error:stock.shipment.in:"
+msgid "You cannot reset to draft a move generated by a purchase."
+msgstr "Vous ne pouvez pas réinitialiser un mouvement généré par un achat."
+
+msgctxt "field:account.invoice,purchase_exception_state:"
 msgid "Exception State"
 msgstr "État d'exception"
 
-msgctxt "field:account.invoice,purchases:0"
+msgctxt "field:account.invoice,purchases:"
 msgid "Purchases"
 msgstr "Achats"
 
-msgctxt "field:account.invoice.line,purchase_lines:0"
+msgctxt "field:account.invoice.line,purchase_lines:"
 msgid "Purchase Lines"
 msgstr "Lignes d'achat"
 
-msgctxt "field:product.template,product_suppliers:0"
+msgctxt "field:product.template,product_suppliers:"
 msgid "Suppliers"
 msgstr "Fournisseurs"
 
-msgctxt "field:product.template,purchasable:0"
+msgctxt "field:product.template,purchasable:"
 msgid "Purchasable"
 msgstr "Achetable"
 
-msgctxt "field:product.template,purchase_uom:0"
+msgctxt "field:product.template,purchase_uom:"
 msgid "Purchase UOM"
 msgstr "UDM à l'achat"
 
-msgctxt "field:purchase.configuration,purchase_invoice_method:0"
+msgctxt "field:purchase.configuration,create_date:"
+msgid "Create Date"
+msgstr "Date de création"
+
+msgctxt "field:purchase.configuration,create_uid:"
+msgid "Create User"
+msgstr "Créé par"
+
+msgctxt "field:purchase.configuration,id:"
+msgid "ID"
+msgstr "ID"
+
+msgctxt "field:purchase.configuration,purchase_invoice_method:"
 msgid "Invoice Method"
 msgstr "Méthode de facturation"
 
-msgctxt "field:purchase.configuration,purchase_sequence:0"
+msgctxt "field:purchase.configuration,purchase_sequence:"
 msgid "Purchase Reference Sequence"
 msgstr "Séquence de référence d'achat"
 
-msgctxt "field:purchase.configuration,rec_name:0"
+msgctxt "field:purchase.configuration,rec_name:"
 msgid "Name"
 msgstr "Nom"
 
-msgctxt "field:purchase.handle.invoice.exception.ask,domain_invoices:0"
+msgctxt "field:purchase.configuration,write_date:"
+msgid "Write Date"
+msgstr "Date de mise à jour"
+
+msgctxt "field:purchase.configuration,write_uid:"
+msgid "Write User"
+msgstr "Mis à jour par"
+
+msgctxt "field:purchase.handle.invoice.exception.ask,domain_invoices:"
 msgid "Domain Invoices"
 msgstr "Domaine des factures"
 
-msgctxt "field:purchase.handle.invoice.exception.ask,recreate_invoices:0"
+msgctxt "field:purchase.handle.invoice.exception.ask,id:"
+msgid "ID"
+msgstr "ID"
+
+msgctxt "field:purchase.handle.invoice.exception.ask,recreate_invoices:"
 msgid "Recreate Invoices"
 msgstr "Recréer les factures"
 
-msgctxt "field:purchase.handle.shipment.exception.ask,domain_moves:0"
+msgctxt "field:purchase.handle.shipment.exception.ask,domain_moves:"
 msgid "Domain Moves"
 msgstr "Domaine des mouvements"
 
-msgctxt "field:purchase.handle.shipment.exception.ask,recreate_moves:0"
+msgctxt "field:purchase.handle.shipment.exception.ask,id:"
+msgid "ID"
+msgstr "ID"
+
+msgctxt "field:purchase.handle.shipment.exception.ask,recreate_moves:"
 msgid "Recreate Moves"
 msgstr "Recréer les mouvements"
 
-msgctxt "field:purchase.line,amount:0"
+msgctxt "field:purchase.line,amount:"
 msgid "Amount"
 msgstr "Montant"
 
-msgctxt "field:purchase.line,description:0"
+msgctxt "field:purchase.line,create_date:"
+msgid "Create Date"
+msgstr "Date de création"
+
+msgctxt "field:purchase.line,create_uid:"
+msgid "Create User"
+msgstr "Créé par"
+
+msgctxt "field:purchase.line,delivery_date:"
+msgid "Delivery Date"
+msgstr "Date de livraison"
+
+msgctxt "field:purchase.line,description:"
 msgid "Description"
 msgstr "Description"
 
-msgctxt "field:purchase.line,invoice_lines:0"
+msgctxt "field:purchase.line,from_location:"
+msgid "From Location"
+msgstr "Emplacement d'origine"
+
+msgctxt "field:purchase.line,id:"
+msgid "ID"
+msgstr "ID"
+
+msgctxt "field:purchase.line,invoice_lines:"
 msgid "Invoice Lines"
 msgstr "Lignes de factures"
 
-msgctxt "field:purchase.line,move_done:0"
+msgctxt "field:purchase.line,move_done:"
 msgid "Moves Done"
 msgstr "Mouvements effectués"
 
-msgctxt "field:purchase.line,move_exception:0"
+msgctxt "field:purchase.line,move_exception:"
 msgid "Moves Exception"
 msgstr "Mouvements en exception"
 
-msgctxt "field:purchase.line,moves:0"
+msgctxt "field:purchase.line,moves:"
 msgid "Moves"
 msgstr "Mouvements"
 
-msgctxt "field:purchase.line,moves_ignored:0"
+msgctxt "field:purchase.line,moves_ignored:"
 msgid "Ignored Moves"
 msgstr "Mouvements ignorés"
 
-msgctxt "field:purchase.line,moves_recreated:0"
+msgctxt "field:purchase.line,moves_recreated:"
 msgid "Recreated Moves"
 msgstr "Mouvements recréés"
 
-msgctxt "field:purchase.line,note:0"
+msgctxt "field:purchase.line,note:"
 msgid "Note"
 msgstr "Note"
 
-msgctxt "field:purchase.line,product:0"
+msgctxt "field:purchase.line,product:"
 msgid "Product"
 msgstr "Produit"
 
-msgctxt "field:purchase.line,purchase:0"
+msgctxt "field:purchase.line,product_uom_category:"
+msgid "Product Uom Category"
+msgstr "Catégorie d'unité de mesure"
+
+msgctxt "field:purchase.line,purchase:"
 msgid "Purchase"
 msgstr "Achat"
 
-msgctxt "field:purchase.line,quantity:0"
+msgctxt "field:purchase.line,quantity:"
 msgid "Quantity"
 msgstr "Quantité"
 
-msgctxt "field:purchase.line,rec_name:0"
+msgctxt "field:purchase.line,rec_name:"
 msgid "Name"
 msgstr "Nom"
 
-msgctxt "field:purchase.line,sequence:0"
+msgctxt "field:purchase.line,sequence:"
 msgid "Sequence"
 msgstr "Séquence"
 
-msgctxt "field:purchase.line,taxes:0"
+msgctxt "field:purchase.line,taxes:"
 msgid "Taxes"
 msgstr "Taxes"
 
-msgctxt "field:purchase.line,type:0"
+msgctxt "field:purchase.line,to_location:"
+msgid "To Location"
+msgstr "Emplacement de destination"
+
+msgctxt "field:purchase.line,type:"
 msgid "Type"
 msgstr "Type"
 
-msgctxt "field:purchase.line,unit:0"
+msgctxt "field:purchase.line,unit:"
 msgid "Unit"
 msgstr "Unité"
 
-msgctxt "field:purchase.line,unit_digits:0"
+msgctxt "field:purchase.line,unit_digits:"
 msgid "Unit Digits"
 msgstr "Décimales de l'unité"
 
-msgctxt "field:purchase.line,unit_price:0"
+msgctxt "field:purchase.line,unit_price:"
 msgid "Unit Price"
 msgstr "Prix unitaire"
 
-msgctxt "field:purchase.line-account.invoice.line,invoice_line:0"
+msgctxt "field:purchase.line,write_date:"
+msgid "Write Date"
+msgstr "Date de mise à jour"
+
+msgctxt "field:purchase.line,write_uid:"
+msgid "Write User"
+msgstr "Mis à jour par"
+
+msgctxt "field:purchase.line-account.invoice.line,create_date:"
+msgid "Create Date"
+msgstr "Date de création"
+
+msgctxt "field:purchase.line-account.invoice.line,create_uid:"
+msgid "Create User"
+msgstr "Créé par"
+
+msgctxt "field:purchase.line-account.invoice.line,id:"
+msgid "ID"
+msgstr "ID"
+
+msgctxt "field:purchase.line-account.invoice.line,invoice_line:"
 msgid "Invoice Line"
 msgstr "Ligne de Facture"
 
-msgctxt "field:purchase.line-account.invoice.line,purchase_line:0"
+msgctxt "field:purchase.line-account.invoice.line,purchase_line:"
 msgid "Purchase Line"
 msgstr "Ligne d'achat"
 
-msgctxt "field:purchase.line-account.invoice.line,rec_name:0"
+msgctxt "field:purchase.line-account.invoice.line,rec_name:"
 msgid "Name"
 msgstr "Nom"
 
-msgctxt "field:purchase.line-account.tax,line:0"
+msgctxt "field:purchase.line-account.invoice.line,write_date:"
+msgid "Write Date"
+msgstr "Date de mise à jour"
+
+msgctxt "field:purchase.line-account.invoice.line,write_uid:"
+msgid "Write User"
+msgstr "Mis à jour par"
+
+msgctxt "field:purchase.line-account.tax,create_date:"
+msgid "Create Date"
+msgstr "Date de création"
+
+msgctxt "field:purchase.line-account.tax,create_uid:"
+msgid "Create User"
+msgstr "Créé par"
+
+msgctxt "field:purchase.line-account.tax,id:"
+msgid "ID"
+msgstr "ID"
+
+msgctxt "field:purchase.line-account.tax,line:"
 msgid "Purchase Line"
 msgstr "Ligne d'achat"
 
-msgctxt "field:purchase.line-account.tax,rec_name:0"
+msgctxt "field:purchase.line-account.tax,rec_name:"
 msgid "Name"
 msgstr "Nom"
 
-msgctxt "field:purchase.line-account.tax,tax:0"
+msgctxt "field:purchase.line-account.tax,tax:"
 msgid "Tax"
 msgstr "Taxe"
 
-msgctxt "field:purchase.line-ignored-stock.move,move:0"
+msgctxt "field:purchase.line-account.tax,write_date:"
+msgid "Write Date"
+msgstr "Date de mise à jour"
+
+msgctxt "field:purchase.line-account.tax,write_uid:"
+msgid "Write User"
+msgstr "Mis à jour par"
+
+msgctxt "field:purchase.line-ignored-stock.move,create_date:"
+msgid "Create Date"
+msgstr "Date de création"
+
+msgctxt "field:purchase.line-ignored-stock.move,create_uid:"
+msgid "Create User"
+msgstr "Créé par"
+
+msgctxt "field:purchase.line-ignored-stock.move,id:"
+msgid "ID"
+msgstr "ID"
+
+msgctxt "field:purchase.line-ignored-stock.move,move:"
 msgid "Move"
 msgstr "Mouvement"
 
-msgctxt "field:purchase.line-ignored-stock.move,purchase_line:0"
+msgctxt "field:purchase.line-ignored-stock.move,purchase_line:"
 msgid "Purchase Line"
 msgstr "Ligne d'achat"
 
-msgctxt "field:purchase.line-ignored-stock.move,rec_name:0"
+msgctxt "field:purchase.line-ignored-stock.move,rec_name:"
 msgid "Name"
 msgstr "Nom"
 
-msgctxt "field:purchase.line-recreated-stock.move,move:0"
+msgctxt "field:purchase.line-ignored-stock.move,write_date:"
+msgid "Write Date"
+msgstr "Date de mise à jour"
+
+msgctxt "field:purchase.line-ignored-stock.move,write_uid:"
+msgid "Write User"
+msgstr "Mis à jour par"
+
+msgctxt "field:purchase.line-recreated-stock.move,create_date:"
+msgid "Create Date"
+msgstr "Date de création"
+
+msgctxt "field:purchase.line-recreated-stock.move,create_uid:"
+msgid "Create User"
+msgstr "Créé par"
+
+msgctxt "field:purchase.line-recreated-stock.move,id:"
+msgid "ID"
+msgstr "ID"
+
+msgctxt "field:purchase.line-recreated-stock.move,move:"
 msgid "Move"
 msgstr "Mouvement"
 
-msgctxt "field:purchase.line-recreated-stock.move,purchase_line:0"
+msgctxt "field:purchase.line-recreated-stock.move,purchase_line:"
 msgid "Purchase Line"
 msgstr "Ligne d'achat"
 
-msgctxt "field:purchase.line-recreated-stock.move,rec_name:0"
+msgctxt "field:purchase.line-recreated-stock.move,rec_name:"
 msgid "Name"
 msgstr "Nom"
 
-msgctxt "field:purchase.product_supplier,code:0"
+msgctxt "field:purchase.line-recreated-stock.move,write_date:"
+msgid "Write Date"
+msgstr "Date de mise à jour"
+
+msgctxt "field:purchase.line-recreated-stock.move,write_uid:"
+msgid "Write User"
+msgstr "Mis à jour par"
+
+msgctxt "field:purchase.product_supplier,code:"
 msgid "Code"
 msgstr "Code"
 
-msgctxt "field:purchase.product_supplier,company:0"
+msgctxt "field:purchase.product_supplier,company:"
 msgid "Company"
 msgstr "Société"
 
-msgctxt "field:purchase.product_supplier,delivery_time:0"
+msgctxt "field:purchase.product_supplier,create_date:"
+msgid "Create Date"
+msgstr "Date de création"
+
+msgctxt "field:purchase.product_supplier,create_uid:"
+msgid "Create User"
+msgstr "Créé par"
+
+msgctxt "field:purchase.product_supplier,currency:"
+msgid "Currency"
+msgstr "Devise"
+
+msgctxt "field:purchase.product_supplier,delivery_time:"
 msgid "Delivery Time"
 msgstr "Délai de livraison"
 
-msgctxt "field:purchase.product_supplier,name:0"
+msgctxt "field:purchase.product_supplier,id:"
+msgid "ID"
+msgstr "ID"
+
+msgctxt "field:purchase.product_supplier,name:"
 msgid "Name"
 msgstr "Nom"
 
-msgctxt "field:purchase.product_supplier,party:0"
+msgctxt "field:purchase.product_supplier,party:"
 msgid "Supplier"
 msgstr "Fournisseur"
 
-msgctxt "field:purchase.product_supplier,prices:0"
+msgctxt "field:purchase.product_supplier,prices:"
 msgid "Prices"
 msgstr "Prix"
 
-msgctxt "field:purchase.product_supplier,product:0"
+msgctxt "field:purchase.product_supplier,product:"
 msgid "Product"
 msgstr "Produit"
 
-msgctxt "field:purchase.product_supplier,rec_name:0"
+msgctxt "field:purchase.product_supplier,rec_name:"
 msgid "Name"
 msgstr "Nom"
 
-msgctxt "field:purchase.product_supplier,sequence:0"
+msgctxt "field:purchase.product_supplier,sequence:"
 msgid "Sequence"
 msgstr "Séquence"
 
-msgctxt "field:purchase.product_supplier.price,product_supplier:0"
+msgctxt "field:purchase.product_supplier,write_date:"
+msgid "Write Date"
+msgstr "Date de mise à jour"
+
+msgctxt "field:purchase.product_supplier,write_uid:"
+msgid "Write User"
+msgstr "Mis à jour par"
+
+msgctxt "field:purchase.product_supplier.price,create_date:"
+msgid "Create Date"
+msgstr "Date de création"
+
+msgctxt "field:purchase.product_supplier.price,create_uid:"
+msgid "Create User"
+msgstr "Créé par"
+
+msgctxt "field:purchase.product_supplier.price,id:"
+msgid "ID"
+msgstr "ID"
+
+msgctxt "field:purchase.product_supplier.price,product_supplier:"
 msgid "Supplier"
 msgstr "Fournisseur"
 
-msgctxt "field:purchase.product_supplier.price,quantity:0"
+msgctxt "field:purchase.product_supplier.price,quantity:"
 msgid "Quantity"
 msgstr "Quantité"
 
-msgctxt "field:purchase.product_supplier.price,rec_name:0"
+msgctxt "field:purchase.product_supplier.price,rec_name:"
 msgid "Name"
 msgstr "Nom"
 
-msgctxt "field:purchase.product_supplier.price,unit_price:0"
+msgctxt "field:purchase.product_supplier.price,unit_price:"
 msgid "Unit Price"
 msgstr "Prix unitaire"
 
-msgctxt "field:purchase.purchase,comment:0"
+msgctxt "field:purchase.product_supplier.price,write_date:"
+msgid "Write Date"
+msgstr "Date de mise à jour"
+
+msgctxt "field:purchase.product_supplier.price,write_uid:"
+msgid "Write User"
+msgstr "Mis à jour par"
+
+msgctxt "field:purchase.purchase,comment:"
 msgid "Comment"
 msgstr "Commentaire"
 
-msgctxt "field:purchase.purchase,company:0"
+msgctxt "field:purchase.purchase,company:"
 msgid "Company"
 msgstr "Société"
 
-msgctxt "field:purchase.purchase,currency:0"
+msgctxt "field:purchase.purchase,create_date:"
+msgid "Create Date"
+msgstr "Date de création"
+
+msgctxt "field:purchase.purchase,create_uid:"
+msgid "Create User"
+msgstr "Créé par"
+
+msgctxt "field:purchase.purchase,currency:"
 msgid "Currency"
 msgstr "Devise"
 
-msgctxt "field:purchase.purchase,currency_digits:0"
+msgctxt "field:purchase.purchase,currency_digits:"
 msgid "Currency Digits"
 msgstr "Décimales de la devise"
 
-msgctxt "field:purchase.purchase,description:0"
+msgctxt "field:purchase.purchase,description:"
 msgid "Description"
 msgstr "Description"
 
-msgctxt "field:purchase.purchase,invoice_address:0"
+msgctxt "field:purchase.purchase,id:"
+msgid "ID"
+msgstr "ID"
+
+msgctxt "field:purchase.purchase,invoice_address:"
 msgid "Invoice Address"
 msgstr "Adresse de facturation"
 
-msgctxt "field:purchase.purchase,invoice_exception:0"
-msgid "Invoices Exception"
-msgstr "Factures en exception"
-
-msgctxt "field:purchase.purchase,invoice_method:0"
+msgctxt "field:purchase.purchase,invoice_method:"
 msgid "Invoice Method"
 msgstr "Méthode de facturation"
 
-msgctxt "field:purchase.purchase,invoice_paid:0"
-msgid "Invoices Paid"
-msgstr "Factures payées"
-
-msgctxt "field:purchase.purchase,invoice_state:0"
+msgctxt "field:purchase.purchase,invoice_state:"
 msgid "Invoice State"
 msgstr "État de la facture"
 
-msgctxt "field:purchase.purchase,invoices:0"
+msgctxt "field:purchase.purchase,invoices:"
 msgid "Invoices"
 msgstr "Factures"
 
-msgctxt "field:purchase.purchase,invoices_ignored:0"
+msgctxt "field:purchase.purchase,invoices_ignored:"
 msgid "Ignored Invoices"
 msgstr "Factures ignorées"
 
-msgctxt "field:purchase.purchase,invoices_recreated:0"
+msgctxt "field:purchase.purchase,invoices_recreated:"
 msgid "Recreated Invoices"
 msgstr "Factures recréées"
 
-msgctxt "field:purchase.purchase,lines:0"
+msgctxt "field:purchase.purchase,lines:"
 msgid "Lines"
 msgstr "Lignes"
 
-msgctxt "field:purchase.purchase,moves:0"
+msgctxt "field:purchase.purchase,moves:"
 msgid "Moves"
 msgstr "Mouvements"
 
-msgctxt "field:purchase.purchase,party:0"
+msgctxt "field:purchase.purchase,party:"
 msgid "Party"
 msgstr "Tiers"
 
-msgctxt "field:purchase.purchase,party_lang:0"
+msgctxt "field:purchase.purchase,party_lang:"
 msgid "Party Language"
 msgstr "Langue du tiers"
 
-msgctxt "field:purchase.purchase,payment_term:0"
+msgctxt "field:purchase.purchase,payment_term:"
 msgid "Payment Term"
 msgstr "Conditions de paiement"
 
-msgctxt "field:purchase.purchase,purchase_date:0"
+msgctxt "field:purchase.purchase,purchase_date:"
 msgid "Purchase Date"
 msgstr "Date d'achat"
 
-msgctxt "field:purchase.purchase,rec_name:0"
+msgctxt "field:purchase.purchase,rec_name:"
 msgid "Name"
 msgstr "Nom"
 
-msgctxt "field:purchase.purchase,reference:0"
+msgctxt "field:purchase.purchase,reference:"
 msgid "Reference"
 msgstr "Référence"
 
-msgctxt "field:purchase.purchase,shipment_done:0"
-msgid "Shipment Done"
-msgstr "Expédition effectuée"
-
-msgctxt "field:purchase.purchase,shipment_exception:0"
-msgid "Shipments Exception"
-msgstr "Expéditions en exception"
-
-msgctxt "field:purchase.purchase,shipment_state:0"
+msgctxt "field:purchase.purchase,shipment_state:"
 msgid "Shipment State"
 msgstr "État de l'expédition"
 
-msgctxt "field:purchase.purchase,shipments:0"
+msgctxt "field:purchase.purchase,shipments:"
 msgid "Shipments"
 msgstr "Expéditions"
 
-msgctxt "field:purchase.purchase,state:0"
+msgctxt "field:purchase.purchase,state:"
 msgid "State"
 msgstr "État"
 
-msgctxt "field:purchase.purchase,supplier_reference:0"
+msgctxt "field:purchase.purchase,supplier_reference:"
 msgid "Supplier Reference"
 msgstr "Référence fournisseur"
 
-msgctxt "field:purchase.purchase,tax_amount:0"
+msgctxt "field:purchase.purchase,tax_amount:"
 msgid "Tax"
 msgstr "Taxe"
 
-msgctxt "field:purchase.purchase,total_amount:0"
+msgctxt "field:purchase.purchase,tax_amount_cache:"
+msgid "Tax Cache"
+msgstr "Cache des taxes"
+
+msgctxt "field:purchase.purchase,total_amount:"
 msgid "Total"
 msgstr "Total"
 
-msgctxt "field:purchase.purchase,untaxed_amount:0"
+msgctxt "field:purchase.purchase,total_amount_cache:"
+msgid "Total Cache"
+msgstr "Cache du total"
+
+msgctxt "field:purchase.purchase,untaxed_amount:"
 msgid "Untaxed"
 msgstr "Non-taxé"
 
-msgctxt "field:purchase.purchase,warehouse:0"
+msgctxt "field:purchase.purchase,untaxed_amount_cache:"
+msgid "Untaxed Cache"
+msgstr "Cache hors taxe"
+
+msgctxt "field:purchase.purchase,warehouse:"
 msgid "Warehouse"
 msgstr "Entrepôt"
 
-msgctxt "field:purchase.purchase-account.invoice,invoice:0"
+msgctxt "field:purchase.purchase,write_date:"
+msgid "Write Date"
+msgstr "Date de mise à jour"
+
+msgctxt "field:purchase.purchase,write_uid:"
+msgid "Write User"
+msgstr "Mis à jour par"
+
+msgctxt "field:purchase.purchase-account.invoice,create_date:"
+msgid "Create Date"
+msgstr "Date de création"
+
+msgctxt "field:purchase.purchase-account.invoice,create_uid:"
+msgid "Create User"
+msgstr "Créé par"
+
+msgctxt "field:purchase.purchase-account.invoice,id:"
+msgid "ID"
+msgstr "ID"
+
+msgctxt "field:purchase.purchase-account.invoice,invoice:"
 msgid "Invoice"
 msgstr "Facture"
 
-msgctxt "field:purchase.purchase-account.invoice,purchase:0"
+msgctxt "field:purchase.purchase-account.invoice,purchase:"
 msgid "Purchase"
 msgstr "Achat"
 
-msgctxt "field:purchase.purchase-account.invoice,rec_name:0"
+msgctxt "field:purchase.purchase-account.invoice,rec_name:"
 msgid "Name"
 msgstr "Nom"
 
-msgctxt "field:purchase.purchase-ignored-account.invoice,invoice:0"
+msgctxt "field:purchase.purchase-account.invoice,write_date:"
+msgid "Write Date"
+msgstr "Date de mise à jour"
+
+msgctxt "field:purchase.purchase-account.invoice,write_uid:"
+msgid "Write User"
+msgstr "Mis à jour par"
+
+msgctxt "field:purchase.purchase-ignored-account.invoice,create_date:"
+msgid "Create Date"
+msgstr "Date de création"
+
+msgctxt "field:purchase.purchase-ignored-account.invoice,create_uid:"
+msgid "Create User"
+msgstr "Créé par"
+
+msgctxt "field:purchase.purchase-ignored-account.invoice,id:"
+msgid "ID"
+msgstr "ID"
+
+msgctxt "field:purchase.purchase-ignored-account.invoice,invoice:"
 msgid "Invoice"
 msgstr "Facture"
 
-msgctxt "field:purchase.purchase-ignored-account.invoice,purchase:0"
+msgctxt "field:purchase.purchase-ignored-account.invoice,purchase:"
 msgid "Purchase"
 msgstr "Achat"
 
-msgctxt "field:purchase.purchase-ignored-account.invoice,rec_name:0"
+msgctxt "field:purchase.purchase-ignored-account.invoice,rec_name:"
 msgid "Name"
 msgstr "Nom"
 
-msgctxt "field:purchase.purchase-recreated-account.invoice,invoice:0"
+msgctxt "field:purchase.purchase-ignored-account.invoice,write_date:"
+msgid "Write Date"
+msgstr "Date de mise à jour"
+
+msgctxt "field:purchase.purchase-ignored-account.invoice,write_uid:"
+msgid "Write User"
+msgstr "Mis à jour par"
+
+msgctxt "field:purchase.purchase-recreated-account.invoice,create_date:"
+msgid "Create Date"
+msgstr "Date de création"
+
+msgctxt "field:purchase.purchase-recreated-account.invoice,create_uid:"
+msgid "Create User"
+msgstr "Créé par"
+
+msgctxt "field:purchase.purchase-recreated-account.invoice,id:"
+msgid "ID"
+msgstr "ID"
+
+msgctxt "field:purchase.purchase-recreated-account.invoice,invoice:"
 msgid "Invoice"
 msgstr "Facture"
 
-msgctxt "field:purchase.purchase-recreated-account.invoice,purchase:0"
+msgctxt "field:purchase.purchase-recreated-account.invoice,purchase:"
 msgid "Purchase"
 msgstr "Achat"
 
-msgctxt "field:purchase.purchase-recreated-account.invoice,rec_name:0"
+msgctxt "field:purchase.purchase-recreated-account.invoice,rec_name:"
 msgid "Name"
 msgstr "Nom"
 
-msgctxt "field:stock.move,purchase:0"
+msgctxt "field:purchase.purchase-recreated-account.invoice,write_date:"
+msgid "Write Date"
+msgstr "Date de mise à jour"
+
+msgctxt "field:purchase.purchase-recreated-account.invoice,write_uid:"
+msgid "Write User"
+msgstr "Mis à jour par"
+
+msgctxt "field:stock.move,purchase:"
 msgid "Purchase"
 msgstr "Achat"
 
-msgctxt "field:stock.move,purchase_currency:0"
+msgctxt "field:stock.move,purchase_currency:"
 msgid "Purchase Currency"
 msgstr "Devise de l'achat"
 
-msgctxt "field:stock.move,purchase_exception_state:0"
+msgctxt "field:stock.move,purchase_exception_state:"
 msgid "Exception State"
 msgstr "État d'exception"
 
-msgctxt "field:stock.move,purchase_line:0"
+msgctxt "field:stock.move,purchase_line:"
 msgid "Purchase Line"
 msgstr "Ligne d'achat"
 
-msgctxt "field:stock.move,purchase_quantity:0"
+msgctxt "field:stock.move,purchase_quantity:"
 msgid "Purchase Quantity"
 msgstr "Quantité d'achat"
 
-msgctxt "field:stock.move,purchase_unit:0"
+msgctxt "field:stock.move,purchase_unit:"
 msgid "Purchase Unit"
 msgstr "Unité d'achat"
 
-msgctxt "field:stock.move,purchase_unit_digits:0"
+msgctxt "field:stock.move,purchase_unit_digits:"
 msgid "Purchase Unit Digits"
 msgstr "Décimales de l'unité d'achat"
 
-msgctxt "field:stock.move,purchase_unit_price:0"
+msgctxt "field:stock.move,purchase_unit_price:"
 msgid "Purchase Unit Price"
 msgstr "Prix unitaire d'achat"
 
-msgctxt "field:stock.move,purchase_visible:0"
+msgctxt "field:stock.move,purchase_visible:"
 msgid "Purchase Visible"
 msgstr "Achat visible"
 
-msgctxt "field:stock.move,supplier:0"
+msgctxt "field:stock.move,supplier:"
 msgid "Supplier"
 msgstr "Fournisseur"
 
-msgctxt "help:purchase.handle.invoice.exception.ask,recreate_invoices:0"
+msgctxt "help:purchase.handle.invoice.exception.ask,recreate_invoices:"
 msgid ""
 "The selected invoices will be recreated. The other ones will be ignored."
 msgstr ""
 "Les factures sélectionnées seront recréés. Les autres seront ignorées."
 
-msgctxt "help:purchase.handle.shipment.exception.ask,recreate_moves:0"
+msgctxt "help:purchase.handle.shipment.exception.ask,recreate_moves:"
 msgid "The selected moves will be recreated. The other ones will be ignored."
 msgstr ""
 "Les mouvements sélectionnés seront recréés. Les autres seront ignorés."
 
-msgctxt "help:purchase.product_supplier,delivery_time:0"
+msgctxt "help:purchase.product_supplier,delivery_time:"
 msgid "In number of days"
 msgstr "En nombre de jours"
 
-msgctxt "help:purchase.product_supplier.price,quantity:0"
+msgctxt "help:purchase.product_supplier.price,quantity:"
 msgid "Minimal quantity"
 msgstr "Quantité minimale"
 
@@ -580,59 +891,59 @@ msgctxt "model:ir.ui.menu,name:menu_supplier"
 msgid "Parties associated to Purchases"
 msgstr "Tiers associés à des achats"
 
-msgctxt "model:purchase.configuration,name:0"
+msgctxt "model:purchase.configuration,name:"
 msgid "Purchase Configuration"
 msgstr "Configuration des achats"
 
-msgctxt "model:purchase.handle.invoice.exception.ask,name:0"
-msgid "Invoice Exception Ask"
+msgctxt "model:purchase.handle.invoice.exception.ask,name:"
+msgid "Handle Invoice Exception"
 msgstr "Exception de facture - Demande"
 
-msgctxt "model:purchase.handle.shipment.exception.ask,name:0"
-msgid "Shipment Exception Ask"
+msgctxt "model:purchase.handle.shipment.exception.ask,name:"
+msgid "Handle Shipment Exception"
 msgstr "Exception d'expédition - Demande"
 
-msgctxt "model:purchase.line,name:0"
+msgctxt "model:purchase.line,name:"
 msgid "Purchase Line"
 msgstr "Ligne d'achat"
 
-msgctxt "model:purchase.line-account.invoice.line,name:0"
+msgctxt "model:purchase.line-account.invoice.line,name:"
 msgid "Purchase Line - Invoice Line"
 msgstr "Ligne d'achat - Ligne de facture"
 
-msgctxt "model:purchase.line-account.tax,name:0"
+msgctxt "model:purchase.line-account.tax,name:"
 msgid "Purchase Line - Tax"
 msgstr "Ligne d'achat - Taxe"
 
-msgctxt "model:purchase.line-ignored-stock.move,name:0"
+msgctxt "model:purchase.line-ignored-stock.move,name:"
 msgid "Purchase Line - Ignored Move"
 msgstr "Ligne d'achat - Mouvement ignoré"
 
-msgctxt "model:purchase.line-recreated-stock.move,name:0"
+msgctxt "model:purchase.line-recreated-stock.move,name:"
 msgid "Purchase Line - Ignored Move"
 msgstr "Ligne d'achat - Mouvement ignoré"
 
-msgctxt "model:purchase.product_supplier,name:0"
+msgctxt "model:purchase.product_supplier,name:"
 msgid "Product Supplier"
 msgstr "Produit Fournisseur"
 
-msgctxt "model:purchase.product_supplier.price,name:0"
+msgctxt "model:purchase.product_supplier.price,name:"
 msgid "Product Supplier Price"
 msgstr "Produit Prix Fournisseur"
 
-msgctxt "model:purchase.purchase,name:0"
+msgctxt "model:purchase.purchase,name:"
 msgid "Purchase"
 msgstr "Achat"
 
-msgctxt "model:purchase.purchase-account.invoice,name:0"
+msgctxt "model:purchase.purchase-account.invoice,name:"
 msgid "Purchase - Invoice"
 msgstr "Achat - Facture"
 
-msgctxt "model:purchase.purchase-ignored-account.invoice,name:0"
+msgctxt "model:purchase.purchase-ignored-account.invoice,name:"
 msgid "Purchase - Ignored Invoice"
 msgstr "Achat - Facture ignorée"
 
-msgctxt "model:purchase.purchase-recreated-account.invoice,name:0"
+msgctxt "model:purchase.purchase-recreated-account.invoice,name:"
 msgid "Purchase - Recreated Invoice"
 msgstr "Achat - Facture recréée"
 
@@ -644,424 +955,638 @@ msgctxt "model:res.group,name:group_purchase_admin"
 msgid "Purchase Administrator"
 msgstr "Administrateur des achats"
 
-msgctxt "model:workflow,name:purchase_workflow"
-msgid "Purchase workflow"
-msgstr "Workflow d'achat"
-
-msgctxt "model:workflow.activity,name:purchase_activity_cancel"
-msgid "Canceled"
-msgstr "Annulé"
-
-msgctxt "model:workflow.activity,name:purchase_activity_confirmed"
-msgid "Confirmed"
-msgstr "Confirmé"
-
-msgctxt "model:workflow.activity,name:purchase_activity_done"
-msgid "Done"
-msgstr "Fait"
-
-msgctxt "model:workflow.activity,name:purchase_activity_draft"
-msgid "Draft"
-msgstr "Brouillon"
-
-msgctxt "model:workflow.activity,name:purchase_activity_invoice_done"
-msgid "Invoice Done"
-msgstr "Facture faite"
-
-msgctxt "model:workflow.activity,name:purchase_activity_invoice_method"
-msgid "Invoice Method"
-msgstr "Méthode de facturation"
-
-msgctxt "model:workflow.activity,name:purchase_activity_invoice_method_done"
-msgid "Invoice Method Done"
-msgstr "Méthode de facturation faite"
-
-msgctxt ""
-"model:workflow.activity,name:purchase_activity_invoice_purchase_exception"
-msgid "Invoice Exception"
-msgstr "Facture en exception"
-
-msgctxt "model:workflow.activity,name:purchase_activity_invoice_shipment"
-msgid "Invoice Shipment"
-msgstr "Facture d'expédition"
-
-msgctxt "model:workflow.activity,name:purchase_activity_invoice_shipment_done"
-msgid "Invoice Shipment Done"
-msgstr "Facture expédition faite"
-
-msgctxt ""
-"model:workflow.activity,name:purchase_activity_invoice_shipment_exception"
-msgid "Invoice Shipment Exception"
-msgstr "Facture expédition en exception"
-
-msgctxt ""
-"model:workflow.activity,name:purchase_activity_invoice_shipment_method"
-msgid "Invoice Shipment Method"
-msgstr "Méthode facture expédition"
-
-msgctxt ""
-"model:workflow.activity,name:purchase_activity_invoice_shipment_method_done"
-msgid "Invoice Shipment Method Done"
-msgstr "Méthode facture expédition faite"
-
-msgctxt "model:workflow.activity,name:purchase_activity_quotation"
-msgid "Quotation"
-msgstr "Devis"
-
-msgctxt "model:workflow.activity,name:purchase_activity_shipment_exception"
-msgid "Shipment Exception"
-msgstr "Expédition en exception"
-
-msgctxt ""
-"model:workflow.activity,name:purchase_activity_waiting_invoice_purchase"
-msgid "Waiting Invoice"
-msgstr "Facture en attente"
-
-msgctxt ""
-"model:workflow.activity,name:purchase_activity_waiting_invoice_shipment"
-msgid "Waiting Invoice Shipment"
-msgstr "Facture expédition en attente"
-
-msgctxt "model:workflow.activity,name:purchase_activity_waiting_shipment"
-msgid "Waiting Shipment"
-msgstr "Expédition en attente"
+msgctxt "odt:purchase.purchase:"
+msgid "Amount"
+msgstr "Montant"
 
-msgctxt "odt:purchase.purchase:0"
+msgctxt "odt:purchase.purchase:"
 msgid "Amount"
 msgstr "Montant"
 
-msgctxt "odt:purchase.purchase:0"
+msgctxt "odt:purchase.purchase:"
 msgid "Date:"
 msgstr "Date:"
 
-msgctxt "odt:purchase.purchase:0"
+msgctxt "odt:purchase.purchase:"
+msgid "Date:"
+msgstr "Date:"
+
+msgctxt "odt:purchase.purchase:"
+msgid "Description"
+msgstr "Description"
+
+msgctxt "odt:purchase.purchase:"
 msgid "Description"
 msgstr "Description"
 
-msgctxt "odt:purchase.purchase:0"
+msgctxt "odt:purchase.purchase:"
+msgid "Description:"
+msgstr "Description:"
+
+msgctxt "odt:purchase.purchase:"
 msgid "Description:"
 msgstr "Description:"
 
-msgctxt "odt:purchase.purchase:0"
+msgctxt "odt:purchase.purchase:"
 msgid "Draft Purchase Order"
 msgstr "Commande d'achat"
 
-msgctxt "odt:purchase.purchase:0"
+msgctxt "odt:purchase.purchase:"
+msgid "Draft Purchase Order"
+msgstr "Commande d'achat"
+
+msgctxt "odt:purchase.purchase:"
 msgid "E-Mail:"
 msgstr "E-Mail:"
 
-msgctxt "odt:purchase.purchase:0"
+msgctxt "odt:purchase.purchase:"
+msgid "E-Mail:"
+msgstr "E-Mail:"
+
+msgctxt "odt:purchase.purchase:"
+msgid "Phone:"
+msgstr "Téléphone"
+
+msgctxt "odt:purchase.purchase:"
 msgid "Phone:"
 msgstr "Téléphone"
 
-msgctxt "odt:purchase.purchase:0"
+msgctxt "odt:purchase.purchase:"
+msgid "Purchase Order N°:"
+msgstr "Commande d'achat n° :"
+
+msgctxt "odt:purchase.purchase:"
 msgid "Purchase Order N°:"
 msgstr "Commande d'achat n° :"
 
-msgctxt "odt:purchase.purchase:0"
+msgctxt "odt:purchase.purchase:"
 msgid "Quantity"
 msgstr "Quantité"
 
-msgctxt "odt:purchase.purchase:0"
+msgctxt "odt:purchase.purchase:"
+msgid "Quantity"
+msgstr "Quantité"
+
+msgctxt "odt:purchase.purchase:"
+msgid "Request for Quotation N°:"
+msgstr "Demande pour le devis n°"
+
+msgctxt "odt:purchase.purchase:"
 msgid "Request for Quotation N°:"
 msgstr "Demande pour le devis n°"
 
-msgctxt "odt:purchase.purchase:0"
+msgctxt "odt:purchase.purchase:"
 msgid "Taxes"
 msgstr "Taxes"
 
-msgctxt "odt:purchase.purchase:0"
+msgctxt "odt:purchase.purchase:"
+msgid "Taxes"
+msgstr "Taxes"
+
+msgctxt "odt:purchase.purchase:"
+msgid "Taxes:"
+msgstr "Taxes:"
+
+msgctxt "odt:purchase.purchase:"
 msgid "Taxes:"
 msgstr "Taxes:"
 
-msgctxt "odt:purchase.purchase:0"
+msgctxt "odt:purchase.purchase:"
 msgid "Total (excl. taxes):"
 msgstr "Total (htva)"
 
-msgctxt "odt:purchase.purchase:0"
+msgctxt "odt:purchase.purchase:"
+msgid "Total (excl. taxes):"
+msgstr "Total (htva)"
+
+msgctxt "odt:purchase.purchase:"
+msgid "Total:"
+msgstr "Total:"
+
+msgctxt "odt:purchase.purchase:"
 msgid "Total:"
 msgstr "Total:"
 
-msgctxt "odt:purchase.purchase:0"
+msgctxt "odt:purchase.purchase:"
+msgid "Unit Price"
+msgstr "Prix unitaire"
+
+msgctxt "odt:purchase.purchase:"
 msgid "Unit Price"
 msgstr "Prix unitaire"
 
-msgctxt "odt:purchase.purchase:0"
+msgctxt "odt:purchase.purchase:"
+msgid "VAT Number:"
+msgstr "Numéro TVA:"
+
+msgctxt "odt:purchase.purchase:"
 msgid "VAT Number:"
 msgstr "Numéro TVA:"
 
-msgctxt "odt:purchase.purchase:0"
+msgctxt "odt:purchase.purchase:"
+msgid "VAT:"
+msgstr "TVA:"
+
+msgctxt "odt:purchase.purchase:"
 msgid "VAT:"
 msgstr "TVA:"
 
-msgctxt "selection:account.invoice,purchase_exception_state:0"
+msgctxt "selection:account.invoice,purchase_exception_state:"
 msgid ""
 msgstr ""
 
-msgctxt "selection:account.invoice,purchase_exception_state:0"
+msgctxt "selection:account.invoice,purchase_exception_state:"
+msgid ""
+msgstr ""
+
+msgctxt "selection:account.invoice,purchase_exception_state:"
+msgid "Ignored"
+msgstr "Ignoré"
+
+msgctxt "selection:account.invoice,purchase_exception_state:"
 msgid "Ignored"
 msgstr "Ignoré"
 
-msgctxt "selection:account.invoice,purchase_exception_state:0"
+msgctxt "selection:account.invoice,purchase_exception_state:"
 msgid "Recreated"
 msgstr "Recréé"
 
-msgctxt "selection:purchase.configuration,purchase_invoice_method:0"
+msgctxt "selection:account.invoice,purchase_exception_state:"
+msgid "Recreated"
+msgstr "Recréé"
+
+msgctxt "selection:purchase.configuration,purchase_invoice_method:"
 msgid "Based On Order"
 msgstr "Basé sur la commande"
 
-msgctxt "selection:purchase.configuration,purchase_invoice_method:0"
+msgctxt "selection:purchase.configuration,purchase_invoice_method:"
+msgid "Based On Order"
+msgstr "Basé sur la commande"
+
+msgctxt "selection:purchase.configuration,purchase_invoice_method:"
 msgid "Based On Shipment"
 msgstr "Basé sur la livraison"
 
-msgctxt "selection:purchase.configuration,purchase_invoice_method:0"
+msgctxt "selection:purchase.configuration,purchase_invoice_method:"
+msgid "Based On Shipment"
+msgstr "Basé sur la livraison"
+
+msgctxt "selection:purchase.configuration,purchase_invoice_method:"
+msgid "Manual"
+msgstr "Manuel"
+
+msgctxt "selection:purchase.configuration,purchase_invoice_method:"
 msgid "Manual"
 msgstr "Manuel"
 
-msgctxt "selection:purchase.line,type:0"
+msgctxt "selection:purchase.line,type:"
 msgid "Comment"
 msgstr "Commentaire"
 
-msgctxt "selection:purchase.line,type:0"
+msgctxt "selection:purchase.line,type:"
+msgid "Comment"
+msgstr "Commentaire"
+
+msgctxt "selection:purchase.line,type:"
+msgid "Line"
+msgstr "Ligne"
+
+msgctxt "selection:purchase.line,type:"
 msgid "Line"
 msgstr "Ligne"
 
-msgctxt "selection:purchase.line,type:0"
+msgctxt "selection:purchase.line,type:"
 msgid "Subtotal"
 msgstr "Sous-total"
 
-msgctxt "selection:purchase.line,type:0"
+msgctxt "selection:purchase.line,type:"
+msgid "Subtotal"
+msgstr "Sous-total"
+
+msgctxt "selection:purchase.line,type:"
+msgid "Title"
+msgstr "Titre"
+
+msgctxt "selection:purchase.line,type:"
 msgid "Title"
 msgstr "Titre"
 
-msgctxt "selection:purchase.purchase,invoice_method:0"
+msgctxt "selection:purchase.purchase,invoice_method:"
 msgid "Based On Order"
 msgstr "Basé sur la commande"
 
-msgctxt "selection:purchase.purchase,invoice_method:0"
+msgctxt "selection:purchase.purchase,invoice_method:"
+msgid "Based On Order"
+msgstr "Basé sur la commande"
+
+msgctxt "selection:purchase.purchase,invoice_method:"
+msgid "Based On Shipment"
+msgstr "Basé sur la livraison"
+
+msgctxt "selection:purchase.purchase,invoice_method:"
 msgid "Based On Shipment"
 msgstr "Basé sur la livraison"
 
-msgctxt "selection:purchase.purchase,invoice_method:0"
+msgctxt "selection:purchase.purchase,invoice_method:"
+msgid "Manual"
+msgstr "Manuel"
+
+msgctxt "selection:purchase.purchase,invoice_method:"
 msgid "Manual"
 msgstr "Manuel"
 
-msgctxt "selection:purchase.purchase,invoice_state:0"
+msgctxt "selection:purchase.purchase,invoice_state:"
+msgid "Exception"
+msgstr "Exception"
+
+msgctxt "selection:purchase.purchase,invoice_state:"
 msgid "Exception"
 msgstr "Exception"
 
-msgctxt "selection:purchase.purchase,invoice_state:0"
+msgctxt "selection:purchase.purchase,invoice_state:"
+msgid "None"
+msgstr "Aucun"
+
+msgctxt "selection:purchase.purchase,invoice_state:"
 msgid "None"
 msgstr "Aucun"
 
-msgctxt "selection:purchase.purchase,invoice_state:0"
+msgctxt "selection:purchase.purchase,invoice_state:"
 msgid "Paid"
 msgstr "Payé"
 
-msgctxt "selection:purchase.purchase,invoice_state:0"
+msgctxt "selection:purchase.purchase,invoice_state:"
+msgid "Paid"
+msgstr "Payé"
+
+msgctxt "selection:purchase.purchase,invoice_state:"
+msgid "Waiting"
+msgstr "En attente"
+
+msgctxt "selection:purchase.purchase,invoice_state:"
 msgid "Waiting"
 msgstr "En attente"
 
-msgctxt "selection:purchase.purchase,shipment_state:0"
+msgctxt "selection:purchase.purchase,shipment_state:"
 msgid "Exception"
 msgstr "Exception"
 
-msgctxt "selection:purchase.purchase,shipment_state:0"
+msgctxt "selection:purchase.purchase,shipment_state:"
+msgid "Exception"
+msgstr "Exception"
+
+msgctxt "selection:purchase.purchase,shipment_state:"
 msgid "None"
 msgstr "Aucun"
 
-msgctxt "selection:purchase.purchase,shipment_state:0"
+msgctxt "selection:purchase.purchase,shipment_state:"
+msgid "None"
+msgstr "Aucun"
+
+msgctxt "selection:purchase.purchase,shipment_state:"
 msgid "Received"
 msgstr "Reçu"
 
-msgctxt "selection:purchase.purchase,shipment_state:0"
+msgctxt "selection:purchase.purchase,shipment_state:"
+msgid "Received"
+msgstr "Reçu"
+
+msgctxt "selection:purchase.purchase,shipment_state:"
+msgid "Waiting"
+msgstr "En attente"
+
+msgctxt "selection:purchase.purchase,shipment_state:"
 msgid "Waiting"
 msgstr "En attente"
 
-msgctxt "selection:purchase.purchase,state:0"
+msgctxt "selection:purchase.purchase,state:"
 msgid "Canceled"
 msgstr "Annulé"
 
-msgctxt "selection:purchase.purchase,state:0"
+msgctxt "selection:purchase.purchase,state:"
+msgid "Canceled"
+msgstr "Annulé"
+
+msgctxt "selection:purchase.purchase,state:"
+msgid "Confirmed"
+msgstr "Confirmé"
+
+msgctxt "selection:purchase.purchase,state:"
 msgid "Confirmed"
 msgstr "Confirmé"
 
-msgctxt "selection:purchase.purchase,state:0"
+msgctxt "selection:purchase.purchase,state:"
 msgid "Done"
 msgstr "Fait"
 
-msgctxt "selection:purchase.purchase,state:0"
+msgctxt "selection:purchase.purchase,state:"
+msgid "Done"
+msgstr "Fait"
+
+msgctxt "selection:purchase.purchase,state:"
+msgid "Draft"
+msgstr "Brouillon"
+
+msgctxt "selection:purchase.purchase,state:"
 msgid "Draft"
 msgstr "Brouillon"
 
-msgctxt "selection:purchase.purchase,state:0"
+msgctxt "selection:purchase.purchase,state:"
 msgid "Quotation"
 msgstr "Devis"
 
-msgctxt "selection:stock.move,purchase_exception_state:0"
+msgctxt "selection:purchase.purchase,state:"
+msgid "Quotation"
+msgstr "Devis"
+
+msgctxt "selection:stock.move,purchase_exception_state:"
 msgid ""
 msgstr ""
 
-msgctxt "selection:stock.move,purchase_exception_state:0"
+msgctxt "selection:stock.move,purchase_exception_state:"
+msgid ""
+msgstr ""
+
+msgctxt "selection:stock.move,purchase_exception_state:"
+msgid "Ignored"
+msgstr "Ignoré"
+
+msgctxt "selection:stock.move,purchase_exception_state:"
 msgid "Ignored"
 msgstr "Ignoré"
 
-msgctxt "selection:stock.move,purchase_exception_state:0"
+msgctxt "selection:stock.move,purchase_exception_state:"
+msgid "Recreated"
+msgstr "Recréé"
+
+msgctxt "selection:stock.move,purchase_exception_state:"
 msgid "Recreated"
 msgstr "Recréé"
 
-msgctxt "view:product.product:0"
+msgctxt "view:product.product:"
 msgid "Product Suppliers"
 msgstr "Fournisseurs"
 
-msgctxt "view:product.product:0"
+msgctxt "view:product.product:"
+msgid "Products"
+msgstr "produits"
+
+msgctxt "view:product.product:"
 msgid "Suppliers"
 msgstr "Fournisseurs"
 
-msgctxt "view:product.template:0"
+msgctxt "view:product.template:"
 msgid "Product Suppliers"
 msgstr "Produit Fournisseur"
 
-msgctxt "view:product.template:0"
+msgctxt "view:product.template:"
+msgid "Suppliers"
+msgstr "Fournisseurs"
+
+msgctxt "view:product.template:"
 msgid "Suppliers"
 msgstr "Fournisseurs"
 
-msgctxt "view:purchase.configuration:0"
+msgctxt "view:purchase.configuration:"
 msgid "Purchase Configuration"
 msgstr "Configuration des achats"
 
-msgctxt "view:purchase.handle.invoice.exception.ask:0"
+msgctxt "view:purchase.configuration:"
+msgid "Purchase Configuration"
+msgstr "Configuration des achats"
+
+msgctxt "view:purchase.handle.invoice.exception.ask:"
+msgid "Choose invoices to recreate"
+msgstr "Choisir les factures à recréer"
+
+msgctxt "view:purchase.handle.invoice.exception.ask:"
 msgid "Choose invoices to recreate"
 msgstr "Choisir les factures à recréer"
 
-msgctxt "view:purchase.handle.invoice.exception.ask:0"
+msgctxt "view:purchase.handle.invoice.exception.ask:"
 msgid "Handle Invoice Exception"
 msgstr "Gérer l'exception de facture"
 
-msgctxt "view:purchase.handle.shipment.exception.ask:0"
+msgctxt "view:purchase.handle.invoice.exception.ask:"
+msgid "Handle Invoice Exception"
+msgstr "Gérer l'exception de facture"
+
+msgctxt "view:purchase.handle.shipment.exception.ask:"
 msgid "Choose move to recreate"
 msgstr "Choisir le mouvement à recréer"
 
-msgctxt "view:purchase.handle.shipment.exception.ask:0"
+msgctxt "view:purchase.handle.shipment.exception.ask:"
+msgid "Choose move to recreate"
+msgstr "Choisir le mouvement à recréer"
+
+msgctxt "view:purchase.handle.shipment.exception.ask:"
 msgid "Choose moves to recreate"
 msgstr "Choisir les mouvements à recréer"
 
-msgctxt "view:purchase.handle.shipment.exception.ask:0"
+msgctxt "view:purchase.handle.shipment.exception.ask:"
+msgid "Handle shipment Exception"
+msgstr "Gérer l'exception d'expédition"
+
+msgctxt "view:purchase.handle.shipment.exception.ask:"
 msgid "Handle shipment Exception"
 msgstr "Gérer l'exception d'expédition"
 
-msgctxt "view:purchase.handle.shipment.exception.ask:0"
+msgctxt "view:purchase.handle.shipment.exception.ask:"
 msgid "Recreated Moves"
 msgstr "Mouvements recréés"
 
-msgctxt "view:purchase.line:0"
+msgctxt "view:purchase.line:"
 msgid "General"
 msgstr "Général"
 
-msgctxt "view:purchase.line:0"
+msgctxt "view:purchase.line:"
+msgid "General"
+msgstr "Général"
+
+msgctxt "view:purchase.line:"
+msgid "Lines"
+msgstr "Lignes"
+
+msgctxt "view:purchase.line:"
+msgid "Notes"
+msgstr "Notes"
+
+msgctxt "view:purchase.line:"
 msgid "Notes"
 msgstr "Notes"
 
-msgctxt "view:purchase.line:0"
+msgctxt "view:purchase.line:"
 msgid "Products"
 msgstr "Produits"
 
-msgctxt "view:purchase.line:0"
+msgctxt "view:purchase.line:"
+msgid "Purchase Line"
+msgstr "Ligne d'achat"
+
+msgctxt "view:purchase.line:"
 msgid "Purchase Line"
 msgstr "Ligne d'achat"
 
-msgctxt "view:purchase.line:0"
+msgctxt "view:purchase.line:"
 msgid "Purchase Lines"
 msgstr "Lignes d'achat"
 
-msgctxt "view:purchase.product_supplier.price:0"
+msgctxt "view:purchase.line:"
+msgid "Purchase Lines"
+msgstr "Lignes d'achat"
+
+msgctxt "view:purchase.product_supplier.price:"
+msgid "Product Supplier Price"
+msgstr "Prix du fournisseur du produit"
+
+msgctxt "view:purchase.product_supplier.price:"
 msgid "Product Supplier Price"
 msgstr "Prix du fournisseur du produit"
 
-msgctxt "view:purchase.product_supplier.price:0"
+msgctxt "view:purchase.product_supplier.price:"
 msgid "Product Supplier Prices"
 msgstr "Prix du fournisseur du produit"
 
-msgctxt "view:purchase.product_supplier:0"
+msgctxt "view:purchase.product_supplier.price:"
+msgid "Product Supplier Prices"
+msgstr "Prix du fournisseur du produit"
+
+msgctxt "view:purchase.product_supplier:"
+msgid "Product Supplier"
+msgstr "Fournisseur du produit"
+
+msgctxt "view:purchase.product_supplier:"
 msgid "Product Supplier"
 msgstr "Fournisseur du produit"
 
-msgctxt "view:purchase.product_supplier:0"
+msgctxt "view:purchase.product_supplier:"
 msgid "Product Suppliers"
 msgstr "Fournisseurs du produit"
 
-msgctxt "view:purchase.purchase:0"
+msgctxt "view:purchase.product_supplier:"
+msgid "Product Suppliers"
+msgstr "Fournisseurs du produit"
+
+msgctxt "view:purchase.purchase:"
+msgid "Cancel"
+msgstr "Annuler"
+
+msgctxt "view:purchase.purchase:"
 msgid "Cancel"
 msgstr "Annuler"
 
-msgctxt "view:purchase.purchase:0"
+msgctxt "view:purchase.purchase:"
+msgid "Confirm"
+msgstr "Confirmer"
+
+msgctxt "view:purchase.purchase:"
 msgid "Confirm"
 msgstr "Confirmer"
 
-msgctxt "view:purchase.purchase:0"
+msgctxt "view:purchase.purchase:"
 msgid "Draft"
 msgstr "Brouillon"
 
-msgctxt "view:purchase.purchase:0"
+msgctxt "view:purchase.purchase:"
+msgid "Draft"
+msgstr "Brouillon"
+
+msgctxt "view:purchase.purchase:"
 msgid "Handle Invoice Exception"
 msgstr "Gérer l'exception de facture"
 
-msgctxt "view:purchase.purchase:0"
+msgctxt "view:purchase.purchase:"
+msgid "Handle Invoice Exception"
+msgstr "Gérer l'exception de facture"
+
+msgctxt "view:purchase.purchase:"
+msgid "Handle Shipment Exception"
+msgstr "Gérer l'exception d'expédition"
+
+msgctxt "view:purchase.purchase:"
 msgid "Handle Shipment Exception"
 msgstr "Gérer l'exception d'expédition"
 
-msgctxt "view:purchase.purchase:0"
+msgctxt "view:purchase.purchase:"
 msgid "Ignore Invoice Exception"
 msgstr "Ignorer l'exception de facturation"
 
-msgctxt "view:purchase.purchase:0"
+msgctxt "view:purchase.purchase:"
 msgid "Ignore Shipment Exception"
 msgstr "Ignorer l'exception d'expédition"
 
-msgctxt "view:purchase.purchase:0"
+msgctxt "view:purchase.purchase:"
+msgid "Invoices"
+msgstr "Factures"
+
+msgctxt "view:purchase.purchase:"
 msgid "Invoices"
 msgstr "Factures"
 
-msgctxt "view:purchase.purchase:0"
+msgctxt "view:purchase.purchase:"
 msgid "Lines"
 msgstr "Lignes"
 
-msgctxt "view:purchase.purchase:0"
+msgctxt "view:purchase.purchase:"
 msgid "Moves"
 msgstr "Mouvements"
 
-msgctxt "view:purchase.purchase:0"
+msgctxt "view:purchase.purchase:"
 msgid "Other Info"
 msgstr "Autre information"
 
-msgctxt "view:purchase.purchase:0"
+msgctxt "view:purchase.purchase:"
+msgid "Other Info"
+msgstr "Autre information"
+
+msgctxt "view:purchase.purchase:"
+msgid "Purchase"
+msgstr "Achat"
+
+msgctxt "view:purchase.purchase:"
 msgid "Purchase"
 msgstr "Achat"
 
-msgctxt "view:purchase.purchase:0"
+msgctxt "view:purchase.purchase:"
 msgid "Purchases"
 msgstr "Achats"
 
-msgctxt "view:purchase.purchase:0"
+msgctxt "view:purchase.purchase:"
+msgid "Purchases"
+msgstr "Achats"
+
+msgctxt "view:purchase.purchase:"
 msgid "Quotation"
 msgstr "Devis"
 
-msgctxt "view:purchase.purchase:0"
+msgctxt "view:purchase.purchase:"
+msgid "Quote"
+msgstr "Devis"
+
+msgctxt "view:purchase.purchase:"
 msgid "Shipments"
 msgstr "Expéditions"
 
-msgctxt "wizard_button:purchase.handle.invoice.exception,init,end:0"
+msgctxt "view:purchase.purchase:"
+msgid "Shipments"
+msgstr "Expéditions"
+
+msgctxt "view:stock.move:"
+msgid "Moves"
+msgstr "Mouvements"
+
+msgctxt "wizard_button:purchase.handle.invoice.exception,ask,end:"
 msgid "Cancel"
 msgstr "Annuler"
 
-msgctxt "wizard_button:purchase.handle.invoice.exception,init,ok:0"
+msgctxt "wizard_button:purchase.handle.invoice.exception,ask,handle:"
 msgid "Ok"
 msgstr "Ok"
 
-msgctxt "wizard_button:purchase.handle.shipment.exception,init,end:0"
+msgctxt "wizard_button:purchase.handle.shipment.exception,ask,end:"
 msgid "Cancel"
 msgstr "Annuler"
 
-msgctxt "wizard_button:purchase.handle.shipment.exception,init,ok:0"
+msgctxt "wizard_button:purchase.handle.shipment.exception,ask,handle:"
 msgid "Ok"
 msgstr "Ok"
diff --git a/locale/nl_NL.po b/locale/nl_NL.po
index ad039b3..9c43757 100644
--- a/locale/nl_NL.po
+++ b/locale/nl_NL.po
@@ -2,569 +2,838 @@
 msgid ""
 msgstr "Content-Type: text/plain; charset=utf-8\n"
 
-msgctxt "error:account.invoice:0"
+msgctxt "error:account.invoice:"
 msgid "You can not delete invoices that come from a purchase!"
 msgstr ""
 
-msgctxt "error:account.invoice:0"
+msgctxt "error:account.invoice:"
 msgid "You cannot reset to draft an invoice generated by a purchase."
 msgstr ""
 
-msgctxt "error:product.template:0"
+msgctxt "error:product.template:"
 msgid ""
 "Purchase prices are based on the purchase uom, are you sure to change it?"
 msgstr ""
 
-msgctxt "error:purchase.line:0"
+msgctxt "error:purchase.line:"
 msgid "It misses an \"Account Expense\" on product \"%s\"!"
 msgstr ""
 
-msgctxt "error:purchase.line:0"
+msgctxt "error:purchase.line:"
 msgid "It misses an \"account expense\" default property!"
 msgstr ""
 
-msgctxt "error:purchase.line:0"
+msgctxt "error:purchase.line:"
 msgid "The supplier location is required!"
 msgstr ""
 
-msgctxt "error:purchase.purchase:0"
+msgctxt "error:purchase.purchase:"
+msgid "A warehouse must be defined for the quotation."
+msgstr ""
+
+msgctxt "error:purchase.purchase:"
 msgid "Invoice addresses must be defined for the quotation."
 msgstr ""
 
-msgctxt "error:purchase.purchase:0"
+msgctxt "error:purchase.purchase:"
 msgid "It misses an \"Account Payable\" on the party \"%s\"!"
 msgstr ""
 
-msgctxt "error:stock.shipment.in:0"
+msgctxt "error:purchase.purchase:"
+msgid "Purchase \"%s\" must be cancelled before deletion!"
+msgstr ""
+
+msgctxt "error:stock.shipment.in:"
 msgid "You cannot reset to draft a move generated by a purchase."
 msgstr ""
 
 #, fuzzy
-msgctxt "field:account.invoice,purchase_exception_state:0"
+msgctxt "field:account.invoice,purchase_exception_state:"
 msgid "Exception State"
 msgstr "Uitzonderingstoestand"
 
-msgctxt "field:account.invoice,purchases:0"
+msgctxt "field:account.invoice,purchases:"
 msgid "Purchases"
 msgstr ""
 
-msgctxt "field:account.invoice.line,purchase_lines:0"
+msgctxt "field:account.invoice.line,purchase_lines:"
 msgid "Purchase Lines"
 msgstr ""
 
-msgctxt "field:product.template,product_suppliers:0"
+msgctxt "field:product.template,product_suppliers:"
 msgid "Suppliers"
 msgstr ""
 
-msgctxt "field:product.template,purchasable:0"
+msgctxt "field:product.template,purchasable:"
 msgid "Purchasable"
 msgstr ""
 
-msgctxt "field:product.template,purchase_uom:0"
+msgctxt "field:product.template,purchase_uom:"
 msgid "Purchase UOM"
 msgstr ""
 
+msgctxt "field:purchase.configuration,create_date:"
+msgid "Create Date"
+msgstr ""
+
+msgctxt "field:purchase.configuration,create_uid:"
+msgid "Create User"
+msgstr ""
+
+msgctxt "field:purchase.configuration,id:"
+msgid "ID"
+msgstr ""
+
 #, fuzzy
-msgctxt "field:purchase.configuration,purchase_invoice_method:0"
+msgctxt "field:purchase.configuration,purchase_invoice_method:"
 msgid "Invoice Method"
 msgstr "Factuur afhandeling"
 
-msgctxt "field:purchase.configuration,purchase_sequence:0"
+msgctxt "field:purchase.configuration,purchase_sequence:"
 msgid "Purchase Reference Sequence"
 msgstr ""
 
 #, fuzzy
-msgctxt "field:purchase.configuration,rec_name:0"
+msgctxt "field:purchase.configuration,rec_name:"
 msgid "Name"
 msgstr "Naam bijlage"
 
+msgctxt "field:purchase.configuration,write_date:"
+msgid "Write Date"
+msgstr ""
+
+msgctxt "field:purchase.configuration,write_uid:"
+msgid "Write User"
+msgstr ""
+
 #, fuzzy
-msgctxt "field:purchase.handle.invoice.exception.ask,domain_invoices:0"
+msgctxt "field:purchase.handle.invoice.exception.ask,domain_invoices:"
 msgid "Domain Invoices"
 msgstr "Domein facturen"
 
+msgctxt "field:purchase.handle.invoice.exception.ask,id:"
+msgid "ID"
+msgstr ""
+
 #, fuzzy
-msgctxt "field:purchase.handle.invoice.exception.ask,recreate_invoices:0"
+msgctxt "field:purchase.handle.invoice.exception.ask,recreate_invoices:"
 msgid "Recreate Invoices"
 msgstr "Facturen opnieuw aanmaken"
 
 #, fuzzy
-msgctxt "field:purchase.handle.shipment.exception.ask,domain_moves:0"
+msgctxt "field:purchase.handle.shipment.exception.ask,domain_moves:"
 msgid "Domain Moves"
 msgstr "Domein boekingen"
 
+msgctxt "field:purchase.handle.shipment.exception.ask,id:"
+msgid "ID"
+msgstr ""
+
 #, fuzzy
-msgctxt "field:purchase.handle.shipment.exception.ask,recreate_moves:0"
+msgctxt "field:purchase.handle.shipment.exception.ask,recreate_moves:"
 msgid "Recreate Moves"
 msgstr "Boekingen opnieuw aanmaken"
 
 #, fuzzy
-msgctxt "field:purchase.line,amount:0"
+msgctxt "field:purchase.line,amount:"
 msgid "Amount"
 msgstr "Bedrag"
 
+msgctxt "field:purchase.line,create_date:"
+msgid "Create Date"
+msgstr ""
+
+msgctxt "field:purchase.line,create_uid:"
+msgid "Create User"
+msgstr ""
+
+msgctxt "field:purchase.line,delivery_date:"
+msgid "Delivery Date"
+msgstr ""
+
 #, fuzzy
-msgctxt "field:purchase.line,description:0"
+msgctxt "field:purchase.line,description:"
 msgid "Description"
 msgstr "Specificatie"
 
+msgctxt "field:purchase.line,from_location:"
+msgid "From Location"
+msgstr ""
+
+msgctxt "field:purchase.line,id:"
+msgid "ID"
+msgstr ""
+
 #, fuzzy
-msgctxt "field:purchase.line,invoice_lines:0"
+msgctxt "field:purchase.line,invoice_lines:"
 msgid "Invoice Lines"
 msgstr "Factuurregels"
 
 #, fuzzy
-msgctxt "field:purchase.line,move_done:0"
+msgctxt "field:purchase.line,move_done:"
 msgid "Moves Done"
 msgstr "Boekingen klaar"
 
 #, fuzzy
-msgctxt "field:purchase.line,move_exception:0"
+msgctxt "field:purchase.line,move_exception:"
 msgid "Moves Exception"
 msgstr "Boekingen uitzondering"
 
 #, fuzzy
-msgctxt "field:purchase.line,moves:0"
+msgctxt "field:purchase.line,moves:"
 msgid "Moves"
 msgstr "Boekingen"
 
 #, fuzzy
-msgctxt "field:purchase.line,moves_ignored:0"
+msgctxt "field:purchase.line,moves_ignored:"
 msgid "Ignored Moves"
 msgstr "Genegeerde boekingen"
 
 #, fuzzy
-msgctxt "field:purchase.line,moves_recreated:0"
+msgctxt "field:purchase.line,moves_recreated:"
 msgid "Recreated Moves"
 msgstr "Opnieuw aangemaakte boekingen"
 
 #, fuzzy
-msgctxt "field:purchase.line,note:0"
+msgctxt "field:purchase.line,note:"
 msgid "Note"
 msgstr "Aantekening"
 
 #, fuzzy
-msgctxt "field:purchase.line,product:0"
+msgctxt "field:purchase.line,product:"
 msgid "Product"
 msgstr "Producten"
 
-msgctxt "field:purchase.line,purchase:0"
+msgctxt "field:purchase.line,product_uom_category:"
+msgid "Product Uom Category"
+msgstr ""
+
+msgctxt "field:purchase.line,purchase:"
 msgid "Purchase"
 msgstr ""
 
 #, fuzzy
-msgctxt "field:purchase.line,quantity:0"
+msgctxt "field:purchase.line,quantity:"
 msgid "Quantity"
 msgstr "Hoeveelheid"
 
 #, fuzzy
-msgctxt "field:purchase.line,rec_name:0"
+msgctxt "field:purchase.line,rec_name:"
 msgid "Name"
 msgstr "Naam bijlage"
 
 #, fuzzy
-msgctxt "field:purchase.line,sequence:0"
+msgctxt "field:purchase.line,sequence:"
 msgid "Sequence"
 msgstr "Reeks"
 
 #, fuzzy
-msgctxt "field:purchase.line,taxes:0"
+msgctxt "field:purchase.line,taxes:"
 msgid "Taxes"
 msgstr "Belastingen"
 
+msgctxt "field:purchase.line,to_location:"
+msgid "To Location"
+msgstr ""
+
 #, fuzzy
-msgctxt "field:purchase.line,type:0"
+msgctxt "field:purchase.line,type:"
 msgid "Type"
 msgstr "Type"
 
 #, fuzzy
-msgctxt "field:purchase.line,unit:0"
+msgctxt "field:purchase.line,unit:"
 msgid "Unit"
 msgstr "Eenheid"
 
 #, fuzzy
-msgctxt "field:purchase.line,unit_digits:0"
+msgctxt "field:purchase.line,unit_digits:"
 msgid "Unit Digits"
 msgstr "Decimalen eenheid"
 
 #, fuzzy
-msgctxt "field:purchase.line,unit_price:0"
+msgctxt "field:purchase.line,unit_price:"
 msgid "Unit Price"
 msgstr "Eenheidsprijs"
 
+msgctxt "field:purchase.line,write_date:"
+msgid "Write Date"
+msgstr ""
+
+msgctxt "field:purchase.line,write_uid:"
+msgid "Write User"
+msgstr ""
+
+msgctxt "field:purchase.line-account.invoice.line,create_date:"
+msgid "Create Date"
+msgstr ""
+
+msgctxt "field:purchase.line-account.invoice.line,create_uid:"
+msgid "Create User"
+msgstr ""
+
+msgctxt "field:purchase.line-account.invoice.line,id:"
+msgid "ID"
+msgstr ""
+
 #, fuzzy
-msgctxt "field:purchase.line-account.invoice.line,invoice_line:0"
+msgctxt "field:purchase.line-account.invoice.line,invoice_line:"
 msgid "Invoice Line"
 msgstr "Factuurregel"
 
-msgctxt "field:purchase.line-account.invoice.line,purchase_line:0"
+msgctxt "field:purchase.line-account.invoice.line,purchase_line:"
 msgid "Purchase Line"
 msgstr ""
 
 #, fuzzy
-msgctxt "field:purchase.line-account.invoice.line,rec_name:0"
+msgctxt "field:purchase.line-account.invoice.line,rec_name:"
 msgid "Name"
 msgstr "Naam bijlage"
 
-msgctxt "field:purchase.line-account.tax,line:0"
+msgctxt "field:purchase.line-account.invoice.line,write_date:"
+msgid "Write Date"
+msgstr ""
+
+msgctxt "field:purchase.line-account.invoice.line,write_uid:"
+msgid "Write User"
+msgstr ""
+
+msgctxt "field:purchase.line-account.tax,create_date:"
+msgid "Create Date"
+msgstr ""
+
+msgctxt "field:purchase.line-account.tax,create_uid:"
+msgid "Create User"
+msgstr ""
+
+msgctxt "field:purchase.line-account.tax,id:"
+msgid "ID"
+msgstr ""
+
+msgctxt "field:purchase.line-account.tax,line:"
 msgid "Purchase Line"
 msgstr ""
 
 #, fuzzy
-msgctxt "field:purchase.line-account.tax,rec_name:0"
+msgctxt "field:purchase.line-account.tax,rec_name:"
 msgid "Name"
 msgstr "Naam bijlage"
 
 #, fuzzy
-msgctxt "field:purchase.line-account.tax,tax:0"
+msgctxt "field:purchase.line-account.tax,tax:"
 msgid "Tax"
 msgstr "Belasting"
 
+msgctxt "field:purchase.line-account.tax,write_date:"
+msgid "Write Date"
+msgstr ""
+
+msgctxt "field:purchase.line-account.tax,write_uid:"
+msgid "Write User"
+msgstr ""
+
+msgctxt "field:purchase.line-ignored-stock.move,create_date:"
+msgid "Create Date"
+msgstr ""
+
+msgctxt "field:purchase.line-ignored-stock.move,create_uid:"
+msgid "Create User"
+msgstr ""
+
+msgctxt "field:purchase.line-ignored-stock.move,id:"
+msgid "ID"
+msgstr ""
+
 #, fuzzy
-msgctxt "field:purchase.line-ignored-stock.move,move:0"
+msgctxt "field:purchase.line-ignored-stock.move,move:"
 msgid "Move"
 msgstr "Boeking"
 
-msgctxt "field:purchase.line-ignored-stock.move,purchase_line:0"
+msgctxt "field:purchase.line-ignored-stock.move,purchase_line:"
 msgid "Purchase Line"
 msgstr ""
 
 #, fuzzy
-msgctxt "field:purchase.line-ignored-stock.move,rec_name:0"
+msgctxt "field:purchase.line-ignored-stock.move,rec_name:"
 msgid "Name"
 msgstr "Naam bijlage"
 
+msgctxt "field:purchase.line-ignored-stock.move,write_date:"
+msgid "Write Date"
+msgstr ""
+
+msgctxt "field:purchase.line-ignored-stock.move,write_uid:"
+msgid "Write User"
+msgstr ""
+
+msgctxt "field:purchase.line-recreated-stock.move,create_date:"
+msgid "Create Date"
+msgstr ""
+
+msgctxt "field:purchase.line-recreated-stock.move,create_uid:"
+msgid "Create User"
+msgstr ""
+
+msgctxt "field:purchase.line-recreated-stock.move,id:"
+msgid "ID"
+msgstr ""
+
 #, fuzzy
-msgctxt "field:purchase.line-recreated-stock.move,move:0"
+msgctxt "field:purchase.line-recreated-stock.move,move:"
 msgid "Move"
 msgstr "Boeking"
 
-msgctxt "field:purchase.line-recreated-stock.move,purchase_line:0"
+msgctxt "field:purchase.line-recreated-stock.move,purchase_line:"
 msgid "Purchase Line"
 msgstr ""
 
 #, fuzzy
-msgctxt "field:purchase.line-recreated-stock.move,rec_name:0"
+msgctxt "field:purchase.line-recreated-stock.move,rec_name:"
 msgid "Name"
 msgstr "Naam bijlage"
 
+msgctxt "field:purchase.line-recreated-stock.move,write_date:"
+msgid "Write Date"
+msgstr ""
+
+msgctxt "field:purchase.line-recreated-stock.move,write_uid:"
+msgid "Write User"
+msgstr ""
+
 #, fuzzy
-msgctxt "field:purchase.product_supplier,code:0"
+msgctxt "field:purchase.product_supplier,code:"
 msgid "Code"
 msgstr "Code"
 
 #, fuzzy
-msgctxt "field:purchase.product_supplier,company:0"
+msgctxt "field:purchase.product_supplier,company:"
 msgid "Company"
 msgstr "Bedrijf"
 
-msgctxt "field:purchase.product_supplier,delivery_time:0"
+msgctxt "field:purchase.product_supplier,create_date:"
+msgid "Create Date"
+msgstr ""
+
+msgctxt "field:purchase.product_supplier,create_uid:"
+msgid "Create User"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:purchase.product_supplier,currency:"
+msgid "Currency"
+msgstr "Valuta"
+
+msgctxt "field:purchase.product_supplier,delivery_time:"
 msgid "Delivery Time"
 msgstr ""
 
+msgctxt "field:purchase.product_supplier,id:"
+msgid "ID"
+msgstr ""
+
 #, fuzzy
-msgctxt "field:purchase.product_supplier,name:0"
+msgctxt "field:purchase.product_supplier,name:"
 msgid "Name"
 msgstr "Naam bijlage"
 
 #, fuzzy
-msgctxt "field:purchase.product_supplier,party:0"
+msgctxt "field:purchase.product_supplier,party:"
 msgid "Supplier"
 msgstr "Leverancier"
 
-msgctxt "field:purchase.product_supplier,prices:0"
+msgctxt "field:purchase.product_supplier,prices:"
 msgid "Prices"
 msgstr ""
 
 #, fuzzy
-msgctxt "field:purchase.product_supplier,product:0"
+msgctxt "field:purchase.product_supplier,product:"
 msgid "Product"
 msgstr "Producten"
 
 #, fuzzy
-msgctxt "field:purchase.product_supplier,rec_name:0"
+msgctxt "field:purchase.product_supplier,rec_name:"
 msgid "Name"
 msgstr "Naam bijlage"
 
 #, fuzzy
-msgctxt "field:purchase.product_supplier,sequence:0"
+msgctxt "field:purchase.product_supplier,sequence:"
 msgid "Sequence"
 msgstr "Reeks"
 
+msgctxt "field:purchase.product_supplier,write_date:"
+msgid "Write Date"
+msgstr ""
+
+msgctxt "field:purchase.product_supplier,write_uid:"
+msgid "Write User"
+msgstr ""
+
+msgctxt "field:purchase.product_supplier.price,create_date:"
+msgid "Create Date"
+msgstr ""
+
+msgctxt "field:purchase.product_supplier.price,create_uid:"
+msgid "Create User"
+msgstr ""
+
+msgctxt "field:purchase.product_supplier.price,id:"
+msgid "ID"
+msgstr ""
+
 #, fuzzy
-msgctxt "field:purchase.product_supplier.price,product_supplier:0"
+msgctxt "field:purchase.product_supplier.price,product_supplier:"
 msgid "Supplier"
 msgstr "Leverancier"
 
 #, fuzzy
-msgctxt "field:purchase.product_supplier.price,quantity:0"
+msgctxt "field:purchase.product_supplier.price,quantity:"
 msgid "Quantity"
 msgstr "Hoeveelheid"
 
 #, fuzzy
-msgctxt "field:purchase.product_supplier.price,rec_name:0"
+msgctxt "field:purchase.product_supplier.price,rec_name:"
 msgid "Name"
 msgstr "Naam bijlage"
 
 #, fuzzy
-msgctxt "field:purchase.product_supplier.price,unit_price:0"
+msgctxt "field:purchase.product_supplier.price,unit_price:"
 msgid "Unit Price"
 msgstr "Eenheidsprijs"
 
+msgctxt "field:purchase.product_supplier.price,write_date:"
+msgid "Write Date"
+msgstr ""
+
+msgctxt "field:purchase.product_supplier.price,write_uid:"
+msgid "Write User"
+msgstr ""
+
 #, fuzzy
-msgctxt "field:purchase.purchase,comment:0"
+msgctxt "field:purchase.purchase,comment:"
 msgid "Comment"
 msgstr "Opmerking"
 
 #, fuzzy
-msgctxt "field:purchase.purchase,company:0"
+msgctxt "field:purchase.purchase,company:"
 msgid "Company"
 msgstr "Bedrijf"
 
+msgctxt "field:purchase.purchase,create_date:"
+msgid "Create Date"
+msgstr ""
+
+msgctxt "field:purchase.purchase,create_uid:"
+msgid "Create User"
+msgstr ""
+
 #, fuzzy
-msgctxt "field:purchase.purchase,currency:0"
+msgctxt "field:purchase.purchase,currency:"
 msgid "Currency"
 msgstr "Valuta"
 
 #, fuzzy
-msgctxt "field:purchase.purchase,currency_digits:0"
+msgctxt "field:purchase.purchase,currency_digits:"
 msgid "Currency Digits"
 msgstr "Valuta decimalen"
 
 #, fuzzy
-msgctxt "field:purchase.purchase,description:0"
+msgctxt "field:purchase.purchase,description:"
 msgid "Description"
 msgstr "Specificatie"
 
+msgctxt "field:purchase.purchase,id:"
+msgid "ID"
+msgstr ""
+
 #, fuzzy
-msgctxt "field:purchase.purchase,invoice_address:0"
+msgctxt "field:purchase.purchase,invoice_address:"
 msgid "Invoice Address"
 msgstr "Factuuradres"
 
 #, fuzzy
-msgctxt "field:purchase.purchase,invoice_exception:0"
-msgid "Invoices Exception"
-msgstr "Facturen uitzondering"
-
-#, fuzzy
-msgctxt "field:purchase.purchase,invoice_method:0"
+msgctxt "field:purchase.purchase,invoice_method:"
 msgid "Invoice Method"
 msgstr "Factuur afhandeling"
 
 #, fuzzy
-msgctxt "field:purchase.purchase,invoice_paid:0"
-msgid "Invoices Paid"
-msgstr "Facturen betaald"
-
-#, fuzzy
-msgctxt "field:purchase.purchase,invoice_state:0"
+msgctxt "field:purchase.purchase,invoice_state:"
 msgid "Invoice State"
 msgstr "Factuur status"
 
 #, fuzzy
-msgctxt "field:purchase.purchase,invoices:0"
+msgctxt "field:purchase.purchase,invoices:"
 msgid "Invoices"
 msgstr "Verkoopfacturen"
 
 #, fuzzy
-msgctxt "field:purchase.purchase,invoices_ignored:0"
+msgctxt "field:purchase.purchase,invoices_ignored:"
 msgid "Ignored Invoices"
 msgstr "Genegeerde facturen"
 
 #, fuzzy
-msgctxt "field:purchase.purchase,invoices_recreated:0"
+msgctxt "field:purchase.purchase,invoices_recreated:"
 msgid "Recreated Invoices"
 msgstr "Opnieuw aangemaakte facturen"
 
 #, fuzzy
-msgctxt "field:purchase.purchase,lines:0"
+msgctxt "field:purchase.purchase,lines:"
 msgid "Lines"
 msgstr "Regels"
 
 #, fuzzy
-msgctxt "field:purchase.purchase,moves:0"
+msgctxt "field:purchase.purchase,moves:"
 msgid "Moves"
 msgstr "Boekingen"
 
 #, fuzzy
-msgctxt "field:purchase.purchase,party:0"
+msgctxt "field:purchase.purchase,party:"
 msgid "Party"
 msgstr "Relaties"
 
 #, fuzzy
-msgctxt "field:purchase.purchase,party_lang:0"
+msgctxt "field:purchase.purchase,party_lang:"
 msgid "Party Language"
 msgstr "Taal relatie"
 
 #, fuzzy
-msgctxt "field:purchase.purchase,payment_term:0"
+msgctxt "field:purchase.purchase,payment_term:"
 msgid "Payment Term"
 msgstr "Betalingstermijn"
 
-msgctxt "field:purchase.purchase,purchase_date:0"
+msgctxt "field:purchase.purchase,purchase_date:"
 msgid "Purchase Date"
 msgstr ""
 
 #, fuzzy
-msgctxt "field:purchase.purchase,rec_name:0"
+msgctxt "field:purchase.purchase,rec_name:"
 msgid "Name"
 msgstr "Naam bijlage"
 
 #, fuzzy
-msgctxt "field:purchase.purchase,reference:0"
+msgctxt "field:purchase.purchase,reference:"
 msgid "Reference"
 msgstr "Referentie"
 
 #, fuzzy
-msgctxt "field:purchase.purchase,shipment_done:0"
-msgid "Shipment Done"
-msgstr "Afgeleverd"
-
-#, fuzzy
-msgctxt "field:purchase.purchase,shipment_exception:0"
-msgid "Shipments Exception"
-msgstr "Leveringen uitzonderingen"
-
-#, fuzzy
-msgctxt "field:purchase.purchase,shipment_state:0"
+msgctxt "field:purchase.purchase,shipment_state:"
 msgid "Shipment State"
 msgstr "Levering status"
 
 #, fuzzy
-msgctxt "field:purchase.purchase,shipments:0"
+msgctxt "field:purchase.purchase,shipments:"
 msgid "Shipments"
 msgstr "Leveringen"
 
 #, fuzzy
-msgctxt "field:purchase.purchase,state:0"
+msgctxt "field:purchase.purchase,state:"
 msgid "State"
 msgstr "Status"
 
-msgctxt "field:purchase.purchase,supplier_reference:0"
+msgctxt "field:purchase.purchase,supplier_reference:"
 msgid "Supplier Reference"
 msgstr ""
 
 #, fuzzy
-msgctxt "field:purchase.purchase,tax_amount:0"
+msgctxt "field:purchase.purchase,tax_amount:"
 msgid "Tax"
 msgstr "Belasting"
 
+msgctxt "field:purchase.purchase,tax_amount_cache:"
+msgid "Tax Cache"
+msgstr ""
+
 #, fuzzy
-msgctxt "field:purchase.purchase,total_amount:0"
+msgctxt "field:purchase.purchase,total_amount:"
 msgid "Total"
 msgstr "Totaal"
 
+msgctxt "field:purchase.purchase,total_amount_cache:"
+msgid "Total Cache"
+msgstr ""
+
 #, fuzzy
-msgctxt "field:purchase.purchase,untaxed_amount:0"
+msgctxt "field:purchase.purchase,untaxed_amount:"
 msgid "Untaxed"
 msgstr "Onbelast"
 
+msgctxt "field:purchase.purchase,untaxed_amount_cache:"
+msgid "Untaxed Cache"
+msgstr ""
+
 #, fuzzy
-msgctxt "field:purchase.purchase,warehouse:0"
+msgctxt "field:purchase.purchase,warehouse:"
 msgid "Warehouse"
 msgstr "Magazijn"
 
+msgctxt "field:purchase.purchase,write_date:"
+msgid "Write Date"
+msgstr ""
+
+msgctxt "field:purchase.purchase,write_uid:"
+msgid "Write User"
+msgstr ""
+
+msgctxt "field:purchase.purchase-account.invoice,create_date:"
+msgid "Create Date"
+msgstr ""
+
+msgctxt "field:purchase.purchase-account.invoice,create_uid:"
+msgid "Create User"
+msgstr ""
+
+msgctxt "field:purchase.purchase-account.invoice,id:"
+msgid "ID"
+msgstr ""
+
 #, fuzzy
-msgctxt "field:purchase.purchase-account.invoice,invoice:0"
+msgctxt "field:purchase.purchase-account.invoice,invoice:"
 msgid "Invoice"
 msgstr "Verkoopfactuur"
 
-msgctxt "field:purchase.purchase-account.invoice,purchase:0"
+msgctxt "field:purchase.purchase-account.invoice,purchase:"
 msgid "Purchase"
 msgstr ""
 
 #, fuzzy
-msgctxt "field:purchase.purchase-account.invoice,rec_name:0"
+msgctxt "field:purchase.purchase-account.invoice,rec_name:"
 msgid "Name"
 msgstr "Naam bijlage"
 
+msgctxt "field:purchase.purchase-account.invoice,write_date:"
+msgid "Write Date"
+msgstr ""
+
+msgctxt "field:purchase.purchase-account.invoice,write_uid:"
+msgid "Write User"
+msgstr ""
+
+msgctxt "field:purchase.purchase-ignored-account.invoice,create_date:"
+msgid "Create Date"
+msgstr ""
+
+msgctxt "field:purchase.purchase-ignored-account.invoice,create_uid:"
+msgid "Create User"
+msgstr ""
+
+msgctxt "field:purchase.purchase-ignored-account.invoice,id:"
+msgid "ID"
+msgstr ""
+
 #, fuzzy
-msgctxt "field:purchase.purchase-ignored-account.invoice,invoice:0"
+msgctxt "field:purchase.purchase-ignored-account.invoice,invoice:"
 msgid "Invoice"
 msgstr "Verkoopfactuur"
 
-msgctxt "field:purchase.purchase-ignored-account.invoice,purchase:0"
+msgctxt "field:purchase.purchase-ignored-account.invoice,purchase:"
 msgid "Purchase"
 msgstr ""
 
 #, fuzzy
-msgctxt "field:purchase.purchase-ignored-account.invoice,rec_name:0"
+msgctxt "field:purchase.purchase-ignored-account.invoice,rec_name:"
 msgid "Name"
 msgstr "Naam bijlage"
 
+msgctxt "field:purchase.purchase-ignored-account.invoice,write_date:"
+msgid "Write Date"
+msgstr ""
+
+msgctxt "field:purchase.purchase-ignored-account.invoice,write_uid:"
+msgid "Write User"
+msgstr ""
+
+msgctxt "field:purchase.purchase-recreated-account.invoice,create_date:"
+msgid "Create Date"
+msgstr ""
+
+msgctxt "field:purchase.purchase-recreated-account.invoice,create_uid:"
+msgid "Create User"
+msgstr ""
+
+msgctxt "field:purchase.purchase-recreated-account.invoice,id:"
+msgid "ID"
+msgstr ""
+
 #, fuzzy
-msgctxt "field:purchase.purchase-recreated-account.invoice,invoice:0"
+msgctxt "field:purchase.purchase-recreated-account.invoice,invoice:"
 msgid "Invoice"
 msgstr "Verkoopfactuur"
 
-msgctxt "field:purchase.purchase-recreated-account.invoice,purchase:0"
+msgctxt "field:purchase.purchase-recreated-account.invoice,purchase:"
 msgid "Purchase"
 msgstr ""
 
 #, fuzzy
-msgctxt "field:purchase.purchase-recreated-account.invoice,rec_name:0"
+msgctxt "field:purchase.purchase-recreated-account.invoice,rec_name:"
 msgid "Name"
 msgstr "Naam bijlage"
 
-msgctxt "field:stock.move,purchase:0"
+msgctxt "field:purchase.purchase-recreated-account.invoice,write_date:"
+msgid "Write Date"
+msgstr ""
+
+msgctxt "field:purchase.purchase-recreated-account.invoice,write_uid:"
+msgid "Write User"
+msgstr ""
+
+msgctxt "field:stock.move,purchase:"
 msgid "Purchase"
 msgstr ""
 
-msgctxt "field:stock.move,purchase_currency:0"
+msgctxt "field:stock.move,purchase_currency:"
 msgid "Purchase Currency"
 msgstr ""
 
 #, fuzzy
-msgctxt "field:stock.move,purchase_exception_state:0"
+msgctxt "field:stock.move,purchase_exception_state:"
 msgid "Exception State"
 msgstr "Uitzonderingstoestand"
 
-msgctxt "field:stock.move,purchase_line:0"
+msgctxt "field:stock.move,purchase_line:"
 msgid "Purchase Line"
 msgstr ""
 
-msgctxt "field:stock.move,purchase_quantity:0"
+msgctxt "field:stock.move,purchase_quantity:"
 msgid "Purchase Quantity"
 msgstr ""
 
-msgctxt "field:stock.move,purchase_unit:0"
+msgctxt "field:stock.move,purchase_unit:"
 msgid "Purchase Unit"
 msgstr ""
 
-msgctxt "field:stock.move,purchase_unit_digits:0"
+msgctxt "field:stock.move,purchase_unit_digits:"
 msgid "Purchase Unit Digits"
 msgstr ""
 
-msgctxt "field:stock.move,purchase_unit_price:0"
+msgctxt "field:stock.move,purchase_unit_price:"
 msgid "Purchase Unit Price"
 msgstr ""
 
-msgctxt "field:stock.move,purchase_visible:0"
+msgctxt "field:stock.move,purchase_visible:"
 msgid "Purchase Visible"
 msgstr ""
 
 #, fuzzy
-msgctxt "field:stock.move,supplier:0"
+msgctxt "field:stock.move,supplier:"
 msgid "Supplier"
 msgstr "Leverancier"
 
 #, fuzzy
-msgctxt "help:purchase.handle.invoice.exception.ask,recreate_invoices:0"
+msgctxt "help:purchase.handle.invoice.exception.ask,recreate_invoices:"
 msgid ""
 "The selected invoices will be recreated. The other ones will be ignored."
 msgstr ""
 "De geselecteerde facturen worden opnieuw aangemaakt. De rest wordt "
 "genegeerd."
 
-msgctxt "help:purchase.handle.shipment.exception.ask,recreate_moves:0"
+msgctxt "help:purchase.handle.shipment.exception.ask,recreate_moves:"
 msgid "The selected moves will be recreated. The other ones will be ignored."
 msgstr ""
 
-msgctxt "help:purchase.product_supplier,delivery_time:0"
+msgctxt "help:purchase.product_supplier,delivery_time:"
 msgid "In number of days"
 msgstr ""
 
-msgctxt "help:purchase.product_supplier.price,quantity:0"
+msgctxt "help:purchase.product_supplier.price,quantity:"
 msgid "Minimal quantity"
 msgstr ""
 
@@ -666,61 +935,61 @@ msgctxt "model:ir.ui.menu,name:menu_supplier"
 msgid "Parties associated to Purchases"
 msgstr ""
 
-msgctxt "model:purchase.configuration,name:0"
+msgctxt "model:purchase.configuration,name:"
 msgid "Purchase Configuration"
 msgstr ""
 
 #, fuzzy
-msgctxt "model:purchase.handle.invoice.exception.ask,name:0"
-msgid "Invoice Exception Ask"
+msgctxt "model:purchase.handle.invoice.exception.ask,name:"
+msgid "Handle Invoice Exception"
 msgstr "Factuur uitzondering vragen"
 
 #, fuzzy
-msgctxt "model:purchase.handle.shipment.exception.ask,name:0"
-msgid "Shipment Exception Ask"
+msgctxt "model:purchase.handle.shipment.exception.ask,name:"
+msgid "Handle Shipment Exception"
 msgstr "Afleveren uitzondering vragen"
 
-msgctxt "model:purchase.line,name:0"
+msgctxt "model:purchase.line,name:"
 msgid "Purchase Line"
 msgstr ""
 
-msgctxt "model:purchase.line-account.invoice.line,name:0"
+msgctxt "model:purchase.line-account.invoice.line,name:"
 msgid "Purchase Line - Invoice Line"
 msgstr ""
 
-msgctxt "model:purchase.line-account.tax,name:0"
+msgctxt "model:purchase.line-account.tax,name:"
 msgid "Purchase Line - Tax"
 msgstr ""
 
-msgctxt "model:purchase.line-ignored-stock.move,name:0"
+msgctxt "model:purchase.line-ignored-stock.move,name:"
 msgid "Purchase Line - Ignored Move"
 msgstr ""
 
-msgctxt "model:purchase.line-recreated-stock.move,name:0"
+msgctxt "model:purchase.line-recreated-stock.move,name:"
 msgid "Purchase Line - Ignored Move"
 msgstr ""
 
-msgctxt "model:purchase.product_supplier,name:0"
+msgctxt "model:purchase.product_supplier,name:"
 msgid "Product Supplier"
 msgstr ""
 
-msgctxt "model:purchase.product_supplier.price,name:0"
+msgctxt "model:purchase.product_supplier.price,name:"
 msgid "Product Supplier Price"
 msgstr ""
 
-msgctxt "model:purchase.purchase,name:0"
+msgctxt "model:purchase.purchase,name:"
 msgid "Purchase"
 msgstr ""
 
-msgctxt "model:purchase.purchase-account.invoice,name:0"
+msgctxt "model:purchase.purchase-account.invoice,name:"
 msgid "Purchase - Invoice"
 msgstr ""
 
-msgctxt "model:purchase.purchase-ignored-account.invoice,name:0"
+msgctxt "model:purchase.purchase-ignored-account.invoice,name:"
 msgid "Purchase - Ignored Invoice"
 msgstr ""
 
-msgctxt "model:purchase.purchase-recreated-account.invoice,name:0"
+msgctxt "model:purchase.purchase-recreated-account.invoice,name:"
 msgid "Purchase - Recreated Invoice"
 msgstr ""
 
@@ -732,481 +1001,400 @@ msgctxt "model:res.group,name:group_purchase_admin"
 msgid "Purchase Administrator"
 msgstr ""
 
-msgctxt "model:workflow,name:purchase_workflow"
-msgid "Purchase workflow"
-msgstr ""
-
-#, fuzzy
-msgctxt "model:workflow.activity,name:purchase_activity_cancel"
-msgid "Canceled"
-msgstr "Geannuleerd"
-
-#, fuzzy
-msgctxt "model:workflow.activity,name:purchase_activity_confirmed"
-msgid "Confirmed"
-msgstr "Bevestigd"
-
-#, fuzzy
-msgctxt "model:workflow.activity,name:purchase_activity_done"
-msgid "Done"
-msgstr "Klaar"
-
-#, fuzzy
-msgctxt "model:workflow.activity,name:purchase_activity_draft"
-msgid "Draft"
-msgstr "Concept"
-
-#, fuzzy
-msgctxt "model:workflow.activity,name:purchase_activity_invoice_done"
-msgid "Invoice Done"
-msgstr "Factuur klaar"
-
-#, fuzzy
-msgctxt "model:workflow.activity,name:purchase_activity_invoice_method"
-msgid "Invoice Method"
-msgstr "Factuur afhandeling"
-
-#, fuzzy
-msgctxt "model:workflow.activity,name:purchase_activity_invoice_method_done"
-msgid "Invoice Method Done"
-msgstr "Factuur afhandeling klaar"
-
-#, fuzzy
-msgctxt ""
-"model:workflow.activity,name:purchase_activity_invoice_purchase_exception"
-msgid "Invoice Exception"
-msgstr "Factuur uitzondering"
-
-#, fuzzy
-msgctxt "model:workflow.activity,name:purchase_activity_invoice_shipment"
-msgid "Invoice Shipment"
-msgstr "Factuur zending"
-
 #, fuzzy
-msgctxt "model:workflow.activity,name:purchase_activity_invoice_shipment_done"
-msgid "Invoice Shipment Done"
-msgstr "Factuur zending klaar"
-
-#, fuzzy
-msgctxt ""
-"model:workflow.activity,name:purchase_activity_invoice_shipment_exception"
-msgid "Invoice Shipment Exception"
-msgstr "Factuur zending uitzondering"
-
-#, fuzzy
-msgctxt ""
-"model:workflow.activity,name:purchase_activity_invoice_shipment_method"
-msgid "Invoice Shipment Method"
-msgstr "Factuur zending afhandeling"
-
-#, fuzzy
-msgctxt ""
-"model:workflow.activity,name:purchase_activity_invoice_shipment_method_done"
-msgid "Invoice Shipment Method Done"
-msgstr "Factuur zending afhandeling klaar"
-
-#, fuzzy
-msgctxt "model:workflow.activity,name:purchase_activity_quotation"
-msgid "Quotation"
-msgstr "Offerte"
-
-#, fuzzy
-msgctxt "model:workflow.activity,name:purchase_activity_shipment_exception"
-msgid "Shipment Exception"
-msgstr "Afleveren uitzondering"
-
-#, fuzzy
-msgctxt ""
-"model:workflow.activity,name:purchase_activity_waiting_invoice_purchase"
-msgid "Waiting Invoice"
-msgstr "Wacht op factuur"
-
-#, fuzzy
-msgctxt ""
-"model:workflow.activity,name:purchase_activity_waiting_invoice_shipment"
-msgid "Waiting Invoice Shipment"
-msgstr "Wacht op factuur levering"
-
-#, fuzzy
-msgctxt "model:workflow.activity,name:purchase_activity_waiting_shipment"
-msgid "Waiting Shipment"
-msgstr "Wacht op aflevering"
-
-#, fuzzy
-msgctxt "odt:purchase.purchase:0"
+msgctxt "odt:purchase.purchase:"
 msgid "Amount"
 msgstr "Bedrag"
 
 #, fuzzy
-msgctxt "odt:purchase.purchase:0"
+msgctxt "odt:purchase.purchase:"
 msgid "Date:"
 msgstr "Datum:"
 
 #, fuzzy
-msgctxt "odt:purchase.purchase:0"
+msgctxt "odt:purchase.purchase:"
 msgid "Description"
 msgstr "Specificatie"
 
 #, fuzzy
-msgctxt "odt:purchase.purchase:0"
+msgctxt "odt:purchase.purchase:"
 msgid "Description:"
 msgstr "Betreft:"
 
-msgctxt "odt:purchase.purchase:0"
+msgctxt "odt:purchase.purchase:"
 msgid "Draft Purchase Order"
 msgstr ""
 
 #, fuzzy
-msgctxt "odt:purchase.purchase:0"
+msgctxt "odt:purchase.purchase:"
 msgid "E-Mail:"
 msgstr "E-mail:"
 
 #, fuzzy
-msgctxt "odt:purchase.purchase:0"
+msgctxt "odt:purchase.purchase:"
 msgid "Phone:"
 msgstr "Telefoon:"
 
-msgctxt "odt:purchase.purchase:0"
+msgctxt "odt:purchase.purchase:"
 msgid "Purchase Order N°:"
 msgstr ""
 
 #, fuzzy
-msgctxt "odt:purchase.purchase:0"
+msgctxt "odt:purchase.purchase:"
 msgid "Quantity"
 msgstr "Hoeveelheid"
 
-msgctxt "odt:purchase.purchase:0"
+msgctxt "odt:purchase.purchase:"
 msgid "Request for Quotation N°:"
 msgstr ""
 
 #, fuzzy
-msgctxt "odt:purchase.purchase:0"
+msgctxt "odt:purchase.purchase:"
 msgid "Taxes"
 msgstr "Belastingen"
 
 #, fuzzy
-msgctxt "odt:purchase.purchase:0"
+msgctxt "odt:purchase.purchase:"
 msgid "Taxes:"
 msgstr "Belastingen:"
 
 #, fuzzy
-msgctxt "odt:purchase.purchase:0"
+msgctxt "odt:purchase.purchase:"
 msgid "Total (excl. taxes):"
 msgstr "Totaal (excl. belasting):"
 
 #, fuzzy
-msgctxt "odt:purchase.purchase:0"
+msgctxt "odt:purchase.purchase:"
 msgid "Total:"
 msgstr "Totaal:"
 
 #, fuzzy
-msgctxt "odt:purchase.purchase:0"
+msgctxt "odt:purchase.purchase:"
 msgid "Unit Price"
 msgstr "Eenheidsprijs"
 
 #, fuzzy
-msgctxt "odt:purchase.purchase:0"
+msgctxt "odt:purchase.purchase:"
 msgid "VAT Number:"
 msgstr "BTW-nummer:"
 
 #, fuzzy
-msgctxt "odt:purchase.purchase:0"
+msgctxt "odt:purchase.purchase:"
 msgid "VAT:"
 msgstr "BTW:"
 
-msgctxt "selection:account.invoice,purchase_exception_state:0"
+msgctxt "selection:account.invoice,purchase_exception_state:"
 msgid ""
 msgstr ""
 
 #, fuzzy
-msgctxt "selection:account.invoice,purchase_exception_state:0"
+msgctxt "selection:account.invoice,purchase_exception_state:"
 msgid "Ignored"
 msgstr "Genegeerd"
 
 #, fuzzy
-msgctxt "selection:account.invoice,purchase_exception_state:0"
+msgctxt "selection:account.invoice,purchase_exception_state:"
 msgid "Recreated"
 msgstr "Opnieuw aangemaakt"
 
-msgctxt "selection:purchase.configuration,purchase_invoice_method:0"
+msgctxt "selection:purchase.configuration,purchase_invoice_method:"
 msgid "Based On Order"
 msgstr ""
 
-msgctxt "selection:purchase.configuration,purchase_invoice_method:0"
+msgctxt "selection:purchase.configuration,purchase_invoice_method:"
 msgid "Based On Shipment"
 msgstr ""
 
 #, fuzzy
-msgctxt "selection:purchase.configuration,purchase_invoice_method:0"
+msgctxt "selection:purchase.configuration,purchase_invoice_method:"
 msgid "Manual"
 msgstr "Handmatig"
 
 #, fuzzy
-msgctxt "selection:purchase.line,type:0"
+msgctxt "selection:purchase.line,type:"
 msgid "Comment"
 msgstr "Opmerking"
 
 #, fuzzy
-msgctxt "selection:purchase.line,type:0"
+msgctxt "selection:purchase.line,type:"
 msgid "Line"
 msgstr "Regel"
 
 #, fuzzy
-msgctxt "selection:purchase.line,type:0"
+msgctxt "selection:purchase.line,type:"
 msgid "Subtotal"
 msgstr "Subtotaal"
 
 #, fuzzy
-msgctxt "selection:purchase.line,type:0"
+msgctxt "selection:purchase.line,type:"
 msgid "Title"
 msgstr "Titel"
 
-msgctxt "selection:purchase.purchase,invoice_method:0"
+msgctxt "selection:purchase.purchase,invoice_method:"
 msgid "Based On Order"
 msgstr ""
 
-msgctxt "selection:purchase.purchase,invoice_method:0"
+msgctxt "selection:purchase.purchase,invoice_method:"
 msgid "Based On Shipment"
 msgstr ""
 
 #, fuzzy
-msgctxt "selection:purchase.purchase,invoice_method:0"
+msgctxt "selection:purchase.purchase,invoice_method:"
 msgid "Manual"
 msgstr "Handmatig"
 
 #, fuzzy
-msgctxt "selection:purchase.purchase,invoice_state:0"
+msgctxt "selection:purchase.purchase,invoice_state:"
 msgid "Exception"
 msgstr "Uitzondering"
 
 #, fuzzy
-msgctxt "selection:purchase.purchase,invoice_state:0"
+msgctxt "selection:purchase.purchase,invoice_state:"
 msgid "None"
 msgstr "Geen"
 
 #, fuzzy
-msgctxt "selection:purchase.purchase,invoice_state:0"
+msgctxt "selection:purchase.purchase,invoice_state:"
 msgid "Paid"
 msgstr "Betaald"
 
 #, fuzzy
-msgctxt "selection:purchase.purchase,invoice_state:0"
+msgctxt "selection:purchase.purchase,invoice_state:"
 msgid "Waiting"
 msgstr "In afwachting"
 
 #, fuzzy
-msgctxt "selection:purchase.purchase,shipment_state:0"
+msgctxt "selection:purchase.purchase,shipment_state:"
 msgid "Exception"
 msgstr "Uitzondering"
 
 #, fuzzy
-msgctxt "selection:purchase.purchase,shipment_state:0"
+msgctxt "selection:purchase.purchase,shipment_state:"
 msgid "None"
 msgstr "Geen"
 
-msgctxt "selection:purchase.purchase,shipment_state:0"
+msgctxt "selection:purchase.purchase,shipment_state:"
 msgid "Received"
 msgstr ""
 
 #, fuzzy
-msgctxt "selection:purchase.purchase,shipment_state:0"
+msgctxt "selection:purchase.purchase,shipment_state:"
 msgid "Waiting"
 msgstr "In afwachting"
 
 #, fuzzy
-msgctxt "selection:purchase.purchase,state:0"
+msgctxt "selection:purchase.purchase,state:"
 msgid "Canceled"
 msgstr "Geannuleerd"
 
 #, fuzzy
-msgctxt "selection:purchase.purchase,state:0"
+msgctxt "selection:purchase.purchase,state:"
 msgid "Confirmed"
 msgstr "Bevestigd"
 
 #, fuzzy
-msgctxt "selection:purchase.purchase,state:0"
+msgctxt "selection:purchase.purchase,state:"
 msgid "Done"
 msgstr "Klaar"
 
 #, fuzzy
-msgctxt "selection:purchase.purchase,state:0"
+msgctxt "selection:purchase.purchase,state:"
 msgid "Draft"
 msgstr "Concept"
 
 #, fuzzy
-msgctxt "selection:purchase.purchase,state:0"
+msgctxt "selection:purchase.purchase,state:"
 msgid "Quotation"
 msgstr "Offerte"
 
-msgctxt "selection:stock.move,purchase_exception_state:0"
+msgctxt "selection:stock.move,purchase_exception_state:"
 msgid ""
 msgstr ""
 
 #, fuzzy
-msgctxt "selection:stock.move,purchase_exception_state:0"
+msgctxt "selection:stock.move,purchase_exception_state:"
 msgid "Ignored"
 msgstr "Genegeerd"
 
 #, fuzzy
-msgctxt "selection:stock.move,purchase_exception_state:0"
+msgctxt "selection:stock.move,purchase_exception_state:"
 msgid "Recreated"
 msgstr "Opnieuw aangemaakt"
 
-msgctxt "view:product.template:0"
+#, fuzzy
+msgctxt "view:product.product:"
+msgid "Products"
+msgstr "Producten"
+
+msgctxt "view:product.template:"
 msgid "Product Suppliers"
 msgstr ""
 
-msgctxt "view:product.template:0"
+msgctxt "view:product.template:"
 msgid "Suppliers"
 msgstr ""
 
-msgctxt "view:purchase.configuration:0"
+msgctxt "view:purchase.configuration:"
 msgid "Purchase Configuration"
 msgstr ""
 
 #, fuzzy
-msgctxt "view:purchase.handle.invoice.exception.ask:0"
+msgctxt "view:purchase.handle.invoice.exception.ask:"
 msgid "Choose invoices to recreate"
 msgstr "Kies facturen om opnieuw aan te maken"
 
 #, fuzzy
-msgctxt "view:purchase.handle.invoice.exception.ask:0"
+msgctxt "view:purchase.handle.invoice.exception.ask:"
 msgid "Handle Invoice Exception"
 msgstr "Factuuruitzondering afhandelen"
 
 #, fuzzy
-msgctxt "view:purchase.handle.shipment.exception.ask:0"
+msgctxt "view:purchase.handle.shipment.exception.ask:"
 msgid "Choose move to recreate"
 msgstr "Kies boeking om opnieuw aan te maken"
 
 #, fuzzy
-msgctxt "view:purchase.handle.shipment.exception.ask:0"
+msgctxt "view:purchase.handle.shipment.exception.ask:"
 msgid "Handle shipment Exception"
 msgstr "Zendinguitzondering afhandelen"
 
 #, fuzzy
-msgctxt "view:purchase.handle.shipment.exception.ask:0"
+msgctxt "view:purchase.handle.shipment.exception.ask:"
 msgid "Recreated Moves"
 msgstr "Opnieuw aangemaakte boekingen"
 
 #, fuzzy
-msgctxt "view:purchase.line:0"
+msgctxt "view:purchase.line:"
 msgid "General"
 msgstr "Algemeen"
 
 #, fuzzy
-msgctxt "view:purchase.line:0"
+msgctxt "view:purchase.line:"
+msgid "Lines"
+msgstr "Regels"
+
+#, fuzzy
+msgctxt "view:purchase.line:"
 msgid "Notes"
 msgstr "Aantekeningen"
 
 #, fuzzy
-msgctxt "view:purchase.line:0"
+msgctxt "view:purchase.line:"
 msgid "Products"
 msgstr "Producten"
 
-msgctxt "view:purchase.line:0"
+msgctxt "view:purchase.line:"
 msgid "Purchase Line"
 msgstr ""
 
-msgctxt "view:purchase.line:0"
+msgctxt "view:purchase.line:"
 msgid "Purchase Lines"
 msgstr ""
 
-msgctxt "view:purchase.product_supplier.price:0"
+msgctxt "view:purchase.product_supplier.price:"
 msgid "Product Supplier Price"
 msgstr ""
 
-msgctxt "view:purchase.product_supplier.price:0"
+msgctxt "view:purchase.product_supplier.price:"
 msgid "Product Supplier Prices"
 msgstr ""
 
-msgctxt "view:purchase.product_supplier:0"
+msgctxt "view:purchase.product_supplier:"
 msgid "Product Supplier"
 msgstr ""
 
-msgctxt "view:purchase.product_supplier:0"
+msgctxt "view:purchase.product_supplier:"
 msgid "Product Suppliers"
 msgstr ""
 
 #, fuzzy
-msgctxt "view:purchase.purchase:0"
+msgctxt "view:purchase.purchase:"
 msgid "Cancel"
 msgstr "Annuleren"
 
 #, fuzzy
-msgctxt "view:purchase.purchase:0"
+msgctxt "view:purchase.purchase:"
 msgid "Confirm"
 msgstr "Bevestig"
 
 #, fuzzy
-msgctxt "view:purchase.purchase:0"
+msgctxt "view:purchase.purchase:"
 msgid "Draft"
 msgstr "Concept"
 
 #, fuzzy
-msgctxt "view:purchase.purchase:0"
+msgctxt "view:purchase.purchase:"
 msgid "Handle Invoice Exception"
 msgstr "Factuuruitzondering afhandelen"
 
 #, fuzzy
-msgctxt "view:purchase.purchase:0"
+msgctxt "view:purchase.purchase:"
 msgid "Handle Shipment Exception"
 msgstr "Zendinguitzondering afhandelen"
 
 #, fuzzy
-msgctxt "view:purchase.purchase:0"
+msgctxt "view:purchase.purchase:"
 msgid "Invoices"
 msgstr "Verkoopfacturen"
 
 #, fuzzy
-msgctxt "view:purchase.purchase:0"
+msgctxt "view:purchase.purchase:"
 msgid "Lines"
 msgstr "Regels"
 
 #, fuzzy
-msgctxt "view:purchase.purchase:0"
+msgctxt "view:purchase.purchase:"
 msgid "Moves"
 msgstr "Boekingen"
 
 #, fuzzy
-msgctxt "view:purchase.purchase:0"
+msgctxt "view:purchase.purchase:"
 msgid "Other Info"
 msgstr "Aanvullende informatie"
 
-msgctxt "view:purchase.purchase:0"
+msgctxt "view:purchase.purchase:"
 msgid "Purchase"
 msgstr ""
 
-msgctxt "view:purchase.purchase:0"
+msgctxt "view:purchase.purchase:"
 msgid "Purchases"
 msgstr ""
 
 #, fuzzy
-msgctxt "view:purchase.purchase:0"
+msgctxt "view:purchase.purchase:"
 msgid "Quotation"
 msgstr "Offerte"
 
+msgctxt "view:purchase.purchase:"
+msgid "Quote"
+msgstr ""
+
 #, fuzzy
-msgctxt "view:purchase.purchase:0"
+msgctxt "view:purchase.purchase:"
 msgid "Shipments"
 msgstr "Leveringen"
 
 #, fuzzy
-msgctxt "wizard_button:purchase.handle.invoice.exception,init,end:0"
+msgctxt "view:stock.move:"
+msgid "Moves"
+msgstr "Boekingen"
+
+#, fuzzy
+msgctxt "wizard_button:purchase.handle.invoice.exception,ask,end:"
 msgid "Cancel"
 msgstr "Annuleren"
 
 #, fuzzy
-msgctxt "wizard_button:purchase.handle.invoice.exception,init,ok:0"
+msgctxt "wizard_button:purchase.handle.invoice.exception,ask,handle:"
 msgid "Ok"
 msgstr "Oké"
 
 #, fuzzy
-msgctxt "wizard_button:purchase.handle.shipment.exception,init,end:0"
+msgctxt "wizard_button:purchase.handle.shipment.exception,ask,end:"
 msgid "Cancel"
 msgstr "Annuleren"
 
 #, fuzzy
-msgctxt "wizard_button:purchase.handle.shipment.exception,init,ok:0"
+msgctxt "wizard_button:purchase.handle.shipment.exception,ask,handle:"
 msgid "Ok"
 msgstr "Oké"
diff --git a/locale/ru_RU.po b/locale/ru_RU.po
index bbfb0ba..921286a 100644
--- a/locale/ru_RU.po
+++ b/locale/ru_RU.po
@@ -2,528 +2,803 @@
 msgid ""
 msgstr "Content-Type: text/plain; charset=utf-8\n"
 
-msgctxt "error:account.invoice:0"
+msgctxt "error:account.invoice:"
 msgid "You can not delete invoices that come from a purchase!"
 msgstr ""
 
-msgctxt "error:account.invoice:0"
+msgctxt "error:account.invoice:"
 msgid "You cannot reset to draft an invoice generated by a purchase."
 msgstr ""
 
-msgctxt "error:product.template:0"
+msgctxt "error:product.template:"
 msgid ""
 "Purchase prices are based on the purchase uom, are you sure to change it?"
 msgstr ""
 
-msgctxt "error:purchase.line:0"
+msgctxt "error:purchase.line:"
 msgid "It misses an \"Account Expense\" on product \"%s\"!"
 msgstr ""
 
-msgctxt "error:purchase.line:0"
+msgctxt "error:purchase.line:"
 msgid "It misses an \"account expense\" default property!"
 msgstr ""
 
-msgctxt "error:purchase.line:0"
+msgctxt "error:purchase.line:"
 msgid "The supplier location is required!"
 msgstr ""
 
-msgctxt "error:purchase.purchase:0"
+msgctxt "error:purchase.purchase:"
+msgid "A warehouse must be defined for the quotation."
+msgstr ""
+
+msgctxt "error:purchase.purchase:"
 msgid "Invoice addresses must be defined for the quotation."
 msgstr ""
 
-msgctxt "error:purchase.purchase:0"
+msgctxt "error:purchase.purchase:"
 msgid "It misses an \"Account Payable\" on the party \"%s\"!"
 msgstr ""
 
-msgctxt "error:stock.shipment.in:0"
+msgctxt "error:purchase.purchase:"
+msgid "Purchase \"%s\" must be cancelled before deletion!"
+msgstr ""
+
+msgctxt "error:stock.shipment.in:"
 msgid "You cannot reset to draft a move generated by a purchase."
 msgstr ""
 
-msgctxt "field:account.invoice,purchase_exception_state:0"
+msgctxt "field:account.invoice,purchase_exception_state:"
 msgid "Exception State"
 msgstr ""
 
-msgctxt "field:account.invoice,purchases:0"
+msgctxt "field:account.invoice,purchases:"
 msgid "Purchases"
 msgstr ""
 
-msgctxt "field:account.invoice.line,purchase_lines:0"
+msgctxt "field:account.invoice.line,purchase_lines:"
 msgid "Purchase Lines"
 msgstr ""
 
-msgctxt "field:product.template,product_suppliers:0"
+msgctxt "field:product.template,product_suppliers:"
 msgid "Suppliers"
 msgstr ""
 
-msgctxt "field:product.template,purchasable:0"
+msgctxt "field:product.template,purchasable:"
 msgid "Purchasable"
 msgstr ""
 
-msgctxt "field:product.template,purchase_uom:0"
+msgctxt "field:product.template,purchase_uom:"
 msgid "Purchase UOM"
 msgstr ""
 
-msgctxt "field:purchase.configuration,purchase_invoice_method:0"
+msgctxt "field:purchase.configuration,create_date:"
+msgid "Create Date"
+msgstr ""
+
+msgctxt "field:purchase.configuration,create_uid:"
+msgid "Create User"
+msgstr ""
+
+msgctxt "field:purchase.configuration,id:"
+msgid "ID"
+msgstr ""
+
+msgctxt "field:purchase.configuration,purchase_invoice_method:"
 msgid "Invoice Method"
 msgstr ""
 
-msgctxt "field:purchase.configuration,purchase_sequence:0"
+msgctxt "field:purchase.configuration,purchase_sequence:"
 msgid "Purchase Reference Sequence"
 msgstr ""
 
 #, fuzzy
-msgctxt "field:purchase.configuration,rec_name:0"
+msgctxt "field:purchase.configuration,rec_name:"
 msgid "Name"
 msgstr "Наименование"
 
-msgctxt "field:purchase.handle.invoice.exception.ask,domain_invoices:0"
+msgctxt "field:purchase.configuration,write_date:"
+msgid "Write Date"
+msgstr ""
+
+msgctxt "field:purchase.configuration,write_uid:"
+msgid "Write User"
+msgstr ""
+
+msgctxt "field:purchase.handle.invoice.exception.ask,domain_invoices:"
 msgid "Domain Invoices"
 msgstr ""
 
-msgctxt "field:purchase.handle.invoice.exception.ask,recreate_invoices:0"
+msgctxt "field:purchase.handle.invoice.exception.ask,id:"
+msgid "ID"
+msgstr ""
+
+msgctxt "field:purchase.handle.invoice.exception.ask,recreate_invoices:"
 msgid "Recreate Invoices"
 msgstr ""
 
-msgctxt "field:purchase.handle.shipment.exception.ask,domain_moves:0"
+msgctxt "field:purchase.handle.shipment.exception.ask,domain_moves:"
 msgid "Domain Moves"
 msgstr ""
 
-msgctxt "field:purchase.handle.shipment.exception.ask,recreate_moves:0"
+msgctxt "field:purchase.handle.shipment.exception.ask,id:"
+msgid "ID"
+msgstr ""
+
+msgctxt "field:purchase.handle.shipment.exception.ask,recreate_moves:"
 msgid "Recreate Moves"
 msgstr ""
 
-msgctxt "field:purchase.line,amount:0"
+msgctxt "field:purchase.line,amount:"
 msgid "Amount"
 msgstr ""
 
+msgctxt "field:purchase.line,create_date:"
+msgid "Create Date"
+msgstr ""
+
+msgctxt "field:purchase.line,create_uid:"
+msgid "Create User"
+msgstr ""
+
+msgctxt "field:purchase.line,delivery_date:"
+msgid "Delivery Date"
+msgstr ""
+
 #, fuzzy
-msgctxt "field:purchase.line,description:0"
+msgctxt "field:purchase.line,description:"
 msgid "Description"
 msgstr "Описание"
 
-msgctxt "field:purchase.line,invoice_lines:0"
+#, fuzzy
+msgctxt "field:purchase.line,from_location:"
+msgid "From Location"
+msgstr "Из места"
+
+msgctxt "field:purchase.line,id:"
+msgid "ID"
+msgstr ""
+
+msgctxt "field:purchase.line,invoice_lines:"
 msgid "Invoice Lines"
 msgstr ""
 
-msgctxt "field:purchase.line,move_done:0"
+msgctxt "field:purchase.line,move_done:"
 msgid "Moves Done"
 msgstr ""
 
-msgctxt "field:purchase.line,move_exception:0"
+msgctxt "field:purchase.line,move_exception:"
 msgid "Moves Exception"
 msgstr ""
 
 #, fuzzy
-msgctxt "field:purchase.line,moves:0"
+msgctxt "field:purchase.line,moves:"
 msgid "Moves"
 msgstr "Перемещения"
 
-msgctxt "field:purchase.line,moves_ignored:0"
+msgctxt "field:purchase.line,moves_ignored:"
 msgid "Ignored Moves"
 msgstr ""
 
-msgctxt "field:purchase.line,moves_recreated:0"
+msgctxt "field:purchase.line,moves_recreated:"
 msgid "Recreated Moves"
 msgstr ""
 
-msgctxt "field:purchase.line,note:0"
+msgctxt "field:purchase.line,note:"
 msgid "Note"
 msgstr ""
 
 #, fuzzy
-msgctxt "field:purchase.line,product:0"
+msgctxt "field:purchase.line,product:"
 msgid "Product"
 msgstr "Товарно материальные ценности (ТМЦ)"
 
-msgctxt "field:purchase.line,purchase:0"
+msgctxt "field:purchase.line,product_uom_category:"
+msgid "Product Uom Category"
+msgstr ""
+
+msgctxt "field:purchase.line,purchase:"
 msgid "Purchase"
 msgstr ""
 
 #, fuzzy
-msgctxt "field:purchase.line,quantity:0"
+msgctxt "field:purchase.line,quantity:"
 msgid "Quantity"
 msgstr "Кол-во"
 
 #, fuzzy
-msgctxt "field:purchase.line,rec_name:0"
+msgctxt "field:purchase.line,rec_name:"
 msgid "Name"
 msgstr "Наименование"
 
 #, fuzzy
-msgctxt "field:purchase.line,sequence:0"
+msgctxt "field:purchase.line,sequence:"
 msgid "Sequence"
 msgstr "Последовательность"
 
-msgctxt "field:purchase.line,taxes:0"
+msgctxt "field:purchase.line,taxes:"
 msgid "Taxes"
 msgstr ""
 
 #, fuzzy
-msgctxt "field:purchase.line,type:0"
+msgctxt "field:purchase.line,to_location:"
+msgid "To Location"
+msgstr "В место"
+
+#, fuzzy
+msgctxt "field:purchase.line,type:"
 msgid "Type"
 msgstr "Тип"
 
 #, fuzzy
-msgctxt "field:purchase.line,unit:0"
+msgctxt "field:purchase.line,unit:"
 msgid "Unit"
 msgstr "Штука"
 
 #, fuzzy
-msgctxt "field:purchase.line,unit_digits:0"
+msgctxt "field:purchase.line,unit_digits:"
 msgid "Unit Digits"
 msgstr "Группа цифр"
 
 #, fuzzy
-msgctxt "field:purchase.line,unit_price:0"
+msgctxt "field:purchase.line,unit_price:"
 msgid "Unit Price"
 msgstr "Цена за единицу"
 
-msgctxt "field:purchase.line-account.invoice.line,invoice_line:0"
+msgctxt "field:purchase.line,write_date:"
+msgid "Write Date"
+msgstr ""
+
+msgctxt "field:purchase.line,write_uid:"
+msgid "Write User"
+msgstr ""
+
+msgctxt "field:purchase.line-account.invoice.line,create_date:"
+msgid "Create Date"
+msgstr ""
+
+msgctxt "field:purchase.line-account.invoice.line,create_uid:"
+msgid "Create User"
+msgstr ""
+
+msgctxt "field:purchase.line-account.invoice.line,id:"
+msgid "ID"
+msgstr ""
+
+msgctxt "field:purchase.line-account.invoice.line,invoice_line:"
 msgid "Invoice Line"
 msgstr ""
 
-msgctxt "field:purchase.line-account.invoice.line,purchase_line:0"
+msgctxt "field:purchase.line-account.invoice.line,purchase_line:"
 msgid "Purchase Line"
 msgstr ""
 
 #, fuzzy
-msgctxt "field:purchase.line-account.invoice.line,rec_name:0"
+msgctxt "field:purchase.line-account.invoice.line,rec_name:"
 msgid "Name"
 msgstr "Наименование"
 
-msgctxt "field:purchase.line-account.tax,line:0"
+msgctxt "field:purchase.line-account.invoice.line,write_date:"
+msgid "Write Date"
+msgstr ""
+
+msgctxt "field:purchase.line-account.invoice.line,write_uid:"
+msgid "Write User"
+msgstr ""
+
+msgctxt "field:purchase.line-account.tax,create_date:"
+msgid "Create Date"
+msgstr ""
+
+msgctxt "field:purchase.line-account.tax,create_uid:"
+msgid "Create User"
+msgstr ""
+
+msgctxt "field:purchase.line-account.tax,id:"
+msgid "ID"
+msgstr ""
+
+msgctxt "field:purchase.line-account.tax,line:"
 msgid "Purchase Line"
 msgstr ""
 
 #, fuzzy
-msgctxt "field:purchase.line-account.tax,rec_name:0"
+msgctxt "field:purchase.line-account.tax,rec_name:"
 msgid "Name"
 msgstr "Наименование"
 
-msgctxt "field:purchase.line-account.tax,tax:0"
+msgctxt "field:purchase.line-account.tax,tax:"
 msgid "Tax"
 msgstr ""
 
+msgctxt "field:purchase.line-account.tax,write_date:"
+msgid "Write Date"
+msgstr ""
+
+msgctxt "field:purchase.line-account.tax,write_uid:"
+msgid "Write User"
+msgstr ""
+
+msgctxt "field:purchase.line-ignored-stock.move,create_date:"
+msgid "Create Date"
+msgstr ""
+
+msgctxt "field:purchase.line-ignored-stock.move,create_uid:"
+msgid "Create User"
+msgstr ""
+
+msgctxt "field:purchase.line-ignored-stock.move,id:"
+msgid "ID"
+msgstr ""
+
 #, fuzzy
-msgctxt "field:purchase.line-ignored-stock.move,move:0"
+msgctxt "field:purchase.line-ignored-stock.move,move:"
 msgid "Move"
 msgstr "Перемещение"
 
-msgctxt "field:purchase.line-ignored-stock.move,purchase_line:0"
+msgctxt "field:purchase.line-ignored-stock.move,purchase_line:"
 msgid "Purchase Line"
 msgstr ""
 
 #, fuzzy
-msgctxt "field:purchase.line-ignored-stock.move,rec_name:0"
+msgctxt "field:purchase.line-ignored-stock.move,rec_name:"
 msgid "Name"
 msgstr "Наименование"
 
+msgctxt "field:purchase.line-ignored-stock.move,write_date:"
+msgid "Write Date"
+msgstr ""
+
+msgctxt "field:purchase.line-ignored-stock.move,write_uid:"
+msgid "Write User"
+msgstr ""
+
+msgctxt "field:purchase.line-recreated-stock.move,create_date:"
+msgid "Create Date"
+msgstr ""
+
+msgctxt "field:purchase.line-recreated-stock.move,create_uid:"
+msgid "Create User"
+msgstr ""
+
+msgctxt "field:purchase.line-recreated-stock.move,id:"
+msgid "ID"
+msgstr ""
+
 #, fuzzy
-msgctxt "field:purchase.line-recreated-stock.move,move:0"
+msgctxt "field:purchase.line-recreated-stock.move,move:"
 msgid "Move"
 msgstr "Перемещение"
 
-msgctxt "field:purchase.line-recreated-stock.move,purchase_line:0"
+msgctxt "field:purchase.line-recreated-stock.move,purchase_line:"
 msgid "Purchase Line"
 msgstr ""
 
 #, fuzzy
-msgctxt "field:purchase.line-recreated-stock.move,rec_name:0"
+msgctxt "field:purchase.line-recreated-stock.move,rec_name:"
 msgid "Name"
 msgstr "Наименование"
 
+msgctxt "field:purchase.line-recreated-stock.move,write_date:"
+msgid "Write Date"
+msgstr ""
+
+msgctxt "field:purchase.line-recreated-stock.move,write_uid:"
+msgid "Write User"
+msgstr ""
+
 #, fuzzy
-msgctxt "field:purchase.product_supplier,code:0"
+msgctxt "field:purchase.product_supplier,code:"
 msgid "Code"
 msgstr "Код страны"
 
 #, fuzzy
-msgctxt "field:purchase.product_supplier,company:0"
+msgctxt "field:purchase.product_supplier,company:"
 msgid "Company"
 msgstr "Учет.орг."
 
-msgctxt "field:purchase.product_supplier,delivery_time:0"
+msgctxt "field:purchase.product_supplier,create_date:"
+msgid "Create Date"
+msgstr ""
+
+msgctxt "field:purchase.product_supplier,create_uid:"
+msgid "Create User"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:purchase.product_supplier,currency:"
+msgid "Currency"
+msgstr "Валюты"
+
+msgctxt "field:purchase.product_supplier,delivery_time:"
 msgid "Delivery Time"
 msgstr ""
 
+msgctxt "field:purchase.product_supplier,id:"
+msgid "ID"
+msgstr ""
+
 #, fuzzy
-msgctxt "field:purchase.product_supplier,name:0"
+msgctxt "field:purchase.product_supplier,name:"
 msgid "Name"
 msgstr "Наименование"
 
 #, fuzzy
-msgctxt "field:purchase.product_supplier,party:0"
+msgctxt "field:purchase.product_supplier,party:"
 msgid "Supplier"
 msgstr "Поставщик"
 
-msgctxt "field:purchase.product_supplier,prices:0"
+msgctxt "field:purchase.product_supplier,prices:"
 msgid "Prices"
 msgstr ""
 
 #, fuzzy
-msgctxt "field:purchase.product_supplier,product:0"
+msgctxt "field:purchase.product_supplier,product:"
 msgid "Product"
 msgstr "Товарно материальные ценности (ТМЦ)"
 
 #, fuzzy
-msgctxt "field:purchase.product_supplier,rec_name:0"
+msgctxt "field:purchase.product_supplier,rec_name:"
 msgid "Name"
 msgstr "Наименование"
 
 #, fuzzy
-msgctxt "field:purchase.product_supplier,sequence:0"
+msgctxt "field:purchase.product_supplier,sequence:"
 msgid "Sequence"
 msgstr "Последовательность"
 
+msgctxt "field:purchase.product_supplier,write_date:"
+msgid "Write Date"
+msgstr ""
+
+msgctxt "field:purchase.product_supplier,write_uid:"
+msgid "Write User"
+msgstr ""
+
+msgctxt "field:purchase.product_supplier.price,create_date:"
+msgid "Create Date"
+msgstr ""
+
+msgctxt "field:purchase.product_supplier.price,create_uid:"
+msgid "Create User"
+msgstr ""
+
+msgctxt "field:purchase.product_supplier.price,id:"
+msgid "ID"
+msgstr ""
+
 #, fuzzy
-msgctxt "field:purchase.product_supplier.price,product_supplier:0"
+msgctxt "field:purchase.product_supplier.price,product_supplier:"
 msgid "Supplier"
 msgstr "Поставщик"
 
 #, fuzzy
-msgctxt "field:purchase.product_supplier.price,quantity:0"
+msgctxt "field:purchase.product_supplier.price,quantity:"
 msgid "Quantity"
 msgstr "Кол-во"
 
 #, fuzzy
-msgctxt "field:purchase.product_supplier.price,rec_name:0"
+msgctxt "field:purchase.product_supplier.price,rec_name:"
 msgid "Name"
 msgstr "Наименование"
 
 #, fuzzy
-msgctxt "field:purchase.product_supplier.price,unit_price:0"
+msgctxt "field:purchase.product_supplier.price,unit_price:"
 msgid "Unit Price"
 msgstr "Цена за единицу"
 
+msgctxt "field:purchase.product_supplier.price,write_date:"
+msgid "Write Date"
+msgstr ""
+
+msgctxt "field:purchase.product_supplier.price,write_uid:"
+msgid "Write User"
+msgstr ""
+
 #, fuzzy
-msgctxt "field:purchase.purchase,comment:0"
+msgctxt "field:purchase.purchase,comment:"
 msgid "Comment"
 msgstr "Комментарии"
 
 #, fuzzy
-msgctxt "field:purchase.purchase,company:0"
+msgctxt "field:purchase.purchase,company:"
 msgid "Company"
 msgstr "Учет.орг."
 
+msgctxt "field:purchase.purchase,create_date:"
+msgid "Create Date"
+msgstr ""
+
+msgctxt "field:purchase.purchase,create_uid:"
+msgid "Create User"
+msgstr ""
+
 #, fuzzy
-msgctxt "field:purchase.purchase,currency:0"
+msgctxt "field:purchase.purchase,currency:"
 msgid "Currency"
 msgstr "Валюты"
 
-msgctxt "field:purchase.purchase,currency_digits:0"
+msgctxt "field:purchase.purchase,currency_digits:"
 msgid "Currency Digits"
 msgstr ""
 
 #, fuzzy
-msgctxt "field:purchase.purchase,description:0"
+msgctxt "field:purchase.purchase,description:"
 msgid "Description"
 msgstr "Описание"
 
-msgctxt "field:purchase.purchase,invoice_address:0"
-msgid "Invoice Address"
+msgctxt "field:purchase.purchase,id:"
+msgid "ID"
 msgstr ""
 
-msgctxt "field:purchase.purchase,invoice_exception:0"
-msgid "Invoices Exception"
+msgctxt "field:purchase.purchase,invoice_address:"
+msgid "Invoice Address"
 msgstr ""
 
-msgctxt "field:purchase.purchase,invoice_method:0"
+msgctxt "field:purchase.purchase,invoice_method:"
 msgid "Invoice Method"
 msgstr ""
 
-msgctxt "field:purchase.purchase,invoice_paid:0"
-msgid "Invoices Paid"
-msgstr ""
-
-msgctxt "field:purchase.purchase,invoice_state:0"
+msgctxt "field:purchase.purchase,invoice_state:"
 msgid "Invoice State"
 msgstr ""
 
-msgctxt "field:purchase.purchase,invoices:0"
+msgctxt "field:purchase.purchase,invoices:"
 msgid "Invoices"
 msgstr ""
 
-msgctxt "field:purchase.purchase,invoices_ignored:0"
+msgctxt "field:purchase.purchase,invoices_ignored:"
 msgid "Ignored Invoices"
 msgstr ""
 
-msgctxt "field:purchase.purchase,invoices_recreated:0"
+msgctxt "field:purchase.purchase,invoices_recreated:"
 msgid "Recreated Invoices"
 msgstr ""
 
 #, fuzzy
-msgctxt "field:purchase.purchase,lines:0"
+msgctxt "field:purchase.purchase,lines:"
 msgid "Lines"
 msgstr "Строки"
 
 #, fuzzy
-msgctxt "field:purchase.purchase,moves:0"
+msgctxt "field:purchase.purchase,moves:"
 msgid "Moves"
 msgstr "Перемещения"
 
 #, fuzzy
-msgctxt "field:purchase.purchase,party:0"
+msgctxt "field:purchase.purchase,party:"
 msgid "Party"
 msgstr "Организации"
 
-msgctxt "field:purchase.purchase,party_lang:0"
+msgctxt "field:purchase.purchase,party_lang:"
 msgid "Party Language"
 msgstr ""
 
-msgctxt "field:purchase.purchase,payment_term:0"
+msgctxt "field:purchase.purchase,payment_term:"
 msgid "Payment Term"
 msgstr ""
 
-msgctxt "field:purchase.purchase,purchase_date:0"
+msgctxt "field:purchase.purchase,purchase_date:"
 msgid "Purchase Date"
 msgstr ""
 
 #, fuzzy
-msgctxt "field:purchase.purchase,rec_name:0"
+msgctxt "field:purchase.purchase,rec_name:"
 msgid "Name"
 msgstr "Наименование"
 
 #, fuzzy
-msgctxt "field:purchase.purchase,reference:0"
+msgctxt "field:purchase.purchase,reference:"
 msgid "Reference"
 msgstr "Ссылка"
 
-msgctxt "field:purchase.purchase,shipment_done:0"
-msgid "Shipment Done"
-msgstr ""
-
-msgctxt "field:purchase.purchase,shipment_exception:0"
-msgid "Shipments Exception"
-msgstr ""
-
-msgctxt "field:purchase.purchase,shipment_state:0"
+msgctxt "field:purchase.purchase,shipment_state:"
 msgid "Shipment State"
 msgstr ""
 
-msgctxt "field:purchase.purchase,shipments:0"
+msgctxt "field:purchase.purchase,shipments:"
 msgid "Shipments"
 msgstr ""
 
 #, fuzzy
-msgctxt "field:purchase.purchase,state:0"
+msgctxt "field:purchase.purchase,state:"
 msgid "State"
 msgstr "Статус"
 
-msgctxt "field:purchase.purchase,supplier_reference:0"
+msgctxt "field:purchase.purchase,supplier_reference:"
 msgid "Supplier Reference"
 msgstr ""
 
-msgctxt "field:purchase.purchase,tax_amount:0"
+msgctxt "field:purchase.purchase,tax_amount:"
 msgid "Tax"
 msgstr ""
 
-msgctxt "field:purchase.purchase,total_amount:0"
+msgctxt "field:purchase.purchase,tax_amount_cache:"
+msgid "Tax Cache"
+msgstr ""
+
+msgctxt "field:purchase.purchase,total_amount:"
 msgid "Total"
 msgstr ""
 
-msgctxt "field:purchase.purchase,untaxed_amount:0"
+msgctxt "field:purchase.purchase,total_amount_cache:"
+msgid "Total Cache"
+msgstr ""
+
+msgctxt "field:purchase.purchase,untaxed_amount:"
 msgid "Untaxed"
 msgstr ""
 
+msgctxt "field:purchase.purchase,untaxed_amount_cache:"
+msgid "Untaxed Cache"
+msgstr ""
+
 #, fuzzy
-msgctxt "field:purchase.purchase,warehouse:0"
+msgctxt "field:purchase.purchase,warehouse:"
 msgid "Warehouse"
 msgstr "Товарный склад"
 
-msgctxt "field:purchase.purchase-account.invoice,invoice:0"
+msgctxt "field:purchase.purchase,write_date:"
+msgid "Write Date"
+msgstr ""
+
+msgctxt "field:purchase.purchase,write_uid:"
+msgid "Write User"
+msgstr ""
+
+msgctxt "field:purchase.purchase-account.invoice,create_date:"
+msgid "Create Date"
+msgstr ""
+
+msgctxt "field:purchase.purchase-account.invoice,create_uid:"
+msgid "Create User"
+msgstr ""
+
+msgctxt "field:purchase.purchase-account.invoice,id:"
+msgid "ID"
+msgstr ""
+
+msgctxt "field:purchase.purchase-account.invoice,invoice:"
 msgid "Invoice"
 msgstr ""
 
-msgctxt "field:purchase.purchase-account.invoice,purchase:0"
+msgctxt "field:purchase.purchase-account.invoice,purchase:"
 msgid "Purchase"
 msgstr ""
 
 #, fuzzy
-msgctxt "field:purchase.purchase-account.invoice,rec_name:0"
+msgctxt "field:purchase.purchase-account.invoice,rec_name:"
 msgid "Name"
 msgstr "Наименование"
 
-msgctxt "field:purchase.purchase-ignored-account.invoice,invoice:0"
+msgctxt "field:purchase.purchase-account.invoice,write_date:"
+msgid "Write Date"
+msgstr ""
+
+msgctxt "field:purchase.purchase-account.invoice,write_uid:"
+msgid "Write User"
+msgstr ""
+
+msgctxt "field:purchase.purchase-ignored-account.invoice,create_date:"
+msgid "Create Date"
+msgstr ""
+
+msgctxt "field:purchase.purchase-ignored-account.invoice,create_uid:"
+msgid "Create User"
+msgstr ""
+
+msgctxt "field:purchase.purchase-ignored-account.invoice,id:"
+msgid "ID"
+msgstr ""
+
+msgctxt "field:purchase.purchase-ignored-account.invoice,invoice:"
 msgid "Invoice"
 msgstr ""
 
-msgctxt "field:purchase.purchase-ignored-account.invoice,purchase:0"
+msgctxt "field:purchase.purchase-ignored-account.invoice,purchase:"
 msgid "Purchase"
 msgstr ""
 
 #, fuzzy
-msgctxt "field:purchase.purchase-ignored-account.invoice,rec_name:0"
+msgctxt "field:purchase.purchase-ignored-account.invoice,rec_name:"
 msgid "Name"
 msgstr "Наименование"
 
-msgctxt "field:purchase.purchase-recreated-account.invoice,invoice:0"
+msgctxt "field:purchase.purchase-ignored-account.invoice,write_date:"
+msgid "Write Date"
+msgstr ""
+
+msgctxt "field:purchase.purchase-ignored-account.invoice,write_uid:"
+msgid "Write User"
+msgstr ""
+
+msgctxt "field:purchase.purchase-recreated-account.invoice,create_date:"
+msgid "Create Date"
+msgstr ""
+
+msgctxt "field:purchase.purchase-recreated-account.invoice,create_uid:"
+msgid "Create User"
+msgstr ""
+
+msgctxt "field:purchase.purchase-recreated-account.invoice,id:"
+msgid "ID"
+msgstr ""
+
+msgctxt "field:purchase.purchase-recreated-account.invoice,invoice:"
 msgid "Invoice"
 msgstr ""
 
-msgctxt "field:purchase.purchase-recreated-account.invoice,purchase:0"
+msgctxt "field:purchase.purchase-recreated-account.invoice,purchase:"
 msgid "Purchase"
 msgstr ""
 
 #, fuzzy
-msgctxt "field:purchase.purchase-recreated-account.invoice,rec_name:0"
+msgctxt "field:purchase.purchase-recreated-account.invoice,rec_name:"
 msgid "Name"
 msgstr "Наименование"
 
-msgctxt "field:stock.move,purchase:0"
+msgctxt "field:purchase.purchase-recreated-account.invoice,write_date:"
+msgid "Write Date"
+msgstr ""
+
+msgctxt "field:purchase.purchase-recreated-account.invoice,write_uid:"
+msgid "Write User"
+msgstr ""
+
+msgctxt "field:stock.move,purchase:"
 msgid "Purchase"
 msgstr ""
 
-msgctxt "field:stock.move,purchase_currency:0"
+msgctxt "field:stock.move,purchase_currency:"
 msgid "Purchase Currency"
 msgstr ""
 
-msgctxt "field:stock.move,purchase_exception_state:0"
+msgctxt "field:stock.move,purchase_exception_state:"
 msgid "Exception State"
 msgstr ""
 
-msgctxt "field:stock.move,purchase_line:0"
+msgctxt "field:stock.move,purchase_line:"
 msgid "Purchase Line"
 msgstr ""
 
-msgctxt "field:stock.move,purchase_quantity:0"
+msgctxt "field:stock.move,purchase_quantity:"
 msgid "Purchase Quantity"
 msgstr ""
 
-msgctxt "field:stock.move,purchase_unit:0"
+msgctxt "field:stock.move,purchase_unit:"
 msgid "Purchase Unit"
 msgstr ""
 
-msgctxt "field:stock.move,purchase_unit_digits:0"
+msgctxt "field:stock.move,purchase_unit_digits:"
 msgid "Purchase Unit Digits"
 msgstr ""
 
-msgctxt "field:stock.move,purchase_unit_price:0"
+msgctxt "field:stock.move,purchase_unit_price:"
 msgid "Purchase Unit Price"
 msgstr ""
 
-msgctxt "field:stock.move,purchase_visible:0"
+msgctxt "field:stock.move,purchase_visible:"
 msgid "Purchase Visible"
 msgstr ""
 
 #, fuzzy
-msgctxt "field:stock.move,supplier:0"
+msgctxt "field:stock.move,supplier:"
 msgid "Supplier"
 msgstr "Поставщик"
 
-msgctxt "help:purchase.handle.invoice.exception.ask,recreate_invoices:0"
+msgctxt "help:purchase.handle.invoice.exception.ask,recreate_invoices:"
 msgid ""
 "The selected invoices will be recreated. The other ones will be ignored."
 msgstr ""
 
-msgctxt "help:purchase.handle.shipment.exception.ask,recreate_moves:0"
+msgctxt "help:purchase.handle.shipment.exception.ask,recreate_moves:"
 msgid "The selected moves will be recreated. The other ones will be ignored."
 msgstr ""
 
-msgctxt "help:purchase.product_supplier,delivery_time:0"
+msgctxt "help:purchase.product_supplier,delivery_time:"
 msgid "In number of days"
 msgstr ""
 
-msgctxt "help:purchase.product_supplier.price,quantity:0"
+msgctxt "help:purchase.product_supplier.price,quantity:"
 msgid "Minimal quantity"
 msgstr ""
 
@@ -621,59 +896,59 @@ msgctxt "model:ir.ui.menu,name:menu_supplier"
 msgid "Parties associated to Purchases"
 msgstr ""
 
-msgctxt "model:purchase.configuration,name:0"
+msgctxt "model:purchase.configuration,name:"
 msgid "Purchase Configuration"
 msgstr ""
 
-msgctxt "model:purchase.handle.invoice.exception.ask,name:0"
-msgid "Invoice Exception Ask"
+msgctxt "model:purchase.handle.invoice.exception.ask,name:"
+msgid "Handle Invoice Exception"
 msgstr ""
 
-msgctxt "model:purchase.handle.shipment.exception.ask,name:0"
-msgid "Shipment Exception Ask"
+msgctxt "model:purchase.handle.shipment.exception.ask,name:"
+msgid "Handle Shipment Exception"
 msgstr ""
 
-msgctxt "model:purchase.line,name:0"
+msgctxt "model:purchase.line,name:"
 msgid "Purchase Line"
 msgstr ""
 
-msgctxt "model:purchase.line-account.invoice.line,name:0"
+msgctxt "model:purchase.line-account.invoice.line,name:"
 msgid "Purchase Line - Invoice Line"
 msgstr ""
 
-msgctxt "model:purchase.line-account.tax,name:0"
+msgctxt "model:purchase.line-account.tax,name:"
 msgid "Purchase Line - Tax"
 msgstr ""
 
-msgctxt "model:purchase.line-ignored-stock.move,name:0"
+msgctxt "model:purchase.line-ignored-stock.move,name:"
 msgid "Purchase Line - Ignored Move"
 msgstr ""
 
-msgctxt "model:purchase.line-recreated-stock.move,name:0"
+msgctxt "model:purchase.line-recreated-stock.move,name:"
 msgid "Purchase Line - Ignored Move"
 msgstr ""
 
-msgctxt "model:purchase.product_supplier,name:0"
+msgctxt "model:purchase.product_supplier,name:"
 msgid "Product Supplier"
 msgstr ""
 
-msgctxt "model:purchase.product_supplier.price,name:0"
+msgctxt "model:purchase.product_supplier.price,name:"
 msgid "Product Supplier Price"
 msgstr ""
 
-msgctxt "model:purchase.purchase,name:0"
+msgctxt "model:purchase.purchase,name:"
 msgid "Purchase"
 msgstr ""
 
-msgctxt "model:purchase.purchase-account.invoice,name:0"
+msgctxt "model:purchase.purchase-account.invoice,name:"
 msgid "Purchase - Invoice"
 msgstr ""
 
-msgctxt "model:purchase.purchase-ignored-account.invoice,name:0"
+msgctxt "model:purchase.purchase-ignored-account.invoice,name:"
 msgid "Purchase - Ignored Invoice"
 msgstr ""
 
-msgctxt "model:purchase.purchase-recreated-account.invoice,name:0"
+msgctxt "model:purchase.purchase-recreated-account.invoice,name:"
 msgid "Purchase - Recreated Invoice"
 msgstr ""
 
@@ -685,438 +960,369 @@ msgctxt "model:res.group,name:group_purchase_admin"
 msgid "Purchase Administrator"
 msgstr ""
 
-msgctxt "model:workflow,name:purchase_workflow"
-msgid "Purchase workflow"
-msgstr ""
-
-#, fuzzy
-msgctxt "model:workflow.activity,name:purchase_activity_cancel"
-msgid "Canceled"
-msgstr "Отменено"
-
-#, fuzzy
-msgctxt "model:workflow.activity,name:purchase_activity_confirmed"
-msgid "Confirmed"
-msgstr "Подтвержденно"
-
-#, fuzzy
-msgctxt "model:workflow.activity,name:purchase_activity_done"
-msgid "Done"
-msgstr "Выполнено"
-
-#, fuzzy
-msgctxt "model:workflow.activity,name:purchase_activity_draft"
-msgid "Draft"
-msgstr "Черновик"
-
-msgctxt "model:workflow.activity,name:purchase_activity_invoice_done"
-msgid "Invoice Done"
-msgstr ""
-
-msgctxt "model:workflow.activity,name:purchase_activity_invoice_method"
-msgid "Invoice Method"
-msgstr ""
-
-msgctxt "model:workflow.activity,name:purchase_activity_invoice_method_done"
-msgid "Invoice Method Done"
-msgstr ""
-
-msgctxt ""
-"model:workflow.activity,name:purchase_activity_invoice_purchase_exception"
-msgid "Invoice Exception"
-msgstr ""
-
-msgctxt "model:workflow.activity,name:purchase_activity_invoice_shipment"
-msgid "Invoice Shipment"
-msgstr ""
-
-msgctxt "model:workflow.activity,name:purchase_activity_invoice_shipment_done"
-msgid "Invoice Shipment Done"
-msgstr ""
-
-msgctxt ""
-"model:workflow.activity,name:purchase_activity_invoice_shipment_exception"
-msgid "Invoice Shipment Exception"
-msgstr ""
-
-msgctxt ""
-"model:workflow.activity,name:purchase_activity_invoice_shipment_method"
-msgid "Invoice Shipment Method"
-msgstr ""
-
-msgctxt ""
-"model:workflow.activity,name:purchase_activity_invoice_shipment_method_done"
-msgid "Invoice Shipment Method Done"
-msgstr ""
-
-msgctxt "model:workflow.activity,name:purchase_activity_quotation"
-msgid "Quotation"
-msgstr ""
-
-msgctxt "model:workflow.activity,name:purchase_activity_shipment_exception"
-msgid "Shipment Exception"
-msgstr ""
-
-msgctxt ""
-"model:workflow.activity,name:purchase_activity_waiting_invoice_purchase"
-msgid "Waiting Invoice"
-msgstr ""
-
-msgctxt ""
-"model:workflow.activity,name:purchase_activity_waiting_invoice_shipment"
-msgid "Waiting Invoice Shipment"
-msgstr ""
-
-msgctxt "model:workflow.activity,name:purchase_activity_waiting_shipment"
-msgid "Waiting Shipment"
-msgstr ""
-
-msgctxt "odt:purchase.purchase:0"
+msgctxt "odt:purchase.purchase:"
 msgid "Amount"
 msgstr ""
 
 #, fuzzy
-msgctxt "odt:purchase.purchase:0"
+msgctxt "odt:purchase.purchase:"
 msgid "Date:"
 msgstr "Дата:"
 
 #, fuzzy
-msgctxt "odt:purchase.purchase:0"
+msgctxt "odt:purchase.purchase:"
 msgid "Description"
 msgstr "Описание"
 
-msgctxt "odt:purchase.purchase:0"
+msgctxt "odt:purchase.purchase:"
 msgid "Description:"
 msgstr ""
 
-msgctxt "odt:purchase.purchase:0"
+msgctxt "odt:purchase.purchase:"
 msgid "Draft Purchase Order"
 msgstr ""
 
 #, fuzzy
-msgctxt "odt:purchase.purchase:0"
+msgctxt "odt:purchase.purchase:"
 msgid "E-Mail:"
 msgstr "E-Mail:"
 
 #, fuzzy
-msgctxt "odt:purchase.purchase:0"
+msgctxt "odt:purchase.purchase:"
 msgid "Phone:"
 msgstr "Телефон:"
 
-msgctxt "odt:purchase.purchase:0"
+msgctxt "odt:purchase.purchase:"
 msgid "Purchase Order N°:"
 msgstr ""
 
 #, fuzzy
-msgctxt "odt:purchase.purchase:0"
+msgctxt "odt:purchase.purchase:"
 msgid "Quantity"
 msgstr "Кол-во"
 
-msgctxt "odt:purchase.purchase:0"
+msgctxt "odt:purchase.purchase:"
 msgid "Request for Quotation N°:"
 msgstr ""
 
-msgctxt "odt:purchase.purchase:0"
+msgctxt "odt:purchase.purchase:"
 msgid "Taxes"
 msgstr ""
 
-msgctxt "odt:purchase.purchase:0"
+msgctxt "odt:purchase.purchase:"
 msgid "Taxes:"
 msgstr ""
 
-msgctxt "odt:purchase.purchase:0"
+msgctxt "odt:purchase.purchase:"
 msgid "Total (excl. taxes):"
 msgstr ""
 
-msgctxt "odt:purchase.purchase:0"
+msgctxt "odt:purchase.purchase:"
 msgid "Total:"
 msgstr ""
 
 #, fuzzy
-msgctxt "odt:purchase.purchase:0"
+msgctxt "odt:purchase.purchase:"
 msgid "Unit Price"
 msgstr "Цена за единицу"
 
-msgctxt "odt:purchase.purchase:0"
+msgctxt "odt:purchase.purchase:"
 msgid "VAT Number:"
 msgstr ""
 
-msgctxt "odt:purchase.purchase:0"
+msgctxt "odt:purchase.purchase:"
 msgid "VAT:"
 msgstr ""
 
-#, fuzzy
-msgctxt "selection:account.invoice,purchase_exception_state:0"
+msgctxt "selection:account.invoice,purchase_exception_state:"
 msgid ""
-msgstr "Резервный счет"
+msgstr ""
 
-msgctxt "selection:account.invoice,purchase_exception_state:0"
+msgctxt "selection:account.invoice,purchase_exception_state:"
 msgid "Ignored"
 msgstr ""
 
-msgctxt "selection:account.invoice,purchase_exception_state:0"
+msgctxt "selection:account.invoice,purchase_exception_state:"
 msgid "Recreated"
 msgstr ""
 
-msgctxt "selection:purchase.configuration,purchase_invoice_method:0"
+msgctxt "selection:purchase.configuration,purchase_invoice_method:"
 msgid "Based On Order"
 msgstr ""
 
-msgctxt "selection:purchase.configuration,purchase_invoice_method:0"
+msgctxt "selection:purchase.configuration,purchase_invoice_method:"
 msgid "Based On Shipment"
 msgstr ""
 
-msgctxt "selection:purchase.configuration,purchase_invoice_method:0"
+msgctxt "selection:purchase.configuration,purchase_invoice_method:"
 msgid "Manual"
 msgstr ""
 
 #, fuzzy
-msgctxt "selection:purchase.line,type:0"
+msgctxt "selection:purchase.line,type:"
 msgid "Comment"
 msgstr "Комментарии"
 
-msgctxt "selection:purchase.line,type:0"
+msgctxt "selection:purchase.line,type:"
 msgid "Line"
 msgstr ""
 
-msgctxt "selection:purchase.line,type:0"
+msgctxt "selection:purchase.line,type:"
 msgid "Subtotal"
 msgstr ""
 
-msgctxt "selection:purchase.line,type:0"
+msgctxt "selection:purchase.line,type:"
 msgid "Title"
 msgstr ""
 
-msgctxt "selection:purchase.purchase,invoice_method:0"
+msgctxt "selection:purchase.purchase,invoice_method:"
 msgid "Based On Order"
 msgstr ""
 
-msgctxt "selection:purchase.purchase,invoice_method:0"
+msgctxt "selection:purchase.purchase,invoice_method:"
 msgid "Based On Shipment"
 msgstr ""
 
-msgctxt "selection:purchase.purchase,invoice_method:0"
+msgctxt "selection:purchase.purchase,invoice_method:"
 msgid "Manual"
 msgstr ""
 
-msgctxt "selection:purchase.purchase,invoice_state:0"
+msgctxt "selection:purchase.purchase,invoice_state:"
 msgid "Exception"
 msgstr ""
 
 #, fuzzy
-msgctxt "selection:purchase.purchase,invoice_state:0"
+msgctxt "selection:purchase.purchase,invoice_state:"
 msgid "None"
 msgstr "Отсутствует"
 
-msgctxt "selection:purchase.purchase,invoice_state:0"
+msgctxt "selection:purchase.purchase,invoice_state:"
 msgid "Paid"
 msgstr ""
 
 #, fuzzy
-msgctxt "selection:purchase.purchase,invoice_state:0"
+msgctxt "selection:purchase.purchase,invoice_state:"
 msgid "Waiting"
 msgstr "Ожидание"
 
-msgctxt "selection:purchase.purchase,shipment_state:0"
+msgctxt "selection:purchase.purchase,shipment_state:"
 msgid "Exception"
 msgstr ""
 
 #, fuzzy
-msgctxt "selection:purchase.purchase,shipment_state:0"
+msgctxt "selection:purchase.purchase,shipment_state:"
 msgid "None"
 msgstr "Отсутствует"
 
 #, fuzzy
-msgctxt "selection:purchase.purchase,shipment_state:0"
+msgctxt "selection:purchase.purchase,shipment_state:"
 msgid "Received"
 msgstr "Поступило"
 
 #, fuzzy
-msgctxt "selection:purchase.purchase,shipment_state:0"
+msgctxt "selection:purchase.purchase,shipment_state:"
 msgid "Waiting"
 msgstr "Ожидание"
 
 #, fuzzy
-msgctxt "selection:purchase.purchase,state:0"
+msgctxt "selection:purchase.purchase,state:"
 msgid "Canceled"
 msgstr "Отменено"
 
 #, fuzzy
-msgctxt "selection:purchase.purchase,state:0"
+msgctxt "selection:purchase.purchase,state:"
 msgid "Confirmed"
 msgstr "Подтвержденно"
 
 #, fuzzy
-msgctxt "selection:purchase.purchase,state:0"
+msgctxt "selection:purchase.purchase,state:"
 msgid "Done"
 msgstr "Выполнено"
 
 #, fuzzy
-msgctxt "selection:purchase.purchase,state:0"
+msgctxt "selection:purchase.purchase,state:"
 msgid "Draft"
 msgstr "Черновик"
 
-msgctxt "selection:purchase.purchase,state:0"
+msgctxt "selection:purchase.purchase,state:"
 msgid "Quotation"
 msgstr ""
 
-#, fuzzy
-msgctxt "selection:stock.move,purchase_exception_state:0"
+msgctxt "selection:stock.move,purchase_exception_state:"
 msgid ""
-msgstr "Резервный счет"
+msgstr ""
 
-msgctxt "selection:stock.move,purchase_exception_state:0"
+msgctxt "selection:stock.move,purchase_exception_state:"
 msgid "Ignored"
 msgstr ""
 
-msgctxt "selection:stock.move,purchase_exception_state:0"
+msgctxt "selection:stock.move,purchase_exception_state:"
 msgid "Recreated"
 msgstr ""
 
-msgctxt "view:product.template:0"
+#, fuzzy
+msgctxt "view:product.product:"
+msgid "Products"
+msgstr "ТМЦ"
+
+msgctxt "view:product.template:"
 msgid "Product Suppliers"
 msgstr ""
 
-msgctxt "view:product.template:0"
+msgctxt "view:product.template:"
 msgid "Suppliers"
 msgstr ""
 
-msgctxt "view:purchase.configuration:0"
+msgctxt "view:purchase.configuration:"
 msgid "Purchase Configuration"
 msgstr ""
 
-msgctxt "view:purchase.handle.invoice.exception.ask:0"
+msgctxt "view:purchase.handle.invoice.exception.ask:"
 msgid "Choose invoices to recreate"
 msgstr ""
 
-msgctxt "view:purchase.handle.invoice.exception.ask:0"
+msgctxt "view:purchase.handle.invoice.exception.ask:"
 msgid "Handle Invoice Exception"
 msgstr ""
 
-msgctxt "view:purchase.handle.shipment.exception.ask:0"
+msgctxt "view:purchase.handle.shipment.exception.ask:"
 msgid "Choose move to recreate"
 msgstr ""
 
-msgctxt "view:purchase.handle.shipment.exception.ask:0"
+msgctxt "view:purchase.handle.shipment.exception.ask:"
 msgid "Handle shipment Exception"
 msgstr ""
 
-msgctxt "view:purchase.handle.shipment.exception.ask:0"
+msgctxt "view:purchase.handle.shipment.exception.ask:"
 msgid "Recreated Moves"
 msgstr ""
 
 #, fuzzy
-msgctxt "view:purchase.line:0"
+msgctxt "view:purchase.line:"
 msgid "General"
 msgstr "Основной"
 
 #, fuzzy
-msgctxt "view:purchase.line:0"
+msgctxt "view:purchase.line:"
+msgid "Lines"
+msgstr "Строки"
+
+#, fuzzy
+msgctxt "view:purchase.line:"
 msgid "Notes"
 msgstr "Комментарии"
 
 #, fuzzy
-msgctxt "view:purchase.line:0"
+msgctxt "view:purchase.line:"
 msgid "Products"
 msgstr "ТМЦ"
 
-msgctxt "view:purchase.line:0"
+msgctxt "view:purchase.line:"
 msgid "Purchase Line"
 msgstr ""
 
-msgctxt "view:purchase.line:0"
+msgctxt "view:purchase.line:"
 msgid "Purchase Lines"
 msgstr ""
 
-msgctxt "view:purchase.product_supplier.price:0"
+msgctxt "view:purchase.product_supplier.price:"
 msgid "Product Supplier Price"
 msgstr ""
 
-msgctxt "view:purchase.product_supplier.price:0"
+msgctxt "view:purchase.product_supplier.price:"
 msgid "Product Supplier Prices"
 msgstr ""
 
-msgctxt "view:purchase.product_supplier:0"
+msgctxt "view:purchase.product_supplier:"
 msgid "Product Supplier"
 msgstr ""
 
-msgctxt "view:purchase.product_supplier:0"
+msgctxt "view:purchase.product_supplier:"
 msgid "Product Suppliers"
 msgstr ""
 
 #, fuzzy
-msgctxt "view:purchase.purchase:0"
+msgctxt "view:purchase.purchase:"
 msgid "Cancel"
 msgstr "Отменить"
 
 #, fuzzy
-msgctxt "view:purchase.purchase:0"
+msgctxt "view:purchase.purchase:"
 msgid "Confirm"
 msgstr "Подтверждать"
 
 #, fuzzy
-msgctxt "view:purchase.purchase:0"
+msgctxt "view:purchase.purchase:"
 msgid "Draft"
 msgstr "Черновик"
 
-msgctxt "view:purchase.purchase:0"
+msgctxt "view:purchase.purchase:"
 msgid "Handle Invoice Exception"
 msgstr ""
 
-msgctxt "view:purchase.purchase:0"
+msgctxt "view:purchase.purchase:"
 msgid "Handle Shipment Exception"
 msgstr ""
 
-msgctxt "view:purchase.purchase:0"
+msgctxt "view:purchase.purchase:"
 msgid "Invoices"
 msgstr ""
 
 #, fuzzy
-msgctxt "view:purchase.purchase:0"
+msgctxt "view:purchase.purchase:"
 msgid "Lines"
 msgstr "Строки"
 
 #, fuzzy
-msgctxt "view:purchase.purchase:0"
+msgctxt "view:purchase.purchase:"
 msgid "Moves"
 msgstr "Перемещения"
 
-msgctxt "view:purchase.purchase:0"
+msgctxt "view:purchase.purchase:"
 msgid "Other Info"
 msgstr ""
 
-msgctxt "view:purchase.purchase:0"
+msgctxt "view:purchase.purchase:"
 msgid "Purchase"
 msgstr ""
 
-msgctxt "view:purchase.purchase:0"
+msgctxt "view:purchase.purchase:"
 msgid "Purchases"
 msgstr ""
 
-msgctxt "view:purchase.purchase:0"
+msgctxt "view:purchase.purchase:"
 msgid "Quotation"
 msgstr ""
 
-msgctxt "view:purchase.purchase:0"
+msgctxt "view:purchase.purchase:"
+msgid "Quote"
+msgstr ""
+
+msgctxt "view:purchase.purchase:"
 msgid "Shipments"
 msgstr ""
 
 #, fuzzy
-msgctxt "wizard_button:purchase.handle.invoice.exception,init,end:0"
+msgctxt "view:stock.move:"
+msgid "Moves"
+msgstr "Перемещения"
+
+#, fuzzy
+msgctxt "wizard_button:purchase.handle.invoice.exception,ask,end:"
 msgid "Cancel"
 msgstr "Отменить"
 
 #, fuzzy
-msgctxt "wizard_button:purchase.handle.invoice.exception,init,ok:0"
+msgctxt "wizard_button:purchase.handle.invoice.exception,ask,handle:"
 msgid "Ok"
-msgstr "Ок"
+msgstr "Да"
 
 #, fuzzy
-msgctxt "wizard_button:purchase.handle.shipment.exception,init,end:0"
+msgctxt "wizard_button:purchase.handle.shipment.exception,ask,end:"
 msgid "Cancel"
 msgstr "Отменить"
 
 #, fuzzy
-msgctxt "wizard_button:purchase.handle.shipment.exception,init,ok:0"
+msgctxt "wizard_button:purchase.handle.shipment.exception,ask,handle:"
 msgid "Ok"
-msgstr "Ок"
+msgstr "Да"
diff --git a/product.xml b/product.xml
new file mode 100644
index 0000000..e2cf516
--- /dev/null
+++ b/product.xml
@@ -0,0 +1,26 @@
+<?xml version="1.0"?>
+<!-- This file is part of Tryton.  The COPYRIGHT file at the top level of
+this repository contains the full copyright notices and license terms. -->
+<tryton>
+    <data>
+        <record model="ir.ui.view" id="product_view_list_purchase_line">
+            <field name="model">product.product</field>
+            <field name="type">tree</field>
+            <field name="priority" eval="20"/>
+            <field name="arch" type="xml">
+                <![CDATA[
+                <tree string="Products">
+                    <field name="name"/>
+                    <field name="code"/>
+                    <field name="list_price_uom"/>
+                    <field name="cost_price_uom"/>
+                    <field name="quantity"/>
+                    <field name="forecast_quantity"/>
+                    <field name="default_uom"/>
+                    <field name="active"/>
+                </tree>
+                ]]>
+            </field>
+        </record>
+    </data>
+</tryton>
diff --git a/purchase.odt b/purchase.odt
index 8dd2c86..7c6784e 100644
Binary files a/purchase.odt and b/purchase.odt differ
diff --git a/purchase.py b/purchase.py
index 9d3fbb5..49cf25c 100644
--- a/purchase.py
+++ b/purchase.py
@@ -3,13 +3,15 @@
 import datetime
 import copy
 from decimal import Decimal
-from trytond.model import ModelWorkflow, ModelView, ModelSQL, fields
+from trytond.model import Workflow, ModelView, ModelSQL, fields
 from trytond.modules.company import CompanyReport
-from trytond.wizard import Wizard
+from trytond.wizard import Wizard, StateAction, StateView, StateTransition, \
+    Button
 from trytond.backend import TableHandler
 from trytond.pyson import Eval, Bool, If, PYSONEncoder
 from trytond.transaction import Transaction
 from trytond.pool import Pool
+from trytond.config import CONFIG
 
 _STATES = {
     'readonly': Eval('state') != 'draft',
@@ -17,7 +19,7 @@ _STATES = {
 _DEPENDS = ['state']
 
 
-class Purchase(ModelWorkflow, ModelSQL, ModelView):
+class Purchase(Workflow, ModelSQL, ModelView):
     'Purchase'
     _name = 'purchase.purchase'
     _rec_name = 'reference'
@@ -25,15 +27,15 @@ class Purchase(ModelWorkflow, ModelSQL, ModelView):
 
     company = fields.Many2One('company.company', 'Company', required=True,
         states={
-            'readonly': (Eval('state') != 'draft') | Eval('lines'),
+            'readonly': (Eval('state') != 'draft') | Eval('lines', [0]),
             },
         domain=[
             ('id', If(Eval('context', {}).contains('company'), '=', '!='),
                 Eval('context', {}).get('company', 0)),
             ],
-        depends=['state', 'lines'])
-    reference = fields.Char('Reference', size=None, readonly=True, select=1)
-    supplier_reference = fields.Char('Supplier Reference', select=1)
+        depends=['state'], select=True)
+    reference = fields.Char('Reference', size=None, readonly=True, select=True)
+    supplier_reference = fields.Char('Supplier Reference', select=True)
     description = fields.Char('Description', size=None, states=_STATES,
         depends=_DEPENDS)
     state = fields.Selection([
@@ -43,27 +45,31 @@ class Purchase(ModelWorkflow, ModelSQL, ModelView):
         ('done', 'Done'),
         ('cancel', 'Canceled'),
     ], 'State', readonly=True, required=True)
-    purchase_date = fields.Date('Purchase Date', required=True, states=_STATES,
-        depends=_DEPENDS)
+    purchase_date = fields.Date('Purchase Date',
+        states={
+            'readonly': ~Eval('state').in_(['draft', 'quotation']),
+            'required': ~Eval('state').in_(['draft', 'quotation', 'cancel']),
+            },
+        depends=['state'])
     payment_term = fields.Many2One('account.invoice.payment_term',
         'Payment Term', required=True, states=_STATES, depends=_DEPENDS)
-    party = fields.Many2One('party.party', 'Party', change_default=True,
+    party = fields.Many2One('party.party', 'Party',
             required=True, states=_STATES, on_change=['party', 'payment_term'],
-            select=1, depends=_DEPENDS)
+            select=True, depends=_DEPENDS)
     party_lang = fields.Function(fields.Char('Party Language',
         on_change_with=['party']), 'get_function_fields')
     invoice_address = fields.Many2One('party.address', 'Invoice Address',
         domain=[('party', '=', Eval('party'))], states=_STATES,
         depends=['state', 'party'])
     warehouse = fields.Many2One('stock.location', 'Warehouse',
-        domain=[('type', '=', 'warehouse')], required=True, states=_STATES,
+        domain=[('type', '=', 'warehouse')], states=_STATES,
         depends=_DEPENDS)
     currency = fields.Many2One('currency.currency', 'Currency', required=True,
         states={
             'readonly': ((Eval('state') != 'draft')
-                | (Eval('lines') & Eval('currency'))),
+                | (Eval('lines', [0]) & Eval('currency'))),
             },
-        depends=['state', 'lines'])
+        depends=['state'])
     currency_digits = fields.Function(fields.Integer('Currency Digits',
         on_change_with=['currency']), 'get_function_fields')
     lines = fields.One2Many('purchase.line', 'purchase', 'Lines',
@@ -72,13 +78,22 @@ class Purchase(ModelWorkflow, ModelSQL, ModelView):
     comment = fields.Text('Comment')
     untaxed_amount = fields.Function(fields.Numeric('Untaxed',
             digits=(16, Eval('currency_digits', 2)),
-            depends=['currency_digits']), 'get_function_fields')
+            depends=['currency_digits']), 'get_untaxed_amount')
+    untaxed_amount_cache = fields.Numeric('Untaxed Cache',
+        digits=(16, Eval('currency_digits', 2)),
+        depends=['currency_digits'])
     tax_amount = fields.Function(fields.Numeric('Tax',
             digits=(16, Eval('currency_digits', 2)),
-            depends=['currency_digits']), 'get_function_fields')
+            depends=['currency_digits']), 'get_tax_amount')
+    tax_amount_cache = fields.Numeric('Tax Cache',
+        digits=(16, Eval('currency_digits', 2)),
+        depends=['currency_digits'])
     total_amount = fields.Function(fields.Numeric('Total',
             digits=(16, Eval('currency_digits', 2)),
-            depends=['currency_digits']), 'get_function_fields')
+            depends=['currency_digits']), 'get_total_amount')
+    total_amount_cache = fields.Numeric('Total Cache',
+        digits=(16, Eval('currency_digits', 2)),
+        depends=['currency_digits'])
     invoice_method = fields.Selection([
             ('manual', 'Manual'),
             ('order', 'Based On Order'),
@@ -86,11 +101,11 @@ class Purchase(ModelWorkflow, ModelSQL, ModelView):
             ], 'Invoice Method', required=True, states=_STATES,
         depends=_DEPENDS)
     invoice_state = fields.Selection([
-        ('none', 'None'),
-        ('waiting', 'Waiting'),
-        ('paid', 'Paid'),
-        ('exception', 'Exception'),
-    ], 'Invoice State', readonly=True, required=True)
+            ('none', 'None'),
+            ('waiting', 'Waiting'),
+            ('paid', 'Paid'),
+            ('exception', 'Exception'),
+            ], 'Invoice State', readonly=True, required=True)
     invoices = fields.Many2Many('purchase.purchase-account.invoice',
             'purchase', 'invoice', 'Invoices', readonly=True)
     invoices_ignored = fields.Many2Many(
@@ -99,24 +114,16 @@ class Purchase(ModelWorkflow, ModelSQL, ModelView):
     invoices_recreated = fields.Many2Many(
             'purchase.purchase-recreated-account.invoice',
             'purchase', 'invoice', 'Recreated Invoices', readonly=True)
-    invoice_paid = fields.Function(fields.Boolean('Invoices Paid'),
-            'get_function_fields')
-    invoice_exception = fields.Function(fields.Boolean('Invoices Exception'),
-            'get_function_fields')
     shipment_state = fields.Selection([
-        ('none', 'None'),
-        ('waiting', 'Waiting'),
-        ('received', 'Received'),
-        ('exception', 'Exception'),
-    ], 'Shipment State', readonly=True, required=True)
+            ('none', 'None'),
+            ('waiting', 'Waiting'),
+            ('received', 'Received'),
+            ('exception', 'Exception'),
+            ], 'Shipment State', readonly=True, required=True)
     shipments = fields.Function(fields.One2Many('stock.shipment.in', None,
         'Shipments'), 'get_function_fields')
     moves = fields.Function(fields.One2Many('stock.move', None, 'Moves'),
             'get_function_fields')
-    shipment_done = fields.Function(fields.Boolean('Shipment Done'),
-            'get_function_fields')
-    shipment_exception = fields.Function(fields.Boolean('Shipments Exception'),
-            'get_function_fields')
 
     def __init__(self):
         super(Purchase, self).__init__()
@@ -125,9 +132,41 @@ class Purchase(ModelWorkflow, ModelSQL, ModelView):
         self._error_messages.update({
                 'invoice_addresse_required': 'Invoice addresses must be '
                 'defined for the quotation.',
+                'warehouse_required': 'A warehouse must be defined for the ' \
+                    'quotation.',
                 'missing_account_payable': 'It misses ' \
                         'an "Account Payable" on the party "%s"!',
+                'delete_cancel': 'Purchase "%s" must be cancelled before '\
+                    'deletion!',
             })
+        self._transitions |= set((
+                ('draft', 'quotation'),
+                ('quotation', 'confirmed'),
+                ('confirmed', 'confirmed'),
+                ('draft', 'cancel'),
+                ('quotation', 'cancel'),
+                ('quotation', 'draft'),
+                ))
+        self._buttons.update({
+                'cancel': {
+                    'invisible': ((Eval('state') == 'cancel')
+                        | (~Eval('state').in_(['draft', 'quotation'])
+                            & (Eval('invoice_state') != 'exception')
+                            & (Eval('shipment_state') != 'exception'))),
+                    },
+                'draft': {
+                    'invisible': Eval('state') != 'quotation',
+                    },
+                'quote': {
+                    'invisible': Eval('state') != 'draft',
+                    'readonly': ~Eval('lines', []),
+                    },
+                'confirm': {
+                    'invisible': Eval('state') != 'quotation',
+                    },
+                })
+        # The states where amounts are cached
+        self._states_cached = ['confirmed', 'done', 'cancel']
 
     def init(self, module_name):
         cursor = Transaction().cursor
@@ -153,6 +192,13 @@ class Purchase(ModelWorkflow, ModelSQL, ModelView):
                 "SET invoice_method = 'shipment' "\
                 "WHERE invoice_method = 'packing'")
 
+        table = TableHandler(cursor, self, module_name)
+        # Migration from 2.2: warehouse is no more required
+        table.not_null_action('warehouse', 'remove')
+
+        # Migration from 2.2: purchase_date is no more required
+        table.not_null_action('purchase_date', 'remove')
+
         # Add index on create_date
         table = TableHandler(cursor, self, module_name)
         table.index_action('create_date', action='add')
@@ -162,33 +208,25 @@ class Purchase(ModelWorkflow, ModelSQL, ModelView):
         payment_term_ids = payment_term_obj.search(self.payment_term.domain)
         if len(payment_term_ids) == 1:
             return payment_term_ids[0]
-        return False
 
     def default_warehouse(self):
         location_obj = Pool().get('stock.location')
         location_ids = location_obj.search(self.warehouse.domain)
         if len(location_ids) == 1:
             return location_ids[0]
-        return False
 
     def default_company(self):
-        return Transaction().context.get('company') or False
+        return Transaction().context.get('company')
 
     def default_state(self):
         return 'draft'
 
-    def default_purchase_date(self):
-        date_obj = Pool().get('ir.date')
-        return date_obj.today()
-
     def default_currency(self):
         company_obj = Pool().get('company.company')
-        currency_obj = Pool().get('currency.currency')
         company = Transaction().context.get('company')
         if company:
             company = company_obj.browse(company)
             return company.currency.id
-        return False
 
     def default_currency_digits(self):
         company_obj = Pool().get('company.company')
@@ -214,9 +252,13 @@ class Purchase(ModelWorkflow, ModelSQL, ModelView):
         party_obj = pool.get('party.party')
         address_obj = pool.get('party.address')
         payment_term_obj = pool.get('account.invoice.payment_term')
+        currency_obj = pool.get('currency.currency')
+        cursor = Transaction().cursor
         res = {
-            'invoice_address': False,
-            'payment_term': False,
+            'invoice_address': None,
+            'payment_term': None,
+            'currency': self.default_currency(),
+            'currency_digits': self.default_currency_digits(),
         }
         if vals.get('party'):
             party = party_obj.browse(vals['party'])
@@ -225,6 +267,20 @@ class Purchase(ModelWorkflow, ModelSQL, ModelView):
             if party.supplier_payment_term:
                 res['payment_term'] = party.supplier_payment_term.id
 
+            subquery = cursor.limit_clause('SELECT currency '
+                'FROM "' + self._table + '" '
+                'WHERE party = %s '
+                'ORDER BY id DESC', 10)
+            cursor.execute('SELECT currency FROM (' + subquery + ') AS p '
+                'GROUP BY currency '
+                'ORDER BY COUNT(1) DESC', (party.id,))
+            row = cursor.fetchone()
+            if row:
+                currency_id, = row
+                currency = currency_obj.browse(currency_id)
+                res['currency'] = currency.id
+                res['currency_digits'] = currency.digits
+
         if res['invoice_address']:
             res['invoice_address.rec_name'] = address_obj.browse(
                     res['invoice_address']).rec_name
@@ -261,7 +317,7 @@ class Purchase(ModelWorkflow, ModelSQL, ModelView):
             party = party_obj.browse(vals['party'])
             if party.lang:
                 return party.lang.code
-        return 'en_US'
+        return CONFIG['language']
 
     def get_tax_context(self, purchase):
         party_obj = Pool().get('party.party')
@@ -296,7 +352,7 @@ class Purchase(ModelWorkflow, ModelSQL, ModelView):
             for line in vals['lines']:
                 if line.get('type', 'line') != 'line':
                     continue
-                res['untaxed_amount'] += line.get('amount', Decimal('0.0'))
+                res['untaxed_amount'] += line.get('amount') or Decimal(0)
 
                 with Transaction().set_context(context):
                     tax_list = tax_obj.compute(line.get('taxes', []),
@@ -309,8 +365,8 @@ class Purchase(ModelWorkflow, ModelSQL, ModelView):
                     else:
                         taxes[key] += val['amount']
             if currency:
-                for key in taxes:
-                    res['tax_amount'] += currency_obj.round(currency, taxes[key])
+                for value in taxes.itervalues():
+                    res['tax_amount'] += currency_obj.round(currency, value)
         if currency:
             res['untaxed_amount'] = currency_obj.round(currency,
                     res['untaxed_amount'])
@@ -337,24 +393,10 @@ class Purchase(ModelWorkflow, ModelSQL, ModelView):
             res['currency_digits'] = self.get_currency_digits(purchases)
         if 'party_lang' in names:
             res['party_lang'] = self.get_party_lang(purchases)
-        if 'untaxed_amount' in names:
-            res['untaxed_amount'] = self.get_untaxed_amount(purchases)
-        if 'tax_amount' in names:
-            res['tax_amount'] = self.get_tax_amount(purchases)
-        if 'total_amount' in names:
-            res['total_amount'] = self.get_total_amount(purchases)
-        if 'invoice_paid' in names:
-            res['invoice_paid'] = self.get_invoice_paid(purchases)
-        if 'invoice_exception' in names:
-            res['invoice_exception'] = self.get_invoice_exception(purchases)
         if 'shipments' in names:
             res['shipments'] = self.get_shipments(purchases)
         if 'moves' in names:
             res['moves'] = self.get_moves(purchases)
-        if 'shipment_done' in names:
-            res['shipment_done'] = self.get_shipment_done(purchases)
-        if 'shipment_exception' in names:
-            res['shipment_exception'] = self.get_shipment_exception(purchases)
         return res
 
     def get_party_lang(self, purchases):
@@ -370,46 +412,42 @@ class Purchase(ModelWorkflow, ModelSQL, ModelView):
             if purchase.party.lang:
                 res[purchase.id] = purchase.party.lang.code
             else:
-                res[purchase.id] = 'en_US'
+                res[purchase.id] = CONFIG['language']
         return res
 
-    def get_untaxed_amount(self, purchases):
+    def get_untaxed_amount(self, ids, name):
         '''
         Return the untaxed amount for each purchases
-
-        :param purchases: a BrowseRecordList of purchases
-        :return: a dictionary with purchase id as key and
-            the untaxed amount as value
         '''
         currency_obj = Pool().get('currency.currency')
-        res = {}
-        for purchase in purchases:
-            res.setdefault(purchase.id, Decimal('0.0'))
-            for line in purchase.lines:
-                if line.type != 'line':
-                    continue
-                res[purchase.id] += line.amount
-            res[purchase.id] = currency_obj.round(purchase.currency,
-                    res[purchase.id])
-        return res
+        amounts = {}
+        for purchase in self.browse(ids):
+            if (purchase.state in self._states_cached
+                    and purchase.untaxed_amount_cache is not None):
+                amounts[purchase.id] = purchase.untaxed_amount_cache
+                continue
+            amount = sum((l.amount for l in purchase.lines
+                    if l.type == 'line'), Decimal(0))
+            amounts[purchase.id] = currency_obj.round(purchase.currency,
+                    amount)
+        return amounts
 
-    def get_tax_amount(self, purchases):
+    def get_tax_amount(self, ids, name):
         '''
         Return the tax amount for each purchases
-
-        :param purchases: a BrowseRecordList of purchases
-        :return: a dictionary with purchase id as key and
-            the tax amount as value
         '''
         pool = Pool()
         currency_obj = pool.get('currency.currency')
         tax_obj = pool.get('account.tax')
         invoice_obj = pool.get('account.invoice')
 
-        res = {}
-        for purchase in purchases:
+        amounts = {}
+        for purchase in self.browse(ids):
+            if (purchase.state in self._states_cached
+                    and purchase.tax_amount_cache is not None):
+                amounts[purchase.id] = purchase.tax_amount_cache
+                continue
             context = self.get_tax_context(purchase)
-            res.setdefault(purchase.id, Decimal('0.0'))
             taxes = {}
             for line in purchase.lines:
                 if line.type != 'line':
@@ -424,71 +462,52 @@ class Purchase(ModelWorkflow, ModelSQL, ModelView):
                         taxes[key] = val['amount']
                     else:
                         taxes[key] += val['amount']
-            for key in taxes:
-                res[purchase.id] += currency_obj.round(purchase.currency,
-                        taxes[key])
-            res[purchase.id] = currency_obj.round(purchase.currency,
-                    res[purchase.id])
-        return res
+            amount = sum((currency_obj.round(purchase.currency, tax)
+                    for tax in taxes.itervalues()), Decimal(0))
+            amounts[purchase.id] = currency_obj.round(purchase.currency,
+                amount)
+        return amounts
 
-    def get_total_amount(self, purchases):
+    def get_total_amount(self, ids, name):
         '''
         Return the total amount of each purchases
-
-        :param purchases: a BrowseRecordList of purchases
-        :return: a dictionary with purchase id as key and
-            total amount as value
         '''
         currency_obj = Pool().get('currency.currency')
-        res = {}
-        untaxed_amounts = self.get_untaxed_amount(purchases)
-        tax_amounts = self.get_tax_amount(purchases)
-        for purchase in purchases:
-            res[purchase.id] = currency_obj.round(purchase.currency,
-                    untaxed_amounts[purchase.id] + tax_amounts[purchase.id])
-        return res
+        amounts = {}
+        for purchase in self.browse(ids):
+            if (purchase.state in self._states_cached
+                    and purchase.total_amount_cache is not None):
+                amounts[purchase.id] = purchase.total_amount_cache
+                continue
+            amounts[purchase.id] = currency_obj.round(purchase.currency,
+                    purchase.untaxed_amount + purchase.tax_amount)
+        return amounts
 
-    def get_invoice_paid(self, purchases):
+    def get_invoice_state(self, purchase):
         '''
-        Return if all invoices have been paid for each purchases
-
-        :param purchases: a BrowseRecordList of purchases
-        :return: a dictionary with purchase id as key and
-            a boolean as value
+        Return the invoice state for the purchase.
         '''
-        res = {}
-        for purchase in purchases:
-            val = True
-            ignored_ids = set(x.id for x in purchase.invoices_ignored + \
-                                  purchase.invoices_recreated)
-            for invoice in purchase.invoices:
-                if invoice.state != 'paid' \
-                        and invoice.id not in ignored_ids:
-                    val = False
-                    break
-            res[purchase.id] = val
-        return res
+        skip_ids = set(x.id for x in purchase.invoices_ignored)
+        skip_ids.update(x.id for x in purchase.invoices_recreated)
+        invoices = [i for i in purchase.invoices if i.id not in skip_ids]
+        if invoices:
+            if any(i.state == 'cancel' for i in invoices):
+                return 'exception'
+            elif all(i.state == 'paid' for i in invoices):
+                return 'paid'
+            else:
+                return 'waiting'
+        return 'none'
 
-    def get_invoice_exception(self, purchases):
+    def set_invoice_state(self, purchase):
         '''
-        Return if there is an invoice exception for each purchases
-
-        :param purchases: a BrowseRecordList of purchases
-        :return: a dictionary with purchase id as key and
-            a boolean as value
+        Set the invoice state.
         '''
-        res = {}
-        for purchase in purchases:
-            val = False
-            skip_ids = set(x.id for x in purchase.invoices_ignored)
-            skip_ids.update(x.id for x in purchase.invoices_recreated)
-            for invoice in purchase.invoices:
-                if invoice.state == 'cancel' \
-                        and invoice.id not in skip_ids:
-                    val = True
-                    break
-            res[purchase.id] = val
-        return res
+        state = self.get_invoice_state(purchase)
+        if purchase.invoice_state != state:
+            self.write(purchase.id, {
+                    'invoice_state': state,
+                    })
 
     def get_shipments(self, purchases):
         '''
@@ -523,41 +542,28 @@ class Purchase(ModelWorkflow, ModelSQL, ModelView):
                 res[purchase.id].extend([x.id for x in line.moves])
         return res
 
-    def get_shipment_done(self, purchases):
+    def get_shipment_state(self, purchase):
         '''
-        Return if all the move have been done for the purchases
-
-        :param purchases: a BrowseRecordList of purchases
-        :return: a dictionary with purchase id as key and
-            a boolean as value
+        Return the shipment state for the purchase.
         '''
-        res = {}
-        for purchase in purchases:
-            val = True
-            for line in purchase.lines:
-                if not line.move_done:
-                    val = False
-                    break
-            res[purchase.id] = val
-        return res
+        if purchase.moves:
+            if any(l.move_exception for l in purchase.lines):
+                return 'exception'
+            elif all(l.move_done for l in purchase.lines):
+                return 'received'
+            else:
+                return 'waiting'
+        return 'none'
 
-    def get_shipment_exception(self, purchases):
+    def set_shipment_state(self, purchase):
         '''
-        Return if there is a shipment in exception for the purchases
-
-        :param purchases: a BrowseRecordList of purchases
-        :return: a dictionary with purchase id as key and
-            a boolean as value
+        Set the shipment state.
         '''
-        res = {}
-        for purchase in purchases:
-            val = False
-            for line in purchase.lines:
-                if line.move_exception:
-                    val = True
-                    break
-            res[purchase.id] = val
-        return res
+        state = self.get_shipment_state(purchase)
+        if purchase.shipment_state != state:
+            self.write(purchase.id, {
+                    'shipment_state': state,
+                    })
 
     def get_rec_name(self, ids, name):
         if not ids:
@@ -584,42 +590,57 @@ class Purchase(ModelWorkflow, ModelSQL, ModelView):
             default = {}
         default = default.copy()
         default['state'] = 'draft'
-        default['reference'] = False
+        default['reference'] = None
         default['invoice_state'] = 'none'
-        default['invoices'] = False
-        default['invoices_ignored'] = False
+        default['invoices'] = None
+        default['invoices_ignored'] = None
         default['shipment_state'] = 'none'
+        default.setdefault('purchase_date', None)
         return super(Purchase, self).copy(ids, default=default)
 
-    def check_for_quotation(self, purchase_id):
-        purchase = self.browse(purchase_id)
-        if not purchase.invoice_address:
-            self.raise_user_error('invoice_addresse_required')
-        return True
+    def check_for_quotation(self, ids):
+        purchases = self.browse(ids)
+        for purchase in purchases:
+            if not purchase.invoice_address:
+                self.raise_user_error('invoice_addresse_required')
+            for line in purchase.lines:
+                if (not line.to_location
+                        and line.product
+                        and line.product.type in ('goods', 'assets')):
+                    self.raise_user_error('warehouse_required')
 
-    def set_reference(self, purchase_id):
+    def set_reference(self, ids):
+        '''
+        Fill the reference field with the purchase sequence
+        '''
         sequence_obj = Pool().get('ir.sequence')
         config_obj = Pool().get('purchase.configuration')
 
-        purchase = self.browse(purchase_id)
-
-        if purchase.reference:
-            return True
-
         config = config_obj.browse(1)
-        reference = sequence_obj.get_id(config.purchase_sequence.id)
-        self.write(purchase_id, {
-            'reference': reference,
-            })
-        return True
+        purchases = self.browse(ids)
+        for purchase in purchases:
+            if purchase.reference:
+                continue
+            reference = sequence_obj.get_id(config.purchase_sequence.id)
+            self.write(purchase.id, {
+                'reference': reference,
+                })
 
-    def set_purchase_date(self, purchase_id):
+    def set_purchase_date(self, ids):
         date_obj = Pool().get('ir.date')
+        for purchase in self.browse(ids):
+            if not purchase.purchase_date:
+                self.write(purchase.id, {
+                    'purchase_date': date_obj.today(),
+                    })
 
-        self.write(purchase_id, {
-            'purchase_date': date_obj.today(),
-            })
-        return True
+    def store_cache(self, ids):
+        for purchase in self.browse(ids):
+            self.write(purchase.id, {
+                    'untaxed_amount_cache': purchase.untaxed_amount,
+                    'tax_amount_cache': purchase.tax_amount,
+                    'total_amount_cache': purchase.total_amount,
+                    })
 
     def _get_invoice_line_purchase_line(self, purchase):
         '''
@@ -667,20 +688,15 @@ class Purchase(ModelWorkflow, ModelSQL, ModelView):
         }
         return res
 
-    def create_invoice(self, purchase_id):
+    def create_invoice(self, purchase):
         '''
-        Create invoice for the purchase id
-
-        :param purchase_id: the id of the purchase
-        :return: the id of the invoice or None
+        Create an invoice for the purchase and return the id
         '''
         pool = Pool()
         invoice_obj = pool.get('account.invoice')
         invoice_line_obj = pool.get('account.invoice.line')
         purchase_line_obj = pool.get('purchase.line')
 
-        purchase = self.browse(purchase_id)
-
         if not purchase.party.account_payable:
             self.raise_user_error('missing_account_payable',
                     error_args=(purchase.party.rec_name,))
@@ -707,122 +723,72 @@ class Purchase(ModelWorkflow, ModelSQL, ModelView):
         with Transaction().set_user(0, set_context=True):
             invoice_obj.update_taxes([invoice_id])
 
-        self.write(purchase_id, {
+        self.write(purchase.id, {
             'invoices': [('add', invoice_id)],
         })
         return invoice_id
 
-    def create_move(self, purchase_id):
+    def create_move(self, purchase):
         '''
         Create move for each purchase lines
         '''
         line_obj = Pool().get('purchase.line')
 
-        purchase = self.browse(purchase_id)
         for line in purchase.lines:
             line_obj.create_move(line)
 
-    def wkf_draft(self, purchase):
-        self.write(purchase.id, {'state': 'draft'})
-
-    def wkf_quotation(self, purchase):
-        self.check_for_quotation(purchase.id)
-        self.set_reference(purchase.id)
-        self.write(purchase.id, {'state': 'quotation'})
-
-    def wkf_confirmed(self, purchase):
-        self.set_purchase_date(purchase.id)
-        self.write(purchase.id, {'state': 'confirmed'})
-
-    def wkf_invoice_waiting(self, purchase):
-        self.create_invoice(purchase.id)
-        self.write(purchase.id, {'invoice_state': 'waiting'})
-
-    def wkf_invoice_exception(self, purchase):
-        self.write(purchase.id, {'invoice_state': 'exception'})
-
-    def wkf_invoice_done(self, purchase):
-        self.write(purchase.id, {'invoice_state': 'paid'})
-
-    def wkf_shipment_waiting(self, purchase):
-        self.write(purchase.id, {'shipment_state': 'waiting'})
-        self.create_move(purchase.id)
-
-    def wkf_shipment_exception(self, purchase):
-        self.write(purchase.id, {'shipment_state': 'exception'})
-
-    def wkf_invoice_shipment(self, purchase):
-        self.create_invoice(purchase.id)
-        self.write(purchase.id, {'invoice_state': 'waiting'})
-
-    def wkf_invoice_shipment_waiting(self, purchase):
-        self.write(purchase.id,
-            {'invoice_state': 'waiting', 'shipment_state': 'received'})
-
-    def wkf_invoice_shipment_exception(self, purchase):
-        self.write(purchase.id, {'invoice_state': 'exception'})
-
-    def wkf_invoice_shipment_done(self, purchase):
-        self.write(purchase.id, {'invoice_state': 'paid'})
-
-    def wkf_invoice_shipment_method_done(self, purchase):
-        self.write(purchase.id, {'shipment_state': 'received'})
-
-    def wkf_done(self, purchase):
-        self.write(purchase.id, {'state': 'done'})
-
-    def wkf_cancel(self, purchase):
-        self.write(purchase.id, {'state': 'cancel'})
-
-    def wkf_draft2quotation(self, purchase):
-        return bool(purchase.lines)
-
-    def wkf_invoice_method2invoice_waiting(self, purchase):
-        return purchase.invoice_method == 'order'
-
-    def wkf_invoice_method2invoice_done(self, purchase):
-        return purchase.invoice_method != 'order'
-
-    def wkf_triggered_invoices(self, purchase):
-        return [x.id for x in purchase.invoices]
-
-    def wkf_invoice_waiting2invoice_purchase_exception(self, purchase):
-        return purchase.invoice_exception
-
-    def wkf_invoice_waiting2invoice_done(self, purchase):
-        return purchase.invoice_paid
-
-    def wkf_shipment_waiting2shipment_exception(self, purchase):
-        return purchase.shipment_exception
-
-    def wkf_shipment_waiting2invoice_shipment_method(self, purchase):
-        return not purchase.shipment_exception
+    def is_done(self, purchase):
+        return (purchase.invoice_state == 'paid'
+            and purchase.shipment_state == 'received')
 
-    def wkf_shipment_waiting2invoice_shipment_method_nosignal(self, purchase):
-        return purchase.shipment_done
-
-    def wkf_invoice_shipment_method2invoice_shipment(self, purchase):
-        return purchase.invoice_method == 'shipment'
-
-    def wkf_invoice_shipment_method2inv_shipment_method_done(self, purchase):
-        return purchase.invoice_method != 'shipment' and purchase.shipment_done
-
-    def wkf_invoice_shipment_method2shipment_waiting(self, purchase):
-        return (purchase.invoice_method != 'shipment'
-            and not purchase.shipment_done)
-
-    def wkf_invoice_shipment2shipment_waiting(self, purchase):
-        return not purchase.shipment_done
-
-    def wkf_invoice_shipment2waiting_invoice_shipment(self, purchase):
-        return purchase.shipment_done
-
-    def wkf_waiting_invoice_shipment2invoice_shipment_exception(self,
-            purchase):
-        return purchase.invoice_exception
-
-    def wkf_waiting_invoice_shipment2invoice_shipment_done(self, purchase):
-        return purchase.invoice_paid
+    def delete(self, ids):
+        if isinstance(ids, (int, long)):
+            ids = [ids]
+        # Cancel before delete
+        self.cancel(ids)
+        for purchase in self.browse(ids):
+            if purchase.state != 'cancel':
+                self.raise_user_error('delete_cancel', purchase.rec_name)
+        return super(Purchase, self).delete(ids)
+
+    @ModelView.button
+    @Workflow.transition('cancel')
+    def cancel(self, ids):
+        self.store_cache(ids)
+
+    @ModelView.button
+    @Workflow.transition('draft')
+    def draft(self, ids):
+        pass
+
+    @ModelView.button
+    @Workflow.transition('quotation')
+    def quote(self, ids):
+        self.check_for_quotation(ids)
+        self.set_reference(ids)
+
+    @ModelView.button
+    @Workflow.transition('confirmed')
+    def confirm(self, ids):
+        self.set_purchase_date(ids)
+        self.store_cache(ids)
+        self.process(ids)
+
+    def process(self, ids):
+        done = []
+        for purchase in self.browse(ids):
+            if purchase.state in ('done', 'cancel'):
+                continue
+            self.create_invoice(purchase)
+            self.set_invoice_state(purchase)
+            self.create_move(purchase)
+            self.set_shipment_state(purchase)
+            if self.is_done(purchase):
+                done.append(purchase.id)
+        if done:
+            self.write(done, {
+                    'state': 'done',
+                    })
 
 Purchase()
 
@@ -833,9 +799,9 @@ class PurchaseInvoice(ModelSQL):
     _table = 'purchase_invoices_rel'
     _description = __doc__
     purchase = fields.Many2One('purchase.purchase', 'Purchase',
-            ondelete='CASCADE', select=1, required=True)
+            ondelete='CASCADE', select=True, required=True)
     invoice = fields.Many2One('account.invoice', 'Invoice',
-            ondelete='RESTRICT', select=1, required=True)
+            ondelete='RESTRICT', select=True, required=True)
 
 PurchaseInvoice()
 
@@ -846,9 +812,9 @@ class PuchaseIgnoredInvoice(ModelSQL):
     _table = 'purchase_invoice_ignored_rel'
     _description = __doc__
     purchase = fields.Many2One('purchase.purchase', 'Purchase',
-            ondelete='CASCADE', select=1, required=True)
+            ondelete='CASCADE', select=True, required=True)
     invoice = fields.Many2One('account.invoice', 'Invoice',
-            ondelete='RESTRICT', select=1, required=True)
+            ondelete='RESTRICT', select=True, required=True)
 
 PuchaseIgnoredInvoice()
 
@@ -859,9 +825,9 @@ class PurchaseRecreadtedInvoice(ModelSQL):
     _table = 'purchase_invoice_recreated_rel'
     _description = __doc__
     purchase = fields.Many2One('purchase.purchase', 'Purchase',
-            ondelete='CASCADE', select=1, required=True)
+            ondelete='CASCADE', select=True, required=True)
     invoice = fields.Many2One('account.invoice', 'Invoice',
-            ondelete='RESTRICT', select=1, required=True)
+            ondelete='RESTRICT', select=True, required=True)
 
 PurchaseRecreadtedInvoice()
 
@@ -872,15 +838,15 @@ class PurchaseLine(ModelSQL, ModelView):
     _rec_name = 'description'
     _description = __doc__
 
-    purchase = fields.Many2One('purchase.purchase', 'Purchase', ondelete='CASCADE',
-            select=1, required=True)
-    sequence = fields.Integer('Sequence')
+    purchase = fields.Many2One('purchase.purchase', 'Purchase',
+            ondelete='CASCADE', select=True, required=True)
+    sequence = fields.Integer('Sequence', required=True)
     type = fields.Selection([
         ('line', 'Line'),
         ('subtotal', 'Subtotal'),
         ('title', 'Title'),
         ('comment', 'Comment'),
-        ], 'Type', select=1, required=True)
+        ], 'Type', select=True, required=True)
     quantity = fields.Float('Quantity',
         digits=(16, Eval('unit_digits', 2)),
         states={
@@ -895,16 +861,15 @@ class PurchaseLine(ModelSQL, ModelView):
             'required': Bool(Eval('product')),
             'invisible': Eval('type') != 'line',
             'readonly': ~Eval('_parent_purchase'),
-            }, domain=[
-            ('category', '=',
-                (Eval('product'), 'product.default_uom.category')),
-            ],
-        context={
-            'category': (Eval('product'), 'product.default_uom.category'),
             },
+        domain=[
+            If(Bool(Eval('product_uom_category')),
+                ('category', '=', Eval('product_uom_category')),
+                ('category', '!=', -1)),
+            ],
         on_change=['product', 'quantity', 'unit', '_parent_purchase.currency',
             '_parent_purchase.party'],
-        depends=['product', 'type'])
+        depends=['product', 'type', 'product_uom_category'])
     unit_digits = fields.Function(fields.Integer('Unit Digits',
         on_change_with=['unit']), 'get_unit_digits')
     product = fields.Many2One('product.product', 'Product',
@@ -917,13 +882,17 @@ class PurchaseLine(ModelSQL, ModelView):
         context={
             'locations': If(Bool(Eval('_parent_purchase', {}).get(
                         'warehouse')),
-                [Eval('_parent_purchase', {}).get('warehouse', False)],
+                [Eval('_parent_purchase', {}).get('warehouse', None)],
                 []),
             'stock_date_end': Eval('_parent_purchase', {}).get(
                 'purchase_date'),
             'purchasable': True,
             'stock_skip_warehouse': True,
             }, depends=['type'])
+    product_uom_category = fields.Function(
+        fields.Many2One('product.uom.category', 'Product Uom Category',
+            on_change_with=['product']),
+        'get_product_uom_category')
     unit_price = fields.Numeric('Unit Price', digits=(16, 4),
         states={
             'invisible': Eval('type') != 'line',
@@ -935,13 +904,13 @@ class PurchaseLine(ModelSQL, ModelView):
             states={
                 'invisible': ~Eval('type').in_(['line', 'subtotal']),
                 'readonly': ~Eval('_parent_purchase'),
-                }, on_change_with=['type', 'quantity', 'unit_price',
+                }, on_change_with=['type', 'quantity', 'unit_price', 'unit',
                 '_parent_purchase.currency'],
             depends=['type']), 'get_amount')
     description = fields.Text('Description', size=None, required=True)
     note = fields.Text('Note')
     taxes = fields.Many2Many('purchase.line-account.tax',
-        'line', 'tax', 'Taxes', domain=[('parent', '=', False)],
+        'line', 'tax', 'Taxes', domain=[('parent', '=', None)],
         states={
             'invisible': Eval('type') != 'line',
             }, depends=['type'])
@@ -956,6 +925,14 @@ class PurchaseLine(ModelSQL, ModelView):
     move_done = fields.Function(fields.Boolean('Moves Done'), 'get_move_done')
     move_exception = fields.Function(fields.Boolean('Moves Exception'),
             'get_move_exception')
+    from_location = fields.Function(fields.Many2One('stock.location',
+            'From Location'), 'get_from_location')
+    to_location = fields.Function(fields.Many2One('stock.location',
+            'To Location'), 'get_to_location')
+    delivery_date = fields.Function(fields.Date('Delivery Date',
+            on_change_with=['product', '_parent_purchase.purchase_date',
+                '_parent_purchase.party']),
+        'get_delivery_date')
 
     def __init__(self):
         super(PurchaseLine, self).__init__()
@@ -982,12 +959,6 @@ class PurchaseLine(ModelSQL, ModelView):
     def default_type(self):
         return 'line'
 
-    def default_quantity(self):
-        return 0.0
-
-    def default_unit_price(self):
-        return Decimal('0.0')
-
     def get_move_done(self, ids, name):
         uom_obj = Pool().get('product.uom')
         res = {}
@@ -1060,7 +1031,6 @@ class PurchaseLine(ModelSQL, ModelView):
         pool = Pool()
         party_obj = pool.get('party.party')
         product_obj = pool.get('product.product')
-        uom_obj = pool.get('product.uom')
         tax_rule_obj = pool.get('account.tax.rule')
 
         if not vals.get('product'):
@@ -1104,7 +1074,7 @@ class PurchaseLine(ModelSQL, ModelView):
                 continue
             res['taxes'].append(tax.id)
         if party and party.supplier_tax_rule:
-            tax_ids = tax_rule_obj.apply(party.supplier_tax_rule, False,
+            tax_ids = tax_rule_obj.apply(party.supplier_tax_rule, None,
                     pattern)
             if tax_ids:
                 res['taxes'].extend(tax_ids)
@@ -1126,6 +1096,22 @@ class PurchaseLine(ModelSQL, ModelView):
         res['amount'] = self.on_change_with_amount(vals)
         return res
 
+    def on_change_with_product_uom_category(self, values):
+        pool = Pool()
+        product_obj = pool.get('product.product')
+        if values.get('product'):
+            product = product_obj.browse(values['product'])
+            return product.default_uom_category.id
+
+    def get_product_uom_category(self, ids, name):
+        categories = {}
+        for line in self.browse(ids):
+            if line.product:
+                categories[line.id] = line.product.default_uom_category.id
+            else:
+                categories[line.id] = None
+        return categories
+
     def on_change_quantity(self, vals):
         product_obj = Pool().get('product.product')
 
@@ -1133,8 +1119,6 @@ class PurchaseLine(ModelSQL, ModelView):
             return {}
         res = {}
 
-        product = product_obj.browse(vals['product'])
-
         context = {}
         if vals.get('_parent_purchase.currency'):
             context['currency'] = vals['_parent_purchase.currency']
@@ -1182,8 +1166,8 @@ class PurchaseLine(ModelSQL, ModelView):
                 for line2 in line.purchase.lines:
                     if line2.type == 'line':
                         res[line.id] += currency_obj.round(
-                                line2.purchase.currency,
-                                Decimal(str(line2.quantity)) * line2.unit_price)
+                            line2.purchase.currency,
+                            Decimal(str(line2.quantity)) * line2.unit_price)
                     elif line2.type == 'subtotal':
                         if line.id == line2.id:
                             break
@@ -1192,6 +1176,46 @@ class PurchaseLine(ModelSQL, ModelView):
                 res[line.id] = Decimal('0.0')
         return res
 
+    def get_from_location(self, ids, name):
+        result = {}
+        for line in self.browse(ids):
+            result[line.id] = line.purchase.party.supplier_location.id
+        return result
+
+    def get_to_location(self, ids, name):
+        result = {}
+        for line in self.browse(ids):
+            if line.purchase.warehouse:
+                result[line.id] = line.purchase.warehouse.input_location.id
+            else:
+                result[line.id] = None
+        return result
+
+    def _compute_delivery_date(self, product, party, date):
+        product_supplier_obj = Pool().get('purchase.product_supplier')
+        if product and product.product_suppliers:
+            for product_supplier in product.product_suppliers:
+                if product_supplier.party.id == party.id:
+                    return product_supplier_obj.compute_supply_date(
+                        product_supplier, date=date)
+
+    def on_change_with_delivery_date(self, values):
+        pool = Pool()
+        product_obj = pool.get('product.product')
+        party_obj = pool.get('party.party')
+        if values.get('product') and values.get('_parent_purchase.party'):
+            product = product_obj.browse(values['product'])
+            party = party_obj.browse(values['_parent_purchase.party'])
+            return self._compute_delivery_date(product, party,
+                values.get('_parent_purchase.purchase_date'))
+
+    def get_delivery_date(self, ids, name):
+        dates = {}
+        for line in self.browse(ids):
+            dates[line.id] = self._compute_delivery_date(line.product,
+                line.purchase.party, line.purchase.purchase_date)
+        return dates
+
     def get_invoice_line(self, line):
         '''
         Return invoice line values for purchase line
@@ -1208,7 +1232,14 @@ class PurchaseLine(ModelSQL, ModelView):
         res['description'] = line.description
         res['note'] = line.note
         if line.type != 'line':
-            return [res]
+            if (line.purchase.invoice_method == 'order'
+                    and (all(l.quantity >= 0 for l in line.sale.lines
+                            if l.type == 'line')
+                        or all(l.quantity <= 0 for l in line.sale.lines
+                            if l.type == 'line'))):
+                return [res]
+            else:
+                return []
         if (line.purchase.invoice_method == 'order'
                 or not line.product
                 or line.product.type == 'service'):
@@ -1226,6 +1257,8 @@ class PurchaseLine(ModelSQL, ModelView):
         else:
             ignored_ids = ()
         for invoice_line in line.invoice_lines:
+            if invoice_line.type != 'line':
+                continue
             if ((invoice_line.invoice and
                     invoice_line.invoice.state != 'cancel') or
                 invoice_line.id in ignored_ids):
@@ -1233,7 +1266,6 @@ class PurchaseLine(ModelSQL, ModelView):
                         invoice_line.quantity, line.unit)
         res['quantity'] = quantity
 
-
         if res['quantity'] <= 0.0:
             return []
         res['unit'] = line.unit.id
@@ -1258,20 +1290,18 @@ class PurchaseLine(ModelSQL, ModelView):
         if default is None:
             default = {}
         default = default.copy()
-        default['moves'] = False
-        default['moves_ignored'] = False
-        default['moves_recreated'] = False
-        default['invoice_lines'] = False
+        default['moves'] = None
+        default['moves_ignored'] = None
+        default['moves_recreated'] = None
+        default['invoice_lines'] = None
         return super(PurchaseLine, self).copy(ids, default=default)
 
-    def create_move(self, line):
+    def get_move(self, line):
         '''
-        Create move line
+        Return move values for purchase line
         '''
         pool = Pool()
-        move_obj = pool.get('stock.move')
         uom_obj = pool.get('product.uom')
-        product_supplier_obj = pool.get('purchase.product_supplier')
 
         vals = {}
         if line.type != 'line':
@@ -1293,22 +1323,25 @@ class PurchaseLine(ModelSQL, ModelView):
         vals['quantity'] = quantity
         vals['uom'] = line.unit.id
         vals['product'] = line.product.id
-        vals['from_location'] = line.purchase.party.supplier_location.id
-        vals['to_location'] = line.purchase.warehouse.input_location.id
+        vals['from_location'] = line.from_location.id
+        vals['to_location'] = line.to_location.id
         vals['state'] = 'draft'
         vals['company'] = line.purchase.company.id
         vals['unit_price'] = line.unit_price
         vals['currency'] = line.purchase.currency.id
+        vals['planned_date'] = line.delivery_date
+        return vals
 
-        if line.product.product_suppliers:
-            for product_supplier in line.product.product_suppliers:
-                if product_supplier.party.id == line.purchase.party.id:
-                    vals['planned_date'] = \
-                            product_supplier_obj.compute_supply_date(
-                                    product_supplier,
-                                    date=line.purchase.purchase_date)[0]
-                    break
+    def create_move(self, line):
+        '''
+        Create move line
+        '''
+        pool = Pool()
+        move_obj = pool.get('stock.move')
 
+        vals = self.get_move(line)
+        if not vals:
+            return
         with Transaction().set_user(0, set_context=True):
             move_id = move_obj.create(vals)
 
@@ -1326,10 +1359,10 @@ class PurchaseLineTax(ModelSQL):
     _table = 'purchase_line_account_tax'
     _description = __doc__
     line = fields.Many2One('purchase.line', 'Purchase Line',
-            ondelete='CASCADE', select=1, required=True,
+            ondelete='CASCADE', select=True, required=True,
             domain=[('type', '=', 'line')])
     tax = fields.Many2One('account.tax', 'Tax', ondelete='RESTRICT',
-            select=1, required=True, domain=[('parent', '=', False)])
+            select=True, required=True, domain=[('parent', '=', None)])
 
 PurchaseLineTax()
 
@@ -1340,9 +1373,9 @@ class PurchaseLineInvoiceLine(ModelSQL):
     _table = 'purchase_line_invoice_lines_rel'
     _description = __doc__
     purchase_line = fields.Many2One('purchase.line', 'Purchase Line',
-            ondelete='CASCADE', select=1, required=True)
+            ondelete='CASCADE', select=True, required=True)
     invoice_line = fields.Many2One('account.invoice.line', 'Invoice Line',
-            ondelete='RESTRICT', select=1, required=True)
+            ondelete='RESTRICT', select=True, required=True)
 
 PurchaseLineInvoiceLine()
 
@@ -1353,9 +1386,9 @@ class PurchaseLineIgnoredMove(ModelSQL):
     _table = 'purchase_line_moves_ignored_rel'
     _description = __doc__
     purchase_line = fields.Many2One('purchase.line', 'Purchase Line',
-            ondelete='CASCADE', select=1, required=True)
+            ondelete='CASCADE', select=True, required=True)
     move = fields.Many2One('stock.move', 'Move', ondelete='RESTRICT',
-            select=1, required=True)
+            select=True, required=True)
 
 PurchaseLineIgnoredMove()
 
@@ -1366,9 +1399,9 @@ class PurchaseLineRecreatedMove(ModelSQL):
     _table = 'purchase_line_moves_recreated_rel'
     _description = __doc__
     purchase_line = fields.Many2One('purchase.line', 'Purchase Line',
-            ondelete='CASCADE', select=1, required=True)
+            ondelete='CASCADE', select=True, required=True)
     move = fields.Many2One('stock.move', 'Move', ondelete='RESTRICT',
-            select=1, required=True)
+            select=True, required=True)
 
 PurchaseLineRecreatedMove()
 
@@ -1396,16 +1429,15 @@ class Template(ModelSQL, ModelView):
             'invisible': ~Eval('purchasable'),
             'required': Eval('purchasable', False),
             },
-        domain=[('category', '=', (Eval('default_uom'), 'uom.category'))],
-        context={'category': (Eval('default_uom'), 'uom.category')},
+        domain=[('category', '=', Eval('default_uom_category'))],
         on_change_with=['default_uom', 'purchase_uom', 'purchasable'],
-        depends=['active', 'default_uom', 'purchasable'])
+        depends=['active', 'purchasable', 'default_uom_category'])
 
     def __init__(self):
         super(Template, self).__init__()
         self._error_messages.update({
-                'change_purchase_uom': 'Purchase prices are based on the purchase uom, '\
-                    'are you sure to change it?',
+                'change_purchase_uom': 'Purchase prices are based ' \
+                    'on the purchase uom, are you sure to change it?',
             })
         self.account_expense = copy.copy(self.account_expense)
         self.account_expense.states = copy.copy(self.account_expense.states)
@@ -1432,7 +1464,7 @@ class Template(ModelSQL, ModelView):
 
     def on_change_with_purchase_uom(self, vals):
         uom_obj = Pool().get('product.uom')
-        res = False
+        res = None
 
         if vals.get('default_uom'):
             default_uom = uom_obj.browse(vals['default_uom'])
@@ -1503,9 +1535,12 @@ class Product(ModelSQL, ModelView):
         for product in self.browse(ids):
             res[product.id] = product.cost_price
             default_uom = product.default_uom
+            default_currency = (user.company.currency.id if user.company
+                else None)
             if not uom:
                 uom = default_uom
-            if Transaction().context.get('supplier') and product.product_suppliers:
+            if (Transaction().context.get('supplier')
+                    and product.product_suppliers):
                 supplier_id = Transaction().context['supplier']
                 for product_supplier in product.product_suppliers:
                     if product_supplier.party.id == supplier_id:
@@ -1514,16 +1549,15 @@ class Product(ModelSQL, ModelView):
                                     price.quantity, uom) <= quantity:
                                 res[product.id] = price.unit_price
                                 default_uom = product.purchase_uom
+                                default_currency = product_supplier.currency.id
                         break
             res[product.id] = uom_obj.compute_price(default_uom,
                     res[product.id], uom)
-            if currency and user.company:
-                if user.company.currency.id != currency.id:
-                    date = Transaction().context.get('purchase_date') or today
-                    with Transaction().set_context(date=date):
-                        res[product.id] = currency_obj.compute(
-                            user.company.currency.id, res[product.id],
-                            currency.id, round=False)
+            if currency and default_currency:
+                date = Transaction().context.get('purchase_date') or today
+                with Transaction().set_context(date=date):
+                    res[product.id] = currency_obj.compute(default_currency,
+                        res[product.id], currency.id, round=False)
         return res
 
 Product()
@@ -1535,29 +1569,81 @@ class ProductSupplier(ModelSQL, ModelView):
     _description = __doc__
 
     product = fields.Many2One('product.template', 'Product', required=True,
-            ondelete='CASCADE', select=1)
+            ondelete='CASCADE', select=True)
     party = fields.Many2One('party.party', 'Supplier', required=True,
-            ondelete='CASCADE', select=1)
-    name = fields.Char('Name', size=None, translate=True, select=1)
-    code = fields.Char('Code', size=None, select=1)
-    sequence = fields.Integer('Sequence')
+            ondelete='CASCADE', select=True, on_change=['party'])
+    name = fields.Char('Name', size=None, translate=True, select=True)
+    code = fields.Char('Code', size=None, select=True)
+    sequence = fields.Integer('Sequence', required=True)
     prices = fields.One2Many('purchase.product_supplier.price',
             'product_supplier', 'Prices')
     company = fields.Many2One('company.company', 'Company', required=True,
-        ondelete='CASCADE', select=1,
+        ondelete='CASCADE', select=True,
         domain=[
             ('id', If(Eval('context', {}).contains('company'), '=', '!='),
                 Eval('context', {}).get('company', 0)),
             ])
-    delivery_time = fields.Integer('Delivery Time',
+    delivery_time = fields.Integer('Delivery Time', required=True,
             help="In number of days")
+    currency = fields.Many2One('currency.currency', 'Currency', required=True,
+        ondelete='RESTRICT')
 
     def __init__(self):
         super(ProductSupplier, self).__init__()
         self._order.insert(0, ('sequence', 'ASC'))
 
+    def init(self, module_name):
+        cursor = Transaction().cursor
+        table = TableHandler(cursor, self, module_name)
+
+        # Migration from 2.2 new field currency
+        created_currency = table.column_exist('currency')
+
+        super(ProductSupplier, self).init(module_name)
+
+        # Migration from 2.2 fill currency
+        if not created_currency:
+            company_obj = Pool().get('company.company')
+            limit = cursor.IN_MAX
+            cursor.execute('SELECT count(id) FROM "' + self._table + '"')
+            product_supplier_count, = cursor.fetchone()
+            for offset in range(0, product_supplier_count, limit):
+                cursor.execute(cursor.limit_clause(
+                        'SELECT p.id, c.currency '
+                        'FROM "' + self._table + '" AS p '
+                        'INNER JOIN "' + company_obj._table + '" AS c '
+                            'ON p.company = c.id '
+                        'ORDER BY p.id',
+                        limit, offset))
+                for product_supplier_id, currency_id in cursor.fetchall():
+                    cursor.execute('UPDATE "' + self._table + '" '
+                        'SET currency = %s '
+                        'WHERE id = %s', (currency_id, product_supplier_id))
+
     def default_company(self):
-        return Transaction().context.get('company') or False
+        return Transaction().context.get('company')
+
+    def default_currency(self):
+        company_obj = Pool().get('company.company')
+        company = None
+        if Transaction().context.get('company'):
+            company = company_obj.browse(Transaction().context['company'])
+            return company.currency.id
+
+    def on_change_party(self, values):
+        cursor = Transaction().cursor
+        changes = {
+            'currency': self.default_currency(),
+            }
+        if values.get('party'):
+            cursor.execute('SELECT currency FROM "' + self._table + '" '
+                'WHERE party = %s '
+                'GROUP BY currency '
+                'ORDER BY COUNT(1) DESC', (values['party'],))
+            row = cursor.fetchone()
+            if row:
+                changes['currency'], = row
+        return changes
 
     def compute_supply_date(self, product_supplier, date=None):
         '''
@@ -1566,15 +1652,15 @@ class ProductSupplier(ModelSQL, ModelView):
 
         :param product_supplier: a BrowseRecord of the Product Supplier
         :param date: the date of the purchase if None the current date
-        :return: a tuple with the supply date and the next one
+        :return: the supply date
         '''
         date_obj = Pool().get('ir.date')
 
         if not date:
             date = date_obj.today()
-        next_date = date + datetime.timedelta(1)
-        return (date + datetime.timedelta(product_supplier.delivery_time),
-                next_date + datetime.timedelta(product_supplier.delivery_time))
+        if not product_supplier.delivery_time:
+            return datetime.date.max
+        return date + datetime.timedelta(product_supplier.delivery_time)
 
     def compute_purchase_date(self, product_supplier, date):
         '''
@@ -1607,14 +1693,8 @@ class ProductSupplierPrice(ModelSQL, ModelView):
         super(ProductSupplierPrice, self).__init__()
         self._order.insert(0, ('quantity', 'ASC'))
 
-    def default_currency(self):
-        company_obj = Pool().get('company.company')
-        currency_obj = Pool().get('currency.currency')
-        company = None
-        if Transaction().context.get('company'):
-            company = company_obj.browse(Transaction().context['company'])
-            return company.currency.id
-        return False
+    def default_quantity(self):
+        return 0.0
 
 ProductSupplierPrice()
 
@@ -1667,17 +1747,19 @@ class ShipmentIn(ModelSQL, ModelView):
                     if purchase_line.purchase.id not in purchase_ids:
                         purchase_ids.append(purchase_line.purchase.id)
 
-            purchase_obj.workflow_trigger_validate(purchase_ids,
-                    'shipment_update')
+            with Transaction().set_user(0, set_context=True):
+                purchase_obj.process(purchase_ids)
         return res
 
-    def button_draft(self, ids):
+    @ModelView.button
+    @Workflow.transition('draft')
+    def draft(self, ids):
         for shipment in self.browse(ids):
             for move in shipment.incoming_moves:
                 if move.state == 'cancel' and move.purchase_line:
                     self.raise_user_error('reset_move')
 
-        return super(ShipmentIn, self).button_draft(ids)
+        return super(ShipmentIn, self).draft(ids)
 
 ShipmentIn()
 
@@ -1685,13 +1767,13 @@ ShipmentIn()
 class Move(ModelSQL, ModelView):
     _name = 'stock.move'
 
-    purchase_line = fields.Many2One('purchase.line', 'Purchase Line', select=1,
-        states={
+    purchase_line = fields.Many2One('purchase.line', 'Purchase Line',
+        select=True, states={
             'readonly': Eval('state') != 'draft',
             },
         depends=['state'])
     purchase = fields.Function(fields.Many2One('purchase.purchase', 'Purchase',
-            select=1, states={
+            select=True, states={
                 'invisible': ~Eval('purchase_visible', False),
                 }, depends=['purchase_visible']), 'get_purchase',
         searcher='search_purchase')
@@ -1719,7 +1801,7 @@ class Move(ModelSQL, ModelView):
     purchase_visible = fields.Function(fields.Boolean('Purchase Visible',
         on_change_with=['from_location']), 'get_purchase_visible')
     supplier = fields.Function(fields.Many2One('party.party', 'Supplier',
-        select=1), 'get_supplier', searcher='search_supplier')
+        select=True), 'get_supplier', searcher='search_supplier')
     purchase_exception_state = fields.Function(fields.Selection([
         ('', ''),
         ('ignored', 'Ignored'),
@@ -1729,7 +1811,7 @@ class Move(ModelSQL, ModelView):
     def get_purchase(self, ids, name):
         res = {}
         for move in self.browse(ids):
-            res[move.id] = False
+            res[move.id] = None
             if move.purchase_line:
                 res[move.id] = move.purchase_line.purchase.id
         return res
@@ -1760,7 +1842,7 @@ class Move(ModelSQL, ModelView):
                 elif name[9:] == 'unit_digits':
                     res[name][move.id] = 2
                 else:
-                    res[name][move.id] = False
+                    res[name][move.id] = None
             if move.purchase_line:
                 for name in res.keys():
                     if name[9:] == 'currency':
@@ -1772,13 +1854,6 @@ class Move(ModelSQL, ModelView):
                         res[name][move.id] = move.purchase_line[name[9:]].id
         return res
 
-    def default_purchase_visible(self):
-        from_location = self.default_from_location()
-        vals = {
-            'from_location': from_location,
-        }
-        return self.on_change_with_purchase_visible(vals)
-
     def on_change_with_purchase_visible(self, vals):
         location_obj = Pool().get('stock.location')
         if vals.get('from_location'):
@@ -1798,7 +1873,7 @@ class Move(ModelSQL, ModelView):
     def get_supplier(self, ids, name):
         res = {}
         for move in self.browse(ids):
-            res[move.id] = False
+            res[move.id] = None
             if move.purchase_line:
                 res[move.id] = move.purchase_line.purchase.party.id
         return res
@@ -1823,8 +1898,8 @@ class Move(ModelSQL, ModelView):
                         purchase_line_ids):
                     purchase_ids.add(purchase_line.purchase.id)
             if purchase_ids:
-                purchase_obj.workflow_trigger_validate(list(purchase_ids),
-                        'shipment_update')
+                with Transaction().set_user(0, set_context=True):
+                    purchase_obj.process(list(purchase_ids))
         return res
 
     def delete(self, ids):
@@ -1845,8 +1920,8 @@ class Move(ModelSQL, ModelView):
             for purchase_line in purchase_line_obj.browse(purchase_line_ids):
                 purchase_ids.add(purchase_line.purchase.id)
             if purchase_ids:
-                purchase_obj.workflow_trigger_validate(list(purchase_ids),
-                        'shipment_update')
+                with Transaction().set_user(0, set_context=True):
+                    purchase_obj.process(list(purchase_ids))
         return res
 Move()
 
@@ -1869,7 +1944,9 @@ class Invoice(ModelSQL, ModelView):
                         'an invoice generated by a purchase.',
             })
 
-    def button_draft(self, ids):
+    @ModelView.button
+    @Workflow.transition('draft')
+    def draft(self, ids):
         purchase_obj = Pool().get('purchase.purchase')
         purchase_ids = purchase_obj.search([
             ('invoices', 'in', ids),
@@ -1878,7 +1955,7 @@ class Invoice(ModelSQL, ModelView):
         if purchase_ids:
             self.raise_user_error('reset_invoice_purchase')
 
-        return super(Invoice, self).button_draft(ids)
+        return super(Invoice, self).draft(ids)
 
     def get_purchase_exception_state(self, ids, name):
         purchase_obj = Pool().get('purchase.purchase')
@@ -1888,8 +1965,10 @@ class Invoice(ModelSQL, ModelView):
 
         purchases = purchase_obj.browse(purchase_ids)
 
-        recreated_ids = tuple(i.id for p in purchases for i in p.invoices_recreated)
-        ignored_ids = tuple(i.id for p in purchases for i in p.invoices_ignored)
+        recreated_ids = tuple(i.id for p in purchases
+            for i in p.invoices_recreated)
+        ignored_ids = tuple(i.id for p in purchases
+            for i in p.invoices_ignored)
 
         res = {}.fromkeys(ids, '')
         for invoice in self.browse(ids):
@@ -1919,46 +1998,36 @@ Invoice()
 class OpenSupplier(Wizard):
     'Open Suppliers'
     _name = 'purchase.open_supplier'
-    states = {
-        'init': {
-            'result': {
-                'type': 'action',
-                'action': '_action_open',
-                'state': 'end',
-            },
-        },
-    }
+    start_state = 'open_'
+    open_ = StateAction('party.act_party_form')
 
-    def _action_open(self, datas):
+    def do_open_(self, session, action):
         pool = Pool()
         model_data_obj = pool.get('ir.model.data')
-        act_window_obj = pool.get('ir.action.act_window')
         wizard_obj = pool.get('ir.action.wizard')
         cursor = Transaction().cursor
 
-        act_window_id = model_data_obj.get_id('party', 'act_party_form')
-        res = act_window_obj.read(act_window_id)
         cursor.execute("SELECT DISTINCT(party) FROM purchase_purchase")
         supplier_ids = [line[0] for line in cursor.fetchall()]
-        res['pyson_domain'] = PYSONEncoder().encode(
-                [('id', 'in', supplier_ids)])
+        action['pyson_domain'] = PYSONEncoder().encode(
+            [('id', 'in', supplier_ids)])
 
         model_data_ids = model_data_obj.search([
             ('fs_id', '=', 'act_open_supplier'),
             ('module', '=', 'purchase'),
-            ('inherit', '=', False),
+            ('inherit', '=', None),
             ], limit=1)
         model_data = model_data_obj.browse(model_data_ids[0])
         wizard = wizard_obj.browse(model_data.db_id)
 
-        res['name'] = wizard.name
-        return res
+        action['name'] = wizard.name
+        return action, {}
 
 OpenSupplier()
 
 
 class HandleShipmentExceptionAsk(ModelView):
-    'Shipment Exception Ask'
+    'Handle Shipment Exception'
     _name = 'purchase.handle.shipment.exception.ask'
     _description = __doc__
 
@@ -1979,70 +2048,47 @@ class HandleShipmentExceptionAsk(ModelView):
                 (module_name,))
         super(HandleShipmentExceptionAsk, self).init(module_name)
 
-    def default_recreate_moves(self):
-        return self.default_domain_moves()
+HandleShipmentExceptionAsk()
 
-    def default_domain_moves(self):
-        purchase_line_obj = Pool().get('purchase.line')
-        active_id = Transaction().context.get('active_id')
-        if not active_id:
-            return []
 
-        line_ids = purchase_line_obj.search([
-            ('purchase', '=', active_id),
+class HandleShipmentException(Wizard):
+    'Handle Shipment Exception'
+    _name = 'purchase.handle.shipment.exception'
+    start_state = 'ask'
+    ask = StateView('purchase.handle.shipment.exception.ask',
+        'purchase.handle_shipment_exception_ask_view_form', [
+            Button('Cancel', 'end', 'tryton-cancel'),
+            Button('Ok', 'handle', 'tryton-ok', default=True),
             ])
-        lines = purchase_line_obj.browse(line_ids)
+    handle = StateTransition()
+
+    def default_ask(self, session, fields):
+        purchase_obj = Pool().get('purchase.purchase')
+
+        purchase = purchase_obj.browse(Transaction().context['active_id'])
 
-        domain_moves = []
-        for line in lines:
+        moves = []
+        for line in purchase.lines:
             skip_ids = set(x.id for x in line.moves_ignored + \
                                line.moves_recreated)
             for move in line.moves:
                 if move.state == 'cancel' and move.id not in skip_ids:
-                    domain_moves.append(move.id)
-
-        return domain_moves
+                    moves.append(move.id)
+        return {
+            'to_recreate': moves,
+            'domain_moves': moves,
+            }
 
-HandleShipmentExceptionAsk()
-
-class HandleShipmentException(Wizard):
-    'Handle Shipment Exception'
-    _name = 'purchase.handle.shipment.exception'
-    states = {
-        'init': {
-            'actions': [],
-            'result': {
-                'type': 'form',
-                'object': 'purchase.handle.shipment.exception.ask',
-                'state': [
-                    ('end', 'Cancel', 'tryton-cancel'),
-                    ('ok', 'Ok', 'tryton-ok', True),
-                ],
-            },
-        },
-        'ok': {
-            'result': {
-                'type': 'action',
-                'action': '_handle_moves',
-                'state': 'end',
-            },
-        },
-    }
-
-    def _handle_moves(self, data):
+    def transition_handle(self, session):
         pool = Pool()
         purchase_obj = pool.get('purchase.purchase')
         purchase_line_obj = pool.get('purchase.line')
-        move_obj = pool.get('stock.move')
-        to_recreate = data['form']['recreate_moves'][0][1]
-        domain_moves = data['form']['domain_moves'][0][1]
+        to_recreate = [x.id for x in session.ask.recreate_moves]
+        domain_moves = [x.id for x in session.ask.domain_moves]
 
-        line_ids = purchase_line_obj.search([
-            ('purchase', '=', data['id']),
-            ])
-        lines = purchase_line_obj.browse(line_ids)
+        purchase = purchase_obj.browse(Transaction().context['active_id'])
 
-        for line in lines:
+        for line in purchase.lines:
             moves_ignored = []
             moves_recreated = []
             skip_ids = set(x.id for x in line.moves_ignored)
@@ -2060,13 +2106,13 @@ class HandleShipmentException(Wizard):
                 'moves_recreated': [('add', moves_recreated)],
                 })
 
-        purchase_obj.workflow_trigger_validate(data['id'], 'shipment_ok')
+        purchase_obj.process([purchase.id])
 
 HandleShipmentException()
 
 
 class HandleInvoiceExceptionAsk(ModelView):
-    'Invoice Exception Ask'
+    'Handle Invoice Exception'
     _name = 'purchase.handle.invoice.exception.ask'
     _description = __doc__
 
@@ -2079,59 +2125,41 @@ class HandleInvoiceExceptionAsk(ModelView):
     domain_invoices = fields.Many2Many(
         'account.invoice', None, None, 'Domain Invoices')
 
-    def default_recreate_invoices(self):
-        return self.default_domain_invoices()
+HandleInvoiceExceptionAsk()
+
 
-    def default_domain_invoices(self):
+class HandleInvoiceException(Wizard):
+    'Handle Invoice Exception'
+    _name = 'purchase.handle.invoice.exception'
+    start_state = 'ask'
+    ask = StateView('purchase.handle.invoice.exception.ask',
+        'purchase.handle_invoice_exception_ask_view_form', [
+            Button('Cancel', 'end', 'tryton-cancel'),
+            Button('Ok', 'handle', 'tryton-ok', default=True),
+            ])
+    handle = StateTransition()
+
+    def default_ask(self, session, fields):
         purchase_obj = Pool().get('purchase.purchase')
-        active_id = Transaction().context.get('active_id')
-        if not active_id:
-            return []
 
-        purchase = purchase_obj.browse(active_id)
+        purchase = purchase_obj.browse(Transaction().context['active_id'])
         skip_ids = set(x.id for x in purchase.invoices_ignored)
         skip_ids.update(x.id for x in purchase.invoices_recreated)
-        domain_invoices = []
+        invoices = []
         for invoice in purchase.invoices:
             if invoice.state == 'cancel' and invoice.id not in skip_ids:
-                domain_invoices.append(invoice.id)
-
-        return domain_invoices
-
-HandleInvoiceExceptionAsk()
-
-
-class HandleInvoiceException(Wizard):
-    'Handle Invoice Exception'
-    _name = 'purchase.handle.invoice.exception'
-    states = {
-        'init': {
-            'actions': [],
-            'result': {
-                'type': 'form',
-                'object': 'purchase.handle.invoice.exception.ask',
-                'state': [
-                    ('end', 'Cancel', 'tryton-cancel'),
-                    ('ok', 'Ok', 'tryton-ok', True),
-                ],
-            },
-        },
-        'ok': {
-            'result': {
-                'type': 'action',
-                'action': '_handle_invoices',
-                'state': 'end',
-            },
-        },
-    }
+                invoices.append(invoice.id)
+        return {
+            'to_recreate': invoices,
+            'domain_invoices': invoices,
+            }
 
-    def _handle_invoices(self, data):
+    def transition_handle(self, session):
         purchase_obj = Pool().get('purchase.purchase')
-        invoice_obj = Pool().get('account.invoice')
-        to_recreate = data['form']['recreate_invoices'][0][1]
-        domain_invoices = data['form']['domain_invoices'][0][1]
+        to_recreate = [x.id for x in session.ask.recreate_invoices]
+        domain_invoices = [x.id for x in session.ask.domain_invoices]
 
-        purchase = purchase_obj.browse(data['id'])
+        purchase = purchase_obj.browse(Transaction().context['active_id'])
 
         skip_ids = set(x.id for x in purchase.invoices_ignored)
         skip_ids.update(x.id for x in purchase.invoices_recreated)
@@ -2150,6 +2178,6 @@ class HandleInvoiceException(Wizard):
             'invoices_recreated': [('add', invoices_recreated)],
             })
 
-        purchase_obj.workflow_trigger_validate(data['id'], 'invoice_ok')
+        purchase_obj.process([purchase.id])
 
 HandleInvoiceException()
diff --git a/purchase.xml b/purchase.xml
index 1567f80..93227ba 100644
--- a/purchase.xml
+++ b/purchase.xml
@@ -81,20 +81,8 @@ this repository contains the full copyright notices and license terms. -->
                             <field name="warehouse"/>
                             <label name="currency"/>
                             <field name="currency"/>
-                            <field name="lines" colspan="4">
-                                <tree string="Lines" sequence="sequence" fill="1">
-                                    <field name="type"/>
-                                    <field name="product"/>
-                                    <field name="description"/>
-                                    <field name="quantity"/>
-                                    <field name="unit"/>
-                                    <field name="unit_price"/>
-                                    <field name="taxes"/>
-                                    <field name="amount"/>
-                                    <field name="sequence" tree_invisible="1"/>
-                                    <field name="unit_digits" tree_invisible="1"/>
-                                </tree>
-                            </field>
+                            <field name="lines" colspan="4"
+                                view_ids="purchase.purchase_line_view_tree_sequence"/>
                             <group col="2" colspan="2" id="states">
                                 <label name="invoice_state"/>
                                 <field name="invoice_state"/>
@@ -111,14 +99,11 @@ this repository contains the full copyright notices and license terms. -->
                                 <label name="total_amount" xalign="1.0" xexpand="1"/>
                                 <field name="total_amount" xalign="1.0" xexpand="0"/>
                                 <group col="6" colspan="2" id="buttons">
-                                    <button name="cancel" string="Cancel"
-                                        states="{'invisible': Or(Equal(Eval('state'), 'cancel'), And(Not(In(Eval('state'), ['draft', 'quotation'])), Not(Equal(Eval('invoice_state'), 'exception')), Not(Equal(Eval('shipment_state'), 'exception')))), 'readonly': Not(In(%(group_purchase)d, Eval('groups', [])))}"
+                                    <button name="cancel" type="object" string="Cancel"
                                         icon="tryton-cancel"/>
-                                    <button name="draft" string="Draft"
-                                        states="{'invisible': Not(Equal(Eval('state'), 'quotation')), 'readonly': Not(In(%(group_purchase)d, Eval('groups', [])))}"
+                                    <button name="draft" type="object" string="Draft"
                                         icon="tryton-go-previous"/>
-                                    <button name="quotation" string="Quotation"
-                                        states="{'invisible': Not(Equal(Eval('state'), 'draft')), 'readonly': Or(Not(Bool(Eval('lines'))), Not(In(%(group_purchase)d, Eval('groups', []))))}"
+                                    <button name="quote" type="object" string="Quote"
                                         icon="tryton-go-next"/>
                                     <button name="%(wizard_invoice_handle_exception)d"
                                             string="Handle Invoice Exception"
@@ -130,8 +115,7 @@ this repository contains the full copyright notices and license terms. -->
                                             type="action"
                                             states="{'invisible': Or(Not(Equal(Eval('shipment_state'), 'exception')), Equal(Eval('state'), 'cancel')), 'readonly': Not(In(%(group_purchase)d, Eval('groups', [])))}"
                                             icon="tryton-go-next"/>
-                                    <button name="confirm" string="Confirm"
-                                        states="{'invisible': Not(Equal(Eval('state'), 'quotation')), 'readonly': Not(In(%(group_purchase)d, Eval('groups', [])))}"
+                                    <button name="confirm" type="object" string="Confirm"
                                         icon="tryton-ok"/>
                                 </group>
                             </group>
@@ -145,37 +129,11 @@ this repository contains the full copyright notices and license terms. -->
                             <field name="comment" colspan="4" spell="Eval('party_lang')"/>
                         </page>
                         <page string="Invoices" id="invoices">
-                            <field name="invoices" colspan="4">
-                                <tree>
-                                    <field name="number"/>
-                                    <field name="reference"/>
-                                    <field name="invoice_date"/>
-                                    <field name="party"/>
-                                    <field name="currency"/>
-                                    <field name="untaxed_amount"/>
-                                    <field name="tax_amount"/>
-                                    <field name="total_amount"/>
-                                    <field name="state"/>
-                                    <field name="purchase_exception_state"/>
-                                    <field name="amount_to_pay_today"/>
-                                    <field name="description"/>
-                                    <field name="currency_digits" tree_invisible="1"/>
-                                </tree>
-                            </field>
+                            <field name="invoices" colspan="4"/>
                         </page>
                         <page string="Shipments" id="shipments">
-                            <field name="moves" colspan="4">
-                                <tree string="Moves">
-                                    <field name="product"/>
-                                    <field name="from_location"/>
-                                    <field name="to_location"/>
-                                    <field name="quantity"/>
-                                    <field name="uom"/>
-                                    <field name="state"/>
-                                    <field name="purchase_exception_state"/>
-                                    <field name="unit_digits" tree_invisible="1"/>
-                                </tree>
-                            </field>
+                            <field name="moves" colspan="4"
+                                view_ids="purchase.move_view_list_shipment"/>
                             <field name="shipments" colspan="4"/>
                         </page>
                     </notebook>
@@ -234,7 +192,7 @@ this repository contains the full copyright notices and license terms. -->
             <field name="action" ref="act_invoice_form"/>
         </record>
 
-        <record model="ir.ui.view" id="handle_shipment_exception_view_form">
+        <record model="ir.ui.view" id="handle_shipment_exception_ask_view_form">
             <field name="model">purchase.handle.shipment.exception.ask</field>
             <field name="type">form</field>
             <field name="arch" type="xml">
@@ -245,20 +203,14 @@ this repository contains the full copyright notices and license terms. -->
                     <label string="Choose move to recreate"
                         id="choose"
                         yalign="0.0" xalign="0.0" xexpand="1"/>
-                    <field name="recreate_moves" colspan="2">
-                        <tree string="Recreated Moves" fill="1">
-                            <field name="product"/>
-                            <field name="quantity"/>
-                            <field name="uom"/>
-                            <field name="unit_digits" tree_invisible="1"/>
-                        </tree>
-                    </field>
+                    <field name="recreate_moves" colspan="2"
+                        view_ids="stock.move_view_tree_simple"/>
                 </form>
                 ]]>
             </field>
         </record>
 
-        <record model="ir.ui.view" id="handle_invoice_exception_view_form">
+        <record model="ir.ui.view" id="handle_invoice_exception_ask_view_form">
             <field name="model">purchase.handle.invoice.exception.ask</field>
             <field name="type">form</field>
             <field name="arch" type="xml">
@@ -369,6 +321,51 @@ this repository contains the full copyright notices and license terms. -->
             <field name="perm_create" eval="True"/>
             <field name="perm_delete" eval="True"/>
         </record>
+
+        <record model="ir.model.button" id="purchase_cancel_button">
+            <field name="name">cancel</field>
+            <field name="model"
+                search="[('model', '=', 'purchase.purchase')]"/>
+        </record>
+        <record model="ir.model.button-res.group"
+            id="purchase_cancel_button_group_purchase">
+            <field name="button" ref="purchase_cancel_button"/>
+            <field name="group" ref="group_purchase"/>
+        </record>
+
+        <record model="ir.model.button" id="purchase_draft_button">
+            <field name="name">draft</field>
+            <field name="model"
+                search="[('model', '=', 'purchase.purchase')]"/>
+        </record>
+        <record model="ir.model.button-res.group"
+            id="purchase_draft_button_group_purchase">
+            <field name="button" ref="purchase_draft_button"/>
+            <field name="group" ref="group_purchase"/>
+        </record>
+
+        <record model="ir.model.button" id="purchase_quote_button">
+            <field name="name">quote</field>
+            <field name="model"
+                search="[('model', '=', 'purchase.purchase')]"/>
+        </record>
+        <record model="ir.model.button-res.group"
+            id="purchase_quote_button_group_purchase">
+            <field name="button" ref="purchase_quote_button"/>
+            <field name="group" ref="group_purchase"/>
+        </record>
+
+        <record model="ir.model.button" id="purchase_confirm_button">
+            <field name="name">confirm</field>
+            <field name="model"
+                search="[('model', '=', 'purchase.purchase')]"/>
+        </record>
+        <record model="ir.model.button-res.group"
+            id="purchase_confirm_button_group_purchase">
+            <field name="button" ref="purchase_confirm_button"/>
+            <field name="group" ref="group_purchase"/>
+        </record>
+
         <record model="ir.sequence.type" id="sequence_type_purchase">
             <field name="name">Purchase</field>
             <field name="code">purchase.purchase</field>
@@ -388,284 +385,6 @@ this repository contains the full copyright notices and license terms. -->
             <field name="name">Purchase</field>
             <field name="code">purchase.purchase</field>
         </record>
-        <record model="workflow" id="purchase_workflow">
-            <field name="name">Purchase workflow</field>
-            <field name="model">purchase.purchase</field>
-            <field name="on_create" eval="True"/>
-        </record>
-        <record model="workflow.activity" id="purchase_activity_draft">
-            <field name="name">Draft</field>
-            <field name="workflow" ref="purchase_workflow"/>
-            <field name="method">wkf_draft</field>
-            <field name="flow_start" eval="True"/>
-        </record>
-        <record model="workflow.activity" id="purchase_activity_quotation">
-            <field name="name">Quotation</field>
-            <field name="workflow" ref="purchase_workflow"/>
-            <field name="method">wkf_quotation</field>
-        </record>
-        <record model="workflow.activity" id="purchase_activity_confirmed">
-            <field name="name">Confirmed</field>
-            <field name="workflow" ref="purchase_workflow"/>
-            <field name="split_mode">AND</field>
-            <field name="method">wkf_confirmed</field>
-        </record>
-        <record model="workflow.activity" id="purchase_activity_invoice_method">
-            <field name="name">Invoice Method</field>
-            <field name="workflow" ref="purchase_workflow"/>
-            <field name="split_mode">OR</field>
-        </record>
-        <record model="workflow.activity" id="purchase_activity_waiting_invoice_purchase">
-            <field name="name">Waiting Invoice</field>
-            <field name="workflow" ref="purchase_workflow"/>
-            <field name="method">wkf_invoice_waiting</field>
-        </record>
-        <record model="workflow.activity" id="purchase_activity_invoice_purchase_exception">
-            <field name="name">Invoice Exception</field>
-            <field name="workflow" ref="purchase_workflow"/>
-            <field name="method">wkf_invoice_exception</field>
-        </record>
-        <record model="workflow.activity" id="purchase_activity_invoice_done">
-            <field name="name">Invoice Done</field>
-            <field name="workflow" ref="purchase_workflow"/>
-            <field name="method">wkf_invoice_done</field>
-        </record>
-        <record model="workflow.activity" id="purchase_activity_invoice_method_done">
-            <field name="name">Invoice Method Done</field>
-            <field name="workflow" ref="purchase_workflow"/>
-        </record>
-        <record model="workflow.activity" id="purchase_activity_waiting_shipment">
-            <field name="name">Waiting Shipment</field>
-            <field name="workflow" ref="purchase_workflow"/>
-            <field name="method">wkf_shipment_waiting</field>
-        </record>
-        <record model="workflow.activity" id="purchase_activity_shipment_exception">
-            <field name="name">Shipment Exception</field>
-            <field name="workflow" ref="purchase_workflow"/>
-            <field name="method">wkf_shipment_exception</field>
-        </record>
-        <record model="workflow.activity" id="purchase_activity_invoice_shipment_method">
-            <field name="name">Invoice Shipment Method</field>
-            <field name="workflow" ref="purchase_workflow"/>
-            <field name="split_mode">OR</field>
-        </record>
-        <record model="workflow.activity" id="purchase_activity_invoice_shipment">
-            <field name="name">Invoice Shipment</field>
-            <field name="workflow" ref="purchase_workflow"/>
-            <field name="method">wkf_invoice_shipment</field>
-        </record>
-        <record model="workflow.activity" id="purchase_activity_waiting_invoice_shipment">
-            <field name="name">Waiting Invoice Shipment</field>
-            <field name="workflow" ref="purchase_workflow"/>
-            <field name="method">wkf_invoice_shipment_waiting</field>
-        </record>
-        <record model="workflow.activity" id="purchase_activity_invoice_shipment_exception">
-            <field name="name">Invoice Shipment Exception</field>
-            <field name="workflow" ref="purchase_workflow"/>
-            <field name="method">wkf_invoice_shipment_exception</field>
-        </record>
-        <record model="workflow.activity" id="purchase_activity_invoice_shipment_done">
-            <field name="name">Invoice Shipment Done</field>
-            <field name="workflow" ref="purchase_workflow"/>
-            <field name="method">wkf_invoice_shipment_done</field>
-        </record>
-        <record model="workflow.activity" id="purchase_activity_invoice_shipment_method_done">
-            <field name="name">Invoice Shipment Method Done</field>
-            <field name="workflow" ref="purchase_workflow"/>
-            <field name="method">wkf_invoice_shipment_method_done</field>
-        </record>
-        <record model="workflow.activity" id="purchase_activity_done">
-            <field name="name">Done</field>
-            <field name="workflow" ref="purchase_workflow"/>
-            <field name="join_mode">AND</field>
-            <field name="method">wkf_done</field>
-            <field name="flow_stop" eval="True"/>
-        </record>
-        <record model="workflow.activity" id="purchase_activity_cancel">
-            <field name="name">Canceled</field>
-            <field name="workflow" ref="purchase_workflow"/>
-            <field name="method">wkf_cancel</field>
-            <field name="flow_stop" eval="True"/>
-        </record>
-        <record model="workflow.transition" id="purchase_transition_draft_quotation">
-            <field name="act_from" ref="purchase_activity_draft"/>
-            <field name="act_to" ref="purchase_activity_quotation"/>
-            <field name="condition">wkf_draft2quotation</field>
-            <field name="signal">quotation</field>
-            <field name="group" ref="group_purchase"/>
-        </record>
-        <record model="workflow.transition" id="purchase_transition_draft_cancel">
-            <field name="act_from" ref="purchase_activity_draft"/>
-            <field name="act_to" ref="purchase_activity_cancel"/>
-            <field name="signal">cancel</field>
-            <field name="group" ref="group_purchase"/>
-        </record>
-        <record model="workflow.transition" id="purchase_transition_quotation_draft">
-            <field name="act_from" ref="purchase_activity_quotation"/>
-            <field name="act_to" ref="purchase_activity_draft"/>
-            <field name="signal">draft</field>
-            <field name="group" ref="group_purchase"/>
-        </record>
-        <record model="workflow.transition" id="purchase_transition_quotation_confirmed">
-            <field name="act_from" ref="purchase_activity_quotation"/>
-            <field name="act_to" ref="purchase_activity_confirmed"/>
-            <field name="signal">confirm</field>
-            <field name="group" ref="group_purchase"/>
-        </record>
-        <record model="workflow.transition" id="purchase_transition_quotation_cancel">
-            <field name="act_from" ref="purchase_activity_quotation"/>
-            <field name="act_to" ref="purchase_activity_cancel"/>
-            <field name="signal">cancel</field>
-            <field name="group" ref="group_purchase"/>
-        </record>
-        <record model="workflow.transition" id="purchase_transition_confirmed_invoice_method">
-            <field name="act_from" ref="purchase_activity_confirmed"/>
-            <field name="act_to" ref="purchase_activity_invoice_method"/>
-        </record>
-        <record model="workflow.transition" id="purchase_transition_invoice_method_waiting_invoice_purchase">
-            <field name="act_from" ref="purchase_activity_invoice_method"/>
-            <field name="act_to" ref="purchase_activity_waiting_invoice_purchase"/>
-            <field name="condition">wkf_invoice_method2invoice_waiting</field>
-        </record>
-        <record model="workflow.transition" id="purchase_transition_invoice_method_invoice_done">
-            <field name="act_from" ref="purchase_activity_invoice_method"/>
-            <field name="act_to" ref="purchase_activity_invoice_method_done"/>
-            <field name="condition">wkf_invoice_method2invoice_done</field>
-        </record>
-        <record model="workflow.transition" id="purchase_transition_waiting_invoice_purchase_invoice_purchase_exception">
-            <field name="act_from" ref="purchase_activity_waiting_invoice_purchase"/>
-            <field name="act_to" ref="purchase_activity_invoice_purchase_exception"/>
-            <field name="trigger_model">account.invoice</field>
-            <field name="trigger_ids">wkf_triggered_invoices</field>
-            <field name="condition">wkf_invoice_waiting2invoice_purchase_exception</field>
-        </record>
-        <record model="workflow.transition" id="purchase_transition_invoice_purchase_exception_invoice_purchase">
-            <field name="act_from" ref="purchase_activity_invoice_purchase_exception"/>
-            <field name="act_to" ref="purchase_activity_waiting_invoice_purchase"/>
-            <field name="signal">invoice_ok</field>
-            <field name="group" ref="group_purchase"/>
-        </record>
-        <record model="workflow.transition" id="purchase_transition_invoice_purchase_exception_cancel">
-            <field name="act_from" ref="purchase_activity_invoice_purchase_exception"/>
-            <field name="act_to" ref="purchase_activity_cancel"/>
-            <field name="signal">cancel</field>
-            <field name="group" ref="group_purchase"/>
-        </record>
-        <record model="workflow.transition" id="purchase_transition_waiting_invoice_purchase_invoice_done">
-            <field name="act_from" ref="purchase_activity_waiting_invoice_purchase"/>
-            <field name="act_to" ref="purchase_activity_invoice_done"/>
-            <field name="trigger_model">account.invoice</field>
-            <field name="trigger_ids">wkf_triggered_invoices</field>
-            <field name="condition">wkf_invoice_waiting2invoice_done</field>
-        </record>
-        <record model="workflow.transition" id="purchase_transition_invoice_done_invoice_method_done">
-            <field name="act_from" ref="purchase_activity_invoice_done"/>
-            <field name="act_to" ref="purchase_activity_invoice_method_done"/>
-        </record>
-        <record model="workflow.transition" id="purchase_transition_invoice_method_done_done">
-            <field name="act_from" ref="purchase_activity_invoice_method_done"/>
-            <field name="act_to" ref="purchase_activity_done"/>
-        </record>
-        <record model="workflow.transition" id="purchase_transition_confirmed_waiting_shipment">
-            <field name="act_from" ref="purchase_activity_confirmed"/>
-            <field name="act_to" ref="purchase_activity_waiting_shipment"/>
-        </record>
-        <record model="workflow.transition" id="purchase_transition_waiting_shipment_shipment_exception">
-            <field name="act_from" ref="purchase_activity_waiting_shipment"/>
-            <field name="act_to" ref="purchase_activity_shipment_exception"/>
-            <field name="signal">shipment_update</field>
-            <field name="condition">wkf_shipment_waiting2shipment_exception</field>
-        </record>
-        <record model="workflow.transition" id="purchase_transition_shipment_exception_cancel">
-            <field name="act_from" ref="purchase_activity_shipment_exception"/>
-            <field name="act_to" ref="purchase_activity_cancel"/>
-            <field name="signal">cancel</field>
-            <field name="group" ref="group_purchase"/>
-        </record>
-        <record model="workflow.transition" id="purchase_transition_shipment_exception_waiting_shipment">
-            <field name="act_from" ref="purchase_activity_shipment_exception"/>
-            <field name="act_to" ref="purchase_activity_waiting_shipment"/>
-            <field name="signal">shipment_ok</field>
-            <field name="group" ref="group_purchase"/>
-        </record>
-        <record model="workflow.transition" id="purchase_transition_waiting_shipment_invoice_shipment_method">
-            <field name="act_from" ref="purchase_activity_waiting_shipment"/>
-            <field name="act_to" ref="purchase_activity_invoice_shipment_method"/>
-            <field name="signal">shipment_update</field>
-            <field
-                name="condition">wkf_shipment_waiting2invoice_shipment_method</field>
-        </record>
-        <record model="workflow.transition" id="purchase_transition_waiting_shipment_invoice_shipment_method2">
-            <field name="act_from" ref="purchase_activity_waiting_shipment"/>
-            <field name="act_to" ref="purchase_activity_invoice_shipment_method"/>
-            <field
-                name="condition">wkf_shipment_waiting2invoice_shipment_method_nosignal</field>
-        </record>
-        <record model="workflow.transition" id="purchase_transition_invoice_shipment_method_invoice_shipment">
-            <field name="act_from" ref="purchase_activity_invoice_shipment_method"/>
-            <field name="act_to" ref="purchase_activity_invoice_shipment"/>
-            <field
-                name="condition">wkf_invoice_shipment_method2invoice_shipment</field>
-        </record>
-        <record model="workflow.transition" id="purchase_transition_invoice_shipment_method_invoice_shipment_method_done">
-            <field name="act_from" ref="purchase_activity_invoice_shipment_method"/>
-            <field name="act_to" ref="purchase_activity_invoice_shipment_method_done"/>
-            <field
-                name="condition">wkf_invoice_shipment_method2inv_shipment_method_done</field>
-        </record>
-        <record model="workflow.transition" id="purchase_transition_invoice_shipment_method_waiting_shipment">
-            <field name="act_from" ref="purchase_activity_invoice_shipment_method"/>
-            <field name="act_to" ref="purchase_activity_waiting_shipment"/>
-            <field
-                name="condition">wkf_invoice_shipment_method2shipment_waiting</field>
-        </record>
-        <record model="workflow.transition" id="purchase_transition_invoice_shipment_waiting_shipment">
-            <field name="act_from" ref="purchase_activity_invoice_shipment"/>
-            <field name="act_to" ref="purchase_activity_waiting_shipment"/>
-            <field name="condition">wkf_invoice_shipment2shipment_waiting</field>
-        </record>
-        <record model="workflow.transition" id="purchase_transition_invoice_shipment_waiting_invoice_shipment">
-            <field name="act_from" ref="purchase_activity_invoice_shipment"/>
-            <field name="act_to" ref="purchase_activity_waiting_invoice_shipment"/>
-            <field
-                name="condition">wkf_invoice_shipment2waiting_invoice_shipment</field>
-        </record>
-        <record model="workflow.transition" id="purchase_transition_waiting_invoice_shipment_invoice_shipment_exception">
-            <field name="act_from" ref="purchase_activity_waiting_invoice_shipment"/>
-            <field name="act_to" ref="purchase_activity_invoice_shipment_exception"/>
-            <field name="trigger_model">account.invoice</field>
-            <field name="trigger_ids">wkf_triggered_invoices</field>
-            <field
-                name="condition">wkf_waiting_invoice_shipment2invoice_shipment_exception</field>
-        </record>
-        <record model="workflow.transition" id="purchase_transition_invoice_shipment_exception_cancel">
-            <field name="act_from" ref="purchase_activity_invoice_shipment_exception"/>
-            <field name="act_to" ref="purchase_activity_cancel"/>
-            <field name="signal">cancel</field>
-            <field name="group" ref="group_purchase"/>
-        </record>
-        <record model="workflow.transition" id="purchase_transition_invoice_shipment_exception_waiting_invoice_shipment">
-            <field name="act_from" ref="purchase_activity_invoice_shipment_exception"/>
-            <field name="act_to" ref="purchase_activity_waiting_invoice_shipment"/>
-            <field name="signal">invoice_ok</field>
-            <field name="group" ref="group_purchase"/>
-        </record>
-        <record model="workflow.transition" id="purchase_transition_waiting_invoice_shipment_invoice_shipment_done">
-            <field name="act_from" ref="purchase_activity_waiting_invoice_shipment"/>
-            <field name="act_to" ref="purchase_activity_invoice_shipment_done"/>
-            <field name="trigger_model">account.invoice</field>
-            <field name="trigger_ids">wkf_triggered_invoices</field>
-            <field
-                name="condition">wkf_waiting_invoice_shipment2invoice_shipment_done</field>
-        </record>
-        <record model="workflow.transition" id="purchase_transition_invoice_shipment_done_invoice_shipment_method_done">
-            <field name="act_from" ref="purchase_activity_invoice_shipment_done"/>
-            <field name="act_to" ref="purchase_activity_invoice_shipment_method_done"/>
-        </record>
-        <record model="workflow.transition" id="purchase_transition_invoice_shipment_done_done">
-            <field name="act_from" ref="purchase_activity_invoice_shipment_method_done"/>
-            <field name="act_to" ref="purchase_activity_done"/>
-        </record>
 
         <record model="ir.action.report" id="report_purchase">
             <field name="name">Purchase</field>
@@ -695,18 +414,8 @@ this repository contains the full copyright notices and license terms. -->
                             <label name="sequence"/>
                             <field name="sequence"/>
                             <label name="product"/>
-                            <field name="product">
-                                <tree string="Products">
-                                    <field name="name"/>
-                                    <field name="code"/>
-                                    <field name="list_price_uom"/>
-                                    <field name="cost_price_uom"/>
-                                    <field name="quantity"/>
-                                    <field name="forecast_quantity"/>
-                                    <field name="default_uom"/>
-                                    <field name="active"/>
-                                </tree>
-                            </field>
+                            <field name="product"
+                                view_ids="purchase.product_view_list_purchase_line"/>
                             <newline/>
                             <label name="description"/>
                             <field name="description" colspan="3"
@@ -719,6 +428,8 @@ this repository contains the full copyright notices and license terms. -->
                             <field name="unit_price"/>
                             <label name="amount"/>
                             <field name="amount"/>
+                            <label name="delivery_date"/>
+                            <field name="delivery_date"/>
                             <field name="taxes" colspan="4"/>
                         </page>
                         <page string="Notes" id="notes">
@@ -736,6 +447,7 @@ this repository contains the full copyright notices and license terms. -->
         <record model="ir.ui.view" id="purchase_line_view_tree">
             <field name="model">purchase.line</field>
             <field name="type">tree</field>
+            <field name="priority" eval="10"/>
             <field name="arch" type="xml">
                 <![CDATA[
                 <tree string="Purchase Lines">
@@ -753,6 +465,29 @@ this repository contains the full copyright notices and license terms. -->
                 ]]>
             </field>
         </record>
+
+        <record model="ir.ui.view" id="purchase_line_view_tree_sequence">
+            <field name="model">purchase.line</field>
+            <field name="type">tree</field>
+            <field name="priority" eval="20"/>
+            <field name="arch" type="xml">
+                <![CDATA[
+                <tree string="Lines" sequence="sequence">
+                    <field name="type"/>
+                    <field name="product"/>
+                    <field name="description"/>
+                    <field name="quantity"/>
+                    <field name="unit"/>
+                    <field name="unit_price"/>
+                    <field name="taxes"/>
+                    <field name="amount" expand="1"/>
+                    <field name="sequence" tree_invisible="1"/>
+                    <field name="unit_digits" tree_invisible="1"/>
+                </tree>
+                ]]>
+            </field>
+        </record>
+
         <record model="ir.model.access" id="access_purchase_line">
             <field name="model" search="[('model', '=', 'purchase.line')]"/>
             <field name="perm_read" eval="False"/>
@@ -787,6 +522,9 @@ this repository contains the full copyright notices and license terms. -->
                     <field name="code"/>
                     <label name="delivery_time"/>
                     <field name="delivery_time"/>
+                    <newline/>
+                    <label name="currency"/>
+                    <field name="currency"/>
                     <field name="prices" colspan="4"/>
                 </form>
                 ]]>
@@ -795,6 +533,7 @@ this repository contains the full copyright notices and license terms. -->
         <record model="ir.ui.view" id="product_supplier_view_tree">
             <field name="model">purchase.product_supplier</field>
             <field name="type">tree</field>
+            <field name="priority" eval="10"/>
             <field name="arch" type="xml">
                 <![CDATA[
                 <tree string="Product Suppliers">
@@ -807,6 +546,22 @@ this repository contains the full copyright notices and license terms. -->
                 ]]>
             </field>
         </record>
+
+        <record model="ir.ui.view" id="product_supplier_view_tree_sequence">
+            <field name="model">purchase.product_supplier</field>
+            <field name="type">tree</field>
+            <field name="priority" eval="20"/>
+            <field name="arch" type="xml">
+                <![CDATA[
+                <tree string="Product Suppliers" sequence="sequence">
+                    <field name="party"/>
+                    <field name="name"/>
+                    <field name="code"/>
+                </tree>
+                ]]>
+            </field>
+        </record>
+
         <record model="ir.rule.group" id="rule_group_product_supplier">
             <field name="model" search="[('model', '=', 'purchase.product_supplier')]"/>
             <field name="global_p" eval="True"/>
@@ -868,14 +623,8 @@ this repository contains the full copyright notices and license terms. -->
                             <field name="purchasable"/>
                             <label name="purchase_uom"/>
                             <field name="purchase_uom"/>
-                            <field name="product_suppliers" colspan="4">
-                                <tree string="Product Suppliers" sequence="sequence">
-                                    <field name="party"/>
-                                    <field name="name"/>
-                                    <field name="code"/>
-                                    <field name="sequence" tree_invisible="1"/>
-                                </tree>
-                            </field>
+                            <field name="product_suppliers" colspan="4"
+                                view_ids="purchase.product_supplier_view_tree_sequence"/>
                         </page>
                     </xpath>
                 </data>
@@ -897,21 +646,6 @@ this repository contains the full copyright notices and license terms. -->
             </field>
         </record>
 
-        <record model="ir.ui.view" id="shipment_in_view_form">
-            <field name="model">stock.shipment.in</field>
-            <field name="inherit" ref="stock.shipment_in_view_form"/>
-            <field name="arch" type="xml">
-                <![CDATA[
-                <data>
-                    <xpath expr="/form/notebook/page/field[@name="incoming_moves"]/tree/field[@name="uom"]"
-                        position="after">
-                        <field name="purchase"/>
-                    </xpath>
-                </data>
-                ]]>
-            </field>
-        </record>
-
         <record model="ir.ui.view" id="move_view_form">
             <field name="model">stock.move</field>
             <field name="inherit" ref="stock.move_view_form"/>
diff --git a/setup.py b/setup.py
index fbb5df3..a0ddb80 100644
--- a/setup.py
+++ b/setup.py
@@ -12,7 +12,7 @@ minor_version = int(minor_version)
 
 requires = []
 for dep in info.get('depends', []):
-    if not re.match(r'(ir|res|workflow|webdav)(\W|$)', dep):
+    if not re.match(r'(ir|res|webdav)(\W|$)', dep):
         requires.append('trytond_%s >= %s.%s, < %s.%s' %
                 (dep, major_version, minor_version, major_version,
                     minor_version + 1))
diff --git a/stock.xml b/stock.xml
new file mode 100644
index 0000000..dad46a1
--- /dev/null
+++ b/stock.xml
@@ -0,0 +1,26 @@
+<?xml version="1.0"?>
+<!-- This file is part of Tryton.  The COPYRIGHT file at the top level of
+this repository contains the full copyright notices and license terms. -->
+<tryton>
+    <data>
+        <record model="ir.ui.view" id="move_view_list_shipment">
+            <field name="model">stock.move</field>
+            <field name="type">tree</field>
+            <field name="priority" eval="20"/>
+            <field name="arch" type="xml">
+                <![CDATA[
+                <tree string="Moves">
+                    <field name="product"/>
+                    <field name="from_location"/>
+                    <field name="to_location"/>
+                    <field name="quantity"/>
+                    <field name="uom"/>
+                    <field name="state"/>
+                    <field name="purchase_exception_state"/>
+                    <field name="unit_digits" tree_invisible="1"/>
+                </tree>
+                ]]>
+            </field>
+        </record>
+    </data>
+</tryton>
diff --git a/tests/__init__.py b/tests/__init__.py
index 56a98e7..fdda836 100644
--- a/tests/__init__.py
+++ b/tests/__init__.py
@@ -1,4 +1,4 @@
 #This file is part of Tryton.  The COPYRIGHT file at the top level of
 #this repository contains the full copyright notices and license terms.
 
-from test_purchase import suite
+from .test_purchase import suite
diff --git a/tests/test_purchase.py b/tests/test_purchase.py
index 620ac79..4ed2b7b 100644
--- a/tests/test_purchase.py
+++ b/tests/test_purchase.py
@@ -2,7 +2,8 @@
 #This file is part of Tryton.  The COPYRIGHT file at the top level of
 #this repository contains the full copyright notices and license terms.
 
-import sys, os
+import sys
+import os
 DIR = os.path.abspath(os.path.normpath(os.path.join(__file__,
     '..', '..', '..', '..', '..', 'trytond')))
 if os.path.isdir(DIR):
@@ -33,6 +34,7 @@ class PurchaseTestCase(unittest.TestCase):
         '''
         test_depends()
 
+
 def suite():
     suite = trytond.tests.test_tryton.suite()
     suite.addTests(unittest.TestLoader().loadTestsFromTestCase(
diff --git a/trytond_purchase.egg-info/PKG-INFO b/trytond_purchase.egg-info/PKG-INFO
index c64b585..30b0cb2 100644
--- a/trytond_purchase.egg-info/PKG-INFO
+++ b/trytond_purchase.egg-info/PKG-INFO
@@ -1,6 +1,6 @@
 Metadata-Version: 1.0
 Name: trytond-purchase
-Version: 2.2.0
+Version: 2.4.0
 Summary: Define purchase order.
 Add product supplier and purchase informations.
 Define the purchase price as the supplier price or the cost price.
@@ -16,7 +16,7 @@ Home-page: http://www.tryton.org/
 Author: B2CK
 Author-email: info at b2ck.com
 License: GPL-3
-Download-URL: http://downloads.tryton.org/2.2/
+Download-URL: http://downloads.tryton.org/2.4/
 Description: UNKNOWN
 Platform: UNKNOWN
 Classifier: Development Status :: 5 - Production/Stable
diff --git a/trytond_purchase.egg-info/SOURCES.txt b/trytond_purchase.egg-info/SOURCES.txt
index 6a215f4..2aafab6 100644
--- a/trytond_purchase.egg-info/SOURCES.txt
+++ b/trytond_purchase.egg-info/SOURCES.txt
@@ -7,9 +7,11 @@ README
 TODO
 configuration.xml
 party.xml
+product.xml
 purchase.odt
 purchase.xml
 setup.py
+stock.xml
 ./__init__.py
 ./__tryton__.py
 ./configuration.py
@@ -19,8 +21,10 @@ setup.py
 ./tests/test_purchase.py
 doc/index.rst
 locale/bg_BG.po
+locale/ca_ES.po
 locale/cs_CZ.po
 locale/de_DE.po
+locale/es_AR.po
 locale/es_CO.po
 locale/es_ES.po
 locale/fr_FR.po
diff --git a/trytond_purchase.egg-info/requires.txt b/trytond_purchase.egg-info/requires.txt
index e3b51f8..a073a56 100644
--- a/trytond_purchase.egg-info/requires.txt
+++ b/trytond_purchase.egg-info/requires.txt
@@ -1,9 +1,9 @@
-trytond_company >= 2.2, < 2.3
-trytond_party >= 2.2, < 2.3
-trytond_stock >= 2.2, < 2.3
-trytond_account >= 2.2, < 2.3
-trytond_product >= 2.2, < 2.3
-trytond_account_invoice >= 2.2, < 2.3
-trytond_currency >= 2.2, < 2.3
-trytond_account_product >= 2.2, < 2.3
-trytond >= 2.2, < 2.3
\ No newline at end of file
+trytond_company >= 2.4, < 2.5
+trytond_party >= 2.4, < 2.5
+trytond_stock >= 2.4, < 2.5
+trytond_account >= 2.4, < 2.5
+trytond_product >= 2.4, < 2.5
+trytond_account_invoice >= 2.4, < 2.5
+trytond_currency >= 2.4, < 2.5
+trytond_account_product >= 2.4, < 2.5
+trytond >= 2.4, < 2.5
\ No newline at end of file
commit d5f032ee013eb81e9e9d5ed01bd7069186064f1f
Author: Mathias Behrle <mathiasb at m9s.biz>
Date:   Mon Oct 31 16:21:18 2011 +0100

    Adding upstream version 2.2.0.

diff --git a/CHANGELOG b/CHANGELOG
index 2f635f7..9e84f65 100644
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -1,10 +1,4 @@
-Version 2.0.3 - 2011-10-01
-* Bug fixes (see mercurial logs for details)
-
-Version 2.0.2 - 2011-09-10
-* Bug fixes (see mercurial logs for details)
-
-Version 2.0.1 - 2011-05-29
+Version 2.2.0 - 2011-10-25
 * Bug fixes (see mercurial logs for details)
 
 Version 2.0.0 - 2011-04-27
diff --git a/MANIFEST.in b/MANIFEST.in
index dcb2afa..32879df 100644
--- a/MANIFEST.in
+++ b/MANIFEST.in
@@ -6,5 +6,5 @@ include CHANGELOG
 include LICENSE
 include *.xml
 include *.odt
-include *.csv
+include locale/*.po
 include doc/*
diff --git a/PKG-INFO b/PKG-INFO
index fcc34da..0ced27d 100644
--- a/PKG-INFO
+++ b/PKG-INFO
@@ -1,6 +1,6 @@
 Metadata-Version: 1.0
 Name: trytond_purchase
-Version: 2.0.3
+Version: 2.2.0
 Summary: Define purchase order.
 Add product supplier and purchase informations.
 Define the purchase price as the supplier price or the cost price.
@@ -16,22 +16,25 @@ Home-page: http://www.tryton.org/
 Author: B2CK
 Author-email: info at b2ck.com
 License: GPL-3
-Download-URL: http://downloads.tryton.org/2.0/
+Download-URL: http://downloads.tryton.org/2.2/
 Description: UNKNOWN
 Platform: UNKNOWN
 Classifier: Development Status :: 5 - Production/Stable
 Classifier: Environment :: Plugins
+Classifier: Framework :: Tryton
 Classifier: Intended Audience :: Developers
 Classifier: Intended Audience :: Financial and Insurance Industry
 Classifier: Intended Audience :: Legal Industry
 Classifier: License :: OSI Approved :: GNU General Public License (GPL)
 Classifier: Natural Language :: Bulgarian
+Classifier: Natural Language :: Czech
+Classifier: Natural Language :: Dutch
 Classifier: Natural Language :: English
 Classifier: Natural Language :: French
 Classifier: Natural Language :: German
+Classifier: Natural Language :: Russian
 Classifier: Natural Language :: Spanish
 Classifier: Operating System :: OS Independent
-Classifier: Programming Language :: Python :: 2.5
 Classifier: Programming Language :: Python :: 2.6
 Classifier: Programming Language :: Python :: 2.7
 Classifier: Topic :: Office/Business
diff --git a/__tryton__.py b/__tryton__.py
index b8f6691..57f5d5f 100644
--- a/__tryton__.py
+++ b/__tryton__.py
@@ -7,7 +7,7 @@
     'name_es_CO': 'Compras',
     'name_es_ES': 'Compras',
     'name_fr_FR': 'Achat',
-    'version': '2.0.3',
+    'version': '2.2.0',
     'author': 'B2CK',
     'email': 'info at b2ck.com',
     'website': 'http://www.tryton.org/',
@@ -97,10 +97,13 @@ Avec la possibilité:
         'party.xml',
     ],
     'translation': [
-        'bg_BG.csv',
-        'de_DE.csv',
-        'es_CO.csv',
-        'es_ES.csv',
-        'fr_FR.csv',
+        'locale/bg_BG.po',
+        'locale/cs_CZ.po',
+        'locale/de_DE.po',
+        'locale/es_CO.po',
+        'locale/es_ES.po',
+        'locale/fr_FR.po',
+        'locale/nl_NL.po',
+        'locale/ru_RU.po',
     ],
 }
diff --git a/bg_BG.csv b/bg_BG.csv
deleted file mode 100644
index d18bef0..0000000
--- a/bg_BG.csv
+++ /dev/null
@@ -1,260 +0,0 @@
-type,name,res_id,src,value,fuzzy
-error,account.invoice,0,You can not delete invoices that come from a purchase!,Не може да изтривате фактури които идват от покупка!,0
-error,account.invoice,0,You cannot reset to draft an invoice generated by a purchase.,Не може да прехвърляте в проект фактура генерирана при покупка.,0
-error,product.template,0,"Purchase prices are based on the purchase uom, are you sure to change it?","Покупните цени се основават мер, ед, на покупката, сигурни ли сте че искате да я смените?",0
-error,purchase.line,0,"It misses an ""Account Expense"" on product ""%s""!","Не е зададена ""Сметка за разходи"" за продукт ""%s""!",0
-error,purchase.line,0,"It misses an ""account expense"" default property!","Няма е зададено свойство по подразбиране ""Сметка за разходи""!",0
-error,purchase.line,0,The supplier location is required!,Местонахождението на доставчика е задължително!,0
-error,purchase.purchase,0,Invoice addresses must be defined for the quotation.,За запитването трябва да бъдат зададени адреси за фактуриране .,0
-error,purchase.purchase,0,"It misses an ""Account Payable"" on the party ""%s""!","Липсва ""Разходна сметка"" за партньор ""%s""!",0
-error,stock.shipment.in,0,You cannot reset to draft a move generated by a purchase.,Не може да преместите в проект движение създадено от покупка.,0
-field,"account.invoice,purchase_exception_state",0,Exception State,Състояние на грешка,0
-field,"account.invoice,purchases",0,Purchases,Покупки,0
-field,"account.invoice.line,purchase_lines",0,Purchase Lines,Редове от покупка,0
-field,"product.template,product_suppliers",0,Suppliers,Доставчици,0
-field,"product.template,purchasable",0,Purchasable,Купуваем,0
-field,"product.template,purchase_uom",0,Purchase UOM,Мер. ед. на покупка,0
-field,"purchase.configuration,purchase_invoice_method",0,Invoice Method,Начин на фактуриране,0
-field,"purchase.configuration,purchase_sequence",0,Purchase Reference Sequence,Последователност за отпратка на покупка,0
-field,"purchase.configuration,rec_name",0,Name,Име,0
-field,"purchase.handle.invoice.exception.ask,domain_invoices",0,Domain Invoices,Фактури на домейн,0
-field,"purchase.handle.invoice.exception.ask,recreate_invoices",0,Recreate Invoices,Наново създаване на фактури,0
-field,"purchase.handle.shipment.exception.ask,domain_moves",0,Domain Moves,Движение на домейн,0
-field,"purchase.handle.shipment.exception.ask,recreate_moves",0,Recreate Moves,Наново създаване на движения,0
-field,"purchase.line,amount",0,Amount,Сума,0
-field,"purchase.line,description",0,Description,Описание,0
-field,"purchase.line,invoice_lines",0,Invoice Lines,Редове от фактура,0
-field,"purchase.line,move_done",0,Moves Done,Направени движения,0
-field,"purchase.line,move_exception",0,Moves Exception,Грешка при движение,0
-field,"purchase.line,moves",0,Moves,Движения,0
-field,"purchase.line,moves_ignored",0,Ignored Moves,Игнорирани движения,0
-field,"purchase.line,moves_recreated",0,Recreated Moves,Наново създаване на движения,0
-field,"purchase.line,note",0,Note,Бележка,0
-field,"purchase.line,product",0,Product,Продукт,0
-field,"purchase.line,purchase",0,Purchase,Покупка,0
-field,"purchase.line,quantity",0,Quantity,Количество,0
-field,"purchase.line,rec_name",0,Name,Име,0
-field,"purchase.line,sequence",0,Sequence,Последователност,0
-field,"purchase.line,taxes",0,Taxes,Данъци,0
-field,"purchase.line,type",0,Type,Вид,0
-field,"purchase.line,unit",0,Unit,Единица,0
-field,"purchase.line,unit_digits",0,Unit Digits,Десетични единици,0
-field,"purchase.line,unit_price",0,Unit Price,Единична цена,0
-field,"purchase.line-account.invoice.line,invoice_line",0,Invoice Line,Ред от фактура,0
-field,"purchase.line-account.invoice.line,purchase_line",0,Purchase Line,Ред от покупка,0
-field,"purchase.line-account.invoice.line,rec_name",0,Name,Име,0
-field,"purchase.line-account.tax,line",0,Purchase Line,Ред от покупка,0
-field,"purchase.line-account.tax,rec_name",0,Name,Име,0
-field,"purchase.line-account.tax,tax",0,Tax,Данък,0
-field,"purchase.line-ignored-stock.move,move",0,Move,Движение,0
-field,"purchase.line-ignored-stock.move,purchase_line",0,Purchase Line,Ред от покупка,0
-field,"purchase.line-ignored-stock.move,rec_name",0,Name,Име,0
-field,"purchase.line-recreated-stock.move,move",0,Move,Движение,0
-field,"purchase.line-recreated-stock.move,purchase_line",0,Purchase Line,Ред от покупка,0
-field,"purchase.line-recreated-stock.move,rec_name",0,Name,Име,0
-field,"purchase.product_supplier,code",0,Code,Код,0
-field,"purchase.product_supplier,company",0,Company,Фирма,0
-field,"purchase.product_supplier,delivery_time",0,Delivery Time,Време за доставка,0
-field,"purchase.product_supplier,name",0,Name,Име,0
-field,"purchase.product_supplier,party",0,Supplier,Доставчик,0
-field,"purchase.product_supplier,prices",0,Prices,Цени,0
-field,"purchase.product_supplier,product",0,Product,Продукт,0
-field,"purchase.product_supplier,rec_name",0,Name,Име,0
-field,"purchase.product_supplier,sequence",0,Sequence,Последователност,0
-field,"purchase.product_supplier.price,product_supplier",0,Supplier,Доставчик,0
-field,"purchase.product_supplier.price,quantity",0,Quantity,Количество,0
-field,"purchase.product_supplier.price,rec_name",0,Name,Име,0
-field,"purchase.product_supplier.price,unit_price",0,Unit Price,Единична цена,0
-field,"purchase.purchase,comment",0,Comment,Коментар,0
-field,"purchase.purchase,company",0,Company,Фирма,0
-field,"purchase.purchase,currency",0,Currency,Валута,0
-field,"purchase.purchase,currency_digits",0,Currency Digits,Цифри за валута,0
-field,"purchase.purchase,description",0,Description,Описание,0
-field,"purchase.purchase,invoice_address",0,Invoice Address,Адрес за фактура,0
-field,"purchase.purchase,invoice_exception",0,Invoices Exception,Грешка при фактури,0
-field,"purchase.purchase,invoice_method",0,Invoice Method,Начин на фактуриране,0
-field,"purchase.purchase,invoice_paid",0,Invoices Paid,Платени фактури,0
-field,"purchase.purchase,invoice_state",0,Invoice State,Състояние на фактура,0
-field,"purchase.purchase,invoices",0,Invoices,Фактури,0
-field,"purchase.purchase,invoices_ignored",0,Ignored Invoices,Игнорирани фактури,0
-field,"purchase.purchase,invoices_recreated",0,Recreated Invoices,Наново създадени на фактури,0
-field,"purchase.purchase,lines",0,Lines,Редове,0
-field,"purchase.purchase,moves",0,Moves,Движения,0
-field,"purchase.purchase,party",0,Party,Партньор,0
-field,"purchase.purchase,party_lang",0,Party Language,Език на партньор,0
-field,"purchase.purchase,payment_term",0,Payment Term,Условие за плащане,0
-field,"purchase.purchase,purchase_date",0,Purchase Date,Дата на покупка,0
-field,"purchase.purchase,rec_name",0,Name,Име,0
-field,"purchase.purchase,reference",0,Reference,Отпратка,0
-field,"purchase.purchase,shipment_done",0,Shipment Done,Направена пратка,0
-field,"purchase.purchase,shipment_exception",0,Shipments Exception,Грешка при пратка,0
-field,"purchase.purchase,shipment_state",0,Shipment State,Състояние на пратка,0
-field,"purchase.purchase,shipments",0,Shipments,Изпращания,0
-field,"purchase.purchase,state",0,State,Състояние,0
-field,"purchase.purchase,supplier_reference",0,Supplier Reference,Отпратка към доставчик,0
-field,"purchase.purchase,tax_amount",0,Tax,Данък,0
-field,"purchase.purchase,total_amount",0,Total,Общо,0
-field,"purchase.purchase,untaxed_amount",0,Untaxed,Необложен с данък,0
-field,"purchase.purchase,warehouse",0,Warehouse,Склад,0
-field,"purchase.purchase-account.invoice,invoice",0,Invoice,Фактура,0
-field,"purchase.purchase-account.invoice,purchase",0,Purchase,Покупка,0
-field,"purchase.purchase-account.invoice,rec_name",0,Name,Име,0
-field,"purchase.purchase-ignored-account.invoice,invoice",0,Invoice,Фактура,0
-field,"purchase.purchase-ignored-account.invoice,purchase",0,Purchase,Покупка,0
-field,"purchase.purchase-ignored-account.invoice,rec_name",0,Name,Име,0
-field,"purchase.purchase-recreated-account.invoice,invoice",0,Invoice,Фактура,0
-field,"purchase.purchase-recreated-account.invoice,purchase",0,Purchase,Покупка,0
-field,"purchase.purchase-recreated-account.invoice,rec_name",0,Name,Име,0
-field,"stock.move,purchase",0,Purchase,Покупка,0
-field,"stock.move,purchase_currency",0,Purchase Currency,Валута на покупка,0
-field,"stock.move,purchase_exception_state",0,Exception State,Състояние на грешка,0
-field,"stock.move,purchase_line",0,Purchase Line,Ред от покупка,0
-field,"stock.move,purchase_quantity",0,Purchase Quantity,Количество на покупка,0
-field,"stock.move,purchase_unit",0,Purchase Unit,Единица на покупка,0
-field,"stock.move,purchase_unit_digits",0,Purchase Unit Digits,Десетични единици на покупка,0
-field,"stock.move,purchase_unit_price",0,Purchase Unit Price,Единична цена при покупка,0
-field,"stock.move,purchase_visible",0,Purchase Visible,Покупката е видима,0
-field,"stock.move,supplier",0,Supplier,Доставчик,0
-help,"purchase.handle.invoice.exception.ask,recreate_invoices",0,The selected invoices will be recreated. The other ones will be ignored.,Избраните фактури ще бъдат наново създадени. Останалите ще бъдат игнорирани.,0
-help,"purchase.handle.shipment.exception.ask,recreate_moves",0,The selected moves will be recreated. The other ones will be ignored.,"Избраните движение ще бъдат наново създадени, Останалите ще бъдат игнорирани.",0
-help,"purchase.product_supplier,delivery_time",0,In number of days,В брой дни,0
-help,"purchase.product_supplier.price,quantity",0,Minimal quantity,Минимално количество,0
-model,"ir.action,name",act_invoice_form,Invoices,Фактури,0
-model,"ir.action,name",act_open_supplier,Parties associated to Purchases,Партньори свързани с покупки,0
-model,"ir.action,name",act_purchase_configuration_form,Purchase Configuration,Конфигуриране на покупка,0
-model,"ir.action,name",act_purchase_form,Purchases,Покупки,0
-model,"ir.action,name",act_purchase_form2,Purchases,Покупки,0
-model,"ir.action,name",act_purchase_form_confirmed,Confirmed Purchases,Потвърдена покупка,0
-model,"ir.action,name",act_purchase_form_draft,Draft Purchases,Проект на покупки,0
-model,"ir.action,name",act_purchase_form_new,New Purchase,Нова покупка,0
-model,"ir.action,name",act_purchase_form_quotation,Purchases in Quotation,Покупки в запитване,0
-model,"ir.action,name",act_shipment_form,Shipments,Изпращания,0
-model,"ir.action,name",report_purchase,Purchase,Покупка,0
-model,"ir.action,name",wizard_invoice_handle_exception,Handle Invoice Exception,Обработка на грешка към фактура,0
-model,"ir.action,name",wizard_shipment_handle_exception,Handle Shipment Exception,Обработка на грешка при изпращане,0
-model,"ir.sequence,name",sequence_purchase,Purchase,Покупка,0
-model,"ir.sequence.type,name",sequence_type_purchase,Purchase,Покупка,0
-model,"ir.ui.menu,name",menu_configuration,Configuration,Конфигурация,0
-model,"ir.ui.menu,name",menu_purchase,Purchase Management,Управление на покупки,0
-model,"ir.ui.menu,name",menu_purchase_configuration,Purchase Configuration,Конфигуриране на покупка,0
-model,"ir.ui.menu,name",menu_purchase_form,Purchases,Покупки,0
-model,"ir.ui.menu,name",menu_purchase_form_confirmed,Confirmed Purchases,Потвърдена покупка,0
-model,"ir.ui.menu,name",menu_purchase_form_draft,Draft Purchases,Проект на покупки,0
-model,"ir.ui.menu,name",menu_purchase_form_new,New Purchase,Нова покупка,0
-model,"ir.ui.menu,name",menu_purchase_form_quotation,Purchases in Quotation,Покупки в запитване,0
-model,"ir.ui.menu,name",menu_reporting,Reporting,Справки,0
-model,"ir.ui.menu,name",menu_supplier,Parties associated to Purchases,Партньори свързани с покупки,0
-model,"purchase.configuration,name",0,Purchase Configuration,Конфигуриране на покупка,0
-model,"purchase.handle.invoice.exception.ask,name",0,Invoice Exception Ask,Запитване за грешка в фактура,0
-model,"purchase.handle.shipment.exception.ask,name",0,Shipment Exception Ask,Запитване за грешка при пратка,0
-model,"purchase.line,name",0,Purchase Line,Ред от покупка,0
-model,"purchase.line-account.invoice.line,name",0,Purchase Line - Invoice Line,Ред от покупка - Ред от фактура,0
-model,"purchase.line-account.tax,name",0,Purchase Line - Tax,Ред от покупка - Данък,0
-model,"purchase.line-ignored-stock.move,name",0,Purchase Line - Ignored Move,Ред от покупка - Игнорирано движение,0
-model,"purchase.line-recreated-stock.move,name",0,Purchase Line - Ignored Move,Ред от покупка - Игнорирано движение,0
-model,"purchase.product_supplier,name",0,Product Supplier,Доставчик на продукт,0
-model,"purchase.product_supplier.price,name",0,Product Supplier Price,Цена на доставчик на продукт,0
-model,"purchase.purchase,name",0,Purchase,Покупка,0
-model,"purchase.purchase-account.invoice,name",0,Purchase - Invoice,Покупка - Фактура,0
-model,"purchase.purchase-ignored-account.invoice,name",0,Purchase - Ignored Invoice,Покупка - Игнорирана фактура,0
-model,"purchase.purchase-recreated-account.invoice,name",0,Purchase - Recreated Invoice,Покупка - Наново създаване на фактури,0
-model,"res.group,name",group_purchase,Purchase,Покупка,0
-model,"res.group,name",group_purchase_admin,Purchase Administrator,Отгоровник за покупки,0
-model,"workflow,name",purchase_workflow,Purchase workflow,Работен процес на покупка,0
-model,"workflow.activity,name",purchase_activity_cancel,Canceled,Отказан,0
-model,"workflow.activity,name",purchase_activity_confirmed,Confirmed,Потвърден,0
-model,"workflow.activity,name",purchase_activity_done,Done,Приключен,0
-model,"workflow.activity,name",purchase_activity_draft,Draft,Проект,0
-model,"workflow.activity,name",purchase_activity_invoice_done,Invoice Done,Направени фактури,0
-model,"workflow.activity,name",purchase_activity_invoice_method,Invoice Method,Начин на фактуриране,0
-model,"workflow.activity,name",purchase_activity_invoice_method_done,Invoice Method Done,Направен начин на фактуриране,0
-model,"workflow.activity,name",purchase_activity_invoice_purchase_exception,Invoice Exception,Грешка при фактура,0
-model,"workflow.activity,name",purchase_activity_invoice_shipment,Invoice Shipment,Фактуриране на пратка,0
-model,"workflow.activity,name",purchase_activity_invoice_shipment_done,Invoice Shipment Done,Направено фактуриране на пратка,0
-model,"workflow.activity,name",purchase_activity_invoice_shipment_exception,Invoice Shipment Exception,Грешка при фактуриране на пратка,0
-model,"workflow.activity,name",purchase_activity_invoice_shipment_method,Invoice Shipment Method,Начин на фактуриране на изпращане,0
-model,"workflow.activity,name",purchase_activity_invoice_shipment_method_done,Invoice Shipment Method Done,Направено фактуриране на начина на изпращане,0
-model,"workflow.activity,name",purchase_activity_quotation,Quotation,Запитване,0
-model,"workflow.activity,name",purchase_activity_shipment_exception,Shipment Exception,Грешка при пратка,0
-model,"workflow.activity,name",purchase_activity_waiting_invoice_purchase,Waiting Invoice,Очакващи фактура,0
-model,"workflow.activity,name",purchase_activity_waiting_invoice_shipment,Waiting Invoice Shipment,Изчакващи фактури за пратки,0
-model,"workflow.activity,name",purchase_activity_waiting_shipment,Waiting Shipment,Очаква изпращане,0
-odt,purchase.purchase,0,Amount,Сума,0
-odt,purchase.purchase,0,Date:,Дата:,0
-odt,purchase.purchase,0,Description,Описание,0
-odt,purchase.purchase,0,Description:,Описание:,0
-odt,purchase.purchase,0,Draft Purchase Order,Проект на поръчка за покупка,0
-odt,purchase.purchase,0,E-Mail:,E-Mail:,0
-odt,purchase.purchase,0,Phone:,Телефон:,0
-odt,purchase.purchase,0,Purchase Order N°:,Поръчка за покупка N°:,0
-odt,purchase.purchase,0,Quantity,Количество,0
-odt,purchase.purchase,0,Request for Quotation N°:,Заявки за запитване N°:,0
-odt,purchase.purchase,0,Taxes,Данъци,0
-odt,purchase.purchase,0,Taxes:,Данъци:,0
-odt,purchase.purchase,0,Total (excl. taxes):,Общо (без данъци):,0
-odt,purchase.purchase,0,Total:,Общо:,0
-odt,purchase.purchase,0,Unit Price,Единична цена,0
-odt,purchase.purchase,0,VAT:,ДДС:,0
-selection,"account.invoice,purchase_exception_state",0,,,0
-selection,"account.invoice,purchase_exception_state",0,Ignored,Игнорирано,0
-selection,"account.invoice,purchase_exception_state",0,Recreated,Създаден наново,0
-selection,"purchase.configuration,purchase_invoice_method",0,Based On Order,Въз основа на поръчка,0
-selection,"purchase.configuration,purchase_invoice_method",0,Based On Shipment,Въз основа на изпращане,0
-selection,"purchase.configuration,purchase_invoice_method",0,Manual,Ръчно,0
-selection,"purchase.line,type",0,Comment,Коментар,0
-selection,"purchase.line,type",0,Line,Ред,0
-selection,"purchase.line,type",0,Subtotal,Междинна сума,0
-selection,"purchase.line,type",0,Title,Заглавие,0
-selection,"purchase.purchase,invoice_method",0,Based On Order,Въз основа на поръчка,0
-selection,"purchase.purchase,invoice_method",0,Based On Shipment,Въз основа на изпращане,0
-selection,"purchase.purchase,invoice_method",0,Manual,Ръчно,0
-selection,"purchase.purchase,invoice_state",0,Exception,Грешка,0
-selection,"purchase.purchase,invoice_state",0,None,Няма,0
-selection,"purchase.purchase,invoice_state",0,Paid,Платен,0
-selection,"purchase.purchase,invoice_state",0,Waiting,Изчакващ,0
-selection,"purchase.purchase,shipment_state",0,Exception,Грешка,0
-selection,"purchase.purchase,shipment_state",0,None,Няма,0
-selection,"purchase.purchase,shipment_state",0,Received,Получен,0
-selection,"purchase.purchase,shipment_state",0,Waiting,Изчакващ,0
-selection,"purchase.purchase,state",0,Canceled,Отказан,0
-selection,"purchase.purchase,state",0,Confirmed,Потвърден,0
-selection,"purchase.purchase,state",0,Done,Приключен,0
-selection,"purchase.purchase,state",0,Draft,Проект,0
-selection,"purchase.purchase,state",0,Quotation,Запитване,0
-selection,"stock.move,purchase_exception_state",0,,,0
-selection,"stock.move,purchase_exception_state",0,Ignored,Игнорирано,0
-selection,"stock.move,purchase_exception_state",0,Recreated,Създаден наново,0
-view,product.template,0,Product Suppliers,Доставчици на продукт,0
-view,product.template,0,Suppliers,Доставчици,0
-view,purchase.configuration,0,Purchase Configuration,Конфигуриране на покупка,0
-view,purchase.handle.invoice.exception.ask,0,Choose invoices to recreate,Избор на фактури за ново създаване,0
-view,purchase.handle.invoice.exception.ask,0,Handle Invoice Exception,Обработка на грешка към фактура,0
-view,purchase.handle.shipment.exception.ask,0,Choose moves to recreate,Избор на движения за ново създаване,0
-view,purchase.handle.shipment.exception.ask,0,Handle shipment Exception,Обработване на грешка при изпращане,0
-view,purchase.handle.shipment.exception.ask,0,Recreated Moves,Наново създаване на движения,0
-view,purchase.line,0,General,Основен,0
-view,purchase.line,0,Notes,Бележки,0
-view,purchase.line,0,Products,Продукти,0
-view,purchase.line,0,Purchase Line,Ред от покупка,0
-view,purchase.line,0,Purchase Lines,Редове от покупка,0
-view,purchase.product_supplier,0,Product Supplier,Доставчик на продукт,0
-view,purchase.product_supplier,0,Product Suppliers,Доставчици на продукт,0
-view,purchase.product_supplier.price,0,Product Supplier Price,Цена на доставчик на продукт,0
-view,purchase.product_supplier.price,0,Product Supplier Prices,Цена на доставчик на продукт,0
-view,purchase.purchase,0,Cancel,Отказ,0
-view,purchase.purchase,0,Confirm,Потвърждаване,0
-view,purchase.purchase,0,Draft,Проект,0
-view,purchase.purchase,0,Handle Invoice Exception,Обработка на грешка към фактура,0
-view,purchase.purchase,0,Handle Shipment Exception,Обработване на грешка при изпращане,0
-view,purchase.purchase,0,Invoices,Фактури,0
-view,purchase.purchase,0,Lines,Редове,0
-view,purchase.purchase,0,Moves,Движения,0
-view,purchase.purchase,0,Other Info,Друга информация,0
-view,purchase.purchase,0,Purchase,Покупка,0
-view,purchase.purchase,0,Purchases,Покупки,0
-view,purchase.purchase,0,Quotation,Запитване,0
-view,purchase.purchase,0,Shipments,Изпращане,0
-wizard_button,"purchase.handle.invoice.exception,init,end",0,Cancel,Отказ,0
-wizard_button,"purchase.handle.invoice.exception,init,ok",0,Ok,Добре,0
-wizard_button,"purchase.handle.shipment.exception,init,end",0,Cancel,Отказ,0
-wizard_button,"purchase.handle.shipment.exception,init,ok",0,Ok,Добре,0
diff --git a/configuration.py b/configuration.py
index 2cd82ad..ccdae35 100644
--- a/configuration.py
+++ b/configuration.py
@@ -10,16 +10,17 @@ class Configuration(ModelSingleton, ModelSQL, ModelView):
     _description = __doc__
 
     purchase_sequence = fields.Property(fields.Many2One('ir.sequence',
-        'Purchase Reference Sequence', domain=[
-            ('company', 'in', [Eval('company'), False]),
-            ('code', '=', 'purchase.purchase'),
-        ], required=True))
+            'Purchase Reference Sequence', domain=[
+                ('company', 'in',
+                    [Eval('context', {}).get('company', 0), False]),
+                ('code', '=', 'purchase.purchase'),
+                ], required=True))
     purchase_invoice_method = fields.Property(fields.Selection([
-        ('manual', 'Manual'),
-        ('order', 'Based On Order'),
-        ('shipment', 'Based On Shipment'),
-    ], 'Invoice Method', states={
-        'required': Bool(Eval('company')),
-    }))
+                ('manual', 'Manual'),
+                ('order', 'Based On Order'),
+                ('shipment', 'Based On Shipment'),
+                ], 'Invoice Method', states={
+                'required': Bool(Eval('context', {}).get('company', 0)),
+                }))
 
 Configuration()
diff --git a/de_DE.csv b/de_DE.csv
deleted file mode 100644
index d6583b6..0000000
--- a/de_DE.csv
+++ /dev/null
@@ -1,269 +0,0 @@
-type,name,res_id,src,value,fuzzy
-error,account.invoice,0,You can not delete invoices that come from a purchase!,Durch einen Einkauf generierte Rechnungen können nicht gelöscht werden!,0
-error,account.invoice,0,You cannot reset to draft an invoice generated by a purchase.,Eine durch einen Einkauf generierte Bewegung kann nicht auf Entwurf zurückgesetzt werden.,0
-error,product.template,0,"Purchase prices are based on the purchase uom, are you sure to change it?","Einkaufspreise basieren auf der Maßeinheit für den Einkauf.
-Soll sie wirklich geändert werden?",0
-error,purchase.line,0,"It misses an ""Account Expense"" on product ""%s""!","Es ist ken Aufwandskonto für Artikel ""%s"" definiert!",0
-error,purchase.line,0,"It misses an ""account expense"" default property!",Es ist keine Standardeigenschaft für das Aufwandskonto definiert!,0
-error,purchase.line,0,The supplier location is required!,Der Lagerort des Lieferanten muss eingegeben werden!,0
-error,purchase.purchase,0,Invoice addresses must be defined for the quotation.,Die Rechnungsadresse muss für ein Angebot angegeben werden.,0
-error,purchase.purchase,0,"It misses an ""Account Payable"" on the party ""%s""!","Es ist kein Verbindlichkeitskonto für Partei ""%s"" definiert!",0
-error,stock.shipment.in,0,You cannot reset to draft a move generated by a purchase.,Eine durch einen Einkauf generierte Bewegung kann nicht auf Entwurf zurückgesetzt werden.,0
-field,"account.invoice,purchase_exception_state",0,Exception State,Status Vorbehalt,0
-field,"account.invoice,purchases",0,Purchases,Einkäufe,0
-field,"account.invoice.line,purchase_lines",0,Purchase Lines,Positionen Einkauf,0
-field,"product.template,product_suppliers",0,Suppliers,Lieferanten,0
-field,"product.template,purchasable",0,Purchasable,Käuflich,0
-field,"product.template,purchase_uom",0,Purchase UOM,Einheit Einkauf,0
-field,"purchase.configuration,purchase_invoice_method",0,Invoice Method,Rechnungsstellung,0
-field,"purchase.configuration,purchase_sequence",0,Purchase Reference Sequence,Nummernkreis Einkauf,0
-field,"purchase.configuration,rec_name",0,Name,Name,0
-field,"purchase.handle.invoice.exception.ask,domain_invoices",0,Domain Invoices,Wertebereich Rechnungen (Domain),0
-field,"purchase.handle.invoice.exception.ask,recreate_invoices",0,Recreate Invoices,Rechnungen nachbilden,0
-field,"purchase.handle.shipment.exception.ask,domain_moves",0,Domain Moves,Wertebereich Bewegungen (Domain),0
-field,"purchase.handle.shipment.exception.ask,recreate_moves",0,Recreate Moves,Bewegungen nachbilden,0
-field,"purchase.line,amount",0,Amount,Betrag,0
-field,"purchase.line,description",0,Description,Bezeichnung,0
-field,"purchase.line,invoice_lines",0,Invoice Lines,Rechnungspositionen,0
-field,"purchase.line,move_done",0,Moves Done,Bewegungen erledigt,0
-field,"purchase.line,move_exception",0,Moves Exception,Bewegungsvorbehalt,0
-field,"purchase.line,moves",0,Moves,Bewegungen,0
-field,"purchase.line,moves_ignored",0,Ignored Moves,Ignorierte Bewegungen,0
-field,"purchase.line,moves_recreated",0,Recreated Moves,Nachgebildete Bewegungen,0
-field,"purchase.line,note",0,Note,Notiz,0
-field,"purchase.line,product",0,Product,Artikel,0
-field,"purchase.line,purchase",0,Purchase,Einkauf,0
-field,"purchase.line,quantity",0,Quantity,Anzahl,0
-field,"purchase.line,rec_name",0,Name,Name,0
-field,"purchase.line,sequence",0,Sequence,Reihenfolge,0
-field,"purchase.line,taxes",0,Taxes,Steuern,0
-field,"purchase.line,type",0,Type,Typ,0
-field,"purchase.line,unit",0,Unit,Einheit,0
-field,"purchase.line,unit_digits",0,Unit Digits,Anzahl Stellen,0
-field,"purchase.line,unit_price",0,Unit Price,Einzelpreis,0
-field,"purchase.line-account.invoice.line,invoice_line",0,Invoice Line,Rechnungsposition,0
-field,"purchase.line-account.invoice.line,purchase_line",0,Purchase Line,Position Einkauf,0
-field,"purchase.line-account.invoice.line,rec_name",0,Name,Name,0
-field,"purchase.line-account.tax,line",0,Purchase Line,Position Einkauf,0
-field,"purchase.line-account.tax,rec_name",0,Name,Name,0
-field,"purchase.line-account.tax,tax",0,Tax,Steuer,0
-field,"purchase.line-ignored-stock.move,move",0,Move,Bewegung,0
-field,"purchase.line-ignored-stock.move,purchase_line",0,Purchase Line,Position Einkauf,0
-field,"purchase.line-ignored-stock.move,rec_name",0,Name,Name,0
-field,"purchase.line-recreated-stock.move,move",0,Move,Bewegung,0
-field,"purchase.line-recreated-stock.move,purchase_line",0,Purchase Line,Position Einkauf,0
-field,"purchase.line-recreated-stock.move,rec_name",0,Name,Name,0
-field,"purchase.product_supplier,code",0,Code,Artikelnummer Lieferant,0
-field,"purchase.product_supplier,company",0,Company,Lieferfirma,0
-field,"purchase.product_supplier,delivery_time",0,Delivery Time,Lieferfrist,0
-field,"purchase.product_supplier,name",0,Name,Name,0
-field,"purchase.product_supplier,party",0,Supplier,Lieferant,0
-field,"purchase.product_supplier,prices",0,Prices,Preise,0
-field,"purchase.product_supplier,product",0,Product,Artikel,0
-field,"purchase.product_supplier,rec_name",0,Name,Name,0
-field,"purchase.product_supplier,sequence",0,Sequence,Reihenfolge,0
-field,"purchase.product_supplier.price,product_supplier",0,Supplier,Lieferant,0
-field,"purchase.product_supplier.price,quantity",0,Quantity,Anzahl,0
-field,"purchase.product_supplier.price,rec_name",0,Name,Name,0
-field,"purchase.product_supplier.price,unit_price",0,Unit Price,Einzelpreis,0
-field,"purchase.purchase,comment",0,Comment,Kommentar,0
-field,"purchase.purchase,company",0,Company,Unternehmen,0
-field,"purchase.purchase,currency",0,Currency,Währung,0
-field,"purchase.purchase,currency_digits",0,Currency Digits,Währung (signifikante Stellen),0
-field,"purchase.purchase,description",0,Description,Beschreibung,0
-field,"purchase.purchase,invoice_address",0,Invoice Address,Rechnungsadresse,0
-field,"purchase.purchase,invoice_exception",0,Invoices Exception,Rechnungsvorbehalt,0
-field,"purchase.purchase,invoice_method",0,Invoice Method,Rechnungsstellung,0
-field,"purchase.purchase,invoice_paid",0,Invoices Paid,Bezahlte Rechnungen,0
-field,"purchase.purchase,invoice_state",0,Invoice State,Rechnungsstatus,0
-field,"purchase.purchase,invoices",0,Invoices,Rechnungen,0
-field,"purchase.purchase,invoices_ignored",0,Ignored Invoices,Ignorierte Rechnungen,0
-field,"purchase.purchase,invoices_recreated",0,Recreated Invoices,Nachgebildete Rechnungen,0
-field,"purchase.purchase,lines",0,Lines,Positionen,0
-field,"purchase.purchase,moves",0,Moves,Bewegungen,0
-field,"purchase.purchase,party",0,Party,Partei,0
-field,"purchase.purchase,party_lang",0,Party Language,Sprache Partei,0
-field,"purchase.purchase,payment_term",0,Payment Term,Zahlungsbedingung,0
-field,"purchase.purchase,purchase_date",0,Purchase Date,Kaufdatum,0
-field,"purchase.purchase,rec_name",0,Name,Name,0
-field,"purchase.purchase,reference",0,Reference,Beleg-Nr.,0
-field,"purchase.purchase,shipment_done",0,Shipment Done,Lieferposten erledigt,0
-field,"purchase.purchase,shipment_exception",0,Shipments Exception,Lieferungsvorbehalt,0
-field,"purchase.purchase,shipment_state",0,Shipment State,Lieferstatus,0
-field,"purchase.purchase,shipments",0,Shipments,Lieferposten,0
-field,"purchase.purchase,state",0,State,Status,0
-field,"purchase.purchase,supplier_reference",0,Supplier Reference,Beleg-Nr. Lieferant,0
-field,"purchase.purchase,tax_amount",0,Tax,Steuer,0
-field,"purchase.purchase,total_amount",0,Total,Gesamt,0
-field,"purchase.purchase,untaxed_amount",0,Untaxed,Netto,0
-field,"purchase.purchase,warehouse",0,Warehouse,Warenlager,0
-field,"purchase.purchase-account.invoice,invoice",0,Invoice,Rechnung,0
-field,"purchase.purchase-account.invoice,purchase",0,Purchase,Einkauf,0
-field,"purchase.purchase-account.invoice,rec_name",0,Name,Name,0
-field,"purchase.purchase-ignored-account.invoice,invoice",0,Invoice,Rechnung,0
-field,"purchase.purchase-ignored-account.invoice,purchase",0,Purchase,Einkauf,0
-field,"purchase.purchase-ignored-account.invoice,rec_name",0,Name,Name,0
-field,"purchase.purchase-recreated-account.invoice,invoice",0,Invoice,Rechnung,0
-field,"purchase.purchase-recreated-account.invoice,purchase",0,Purchase,Einkauf,0
-field,"purchase.purchase-recreated-account.invoice,rec_name",0,Name,Name,0
-field,"stock.move,purchase",0,Purchase,Einkauf,0
-field,"stock.move,purchase_currency",0,Purchase Currency,Einkaufswährung,0
-field,"stock.move,purchase_exception_state",0,Exception State,Status Vorbehalt,0
-field,"stock.move,purchase_line",0,Purchase Line,Position Einkauf,0
-field,"stock.move,purchase_quantity",0,Purchase Quantity,Anzahl Einkauf,0
-field,"stock.move,purchase_unit",0,Purchase Unit,Einheit Einkauf,0
-field,"stock.move,purchase_unit_digits",0,Purchase Unit Digits,Anzahl Stellen Einkauf,0
-field,"stock.move,purchase_unit_price",0,Purchase Unit Price,Einzelpreis Einkauf,0
-field,"stock.move,purchase_visible",0,Purchase Visible,Verkauf sichtbar,0
-field,"stock.move,supplier",0,Supplier,Lieferant,0
-help,"purchase.handle.invoice.exception.ask,recreate_invoices",0,The selected invoices will be recreated. The other ones will be ignored.,Die ausgewählten Rechnungen werden nachgebildet. Alle anderen werden ignoriert.,0
-help,"purchase.handle.shipment.exception.ask,recreate_moves",0,The selected moves will be recreated. The other ones will be ignored.,Die ausgewählten Bewegungen werden nachgebildet. Alle anderen werden ignoriert.,0
-help,"purchase.product_supplier,delivery_time",0,In number of days,In Anzahl von Tagen,0
-help,"purchase.product_supplier.price,quantity",0,Minimal quantity,Minimale Anzahl,0
-model,"ir.action,name",act_invoice_form,Invoices,Rechnungseingang,0
-model,"ir.action,name",act_open_supplier,Parties associated to Purchases,Parteien: Einkäufen zugeordnet,0
-model,"ir.action,name",act_purchase_configuration_form,Purchase Configuration,Einstellungen Einkauf,0
-model,"ir.action,name",act_purchase_form,Purchases,Einkäufe,0
-model,"ir.action,name",act_purchase_form2,Purchases,Einkäufe,0
-model,"ir.action,name",act_purchase_form_confirmed,Confirmed Purchases,Aufträge Einkäufe,0
-model,"ir.action,name",act_purchase_form_draft,Draft Purchases,Entwürfe Einkäufe,0
-model,"ir.action,name",act_purchase_form_new,New Purchase,Neuer Einkauf,0
-model,"ir.action,name",act_purchase_form_quotation,Purchases in Quotation,Angebote Einkäufe,0
-model,"ir.action,name",act_shipment_form,Shipments,Lieferposten,0
-model,"ir.action,name",report_purchase,Purchase,Einkauf,0
-model,"ir.action,name",wizard_invoice_handle_exception,Handle Invoice Exception,Rechnungsvorbehalt bearbeiten,0
-model,"ir.action,name",wizard_shipment_handle_exception,Handle Shipment Exception,Liefervorbehalt bearbeiten,0
-model,"ir.sequence,name",sequence_purchase,Purchase,Einkauf,0
-model,"ir.sequence.type,name",sequence_type_purchase,Purchase,Einkauf,0
-model,"ir.ui.menu,name",menu_configuration,Configuration,Einstellungen,0
-model,"ir.ui.menu,name",menu_purchase,Purchase Management,Einkauf,0
-model,"ir.ui.menu,name",menu_purchase_configuration,Purchase Configuration,Einstellungen Einkauf,0
-model,"ir.ui.menu,name",menu_purchase_form,Purchases,Einkäufe,0
-model,"ir.ui.menu,name",menu_purchase_form_confirmed,Confirmed Purchases,Aufträge (Einkäufe),0
-model,"ir.ui.menu,name",menu_purchase_form_draft,Draft Purchases,Entwürfe (Einkäufe),0
-model,"ir.ui.menu,name",menu_purchase_form_new,New Purchase,Neuer Einkauf,0
-model,"ir.ui.menu,name",menu_purchase_form_quotation,Purchases in Quotation,Angebote (Einkäufe),0
-model,"ir.ui.menu,name",menu_reporting,Reporting,Auswertungen,0
-model,"ir.ui.menu,name",menu_supplier,Parties associated to Purchases,Parteien: Einkäufen zugeordnet,0
-model,"purchase.configuration,name",0,Purchase Configuration,Einstellungen Einkauf,0
-model,"purchase.handle.invoice.exception.ask,name",0,Invoice Exception Ask,Nachfrage Rechnungsvorbehalt,0
-model,"purchase.handle.shipment.exception.ask,name",0,Shipment Exception Ask,Nachfrage Liefervorbehalt,0
-model,"purchase.line,name",0,Purchase Line,Einkauf Position,0
-model,"purchase.line-account.invoice.line,name",0,Purchase Line - Invoice Line,Position Einkauf - Rechnungszeile,0
-model,"purchase.line-account.tax,name",0,Purchase Line - Tax,Position Einkauf - Steuer,0
-model,"purchase.line-ignored-stock.move,name",0,Purchase Line - Ignored Move,Position Einkauf - Bewegung Ignoriert,0
-model,"purchase.line-recreated-stock.move,name",0,Purchase Line - Ignored Move,Position Einkauf - Bewegung Nachgebildet,0
-model,"purchase.product_supplier,name",0,Product Supplier,Artikel Lieferant,0
-model,"purchase.product_supplier.price,name",0,Product Supplier Price,Artikel Einkaufspreis,0
-model,"purchase.purchase,name",0,Purchase,Einkauf,0
-model,"purchase.purchase-account.invoice,name",0,Purchase - Invoice,Einkauf - Rechnung,0
-model,"purchase.purchase-ignored-account.invoice,name",0,Purchase - Ignored Invoice,Einkauf - Rechnung Ignoriert,0
-model,"purchase.purchase-recreated-account.invoice,name",0,Purchase - Recreated Invoice,Einkauf - Rechnung Nachgebildet,0
-model,"res.group,name",group_purchase,Purchase,Einkauf,0
-model,"res.group,name",group_purchase_admin,Purchase Administrator,Einkauf Administration,0
-model,"workflow,name",purchase_workflow,Purchase workflow,Workflow Einkauf,0
-model,"workflow.activity,name",purchase_activity_cancel,Canceled,Annulliert,0
-model,"workflow.activity,name",purchase_activity_confirmed,Confirmed,Beauftragt,0
-model,"workflow.activity,name",purchase_activity_done,Done,Erledigt,0
-model,"workflow.activity,name",purchase_activity_draft,Draft,Entwurf,0
-model,"workflow.activity,name",purchase_activity_invoice_done,Invoice Done,Rechnung erledigt,0
-model,"workflow.activity,name",purchase_activity_invoice_method,Invoice Method,Rechnungsstellung,0
-model,"workflow.activity,name",purchase_activity_invoice_method_done,Invoice Method Done,Rechnungsstellung erledigt,0
-model,"workflow.activity,name",purchase_activity_invoice_purchase_exception,Invoice Exception,Rechnungsvorbehalt,0
-model,"workflow.activity,name",purchase_activity_invoice_shipment,Invoice Shipment,Rechnung Lieferposten,0
-model,"workflow.activity,name",purchase_activity_invoice_shipment_done,Invoice Shipment Done,Rechnung Lieferposten erledigt,0
-model,"workflow.activity,name",purchase_activity_invoice_shipment_exception,Invoice Shipment Exception,Rechnung Lieferposten Vorbehalt,0
-model,"workflow.activity,name",purchase_activity_invoice_shipment_method,Invoice Shipment Method,Rechnung Liefermethode,0
-model,"workflow.activity,name",purchase_activity_invoice_shipment_method_done,Invoice Shipment Method Done,Rechnung Liefermethode erledigt,0
-model,"workflow.activity,name",purchase_activity_quotation,Quotation,Angebot,0
-model,"workflow.activity,name",purchase_activity_shipment_exception,Shipment Exception,Lieferposten Vorbehalt,0
-model,"workflow.activity,name",purchase_activity_waiting_invoice_purchase,Waiting Invoice,Rechnung Wartend,0
-model,"workflow.activity,name",purchase_activity_waiting_invoice_shipment,Waiting Invoice Shipment,Rechnung Lieferposten Wartend,0
-model,"workflow.activity,name",purchase_activity_waiting_shipment,Waiting Shipment,Lieferposten Wartend,0
-odt,purchase.purchase,0,Amount,Betrag,0
-odt,purchase.purchase,0,Date:,Datum:,0
-odt,purchase.purchase,0,Description,Bezeichnung,0
-odt,purchase.purchase,0,Description:,Bezeichnung:,0
-odt,purchase.purchase,0,Draft Purchase Order,Auftrag (Entwurf),0
-odt,purchase.purchase,0,E-Mail:,E-Mail:,0
-odt,purchase.purchase,0,Phone:,Telefon:,0
-odt,purchase.purchase,0,Purchase Order N°:,Auftrag Nr. ,0
-odt,purchase.purchase,0,Quantity,Anzahl,0
-odt,purchase.purchase,0,Request for Quotation N°:,Angebotsanfrage Nr.:,0
-odt,purchase.purchase,0,Taxes,Steuern,0
-odt,purchase.purchase,0,Taxes:,Steuern:,0
-odt,purchase.purchase,0,Total (excl. taxes):,Netto:,0
-odt,purchase.purchase,0,Total:,Gesamt:,0
-odt,purchase.purchase,0,Unit Price,Einzelpreis,0
-odt,purchase.purchase,0,VAT Number:,USt-ID-Nr.:,0
-odt,purchase.purchase,0,VAT:,USt.:,0
-selection,"account.invoice,purchase_exception_state",0,,,0
-selection,"account.invoice,purchase_exception_state",0,Ignored,Ignoriert,0
-selection,"account.invoice,purchase_exception_state",0,Recreated,Nachgebildet,0
-selection,"purchase.configuration,purchase_invoice_method",0,Based On Order,Bei Beauftragung,0
-selection,"purchase.configuration,purchase_invoice_method",0,Based On Shipment,Bei Lieferung,0
-selection,"purchase.configuration,purchase_invoice_method",0,Manual,Manuell,0
-selection,"purchase.line,type",0,Comment,Kommentar,0
-selection,"purchase.line,type",0,Line,Position,0
-selection,"purchase.line,type",0,Subtotal,Zwischensumme,0
-selection,"purchase.line,type",0,Title,Überschrift,0
-selection,"purchase.purchase,invoice_method",0,Based On Order,Bei Beauftragung,0
-selection,"purchase.purchase,invoice_method",0,Based On Shipment,Bei Lieferung,0
-selection,"purchase.purchase,invoice_method",0,Manual,Manuell,0
-selection,"purchase.purchase,invoice_state",0,Exception,Vorbehalt,0
-selection,"purchase.purchase,invoice_state",0,None,Kein,0
-selection,"purchase.purchase,invoice_state",0,Paid,Bezahlt,0
-selection,"purchase.purchase,invoice_state",0,Waiting,Wartend,0
-selection,"purchase.purchase,shipment_state",0,Exception,Vorbehalt,0
-selection,"purchase.purchase,shipment_state",0,None,Kein,0
-selection,"purchase.purchase,shipment_state",0,Received,Erhalten,0
-selection,"purchase.purchase,shipment_state",0,Waiting,Wartend,0
-selection,"purchase.purchase,state",0,Canceled,Annulliert,0
-selection,"purchase.purchase,state",0,Confirmed,Beauftragt,0
-selection,"purchase.purchase,state",0,Done,Erledigt,0
-selection,"purchase.purchase,state",0,Draft,Entwurf,0
-selection,"purchase.purchase,state",0,Quotation,Angebot,0
-selection,"stock.move,purchase_exception_state",0,,,0
-selection,"stock.move,purchase_exception_state",0,Ignored,Ignoriert,0
-selection,"stock.move,purchase_exception_state",0,Recreated,Nachgebildet,0
-view,product.product,0,Product Suppliers,Lieferanten,0
-view,product.product,0,Suppliers,Lieferanten,0
-view,product.template,0,Product Suppliers,Lieferanten,0
-view,product.template,0,Suppliers,Lieferanten,0
-view,purchase.configuration,0,Purchase Configuration,Einstellungen Einkauf,0
-view,purchase.handle.invoice.exception.ask,0,Choose invoices to duplicate,Auswahl Rechnungen für Duplizierung,0
-view,purchase.handle.invoice.exception.ask,0,Choose invoices to recreate,Rechnungen zum Nachbilden auswählen,0
-view,purchase.handle.invoice.exception.ask,0,Handle Invoice Exception,Rechnungsvorbehalt bearbeiten,0
-view,purchase.handle.shipment.exception.ask,0,Choose move to duplicate,Auswahl Bewegungen für Duplizierung,0
-view,purchase.handle.shipment.exception.ask,0,Choose move to recreate,Bewegungen zum Nachbilden auswählen,0
-view,purchase.handle.shipment.exception.ask,0,Choose moves to recreate,Auswahl Bewegungen zur Nachbildung,0
-view,purchase.handle.shipment.exception.ask,0,Duplicate Moves,Bewegungen duplizieren,0
-view,purchase.handle.shipment.exception.ask,0,Handle shipment Exception,Liefervorbehalt bearbeiten,0
-view,purchase.handle.shipment.exception.ask,0,Recreated Moves,Nachgebildete Bewegungen,0
-view,purchase.line,0,General,Allgemein,0
-view,purchase.line,0,Notes,Notizen,0
-view,purchase.line,0,Products,Artikel,0
-view,purchase.line,0,Purchase Line,Position Einkauf,0
-view,purchase.line,0,Purchase Lines,Positionen Einkauf,0
-view,purchase.product_supplier,0,Product Supplier,Lieferant,0
-view,purchase.product_supplier,0,Product Suppliers,Lieferanten,0
-view,purchase.product_supplier.price,0,Product Supplier Price,Einkaufspreis,0
-view,purchase.product_supplier.price,0,Product Supplier Prices,Einkaufspreise,0
-view,purchase.purchase,0,Cancel,Annullieren,0
-view,purchase.purchase,0,Confirm,Beauftragen,0
-view,purchase.purchase,0,Draft,Entwurf,0
-view,purchase.purchase,0,Handle Invoice Exception,Rechnungsvorbehalt bearbeiten,0
-view,purchase.purchase,0,Handle Shipment Exception,Liefervorbehalt bearbeiten,0
-view,purchase.purchase,0,Ignore Invoice Exception,Rechnungsvorbehalt ignorieren,0
-view,purchase.purchase,0,Invoices,Rechnungen,0
-view,purchase.purchase,0,Lines,Positionen,0
-view,purchase.purchase,0,Moves,Bewegungen,0
-view,purchase.purchase,0,Other Info,Sonstiges,0
-view,purchase.purchase,0,Purchase,Einkauf,0
-view,purchase.purchase,0,Purchases,Einkäufe,0
-view,purchase.purchase,0,Quotation,Angebot,0
-view,purchase.purchase,0,Shipments,Lieferposten,0
-wizard_button,"purchase.handle.invoice.exception,init,end",0,Cancel,Abbrechen,0
-wizard_button,"purchase.handle.invoice.exception,init,ok",0,Ok,OK,0
-wizard_button,"purchase.handle.shipment.exception,init,end",0,Cancel,Abbrechen,0
-wizard_button,"purchase.handle.shipment.exception,init,ok",0,Ok,OK,0
diff --git a/es_CO.csv b/es_CO.csv
deleted file mode 100644
index 5935dcc..0000000
--- a/es_CO.csv
+++ /dev/null
@@ -1,256 +0,0 @@
-type,name,res_id,src,value,fuzzy
-error,account.invoice,0,You can not delete invoices that come from a purchase!,¡No puede borrar facturas que vienen de una compra!,0
-error,account.invoice,0,You cannot reset to draft an invoice generated by a purchase.,No puede regresar a borrador una factura generada por una compra.,0
-error,product.template,0,"Purchase prices are based on the purchase uom, are you sure to change it?","Los precios de compra están basados en la UdM de compra,¿desea cambiarlo?",0
-error,purchase.line,0,"It misses an ""account expense"" default property!","¡Hace falta una propiedad predeterminada de ""cuenta de gastos""!",0
-error,purchase.line,0,"It misses an ""Account Expense"" on product ""%s""!","¡Hace falta una ""Cuenta de Gasto"" del producto ""%s""!",0
-error,purchase.line,0,The supplier location is required!,¡Se requiere el lugar del proveedor!,0
-error,purchase.purchase,0,Invoice addresses must be defined for the quotation.,Debe definir las direcciones para la cotización.,0
-error,purchase.purchase,0,"It misses an ""Account Payable"" on the party ""%s""!","¡Al tercero le hace falta una ""Cuenta de Pagos""!",0
-error,stock.shipment.in,0,You cannot reset to draft a move generated by a purchase.,No puede revertir a borrador un movimiento generado por una compra.,0
-field,"account.invoice,purchase_exception_state",0,Exception State,Estado Excepción,0
-field,"product.template,product_suppliers",0,Suppliers,Proveedores,0
-field,"product.template,purchasable",0,Purchasable,Comprable,0
-field,"product.template,purchase_uom",0,Purchase UOM,UdM de Compra,0
-field,"purchase.configuration,purchase_sequence",0,Purchase Reference Sequence,,0
-field,"purchase.configuration,rec_name",0,Name,Nombre de Contacto,1
-field,"purchase.handle.invoice.exception.ask,domain_invoices",0,Domain Invoices,Rango de facturas,0
-field,"purchase.handle.invoice.exception.ask,recreate_invoices",0,Recreate Invoices,Rehacer facturas,0
-field,"purchase.handle.shipment.exception.ask,domain_moves",0,Domain Moves,Rango de movimientos,0
-field,"purchase.handle.shipment.exception.ask,recreate_moves",0,Recreate Moves,Rehacer movimientos,0
-field,"purchase.line-account.invoice.line,invoice_line",0,Invoice Line,Línea de Factura,0
-field,"purchase.line-account.invoice.line,purchase_line",0,Purchase Line,Línea de Compra,0
-field,"purchase.line-account.invoice.line,rec_name",0,Name,Nombre,0
-field,"purchase.line-account.tax,line",0,Purchase Line,Línea de Compra,0
-field,"purchase.line-account.tax,rec_name",0,Name,Nombre,0
-field,"purchase.line-account.tax,tax",0,Tax,Impuesto,0
-field,"purchase.line,amount",0,Amount,Cantidad,0
-field,"purchase.line,description",0,Description,Descripción,0
-field,"purchase.line-ignored-stock.move,move",0,Move,Movimiento,0
-field,"purchase.line-ignored-stock.move,purchase_line",0,Purchase Line,Línea de Compra,0
-field,"purchase.line-ignored-stock.move,rec_name",0,Name,Nombre,0
-field,"purchase.line,invoice_lines",0,Invoice Lines,Líneas de Factura,0
-field,"purchase.line,move_done",0,Moves Done,Movimientos Hechos,0
-field,"purchase.line,move_exception",0,Moves Exception,Exepción de Movimientos,0
-field,"purchase.line,moves",0,Moves,Movimientos,0
-field,"purchase.line,moves_ignored",0,Ignored Moves,Movimientos Ignorados,0
-field,"purchase.line,moves_recreated",0,Recreated Moves,Movimientos recreados,0
-field,"purchase.line,note",0,Note,Nota,0
-field,"purchase.line,product",0,Product,Producto,0
-field,"purchase.line,purchase",0,Purchase,Compra,0
-field,"purchase.line,quantity",0,Quantity,Cantidad,0
-field,"purchase.line,rec_name",0,Name,Nombre,0
-field,"purchase.line-recreated-stock.move,move",0,Move,Movimiento,0
-field,"purchase.line-recreated-stock.move,purchase_line",0,Purchase Line,Línea de Compra,0
-field,"purchase.line-recreated-stock.move,rec_name",0,Name,Nombre,0
-field,"purchase.line,sequence",0,Sequence,Secuencia,0
-field,"purchase.line,taxes",0,Taxes,Impuestos,0
-field,"purchase.line,type",0,Type,Tipo,0
-field,"purchase.line,unit",0,Unit,Unidad,0
-field,"purchase.line,unit_digits",0,Unit Digits,Dígitos Unitarios,0
-field,"purchase.line,unit_price",0,Unit Price,Precio Unitario,0
-field,"purchase.product_supplier,code",0,Code,Código,0
-field,"purchase.product_supplier,company",0,Company,Compañía,0
-field,"purchase.product_supplier,delivery_time",0,Delivery Time,Tiempo de Envío,0
-field,"purchase.product_supplier,name",0,Name,Nombre,0
-field,"purchase.product_supplier,party",0,Supplier,Proveedor,0
-field,"purchase.product_supplier.price,product_supplier",0,Supplier,Proveedor,0
-field,"purchase.product_supplier.price,quantity",0,Quantity,Cantidad,0
-field,"purchase.product_supplier.price,rec_name",0,Name,Nombre,0
-field,"purchase.product_supplier,prices",0,Prices,Precios,0
-field,"purchase.product_supplier.price,unit_price",0,Unit Price,Precio Unitario,0
-field,"purchase.product_supplier,product",0,Product,Producto,0
-field,"purchase.product_supplier,rec_name",0,Name,Nombre,0
-field,"purchase.product_supplier,sequence",0,Sequence,Secuencia,0
-field,"purchase.purchase-account.invoice,invoice",0,Invoice,Factura,0
-field,"purchase.purchase-account.invoice,purchase",0,Purchase,Compra,0
-field,"purchase.purchase-account.invoice,rec_name",0,Name,Nombre,0
-field,"purchase.purchase,comment",0,Comment,Comentario,0
-field,"purchase.purchase,company",0,Company,Compañía,0
-field,"purchase.purchase,currency",0,Currency,Moneda,0
-field,"purchase.purchase,currency_digits",0,Currency Digits,Dígitos de Moneda,0
-field,"purchase.purchase,description",0,Description,Descripción,0
-field,"purchase.purchase-ignored-account.invoice,invoice",0,Invoice,Factura,0
-field,"purchase.purchase-ignored-account.invoice,purchase",0,Purchase,Compra,0
-field,"purchase.purchase-ignored-account.invoice,rec_name",0,Name,Nombre,0
-field,"purchase.purchase,invoice_address",0,Invoice Address,Dirección de Facturación,0
-field,"purchase.purchase,invoice_exception",0,Invoices Exception,Excepción de Facturación,0
-field,"purchase.purchase,invoice_method",0,Invoice Method,Método de Facturación,0
-field,"purchase.purchase,invoice_paid",0,Invoices Paid,Facturas Pagadas,0
-field,"purchase.purchase,invoices",0,Invoices,Facturas,0
-field,"purchase.purchase,invoices_ignored",0,Ignored Invoices,Facturas Ignoradas,0
-field,"purchase.purchase,invoices_recreated",0,Recreated Invoices,Facturas recreadas,0
-field,"purchase.purchase,invoice_state",0,Invoice State,Estado de Factura,0
-field,"purchase.purchase,lines",0,Lines,Líneas,0
-field,"purchase.purchase,moves",0,Moves,Movimientos,0
-field,"purchase.purchase,party",0,Party,Terceros,0
-field,"purchase.purchase,party_lang",0,Party Language,Idioma del Tercero,0
-field,"purchase.purchase,payment_term",0,Payment Term,Término de Pago,0
-field,"purchase.purchase,purchase_date",0,Purchase Date,Fecha de Compra,0
-field,"purchase.purchase,rec_name",0,Name,Nombre,0
-field,"purchase.purchase-recreated-account.invoice,invoice",0,Invoice,Factura,0
-field,"purchase.purchase-recreated-account.invoice,purchase",0,Purchase,Compra,0
-field,"purchase.purchase-recreated-account.invoice,rec_name",0,Name,Nombre,0
-field,"purchase.purchase,reference",0,Reference,Referencia,0
-field,"purchase.purchase,shipment_done",0,Shipment Done,Envío Finalizado,0
-field,"purchase.purchase,shipment_exception",0,Shipments Exception,Excepción de Envío,0
-field,"purchase.purchase,shipments",0,Shipments,Envíos,0
-field,"purchase.purchase,shipment_state",0,Shipment State,Estado de Envío,0
-field,"purchase.purchase,state",0,State,Estado,0
-field,"purchase.purchase,supplier_reference",0,Supplier Reference,Referencia de Proveedor,0
-field,"purchase.purchase,tax_amount",0,Tax,Impuesto,0
-field,"purchase.purchase,total_amount",0,Total,Total,0
-field,"purchase.purchase,untaxed_amount",0,Untaxed,Sin Impuesto,0
-field,"purchase.purchase,warehouse",0,Warehouse,Depósito,0
-field,"stock.move,purchase",0,Purchase,Compra,0
-field,"stock.move,purchase_currency",0,Purchase Currency,Moneda de Compra,0
-field,"stock.move,purchase_exception_state",0,Exception State,Estado Excepción,0
-field,"stock.move,purchase_line",0,,,0
-field,"stock.move,purchase_quantity",0,Purchase Quantity,Cantidad de Compra,0
-field,"stock.move,purchase_unit",0,Purchase Unit,Unidad de Compra,0
-field,"stock.move,purchase_unit_digits",0,Purchase Unit Digits,Dígitos de Unidad de Compra,0
-field,"stock.move,purchase_unit_price",0,Purchase Unit Price,Precio Unitario de Compra,0
-field,"stock.move,purchase_visible",0,Purchase Visible,,0
-field,"stock.move,supplier",0,Supplier,Proveedor,0
-help,"purchase.handle.invoice.exception.ask,recreate_invoices",0,The selected invoices will be recreated. The other ones will be ignored.,La factura seleccionada será recreada. Las otras serán ignoradas.,0
-help,"purchase.handle.shipment.exception.ask,recreate_moves",0,The selected moves will be recreated. The other ones will be ignored.,Se recrearán los movimientos seleccionados. Los demás se ignorarán.,0
-help,"purchase.product_supplier,delivery_time",0,In number of days,En número de días,0
-help,"purchase.product_supplier.price,quantity",0,Minimal quantity,Cantidad Mínima,0
-model,"ir.action,name",act_purchase_form_confirmed,Confirmed Purchases,Compras confirmadas,0
-model,"ir.action,name",act_purchase_form_draft,Draft Purchases,Compras en Borrador,0
-model,"ir.action,name",wizard_invoice_handle_exception,Handle Invoice Exception,Tratar Excepción de Factura,0
-model,"ir.action,name",wizard_shipment_handle_exception,Handle Shipment Exception,Tratar Excepción de Envío,0
-model,"ir.action,name",act_invoice_form,Invoices,Facturas,0
-model,"ir.action,name",act_purchase_form_new,New Purchase,Nueva Compra,0
-model,"ir.action,name",act_open_supplier,Parties associated to Purchases,Terceros Asociados a Compras,0
-model,"ir.action,name",report_purchase,Purchase,Compra,0
-model,"ir.action,name",act_purchase_configuration_form,Purchase Configuration,,0
-model,"ir.action,name",act_purchase_form,Purchases,Compras,0
-model,"ir.action,name",act_purchase_form2,Purchases,Compras,0
-model,"ir.action,name",act_purchase_form_quotation,Purchases in Quotation,Cotizaciones de Compras,0
-model,"ir.action,name",act_shipment_form,Shipments,Envíos,0
-model,"ir.sequence,name",sequence_purchase,Purchase,Compras,0
-model,"ir.sequence.type,name",sequence_type_purchase,Purchase,Compras,0
-model,"ir.ui.menu,name",menu_configuration,Configuration,Configuración,0
-model,"ir.ui.menu,name",menu_purchase_form_confirmed,Confirmed Purchases,Compras confirmadas,0
-model,"ir.ui.menu,name",menu_purchase_form_draft,Draft Purchases,Compras en Borrador,0
-model,"ir.ui.menu,name",menu_purchase_form_new,New Purchase,Nueva Compra,0
-model,"ir.ui.menu,name",menu_supplier,Parties associated to Purchases,Terceros Asociados a Compras,0
-model,"ir.ui.menu,name",menu_purchase_configuration,Purchase Configuration,,0
-model,"ir.ui.menu,name",menu_purchase,Purchase Management,Gestión de Compras,0
-model,"ir.ui.menu,name",menu_purchase_form,Purchases,Compras,0
-model,"ir.ui.menu,name",menu_purchase_form_quotation,Purchases in Quotation,Cotizaciones de Compras,0
-model,"ir.ui.menu,name",menu_reporting,Reporting,Reportes,0
-model,"purchase.configuration,name",0,purchase.configuration,,0
-model,"purchase.handle.invoice.exception.ask,name",0,Invoice Exception Ask,Pregunta de Excepción de Factura,0
-model,"purchase.handle.shipment.exception.ask,name",0,Shipment Exception Ask,Preguntar Excepción de Envío,0
-model,"purchase.line-account.invoice.line,name",0,Purchase Line - Invoice Line,Línea de Compra - Línea de Factura,0
-model,"purchase.line-account.tax,name",0,Purchase Line - Tax,Línea de Compra - Impuesto,0
-model,"purchase.line-ignored-stock.move,name",0,Purchase Line - Ignored Move,Línea de Compra - Movimiento Ignorado,0
-model,"purchase.line,name",0,Purchase Line,Línea de Compra,0
-model,"purchase.line-recreated-stock.move,name",0,Purchase Line - Ignored Move,Línea de Compra - Movimiento Ignorado,0
-model,"purchase.product_supplier,name",0,Product Supplier,Proveedor de Producto,0
-model,"purchase.product_supplier.price,name",0,Product Supplier Price,Precio del Proveedor de Producto,0
-model,"purchase.purchase-account.invoice,name",0,Purchase - Invoice,Compra - Factura,0
-model,"purchase.purchase-ignored-account.invoice,name",0,Purchase - Ignored Invoice,Compra - Factura Ignorada,0
-model,"purchase.purchase,name",0,Purchase,Compra,0
-model,"purchase.purchase-recreated-account.invoice,name",0,Purchase - Recreated Invoice,Compra - Factura Recreada,0
-model,"res.group,name",group_purchase,Purchase,Compras,0
-model,"res.group,name",group_purchase_admin,Purchase Administrator,Administrador de Compra,0
-model,"workflow.activity,name",purchase_activity_cancel,Canceled,Cancelado,0
-model,"workflow.activity,name",purchase_activity_confirmed,Confirmed,Confirmado,0
-model,"workflow.activity,name",purchase_activity_done,Done,Hecho,0
-model,"workflow.activity,name",purchase_activity_draft,Draft,Borrador,0
-model,"workflow.activity,name",purchase_activity_invoice_done,Invoice Done,Factura Completa,0
-model,"workflow.activity,name",purchase_activity_invoice_purchase_exception,Invoice Exception,Excepción de Factura,0
-model,"workflow.activity,name",purchase_activity_invoice_method,Invoice Method,Método de Facturación,0
-model,"workflow.activity,name",purchase_activity_invoice_method_done,Invoice Method Done,Método de Factura Completo,0
-model,"workflow.activity,name",purchase_activity_invoice_shipment,Invoice Shipment,Envío de Factura,0
-model,"workflow.activity,name",purchase_activity_invoice_shipment_done,Invoice Shipment Done,Envío de Factura Completo,0
-model,"workflow.activity,name",purchase_activity_invoice_shipment_exception,Invoice Shipment Exception,Excepción de Envío de Factura,0
-model,"workflow.activity,name",purchase_activity_invoice_shipment_method,Invoice Shipment Method,Método de Envío de Factura,0
-model,"workflow.activity,name",purchase_activity_invoice_shipment_method_done,Invoice Shipment Method Done,Método de Envío de Factura Completo,0
-model,"workflow.activity,name",purchase_activity_quotation,Quotation,Cotización,0
-model,"workflow.activity,name",purchase_activity_shipment_exception,Shipment Exception,Excepción de Envío,0
-model,"workflow.activity,name",purchase_activity_waiting_invoice_purchase,Waiting Invoice,Esperando Factura,0
-model,"workflow.activity,name",purchase_activity_waiting_invoice_shipment,Waiting Invoice Shipment,Esperando Envío de Factura,0
-model,"workflow.activity,name",purchase_activity_waiting_shipment,Waiting Shipment,Esperando Envío,0
-model,"workflow,name",purchase_workflow,Purchase workflow,Flujo de Trabajo de Compras,0
-odt,purchase.purchase,0,Amount,Cantidad,0
-odt,purchase.purchase,0,Date:,Fecha:,0
-odt,purchase.purchase,0,Description,Descripción,0
-odt,purchase.purchase,0,Description:,Descripción:,0
-odt,purchase.purchase,0,Draft Purchase Order,Borrador de Orden de Compra,0
-odt,purchase.purchase,0,E-Mail:,Correo electrónico:,0
-odt,purchase.purchase,0,Phone:,Teléfono:,0
-odt,purchase.purchase,0,Purchase Order N°:,Nº de Orden de Compra:,0
-odt,purchase.purchase,0,Quantity,Cantidad,0
-odt,purchase.purchase,0,Request for Quotation N°:,Solicitud de Factura Nº:,0
-odt,purchase.purchase,0,Taxes,Impuestos,0
-odt,purchase.purchase,0,Taxes:,Impuestos,0
-odt,purchase.purchase,0,Total:,Total:,0
-odt,purchase.purchase,0,Total (excl. taxes):,Total(excl. impuestos):,0
-odt,purchase.purchase,0,Unit Price,Precio Unitario,0
-odt,purchase.purchase,0,VAT:,NIT:,0
-selection,"account.invoice,purchase_exception_state",0,,,0
-selection,"account.invoice,purchase_exception_state",0,Ignored,Ignorado,0
-selection,"account.invoice,purchase_exception_state",0,Recreated,Rehecho,0
-selection,"purchase.line,type",0,Comment,Comentario,0
-selection,"purchase.line,type",0,Line,Línea,0
-selection,"purchase.line,type",0,Subtotal,Subtotal,0
-selection,"purchase.line,type",0,Title,Título,0
-selection,"purchase.purchase,invoice_method",0,Based On Order,Basado en Orden,0
-selection,"purchase.purchase,invoice_method",0,Based On Shipment,Basado en Envío,0
-selection,"purchase.purchase,invoice_method",0,Manual,Manual,0
-selection,"purchase.purchase,invoice_state",0,Exception,Excepción,0
-selection,"purchase.purchase,invoice_state",0,None,Ninguno,0
-selection,"purchase.purchase,invoice_state",0,Paid,Pagado,0
-selection,"purchase.purchase,invoice_state",0,Waiting,En Espera,0
-selection,"purchase.purchase,shipment_state",0,Exception,Excepción,0
-selection,"purchase.purchase,shipment_state",0,None,Ninguno,0
-selection,"purchase.purchase,shipment_state",0,Received,Recibido,0
-selection,"purchase.purchase,shipment_state",0,Waiting,En Espera,0
-selection,"purchase.purchase,state",0,Canceled,Cancelado,0
-selection,"purchase.purchase,state",0,Confirmed,Confirmado,0
-selection,"purchase.purchase,state",0,Done,Hecho,0
-selection,"purchase.purchase,state",0,Draft,Borrador,0
-selection,"purchase.purchase,state",0,Quotation,Cotización,0
-selection,"stock.move,purchase_exception_state",0,,,0
-selection,"stock.move,purchase_exception_state",0,Ignored,Ignorado,0
-selection,"stock.move,purchase_exception_state",0,Recreated,Rehecho,0
-view,product.product,0,Products,Productos,0
-view,product.product,0,Suppliers,Proveedores,0
-view,product.template,0,Product Suppliers,Proveedores de Productos,0
-view,product.template,0,Suppliers,Proveedores,0
-view,purchase.configuration,0,Purchase Configuration,,0
-view,purchase.handle.invoice.exception.ask,0,Choose invoices to recreate,Escoja una factura a rehacer,0
-view,purchase.handle.invoice.exception.ask,0,Handle Invoice Exception,Manejar excepción de factura,0
-view,purchase.handle.shipment.exception.ask,0,Choose moves to recreate,Elegir movimientos a recrear,0
-view,purchase.handle.shipment.exception.ask,0,Handle shipment Exception,Maneje Excepciones de envío,0
-view,purchase.handle.shipment.exception.ask,0,Recreated Moves,Movimientos recreados,0
-view,purchase.line,0,General,General,0
-view,purchase.line,0,Notes,Notas,0
-view,purchase.line,0,Products,Productos,0
-view,purchase.line,0,Purchase Line,Línea de Compra,0
-view,purchase.line,0,Purchase Lines,Líneas de Compra,0
-view,purchase.product_supplier,0,Product Supplier,Proveedor del Producto,0
-view,purchase.product_supplier,0,Product Suppliers,Proveedores de Productos,0
-view,purchase.product_supplier.price,0,Product Supplier Price,Precio del Proveedor del Producto,0
-view,purchase.product_supplier.price,0,Product Supplier Prices,Precios del Proveedor del Producto,0
-view,purchase.purchase,0,Cancel,Cancelar,0
-view,purchase.purchase,0,Confirm,Confirmar,0
-view,purchase.purchase,0,Draft,Borrador,0
-view,purchase.purchase,0,Handle Invoice Exception,Manejar excepción de factura,0
-view,purchase.purchase,0,Handle Shipment Exception,Tratar Excepción de Envío,0
-view,purchase.purchase,0,Invoices,Facturas,0
-view,purchase.purchase,0,Lines,Líneas,0
-view,purchase.purchase,0,Moves,Movimientos,0
-view,purchase.purchase,0,Other Info,Información Adicional,0
-view,purchase.purchase,0,Purchase,Compra,0
-view,purchase.purchase,0,Purchases,Compras,0
-view,purchase.purchase,0,Quotation,Cotización,0
-view,purchase.purchase,0,Shipments,Envíos,0
-wizard_button,"purchase.handle.invoice.exception,init,end",0,Cancel,Cancelar,0
-wizard_button,"purchase.handle.invoice.exception,init,ok",0,Ok,Aceptar,0
-wizard_button,"purchase.handle.shipment.exception,init,end",0,Cancel,Cancelar,0
-wizard_button,"purchase.handle.shipment.exception,init,ok",0,Ok,Aceptar,0
diff --git a/es_ES.csv b/es_ES.csv
deleted file mode 100644
index e81cff9..0000000
--- a/es_ES.csv
+++ /dev/null
@@ -1,250 +0,0 @@
-type,name,res_id,src,value,fuzzy
-error,account.invoice,0,You can not delete invoices that come from a purchase!,No puede borrar facturas que vienen de una compra,0
-error,account.invoice,0,You cannot reset to draft an invoice generated by a purchase.,No puede cambiar a borrador una factura generada por una compra.,0
-error,product.template,0,"Purchase prices are based on the purchase uom, are you sure to change it?","Los precios de compra están basados en la UdM de compra, ¿desea cambiarlo?",0
-error,purchase.line,0,"It misses an ""account expense"" default property!",Hace falta la propiedad predeterminada de «cuenta de gastos»,0
-error,purchase.line,0,"It misses an ""Account Expense"" on product ""%s""!",Hace falta una «Cuenta de gasto» del producto «%s»,0
-error,purchase.line,0,The supplier location is required!,Se necesita la ubicación del proveedor,0
-error,purchase.purchase,0,Invoice addresses must be defined for the quotation.,Debe definir las direcciones para la cotización.,0
-error,purchase.purchase,0,"It misses an ""Account Payable"" on the party ""%s""!",Al tercero «%s» le hace falta una «Cuenta de pagos»,0
-error,stock.shipment.in,0,You cannot reset to draft a move generated by a purchase.,No puede restablecer a borrador un movimiento generado por una compra.,0
-field,"account.invoice,purchase_exception_state",0,Exception State,Estado excepción,0
-field,"product.template,product_suppliers",0,Suppliers,Proveedores,0
-field,"product.template,purchasable",0,Purchasable,Comprable,0
-field,"product.template,purchase_uom",0,Purchase UOM,UdM de compra,0
-field,"purchase.handle.invoice.exception.ask,domain_invoices",0,Domain Invoices,Facturas de dominio,0
-field,"purchase.handle.invoice.exception.ask,recreate_invoices",0,Recreate Invoices,Rehacer facturas,0
-field,"purchase.handle.shipment.exception.ask,domain_moves",0,Domain Moves,Movimientos de dominio,0
-field,"purchase.handle.shipment.exception.ask,recreate_moves",0,Recreate Moves,Rehacer movimientos,0
-field,"purchase.line-account.invoice.line,invoice_line",0,Invoice Line,Línea de factura,0
-field,"purchase.line-account.invoice.line,purchase_line",0,Purchase Line,Línea de compra,0
-field,"purchase.line-account.invoice.line,rec_name",0,Name,Nombre,0
-field,"purchase.line-account.tax,line",0,Purchase Line,Línea de compra,0
-field,"purchase.line-account.tax,rec_name",0,Name,Nombre,0
-field,"purchase.line-account.tax,tax",0,Tax,Impuesto,0
-field,"purchase.line,amount",0,Amount,Cantidad,0
-field,"purchase.line,description",0,Description,Descripción,0
-field,"purchase.line-ignored-stock.move,move",0,Move,Movimiento,0
-field,"purchase.line-ignored-stock.move,purchase_line",0,Purchase Line,Línea de compra,0
-field,"purchase.line-ignored-stock.move,rec_name",0,Name,Nombre,0
-field,"purchase.line,invoice_lines",0,Invoice Lines,Líneas de factura,0
-field,"purchase.line,move_done",0,Moves Done,Movimientos terminados,0
-field,"purchase.line,move_exception",0,Moves Exception,Exepción de movimientos,0
-field,"purchase.line,moves",0,Moves,Movimientos,0
-field,"purchase.line,moves_ignored",0,Ignored Moves,Movimientos ignorados,0
-field,"purchase.line,moves_recreated",0,Recreated Moves,Rehacer movimientos,0
-field,"purchase.line,note",0,Note,Nota,0
-field,"purchase.line,product",0,Product,Producto,0
-field,"purchase.line,purchase",0,Purchase,Compra,0
-field,"purchase.line,quantity",0,Quantity,Cantidad,0
-field,"purchase.line,rec_name",0,Name,Nombre,0
-field,"purchase.line-recreated-stock.move,move",0,Move,Movimiento,0
-field,"purchase.line-recreated-stock.move,purchase_line",0,Purchase Line,Línea de compra,0
-field,"purchase.line-recreated-stock.move,rec_name",0,Name,Nombre,0
-field,"purchase.line,sequence",0,Sequence,Secuencia,0
-field,"purchase.line,taxes",0,Taxes,Impuestos,0
-field,"purchase.line,type",0,Type,Tipo,0
-field,"purchase.line,unit",0,Unit,Unidad,0
-field,"purchase.line,unit_digits",0,Unit Digits,Dígitos unitarios,0
-field,"purchase.line,unit_price",0,Unit Price,Precio unitario,0
-field,"purchase.product_supplier,code",0,Code,Código,0
-field,"purchase.product_supplier,company",0,Company,Compañía,0
-field,"purchase.product_supplier,delivery_time",0,Delivery Time,Tiempo de envío,0
-field,"purchase.product_supplier,name",0,Name,Nombre,0
-field,"purchase.product_supplier,party",0,Supplier,Proveedor,0
-field,"purchase.product_supplier.price,product_supplier",0,Supplier,Proveedor,0
-field,"purchase.product_supplier.price,quantity",0,Quantity,Cantidad,0
-field,"purchase.product_supplier.price,rec_name",0,Name,Nombre,0
-field,"purchase.product_supplier,prices",0,Prices,Precios,0
-field,"purchase.product_supplier.price,unit_price",0,Unit Price,Precio unitario,0
-field,"purchase.product_supplier,product",0,Product,Producto,0
-field,"purchase.product_supplier,rec_name",0,Name,Nombre,0
-field,"purchase.product_supplier,sequence",0,Sequence,Secuencia,0
-field,"purchase.purchase-account.invoice,invoice",0,Invoice,Factura,0
-field,"purchase.purchase-account.invoice,purchase",0,Purchase,Compra,0
-field,"purchase.purchase-account.invoice,rec_name",0,Name,Nombre,0
-field,"purchase.purchase,comment",0,Comment,Comentario,0
-field,"purchase.purchase,company",0,Company,Empresa,0
-field,"purchase.purchase,currency",0,Currency,Divisa,0
-field,"purchase.purchase,currency_digits",0,Currency Digits,Dígitos de la divisa,0
-field,"purchase.purchase,description",0,Description,Descripción,0
-field,"purchase.purchase-ignored-account.invoice,invoice",0,Invoice,Factura,0
-field,"purchase.purchase-ignored-account.invoice,purchase",0,Purchase,Compra,0
-field,"purchase.purchase-ignored-account.invoice,rec_name",0,Name,Nombre,0
-field,"purchase.purchase,invoice_address",0,Invoice Address,Dirección de facturación,0
-field,"purchase.purchase,invoice_exception",0,Invoices Exception,Excepción de facturaciones,0
-field,"purchase.purchase,invoice_method",0,Invoice Method,Método de facturación,0
-field,"purchase.purchase,invoice_paid",0,Invoices Paid,Facturas pagadas,0
-field,"purchase.purchase,invoices",0,Invoices,Facturas,0
-field,"purchase.purchase,invoices_ignored",0,Ignored Invoices,Facturas ignoradas,0
-field,"purchase.purchase,invoices_recreated",0,Recreated Invoices,Facturas recreadas,0
-field,"purchase.purchase,invoice_state",0,Invoice State,Estado de factura,0
-field,"purchase.purchase,lines",0,Lines,Líneas,0
-field,"purchase.purchase,moves",0,Moves,Movimientos,0
-field,"purchase.purchase,party",0,Party,Terceros,0
-field,"purchase.purchase,party_lang",0,Party Language,Idioma del tercero,0
-field,"purchase.purchase,payment_term",0,Payment Term,Término de pago,0
-field,"purchase.purchase,purchase_date",0,Purchase Date,Fecha de compra,0
-field,"purchase.purchase,rec_name",0,Name,Nombre,0
-field,"purchase.purchase-recreated-account.invoice,invoice",0,Invoice,Factura,0
-field,"purchase.purchase-recreated-account.invoice,purchase",0,Purchase,Compra,0
-field,"purchase.purchase-recreated-account.invoice,rec_name",0,Name,Nombre,0
-field,"purchase.purchase,reference",0,Reference,Referencia,0
-field,"purchase.purchase,shipment_done",0,Shipment Done,Envío terminado,0
-field,"purchase.purchase,shipment_exception",0,Shipments Exception,Excepción de envios,0
-field,"purchase.purchase,shipments",0,Shipments,Envíos,0
-field,"purchase.purchase,shipment_state",0,Shipment State,Estado de envío,0
-field,"purchase.purchase,state",0,State,Estado,0
-field,"purchase.purchase,supplier_reference",0,Supplier Reference,Referencia de proveedor,0
-field,"purchase.purchase,tax_amount",0,Tax,Impuesto,0
-field,"purchase.purchase,total_amount",0,Total,Total,0
-field,"purchase.purchase,untaxed_amount",0,Untaxed,Sin impuesto,0
-field,"purchase.purchase,warehouse",0,Warehouse,Almacén,0
-field,"stock.move,purchase",0,Purchase,Compra,0
-field,"stock.move,purchase_currency",0,Purchase Currency,Divisa de compra,0
-field,"stock.move,purchase_exception_state",0,Exception State,Estado excepción,0
-field,"stock.move,purchase_line",0,,,0
-field,"stock.move,purchase_quantity",0,Purchase Quantity,Cantidad de compra,0
-field,"stock.move,purchase_unit",0,Purchase Unit,Unidad de compra,0
-field,"stock.move,purchase_unit_digits",0,Purchase Unit Digits,Decimales de la unidad de compra,0
-field,"stock.move,purchase_unit_price",0,Purchase Unit Price,Precio de la unidad de compra,0
-field,"stock.move,purchase_visible",0,Purchase Visible,Compra visible,0
-field,"stock.move,supplier",0,Supplier,Proveedor,0
-help,"purchase.handle.invoice.exception.ask,recreate_invoices",0,The selected invoices will be recreated. The other ones will be ignored.,La factura seleccionada será recreada. Las otras serán ignoradas.,0
-help,"purchase.handle.shipment.exception.ask,recreate_moves",0,The selected moves will be recreated. The other ones will be ignored.,Los movimientos seleccionados se reharán. Los demás se ignorarán.,0
-help,"purchase.product_supplier,delivery_time",0,In number of days,En número de días,0
-help,"purchase.product_supplier.price,quantity",0,Minimal quantity,Cantidad mínima,0
-model,"ir.action,name",act_purchase_form_confirmed,Confirmed Purchases,Compras confirmadas,0
-model,"ir.action,name",act_purchase_form_draft,Draft Purchases,Compras en borrador,0
-model,"ir.action,name",wizard_invoice_handle_exception,Handle Invoice Exception,Gestionar excepción de factura,0
-model,"ir.action,name",wizard_shipment_handle_exception,Handle Shipment Exception,Gestionar excepción de envio,0
-model,"ir.action,name",act_invoice_form,Invoices,Facturas,0
-model,"ir.action,name",act_purchase_form_new,New Purchase,Nueva compra,0
-model,"ir.action,name",act_open_supplier,Parties associated to Purchases,Terceros asociados con compras,0
-model,"ir.action,name",report_purchase,Purchase,Compra,0
-model,"ir.action,name",act_purchase_form,Purchases,Compras,0
-model,"ir.action,name",act_purchase_form2,Purchases,Compras,0
-model,"ir.action,name",act_purchase_form_quotation,Purchases in Quotation,Compras en cotización,0
-model,"ir.action,name",act_shipment_form,Shipments,Envíos,0
-model,"ir.sequence,name",sequence_purchase,Purchase,Compra,0
-model,"ir.sequence.type,name",sequence_type_purchase,Purchase,Compra,0
-model,"ir.ui.menu,name",menu_configuration,Configuration,Configuración,0
-model,"ir.ui.menu,name",menu_purchase_form_confirmed,Confirmed Purchases,Compras confirmadas,0
-model,"ir.ui.menu,name",menu_purchase_form_draft,Draft Purchases,Compras en borrador,0
-model,"ir.ui.menu,name",menu_purchase_form_new,New Purchase,Nueva compra,0
-model,"ir.ui.menu,name",menu_supplier,Parties associated to Purchases,Terceros asociados con compras,0
-model,"ir.ui.menu,name",menu_purchase,Purchase Management,Gestión de compras,0
-model,"ir.ui.menu,name",menu_purchase_form,Purchases,Compras,0
-model,"ir.ui.menu,name",menu_purchase_form_quotation,Purchases in Quotation,Compras en cotización,0
-model,"ir.ui.menu,name",menu_reporting,Reporting,Informes,0
-model,"purchase.handle.invoice.exception.ask,name",0,Invoice Exception Ask,Factura de excepcion - Petición,0
-model,"purchase.handle.shipment.exception.ask,name",0,Shipment Exception Ask,Envio de excepcion - Petición,0
-model,"purchase.line-account.invoice.line,name",0,Purchase Line - Invoice Line,Línea de compra - Línea de factura,0
-model,"purchase.line-account.tax,name",0,Purchase Line - Tax,Línea de compra - Impuesto,0
-model,"purchase.line-ignored-stock.move,name",0,Purchase Line - Ignored Move,Línea de compra - Movimiento Ignorado,0
-model,"purchase.line,name",0,Purchase Line,Línea de compra,0
-model,"purchase.line-recreated-stock.move,name",0,Purchase Line - Ignored Move,Línea de compra - Movimiento ignorado,0
-model,"purchase.product_supplier,name",0,Product Supplier,Proveedor de producto,0
-model,"purchase.product_supplier.price,name",0,Product Supplier Price,Precio del proveedor del producto,0
-model,"purchase.purchase-account.invoice,name",0,Purchase - Invoice,Compra - Factura,0
-model,"purchase.purchase-ignored-account.invoice,name",0,Purchase - Ignored Invoice,Compra - Factura ignorada,0
-model,"purchase.purchase,name",0,Purchase,Compra,0
-model,"purchase.purchase-recreated-account.invoice,name",0,Purchase - Recreated Invoice,Compra - Factura recreada,0
-model,"res.group,name",group_purchase,Purchase,Compra,0
-model,"res.group,name",group_purchase_admin,Purchase Administrator,Administrador de compra,0
-model,"workflow.activity,name",purchase_activity_cancel,Canceled,Cancelado,0
-model,"workflow.activity,name",purchase_activity_confirmed,Confirmed,Confirmado,0
-model,"workflow.activity,name",purchase_activity_done,Done,Terminada,0
-model,"workflow.activity,name",purchase_activity_draft,Draft,Borrador,0
-model,"workflow.activity,name",purchase_activity_invoice_done,Invoice Done,Factura terminada,0
-model,"workflow.activity,name",purchase_activity_invoice_purchase_exception,Invoice Exception,Factura de excepción,0
-model,"workflow.activity,name",purchase_activity_invoice_method,Invoice Method,Método de facturación,0
-model,"workflow.activity,name",purchase_activity_invoice_method_done,Invoice Method Done,Método de factura terminado,0
-model,"workflow.activity,name",purchase_activity_invoice_shipment,Invoice Shipment,Envío de factura,0
-model,"workflow.activity,name",purchase_activity_invoice_shipment_done,Invoice Shipment Done,Envío de factura terminado,0
-model,"workflow.activity,name",purchase_activity_invoice_shipment_exception,Invoice Shipment Exception,Excepción de envío de factura,0
-model,"workflow.activity,name",purchase_activity_invoice_shipment_method,Invoice Shipment Method,Método de envio de factura,0
-model,"workflow.activity,name",purchase_activity_invoice_shipment_method_done,Invoice Shipment Method Done,Método de envío de factura terminado,0
-model,"workflow.activity,name",purchase_activity_quotation,Quotation,Cotización,0
-model,"workflow.activity,name",purchase_activity_shipment_exception,Shipment Exception,Excepción de envio,0
-model,"workflow.activity,name",purchase_activity_waiting_invoice_purchase,Waiting Invoice,Esperando factura,0
-model,"workflow.activity,name",purchase_activity_waiting_invoice_shipment,Waiting Invoice Shipment,Esperando envío de factura,0
-model,"workflow.activity,name",purchase_activity_waiting_shipment,Waiting Shipment,Esperando envio,0
-model,"workflow,name",purchase_workflow,Purchase workflow,Flujo de trabajo de compra,0
-odt,purchase.purchase,0,Amount,Cantidad,0
-odt,purchase.purchase,0,Date:,Fecha:,0
-odt,purchase.purchase,0,Description,Descripción,0
-odt,purchase.purchase,0,Description:,Descripción:,0
-odt,purchase.purchase,0,Draft Purchase Order,Orden de compra en borrador,0
-odt,purchase.purchase,0,E-Mail:,Correo electrónico:,0
-odt,purchase.purchase,0,Phone:,Teléfono:,0
-odt,purchase.purchase,0,Purchase Order N°:,Nº de orden de compra:,0
-odt,purchase.purchase,0,Quantity,Cantidad,0
-odt,purchase.purchase,0,Request for Quotation N°:,Solicitud de presupuesto Nº:,0
-odt,purchase.purchase,0,Taxes,Impuestos,0
-odt,purchase.purchase,0,Taxes:,Impuestos:,0
-odt,purchase.purchase,0,Total:,Total:,0
-odt,purchase.purchase,0,Total (excl. taxes):,Total (sin impuestos):,0
-odt,purchase.purchase,0,Unit Price,Precio unitario,0
-odt,purchase.purchase,0,VAT:,IVA:,0
-selection,"account.invoice,purchase_exception_state",0,,,0
-selection,"account.invoice,purchase_exception_state",0,Ignored,Ignorado,0
-selection,"account.invoice,purchase_exception_state",0,Recreated,Rehecho,0
-selection,"purchase.line,type",0,Comment,Comentario,0
-selection,"purchase.line,type",0,Line,Línea,0
-selection,"purchase.line,type",0,Subtotal,Subtotal,0
-selection,"purchase.line,type",0,Title,Título,0
-selection,"purchase.purchase,invoice_method",0,Based On Order,Basado en orden,0
-selection,"purchase.purchase,invoice_method",0,Based On Shipment,Basado en envio,0
-selection,"purchase.purchase,invoice_method",0,Manual,Manual,0
-selection,"purchase.purchase,invoice_state",0,Exception,Excepción,0
-selection,"purchase.purchase,invoice_state",0,None,Ninguno,0
-selection,"purchase.purchase,invoice_state",0,Paid,Pagado,0
-selection,"purchase.purchase,invoice_state",0,Waiting,En espera,0
-selection,"purchase.purchase,shipment_state",0,Exception,Excepción,0
-selection,"purchase.purchase,shipment_state",0,None,Ninguno,0
-selection,"purchase.purchase,shipment_state",0,Received,Recibido,0
-selection,"purchase.purchase,shipment_state",0,Waiting,En espera,0
-selection,"purchase.purchase,state",0,Canceled,Cancelado,0
-selection,"purchase.purchase,state",0,Confirmed,Confirmado,0
-selection,"purchase.purchase,state",0,Done,Terminada,0
-selection,"purchase.purchase,state",0,Draft,Borrador,0
-selection,"purchase.purchase,state",0,Quotation,Presupuesto,0
-selection,"stock.move,purchase_exception_state",0,,,0
-selection,"stock.move,purchase_exception_state",0,Ignored,Ignorado,0
-selection,"stock.move,purchase_exception_state",0,Recreated,Rehecho,0
-view,product.product,0,Products,Productos,0
-view,product.product,0,Suppliers,Proveedores,0
-view,product.template,0,Product Suppliers,Proveedores de productos,0
-view,product.template,0,Suppliers,Proveedores,0
-view,purchase.handle.invoice.exception.ask,0,Choose invoices to recreate,Seleccione las facturas a recrear,0
-view,purchase.handle.invoice.exception.ask,0,Handle Invoice Exception,Manejar excepción de factura,0
-view,purchase.handle.shipment.exception.ask,0,Choose moves to recreate,Elegir movimientos a recrear,0
-view,purchase.handle.shipment.exception.ask,0,Handle shipment Exception,Gestionar excepciones de envio,0
-view,purchase.handle.shipment.exception.ask,0,Recreated Moves,Movimientos recreados,0
-view,purchase.line,0,General,General,0
-view,purchase.line,0,Notes,Notas,0
-view,purchase.line,0,Products,Productos,0
-view,purchase.line,0,Purchase Line,Línea de compra,0
-view,purchase.line,0,Purchase Lines,Líneas de compra,0
-view,purchase.product_supplier,0,Product Supplier,Proveedor del producto,0
-view,purchase.product_supplier,0,Product Suppliers,Proveedores de productos,0
-view,purchase.product_supplier.price,0,Product Supplier Price,Precio del proveedor del producto,0
-view,purchase.product_supplier.price,0,Product Supplier Prices,Precios del proveedor del producto,0
-view,purchase.purchase,0,Cancel,Cancelar,0
-view,purchase.purchase,0,Confirm,Confirmar,0
-view,purchase.purchase,0,Draft,Borrador,0
-view,purchase.purchase,0,Handle Invoice Exception,Gestionar excepción de factura,0
-view,purchase.purchase,0,Handle Shipment Exception,Gestionar excepción de envios,0
-view,purchase.purchase,0,Invoices,Facturas,0
-view,purchase.purchase,0,Lines,Líneas,0
-view,purchase.purchase,0,Moves,Movimientos,0
-view,purchase.purchase,0,Other Info,Información adicional,0
-view,purchase.purchase,0,Purchase,Compra,0
-view,purchase.purchase,0,Purchases,Compras,0
-view,purchase.purchase,0,Quotation,Presupuesto,0
-view,purchase.purchase,0,Shipments,Envíos,0
-wizard_button,"purchase.handle.invoice.exception,init,end",0,Cancel,Cancelar,0
-wizard_button,"purchase.handle.invoice.exception,init,ok",0,Ok,Aceptar,0
-wizard_button,"purchase.handle.shipment.exception,init,end",0,Cancel,Cancelar,0
-wizard_button,"purchase.handle.shipment.exception,init,ok",0,Ok,Aceptar,0
diff --git a/fr_FR.csv b/fr_FR.csv
deleted file mode 100644
index 1bf86b6..0000000
--- a/fr_FR.csv
+++ /dev/null
@@ -1,265 +0,0 @@
-type,name,res_id,src,value,fuzzy
-error,account.invoice,0,You can not delete invoices that come from a purchase!,Vous ne pouvez pas supprimer une facture qui provient d'un achat,0
-error,account.invoice,0,You cannot reset to draft an invoice generated by a purchase.,Vous ne pouvez pas réinitialiser une facture générée par un achat.,0
-error,product.template,0,"Purchase prices are based on the purchase uom, are you sure to change it?","Les prix d'achat sont basé sur l'UDM d'achat, êtes-vous sur de vouloir la modifier ?",0
-error,purchase.line,0,"It misses an ""Account Expense"" on product ""%s""!","Il manque un compte de charge sur le produit ""%s"" !",0
-error,purchase.line,0,"It misses an ""account expense"" default property!","il manque une propriété par défaut ""compte de charge"" !",0
-error,purchase.line,0,The supplier location is required!,L'emplacement fournisseur est requis !,0
-error,purchase.purchase,0,Invoice addresses must be defined for the quotation.,L'adresse de facturation doit être définie pour le devis.,0
-error,purchase.purchase,0,"It misses an ""Account Payable"" on the party ""%s""!","Il manque un compte à payer sur le tiers ""%s"" !",0
-error,stock.shipment.in,0,You cannot reset to draft a move generated by a purchase.,Vous ne pouvez pas réinitialiser un mouvement généré par un achat.,0
-field,"account.invoice,purchase_exception_state",0,Exception State,État d'exception,0
-field,"account.invoice,purchases",0,Purchases,Achats,1
-field,"account.invoice.line,purchase_lines",0,Purchase Lines,Lignes d'achat,1
-field,"product.template,product_suppliers",0,Suppliers,Fournisseurs,0
-field,"product.template,purchasable",0,Purchasable,Achetable,0
-field,"product.template,purchase_uom",0,Purchase UOM,UDM à l'achat,0
-field,"purchase.configuration,purchase_invoice_method",0,Invoice Method,Méthode de facturation,1
-field,"purchase.configuration,purchase_sequence",0,Purchase Reference Sequence,Séquence de référence d'achat,0
-field,"purchase.configuration,rec_name",0,Name,Nom,0
-field,"purchase.handle.invoice.exception.ask,domain_invoices",0,Domain Invoices,Domaine des factures,0
-field,"purchase.handle.invoice.exception.ask,recreate_invoices",0,Recreate Invoices,Recréer les factures,0
-field,"purchase.handle.shipment.exception.ask,domain_moves",0,Domain Moves,Domaine des mouvements,0
-field,"purchase.handle.shipment.exception.ask,recreate_moves",0,Recreate Moves,Recréer les mouvements,0
-field,"purchase.line,amount",0,Amount,Montant,0
-field,"purchase.line,description",0,Description,Description,0
-field,"purchase.line,invoice_lines",0,Invoice Lines,Lignes de factures,0
-field,"purchase.line,move_done",0,Moves Done,Mouvements effectués,0
-field,"purchase.line,move_exception",0,Moves Exception,Mouvements en exception,0
-field,"purchase.line,moves",0,Moves,Mouvements,0
-field,"purchase.line,moves_ignored",0,Ignored Moves,Mouvements ignorés,0
-field,"purchase.line,moves_recreated",0,Recreated Moves,Mouvements recréés,0
-field,"purchase.line,note",0,Note,Note,0
-field,"purchase.line,product",0,Product,Produit,0
-field,"purchase.line,purchase",0,Purchase,Achat,0
-field,"purchase.line,quantity",0,Quantity,Quantité,0
-field,"purchase.line,rec_name",0,Name,Nom,0
-field,"purchase.line,sequence",0,Sequence,Séquence,0
-field,"purchase.line,taxes",0,Taxes,Taxes,0
-field,"purchase.line,type",0,Type,Type,0
-field,"purchase.line,unit",0,Unit,Unité,0
-field,"purchase.line,unit_digits",0,Unit Digits,Décimales de l'unité,0
-field,"purchase.line,unit_price",0,Unit Price,Prix unitaire,0
-field,"purchase.line-account.invoice.line,invoice_line",0,Invoice Line,Ligne de Facture,0
-field,"purchase.line-account.invoice.line,purchase_line",0,Purchase Line,Ligne d'achat,0
-field,"purchase.line-account.invoice.line,rec_name",0,Name,Nom,0
-field,"purchase.line-account.tax,line",0,Purchase Line,Ligne d'achat,0
-field,"purchase.line-account.tax,rec_name",0,Name,Nom,0
-field,"purchase.line-account.tax,tax",0,Tax,Taxe,0
-field,"purchase.line-ignored-stock.move,move",0,Move,Mouvement,0
-field,"purchase.line-ignored-stock.move,purchase_line",0,Purchase Line,Ligne d'achat,0
-field,"purchase.line-ignored-stock.move,rec_name",0,Name,Nom,0
-field,"purchase.line-recreated-stock.move,move",0,Move,Mouvement,0
-field,"purchase.line-recreated-stock.move,purchase_line",0,Purchase Line,Ligne d'achat,0
-field,"purchase.line-recreated-stock.move,rec_name",0,Name,Nom,0
-field,"purchase.product_supplier,code",0,Code,Code,0
-field,"purchase.product_supplier,company",0,Company,Société,0
-field,"purchase.product_supplier,delivery_time",0,Delivery Time,Temps de livraison,0
-field,"purchase.product_supplier,name",0,Name,Nom,0
-field,"purchase.product_supplier,party",0,Supplier,Fournisseur,0
-field,"purchase.product_supplier,prices",0,Prices,Prix,0
-field,"purchase.product_supplier,product",0,Product,Produit,0
-field,"purchase.product_supplier,rec_name",0,Name,Nom,0
-field,"purchase.product_supplier,sequence",0,Sequence,Séquence,0
-field,"purchase.product_supplier.price,product_supplier",0,Supplier,Fournisseur,0
-field,"purchase.product_supplier.price,quantity",0,Quantity,Quantité,0
-field,"purchase.product_supplier.price,rec_name",0,Name,Nom,0
-field,"purchase.product_supplier.price,unit_price",0,Unit Price,Prix unitaire,0
-field,"purchase.purchase,comment",0,Comment,Commentaire,0
-field,"purchase.purchase,company",0,Company,Société,0
-field,"purchase.purchase,currency",0,Currency,Devise,0
-field,"purchase.purchase,currency_digits",0,Currency Digits,Décimales de la devise,0
-field,"purchase.purchase,description",0,Description,Description,0
-field,"purchase.purchase,invoice_address",0,Invoice Address,Adresse de facturation,0
-field,"purchase.purchase,invoice_exception",0,Invoices Exception,Factures en exception,0
-field,"purchase.purchase,invoice_method",0,Invoice Method,Méthode de facturation,0
-field,"purchase.purchase,invoice_paid",0,Invoices Paid,Factures payées,0
-field,"purchase.purchase,invoice_state",0,Invoice State,État de la facture,0
-field,"purchase.purchase,invoices",0,Invoices,Factures,0
-field,"purchase.purchase,invoices_ignored",0,Ignored Invoices,Factures ignorées,0
-field,"purchase.purchase,invoices_recreated",0,Recreated Invoices,Factures recréées,0
-field,"purchase.purchase,lines",0,Lines,Lignes,0
-field,"purchase.purchase,moves",0,Moves,Mouvements,0
-field,"purchase.purchase,party",0,Party,Tiers,0
-field,"purchase.purchase,party_lang",0,Party Language,Langue du tiers,0
-field,"purchase.purchase,payment_term",0,Payment Term,Conditions de paiement,0
-field,"purchase.purchase,purchase_date",0,Purchase Date,Date d'achat,0
-field,"purchase.purchase,rec_name",0,Name,Nom,0
-field,"purchase.purchase,reference",0,Reference,Référence,0
-field,"purchase.purchase,shipment_done",0,Shipment Done,Expédition effectuée,0
-field,"purchase.purchase,shipment_exception",0,Shipments Exception,Expéditions en exception,0
-field,"purchase.purchase,shipment_state",0,Shipment State,État de l'expédition,0
-field,"purchase.purchase,shipments",0,Shipments,Expéditions,0
-field,"purchase.purchase,state",0,State,État,0
-field,"purchase.purchase,supplier_reference",0,Supplier Reference,Référence fournisseur,0
-field,"purchase.purchase,tax_amount",0,Tax,Taxe,0
-field,"purchase.purchase,total_amount",0,Total,Total,0
-field,"purchase.purchase,untaxed_amount",0,Untaxed,Non-taxé,0
-field,"purchase.purchase,warehouse",0,Warehouse,Entrepôt,0
-field,"purchase.purchase-account.invoice,invoice",0,Invoice,Facture,0
-field,"purchase.purchase-account.invoice,purchase",0,Purchase,Achat,0
-field,"purchase.purchase-account.invoice,rec_name",0,Name,Nom,0
-field,"purchase.purchase-ignored-account.invoice,invoice",0,Invoice,Facture,0
-field,"purchase.purchase-ignored-account.invoice,purchase",0,Purchase,Achat,0
-field,"purchase.purchase-ignored-account.invoice,rec_name",0,Name,Nom,0
-field,"purchase.purchase-recreated-account.invoice,invoice",0,Invoice,Facture,0
-field,"purchase.purchase-recreated-account.invoice,purchase",0,Purchase,Achat,0
-field,"purchase.purchase-recreated-account.invoice,rec_name",0,Name,Nom,0
-field,"stock.move,purchase",0,Purchase,Achat,0
-field,"stock.move,purchase_currency",0,Purchase Currency,Devise de l'achat,0
-field,"stock.move,purchase_exception_state",0,Exception State,État d'exception,0
-field,"stock.move,purchase_line",0,Purchase Line,Ligne d'achat,0
-field,"stock.move,purchase_quantity",0,Purchase Quantity,Quantité d'achat,0
-field,"stock.move,purchase_unit",0,Purchase Unit,Unité d'achat,0
-field,"stock.move,purchase_unit_digits",0,Purchase Unit Digits,Décimales de l'unité d'achat,0
-field,"stock.move,purchase_unit_price",0,Purchase Unit Price,Prix unitaire d'achat,0
-field,"stock.move,purchase_visible",0,Purchase Visible,Achat visible,0
-field,"stock.move,supplier",0,Supplier,Fournisseur,0
-help,"purchase.handle.invoice.exception.ask,recreate_invoices",0,The selected invoices will be recreated. The other ones will be ignored.,Les factures sélectionnées seront recréés. Les autres seront ignorées.,0
-help,"purchase.handle.shipment.exception.ask,recreate_moves",0,The selected moves will be recreated. The other ones will be ignored.,Les mouvements sélectionnés seront recréés. Les autres seront ignorés.,0
-help,"purchase.product_supplier,delivery_time",0,In number of days,En nombre de jours,0
-help,"purchase.product_supplier.price,quantity",0,Minimal quantity,Quantité minimale,0
-model,"ir.action,name",act_invoice_form,Invoices,Factures,0
-model,"ir.action,name",act_open_supplier,Parties associated to Purchases,Tiers associés à des achats,0
-model,"ir.action,name",act_purchase_configuration_form,Purchase Configuration,Configuration des achats,0
-model,"ir.action,name",act_purchase_form,Purchases,Achats,0
-model,"ir.action,name",act_purchase_form2,Purchases,Achats,0
-model,"ir.action,name",act_purchase_form_confirmed,Confirmed Purchases,Achats confirmés,0
-model,"ir.action,name",act_purchase_form_draft,Draft Purchases,Achats brouillons,0
-model,"ir.action,name",act_purchase_form_new,New Purchase,Nouvel achat,0
-model,"ir.action,name",act_purchase_form_quotation,Purchases in Quotation,Devis,0
-model,"ir.action,name",act_shipment_form,Shipments,Expéditions,0
-model,"ir.action,name",report_purchase,Purchase,Achat,0
-model,"ir.action,name",wizard_invoice_handle_exception,Handle Invoice Exception,Gérer l'exception de facture,0
-model,"ir.action,name",wizard_shipment_handle_exception,Handle Shipment Exception,Gérer l'exception d'expédition,0
-model,"ir.sequence,name",sequence_purchase,Purchase,Achat,0
-model,"ir.sequence.type,name",sequence_type_purchase,Purchase,Achat,0
-model,"ir.ui.menu,name",menu_configuration,Configuration,Configuration,0
-model,"ir.ui.menu,name",menu_purchase,Purchase Management,Gestion des achats,0
-model,"ir.ui.menu,name",menu_purchase_configuration,Purchase Configuration,Configuration des achats,0
-model,"ir.ui.menu,name",menu_purchase_form,Purchases,Achats,0
-model,"ir.ui.menu,name",menu_purchase_form_confirmed,Confirmed Purchases,Achats confirmé,0
-model,"ir.ui.menu,name",menu_purchase_form_draft,Draft Purchases,Achats brouillons,0
-model,"ir.ui.menu,name",menu_purchase_form_new,New Purchase,Nouvel achat,0
-model,"ir.ui.menu,name",menu_purchase_form_quotation,Purchases in Quotation,Devis,0
-model,"ir.ui.menu,name",menu_reporting,Reporting,Rapport,0
-model,"ir.ui.menu,name",menu_supplier,Parties associated to Purchases,Tiers associés à des achats,0
-model,"purchase.configuration,name",0,Purchase Configuration,Configuration des achats,0
-model,"purchase.handle.invoice.exception.ask,name",0,Invoice Exception Ask,Exception de facture - Demande,0
-model,"purchase.handle.shipment.exception.ask,name",0,Shipment Exception Ask,Exception d'expédition - Demande,0
-model,"purchase.line,name",0,Purchase Line,Ligne d'achat,0
-model,"purchase.line-account.invoice.line,name",0,Purchase Line - Invoice Line,Ligne d'achat - Ligne de facture,0
-model,"purchase.line-account.tax,name",0,Purchase Line - Tax,Ligne d'achat - Taxe,0
-model,"purchase.line-ignored-stock.move,name",0,Purchase Line - Ignored Move,Ligne d'achat - Mouvement ignoré,0
-model,"purchase.line-recreated-stock.move,name",0,Purchase Line - Ignored Move,Ligne d'achat - Mouvement ignoré,0
-model,"purchase.product_supplier,name",0,Product Supplier,Produit Fournisseur,0
-model,"purchase.product_supplier.price,name",0,Product Supplier Price,Produit Prix Fournisseur,0
-model,"purchase.purchase,name",0,Purchase,Achat,0
-model,"purchase.purchase-account.invoice,name",0,Purchase - Invoice,Achat - Facture,0
-model,"purchase.purchase-ignored-account.invoice,name",0,Purchase - Ignored Invoice,Achat - Facture ignorée,0
-model,"purchase.purchase-recreated-account.invoice,name",0,Purchase - Recreated Invoice,Achat - Facture recréée,0
-model,"res.group,name",group_purchase,Purchase,Achat,0
-model,"res.group,name",group_purchase_admin,Purchase Administrator,Administrateur des achats,0
-model,"workflow,name",purchase_workflow,Purchase workflow,Workflow d'achat,0
-model,"workflow.activity,name",purchase_activity_cancel,Canceled,Annulé,0
-model,"workflow.activity,name",purchase_activity_confirmed,Confirmed,Confirmé,0
-model,"workflow.activity,name",purchase_activity_done,Done,Fait,0
-model,"workflow.activity,name",purchase_activity_draft,Draft,Brouillon,0
-model,"workflow.activity,name",purchase_activity_invoice_done,Invoice Done,Facture faite,0
-model,"workflow.activity,name",purchase_activity_invoice_method,Invoice Method,Méthode de facturation,0
-model,"workflow.activity,name",purchase_activity_invoice_method_done,Invoice Method Done,Méthode de facturation faite,0
-model,"workflow.activity,name",purchase_activity_invoice_purchase_exception,Invoice Exception,Facture en exception,0
-model,"workflow.activity,name",purchase_activity_invoice_shipment,Invoice Shipment,Facture d'expédition,0
-model,"workflow.activity,name",purchase_activity_invoice_shipment_done,Invoice Shipment Done,Facture expédition faite,0
-model,"workflow.activity,name",purchase_activity_invoice_shipment_exception,Invoice Shipment Exception,Facture expédition en exception,0
-model,"workflow.activity,name",purchase_activity_invoice_shipment_method,Invoice Shipment Method,Méthode facture expédition,0
-model,"workflow.activity,name",purchase_activity_invoice_shipment_method_done,Invoice Shipment Method Done,Méthode facture expédition faite,0
-model,"workflow.activity,name",purchase_activity_quotation,Quotation,Devis,0
-model,"workflow.activity,name",purchase_activity_shipment_exception,Shipment Exception,Expédition en exception,0
-model,"workflow.activity,name",purchase_activity_waiting_invoice_purchase,Waiting Invoice,Facture en attente,0
-model,"workflow.activity,name",purchase_activity_waiting_invoice_shipment,Waiting Invoice Shipment,Facture expédition en attente,0
-model,"workflow.activity,name",purchase_activity_waiting_shipment,Waiting Shipment,Expédition en attente,0
-odt,purchase.purchase,0,Amount,Montant,0
-odt,purchase.purchase,0,Date:,Date:,0
-odt,purchase.purchase,0,Description,Description,0
-odt,purchase.purchase,0,Description:,Description:,0
-odt,purchase.purchase,0,Draft Purchase Order,Commande d'achat,0
-odt,purchase.purchase,0,E-Mail:,E-Mail:,0
-odt,purchase.purchase,0,Phone:,Téléphone,0
-odt,purchase.purchase,0,Purchase Order N°:,Commande d'achat n° :,0
-odt,purchase.purchase,0,Quantity,Quantité,0
-odt,purchase.purchase,0,Request for Quotation N°:,Demande pour le devis n°,0
-odt,purchase.purchase,0,Taxes,Taxes,0
-odt,purchase.purchase,0,Taxes:,Taxes:,0
-odt,purchase.purchase,0,Total (excl. taxes):,Total (htva),0
-odt,purchase.purchase,0,Total:,Total:,0
-odt,purchase.purchase,0,Unit Price,Prix unitaire,0
-odt,purchase.purchase,0,VAT Number:,Numéro TVA:,0
-odt,purchase.purchase,0,VAT:,TVA:,0
-selection,"account.invoice,purchase_exception_state",0,,,0
-selection,"account.invoice,purchase_exception_state",0,Ignored,Ignoré,0
-selection,"account.invoice,purchase_exception_state",0,Recreated,Recréé,0
-selection,"purchase.configuration,purchase_invoice_method",0,Based On Order,À la commande,1
-selection,"purchase.configuration,purchase_invoice_method",0,Based On Shipment,À la livraison,1
-selection,"purchase.configuration,purchase_invoice_method",0,Manual,Manuel,1
-selection,"purchase.line,type",0,Comment,Commentaire,0
-selection,"purchase.line,type",0,Line,Ligne,0
-selection,"purchase.line,type",0,Subtotal,Sous-total,0
-selection,"purchase.line,type",0,Title,Titre,0
-selection,"purchase.purchase,invoice_method",0,Based On Order,À la commande,0
-selection,"purchase.purchase,invoice_method",0,Based On Shipment,À la livraison,0
-selection,"purchase.purchase,invoice_method",0,Manual,Manuel,0
-selection,"purchase.purchase,invoice_state",0,Exception,Exception,0
-selection,"purchase.purchase,invoice_state",0,None,Aucun,0
-selection,"purchase.purchase,invoice_state",0,Paid,Payé,0
-selection,"purchase.purchase,invoice_state",0,Waiting,En attente,0
-selection,"purchase.purchase,shipment_state",0,Exception,Exception,0
-selection,"purchase.purchase,shipment_state",0,None,Aucun,0
-selection,"purchase.purchase,shipment_state",0,Received,Reçu,0
-selection,"purchase.purchase,shipment_state",0,Waiting,En attente,0
-selection,"purchase.purchase,state",0,Canceled,Annulé,0
-selection,"purchase.purchase,state",0,Confirmed,Confirmé,0
-selection,"purchase.purchase,state",0,Done,Fait,0
-selection,"purchase.purchase,state",0,Draft,Brouillon,0
-selection,"purchase.purchase,state",0,Quotation,Devis,0
-selection,"stock.move,purchase_exception_state",0,,,0
-selection,"stock.move,purchase_exception_state",0,Ignored,Ignoré,0
-selection,"stock.move,purchase_exception_state",0,Recreated,Recréé,0
-view,product.product,0,Product Suppliers,Fournisseurs,0
-view,product.product,0,Suppliers,Fournisseurs,0
-view,product.template,0,Product Suppliers,Produit Fournisseur,0
-view,product.template,0,Suppliers,Fournisseurs,0
-view,purchase.configuration,0,Purchase Configuration,Configuration des achats,0
-view,purchase.handle.invoice.exception.ask,0,Choose invoices to recreate,Choisir les factures à recréer,0
-view,purchase.handle.invoice.exception.ask,0,Handle Invoice Exception,Gérer l'exception de facture,0
-view,purchase.handle.shipment.exception.ask,0,Choose moves to recreate,Choisir les mouvements à recréer,0
-view,purchase.handle.shipment.exception.ask,0,Handle shipment Exception,Gérer l'exception d'expédition,0
-view,purchase.handle.shipment.exception.ask,0,Recreated Moves,Mouvements recréés,0
-view,purchase.line,0,General,Général,0
-view,purchase.line,0,Notes,Notes,0
-view,purchase.line,0,Products,Produits,0
-view,purchase.line,0,Purchase Line,Ligne d'achat,0
-view,purchase.line,0,Purchase Lines,Lignes d'achat,0
-view,purchase.product_supplier,0,Product Supplier,Fournisseur du produit,0
-view,purchase.product_supplier,0,Product Suppliers,Fournisseurs du produit,0
-view,purchase.product_supplier.price,0,Product Supplier Price,Prix du fournisseur du produit,0
-view,purchase.product_supplier.price,0,Product Supplier Prices,Prix du fournisseur du produit,0
-view,purchase.purchase,0,Cancel,Annuler,0
-view,purchase.purchase,0,Confirm,Confirmer,0
-view,purchase.purchase,0,Draft,Brouillon,0
-view,purchase.purchase,0,Handle Invoice Exception,Gérer l'exception de facture,0
-view,purchase.purchase,0,Handle Shipment Exception,Gérer l'exception d'expédition,0
-view,purchase.purchase,0,Ignore Invoice Exception,Ignorer l'exception de facturation,0
-view,purchase.purchase,0,Ignore Shipment Exception,Ignorer l'exception d'expédition,0
-view,purchase.purchase,0,Invoices,Factures,0
-view,purchase.purchase,0,Lines,Lignes,0
-view,purchase.purchase,0,Moves,Mouvements,0
-view,purchase.purchase,0,Other Info,Autre informations,0
-view,purchase.purchase,0,Purchase,Achat,0
-view,purchase.purchase,0,Purchases,Achats,0
-view,purchase.purchase,0,Quotation,Devis,0
-view,purchase.purchase,0,Shipments,Expéditions,0
-wizard_button,"purchase.handle.invoice.exception,init,end",0,Cancel,Annuler,0
-wizard_button,"purchase.handle.invoice.exception,init,ok",0,Ok,Ok,0
-wizard_button,"purchase.handle.shipment.exception,init,end",0,Cancel,Annuler,0
-wizard_button,"purchase.handle.shipment.exception,init,ok",0,Ok,Ok,0
diff --git a/locale/bg_BG.po b/locale/bg_BG.po
new file mode 100644
index 0000000..e6a5e57
--- /dev/null
+++ b/locale/bg_BG.po
@@ -0,0 +1,1054 @@
+# 
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "error:account.invoice:0"
+msgid "You can not delete invoices that come from a purchase!"
+msgstr "Не може да изтривате фактури които идват от покупка!"
+
+msgctxt "error:account.invoice:0"
+msgid "You cannot reset to draft an invoice generated by a purchase."
+msgstr "Не може да прехвърляте в проект фактура генерирана при покупка."
+
+msgctxt "error:product.template:0"
+msgid ""
+"Purchase prices are based on the purchase uom, are you sure to change it?"
+msgstr ""
+"Покупните цени се основават мер, ед, на покупката, сигурни ли сте че искате "
+"да я смените?"
+
+msgctxt "error:purchase.line:0"
+msgid "It misses an \"Account Expense\" on product \"%s\"!"
+msgstr "Не е зададена \"Сметка за разходи\" за продукт \"%s\"!"
+
+msgctxt "error:purchase.line:0"
+msgid "It misses an \"account expense\" default property!"
+msgstr "Няма е зададено свойство по подразбиране \"Сметка за разходи\"!"
+
+msgctxt "error:purchase.line:0"
+msgid "The supplier location is required!"
+msgstr "Местонахождението на доставчика е задължително!"
+
+msgctxt "error:purchase.purchase:0"
+msgid "Invoice addresses must be defined for the quotation."
+msgstr "За запитването трябва да бъдат зададени адреси за фактуриране ."
+
+msgctxt "error:purchase.purchase:0"
+msgid "It misses an \"Account Payable\" on the party \"%s\"!"
+msgstr "Липсва \"Разходна сметка\" за партньор \"%s\"!"
+
+msgctxt "error:stock.shipment.in:0"
+msgid "You cannot reset to draft a move generated by a purchase."
+msgstr "Не може да преместите в проект движение създадено от покупка."
+
+msgctxt "field:account.invoice,purchase_exception_state:0"
+msgid "Exception State"
+msgstr "Състояние на грешка"
+
+msgctxt "field:account.invoice,purchases:0"
+msgid "Purchases"
+msgstr "Покупки"
+
+msgctxt "field:account.invoice.line,purchase_lines:0"
+msgid "Purchase Lines"
+msgstr "Редове от покупка"
+
+msgctxt "field:product.template,product_suppliers:0"
+msgid "Suppliers"
+msgstr "Доставчици"
+
+msgctxt "field:product.template,purchasable:0"
+msgid "Purchasable"
+msgstr "Купуваем"
+
+msgctxt "field:product.template,purchase_uom:0"
+msgid "Purchase UOM"
+msgstr "Мер. ед. на покупка"
+
+msgctxt "field:purchase.configuration,purchase_invoice_method:0"
+msgid "Invoice Method"
+msgstr "Начин на фактуриране"
+
+msgctxt "field:purchase.configuration,purchase_sequence:0"
+msgid "Purchase Reference Sequence"
+msgstr "Последователност за отпратка на покупка"
+
+msgctxt "field:purchase.configuration,rec_name:0"
+msgid "Name"
+msgstr "Име"
+
+msgctxt "field:purchase.handle.invoice.exception.ask,domain_invoices:0"
+msgid "Domain Invoices"
+msgstr "Фактури на домейн"
+
+msgctxt "field:purchase.handle.invoice.exception.ask,recreate_invoices:0"
+msgid "Recreate Invoices"
+msgstr "Наново създаване на фактури"
+
+msgctxt "field:purchase.handle.shipment.exception.ask,domain_moves:0"
+msgid "Domain Moves"
+msgstr "Движение на домейн"
+
+msgctxt "field:purchase.handle.shipment.exception.ask,recreate_moves:0"
+msgid "Recreate Moves"
+msgstr "Наново създаване на движения"
+
+msgctxt "field:purchase.line,amount:0"
+msgid "Amount"
+msgstr "Сума"
+
+msgctxt "field:purchase.line,description:0"
+msgid "Description"
+msgstr "Описание"
+
+msgctxt "field:purchase.line,invoice_lines:0"
+msgid "Invoice Lines"
+msgstr "Редове от фактура"
+
+msgctxt "field:purchase.line,move_done:0"
+msgid "Moves Done"
+msgstr "Направени движения"
+
+msgctxt "field:purchase.line,move_exception:0"
+msgid "Moves Exception"
+msgstr "Грешка при движение"
+
+msgctxt "field:purchase.line,moves:0"
+msgid "Moves"
+msgstr "Движения"
+
+msgctxt "field:purchase.line,moves_ignored:0"
+msgid "Ignored Moves"
+msgstr "Игнорирани движения"
+
+msgctxt "field:purchase.line,moves_recreated:0"
+msgid "Recreated Moves"
+msgstr "Наново създаване на движения"
+
+msgctxt "field:purchase.line,note:0"
+msgid "Note"
+msgstr "Бележка"
+
+msgctxt "field:purchase.line,product:0"
+msgid "Product"
+msgstr "Продукт"
+
+msgctxt "field:purchase.line,purchase:0"
+msgid "Purchase"
+msgstr "Покупка"
+
+msgctxt "field:purchase.line,quantity:0"
+msgid "Quantity"
+msgstr "Количество"
+
+msgctxt "field:purchase.line,rec_name:0"
+msgid "Name"
+msgstr "Име"
+
+msgctxt "field:purchase.line,sequence:0"
+msgid "Sequence"
+msgstr "Последователност"
+
+msgctxt "field:purchase.line,taxes:0"
+msgid "Taxes"
+msgstr "Данъци"
+
+msgctxt "field:purchase.line,type:0"
+msgid "Type"
+msgstr "Вид"
+
+msgctxt "field:purchase.line,unit:0"
+msgid "Unit"
+msgstr "Единица"
+
+msgctxt "field:purchase.line,unit_digits:0"
+msgid "Unit Digits"
+msgstr "Десетични единици"
+
+msgctxt "field:purchase.line,unit_price:0"
+msgid "Unit Price"
+msgstr "Единична цена"
+
+msgctxt "field:purchase.line-account.invoice.line,invoice_line:0"
+msgid "Invoice Line"
+msgstr "Ред от фактура"
+
+msgctxt "field:purchase.line-account.invoice.line,purchase_line:0"
+msgid "Purchase Line"
+msgstr "Ред от покупка"
+
+msgctxt "field:purchase.line-account.invoice.line,rec_name:0"
+msgid "Name"
+msgstr "Име"
+
+msgctxt "field:purchase.line-account.tax,line:0"
+msgid "Purchase Line"
+msgstr "Ред от покупка"
+
+msgctxt "field:purchase.line-account.tax,rec_name:0"
+msgid "Name"
+msgstr "Име"
+
+msgctxt "field:purchase.line-account.tax,tax:0"
+msgid "Tax"
+msgstr "Данък"
+
+msgctxt "field:purchase.line-ignored-stock.move,move:0"
+msgid "Move"
+msgstr "Движение"
+
+msgctxt "field:purchase.line-ignored-stock.move,purchase_line:0"
+msgid "Purchase Line"
+msgstr "Ред от покупка"
+
+msgctxt "field:purchase.line-ignored-stock.move,rec_name:0"
+msgid "Name"
+msgstr "Име"
+
+msgctxt "field:purchase.line-recreated-stock.move,move:0"
+msgid "Move"
+msgstr "Движение"
+
+msgctxt "field:purchase.line-recreated-stock.move,purchase_line:0"
+msgid "Purchase Line"
+msgstr "Ред от покупка"
+
+msgctxt "field:purchase.line-recreated-stock.move,rec_name:0"
+msgid "Name"
+msgstr "Име"
+
+msgctxt "field:purchase.product_supplier,code:0"
+msgid "Code"
+msgstr "Код"
+
+msgctxt "field:purchase.product_supplier,company:0"
+msgid "Company"
+msgstr "Фирма"
+
+msgctxt "field:purchase.product_supplier,delivery_time:0"
+msgid "Delivery Time"
+msgstr "Време за доставка"
+
+msgctxt "field:purchase.product_supplier,name:0"
+msgid "Name"
+msgstr "Име"
+
+msgctxt "field:purchase.product_supplier,party:0"
+msgid "Supplier"
+msgstr "Доставчик"
+
+msgctxt "field:purchase.product_supplier,prices:0"
+msgid "Prices"
+msgstr "Цени"
+
+msgctxt "field:purchase.product_supplier,product:0"
+msgid "Product"
+msgstr "Продукт"
+
+msgctxt "field:purchase.product_supplier,rec_name:0"
+msgid "Name"
+msgstr "Име"
+
+msgctxt "field:purchase.product_supplier,sequence:0"
+msgid "Sequence"
+msgstr "Последователност"
+
+msgctxt "field:purchase.product_supplier.price,product_supplier:0"
+msgid "Supplier"
+msgstr "Доставчик"
+
+msgctxt "field:purchase.product_supplier.price,quantity:0"
+msgid "Quantity"
+msgstr "Количество"
+
+msgctxt "field:purchase.product_supplier.price,rec_name:0"
+msgid "Name"
+msgstr "Име"
+
+msgctxt "field:purchase.product_supplier.price,unit_price:0"
+msgid "Unit Price"
+msgstr "Единична цена"
+
+msgctxt "field:purchase.purchase,comment:0"
+msgid "Comment"
+msgstr "Коментар"
+
+msgctxt "field:purchase.purchase,company:0"
+msgid "Company"
+msgstr "Фирма"
+
+msgctxt "field:purchase.purchase,currency:0"
+msgid "Currency"
+msgstr "Валута"
+
+msgctxt "field:purchase.purchase,currency_digits:0"
+msgid "Currency Digits"
+msgstr "Цифри за валута"
+
+msgctxt "field:purchase.purchase,description:0"
+msgid "Description"
+msgstr "Описание"
+
+msgctxt "field:purchase.purchase,invoice_address:0"
+msgid "Invoice Address"
+msgstr "Адрес за фактура"
+
+msgctxt "field:purchase.purchase,invoice_exception:0"
+msgid "Invoices Exception"
+msgstr "Грешка при фактури"
+
+msgctxt "field:purchase.purchase,invoice_method:0"
+msgid "Invoice Method"
+msgstr "Начин на фактуриране"
+
+msgctxt "field:purchase.purchase,invoice_paid:0"
+msgid "Invoices Paid"
+msgstr "Платени фактури"
+
+msgctxt "field:purchase.purchase,invoice_state:0"
+msgid "Invoice State"
+msgstr "Състояние на фактура"
+
+msgctxt "field:purchase.purchase,invoices:0"
+msgid "Invoices"
+msgstr "Фактури"
+
+msgctxt "field:purchase.purchase,invoices_ignored:0"
+msgid "Ignored Invoices"
+msgstr "Игнорирани фактури"
+
+msgctxt "field:purchase.purchase,invoices_recreated:0"
+msgid "Recreated Invoices"
+msgstr "Наново създадени на фактури"
+
+msgctxt "field:purchase.purchase,lines:0"
+msgid "Lines"
+msgstr "Редове"
+
+msgctxt "field:purchase.purchase,moves:0"
+msgid "Moves"
+msgstr "Движения"
+
+msgctxt "field:purchase.purchase,party:0"
+msgid "Party"
+msgstr "Партньор"
+
+msgctxt "field:purchase.purchase,party_lang:0"
+msgid "Party Language"
+msgstr "Език на партньор"
+
+msgctxt "field:purchase.purchase,payment_term:0"
+msgid "Payment Term"
+msgstr "Условие за плащане"
+
+msgctxt "field:purchase.purchase,purchase_date:0"
+msgid "Purchase Date"
+msgstr "Дата на покупка"
+
+msgctxt "field:purchase.purchase,rec_name:0"
+msgid "Name"
+msgstr "Име"
+
+msgctxt "field:purchase.purchase,reference:0"
+msgid "Reference"
+msgstr "Отпратка"
+
+msgctxt "field:purchase.purchase,shipment_done:0"
+msgid "Shipment Done"
+msgstr "Направена пратка"
+
+msgctxt "field:purchase.purchase,shipment_exception:0"
+msgid "Shipments Exception"
+msgstr "Грешка при пратка"
+
+msgctxt "field:purchase.purchase,shipment_state:0"
+msgid "Shipment State"
+msgstr "Състояние на пратка"
+
+msgctxt "field:purchase.purchase,shipments:0"
+msgid "Shipments"
+msgstr "Изпращания"
+
+msgctxt "field:purchase.purchase,state:0"
+msgid "State"
+msgstr "Състояние"
+
+msgctxt "field:purchase.purchase,supplier_reference:0"
+msgid "Supplier Reference"
+msgstr "Отпратка към доставчик"
+
+msgctxt "field:purchase.purchase,tax_amount:0"
+msgid "Tax"
+msgstr "Данък"
+
+msgctxt "field:purchase.purchase,total_amount:0"
+msgid "Total"
+msgstr "Общо"
+
+msgctxt "field:purchase.purchase,untaxed_amount:0"
+msgid "Untaxed"
+msgstr "Необложен с данък"
+
+msgctxt "field:purchase.purchase,warehouse:0"
+msgid "Warehouse"
+msgstr "Склад"
+
+msgctxt "field:purchase.purchase-account.invoice,invoice:0"
+msgid "Invoice"
+msgstr "Фактура"
+
+msgctxt "field:purchase.purchase-account.invoice,purchase:0"
+msgid "Purchase"
+msgstr "Покупка"
+
+msgctxt "field:purchase.purchase-account.invoice,rec_name:0"
+msgid "Name"
+msgstr "Име"
+
+msgctxt "field:purchase.purchase-ignored-account.invoice,invoice:0"
+msgid "Invoice"
+msgstr "Фактура"
+
+msgctxt "field:purchase.purchase-ignored-account.invoice,purchase:0"
+msgid "Purchase"
+msgstr "Покупка"
+
+msgctxt "field:purchase.purchase-ignored-account.invoice,rec_name:0"
+msgid "Name"
+msgstr "Име"
+
+msgctxt "field:purchase.purchase-recreated-account.invoice,invoice:0"
+msgid "Invoice"
+msgstr "Фактура"
+
+msgctxt "field:purchase.purchase-recreated-account.invoice,purchase:0"
+msgid "Purchase"
+msgstr "Покупка"
+
+msgctxt "field:purchase.purchase-recreated-account.invoice,rec_name:0"
+msgid "Name"
+msgstr "Име"
+
+msgctxt "field:stock.move,purchase:0"
+msgid "Purchase"
+msgstr "Покупка"
+
+msgctxt "field:stock.move,purchase_currency:0"
+msgid "Purchase Currency"
+msgstr "Валута на покупка"
+
+msgctxt "field:stock.move,purchase_exception_state:0"
+msgid "Exception State"
+msgstr "Състояние на грешка"
+
+msgctxt "field:stock.move,purchase_line:0"
+msgid "Purchase Line"
+msgstr "Ред от покупка"
+
+msgctxt "field:stock.move,purchase_quantity:0"
+msgid "Purchase Quantity"
+msgstr "Количество на покупка"
+
+msgctxt "field:stock.move,purchase_unit:0"
+msgid "Purchase Unit"
+msgstr "Единица на покупка"
+
+msgctxt "field:stock.move,purchase_unit_digits:0"
+msgid "Purchase Unit Digits"
+msgstr "Десетични единици на покупка"
+
+msgctxt "field:stock.move,purchase_unit_price:0"
+msgid "Purchase Unit Price"
+msgstr "Единична цена при покупка"
+
+msgctxt "field:stock.move,purchase_visible:0"
+msgid "Purchase Visible"
+msgstr "Покупката е видима"
+
+msgctxt "field:stock.move,supplier:0"
+msgid "Supplier"
+msgstr "Доставчик"
+
+msgctxt "help:purchase.handle.invoice.exception.ask,recreate_invoices:0"
+msgid ""
+"The selected invoices will be recreated. The other ones will be ignored."
+msgstr ""
+"Избраните фактури ще бъдат наново създадени. Останалите ще бъдат игнорирани."
+
+msgctxt "help:purchase.handle.shipment.exception.ask,recreate_moves:0"
+msgid "The selected moves will be recreated. The other ones will be ignored."
+msgstr ""
+"Избраните движение ще бъдат наново създадени, Останалите ще бъдат "
+"игнорирани."
+
+msgctxt "help:purchase.product_supplier,delivery_time:0"
+msgid "In number of days"
+msgstr "В брой дни"
+
+msgctxt "help:purchase.product_supplier.price,quantity:0"
+msgid "Minimal quantity"
+msgstr "Минимално количество"
+
+msgctxt "model:ir.action,name:act_invoice_form"
+msgid "Invoices"
+msgstr "Фактури"
+
+msgctxt "model:ir.action,name:act_open_supplier"
+msgid "Parties associated to Purchases"
+msgstr "Партньори свързани с покупки"
+
+msgctxt "model:ir.action,name:act_purchase_configuration_form"
+msgid "Purchase Configuration"
+msgstr "Конфигуриране на покупка"
+
+msgctxt "model:ir.action,name:act_purchase_form"
+msgid "Purchases"
+msgstr "Покупки"
+
+msgctxt "model:ir.action,name:act_purchase_form2"
+msgid "Purchases"
+msgstr "Покупки"
+
+msgctxt "model:ir.action,name:act_purchase_form_confirmed"
+msgid "Confirmed Purchases"
+msgstr "Потвърдена покупка"
+
+msgctxt "model:ir.action,name:act_purchase_form_draft"
+msgid "Draft Purchases"
+msgstr "Проект на покупки"
+
+msgctxt "model:ir.action,name:act_purchase_form_quotation"
+msgid "Purchases in Quotation"
+msgstr "Покупки в запитване"
+
+msgctxt "model:ir.action,name:act_shipment_form"
+msgid "Shipments"
+msgstr "Изпращания"
+
+msgctxt "model:ir.action,name:report_purchase"
+msgid "Purchase"
+msgstr "Покупка"
+
+msgctxt "model:ir.action,name:wizard_invoice_handle_exception"
+msgid "Handle Invoice Exception"
+msgstr "Обработка на грешка към фактура"
+
+msgctxt "model:ir.action,name:wizard_shipment_handle_exception"
+msgid "Handle Shipment Exception"
+msgstr "Обработка на грешка при изпращане"
+
+msgctxt "model:ir.sequence,name:sequence_purchase"
+msgid "Purchase"
+msgstr "Покупка"
+
+msgctxt "model:ir.sequence.type,name:sequence_type_purchase"
+msgid "Purchase"
+msgstr "Покупка"
+
+msgctxt "model:ir.ui.menu,name:menu_configuration"
+msgid "Configuration"
+msgstr "Конфигурация"
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_purchase"
+msgid "Purchase"
+msgstr "Управление на покупки"
+
+msgctxt "model:ir.ui.menu,name:menu_purchase_configuration"
+msgid "Purchase Configuration"
+msgstr "Конфигуриране на покупка"
+
+msgctxt "model:ir.ui.menu,name:menu_purchase_form"
+msgid "Purchases"
+msgstr "Покупки"
+
+msgctxt "model:ir.ui.menu,name:menu_purchase_form_confirmed"
+msgid "Confirmed Purchases"
+msgstr "Потвърдена покупка"
+
+msgctxt "model:ir.ui.menu,name:menu_purchase_form_draft"
+msgid "Draft Purchases"
+msgstr "Проект на покупки"
+
+msgctxt "model:ir.ui.menu,name:menu_purchase_form_quotation"
+msgid "Purchases in Quotation"
+msgstr "Покупки в запитване"
+
+msgctxt "model:ir.ui.menu,name:menu_reporting"
+msgid "Reporting"
+msgstr "Справки"
+
+msgctxt "model:ir.ui.menu,name:menu_supplier"
+msgid "Parties associated to Purchases"
+msgstr "Партньори свързани с покупки"
+
+msgctxt "model:purchase.configuration,name:0"
+msgid "Purchase Configuration"
+msgstr "Конфигуриране на покупка"
+
+msgctxt "model:purchase.handle.invoice.exception.ask,name:0"
+msgid "Invoice Exception Ask"
+msgstr "Запитване за грешка в фактура"
+
+msgctxt "model:purchase.handle.shipment.exception.ask,name:0"
+msgid "Shipment Exception Ask"
+msgstr "Запитване за грешка при пратка"
+
+msgctxt "model:purchase.line,name:0"
+msgid "Purchase Line"
+msgstr "Ред от покупка"
+
+msgctxt "model:purchase.line-account.invoice.line,name:0"
+msgid "Purchase Line - Invoice Line"
+msgstr "Ред от покупка - Ред от фактура"
+
+msgctxt "model:purchase.line-account.tax,name:0"
+msgid "Purchase Line - Tax"
+msgstr "Ред от покупка - Данък"
+
+msgctxt "model:purchase.line-ignored-stock.move,name:0"
+msgid "Purchase Line - Ignored Move"
+msgstr "Ред от покупка - Игнорирано движение"
+
+msgctxt "model:purchase.line-recreated-stock.move,name:0"
+msgid "Purchase Line - Ignored Move"
+msgstr "Ред от покупка - Игнорирано движение"
+
+msgctxt "model:purchase.product_supplier,name:0"
+msgid "Product Supplier"
+msgstr "Доставчик на продукт"
+
+msgctxt "model:purchase.product_supplier.price,name:0"
+msgid "Product Supplier Price"
+msgstr "Цена на доставчик на продукт"
+
+msgctxt "model:purchase.purchase,name:0"
+msgid "Purchase"
+msgstr "Покупка"
+
+msgctxt "model:purchase.purchase-account.invoice,name:0"
+msgid "Purchase - Invoice"
+msgstr "Покупка - Фактура"
+
+msgctxt "model:purchase.purchase-ignored-account.invoice,name:0"
+msgid "Purchase - Ignored Invoice"
+msgstr "Покупка - Игнорирана фактура"
+
+msgctxt "model:purchase.purchase-recreated-account.invoice,name:0"
+msgid "Purchase - Recreated Invoice"
+msgstr "Покупка - Наново създаване на фактури"
+
+msgctxt "model:res.group,name:group_purchase"
+msgid "Purchase"
+msgstr "Покупка"
+
+msgctxt "model:res.group,name:group_purchase_admin"
+msgid "Purchase Administrator"
+msgstr "Отгоровник за покупки"
+
+msgctxt "model:workflow,name:purchase_workflow"
+msgid "Purchase workflow"
+msgstr "Работен процес на покупка"
+
+msgctxt "model:workflow.activity,name:purchase_activity_cancel"
+msgid "Canceled"
+msgstr "Отказан"
+
+msgctxt "model:workflow.activity,name:purchase_activity_confirmed"
+msgid "Confirmed"
+msgstr "Потвърден"
+
+msgctxt "model:workflow.activity,name:purchase_activity_done"
+msgid "Done"
+msgstr "Приключен"
+
+msgctxt "model:workflow.activity,name:purchase_activity_draft"
+msgid "Draft"
+msgstr "Проект"
+
+msgctxt "model:workflow.activity,name:purchase_activity_invoice_done"
+msgid "Invoice Done"
+msgstr "Направени фактури"
+
+msgctxt "model:workflow.activity,name:purchase_activity_invoice_method"
+msgid "Invoice Method"
+msgstr "Начин на фактуриране"
+
+msgctxt "model:workflow.activity,name:purchase_activity_invoice_method_done"
+msgid "Invoice Method Done"
+msgstr "Направен начин на фактуриране"
+
+msgctxt ""
+"model:workflow.activity,name:purchase_activity_invoice_purchase_exception"
+msgid "Invoice Exception"
+msgstr "Грешка при фактура"
+
+msgctxt "model:workflow.activity,name:purchase_activity_invoice_shipment"
+msgid "Invoice Shipment"
+msgstr "Фактуриране на пратка"
+
+msgctxt "model:workflow.activity,name:purchase_activity_invoice_shipment_done"
+msgid "Invoice Shipment Done"
+msgstr "Направено фактуриране на пратка"
+
+msgctxt ""
+"model:workflow.activity,name:purchase_activity_invoice_shipment_exception"
+msgid "Invoice Shipment Exception"
+msgstr "Грешка при фактуриране на пратка"
+
+msgctxt ""
+"model:workflow.activity,name:purchase_activity_invoice_shipment_method"
+msgid "Invoice Shipment Method"
+msgstr "Начин на фактуриране на изпращане"
+
+msgctxt ""
+"model:workflow.activity,name:purchase_activity_invoice_shipment_method_done"
+msgid "Invoice Shipment Method Done"
+msgstr "Направено фактуриране на начина на изпращане"
+
+msgctxt "model:workflow.activity,name:purchase_activity_quotation"
+msgid "Quotation"
+msgstr "Запитване"
+
+msgctxt "model:workflow.activity,name:purchase_activity_shipment_exception"
+msgid "Shipment Exception"
+msgstr "Грешка при пратка"
+
+msgctxt ""
+"model:workflow.activity,name:purchase_activity_waiting_invoice_purchase"
+msgid "Waiting Invoice"
+msgstr "Очакващи фактура"
+
+msgctxt ""
+"model:workflow.activity,name:purchase_activity_waiting_invoice_shipment"
+msgid "Waiting Invoice Shipment"
+msgstr "Изчакващи фактури за пратки"
+
+msgctxt "model:workflow.activity,name:purchase_activity_waiting_shipment"
+msgid "Waiting Shipment"
+msgstr "Очаква изпращане"
+
+msgctxt "odt:purchase.purchase:0"
+msgid "Amount"
+msgstr "Сума"
+
+msgctxt "odt:purchase.purchase:0"
+msgid "Date:"
+msgstr "Дата:"
+
+msgctxt "odt:purchase.purchase:0"
+msgid "Description"
+msgstr "Описание"
+
+msgctxt "odt:purchase.purchase:0"
+msgid "Description:"
+msgstr "Описание:"
+
+msgctxt "odt:purchase.purchase:0"
+msgid "Draft Purchase Order"
+msgstr "Проект на поръчка за покупка"
+
+msgctxt "odt:purchase.purchase:0"
+msgid "E-Mail:"
+msgstr "E-Mail:"
+
+msgctxt "odt:purchase.purchase:0"
+msgid "Phone:"
+msgstr "Телефон:"
+
+msgctxt "odt:purchase.purchase:0"
+msgid "Purchase Order N°:"
+msgstr "Поръчка за покупка N°:"
+
+msgctxt "odt:purchase.purchase:0"
+msgid "Quantity"
+msgstr "Количество"
+
+msgctxt "odt:purchase.purchase:0"
+msgid "Request for Quotation N°:"
+msgstr "Заявки за запитване N°:"
+
+msgctxt "odt:purchase.purchase:0"
+msgid "Taxes"
+msgstr "Данъци"
+
+msgctxt "odt:purchase.purchase:0"
+msgid "Taxes:"
+msgstr "Данъци:"
+
+msgctxt "odt:purchase.purchase:0"
+msgid "Total (excl. taxes):"
+msgstr "Общо (без данъци):"
+
+msgctxt "odt:purchase.purchase:0"
+msgid "Total:"
+msgstr "Общо:"
+
+msgctxt "odt:purchase.purchase:0"
+msgid "Unit Price"
+msgstr "Единична цена"
+
+msgctxt "odt:purchase.purchase:0"
+msgid "VAT Number:"
+msgstr ""
+
+msgctxt "odt:purchase.purchase:0"
+msgid "VAT:"
+msgstr "ДДС:"
+
+msgctxt "selection:account.invoice,purchase_exception_state:0"
+msgid ""
+msgstr ""
+
+msgctxt "selection:account.invoice,purchase_exception_state:0"
+msgid "Ignored"
+msgstr "Игнорирано"
+
+msgctxt "selection:account.invoice,purchase_exception_state:0"
+msgid "Recreated"
+msgstr "Създаден наново"
+
+msgctxt "selection:purchase.configuration,purchase_invoice_method:0"
+msgid "Based On Order"
+msgstr "Въз основа на поръчка"
+
+msgctxt "selection:purchase.configuration,purchase_invoice_method:0"
+msgid "Based On Shipment"
+msgstr "Въз основа на изпращане"
+
+msgctxt "selection:purchase.configuration,purchase_invoice_method:0"
+msgid "Manual"
+msgstr "Ръчно"
+
+msgctxt "selection:purchase.line,type:0"
+msgid "Comment"
+msgstr "Коментар"
+
+msgctxt "selection:purchase.line,type:0"
+msgid "Line"
+msgstr "Ред"
+
+msgctxt "selection:purchase.line,type:0"
+msgid "Subtotal"
+msgstr "Междинна сума"
+
+msgctxt "selection:purchase.line,type:0"
+msgid "Title"
+msgstr "Заглавие"
+
+msgctxt "selection:purchase.purchase,invoice_method:0"
+msgid "Based On Order"
+msgstr "Въз основа на поръчка"
+
+msgctxt "selection:purchase.purchase,invoice_method:0"
+msgid "Based On Shipment"
+msgstr "Въз основа на изпращане"
+
+msgctxt "selection:purchase.purchase,invoice_method:0"
+msgid "Manual"
+msgstr "Ръчно"
+
+msgctxt "selection:purchase.purchase,invoice_state:0"
+msgid "Exception"
+msgstr "Грешка"
+
+msgctxt "selection:purchase.purchase,invoice_state:0"
+msgid "None"
+msgstr "Няма"
+
+msgctxt "selection:purchase.purchase,invoice_state:0"
+msgid "Paid"
+msgstr "Платен"
+
+msgctxt "selection:purchase.purchase,invoice_state:0"
+msgid "Waiting"
+msgstr "Изчакващ"
+
+msgctxt "selection:purchase.purchase,shipment_state:0"
+msgid "Exception"
+msgstr "Грешка"
+
+msgctxt "selection:purchase.purchase,shipment_state:0"
+msgid "None"
+msgstr "Няма"
+
+msgctxt "selection:purchase.purchase,shipment_state:0"
+msgid "Received"
+msgstr "Получен"
+
+msgctxt "selection:purchase.purchase,shipment_state:0"
+msgid "Waiting"
+msgstr "Изчакващ"
+
+msgctxt "selection:purchase.purchase,state:0"
+msgid "Canceled"
+msgstr "Отказан"
+
+msgctxt "selection:purchase.purchase,state:0"
+msgid "Confirmed"
+msgstr "Потвърден"
+
+msgctxt "selection:purchase.purchase,state:0"
+msgid "Done"
+msgstr "Приключен"
+
+msgctxt "selection:purchase.purchase,state:0"
+msgid "Draft"
+msgstr "Проект"
+
+msgctxt "selection:purchase.purchase,state:0"
+msgid "Quotation"
+msgstr "Запитване"
+
+msgctxt "selection:stock.move,purchase_exception_state:0"
+msgid ""
+msgstr ""
+
+msgctxt "selection:stock.move,purchase_exception_state:0"
+msgid "Ignored"
+msgstr "Игнорирано"
+
+msgctxt "selection:stock.move,purchase_exception_state:0"
+msgid "Recreated"
+msgstr "Създаден наново"
+
+msgctxt "view:product.template:0"
+msgid "Product Suppliers"
+msgstr "Доставчици на продукт"
+
+msgctxt "view:product.template:0"
+msgid "Suppliers"
+msgstr "Доставчици"
+
+msgctxt "view:purchase.configuration:0"
+msgid "Purchase Configuration"
+msgstr "Конфигуриране на покупка"
+
+msgctxt "view:purchase.handle.invoice.exception.ask:0"
+msgid "Choose invoices to recreate"
+msgstr "Избор на фактури за ново създаване"
+
+msgctxt "view:purchase.handle.invoice.exception.ask:0"
+msgid "Handle Invoice Exception"
+msgstr "Обработка на грешка към фактура"
+
+#, fuzzy
+msgctxt "view:purchase.handle.shipment.exception.ask:0"
+msgid "Choose move to recreate"
+msgstr "Избор на движение за ново създаване"
+
+msgctxt "view:purchase.handle.shipment.exception.ask:0"
+msgid "Choose moves to recreate"
+msgstr "Избор на движения за ново създаване"
+
+msgctxt "view:purchase.handle.shipment.exception.ask:0"
+msgid "Handle shipment Exception"
+msgstr "Обработване на грешка при изпращане"
+
+msgctxt "view:purchase.handle.shipment.exception.ask:0"
+msgid "Recreated Moves"
+msgstr "Наново създаване на движения"
+
+msgctxt "view:purchase.line:0"
+msgid "General"
+msgstr "Основен"
+
+msgctxt "view:purchase.line:0"
+msgid "Notes"
+msgstr "Бележки"
+
+msgctxt "view:purchase.line:0"
+msgid "Products"
+msgstr "Продукти"
+
+msgctxt "view:purchase.line:0"
+msgid "Purchase Line"
+msgstr "Ред от покупка"
+
+msgctxt "view:purchase.line:0"
+msgid "Purchase Lines"
+msgstr "Редове от покупка"
+
+msgctxt "view:purchase.product_supplier.price:0"
+msgid "Product Supplier Price"
+msgstr "Цена на доставчик на продукт"
+
+msgctxt "view:purchase.product_supplier.price:0"
+msgid "Product Supplier Prices"
+msgstr "Цена на доставчик на продукт"
+
+msgctxt "view:purchase.product_supplier:0"
+msgid "Product Supplier"
+msgstr "Доставчик на продукт"
+
+msgctxt "view:purchase.product_supplier:0"
+msgid "Product Suppliers"
+msgstr "Доставчици на продукт"
+
+msgctxt "view:purchase.purchase:0"
+msgid "Cancel"
+msgstr "Отказ"
+
+msgctxt "view:purchase.purchase:0"
+msgid "Confirm"
+msgstr "Потвърждаване"
+
+msgctxt "view:purchase.purchase:0"
+msgid "Draft"
+msgstr "Проект"
+
+msgctxt "view:purchase.purchase:0"
+msgid "Handle Invoice Exception"
+msgstr "Обработка на грешка към фактура"
+
+msgctxt "view:purchase.purchase:0"
+msgid "Handle Shipment Exception"
+msgstr "Обработване на грешка при изпращане"
+
+msgctxt "view:purchase.purchase:0"
+msgid "Invoices"
+msgstr "Фактури"
+
+msgctxt "view:purchase.purchase:0"
+msgid "Lines"
+msgstr "Редове"
+
+msgctxt "view:purchase.purchase:0"
+msgid "Moves"
+msgstr "Движения"
+
+msgctxt "view:purchase.purchase:0"
+msgid "Other Info"
+msgstr "Друга информация"
+
+msgctxt "view:purchase.purchase:0"
+msgid "Purchase"
+msgstr "Покупка"
+
+msgctxt "view:purchase.purchase:0"
+msgid "Purchases"
+msgstr "Покупки"
+
+msgctxt "view:purchase.purchase:0"
+msgid "Quotation"
+msgstr "Запитване"
+
+msgctxt "view:purchase.purchase:0"
+msgid "Shipments"
+msgstr "Изпращане"
+
+msgctxt "wizard_button:purchase.handle.invoice.exception,init,end:0"
+msgid "Cancel"
+msgstr "Отказ"
+
+msgctxt "wizard_button:purchase.handle.invoice.exception,init,ok:0"
+msgid "Ok"
+msgstr "Добре"
+
+msgctxt "wizard_button:purchase.handle.shipment.exception,init,end:0"
+msgid "Cancel"
+msgstr "Отказ"
+
+msgctxt "wizard_button:purchase.handle.shipment.exception,init,ok:0"
+msgid "Ok"
+msgstr "Добре"
diff --git a/locale/cs_CZ.po b/locale/cs_CZ.po
new file mode 100644
index 0000000..ad6d700
--- /dev/null
+++ b/locale/cs_CZ.po
@@ -0,0 +1,1043 @@
+# 
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "error:account.invoice:0"
+msgid "You can not delete invoices that come from a purchase!"
+msgstr ""
+
+msgctxt "error:account.invoice:0"
+msgid "You cannot reset to draft an invoice generated by a purchase."
+msgstr ""
+
+msgctxt "error:product.template:0"
+msgid ""
+"Purchase prices are based on the purchase uom, are you sure to change it?"
+msgstr ""
+
+msgctxt "error:purchase.line:0"
+msgid "It misses an \"Account Expense\" on product \"%s\"!"
+msgstr ""
+
+msgctxt "error:purchase.line:0"
+msgid "It misses an \"account expense\" default property!"
+msgstr ""
+
+msgctxt "error:purchase.line:0"
+msgid "The supplier location is required!"
+msgstr ""
+
+msgctxt "error:purchase.purchase:0"
+msgid "Invoice addresses must be defined for the quotation."
+msgstr ""
+
+msgctxt "error:purchase.purchase:0"
+msgid "It misses an \"Account Payable\" on the party \"%s\"!"
+msgstr ""
+
+msgctxt "error:stock.shipment.in:0"
+msgid "You cannot reset to draft a move generated by a purchase."
+msgstr ""
+
+msgctxt "field:account.invoice,purchase_exception_state:0"
+msgid "Exception State"
+msgstr ""
+
+msgctxt "field:account.invoice,purchases:0"
+msgid "Purchases"
+msgstr ""
+
+msgctxt "field:account.invoice.line,purchase_lines:0"
+msgid "Purchase Lines"
+msgstr ""
+
+msgctxt "field:product.template,product_suppliers:0"
+msgid "Suppliers"
+msgstr ""
+
+msgctxt "field:product.template,purchasable:0"
+msgid "Purchasable"
+msgstr ""
+
+msgctxt "field:product.template,purchase_uom:0"
+msgid "Purchase UOM"
+msgstr ""
+
+msgctxt "field:purchase.configuration,purchase_invoice_method:0"
+msgid "Invoice Method"
+msgstr ""
+
+msgctxt "field:purchase.configuration,purchase_sequence:0"
+msgid "Purchase Reference Sequence"
+msgstr ""
+
+msgctxt "field:purchase.configuration,rec_name:0"
+msgid "Name"
+msgstr ""
+
+msgctxt "field:purchase.handle.invoice.exception.ask,domain_invoices:0"
+msgid "Domain Invoices"
+msgstr ""
+
+msgctxt "field:purchase.handle.invoice.exception.ask,recreate_invoices:0"
+msgid "Recreate Invoices"
+msgstr ""
+
+msgctxt "field:purchase.handle.shipment.exception.ask,domain_moves:0"
+msgid "Domain Moves"
+msgstr ""
+
+msgctxt "field:purchase.handle.shipment.exception.ask,recreate_moves:0"
+msgid "Recreate Moves"
+msgstr ""
+
+msgctxt "field:purchase.line,amount:0"
+msgid "Amount"
+msgstr ""
+
+msgctxt "field:purchase.line,description:0"
+msgid "Description"
+msgstr ""
+
+msgctxt "field:purchase.line,invoice_lines:0"
+msgid "Invoice Lines"
+msgstr ""
+
+msgctxt "field:purchase.line,move_done:0"
+msgid "Moves Done"
+msgstr ""
+
+msgctxt "field:purchase.line,move_exception:0"
+msgid "Moves Exception"
+msgstr ""
+
+msgctxt "field:purchase.line,moves:0"
+msgid "Moves"
+msgstr ""
+
+msgctxt "field:purchase.line,moves_ignored:0"
+msgid "Ignored Moves"
+msgstr ""
+
+msgctxt "field:purchase.line,moves_recreated:0"
+msgid "Recreated Moves"
+msgstr ""
+
+msgctxt "field:purchase.line,note:0"
+msgid "Note"
+msgstr ""
+
+msgctxt "field:purchase.line,product:0"
+msgid "Product"
+msgstr ""
+
+msgctxt "field:purchase.line,purchase:0"
+msgid "Purchase"
+msgstr ""
+
+msgctxt "field:purchase.line,quantity:0"
+msgid "Quantity"
+msgstr ""
+
+msgctxt "field:purchase.line,rec_name:0"
+msgid "Name"
+msgstr ""
+
+msgctxt "field:purchase.line,sequence:0"
+msgid "Sequence"
+msgstr ""
+
+msgctxt "field:purchase.line,taxes:0"
+msgid "Taxes"
+msgstr ""
+
+msgctxt "field:purchase.line,type:0"
+msgid "Type"
+msgstr ""
+
+msgctxt "field:purchase.line,unit:0"
+msgid "Unit"
+msgstr ""
+
+msgctxt "field:purchase.line,unit_digits:0"
+msgid "Unit Digits"
+msgstr ""
+
+msgctxt "field:purchase.line,unit_price:0"
+msgid "Unit Price"
+msgstr ""
+
+msgctxt "field:purchase.line-account.invoice.line,invoice_line:0"
+msgid "Invoice Line"
+msgstr ""
+
+msgctxt "field:purchase.line-account.invoice.line,purchase_line:0"
+msgid "Purchase Line"
+msgstr ""
+
+msgctxt "field:purchase.line-account.invoice.line,rec_name:0"
+msgid "Name"
+msgstr ""
+
+msgctxt "field:purchase.line-account.tax,line:0"
+msgid "Purchase Line"
+msgstr ""
+
+msgctxt "field:purchase.line-account.tax,rec_name:0"
+msgid "Name"
+msgstr ""
+
+msgctxt "field:purchase.line-account.tax,tax:0"
+msgid "Tax"
+msgstr ""
+
+msgctxt "field:purchase.line-ignored-stock.move,move:0"
+msgid "Move"
+msgstr ""
+
+msgctxt "field:purchase.line-ignored-stock.move,purchase_line:0"
+msgid "Purchase Line"
+msgstr ""
+
+msgctxt "field:purchase.line-ignored-stock.move,rec_name:0"
+msgid "Name"
+msgstr ""
+
+msgctxt "field:purchase.line-recreated-stock.move,move:0"
+msgid "Move"
+msgstr ""
+
+msgctxt "field:purchase.line-recreated-stock.move,purchase_line:0"
+msgid "Purchase Line"
+msgstr ""
+
+msgctxt "field:purchase.line-recreated-stock.move,rec_name:0"
+msgid "Name"
+msgstr ""
+
+msgctxt "field:purchase.product_supplier,code:0"
+msgid "Code"
+msgstr ""
+
+msgctxt "field:purchase.product_supplier,company:0"
+msgid "Company"
+msgstr ""
+
+msgctxt "field:purchase.product_supplier,delivery_time:0"
+msgid "Delivery Time"
+msgstr ""
+
+msgctxt "field:purchase.product_supplier,name:0"
+msgid "Name"
+msgstr ""
+
+msgctxt "field:purchase.product_supplier,party:0"
+msgid "Supplier"
+msgstr ""
+
+msgctxt "field:purchase.product_supplier,prices:0"
+msgid "Prices"
+msgstr ""
+
+msgctxt "field:purchase.product_supplier,product:0"
+msgid "Product"
+msgstr ""
+
+msgctxt "field:purchase.product_supplier,rec_name:0"
+msgid "Name"
+msgstr ""
+
+msgctxt "field:purchase.product_supplier,sequence:0"
+msgid "Sequence"
+msgstr ""
+
+msgctxt "field:purchase.product_supplier.price,product_supplier:0"
+msgid "Supplier"
+msgstr ""
+
+msgctxt "field:purchase.product_supplier.price,quantity:0"
+msgid "Quantity"
+msgstr ""
+
+msgctxt "field:purchase.product_supplier.price,rec_name:0"
+msgid "Name"
+msgstr ""
+
+msgctxt "field:purchase.product_supplier.price,unit_price:0"
+msgid "Unit Price"
+msgstr ""
+
+msgctxt "field:purchase.purchase,comment:0"
+msgid "Comment"
+msgstr ""
+
+msgctxt "field:purchase.purchase,company:0"
+msgid "Company"
+msgstr ""
+
+msgctxt "field:purchase.purchase,currency:0"
+msgid "Currency"
+msgstr ""
+
+msgctxt "field:purchase.purchase,currency_digits:0"
+msgid "Currency Digits"
+msgstr ""
+
+msgctxt "field:purchase.purchase,description:0"
+msgid "Description"
+msgstr ""
+
+msgctxt "field:purchase.purchase,invoice_address:0"
+msgid "Invoice Address"
+msgstr ""
+
+msgctxt "field:purchase.purchase,invoice_exception:0"
+msgid "Invoices Exception"
+msgstr ""
+
+msgctxt "field:purchase.purchase,invoice_method:0"
+msgid "Invoice Method"
+msgstr ""
+
+msgctxt "field:purchase.purchase,invoice_paid:0"
+msgid "Invoices Paid"
+msgstr ""
+
+msgctxt "field:purchase.purchase,invoice_state:0"
+msgid "Invoice State"
+msgstr ""
+
+msgctxt "field:purchase.purchase,invoices:0"
+msgid "Invoices"
+msgstr ""
+
+msgctxt "field:purchase.purchase,invoices_ignored:0"
+msgid "Ignored Invoices"
+msgstr ""
+
+msgctxt "field:purchase.purchase,invoices_recreated:0"
+msgid "Recreated Invoices"
+msgstr ""
+
+msgctxt "field:purchase.purchase,lines:0"
+msgid "Lines"
+msgstr ""
+
+msgctxt "field:purchase.purchase,moves:0"
+msgid "Moves"
+msgstr ""
+
+msgctxt "field:purchase.purchase,party:0"
+msgid "Party"
+msgstr ""
+
+msgctxt "field:purchase.purchase,party_lang:0"
+msgid "Party Language"
+msgstr ""
+
+msgctxt "field:purchase.purchase,payment_term:0"
+msgid "Payment Term"
+msgstr ""
+
+msgctxt "field:purchase.purchase,purchase_date:0"
+msgid "Purchase Date"
+msgstr ""
+
+msgctxt "field:purchase.purchase,rec_name:0"
+msgid "Name"
+msgstr ""
+
+msgctxt "field:purchase.purchase,reference:0"
+msgid "Reference"
+msgstr ""
+
+msgctxt "field:purchase.purchase,shipment_done:0"
+msgid "Shipment Done"
+msgstr ""
+
+msgctxt "field:purchase.purchase,shipment_exception:0"
+msgid "Shipments Exception"
+msgstr ""
+
+msgctxt "field:purchase.purchase,shipment_state:0"
+msgid "Shipment State"
+msgstr ""
+
+msgctxt "field:purchase.purchase,shipments:0"
+msgid "Shipments"
+msgstr ""
+
+msgctxt "field:purchase.purchase,state:0"
+msgid "State"
+msgstr ""
+
+msgctxt "field:purchase.purchase,supplier_reference:0"
+msgid "Supplier Reference"
+msgstr ""
+
+msgctxt "field:purchase.purchase,tax_amount:0"
+msgid "Tax"
+msgstr ""
+
+msgctxt "field:purchase.purchase,total_amount:0"
+msgid "Total"
+msgstr ""
+
+msgctxt "field:purchase.purchase,untaxed_amount:0"
+msgid "Untaxed"
+msgstr ""
+
+msgctxt "field:purchase.purchase,warehouse:0"
+msgid "Warehouse"
+msgstr ""
+
+msgctxt "field:purchase.purchase-account.invoice,invoice:0"
+msgid "Invoice"
+msgstr ""
+
+msgctxt "field:purchase.purchase-account.invoice,purchase:0"
+msgid "Purchase"
+msgstr ""
+
+msgctxt "field:purchase.purchase-account.invoice,rec_name:0"
+msgid "Name"
+msgstr ""
+
+msgctxt "field:purchase.purchase-ignored-account.invoice,invoice:0"
+msgid "Invoice"
+msgstr ""
+
+msgctxt "field:purchase.purchase-ignored-account.invoice,purchase:0"
+msgid "Purchase"
+msgstr ""
+
+msgctxt "field:purchase.purchase-ignored-account.invoice,rec_name:0"
+msgid "Name"
+msgstr ""
+
+msgctxt "field:purchase.purchase-recreated-account.invoice,invoice:0"
+msgid "Invoice"
+msgstr ""
+
+msgctxt "field:purchase.purchase-recreated-account.invoice,purchase:0"
+msgid "Purchase"
+msgstr ""
+
+msgctxt "field:purchase.purchase-recreated-account.invoice,rec_name:0"
+msgid "Name"
+msgstr ""
+
+msgctxt "field:stock.move,purchase:0"
+msgid "Purchase"
+msgstr ""
+
+msgctxt "field:stock.move,purchase_currency:0"
+msgid "Purchase Currency"
+msgstr ""
+
+msgctxt "field:stock.move,purchase_exception_state:0"
+msgid "Exception State"
+msgstr ""
+
+msgctxt "field:stock.move,purchase_line:0"
+msgid "Purchase Line"
+msgstr ""
+
+msgctxt "field:stock.move,purchase_quantity:0"
+msgid "Purchase Quantity"
+msgstr ""
+
+msgctxt "field:stock.move,purchase_unit:0"
+msgid "Purchase Unit"
+msgstr ""
+
+msgctxt "field:stock.move,purchase_unit_digits:0"
+msgid "Purchase Unit Digits"
+msgstr ""
+
+msgctxt "field:stock.move,purchase_unit_price:0"
+msgid "Purchase Unit Price"
+msgstr ""
+
+msgctxt "field:stock.move,purchase_visible:0"
+msgid "Purchase Visible"
+msgstr ""
+
+msgctxt "field:stock.move,supplier:0"
+msgid "Supplier"
+msgstr ""
+
+msgctxt "help:purchase.handle.invoice.exception.ask,recreate_invoices:0"
+msgid ""
+"The selected invoices will be recreated. The other ones will be ignored."
+msgstr ""
+
+msgctxt "help:purchase.handle.shipment.exception.ask,recreate_moves:0"
+msgid "The selected moves will be recreated. The other ones will be ignored."
+msgstr ""
+
+msgctxt "help:purchase.product_supplier,delivery_time:0"
+msgid "In number of days"
+msgstr ""
+
+msgctxt "help:purchase.product_supplier.price,quantity:0"
+msgid "Minimal quantity"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_invoice_form"
+msgid "Invoices"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_open_supplier"
+msgid "Parties associated to Purchases"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_purchase_configuration_form"
+msgid "Purchase Configuration"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_purchase_form"
+msgid "Purchases"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_purchase_form2"
+msgid "Purchases"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_purchase_form_confirmed"
+msgid "Confirmed Purchases"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_purchase_form_draft"
+msgid "Draft Purchases"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_purchase_form_quotation"
+msgid "Purchases in Quotation"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_shipment_form"
+msgid "Shipments"
+msgstr ""
+
+msgctxt "model:ir.action,name:report_purchase"
+msgid "Purchase"
+msgstr ""
+
+msgctxt "model:ir.action,name:wizard_invoice_handle_exception"
+msgid "Handle Invoice Exception"
+msgstr ""
+
+msgctxt "model:ir.action,name:wizard_shipment_handle_exception"
+msgid "Handle Shipment Exception"
+msgstr ""
+
+msgctxt "model:ir.sequence,name:sequence_purchase"
+msgid "Purchase"
+msgstr ""
+
+msgctxt "model:ir.sequence.type,name:sequence_type_purchase"
+msgid "Purchase"
+msgstr ""
+
+msgctxt "model:ir.ui.menu,name:menu_configuration"
+msgid "Configuration"
+msgstr ""
+
+msgctxt "model:ir.ui.menu,name:menu_purchase"
+msgid "Purchase"
+msgstr ""
+
+msgctxt "model:ir.ui.menu,name:menu_purchase_configuration"
+msgid "Purchase Configuration"
+msgstr ""
+
+msgctxt "model:ir.ui.menu,name:menu_purchase_form"
+msgid "Purchases"
+msgstr ""
+
+msgctxt "model:ir.ui.menu,name:menu_purchase_form_confirmed"
+msgid "Confirmed Purchases"
+msgstr ""
+
+msgctxt "model:ir.ui.menu,name:menu_purchase_form_draft"
+msgid "Draft Purchases"
+msgstr ""
+
+msgctxt "model:ir.ui.menu,name:menu_purchase_form_quotation"
+msgid "Purchases in Quotation"
+msgstr ""
+
+msgctxt "model:ir.ui.menu,name:menu_reporting"
+msgid "Reporting"
+msgstr ""
+
+msgctxt "model:ir.ui.menu,name:menu_supplier"
+msgid "Parties associated to Purchases"
+msgstr ""
+
+msgctxt "model:purchase.configuration,name:0"
+msgid "Purchase Configuration"
+msgstr ""
+
+msgctxt "model:purchase.handle.invoice.exception.ask,name:0"
+msgid "Invoice Exception Ask"
+msgstr ""
+
+msgctxt "model:purchase.handle.shipment.exception.ask,name:0"
+msgid "Shipment Exception Ask"
+msgstr ""
+
+msgctxt "model:purchase.line,name:0"
+msgid "Purchase Line"
+msgstr ""
+
+msgctxt "model:purchase.line-account.invoice.line,name:0"
+msgid "Purchase Line - Invoice Line"
+msgstr ""
+
+msgctxt "model:purchase.line-account.tax,name:0"
+msgid "Purchase Line - Tax"
+msgstr ""
+
+msgctxt "model:purchase.line-ignored-stock.move,name:0"
+msgid "Purchase Line - Ignored Move"
+msgstr ""
+
+msgctxt "model:purchase.line-recreated-stock.move,name:0"
+msgid "Purchase Line - Ignored Move"
+msgstr ""
+
+msgctxt "model:purchase.product_supplier,name:0"
+msgid "Product Supplier"
+msgstr ""
+
+msgctxt "model:purchase.product_supplier.price,name:0"
+msgid "Product Supplier Price"
+msgstr ""
+
+msgctxt "model:purchase.purchase,name:0"
+msgid "Purchase"
+msgstr ""
+
+msgctxt "model:purchase.purchase-account.invoice,name:0"
+msgid "Purchase - Invoice"
+msgstr ""
+
+msgctxt "model:purchase.purchase-ignored-account.invoice,name:0"
+msgid "Purchase - Ignored Invoice"
+msgstr ""
+
+msgctxt "model:purchase.purchase-recreated-account.invoice,name:0"
+msgid "Purchase - Recreated Invoice"
+msgstr ""
+
+msgctxt "model:res.group,name:group_purchase"
+msgid "Purchase"
+msgstr ""
+
+msgctxt "model:res.group,name:group_purchase_admin"
+msgid "Purchase Administrator"
+msgstr ""
+
+msgctxt "model:workflow,name:purchase_workflow"
+msgid "Purchase workflow"
+msgstr ""
+
+msgctxt "model:workflow.activity,name:purchase_activity_cancel"
+msgid "Canceled"
+msgstr ""
+
+msgctxt "model:workflow.activity,name:purchase_activity_confirmed"
+msgid "Confirmed"
+msgstr ""
+
+msgctxt "model:workflow.activity,name:purchase_activity_done"
+msgid "Done"
+msgstr ""
+
+msgctxt "model:workflow.activity,name:purchase_activity_draft"
+msgid "Draft"
+msgstr ""
+
+msgctxt "model:workflow.activity,name:purchase_activity_invoice_done"
+msgid "Invoice Done"
+msgstr ""
+
+msgctxt "model:workflow.activity,name:purchase_activity_invoice_method"
+msgid "Invoice Method"
+msgstr ""
+
+msgctxt "model:workflow.activity,name:purchase_activity_invoice_method_done"
+msgid "Invoice Method Done"
+msgstr ""
+
+msgctxt ""
+"model:workflow.activity,name:purchase_activity_invoice_purchase_exception"
+msgid "Invoice Exception"
+msgstr ""
+
+msgctxt "model:workflow.activity,name:purchase_activity_invoice_shipment"
+msgid "Invoice Shipment"
+msgstr ""
+
+msgctxt "model:workflow.activity,name:purchase_activity_invoice_shipment_done"
+msgid "Invoice Shipment Done"
+msgstr ""
+
+msgctxt ""
+"model:workflow.activity,name:purchase_activity_invoice_shipment_exception"
+msgid "Invoice Shipment Exception"
+msgstr ""
+
+msgctxt ""
+"model:workflow.activity,name:purchase_activity_invoice_shipment_method"
+msgid "Invoice Shipment Method"
+msgstr ""
+
+msgctxt ""
+"model:workflow.activity,name:purchase_activity_invoice_shipment_method_done"
+msgid "Invoice Shipment Method Done"
+msgstr ""
+
+msgctxt "model:workflow.activity,name:purchase_activity_quotation"
+msgid "Quotation"
+msgstr ""
+
+msgctxt "model:workflow.activity,name:purchase_activity_shipment_exception"
+msgid "Shipment Exception"
+msgstr ""
+
+msgctxt ""
+"model:workflow.activity,name:purchase_activity_waiting_invoice_purchase"
+msgid "Waiting Invoice"
+msgstr ""
+
+msgctxt ""
+"model:workflow.activity,name:purchase_activity_waiting_invoice_shipment"
+msgid "Waiting Invoice Shipment"
+msgstr ""
+
+msgctxt "model:workflow.activity,name:purchase_activity_waiting_shipment"
+msgid "Waiting Shipment"
+msgstr ""
+
+msgctxt "odt:purchase.purchase:0"
+msgid "Amount"
+msgstr ""
+
+msgctxt "odt:purchase.purchase:0"
+msgid "Date:"
+msgstr ""
+
+msgctxt "odt:purchase.purchase:0"
+msgid "Description"
+msgstr ""
+
+msgctxt "odt:purchase.purchase:0"
+msgid "Description:"
+msgstr ""
+
+msgctxt "odt:purchase.purchase:0"
+msgid "Draft Purchase Order"
+msgstr ""
+
+msgctxt "odt:purchase.purchase:0"
+msgid "E-Mail:"
+msgstr ""
+
+msgctxt "odt:purchase.purchase:0"
+msgid "Phone:"
+msgstr ""
+
+msgctxt "odt:purchase.purchase:0"
+msgid "Purchase Order N°:"
+msgstr ""
+
+msgctxt "odt:purchase.purchase:0"
+msgid "Quantity"
+msgstr ""
+
+msgctxt "odt:purchase.purchase:0"
+msgid "Request for Quotation N°:"
+msgstr ""
+
+msgctxt "odt:purchase.purchase:0"
+msgid "Taxes"
+msgstr ""
+
+msgctxt "odt:purchase.purchase:0"
+msgid "Taxes:"
+msgstr ""
+
+msgctxt "odt:purchase.purchase:0"
+msgid "Total (excl. taxes):"
+msgstr ""
+
+msgctxt "odt:purchase.purchase:0"
+msgid "Total:"
+msgstr ""
+
+msgctxt "odt:purchase.purchase:0"
+msgid "Unit Price"
+msgstr ""
+
+msgctxt "odt:purchase.purchase:0"
+msgid "VAT Number:"
+msgstr ""
+
+msgctxt "odt:purchase.purchase:0"
+msgid "VAT:"
+msgstr ""
+
+msgctxt "selection:account.invoice,purchase_exception_state:0"
+msgid ""
+msgstr ""
+
+msgctxt "selection:account.invoice,purchase_exception_state:0"
+msgid "Ignored"
+msgstr ""
+
+msgctxt "selection:account.invoice,purchase_exception_state:0"
+msgid "Recreated"
+msgstr ""
+
+msgctxt "selection:purchase.configuration,purchase_invoice_method:0"
+msgid "Based On Order"
+msgstr ""
+
+msgctxt "selection:purchase.configuration,purchase_invoice_method:0"
+msgid "Based On Shipment"
+msgstr ""
+
+msgctxt "selection:purchase.configuration,purchase_invoice_method:0"
+msgid "Manual"
+msgstr ""
+
+msgctxt "selection:purchase.line,type:0"
+msgid "Comment"
+msgstr ""
+
+msgctxt "selection:purchase.line,type:0"
+msgid "Line"
+msgstr ""
+
+msgctxt "selection:purchase.line,type:0"
+msgid "Subtotal"
+msgstr ""
+
+msgctxt "selection:purchase.line,type:0"
+msgid "Title"
+msgstr ""
+
+msgctxt "selection:purchase.purchase,invoice_method:0"
+msgid "Based On Order"
+msgstr ""
+
+msgctxt "selection:purchase.purchase,invoice_method:0"
+msgid "Based On Shipment"
+msgstr ""
+
+msgctxt "selection:purchase.purchase,invoice_method:0"
+msgid "Manual"
+msgstr ""
+
+msgctxt "selection:purchase.purchase,invoice_state:0"
+msgid "Exception"
+msgstr ""
+
+msgctxt "selection:purchase.purchase,invoice_state:0"
+msgid "None"
+msgstr ""
+
+msgctxt "selection:purchase.purchase,invoice_state:0"
+msgid "Paid"
+msgstr ""
+
+msgctxt "selection:purchase.purchase,invoice_state:0"
+msgid "Waiting"
+msgstr ""
+
+msgctxt "selection:purchase.purchase,shipment_state:0"
+msgid "Exception"
+msgstr ""
+
+msgctxt "selection:purchase.purchase,shipment_state:0"
+msgid "None"
+msgstr ""
+
+msgctxt "selection:purchase.purchase,shipment_state:0"
+msgid "Received"
+msgstr ""
+
+msgctxt "selection:purchase.purchase,shipment_state:0"
+msgid "Waiting"
+msgstr ""
+
+msgctxt "selection:purchase.purchase,state:0"
+msgid "Canceled"
+msgstr ""
+
+msgctxt "selection:purchase.purchase,state:0"
+msgid "Confirmed"
+msgstr ""
+
+msgctxt "selection:purchase.purchase,state:0"
+msgid "Done"
+msgstr ""
+
+msgctxt "selection:purchase.purchase,state:0"
+msgid "Draft"
+msgstr ""
+
+msgctxt "selection:purchase.purchase,state:0"
+msgid "Quotation"
+msgstr ""
+
+msgctxt "selection:stock.move,purchase_exception_state:0"
+msgid ""
+msgstr ""
+
+msgctxt "selection:stock.move,purchase_exception_state:0"
+msgid "Ignored"
+msgstr ""
+
+msgctxt "selection:stock.move,purchase_exception_state:0"
+msgid "Recreated"
+msgstr ""
+
+msgctxt "view:product.template:0"
+msgid "Product Suppliers"
+msgstr ""
+
+msgctxt "view:product.template:0"
+msgid "Suppliers"
+msgstr ""
+
+msgctxt "view:purchase.configuration:0"
+msgid "Purchase Configuration"
+msgstr ""
+
+msgctxt "view:purchase.handle.invoice.exception.ask:0"
+msgid "Choose invoices to recreate"
+msgstr ""
+
+msgctxt "view:purchase.handle.invoice.exception.ask:0"
+msgid "Handle Invoice Exception"
+msgstr ""
+
+msgctxt "view:purchase.handle.shipment.exception.ask:0"
+msgid "Choose move to recreate"
+msgstr ""
+
+msgctxt "view:purchase.handle.shipment.exception.ask:0"
+msgid "Handle shipment Exception"
+msgstr ""
+
+msgctxt "view:purchase.handle.shipment.exception.ask:0"
+msgid "Recreated Moves"
+msgstr ""
+
+msgctxt "view:purchase.line:0"
+msgid "General"
+msgstr ""
+
+msgctxt "view:purchase.line:0"
+msgid "Notes"
+msgstr ""
+
+msgctxt "view:purchase.line:0"
+msgid "Products"
+msgstr ""
+
+msgctxt "view:purchase.line:0"
+msgid "Purchase Line"
+msgstr ""
+
+msgctxt "view:purchase.line:0"
+msgid "Purchase Lines"
+msgstr ""
+
+msgctxt "view:purchase.product_supplier.price:0"
+msgid "Product Supplier Price"
+msgstr ""
+
+msgctxt "view:purchase.product_supplier.price:0"
+msgid "Product Supplier Prices"
+msgstr ""
+
+msgctxt "view:purchase.product_supplier:0"
+msgid "Product Supplier"
+msgstr ""
+
+msgctxt "view:purchase.product_supplier:0"
+msgid "Product Suppliers"
+msgstr ""
+
+msgctxt "view:purchase.purchase:0"
+msgid "Cancel"
+msgstr ""
+
+msgctxt "view:purchase.purchase:0"
+msgid "Confirm"
+msgstr ""
+
+msgctxt "view:purchase.purchase:0"
+msgid "Draft"
+msgstr ""
+
+msgctxt "view:purchase.purchase:0"
+msgid "Handle Invoice Exception"
+msgstr ""
+
+msgctxt "view:purchase.purchase:0"
+msgid "Handle Shipment Exception"
+msgstr ""
+
+msgctxt "view:purchase.purchase:0"
+msgid "Invoices"
+msgstr ""
+
+msgctxt "view:purchase.purchase:0"
+msgid "Lines"
+msgstr ""
+
+msgctxt "view:purchase.purchase:0"
+msgid "Moves"
+msgstr ""
+
+msgctxt "view:purchase.purchase:0"
+msgid "Other Info"
+msgstr ""
+
+msgctxt "view:purchase.purchase:0"
+msgid "Purchase"
+msgstr ""
+
+msgctxt "view:purchase.purchase:0"
+msgid "Purchases"
+msgstr ""
+
+msgctxt "view:purchase.purchase:0"
+msgid "Quotation"
+msgstr ""
+
+msgctxt "view:purchase.purchase:0"
+msgid "Shipments"
+msgstr ""
+
+msgctxt "wizard_button:purchase.handle.invoice.exception,init,end:0"
+msgid "Cancel"
+msgstr ""
+
+msgctxt "wizard_button:purchase.handle.invoice.exception,init,ok:0"
+msgid "Ok"
+msgstr ""
+
+msgctxt "wizard_button:purchase.handle.shipment.exception,init,end:0"
+msgid "Cancel"
+msgstr ""
+
+msgctxt "wizard_button:purchase.handle.shipment.exception,init,ok:0"
+msgid "Ok"
+msgstr ""
diff --git a/locale/de_DE.po b/locale/de_DE.po
new file mode 100644
index 0000000..8b11d49
--- /dev/null
+++ b/locale/de_DE.po
@@ -0,0 +1,1082 @@
+# 
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "error:account.invoice:0"
+msgid "You can not delete invoices that come from a purchase!"
+msgstr ""
+"Durch einen Einkauf generierte Rechnungen können nicht gelöscht werden!"
+
+msgctxt "error:account.invoice:0"
+msgid "You cannot reset to draft an invoice generated by a purchase."
+msgstr ""
+"Eine durch einen Einkauf generierte Bewegung kann nicht auf Entwurf "
+"zurückgesetzt werden."
+
+msgctxt "error:product.template:0"
+msgid ""
+"Purchase prices are based on the purchase uom, are you sure to change it?"
+msgstr ""
+"Einkaufspreise basieren auf der Maßeinheit für den Einkauf.\n"
+"Soll sie wirklich geändert werden?"
+
+msgctxt "error:purchase.line:0"
+msgid "It misses an \"Account Expense\" on product \"%s\"!"
+msgstr "Es ist ken Aufwandskonto für Artikel \"%s\" definiert!"
+
+msgctxt "error:purchase.line:0"
+msgid "It misses an \"account expense\" default property!"
+msgstr "Es ist keine Standardeigenschaft für das Aufwandskonto definiert!"
+
+msgctxt "error:purchase.line:0"
+msgid "The supplier location is required!"
+msgstr "Der Lagerort des Lieferanten muss eingegeben werden!"
+
+msgctxt "error:purchase.purchase:0"
+msgid "Invoice addresses must be defined for the quotation."
+msgstr "Die Rechnungsadresse muss für ein Angebot angegeben werden."
+
+msgctxt "error:purchase.purchase:0"
+msgid "It misses an \"Account Payable\" on the party \"%s\"!"
+msgstr "Es ist kein Verbindlichkeitskonto für Partei \"%s\" definiert!"
+
+msgctxt "error:stock.shipment.in:0"
+msgid "You cannot reset to draft a move generated by a purchase."
+msgstr ""
+"Eine durch einen Einkauf generierte Bewegung kann nicht auf Entwurf "
+"zurückgesetzt werden."
+
+msgctxt "field:account.invoice,purchase_exception_state:0"
+msgid "Exception State"
+msgstr "Status Vorbehalt"
+
+msgctxt "field:account.invoice,purchases:0"
+msgid "Purchases"
+msgstr "Einkäufe"
+
+msgctxt "field:account.invoice.line,purchase_lines:0"
+msgid "Purchase Lines"
+msgstr "Positionen Einkauf"
+
+msgctxt "field:product.template,product_suppliers:0"
+msgid "Suppliers"
+msgstr "Lieferanten"
+
+msgctxt "field:product.template,purchasable:0"
+msgid "Purchasable"
+msgstr "Käuflich"
+
+msgctxt "field:product.template,purchase_uom:0"
+msgid "Purchase UOM"
+msgstr "Einheit Einkauf"
+
+msgctxt "field:purchase.configuration,purchase_invoice_method:0"
+msgid "Invoice Method"
+msgstr "Rechnungsstellung Einkauf"
+
+msgctxt "field:purchase.configuration,purchase_sequence:0"
+msgid "Purchase Reference Sequence"
+msgstr "Nummernkreis Einkauf"
+
+msgctxt "field:purchase.configuration,rec_name:0"
+msgid "Name"
+msgstr "Name"
+
+msgctxt "field:purchase.handle.invoice.exception.ask,domain_invoices:0"
+msgid "Domain Invoices"
+msgstr "Wertebereich Rechnungen (Domain)"
+
+msgctxt "field:purchase.handle.invoice.exception.ask,recreate_invoices:0"
+msgid "Recreate Invoices"
+msgstr "Rechnungen nachbilden"
+
+msgctxt "field:purchase.handle.shipment.exception.ask,domain_moves:0"
+msgid "Domain Moves"
+msgstr "Wertebereich Bewegungen (Domain)"
+
+msgctxt "field:purchase.handle.shipment.exception.ask,recreate_moves:0"
+msgid "Recreate Moves"
+msgstr "Bewegungen nachbilden"
+
+msgctxt "field:purchase.line,amount:0"
+msgid "Amount"
+msgstr "Betrag"
+
+msgctxt "field:purchase.line,description:0"
+msgid "Description"
+msgstr "Bezeichnung"
+
+msgctxt "field:purchase.line,invoice_lines:0"
+msgid "Invoice Lines"
+msgstr "Rechnungspositionen"
+
+msgctxt "field:purchase.line,move_done:0"
+msgid "Moves Done"
+msgstr "Bewegungen erledigt"
+
+msgctxt "field:purchase.line,move_exception:0"
+msgid "Moves Exception"
+msgstr "Bewegungsvorbehalt"
+
+msgctxt "field:purchase.line,moves:0"
+msgid "Moves"
+msgstr "Bewegungen"
+
+msgctxt "field:purchase.line,moves_ignored:0"
+msgid "Ignored Moves"
+msgstr "Ignorierte Bewegungen"
+
+msgctxt "field:purchase.line,moves_recreated:0"
+msgid "Recreated Moves"
+msgstr "Nachgebildete Bewegungen"
+
+msgctxt "field:purchase.line,note:0"
+msgid "Note"
+msgstr "Notiz"
+
+msgctxt "field:purchase.line,product:0"
+msgid "Product"
+msgstr "Artikel"
+
+msgctxt "field:purchase.line,purchase:0"
+msgid "Purchase"
+msgstr "Einkauf"
+
+msgctxt "field:purchase.line,quantity:0"
+msgid "Quantity"
+msgstr "Anzahl"
+
+msgctxt "field:purchase.line,rec_name:0"
+msgid "Name"
+msgstr "Name"
+
+msgctxt "field:purchase.line,sequence:0"
+msgid "Sequence"
+msgstr "Reihenfolge"
+
+msgctxt "field:purchase.line,taxes:0"
+msgid "Taxes"
+msgstr "Steuern"
+
+msgctxt "field:purchase.line,type:0"
+msgid "Type"
+msgstr "Typ"
+
+msgctxt "field:purchase.line,unit:0"
+msgid "Unit"
+msgstr "Einheit"
+
+msgctxt "field:purchase.line,unit_digits:0"
+msgid "Unit Digits"
+msgstr "Anzahl Stellen"
+
+msgctxt "field:purchase.line,unit_price:0"
+msgid "Unit Price"
+msgstr "Einzelpreis"
+
+msgctxt "field:purchase.line-account.invoice.line,invoice_line:0"
+msgid "Invoice Line"
+msgstr "Rechnungsposition"
+
+msgctxt "field:purchase.line-account.invoice.line,purchase_line:0"
+msgid "Purchase Line"
+msgstr "Position Einkauf"
+
+msgctxt "field:purchase.line-account.invoice.line,rec_name:0"
+msgid "Name"
+msgstr "Name"
+
+msgctxt "field:purchase.line-account.tax,line:0"
+msgid "Purchase Line"
+msgstr "Position Einkauf"
+
+msgctxt "field:purchase.line-account.tax,rec_name:0"
+msgid "Name"
+msgstr "Name"
+
+msgctxt "field:purchase.line-account.tax,tax:0"
+msgid "Tax"
+msgstr "Steuer"
+
+msgctxt "field:purchase.line-ignored-stock.move,move:0"
+msgid "Move"
+msgstr "Bewegung"
+
+msgctxt "field:purchase.line-ignored-stock.move,purchase_line:0"
+msgid "Purchase Line"
+msgstr "Position Einkauf"
+
+msgctxt "field:purchase.line-ignored-stock.move,rec_name:0"
+msgid "Name"
+msgstr "Name"
+
+msgctxt "field:purchase.line-recreated-stock.move,move:0"
+msgid "Move"
+msgstr "Bewegung"
+
+msgctxt "field:purchase.line-recreated-stock.move,purchase_line:0"
+msgid "Purchase Line"
+msgstr "Position Einkauf"
+
+msgctxt "field:purchase.line-recreated-stock.move,rec_name:0"
+msgid "Name"
+msgstr "Name"
+
+msgctxt "field:purchase.product_supplier,code:0"
+msgid "Code"
+msgstr "Artikelnummer Lieferant"
+
+msgctxt "field:purchase.product_supplier,company:0"
+msgid "Company"
+msgstr "Lieferfirma"
+
+msgctxt "field:purchase.product_supplier,delivery_time:0"
+msgid "Delivery Time"
+msgstr "Lieferfrist"
+
+msgctxt "field:purchase.product_supplier,name:0"
+msgid "Name"
+msgstr "Name"
+
+msgctxt "field:purchase.product_supplier,party:0"
+msgid "Supplier"
+msgstr "Lieferant"
+
+msgctxt "field:purchase.product_supplier,prices:0"
+msgid "Prices"
+msgstr "Preise"
+
+msgctxt "field:purchase.product_supplier,product:0"
+msgid "Product"
+msgstr "Artikel"
+
+msgctxt "field:purchase.product_supplier,rec_name:0"
+msgid "Name"
+msgstr "Name"
+
+msgctxt "field:purchase.product_supplier,sequence:0"
+msgid "Sequence"
+msgstr "Reihenfolge"
+
+msgctxt "field:purchase.product_supplier.price,product_supplier:0"
+msgid "Supplier"
+msgstr "Lieferant"
+
+msgctxt "field:purchase.product_supplier.price,quantity:0"
+msgid "Quantity"
+msgstr "Anzahl"
+
+msgctxt "field:purchase.product_supplier.price,rec_name:0"
+msgid "Name"
+msgstr "Name"
+
+msgctxt "field:purchase.product_supplier.price,unit_price:0"
+msgid "Unit Price"
+msgstr "Einzelpreis"
+
+msgctxt "field:purchase.purchase,comment:0"
+msgid "Comment"
+msgstr "Kommentar"
+
+msgctxt "field:purchase.purchase,company:0"
+msgid "Company"
+msgstr "Unternehmen"
+
+msgctxt "field:purchase.purchase,currency:0"
+msgid "Currency"
+msgstr "Währung"
+
+msgctxt "field:purchase.purchase,currency_digits:0"
+msgid "Currency Digits"
+msgstr "Währung (signifikante Stellen)"
+
+msgctxt "field:purchase.purchase,description:0"
+msgid "Description"
+msgstr "Beschreibung"
+
+msgctxt "field:purchase.purchase,invoice_address:0"
+msgid "Invoice Address"
+msgstr "Rechnungsadresse"
+
+msgctxt "field:purchase.purchase,invoice_exception:0"
+msgid "Invoices Exception"
+msgstr "Rechnungsvorbehalt"
+
+msgctxt "field:purchase.purchase,invoice_method:0"
+msgid "Invoice Method"
+msgstr "Rechnungsstellung"
+
+msgctxt "field:purchase.purchase,invoice_paid:0"
+msgid "Invoices Paid"
+msgstr "Bezahlte Rechnungen"
+
+msgctxt "field:purchase.purchase,invoice_state:0"
+msgid "Invoice State"
+msgstr "Rechnungsstatus"
+
+msgctxt "field:purchase.purchase,invoices:0"
+msgid "Invoices"
+msgstr "Rechnungen"
+
+msgctxt "field:purchase.purchase,invoices_ignored:0"
+msgid "Ignored Invoices"
+msgstr "Ignorierte Rechnungen"
+
+msgctxt "field:purchase.purchase,invoices_recreated:0"
+msgid "Recreated Invoices"
+msgstr "Nachgebildete Rechnungen"
+
+msgctxt "field:purchase.purchase,lines:0"
+msgid "Lines"
+msgstr "Positionen"
+
+msgctxt "field:purchase.purchase,moves:0"
+msgid "Moves"
+msgstr "Bewegungen"
+
+msgctxt "field:purchase.purchase,party:0"
+msgid "Party"
+msgstr "Partei"
+
+msgctxt "field:purchase.purchase,party_lang:0"
+msgid "Party Language"
+msgstr "Sprache Partei"
+
+msgctxt "field:purchase.purchase,payment_term:0"
+msgid "Payment Term"
+msgstr "Zahlungsbedingung"
+
+msgctxt "field:purchase.purchase,purchase_date:0"
+msgid "Purchase Date"
+msgstr "Kaufdatum"
+
+msgctxt "field:purchase.purchase,rec_name:0"
+msgid "Name"
+msgstr "Name"
+
+msgctxt "field:purchase.purchase,reference:0"
+msgid "Reference"
+msgstr "Beleg-Nr."
+
+msgctxt "field:purchase.purchase,shipment_done:0"
+msgid "Shipment Done"
+msgstr "Lieferposten erledigt"
+
+msgctxt "field:purchase.purchase,shipment_exception:0"
+msgid "Shipments Exception"
+msgstr "Lieferungsvorbehalt"
+
+msgctxt "field:purchase.purchase,shipment_state:0"
+msgid "Shipment State"
+msgstr "Lieferstatus"
+
+msgctxt "field:purchase.purchase,shipments:0"
+msgid "Shipments"
+msgstr "Lieferposten"
+
+msgctxt "field:purchase.purchase,state:0"
+msgid "State"
+msgstr "Status"
+
+msgctxt "field:purchase.purchase,supplier_reference:0"
+msgid "Supplier Reference"
+msgstr "Beleg-Nr. Lieferant"
+
+msgctxt "field:purchase.purchase,tax_amount:0"
+msgid "Tax"
+msgstr "Steuer"
+
+msgctxt "field:purchase.purchase,total_amount:0"
+msgid "Total"
+msgstr "Gesamt"
+
+msgctxt "field:purchase.purchase,untaxed_amount:0"
+msgid "Untaxed"
+msgstr "Netto"
+
+msgctxt "field:purchase.purchase,warehouse:0"
+msgid "Warehouse"
+msgstr "Warenlager"
+
+msgctxt "field:purchase.purchase-account.invoice,invoice:0"
+msgid "Invoice"
+msgstr "Rechnung"
+
+msgctxt "field:purchase.purchase-account.invoice,purchase:0"
+msgid "Purchase"
+msgstr "Einkauf"
+
+msgctxt "field:purchase.purchase-account.invoice,rec_name:0"
+msgid "Name"
+msgstr "Name"
+
+msgctxt "field:purchase.purchase-ignored-account.invoice,invoice:0"
+msgid "Invoice"
+msgstr "Rechnung"
+
+msgctxt "field:purchase.purchase-ignored-account.invoice,purchase:0"
+msgid "Purchase"
+msgstr "Einkauf"
+
+msgctxt "field:purchase.purchase-ignored-account.invoice,rec_name:0"
+msgid "Name"
+msgstr "Name"
+
+msgctxt "field:purchase.purchase-recreated-account.invoice,invoice:0"
+msgid "Invoice"
+msgstr "Rechnung"
+
+msgctxt "field:purchase.purchase-recreated-account.invoice,purchase:0"
+msgid "Purchase"
+msgstr "Einkauf"
+
+msgctxt "field:purchase.purchase-recreated-account.invoice,rec_name:0"
+msgid "Name"
+msgstr "Name"
+
+msgctxt "field:stock.move,purchase:0"
+msgid "Purchase"
+msgstr "Einkauf"
+
+msgctxt "field:stock.move,purchase_currency:0"
+msgid "Purchase Currency"
+msgstr "Einkaufswährung"
+
+msgctxt "field:stock.move,purchase_exception_state:0"
+msgid "Exception State"
+msgstr "Status Vorbehalt"
+
+msgctxt "field:stock.move,purchase_line:0"
+msgid "Purchase Line"
+msgstr "Position Einkauf"
+
+msgctxt "field:stock.move,purchase_quantity:0"
+msgid "Purchase Quantity"
+msgstr "Anzahl Einkauf"
+
+msgctxt "field:stock.move,purchase_unit:0"
+msgid "Purchase Unit"
+msgstr "Einheit Einkauf"
+
+msgctxt "field:stock.move,purchase_unit_digits:0"
+msgid "Purchase Unit Digits"
+msgstr "Anzahl Stellen Einkauf"
+
+msgctxt "field:stock.move,purchase_unit_price:0"
+msgid "Purchase Unit Price"
+msgstr "Einzelpreis Einkauf"
+
+msgctxt "field:stock.move,purchase_visible:0"
+msgid "Purchase Visible"
+msgstr "Verkauf sichtbar"
+
+msgctxt "field:stock.move,supplier:0"
+msgid "Supplier"
+msgstr "Lieferant"
+
+msgctxt "help:purchase.handle.invoice.exception.ask,recreate_invoices:0"
+msgid ""
+"The selected invoices will be recreated. The other ones will be ignored."
+msgstr ""
+"Die ausgewählten Rechnungen werden nachgebildet. Alle anderen werden "
+"ignoriert."
+
+msgctxt "help:purchase.handle.shipment.exception.ask,recreate_moves:0"
+msgid "The selected moves will be recreated. The other ones will be ignored."
+msgstr ""
+"Die ausgewählten Bewegungen werden nachgebildet. Alle anderen werden "
+"ignoriert."
+
+msgctxt "help:purchase.product_supplier,delivery_time:0"
+msgid "In number of days"
+msgstr "In Anzahl von Tagen"
+
+msgctxt "help:purchase.product_supplier.price,quantity:0"
+msgid "Minimal quantity"
+msgstr "Minimale Anzahl"
+
+msgctxt "model:ir.action,name:act_invoice_form"
+msgid "Invoices"
+msgstr "Rechnungseingang"
+
+msgctxt "model:ir.action,name:act_open_supplier"
+msgid "Parties associated to Purchases"
+msgstr "Parteien: Einkäufen zugeordnet"
+
+msgctxt "model:ir.action,name:act_purchase_configuration_form"
+msgid "Purchase Configuration"
+msgstr "Einstellungen Einkauf"
+
+msgctxt "model:ir.action,name:act_purchase_form"
+msgid "Purchases"
+msgstr "Einkäufe"
+
+msgctxt "model:ir.action,name:act_purchase_form2"
+msgid "Purchases"
+msgstr "Einkäufe"
+
+msgctxt "model:ir.action,name:act_purchase_form_confirmed"
+msgid "Confirmed Purchases"
+msgstr "Aufträge Einkäufe"
+
+msgctxt "model:ir.action,name:act_purchase_form_draft"
+msgid "Draft Purchases"
+msgstr "Entwürfe Einkäufe"
+
+msgctxt "model:ir.action,name:act_purchase_form_quotation"
+msgid "Purchases in Quotation"
+msgstr "Angebote Einkäufe"
+
+msgctxt "model:ir.action,name:act_shipment_form"
+msgid "Shipments"
+msgstr "Lieferposten"
+
+msgctxt "model:ir.action,name:report_purchase"
+msgid "Purchase"
+msgstr "Einkauf"
+
+msgctxt "model:ir.action,name:wizard_invoice_handle_exception"
+msgid "Handle Invoice Exception"
+msgstr "Rechnungsvorbehalt bearbeiten"
+
+msgctxt "model:ir.action,name:wizard_shipment_handle_exception"
+msgid "Handle Shipment Exception"
+msgstr "Liefervorbehalt bearbeiten"
+
+msgctxt "model:ir.sequence,name:sequence_purchase"
+msgid "Purchase"
+msgstr "Einkauf"
+
+msgctxt "model:ir.sequence.type,name:sequence_type_purchase"
+msgid "Purchase"
+msgstr "Einkauf"
+
+msgctxt "model:ir.ui.menu,name:menu_configuration"
+msgid "Configuration"
+msgstr "Einstellungen"
+
+msgctxt "model:ir.ui.menu,name:menu_purchase"
+msgid "Purchase"
+msgstr "Einkauf"
+
+msgctxt "model:ir.ui.menu,name:menu_purchase_configuration"
+msgid "Purchase Configuration"
+msgstr "Einstellungen Einkauf"
+
+msgctxt "model:ir.ui.menu,name:menu_purchase_form"
+msgid "Purchases"
+msgstr "Einkäufe"
+
+msgctxt "model:ir.ui.menu,name:menu_purchase_form_confirmed"
+msgid "Confirmed Purchases"
+msgstr "Aufträge (Einkäufe)"
+
+msgctxt "model:ir.ui.menu,name:menu_purchase_form_draft"
+msgid "Draft Purchases"
+msgstr "Entwürfe (Einkäufe)"
+
+msgctxt "model:ir.ui.menu,name:menu_purchase_form_quotation"
+msgid "Purchases in Quotation"
+msgstr "Angebote (Einkäufe)"
+
+msgctxt "model:ir.ui.menu,name:menu_reporting"
+msgid "Reporting"
+msgstr "Auswertungen"
+
+msgctxt "model:ir.ui.menu,name:menu_supplier"
+msgid "Parties associated to Purchases"
+msgstr "Parteien: Einkäufen zugeordnet"
+
+msgctxt "model:purchase.configuration,name:0"
+msgid "Purchase Configuration"
+msgstr "Einstellungen Einkauf"
+
+msgctxt "model:purchase.handle.invoice.exception.ask,name:0"
+msgid "Invoice Exception Ask"
+msgstr "Nachfrage Rechnungsvorbehalt"
+
+msgctxt "model:purchase.handle.shipment.exception.ask,name:0"
+msgid "Shipment Exception Ask"
+msgstr "Nachfrage Liefervorbehalt"
+
+msgctxt "model:purchase.line,name:0"
+msgid "Purchase Line"
+msgstr "Einkauf Position"
+
+msgctxt "model:purchase.line-account.invoice.line,name:0"
+msgid "Purchase Line - Invoice Line"
+msgstr "Position Einkauf - Rechnungsposition"
+
+msgctxt "model:purchase.line-account.tax,name:0"
+msgid "Purchase Line - Tax"
+msgstr "Position Einkauf - Steuer"
+
+msgctxt "model:purchase.line-ignored-stock.move,name:0"
+msgid "Purchase Line - Ignored Move"
+msgstr "Position Einkauf - Bewegung Ignoriert"
+
+msgctxt "model:purchase.line-recreated-stock.move,name:0"
+msgid "Purchase Line - Ignored Move"
+msgstr "Position Einkauf - Bewegung Nachgebildet"
+
+msgctxt "model:purchase.product_supplier,name:0"
+msgid "Product Supplier"
+msgstr "Artikel Lieferant"
+
+msgctxt "model:purchase.product_supplier.price,name:0"
+msgid "Product Supplier Price"
+msgstr "Artikel Einkaufspreis"
+
+msgctxt "model:purchase.purchase,name:0"
+msgid "Purchase"
+msgstr "Einkauf"
+
+msgctxt "model:purchase.purchase-account.invoice,name:0"
+msgid "Purchase - Invoice"
+msgstr "Einkauf - Rechnung"
+
+msgctxt "model:purchase.purchase-ignored-account.invoice,name:0"
+msgid "Purchase - Ignored Invoice"
+msgstr "Einkauf - Rechnung Ignoriert"
+
+msgctxt "model:purchase.purchase-recreated-account.invoice,name:0"
+msgid "Purchase - Recreated Invoice"
+msgstr "Einkauf - Rechnung Nachgebildet"
+
+msgctxt "model:res.group,name:group_purchase"
+msgid "Purchase"
+msgstr "Einkauf"
+
+msgctxt "model:res.group,name:group_purchase_admin"
+msgid "Purchase Administrator"
+msgstr "Einkauf Administration"
+
+msgctxt "model:workflow,name:purchase_workflow"
+msgid "Purchase workflow"
+msgstr "Workflow Einkauf"
+
+msgctxt "model:workflow.activity,name:purchase_activity_cancel"
+msgid "Canceled"
+msgstr "Annulliert"
+
+msgctxt "model:workflow.activity,name:purchase_activity_confirmed"
+msgid "Confirmed"
+msgstr "Beauftragt"
+
+msgctxt "model:workflow.activity,name:purchase_activity_done"
+msgid "Done"
+msgstr "Erledigt"
+
+msgctxt "model:workflow.activity,name:purchase_activity_draft"
+msgid "Draft"
+msgstr "Entwurf"
+
+msgctxt "model:workflow.activity,name:purchase_activity_invoice_done"
+msgid "Invoice Done"
+msgstr "Rechnung erledigt"
+
+msgctxt "model:workflow.activity,name:purchase_activity_invoice_method"
+msgid "Invoice Method"
+msgstr "Rechnungsstellung"
+
+msgctxt "model:workflow.activity,name:purchase_activity_invoice_method_done"
+msgid "Invoice Method Done"
+msgstr "Rechnungsstellung erledigt"
+
+msgctxt ""
+"model:workflow.activity,name:purchase_activity_invoice_purchase_exception"
+msgid "Invoice Exception"
+msgstr "Rechnungsvorbehalt"
+
+msgctxt "model:workflow.activity,name:purchase_activity_invoice_shipment"
+msgid "Invoice Shipment"
+msgstr "Rechnung Lieferposten"
+
+msgctxt "model:workflow.activity,name:purchase_activity_invoice_shipment_done"
+msgid "Invoice Shipment Done"
+msgstr "Rechnung Lieferposten erledigt"
+
+msgctxt ""
+"model:workflow.activity,name:purchase_activity_invoice_shipment_exception"
+msgid "Invoice Shipment Exception"
+msgstr "Rechnung Lieferposten Vorbehalt"
+
+msgctxt ""
+"model:workflow.activity,name:purchase_activity_invoice_shipment_method"
+msgid "Invoice Shipment Method"
+msgstr "Rechnung Liefermethode"
+
+msgctxt ""
+"model:workflow.activity,name:purchase_activity_invoice_shipment_method_done"
+msgid "Invoice Shipment Method Done"
+msgstr "Rechnung Liefermethode erledigt"
+
+msgctxt "model:workflow.activity,name:purchase_activity_quotation"
+msgid "Quotation"
+msgstr "Angebot"
+
+msgctxt "model:workflow.activity,name:purchase_activity_shipment_exception"
+msgid "Shipment Exception"
+msgstr "Lieferposten Vorbehalt"
+
+msgctxt ""
+"model:workflow.activity,name:purchase_activity_waiting_invoice_purchase"
+msgid "Waiting Invoice"
+msgstr "Rechnung Wartend"
+
+msgctxt ""
+"model:workflow.activity,name:purchase_activity_waiting_invoice_shipment"
+msgid "Waiting Invoice Shipment"
+msgstr "Rechnung Lieferposten Wartend"
+
+msgctxt "model:workflow.activity,name:purchase_activity_waiting_shipment"
+msgid "Waiting Shipment"
+msgstr "Lieferposten Wartend"
+
+msgctxt "odt:purchase.purchase:0"
+msgid "Amount"
+msgstr "Betrag"
+
+msgctxt "odt:purchase.purchase:0"
+msgid "Date:"
+msgstr "Datum:"
+
+msgctxt "odt:purchase.purchase:0"
+msgid "Description"
+msgstr "Bezeichnung"
+
+msgctxt "odt:purchase.purchase:0"
+msgid "Description:"
+msgstr "Bezeichnung:"
+
+msgctxt "odt:purchase.purchase:0"
+msgid "Draft Purchase Order"
+msgstr "Auftrag (Entwurf)"
+
+msgctxt "odt:purchase.purchase:0"
+msgid "E-Mail:"
+msgstr "E-Mail:"
+
+msgctxt "odt:purchase.purchase:0"
+msgid "Phone:"
+msgstr "Telefon:"
+
+msgctxt "odt:purchase.purchase:0"
+msgid "Purchase Order N°:"
+msgstr "Auftrag Nr. "
+
+msgctxt "odt:purchase.purchase:0"
+msgid "Quantity"
+msgstr "Anzahl"
+
+msgctxt "odt:purchase.purchase:0"
+msgid "Request for Quotation N°:"
+msgstr "Angebotsanfrage Nr.:"
+
+msgctxt "odt:purchase.purchase:0"
+msgid "Taxes"
+msgstr "Steuern"
+
+msgctxt "odt:purchase.purchase:0"
+msgid "Taxes:"
+msgstr "Steuern:"
+
+msgctxt "odt:purchase.purchase:0"
+msgid "Total (excl. taxes):"
+msgstr "Netto:"
+
+msgctxt "odt:purchase.purchase:0"
+msgid "Total:"
+msgstr "Gesamt:"
+
+msgctxt "odt:purchase.purchase:0"
+msgid "Unit Price"
+msgstr "Einzelpreis"
+
+msgctxt "odt:purchase.purchase:0"
+msgid "VAT Number:"
+msgstr "USt-ID-Nr.:"
+
+msgctxt "odt:purchase.purchase:0"
+msgid "VAT:"
+msgstr "USt.:"
+
+msgctxt "selection:account.invoice,purchase_exception_state:0"
+msgid ""
+msgstr ""
+
+msgctxt "selection:account.invoice,purchase_exception_state:0"
+msgid "Ignored"
+msgstr "Ignoriert"
+
+msgctxt "selection:account.invoice,purchase_exception_state:0"
+msgid "Recreated"
+msgstr "Nachgebildet"
+
+msgctxt "selection:purchase.configuration,purchase_invoice_method:0"
+msgid "Based On Order"
+msgstr "Bei Beauftragung"
+
+msgctxt "selection:purchase.configuration,purchase_invoice_method:0"
+msgid "Based On Shipment"
+msgstr "Bei Lieferung"
+
+msgctxt "selection:purchase.configuration,purchase_invoice_method:0"
+msgid "Manual"
+msgstr "Manuell"
+
+msgctxt "selection:purchase.line,type:0"
+msgid "Comment"
+msgstr "Kommentar"
+
+msgctxt "selection:purchase.line,type:0"
+msgid "Line"
+msgstr "Position"
+
+msgctxt "selection:purchase.line,type:0"
+msgid "Subtotal"
+msgstr "Zwischensumme"
+
+msgctxt "selection:purchase.line,type:0"
+msgid "Title"
+msgstr "Überschrift"
+
+msgctxt "selection:purchase.purchase,invoice_method:0"
+msgid "Based On Order"
+msgstr "Bei Beauftragung"
+
+msgctxt "selection:purchase.purchase,invoice_method:0"
+msgid "Based On Shipment"
+msgstr "Bei Lieferung"
+
+msgctxt "selection:purchase.purchase,invoice_method:0"
+msgid "Manual"
+msgstr "Manuell"
+
+msgctxt "selection:purchase.purchase,invoice_state:0"
+msgid "Exception"
+msgstr "Vorbehalt"
+
+msgctxt "selection:purchase.purchase,invoice_state:0"
+msgid "None"
+msgstr "Kein"
+
+msgctxt "selection:purchase.purchase,invoice_state:0"
+msgid "Paid"
+msgstr "Bezahlt"
+
+msgctxt "selection:purchase.purchase,invoice_state:0"
+msgid "Waiting"
+msgstr "Wartend"
+
+msgctxt "selection:purchase.purchase,shipment_state:0"
+msgid "Exception"
+msgstr "Vorbehalt"
+
+msgctxt "selection:purchase.purchase,shipment_state:0"
+msgid "None"
+msgstr "Kein"
+
+msgctxt "selection:purchase.purchase,shipment_state:0"
+msgid "Received"
+msgstr "Erhalten"
+
+msgctxt "selection:purchase.purchase,shipment_state:0"
+msgid "Waiting"
+msgstr "Wartend"
+
+msgctxt "selection:purchase.purchase,state:0"
+msgid "Canceled"
+msgstr "Annulliert"
+
+msgctxt "selection:purchase.purchase,state:0"
+msgid "Confirmed"
+msgstr "Beauftragt"
+
+msgctxt "selection:purchase.purchase,state:0"
+msgid "Done"
+msgstr "Erledigt"
+
+msgctxt "selection:purchase.purchase,state:0"
+msgid "Draft"
+msgstr "Entwurf"
+
+msgctxt "selection:purchase.purchase,state:0"
+msgid "Quotation"
+msgstr "Angebot"
+
+msgctxt "selection:stock.move,purchase_exception_state:0"
+msgid ""
+msgstr ""
+
+msgctxt "selection:stock.move,purchase_exception_state:0"
+msgid "Ignored"
+msgstr "Ignoriert"
+
+msgctxt "selection:stock.move,purchase_exception_state:0"
+msgid "Recreated"
+msgstr "Nachgebildet"
+
+msgctxt "view:product.product:0"
+msgid "Product Suppliers"
+msgstr "Lieferanten"
+
+msgctxt "view:product.product:0"
+msgid "Suppliers"
+msgstr "Lieferanten"
+
+msgctxt "view:product.template:0"
+msgid "Product Suppliers"
+msgstr "Lieferanten"
+
+msgctxt "view:product.template:0"
+msgid "Suppliers"
+msgstr "Lieferanten"
+
+msgctxt "view:purchase.configuration:0"
+msgid "Purchase Configuration"
+msgstr "Einstellungen Einkauf"
+
+msgctxt "view:purchase.handle.invoice.exception.ask:0"
+msgid "Choose invoices to duplicate"
+msgstr "Auswahl Rechnungen für Duplizierung"
+
+msgctxt "view:purchase.handle.invoice.exception.ask:0"
+msgid "Choose invoices to recreate"
+msgstr "Rechnungen zum Nachbilden auswählen"
+
+msgctxt "view:purchase.handle.invoice.exception.ask:0"
+msgid "Handle Invoice Exception"
+msgstr "Rechnungsvorbehalt bearbeiten"
+
+msgctxt "view:purchase.handle.shipment.exception.ask:0"
+msgid "Choose move to duplicate"
+msgstr "Auswahl Bewegungen für Duplizierung"
+
+msgctxt "view:purchase.handle.shipment.exception.ask:0"
+msgid "Choose move to recreate"
+msgstr "Bewegungen zum Nachbilden auswählen"
+
+msgctxt "view:purchase.handle.shipment.exception.ask:0"
+msgid "Choose moves to recreate"
+msgstr "Auswahl Bewegungen zur Nachbildung"
+
+msgctxt "view:purchase.handle.shipment.exception.ask:0"
+msgid "Duplicate Moves"
+msgstr "Bewegungen duplizieren"
+
+msgctxt "view:purchase.handle.shipment.exception.ask:0"
+msgid "Handle shipment Exception"
+msgstr "Liefervorbehalt bearbeiten"
+
+msgctxt "view:purchase.handle.shipment.exception.ask:0"
+msgid "Recreated Moves"
+msgstr "Nachgebildete Bewegungen"
+
+msgctxt "view:purchase.line:0"
+msgid "General"
+msgstr "Allgemein"
+
+msgctxt "view:purchase.line:0"
+msgid "Notes"
+msgstr "Notizen"
+
+msgctxt "view:purchase.line:0"
+msgid "Products"
+msgstr "Artikel"
+
+msgctxt "view:purchase.line:0"
+msgid "Purchase Line"
+msgstr "Position Einkauf"
+
+msgctxt "view:purchase.line:0"
+msgid "Purchase Lines"
+msgstr "Positionen Einkauf"
+
+msgctxt "view:purchase.product_supplier.price:0"
+msgid "Product Supplier Price"
+msgstr "Einkaufspreis"
+
+msgctxt "view:purchase.product_supplier.price:0"
+msgid "Product Supplier Prices"
+msgstr "Einkaufspreise"
+
+msgctxt "view:purchase.product_supplier:0"
+msgid "Product Supplier"
+msgstr "Lieferant"
+
+msgctxt "view:purchase.product_supplier:0"
+msgid "Product Suppliers"
+msgstr "Lieferanten"
+
+msgctxt "view:purchase.purchase:0"
+msgid "Cancel"
+msgstr "Annullieren"
+
+msgctxt "view:purchase.purchase:0"
+msgid "Confirm"
+msgstr "Beauftragen"
+
+msgctxt "view:purchase.purchase:0"
+msgid "Draft"
+msgstr "Entwurf"
+
+msgctxt "view:purchase.purchase:0"
+msgid "Handle Invoice Exception"
+msgstr "Rechnungsvorbehalt bearbeiten"
+
+msgctxt "view:purchase.purchase:0"
+msgid "Handle Shipment Exception"
+msgstr "Liefervorbehalt bearbeiten"
+
+msgctxt "view:purchase.purchase:0"
+msgid "Ignore Invoice Exception"
+msgstr "Rechnungsvorbehalt ignorieren"
+
+msgctxt "view:purchase.purchase:0"
+msgid "Invoices"
+msgstr "Rechnungen"
+
+msgctxt "view:purchase.purchase:0"
+msgid "Lines"
+msgstr "Positionen"
+
+msgctxt "view:purchase.purchase:0"
+msgid "Moves"
+msgstr "Bewegungen"
+
+msgctxt "view:purchase.purchase:0"
+msgid "Other Info"
+msgstr "Sonstiges"
+
+msgctxt "view:purchase.purchase:0"
+msgid "Purchase"
+msgstr "Einkauf"
+
+msgctxt "view:purchase.purchase:0"
+msgid "Purchases"
+msgstr "Einkäufe"
+
+msgctxt "view:purchase.purchase:0"
+msgid "Quotation"
+msgstr "Angebot"
+
+msgctxt "view:purchase.purchase:0"
+msgid "Shipments"
+msgstr "Lieferposten"
+
+msgctxt "wizard_button:purchase.handle.invoice.exception,init,end:0"
+msgid "Cancel"
+msgstr "Abbrechen"
+
+msgctxt "wizard_button:purchase.handle.invoice.exception,init,ok:0"
+msgid "Ok"
+msgstr "OK"
+
+msgctxt "wizard_button:purchase.handle.shipment.exception,init,end:0"
+msgid "Cancel"
+msgstr "Abbrechen"
+
+msgctxt "wizard_button:purchase.handle.shipment.exception,init,ok:0"
+msgid "Ok"
+msgstr "OK"
diff --git a/locale/es_CO.po b/locale/es_CO.po
new file mode 100644
index 0000000..0d56658
--- /dev/null
+++ b/locale/es_CO.po
@@ -0,0 +1,1066 @@
+# 
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "error:account.invoice:0"
+msgid "You can not delete invoices that come from a purchase!"
+msgstr "¡No puede borrar facturas que vienen de una compra!"
+
+msgctxt "error:account.invoice:0"
+msgid "You cannot reset to draft an invoice generated by a purchase."
+msgstr "No puede regresar a borrador una factura generada por una compra."
+
+msgctxt "error:product.template:0"
+msgid ""
+"Purchase prices are based on the purchase uom, are you sure to change it?"
+msgstr ""
+"Los precios de compra están basados en la UdM de compra,¿desea cambiarlo?"
+
+msgctxt "error:purchase.line:0"
+msgid "It misses an \"Account Expense\" on product \"%s\"!"
+msgstr "¡Hace falta una \"Cuenta de Gasto\" del producto \"%s\"!"
+
+msgctxt "error:purchase.line:0"
+msgid "It misses an \"account expense\" default property!"
+msgstr "¡Hace falta una propiedad predeterminada de \"cuenta de gastos\"!"
+
+msgctxt "error:purchase.line:0"
+msgid "The supplier location is required!"
+msgstr "¡Se requiere el lugar del proveedor!"
+
+msgctxt "error:purchase.purchase:0"
+msgid "Invoice addresses must be defined for the quotation."
+msgstr "Debe definir las direcciones para la cotización."
+
+msgctxt "error:purchase.purchase:0"
+msgid "It misses an \"Account Payable\" on the party \"%s\"!"
+msgstr "¡Al tercero le hace falta una \"Cuenta de Pagos\"!"
+
+msgctxt "error:stock.shipment.in:0"
+msgid "You cannot reset to draft a move generated by a purchase."
+msgstr "No puede revertir a borrador un movimiento generado por una compra."
+
+msgctxt "field:account.invoice,purchase_exception_state:0"
+msgid "Exception State"
+msgstr "Estado Excepción"
+
+#, fuzzy
+msgctxt "field:account.invoice,purchases:0"
+msgid "Purchases"
+msgstr "Compras"
+
+#, fuzzy
+msgctxt "field:account.invoice.line,purchase_lines:0"
+msgid "Purchase Lines"
+msgstr "Líneas de Compra"
+
+msgctxt "field:product.template,product_suppliers:0"
+msgid "Suppliers"
+msgstr "Proveedores"
+
+msgctxt "field:product.template,purchasable:0"
+msgid "Purchasable"
+msgstr "Comprable"
+
+msgctxt "field:product.template,purchase_uom:0"
+msgid "Purchase UOM"
+msgstr "UdM de Compra"
+
+#, fuzzy
+msgctxt "field:purchase.configuration,purchase_invoice_method:0"
+msgid "Invoice Method"
+msgstr "Método de Facturación"
+
+msgctxt "field:purchase.configuration,purchase_sequence:0"
+msgid "Purchase Reference Sequence"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:purchase.configuration,rec_name:0"
+msgid "Name"
+msgstr "Nombre de Contacto"
+
+msgctxt "field:purchase.handle.invoice.exception.ask,domain_invoices:0"
+msgid "Domain Invoices"
+msgstr "Rango de facturas"
+
+msgctxt "field:purchase.handle.invoice.exception.ask,recreate_invoices:0"
+msgid "Recreate Invoices"
+msgstr "Rehacer facturas"
+
+msgctxt "field:purchase.handle.shipment.exception.ask,domain_moves:0"
+msgid "Domain Moves"
+msgstr "Rango de movimientos"
+
+msgctxt "field:purchase.handle.shipment.exception.ask,recreate_moves:0"
+msgid "Recreate Moves"
+msgstr "Rehacer movimientos"
+
+msgctxt "field:purchase.line,amount:0"
+msgid "Amount"
+msgstr "Cantidad"
+
+msgctxt "field:purchase.line,description:0"
+msgid "Description"
+msgstr "Descripción"
+
+msgctxt "field:purchase.line,invoice_lines:0"
+msgid "Invoice Lines"
+msgstr "Líneas de Factura"
+
+msgctxt "field:purchase.line,move_done:0"
+msgid "Moves Done"
+msgstr "Movimientos Hechos"
+
+msgctxt "field:purchase.line,move_exception:0"
+msgid "Moves Exception"
+msgstr "Exepción de Movimientos"
+
+msgctxt "field:purchase.line,moves:0"
+msgid "Moves"
+msgstr "Movimientos"
+
+msgctxt "field:purchase.line,moves_ignored:0"
+msgid "Ignored Moves"
+msgstr "Movimientos Ignorados"
+
+msgctxt "field:purchase.line,moves_recreated:0"
+msgid "Recreated Moves"
+msgstr "Movimientos recreados"
+
+msgctxt "field:purchase.line,note:0"
+msgid "Note"
+msgstr "Nota"
+
+msgctxt "field:purchase.line,product:0"
+msgid "Product"
+msgstr "Producto"
+
+msgctxt "field:purchase.line,purchase:0"
+msgid "Purchase"
+msgstr "Compra"
+
+msgctxt "field:purchase.line,quantity:0"
+msgid "Quantity"
+msgstr "Cantidad"
+
+msgctxt "field:purchase.line,rec_name:0"
+msgid "Name"
+msgstr "Nombre"
+
+msgctxt "field:purchase.line,sequence:0"
+msgid "Sequence"
+msgstr "Secuencia"
+
+msgctxt "field:purchase.line,taxes:0"
+msgid "Taxes"
+msgstr "Impuestos"
+
+msgctxt "field:purchase.line,type:0"
+msgid "Type"
+msgstr "Tipo"
+
+msgctxt "field:purchase.line,unit:0"
+msgid "Unit"
+msgstr "Unidad"
+
+msgctxt "field:purchase.line,unit_digits:0"
+msgid "Unit Digits"
+msgstr "Dígitos Unitarios"
+
+msgctxt "field:purchase.line,unit_price:0"
+msgid "Unit Price"
+msgstr "Precio Unitario"
+
+msgctxt "field:purchase.line-account.invoice.line,invoice_line:0"
+msgid "Invoice Line"
+msgstr "Línea de Factura"
+
+msgctxt "field:purchase.line-account.invoice.line,purchase_line:0"
+msgid "Purchase Line"
+msgstr "Línea de Compra"
+
+msgctxt "field:purchase.line-account.invoice.line,rec_name:0"
+msgid "Name"
+msgstr "Nombre"
+
+msgctxt "field:purchase.line-account.tax,line:0"
+msgid "Purchase Line"
+msgstr "Línea de Compra"
+
+msgctxt "field:purchase.line-account.tax,rec_name:0"
+msgid "Name"
+msgstr "Nombre"
+
+msgctxt "field:purchase.line-account.tax,tax:0"
+msgid "Tax"
+msgstr "Impuesto"
+
+msgctxt "field:purchase.line-ignored-stock.move,move:0"
+msgid "Move"
+msgstr "Movimiento"
+
+msgctxt "field:purchase.line-ignored-stock.move,purchase_line:0"
+msgid "Purchase Line"
+msgstr "Línea de Compra"
+
+msgctxt "field:purchase.line-ignored-stock.move,rec_name:0"
+msgid "Name"
+msgstr "Nombre"
+
+msgctxt "field:purchase.line-recreated-stock.move,move:0"
+msgid "Move"
+msgstr "Movimiento"
+
+msgctxt "field:purchase.line-recreated-stock.move,purchase_line:0"
+msgid "Purchase Line"
+msgstr "Línea de Compra"
+
+msgctxt "field:purchase.line-recreated-stock.move,rec_name:0"
+msgid "Name"
+msgstr "Nombre"
+
+msgctxt "field:purchase.product_supplier,code:0"
+msgid "Code"
+msgstr "Código"
+
+msgctxt "field:purchase.product_supplier,company:0"
+msgid "Company"
+msgstr "Compañía"
+
+msgctxt "field:purchase.product_supplier,delivery_time:0"
+msgid "Delivery Time"
+msgstr "Tiempo de Envío"
+
+msgctxt "field:purchase.product_supplier,name:0"
+msgid "Name"
+msgstr "Nombre"
+
+msgctxt "field:purchase.product_supplier,party:0"
+msgid "Supplier"
+msgstr "Proveedor"
+
+msgctxt "field:purchase.product_supplier,prices:0"
+msgid "Prices"
+msgstr "Precios"
+
+msgctxt "field:purchase.product_supplier,product:0"
+msgid "Product"
+msgstr "Producto"
+
+msgctxt "field:purchase.product_supplier,rec_name:0"
+msgid "Name"
+msgstr "Nombre"
+
+msgctxt "field:purchase.product_supplier,sequence:0"
+msgid "Sequence"
+msgstr "Secuencia"
+
+msgctxt "field:purchase.product_supplier.price,product_supplier:0"
+msgid "Supplier"
+msgstr "Proveedor"
+
+msgctxt "field:purchase.product_supplier.price,quantity:0"
+msgid "Quantity"
+msgstr "Cantidad"
+
+msgctxt "field:purchase.product_supplier.price,rec_name:0"
+msgid "Name"
+msgstr "Nombre"
+
+msgctxt "field:purchase.product_supplier.price,unit_price:0"
+msgid "Unit Price"
+msgstr "Precio Unitario"
+
+msgctxt "field:purchase.purchase,comment:0"
+msgid "Comment"
+msgstr "Comentario"
+
+msgctxt "field:purchase.purchase,company:0"
+msgid "Company"
+msgstr "Compañía"
+
+msgctxt "field:purchase.purchase,currency:0"
+msgid "Currency"
+msgstr "Moneda"
+
+msgctxt "field:purchase.purchase,currency_digits:0"
+msgid "Currency Digits"
+msgstr "Dígitos de Moneda"
+
+msgctxt "field:purchase.purchase,description:0"
+msgid "Description"
+msgstr "Descripción"
+
+msgctxt "field:purchase.purchase,invoice_address:0"
+msgid "Invoice Address"
+msgstr "Dirección de Facturación"
+
+msgctxt "field:purchase.purchase,invoice_exception:0"
+msgid "Invoices Exception"
+msgstr "Excepción de Facturación"
+
+msgctxt "field:purchase.purchase,invoice_method:0"
+msgid "Invoice Method"
+msgstr "Método de Facturación"
+
+msgctxt "field:purchase.purchase,invoice_paid:0"
+msgid "Invoices Paid"
+msgstr "Facturas Pagadas"
+
+msgctxt "field:purchase.purchase,invoice_state:0"
+msgid "Invoice State"
+msgstr "Estado de Factura"
+
+msgctxt "field:purchase.purchase,invoices:0"
+msgid "Invoices"
+msgstr "Facturas"
+
+msgctxt "field:purchase.purchase,invoices_ignored:0"
+msgid "Ignored Invoices"
+msgstr "Facturas Ignoradas"
+
+msgctxt "field:purchase.purchase,invoices_recreated:0"
+msgid "Recreated Invoices"
+msgstr "Facturas recreadas"
+
+msgctxt "field:purchase.purchase,lines:0"
+msgid "Lines"
+msgstr "Líneas"
+
+msgctxt "field:purchase.purchase,moves:0"
+msgid "Moves"
+msgstr "Movimientos"
+
+msgctxt "field:purchase.purchase,party:0"
+msgid "Party"
+msgstr "Terceros"
+
+msgctxt "field:purchase.purchase,party_lang:0"
+msgid "Party Language"
+msgstr "Idioma del Tercero"
+
+msgctxt "field:purchase.purchase,payment_term:0"
+msgid "Payment Term"
+msgstr "Término de Pago"
+
+msgctxt "field:purchase.purchase,purchase_date:0"
+msgid "Purchase Date"
+msgstr "Fecha de Compra"
+
+msgctxt "field:purchase.purchase,rec_name:0"
+msgid "Name"
+msgstr "Nombre"
+
+msgctxt "field:purchase.purchase,reference:0"
+msgid "Reference"
+msgstr "Referencia"
+
+msgctxt "field:purchase.purchase,shipment_done:0"
+msgid "Shipment Done"
+msgstr "Envío Finalizado"
+
+msgctxt "field:purchase.purchase,shipment_exception:0"
+msgid "Shipments Exception"
+msgstr "Excepción de Envío"
+
+msgctxt "field:purchase.purchase,shipment_state:0"
+msgid "Shipment State"
+msgstr "Estado de Envío"
+
+msgctxt "field:purchase.purchase,shipments:0"
+msgid "Shipments"
+msgstr "Envíos"
+
+msgctxt "field:purchase.purchase,state:0"
+msgid "State"
+msgstr "Estado"
+
+msgctxt "field:purchase.purchase,supplier_reference:0"
+msgid "Supplier Reference"
+msgstr "Referencia de Proveedor"
+
+msgctxt "field:purchase.purchase,tax_amount:0"
+msgid "Tax"
+msgstr "Impuesto"
+
+msgctxt "field:purchase.purchase,total_amount:0"
+msgid "Total"
+msgstr "Total"
+
+msgctxt "field:purchase.purchase,untaxed_amount:0"
+msgid "Untaxed"
+msgstr "Sin Impuesto"
+
+msgctxt "field:purchase.purchase,warehouse:0"
+msgid "Warehouse"
+msgstr "Depósito"
+
+msgctxt "field:purchase.purchase-account.invoice,invoice:0"
+msgid "Invoice"
+msgstr "Factura"
+
+msgctxt "field:purchase.purchase-account.invoice,purchase:0"
+msgid "Purchase"
+msgstr "Compra"
+
+msgctxt "field:purchase.purchase-account.invoice,rec_name:0"
+msgid "Name"
+msgstr "Nombre"
+
+msgctxt "field:purchase.purchase-ignored-account.invoice,invoice:0"
+msgid "Invoice"
+msgstr "Factura"
+
+msgctxt "field:purchase.purchase-ignored-account.invoice,purchase:0"
+msgid "Purchase"
+msgstr "Compra"
+
+msgctxt "field:purchase.purchase-ignored-account.invoice,rec_name:0"
+msgid "Name"
+msgstr "Nombre"
+
+msgctxt "field:purchase.purchase-recreated-account.invoice,invoice:0"
+msgid "Invoice"
+msgstr "Factura"
+
+msgctxt "field:purchase.purchase-recreated-account.invoice,purchase:0"
+msgid "Purchase"
+msgstr "Compra"
+
+msgctxt "field:purchase.purchase-recreated-account.invoice,rec_name:0"
+msgid "Name"
+msgstr "Nombre"
+
+msgctxt "field:stock.move,purchase:0"
+msgid "Purchase"
+msgstr "Compra"
+
+msgctxt "field:stock.move,purchase_currency:0"
+msgid "Purchase Currency"
+msgstr "Moneda de Compra"
+
+msgctxt "field:stock.move,purchase_exception_state:0"
+msgid "Exception State"
+msgstr "Estado Excepción"
+
+#, fuzzy
+msgctxt "field:stock.move,purchase_line:0"
+msgid "Purchase Line"
+msgstr "Línea de Compra"
+
+msgctxt "field:stock.move,purchase_quantity:0"
+msgid "Purchase Quantity"
+msgstr "Cantidad de Compra"
+
+msgctxt "field:stock.move,purchase_unit:0"
+msgid "Purchase Unit"
+msgstr "Unidad de Compra"
+
+msgctxt "field:stock.move,purchase_unit_digits:0"
+msgid "Purchase Unit Digits"
+msgstr "Dígitos de Unidad de Compra"
+
+msgctxt "field:stock.move,purchase_unit_price:0"
+msgid "Purchase Unit Price"
+msgstr "Precio Unitario de Compra"
+
+msgctxt "field:stock.move,purchase_visible:0"
+msgid "Purchase Visible"
+msgstr ""
+
+msgctxt "field:stock.move,supplier:0"
+msgid "Supplier"
+msgstr "Proveedor"
+
+msgctxt "help:purchase.handle.invoice.exception.ask,recreate_invoices:0"
+msgid ""
+"The selected invoices will be recreated. The other ones will be ignored."
+msgstr "La factura seleccionada será recreada. Las otras serán ignoradas."
+
+msgctxt "help:purchase.handle.shipment.exception.ask,recreate_moves:0"
+msgid "The selected moves will be recreated. The other ones will be ignored."
+msgstr "Se recrearán los movimientos seleccionados. Los demás se ignorarán."
+
+msgctxt "help:purchase.product_supplier,delivery_time:0"
+msgid "In number of days"
+msgstr "En número de días"
+
+msgctxt "help:purchase.product_supplier.price,quantity:0"
+msgid "Minimal quantity"
+msgstr "Cantidad Mínima"
+
+msgctxt "model:ir.action,name:act_invoice_form"
+msgid "Invoices"
+msgstr "Facturas"
+
+msgctxt "model:ir.action,name:act_open_supplier"
+msgid "Parties associated to Purchases"
+msgstr "Terceros Asociados a Compras"
+
+msgctxt "model:ir.action,name:act_purchase_configuration_form"
+msgid "Purchase Configuration"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_purchase_form"
+msgid "Purchases"
+msgstr "Compras"
+
+msgctxt "model:ir.action,name:act_purchase_form2"
+msgid "Purchases"
+msgstr "Compras"
+
+msgctxt "model:ir.action,name:act_purchase_form_confirmed"
+msgid "Confirmed Purchases"
+msgstr "Compras confirmadas"
+
+msgctxt "model:ir.action,name:act_purchase_form_draft"
+msgid "Draft Purchases"
+msgstr "Compras en Borrador"
+
+msgctxt "model:ir.action,name:act_purchase_form_quotation"
+msgid "Purchases in Quotation"
+msgstr "Cotizaciones de Compras"
+
+msgctxt "model:ir.action,name:act_shipment_form"
+msgid "Shipments"
+msgstr "Envíos"
+
+msgctxt "model:ir.action,name:report_purchase"
+msgid "Purchase"
+msgstr "Compra"
+
+msgctxt "model:ir.action,name:wizard_invoice_handle_exception"
+msgid "Handle Invoice Exception"
+msgstr "Tratar Excepción de Factura"
+
+msgctxt "model:ir.action,name:wizard_shipment_handle_exception"
+msgid "Handle Shipment Exception"
+msgstr "Tratar Excepción de Envío"
+
+msgctxt "model:ir.sequence,name:sequence_purchase"
+msgid "Purchase"
+msgstr "Compras"
+
+msgctxt "model:ir.sequence.type,name:sequence_type_purchase"
+msgid "Purchase"
+msgstr "Compras"
+
+msgctxt "model:ir.ui.menu,name:menu_configuration"
+msgid "Configuration"
+msgstr "Configuración"
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_purchase"
+msgid "Purchase"
+msgstr "Gestión de Compras"
+
+msgctxt "model:ir.ui.menu,name:menu_purchase_configuration"
+msgid "Purchase Configuration"
+msgstr ""
+
+msgctxt "model:ir.ui.menu,name:menu_purchase_form"
+msgid "Purchases"
+msgstr "Compras"
+
+msgctxt "model:ir.ui.menu,name:menu_purchase_form_confirmed"
+msgid "Confirmed Purchases"
+msgstr "Compras confirmadas"
+
+msgctxt "model:ir.ui.menu,name:menu_purchase_form_draft"
+msgid "Draft Purchases"
+msgstr "Compras en Borrador"
+
+msgctxt "model:ir.ui.menu,name:menu_purchase_form_quotation"
+msgid "Purchases in Quotation"
+msgstr "Cotizaciones de Compras"
+
+msgctxt "model:ir.ui.menu,name:menu_reporting"
+msgid "Reporting"
+msgstr "Reportes"
+
+msgctxt "model:ir.ui.menu,name:menu_supplier"
+msgid "Parties associated to Purchases"
+msgstr "Terceros Asociados a Compras"
+
+msgctxt "model:purchase.configuration,name:0"
+msgid "Purchase Configuration"
+msgstr ""
+
+msgctxt "model:purchase.handle.invoice.exception.ask,name:0"
+msgid "Invoice Exception Ask"
+msgstr "Pregunta de Excepción de Factura"
+
+msgctxt "model:purchase.handle.shipment.exception.ask,name:0"
+msgid "Shipment Exception Ask"
+msgstr "Preguntar Excepción de Envío"
+
+msgctxt "model:purchase.line,name:0"
+msgid "Purchase Line"
+msgstr "Línea de Compra"
+
+msgctxt "model:purchase.line-account.invoice.line,name:0"
+msgid "Purchase Line - Invoice Line"
+msgstr "Línea de Compra - Línea de Factura"
+
+msgctxt "model:purchase.line-account.tax,name:0"
+msgid "Purchase Line - Tax"
+msgstr "Línea de Compra - Impuesto"
+
+msgctxt "model:purchase.line-ignored-stock.move,name:0"
+msgid "Purchase Line - Ignored Move"
+msgstr "Línea de Compra - Movimiento Ignorado"
+
+msgctxt "model:purchase.line-recreated-stock.move,name:0"
+msgid "Purchase Line - Ignored Move"
+msgstr "Línea de Compra - Movimiento Ignorado"
+
+msgctxt "model:purchase.product_supplier,name:0"
+msgid "Product Supplier"
+msgstr "Proveedor de Producto"
+
+msgctxt "model:purchase.product_supplier.price,name:0"
+msgid "Product Supplier Price"
+msgstr "Precio del Proveedor de Producto"
+
+msgctxt "model:purchase.purchase,name:0"
+msgid "Purchase"
+msgstr "Compra"
+
+msgctxt "model:purchase.purchase-account.invoice,name:0"
+msgid "Purchase - Invoice"
+msgstr "Compra - Factura"
+
+msgctxt "model:purchase.purchase-ignored-account.invoice,name:0"
+msgid "Purchase - Ignored Invoice"
+msgstr "Compra - Factura Ignorada"
+
+msgctxt "model:purchase.purchase-recreated-account.invoice,name:0"
+msgid "Purchase - Recreated Invoice"
+msgstr "Compra - Factura Recreada"
+
+msgctxt "model:res.group,name:group_purchase"
+msgid "Purchase"
+msgstr "Compras"
+
+msgctxt "model:res.group,name:group_purchase_admin"
+msgid "Purchase Administrator"
+msgstr "Administrador de Compra"
+
+msgctxt "model:workflow,name:purchase_workflow"
+msgid "Purchase workflow"
+msgstr "Flujo de Trabajo de Compras"
+
+msgctxt "model:workflow.activity,name:purchase_activity_cancel"
+msgid "Canceled"
+msgstr "Cancelado"
+
+msgctxt "model:workflow.activity,name:purchase_activity_confirmed"
+msgid "Confirmed"
+msgstr "Confirmado"
+
+msgctxt "model:workflow.activity,name:purchase_activity_done"
+msgid "Done"
+msgstr "Hecho"
+
+msgctxt "model:workflow.activity,name:purchase_activity_draft"
+msgid "Draft"
+msgstr "Borrador"
+
+msgctxt "model:workflow.activity,name:purchase_activity_invoice_done"
+msgid "Invoice Done"
+msgstr "Factura Completa"
+
+msgctxt "model:workflow.activity,name:purchase_activity_invoice_method"
+msgid "Invoice Method"
+msgstr "Método de Facturación"
+
+msgctxt "model:workflow.activity,name:purchase_activity_invoice_method_done"
+msgid "Invoice Method Done"
+msgstr "Método de Factura Completo"
+
+msgctxt ""
+"model:workflow.activity,name:purchase_activity_invoice_purchase_exception"
+msgid "Invoice Exception"
+msgstr "Excepción de Factura"
+
+msgctxt "model:workflow.activity,name:purchase_activity_invoice_shipment"
+msgid "Invoice Shipment"
+msgstr "Envío de Factura"
+
+msgctxt "model:workflow.activity,name:purchase_activity_invoice_shipment_done"
+msgid "Invoice Shipment Done"
+msgstr "Envío de Factura Completo"
+
+msgctxt ""
+"model:workflow.activity,name:purchase_activity_invoice_shipment_exception"
+msgid "Invoice Shipment Exception"
+msgstr "Excepción de Envío de Factura"
+
+msgctxt ""
+"model:workflow.activity,name:purchase_activity_invoice_shipment_method"
+msgid "Invoice Shipment Method"
+msgstr "Método de Envío de Factura"
+
+msgctxt ""
+"model:workflow.activity,name:purchase_activity_invoice_shipment_method_done"
+msgid "Invoice Shipment Method Done"
+msgstr "Método de Envío de Factura Completo"
+
+msgctxt "model:workflow.activity,name:purchase_activity_quotation"
+msgid "Quotation"
+msgstr "Cotización"
+
+msgctxt "model:workflow.activity,name:purchase_activity_shipment_exception"
+msgid "Shipment Exception"
+msgstr "Excepción de Envío"
+
+msgctxt ""
+"model:workflow.activity,name:purchase_activity_waiting_invoice_purchase"
+msgid "Waiting Invoice"
+msgstr "Esperando Factura"
+
+msgctxt ""
+"model:workflow.activity,name:purchase_activity_waiting_invoice_shipment"
+msgid "Waiting Invoice Shipment"
+msgstr "Esperando Envío de Factura"
+
+msgctxt "model:workflow.activity,name:purchase_activity_waiting_shipment"
+msgid "Waiting Shipment"
+msgstr "Esperando Envío"
+
+msgctxt "odt:purchase.purchase:0"
+msgid "Amount"
+msgstr "Cantidad"
+
+msgctxt "odt:purchase.purchase:0"
+msgid "Date:"
+msgstr "Fecha:"
+
+msgctxt "odt:purchase.purchase:0"
+msgid "Description"
+msgstr "Descripción"
+
+msgctxt "odt:purchase.purchase:0"
+msgid "Description:"
+msgstr "Descripción:"
+
+msgctxt "odt:purchase.purchase:0"
+msgid "Draft Purchase Order"
+msgstr "Borrador de Orden de Compra"
+
+msgctxt "odt:purchase.purchase:0"
+msgid "E-Mail:"
+msgstr "Correo electrónico:"
+
+msgctxt "odt:purchase.purchase:0"
+msgid "Phone:"
+msgstr "Teléfono:"
+
+msgctxt "odt:purchase.purchase:0"
+msgid "Purchase Order N°:"
+msgstr "Nº de Orden de Compra:"
+
+msgctxt "odt:purchase.purchase:0"
+msgid "Quantity"
+msgstr "Cantidad"
+
+msgctxt "odt:purchase.purchase:0"
+msgid "Request for Quotation N°:"
+msgstr "Solicitud de Factura Nº:"
+
+msgctxt "odt:purchase.purchase:0"
+msgid "Taxes"
+msgstr "Impuestos"
+
+msgctxt "odt:purchase.purchase:0"
+msgid "Taxes:"
+msgstr "Impuestos"
+
+msgctxt "odt:purchase.purchase:0"
+msgid "Total (excl. taxes):"
+msgstr "Total(excl. impuestos):"
+
+msgctxt "odt:purchase.purchase:0"
+msgid "Total:"
+msgstr "Total:"
+
+msgctxt "odt:purchase.purchase:0"
+msgid "Unit Price"
+msgstr "Precio Unitario"
+
+msgctxt "odt:purchase.purchase:0"
+msgid "VAT Number:"
+msgstr ""
+
+msgctxt "odt:purchase.purchase:0"
+msgid "VAT:"
+msgstr "NIT:"
+
+msgctxt "selection:account.invoice,purchase_exception_state:0"
+msgid ""
+msgstr ""
+
+msgctxt "selection:account.invoice,purchase_exception_state:0"
+msgid "Ignored"
+msgstr "Ignorado"
+
+msgctxt "selection:account.invoice,purchase_exception_state:0"
+msgid "Recreated"
+msgstr "Rehecho"
+
+#, fuzzy
+msgctxt "selection:purchase.configuration,purchase_invoice_method:0"
+msgid "Based On Order"
+msgstr "Basado en Orden"
+
+#, fuzzy
+msgctxt "selection:purchase.configuration,purchase_invoice_method:0"
+msgid "Based On Shipment"
+msgstr "Basado en Envío"
+
+#, fuzzy
+msgctxt "selection:purchase.configuration,purchase_invoice_method:0"
+msgid "Manual"
+msgstr "Manual"
+
+msgctxt "selection:purchase.line,type:0"
+msgid "Comment"
+msgstr "Comentario"
+
+msgctxt "selection:purchase.line,type:0"
+msgid "Line"
+msgstr "Línea"
+
+msgctxt "selection:purchase.line,type:0"
+msgid "Subtotal"
+msgstr "Subtotal"
+
+msgctxt "selection:purchase.line,type:0"
+msgid "Title"
+msgstr "Título"
+
+msgctxt "selection:purchase.purchase,invoice_method:0"
+msgid "Based On Order"
+msgstr "Basado en Orden"
+
+msgctxt "selection:purchase.purchase,invoice_method:0"
+msgid "Based On Shipment"
+msgstr "Basado en Envío"
+
+msgctxt "selection:purchase.purchase,invoice_method:0"
+msgid "Manual"
+msgstr "Manual"
+
+msgctxt "selection:purchase.purchase,invoice_state:0"
+msgid "Exception"
+msgstr "Excepción"
+
+msgctxt "selection:purchase.purchase,invoice_state:0"
+msgid "None"
+msgstr "Ninguno"
+
+msgctxt "selection:purchase.purchase,invoice_state:0"
+msgid "Paid"
+msgstr "Pagado"
+
+msgctxt "selection:purchase.purchase,invoice_state:0"
+msgid "Waiting"
+msgstr "En Espera"
+
+msgctxt "selection:purchase.purchase,shipment_state:0"
+msgid "Exception"
+msgstr "Excepción"
+
+msgctxt "selection:purchase.purchase,shipment_state:0"
+msgid "None"
+msgstr "Ninguno"
+
+msgctxt "selection:purchase.purchase,shipment_state:0"
+msgid "Received"
+msgstr "Recibido"
+
+msgctxt "selection:purchase.purchase,shipment_state:0"
+msgid "Waiting"
+msgstr "En Espera"
+
+msgctxt "selection:purchase.purchase,state:0"
+msgid "Canceled"
+msgstr "Cancelado"
+
+msgctxt "selection:purchase.purchase,state:0"
+msgid "Confirmed"
+msgstr "Confirmado"
+
+msgctxt "selection:purchase.purchase,state:0"
+msgid "Done"
+msgstr "Hecho"
+
+msgctxt "selection:purchase.purchase,state:0"
+msgid "Draft"
+msgstr "Borrador"
+
+msgctxt "selection:purchase.purchase,state:0"
+msgid "Quotation"
+msgstr "Cotización"
+
+msgctxt "selection:stock.move,purchase_exception_state:0"
+msgid ""
+msgstr ""
+
+msgctxt "selection:stock.move,purchase_exception_state:0"
+msgid "Ignored"
+msgstr "Ignorado"
+
+msgctxt "selection:stock.move,purchase_exception_state:0"
+msgid "Recreated"
+msgstr "Rehecho"
+
+msgctxt "view:product.product:0"
+msgid "Products"
+msgstr "Productos"
+
+msgctxt "view:product.product:0"
+msgid "Suppliers"
+msgstr "Proveedores"
+
+msgctxt "view:product.template:0"
+msgid "Product Suppliers"
+msgstr "Proveedores de Productos"
+
+msgctxt "view:product.template:0"
+msgid "Suppliers"
+msgstr "Proveedores"
+
+msgctxt "view:purchase.configuration:0"
+msgid "Purchase Configuration"
+msgstr ""
+
+msgctxt "view:purchase.handle.invoice.exception.ask:0"
+msgid "Choose invoices to recreate"
+msgstr "Escoja una factura a rehacer"
+
+msgctxt "view:purchase.handle.invoice.exception.ask:0"
+msgid "Handle Invoice Exception"
+msgstr "Manejar excepción de factura"
+
+#, fuzzy
+msgctxt "view:purchase.handle.shipment.exception.ask:0"
+msgid "Choose move to recreate"
+msgstr "Escoja un movimiento a rehacer"
+
+msgctxt "view:purchase.handle.shipment.exception.ask:0"
+msgid "Choose moves to recreate"
+msgstr "Elegir movimientos a recrear"
+
+msgctxt "view:purchase.handle.shipment.exception.ask:0"
+msgid "Handle shipment Exception"
+msgstr "Maneje Excepciones de envío"
+
+msgctxt "view:purchase.handle.shipment.exception.ask:0"
+msgid "Recreated Moves"
+msgstr "Movimientos recreados"
+
+msgctxt "view:purchase.line:0"
+msgid "General"
+msgstr "General"
+
+msgctxt "view:purchase.line:0"
+msgid "Notes"
+msgstr "Notas"
+
+msgctxt "view:purchase.line:0"
+msgid "Products"
+msgstr "Productos"
+
+msgctxt "view:purchase.line:0"
+msgid "Purchase Line"
+msgstr "Línea de Compra"
+
+msgctxt "view:purchase.line:0"
+msgid "Purchase Lines"
+msgstr "Líneas de Compra"
+
+msgctxt "view:purchase.product_supplier.price:0"
+msgid "Product Supplier Price"
+msgstr "Precio del Proveedor del Producto"
+
+msgctxt "view:purchase.product_supplier.price:0"
+msgid "Product Supplier Prices"
+msgstr "Precios del Proveedor del Producto"
+
+msgctxt "view:purchase.product_supplier:0"
+msgid "Product Supplier"
+msgstr "Proveedor del Producto"
+
+msgctxt "view:purchase.product_supplier:0"
+msgid "Product Suppliers"
+msgstr "Proveedores de Productos"
+
+msgctxt "view:purchase.purchase:0"
+msgid "Cancel"
+msgstr "Cancelar"
+
+msgctxt "view:purchase.purchase:0"
+msgid "Confirm"
+msgstr "Confirmar"
+
+msgctxt "view:purchase.purchase:0"
+msgid "Draft"
+msgstr "Borrador"
+
+msgctxt "view:purchase.purchase:0"
+msgid "Handle Invoice Exception"
+msgstr "Manejar excepción de factura"
+
+msgctxt "view:purchase.purchase:0"
+msgid "Handle Shipment Exception"
+msgstr "Tratar Excepción de Envío"
+
+msgctxt "view:purchase.purchase:0"
+msgid "Invoices"
+msgstr "Facturas"
+
+msgctxt "view:purchase.purchase:0"
+msgid "Lines"
+msgstr "Líneas"
+
+msgctxt "view:purchase.purchase:0"
+msgid "Moves"
+msgstr "Movimientos"
+
+msgctxt "view:purchase.purchase:0"
+msgid "Other Info"
+msgstr "Información Adicional"
+
+msgctxt "view:purchase.purchase:0"
+msgid "Purchase"
+msgstr "Compra"
+
+msgctxt "view:purchase.purchase:0"
+msgid "Purchases"
+msgstr "Compras"
+
+msgctxt "view:purchase.purchase:0"
+msgid "Quotation"
+msgstr "Cotización"
+
+msgctxt "view:purchase.purchase:0"
+msgid "Shipments"
+msgstr "Envíos"
+
+msgctxt "wizard_button:purchase.handle.invoice.exception,init,end:0"
+msgid "Cancel"
+msgstr "Cancelar"
+
+msgctxt "wizard_button:purchase.handle.invoice.exception,init,ok:0"
+msgid "Ok"
+msgstr "Aceptar"
+
+msgctxt "wizard_button:purchase.handle.shipment.exception,init,end:0"
+msgid "Cancel"
+msgstr "Cancelar"
+
+msgctxt "wizard_button:purchase.handle.shipment.exception,init,ok:0"
+msgid "Ok"
+msgstr "Aceptar"
diff --git a/locale/es_ES.po b/locale/es_ES.po
new file mode 100644
index 0000000..68a7538
--- /dev/null
+++ b/locale/es_ES.po
@@ -0,0 +1,1067 @@
+# 
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "error:account.invoice:0"
+msgid "You can not delete invoices that come from a purchase!"
+msgstr "No puede borrar facturas que vienen de una compra"
+
+msgctxt "error:account.invoice:0"
+msgid "You cannot reset to draft an invoice generated by a purchase."
+msgstr "No puede cambiar a borrador una factura generada por una compra."
+
+msgctxt "error:product.template:0"
+msgid ""
+"Purchase prices are based on the purchase uom, are you sure to change it?"
+msgstr ""
+"Los precios de compra están basados en la UdM de compra, ¿desea cambiarlo?"
+
+msgctxt "error:purchase.line:0"
+msgid "It misses an \"Account Expense\" on product \"%s\"!"
+msgstr "Hace falta una «Cuenta de gasto» del producto «%s»"
+
+msgctxt "error:purchase.line:0"
+msgid "It misses an \"account expense\" default property!"
+msgstr "Hace falta la propiedad predeterminada de «cuenta de gastos»"
+
+msgctxt "error:purchase.line:0"
+msgid "The supplier location is required!"
+msgstr "Se necesita la ubicación del proveedor"
+
+msgctxt "error:purchase.purchase:0"
+msgid "Invoice addresses must be defined for the quotation."
+msgstr "Debe definir las direcciones para la cotización."
+
+msgctxt "error:purchase.purchase:0"
+msgid "It misses an \"Account Payable\" on the party \"%s\"!"
+msgstr "Al tercero «%s» le hace falta una «Cuenta de pagos»"
+
+msgctxt "error:stock.shipment.in:0"
+msgid "You cannot reset to draft a move generated by a purchase."
+msgstr ""
+"No puede restablecer a borrador un movimiento generado por una compra."
+
+msgctxt "field:account.invoice,purchase_exception_state:0"
+msgid "Exception State"
+msgstr "Estado excepción"
+
+#, fuzzy
+msgctxt "field:account.invoice,purchases:0"
+msgid "Purchases"
+msgstr "Compras"
+
+#, fuzzy
+msgctxt "field:account.invoice.line,purchase_lines:0"
+msgid "Purchase Lines"
+msgstr "Líneas de compra"
+
+msgctxt "field:product.template,product_suppliers:0"
+msgid "Suppliers"
+msgstr "Proveedores"
+
+msgctxt "field:product.template,purchasable:0"
+msgid "Purchasable"
+msgstr "Comprable"
+
+msgctxt "field:product.template,purchase_uom:0"
+msgid "Purchase UOM"
+msgstr "UdM de compra"
+
+#, fuzzy
+msgctxt "field:purchase.configuration,purchase_invoice_method:0"
+msgid "Invoice Method"
+msgstr "Método de facturación"
+
+msgctxt "field:purchase.configuration,purchase_sequence:0"
+msgid "Purchase Reference Sequence"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:purchase.configuration,rec_name:0"
+msgid "Name"
+msgstr "Nombre del campo"
+
+msgctxt "field:purchase.handle.invoice.exception.ask,domain_invoices:0"
+msgid "Domain Invoices"
+msgstr "Facturas de dominio"
+
+msgctxt "field:purchase.handle.invoice.exception.ask,recreate_invoices:0"
+msgid "Recreate Invoices"
+msgstr "Rehacer facturas"
+
+msgctxt "field:purchase.handle.shipment.exception.ask,domain_moves:0"
+msgid "Domain Moves"
+msgstr "Movimientos de dominio"
+
+msgctxt "field:purchase.handle.shipment.exception.ask,recreate_moves:0"
+msgid "Recreate Moves"
+msgstr "Rehacer movimientos"
+
+msgctxt "field:purchase.line,amount:0"
+msgid "Amount"
+msgstr "Cantidad"
+
+msgctxt "field:purchase.line,description:0"
+msgid "Description"
+msgstr "Descripción"
+
+msgctxt "field:purchase.line,invoice_lines:0"
+msgid "Invoice Lines"
+msgstr "Líneas de factura"
+
+msgctxt "field:purchase.line,move_done:0"
+msgid "Moves Done"
+msgstr "Movimientos terminados"
+
+msgctxt "field:purchase.line,move_exception:0"
+msgid "Moves Exception"
+msgstr "Exepción de movimientos"
+
+msgctxt "field:purchase.line,moves:0"
+msgid "Moves"
+msgstr "Movimientos"
+
+msgctxt "field:purchase.line,moves_ignored:0"
+msgid "Ignored Moves"
+msgstr "Movimientos ignorados"
+
+msgctxt "field:purchase.line,moves_recreated:0"
+msgid "Recreated Moves"
+msgstr "Rehacer movimientos"
+
+msgctxt "field:purchase.line,note:0"
+msgid "Note"
+msgstr "Nota"
+
+msgctxt "field:purchase.line,product:0"
+msgid "Product"
+msgstr "Producto"
+
+msgctxt "field:purchase.line,purchase:0"
+msgid "Purchase"
+msgstr "Compra"
+
+msgctxt "field:purchase.line,quantity:0"
+msgid "Quantity"
+msgstr "Cantidad"
+
+msgctxt "field:purchase.line,rec_name:0"
+msgid "Name"
+msgstr "Nombre"
+
+msgctxt "field:purchase.line,sequence:0"
+msgid "Sequence"
+msgstr "Secuencia"
+
+msgctxt "field:purchase.line,taxes:0"
+msgid "Taxes"
+msgstr "Impuestos"
+
+msgctxt "field:purchase.line,type:0"
+msgid "Type"
+msgstr "Tipo"
+
+msgctxt "field:purchase.line,unit:0"
+msgid "Unit"
+msgstr "Unidad"
+
+msgctxt "field:purchase.line,unit_digits:0"
+msgid "Unit Digits"
+msgstr "Dígitos unitarios"
+
+msgctxt "field:purchase.line,unit_price:0"
+msgid "Unit Price"
+msgstr "Precio unitario"
+
+msgctxt "field:purchase.line-account.invoice.line,invoice_line:0"
+msgid "Invoice Line"
+msgstr "Línea de factura"
+
+msgctxt "field:purchase.line-account.invoice.line,purchase_line:0"
+msgid "Purchase Line"
+msgstr "Línea de compra"
+
+msgctxt "field:purchase.line-account.invoice.line,rec_name:0"
+msgid "Name"
+msgstr "Nombre"
+
+msgctxt "field:purchase.line-account.tax,line:0"
+msgid "Purchase Line"
+msgstr "Línea de compra"
+
+msgctxt "field:purchase.line-account.tax,rec_name:0"
+msgid "Name"
+msgstr "Nombre"
+
+msgctxt "field:purchase.line-account.tax,tax:0"
+msgid "Tax"
+msgstr "Impuesto"
+
+msgctxt "field:purchase.line-ignored-stock.move,move:0"
+msgid "Move"
+msgstr "Movimiento"
+
+msgctxt "field:purchase.line-ignored-stock.move,purchase_line:0"
+msgid "Purchase Line"
+msgstr "Línea de compra"
+
+msgctxt "field:purchase.line-ignored-stock.move,rec_name:0"
+msgid "Name"
+msgstr "Nombre"
+
+msgctxt "field:purchase.line-recreated-stock.move,move:0"
+msgid "Move"
+msgstr "Movimiento"
+
+msgctxt "field:purchase.line-recreated-stock.move,purchase_line:0"
+msgid "Purchase Line"
+msgstr "Línea de compra"
+
+msgctxt "field:purchase.line-recreated-stock.move,rec_name:0"
+msgid "Name"
+msgstr "Nombre"
+
+msgctxt "field:purchase.product_supplier,code:0"
+msgid "Code"
+msgstr "Código"
+
+msgctxt "field:purchase.product_supplier,company:0"
+msgid "Company"
+msgstr "Compañía"
+
+msgctxt "field:purchase.product_supplier,delivery_time:0"
+msgid "Delivery Time"
+msgstr "Tiempo de envío"
+
+msgctxt "field:purchase.product_supplier,name:0"
+msgid "Name"
+msgstr "Nombre"
+
+msgctxt "field:purchase.product_supplier,party:0"
+msgid "Supplier"
+msgstr "Proveedor"
+
+msgctxt "field:purchase.product_supplier,prices:0"
+msgid "Prices"
+msgstr "Precios"
+
+msgctxt "field:purchase.product_supplier,product:0"
+msgid "Product"
+msgstr "Producto"
+
+msgctxt "field:purchase.product_supplier,rec_name:0"
+msgid "Name"
+msgstr "Nombre"
+
+msgctxt "field:purchase.product_supplier,sequence:0"
+msgid "Sequence"
+msgstr "Secuencia"
+
+msgctxt "field:purchase.product_supplier.price,product_supplier:0"
+msgid "Supplier"
+msgstr "Proveedor"
+
+msgctxt "field:purchase.product_supplier.price,quantity:0"
+msgid "Quantity"
+msgstr "Cantidad"
+
+msgctxt "field:purchase.product_supplier.price,rec_name:0"
+msgid "Name"
+msgstr "Nombre"
+
+msgctxt "field:purchase.product_supplier.price,unit_price:0"
+msgid "Unit Price"
+msgstr "Precio unitario"
+
+msgctxt "field:purchase.purchase,comment:0"
+msgid "Comment"
+msgstr "Comentario"
+
+msgctxt "field:purchase.purchase,company:0"
+msgid "Company"
+msgstr "Empresa"
+
+msgctxt "field:purchase.purchase,currency:0"
+msgid "Currency"
+msgstr "Divisa"
+
+msgctxt "field:purchase.purchase,currency_digits:0"
+msgid "Currency Digits"
+msgstr "Dígitos de la divisa"
+
+msgctxt "field:purchase.purchase,description:0"
+msgid "Description"
+msgstr "Descripción"
+
+msgctxt "field:purchase.purchase,invoice_address:0"
+msgid "Invoice Address"
+msgstr "Dirección de facturación"
+
+msgctxt "field:purchase.purchase,invoice_exception:0"
+msgid "Invoices Exception"
+msgstr "Excepción de facturaciones"
+
+msgctxt "field:purchase.purchase,invoice_method:0"
+msgid "Invoice Method"
+msgstr "Método de facturación"
+
+msgctxt "field:purchase.purchase,invoice_paid:0"
+msgid "Invoices Paid"
+msgstr "Facturas pagadas"
+
+msgctxt "field:purchase.purchase,invoice_state:0"
+msgid "Invoice State"
+msgstr "Estado de factura"
+
+msgctxt "field:purchase.purchase,invoices:0"
+msgid "Invoices"
+msgstr "Facturas"
+
+msgctxt "field:purchase.purchase,invoices_ignored:0"
+msgid "Ignored Invoices"
+msgstr "Facturas ignoradas"
+
+msgctxt "field:purchase.purchase,invoices_recreated:0"
+msgid "Recreated Invoices"
+msgstr "Facturas recreadas"
+
+msgctxt "field:purchase.purchase,lines:0"
+msgid "Lines"
+msgstr "Líneas"
+
+msgctxt "field:purchase.purchase,moves:0"
+msgid "Moves"
+msgstr "Movimientos"
+
+msgctxt "field:purchase.purchase,party:0"
+msgid "Party"
+msgstr "Terceros"
+
+msgctxt "field:purchase.purchase,party_lang:0"
+msgid "Party Language"
+msgstr "Idioma del tercero"
+
+msgctxt "field:purchase.purchase,payment_term:0"
+msgid "Payment Term"
+msgstr "Término de pago"
+
+msgctxt "field:purchase.purchase,purchase_date:0"
+msgid "Purchase Date"
+msgstr "Fecha de compra"
+
+msgctxt "field:purchase.purchase,rec_name:0"
+msgid "Name"
+msgstr "Nombre"
+
+msgctxt "field:purchase.purchase,reference:0"
+msgid "Reference"
+msgstr "Referencia"
+
+msgctxt "field:purchase.purchase,shipment_done:0"
+msgid "Shipment Done"
+msgstr "Envío terminado"
+
+msgctxt "field:purchase.purchase,shipment_exception:0"
+msgid "Shipments Exception"
+msgstr "Excepción de envios"
+
+msgctxt "field:purchase.purchase,shipment_state:0"
+msgid "Shipment State"
+msgstr "Estado de envío"
+
+msgctxt "field:purchase.purchase,shipments:0"
+msgid "Shipments"
+msgstr "Envíos"
+
+msgctxt "field:purchase.purchase,state:0"
+msgid "State"
+msgstr "Estado"
+
+msgctxt "field:purchase.purchase,supplier_reference:0"
+msgid "Supplier Reference"
+msgstr "Referencia de proveedor"
+
+msgctxt "field:purchase.purchase,tax_amount:0"
+msgid "Tax"
+msgstr "Impuesto"
+
+msgctxt "field:purchase.purchase,total_amount:0"
+msgid "Total"
+msgstr "Total"
+
+msgctxt "field:purchase.purchase,untaxed_amount:0"
+msgid "Untaxed"
+msgstr "Sin impuesto"
+
+msgctxt "field:purchase.purchase,warehouse:0"
+msgid "Warehouse"
+msgstr "Almacén"
+
+msgctxt "field:purchase.purchase-account.invoice,invoice:0"
+msgid "Invoice"
+msgstr "Factura"
+
+msgctxt "field:purchase.purchase-account.invoice,purchase:0"
+msgid "Purchase"
+msgstr "Compra"
+
+msgctxt "field:purchase.purchase-account.invoice,rec_name:0"
+msgid "Name"
+msgstr "Nombre"
+
+msgctxt "field:purchase.purchase-ignored-account.invoice,invoice:0"
+msgid "Invoice"
+msgstr "Factura"
+
+msgctxt "field:purchase.purchase-ignored-account.invoice,purchase:0"
+msgid "Purchase"
+msgstr "Compra"
+
+msgctxt "field:purchase.purchase-ignored-account.invoice,rec_name:0"
+msgid "Name"
+msgstr "Nombre"
+
+msgctxt "field:purchase.purchase-recreated-account.invoice,invoice:0"
+msgid "Invoice"
+msgstr "Factura"
+
+msgctxt "field:purchase.purchase-recreated-account.invoice,purchase:0"
+msgid "Purchase"
+msgstr "Compra"
+
+msgctxt "field:purchase.purchase-recreated-account.invoice,rec_name:0"
+msgid "Name"
+msgstr "Nombre"
+
+msgctxt "field:stock.move,purchase:0"
+msgid "Purchase"
+msgstr "Compra"
+
+msgctxt "field:stock.move,purchase_currency:0"
+msgid "Purchase Currency"
+msgstr "Divisa de compra"
+
+msgctxt "field:stock.move,purchase_exception_state:0"
+msgid "Exception State"
+msgstr "Estado excepción"
+
+#, fuzzy
+msgctxt "field:stock.move,purchase_line:0"
+msgid "Purchase Line"
+msgstr "Línea de compra"
+
+msgctxt "field:stock.move,purchase_quantity:0"
+msgid "Purchase Quantity"
+msgstr "Cantidad de compra"
+
+msgctxt "field:stock.move,purchase_unit:0"
+msgid "Purchase Unit"
+msgstr "Unidad de compra"
+
+msgctxt "field:stock.move,purchase_unit_digits:0"
+msgid "Purchase Unit Digits"
+msgstr "Decimales de la unidad de compra"
+
+msgctxt "field:stock.move,purchase_unit_price:0"
+msgid "Purchase Unit Price"
+msgstr "Precio de la unidad de compra"
+
+msgctxt "field:stock.move,purchase_visible:0"
+msgid "Purchase Visible"
+msgstr "Compra visible"
+
+msgctxt "field:stock.move,supplier:0"
+msgid "Supplier"
+msgstr "Proveedor"
+
+msgctxt "help:purchase.handle.invoice.exception.ask,recreate_invoices:0"
+msgid ""
+"The selected invoices will be recreated. The other ones will be ignored."
+msgstr "La factura seleccionada será recreada. Las otras serán ignoradas."
+
+msgctxt "help:purchase.handle.shipment.exception.ask,recreate_moves:0"
+msgid "The selected moves will be recreated. The other ones will be ignored."
+msgstr "Los movimientos seleccionados se reharán. Los demás se ignorarán."
+
+msgctxt "help:purchase.product_supplier,delivery_time:0"
+msgid "In number of days"
+msgstr "En número de días"
+
+msgctxt "help:purchase.product_supplier.price,quantity:0"
+msgid "Minimal quantity"
+msgstr "Cantidad mínima"
+
+msgctxt "model:ir.action,name:act_invoice_form"
+msgid "Invoices"
+msgstr "Facturas"
+
+msgctxt "model:ir.action,name:act_open_supplier"
+msgid "Parties associated to Purchases"
+msgstr "Terceros asociados con compras"
+
+msgctxt "model:ir.action,name:act_purchase_configuration_form"
+msgid "Purchase Configuration"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_purchase_form"
+msgid "Purchases"
+msgstr "Compras"
+
+msgctxt "model:ir.action,name:act_purchase_form2"
+msgid "Purchases"
+msgstr "Compras"
+
+msgctxt "model:ir.action,name:act_purchase_form_confirmed"
+msgid "Confirmed Purchases"
+msgstr "Compras confirmadas"
+
+msgctxt "model:ir.action,name:act_purchase_form_draft"
+msgid "Draft Purchases"
+msgstr "Compras en borrador"
+
+msgctxt "model:ir.action,name:act_purchase_form_quotation"
+msgid "Purchases in Quotation"
+msgstr "Compras en cotización"
+
+msgctxt "model:ir.action,name:act_shipment_form"
+msgid "Shipments"
+msgstr "Envíos"
+
+msgctxt "model:ir.action,name:report_purchase"
+msgid "Purchase"
+msgstr "Compra"
+
+msgctxt "model:ir.action,name:wizard_invoice_handle_exception"
+msgid "Handle Invoice Exception"
+msgstr "Gestionar excepción de factura"
+
+msgctxt "model:ir.action,name:wizard_shipment_handle_exception"
+msgid "Handle Shipment Exception"
+msgstr "Gestionar excepción de envio"
+
+msgctxt "model:ir.sequence,name:sequence_purchase"
+msgid "Purchase"
+msgstr "Compra"
+
+msgctxt "model:ir.sequence.type,name:sequence_type_purchase"
+msgid "Purchase"
+msgstr "Compra"
+
+msgctxt "model:ir.ui.menu,name:menu_configuration"
+msgid "Configuration"
+msgstr "Configuración"
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_purchase"
+msgid "Purchase"
+msgstr "Gestión de compras"
+
+msgctxt "model:ir.ui.menu,name:menu_purchase_configuration"
+msgid "Purchase Configuration"
+msgstr ""
+
+msgctxt "model:ir.ui.menu,name:menu_purchase_form"
+msgid "Purchases"
+msgstr "Compras"
+
+msgctxt "model:ir.ui.menu,name:menu_purchase_form_confirmed"
+msgid "Confirmed Purchases"
+msgstr "Compras confirmadas"
+
+msgctxt "model:ir.ui.menu,name:menu_purchase_form_draft"
+msgid "Draft Purchases"
+msgstr "Compras en borrador"
+
+msgctxt "model:ir.ui.menu,name:menu_purchase_form_quotation"
+msgid "Purchases in Quotation"
+msgstr "Compras en cotización"
+
+msgctxt "model:ir.ui.menu,name:menu_reporting"
+msgid "Reporting"
+msgstr "Informes"
+
+msgctxt "model:ir.ui.menu,name:menu_supplier"
+msgid "Parties associated to Purchases"
+msgstr "Terceros asociados con compras"
+
+msgctxt "model:purchase.configuration,name:0"
+msgid "Purchase Configuration"
+msgstr ""
+
+msgctxt "model:purchase.handle.invoice.exception.ask,name:0"
+msgid "Invoice Exception Ask"
+msgstr "Factura de excepcion - Petición"
+
+msgctxt "model:purchase.handle.shipment.exception.ask,name:0"
+msgid "Shipment Exception Ask"
+msgstr "Envio de excepcion - Petición"
+
+msgctxt "model:purchase.line,name:0"
+msgid "Purchase Line"
+msgstr "Línea de compra"
+
+msgctxt "model:purchase.line-account.invoice.line,name:0"
+msgid "Purchase Line - Invoice Line"
+msgstr "Línea de compra - Línea de factura"
+
+msgctxt "model:purchase.line-account.tax,name:0"
+msgid "Purchase Line - Tax"
+msgstr "Línea de compra - Impuesto"
+
+msgctxt "model:purchase.line-ignored-stock.move,name:0"
+msgid "Purchase Line - Ignored Move"
+msgstr "Línea de compra - Movimiento Ignorado"
+
+msgctxt "model:purchase.line-recreated-stock.move,name:0"
+msgid "Purchase Line - Ignored Move"
+msgstr "Línea de compra - Movimiento ignorado"
+
+msgctxt "model:purchase.product_supplier,name:0"
+msgid "Product Supplier"
+msgstr "Proveedor de producto"
+
+msgctxt "model:purchase.product_supplier.price,name:0"
+msgid "Product Supplier Price"
+msgstr "Precio del proveedor del producto"
+
+msgctxt "model:purchase.purchase,name:0"
+msgid "Purchase"
+msgstr "Compra"
+
+msgctxt "model:purchase.purchase-account.invoice,name:0"
+msgid "Purchase - Invoice"
+msgstr "Compra - Factura"
+
+msgctxt "model:purchase.purchase-ignored-account.invoice,name:0"
+msgid "Purchase - Ignored Invoice"
+msgstr "Compra - Factura ignorada"
+
+msgctxt "model:purchase.purchase-recreated-account.invoice,name:0"
+msgid "Purchase - Recreated Invoice"
+msgstr "Compra - Factura recreada"
+
+msgctxt "model:res.group,name:group_purchase"
+msgid "Purchase"
+msgstr "Compra"
+
+msgctxt "model:res.group,name:group_purchase_admin"
+msgid "Purchase Administrator"
+msgstr "Administrador de compra"
+
+msgctxt "model:workflow,name:purchase_workflow"
+msgid "Purchase workflow"
+msgstr "Flujo de trabajo de compra"
+
+msgctxt "model:workflow.activity,name:purchase_activity_cancel"
+msgid "Canceled"
+msgstr "Cancelado"
+
+msgctxt "model:workflow.activity,name:purchase_activity_confirmed"
+msgid "Confirmed"
+msgstr "Confirmado"
+
+msgctxt "model:workflow.activity,name:purchase_activity_done"
+msgid "Done"
+msgstr "Terminada"
+
+msgctxt "model:workflow.activity,name:purchase_activity_draft"
+msgid "Draft"
+msgstr "Borrador"
+
+msgctxt "model:workflow.activity,name:purchase_activity_invoice_done"
+msgid "Invoice Done"
+msgstr "Factura terminada"
+
+msgctxt "model:workflow.activity,name:purchase_activity_invoice_method"
+msgid "Invoice Method"
+msgstr "Método de facturación"
+
+msgctxt "model:workflow.activity,name:purchase_activity_invoice_method_done"
+msgid "Invoice Method Done"
+msgstr "Método de factura terminado"
+
+msgctxt ""
+"model:workflow.activity,name:purchase_activity_invoice_purchase_exception"
+msgid "Invoice Exception"
+msgstr "Factura de excepción"
+
+msgctxt "model:workflow.activity,name:purchase_activity_invoice_shipment"
+msgid "Invoice Shipment"
+msgstr "Envío de factura"
+
+msgctxt "model:workflow.activity,name:purchase_activity_invoice_shipment_done"
+msgid "Invoice Shipment Done"
+msgstr "Envío de factura terminado"
+
+msgctxt ""
+"model:workflow.activity,name:purchase_activity_invoice_shipment_exception"
+msgid "Invoice Shipment Exception"
+msgstr "Excepción de envío de factura"
+
+msgctxt ""
+"model:workflow.activity,name:purchase_activity_invoice_shipment_method"
+msgid "Invoice Shipment Method"
+msgstr "Método de envio de factura"
+
+msgctxt ""
+"model:workflow.activity,name:purchase_activity_invoice_shipment_method_done"
+msgid "Invoice Shipment Method Done"
+msgstr "Método de envío de factura terminado"
+
+msgctxt "model:workflow.activity,name:purchase_activity_quotation"
+msgid "Quotation"
+msgstr "Cotización"
+
+msgctxt "model:workflow.activity,name:purchase_activity_shipment_exception"
+msgid "Shipment Exception"
+msgstr "Excepción de envio"
+
+msgctxt ""
+"model:workflow.activity,name:purchase_activity_waiting_invoice_purchase"
+msgid "Waiting Invoice"
+msgstr "Esperando factura"
+
+msgctxt ""
+"model:workflow.activity,name:purchase_activity_waiting_invoice_shipment"
+msgid "Waiting Invoice Shipment"
+msgstr "Esperando envío de factura"
+
+msgctxt "model:workflow.activity,name:purchase_activity_waiting_shipment"
+msgid "Waiting Shipment"
+msgstr "Esperando envio"
+
+msgctxt "odt:purchase.purchase:0"
+msgid "Amount"
+msgstr "Cantidad"
+
+msgctxt "odt:purchase.purchase:0"
+msgid "Date:"
+msgstr "Fecha:"
+
+msgctxt "odt:purchase.purchase:0"
+msgid "Description"
+msgstr "Descripción"
+
+msgctxt "odt:purchase.purchase:0"
+msgid "Description:"
+msgstr "Descripción:"
+
+msgctxt "odt:purchase.purchase:0"
+msgid "Draft Purchase Order"
+msgstr "Orden de compra en borrador"
+
+msgctxt "odt:purchase.purchase:0"
+msgid "E-Mail:"
+msgstr "Correo electrónico:"
+
+msgctxt "odt:purchase.purchase:0"
+msgid "Phone:"
+msgstr "Teléfono:"
+
+msgctxt "odt:purchase.purchase:0"
+msgid "Purchase Order N°:"
+msgstr "Nº de orden de compra:"
+
+msgctxt "odt:purchase.purchase:0"
+msgid "Quantity"
+msgstr "Cantidad"
+
+msgctxt "odt:purchase.purchase:0"
+msgid "Request for Quotation N°:"
+msgstr "Solicitud de presupuesto Nº:"
+
+msgctxt "odt:purchase.purchase:0"
+msgid "Taxes"
+msgstr "Impuestos"
+
+msgctxt "odt:purchase.purchase:0"
+msgid "Taxes:"
+msgstr "Impuestos:"
+
+msgctxt "odt:purchase.purchase:0"
+msgid "Total (excl. taxes):"
+msgstr "Total (sin impuestos):"
+
+msgctxt "odt:purchase.purchase:0"
+msgid "Total:"
+msgstr "Total:"
+
+msgctxt "odt:purchase.purchase:0"
+msgid "Unit Price"
+msgstr "Precio unitario"
+
+msgctxt "odt:purchase.purchase:0"
+msgid "VAT Number:"
+msgstr ""
+
+msgctxt "odt:purchase.purchase:0"
+msgid "VAT:"
+msgstr "IVA:"
+
+msgctxt "selection:account.invoice,purchase_exception_state:0"
+msgid ""
+msgstr ""
+
+msgctxt "selection:account.invoice,purchase_exception_state:0"
+msgid "Ignored"
+msgstr "Ignorado"
+
+msgctxt "selection:account.invoice,purchase_exception_state:0"
+msgid "Recreated"
+msgstr "Rehecho"
+
+#, fuzzy
+msgctxt "selection:purchase.configuration,purchase_invoice_method:0"
+msgid "Based On Order"
+msgstr "Basado en orden"
+
+#, fuzzy
+msgctxt "selection:purchase.configuration,purchase_invoice_method:0"
+msgid "Based On Shipment"
+msgstr "Basado en envio"
+
+#, fuzzy
+msgctxt "selection:purchase.configuration,purchase_invoice_method:0"
+msgid "Manual"
+msgstr "Manual"
+
+msgctxt "selection:purchase.line,type:0"
+msgid "Comment"
+msgstr "Comentario"
+
+msgctxt "selection:purchase.line,type:0"
+msgid "Line"
+msgstr "Línea"
+
+msgctxt "selection:purchase.line,type:0"
+msgid "Subtotal"
+msgstr "Subtotal"
+
+msgctxt "selection:purchase.line,type:0"
+msgid "Title"
+msgstr "Título"
+
+msgctxt "selection:purchase.purchase,invoice_method:0"
+msgid "Based On Order"
+msgstr "Basado en orden"
+
+msgctxt "selection:purchase.purchase,invoice_method:0"
+msgid "Based On Shipment"
+msgstr "Basado en envio"
+
+msgctxt "selection:purchase.purchase,invoice_method:0"
+msgid "Manual"
+msgstr "Manual"
+
+msgctxt "selection:purchase.purchase,invoice_state:0"
+msgid "Exception"
+msgstr "Excepción"
+
+msgctxt "selection:purchase.purchase,invoice_state:0"
+msgid "None"
+msgstr "Ninguno"
+
+msgctxt "selection:purchase.purchase,invoice_state:0"
+msgid "Paid"
+msgstr "Pagado"
+
+msgctxt "selection:purchase.purchase,invoice_state:0"
+msgid "Waiting"
+msgstr "En espera"
+
+msgctxt "selection:purchase.purchase,shipment_state:0"
+msgid "Exception"
+msgstr "Excepción"
+
+msgctxt "selection:purchase.purchase,shipment_state:0"
+msgid "None"
+msgstr "Ninguno"
+
+msgctxt "selection:purchase.purchase,shipment_state:0"
+msgid "Received"
+msgstr "Recibido"
+
+msgctxt "selection:purchase.purchase,shipment_state:0"
+msgid "Waiting"
+msgstr "En espera"
+
+msgctxt "selection:purchase.purchase,state:0"
+msgid "Canceled"
+msgstr "Cancelado"
+
+msgctxt "selection:purchase.purchase,state:0"
+msgid "Confirmed"
+msgstr "Confirmado"
+
+msgctxt "selection:purchase.purchase,state:0"
+msgid "Done"
+msgstr "Terminada"
+
+msgctxt "selection:purchase.purchase,state:0"
+msgid "Draft"
+msgstr "Borrador"
+
+msgctxt "selection:purchase.purchase,state:0"
+msgid "Quotation"
+msgstr "Presupuesto"
+
+msgctxt "selection:stock.move,purchase_exception_state:0"
+msgid ""
+msgstr ""
+
+msgctxt "selection:stock.move,purchase_exception_state:0"
+msgid "Ignored"
+msgstr "Ignorado"
+
+msgctxt "selection:stock.move,purchase_exception_state:0"
+msgid "Recreated"
+msgstr "Rehecho"
+
+msgctxt "view:product.product:0"
+msgid "Products"
+msgstr "Productos"
+
+msgctxt "view:product.product:0"
+msgid "Suppliers"
+msgstr "Proveedores"
+
+msgctxt "view:product.template:0"
+msgid "Product Suppliers"
+msgstr "Proveedores de productos"
+
+msgctxt "view:product.template:0"
+msgid "Suppliers"
+msgstr "Proveedores"
+
+msgctxt "view:purchase.configuration:0"
+msgid "Purchase Configuration"
+msgstr ""
+
+msgctxt "view:purchase.handle.invoice.exception.ask:0"
+msgid "Choose invoices to recreate"
+msgstr "Seleccione las facturas a recrear"
+
+msgctxt "view:purchase.handle.invoice.exception.ask:0"
+msgid "Handle Invoice Exception"
+msgstr "Manejar excepción de factura"
+
+#, fuzzy
+msgctxt "view:purchase.handle.shipment.exception.ask:0"
+msgid "Choose move to recreate"
+msgstr "Escoja un movimiento a rehacer"
+
+msgctxt "view:purchase.handle.shipment.exception.ask:0"
+msgid "Choose moves to recreate"
+msgstr "Elegir movimientos a recrear"
+
+msgctxt "view:purchase.handle.shipment.exception.ask:0"
+msgid "Handle shipment Exception"
+msgstr "Gestionar excepciones de envio"
+
+msgctxt "view:purchase.handle.shipment.exception.ask:0"
+msgid "Recreated Moves"
+msgstr "Movimientos recreados"
+
+msgctxt "view:purchase.line:0"
+msgid "General"
+msgstr "General"
+
+msgctxt "view:purchase.line:0"
+msgid "Notes"
+msgstr "Notas"
+
+msgctxt "view:purchase.line:0"
+msgid "Products"
+msgstr "Productos"
+
+msgctxt "view:purchase.line:0"
+msgid "Purchase Line"
+msgstr "Línea de compra"
+
+msgctxt "view:purchase.line:0"
+msgid "Purchase Lines"
+msgstr "Líneas de compra"
+
+msgctxt "view:purchase.product_supplier.price:0"
+msgid "Product Supplier Price"
+msgstr "Precio del proveedor del producto"
+
+msgctxt "view:purchase.product_supplier.price:0"
+msgid "Product Supplier Prices"
+msgstr "Precios del proveedor del producto"
+
+msgctxt "view:purchase.product_supplier:0"
+msgid "Product Supplier"
+msgstr "Proveedor del producto"
+
+msgctxt "view:purchase.product_supplier:0"
+msgid "Product Suppliers"
+msgstr "Proveedores de productos"
+
+msgctxt "view:purchase.purchase:0"
+msgid "Cancel"
+msgstr "Cancelar"
+
+msgctxt "view:purchase.purchase:0"
+msgid "Confirm"
+msgstr "Confirmar"
+
+msgctxt "view:purchase.purchase:0"
+msgid "Draft"
+msgstr "Borrador"
+
+msgctxt "view:purchase.purchase:0"
+msgid "Handle Invoice Exception"
+msgstr "Gestionar excepción de factura"
+
+msgctxt "view:purchase.purchase:0"
+msgid "Handle Shipment Exception"
+msgstr "Gestionar excepción de envios"
+
+msgctxt "view:purchase.purchase:0"
+msgid "Invoices"
+msgstr "Facturas"
+
+msgctxt "view:purchase.purchase:0"
+msgid "Lines"
+msgstr "Líneas"
+
+msgctxt "view:purchase.purchase:0"
+msgid "Moves"
+msgstr "Movimientos"
+
+msgctxt "view:purchase.purchase:0"
+msgid "Other Info"
+msgstr "Información adicional"
+
+msgctxt "view:purchase.purchase:0"
+msgid "Purchase"
+msgstr "Compra"
+
+msgctxt "view:purchase.purchase:0"
+msgid "Purchases"
+msgstr "Compras"
+
+msgctxt "view:purchase.purchase:0"
+msgid "Quotation"
+msgstr "Presupuesto"
+
+msgctxt "view:purchase.purchase:0"
+msgid "Shipments"
+msgstr "Envíos"
+
+msgctxt "wizard_button:purchase.handle.invoice.exception,init,end:0"
+msgid "Cancel"
+msgstr "Cancelar"
+
+msgctxt "wizard_button:purchase.handle.invoice.exception,init,ok:0"
+msgid "Ok"
+msgstr "Aceptar"
+
+msgctxt "wizard_button:purchase.handle.shipment.exception,init,end:0"
+msgid "Cancel"
+msgstr "Cancelar"
+
+msgctxt "wizard_button:purchase.handle.shipment.exception,init,ok:0"
+msgid "Ok"
+msgstr "Aceptar"
diff --git a/locale/fr_FR.po b/locale/fr_FR.po
new file mode 100644
index 0000000..3b8dd25
--- /dev/null
+++ b/locale/fr_FR.po
@@ -0,0 +1,1067 @@
+# 
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "error:account.invoice:0"
+msgid "You can not delete invoices that come from a purchase!"
+msgstr "Vous ne pouvez pas supprimer une facture qui provient d'un achat"
+
+msgctxt "error:account.invoice:0"
+msgid "You cannot reset to draft an invoice generated by a purchase."
+msgstr "Vous ne pouvez pas réinitialiser une facture générée par un achat."
+
+msgctxt "error:product.template:0"
+msgid ""
+"Purchase prices are based on the purchase uom, are you sure to change it?"
+msgstr ""
+"Les prix d'achat sont basé sur l'UDM d'achat, êtes-vous sur de vouloir la "
+"modifier ?"
+
+msgctxt "error:purchase.line:0"
+msgid "It misses an \"Account Expense\" on product \"%s\"!"
+msgstr "Il manque un compte de charge sur le produit \"%s\" !"
+
+msgctxt "error:purchase.line:0"
+msgid "It misses an \"account expense\" default property!"
+msgstr "il manque une propriété par défaut \"compte de charge\" !"
+
+msgctxt "error:purchase.line:0"
+msgid "The supplier location is required!"
+msgstr "L'emplacement fournisseur est requis !"
+
+msgctxt "error:purchase.purchase:0"
+msgid "Invoice addresses must be defined for the quotation."
+msgstr "L'adresse de facturation doit être définie pour le devis."
+
+msgctxt "error:purchase.purchase:0"
+msgid "It misses an \"Account Payable\" on the party \"%s\"!"
+msgstr "Il manque un compte à payer sur le tiers \"%s\" !"
+
+msgctxt "error:stock.shipment.in:0"
+msgid "You cannot reset to draft a move generated by a purchase."
+msgstr "Vous ne pouvez pas réinitialiser un mouvement généré par un achat."
+
+msgctxt "field:account.invoice,purchase_exception_state:0"
+msgid "Exception State"
+msgstr "État d'exception"
+
+msgctxt "field:account.invoice,purchases:0"
+msgid "Purchases"
+msgstr "Achats"
+
+msgctxt "field:account.invoice.line,purchase_lines:0"
+msgid "Purchase Lines"
+msgstr "Lignes d'achat"
+
+msgctxt "field:product.template,product_suppliers:0"
+msgid "Suppliers"
+msgstr "Fournisseurs"
+
+msgctxt "field:product.template,purchasable:0"
+msgid "Purchasable"
+msgstr "Achetable"
+
+msgctxt "field:product.template,purchase_uom:0"
+msgid "Purchase UOM"
+msgstr "UDM à l'achat"
+
+msgctxt "field:purchase.configuration,purchase_invoice_method:0"
+msgid "Invoice Method"
+msgstr "Méthode de facturation"
+
+msgctxt "field:purchase.configuration,purchase_sequence:0"
+msgid "Purchase Reference Sequence"
+msgstr "Séquence de référence d'achat"
+
+msgctxt "field:purchase.configuration,rec_name:0"
+msgid "Name"
+msgstr "Nom"
+
+msgctxt "field:purchase.handle.invoice.exception.ask,domain_invoices:0"
+msgid "Domain Invoices"
+msgstr "Domaine des factures"
+
+msgctxt "field:purchase.handle.invoice.exception.ask,recreate_invoices:0"
+msgid "Recreate Invoices"
+msgstr "Recréer les factures"
+
+msgctxt "field:purchase.handle.shipment.exception.ask,domain_moves:0"
+msgid "Domain Moves"
+msgstr "Domaine des mouvements"
+
+msgctxt "field:purchase.handle.shipment.exception.ask,recreate_moves:0"
+msgid "Recreate Moves"
+msgstr "Recréer les mouvements"
+
+msgctxt "field:purchase.line,amount:0"
+msgid "Amount"
+msgstr "Montant"
+
+msgctxt "field:purchase.line,description:0"
+msgid "Description"
+msgstr "Description"
+
+msgctxt "field:purchase.line,invoice_lines:0"
+msgid "Invoice Lines"
+msgstr "Lignes de factures"
+
+msgctxt "field:purchase.line,move_done:0"
+msgid "Moves Done"
+msgstr "Mouvements effectués"
+
+msgctxt "field:purchase.line,move_exception:0"
+msgid "Moves Exception"
+msgstr "Mouvements en exception"
+
+msgctxt "field:purchase.line,moves:0"
+msgid "Moves"
+msgstr "Mouvements"
+
+msgctxt "field:purchase.line,moves_ignored:0"
+msgid "Ignored Moves"
+msgstr "Mouvements ignorés"
+
+msgctxt "field:purchase.line,moves_recreated:0"
+msgid "Recreated Moves"
+msgstr "Mouvements recréés"
+
+msgctxt "field:purchase.line,note:0"
+msgid "Note"
+msgstr "Note"
+
+msgctxt "field:purchase.line,product:0"
+msgid "Product"
+msgstr "Produit"
+
+msgctxt "field:purchase.line,purchase:0"
+msgid "Purchase"
+msgstr "Achat"
+
+msgctxt "field:purchase.line,quantity:0"
+msgid "Quantity"
+msgstr "Quantité"
+
+msgctxt "field:purchase.line,rec_name:0"
+msgid "Name"
+msgstr "Nom"
+
+msgctxt "field:purchase.line,sequence:0"
+msgid "Sequence"
+msgstr "Séquence"
+
+msgctxt "field:purchase.line,taxes:0"
+msgid "Taxes"
+msgstr "Taxes"
+
+msgctxt "field:purchase.line,type:0"
+msgid "Type"
+msgstr "Type"
+
+msgctxt "field:purchase.line,unit:0"
+msgid "Unit"
+msgstr "Unité"
+
+msgctxt "field:purchase.line,unit_digits:0"
+msgid "Unit Digits"
+msgstr "Décimales de l'unité"
+
+msgctxt "field:purchase.line,unit_price:0"
+msgid "Unit Price"
+msgstr "Prix unitaire"
+
+msgctxt "field:purchase.line-account.invoice.line,invoice_line:0"
+msgid "Invoice Line"
+msgstr "Ligne de Facture"
+
+msgctxt "field:purchase.line-account.invoice.line,purchase_line:0"
+msgid "Purchase Line"
+msgstr "Ligne d'achat"
+
+msgctxt "field:purchase.line-account.invoice.line,rec_name:0"
+msgid "Name"
+msgstr "Nom"
+
+msgctxt "field:purchase.line-account.tax,line:0"
+msgid "Purchase Line"
+msgstr "Ligne d'achat"
+
+msgctxt "field:purchase.line-account.tax,rec_name:0"
+msgid "Name"
+msgstr "Nom"
+
+msgctxt "field:purchase.line-account.tax,tax:0"
+msgid "Tax"
+msgstr "Taxe"
+
+msgctxt "field:purchase.line-ignored-stock.move,move:0"
+msgid "Move"
+msgstr "Mouvement"
+
+msgctxt "field:purchase.line-ignored-stock.move,purchase_line:0"
+msgid "Purchase Line"
+msgstr "Ligne d'achat"
+
+msgctxt "field:purchase.line-ignored-stock.move,rec_name:0"
+msgid "Name"
+msgstr "Nom"
+
+msgctxt "field:purchase.line-recreated-stock.move,move:0"
+msgid "Move"
+msgstr "Mouvement"
+
+msgctxt "field:purchase.line-recreated-stock.move,purchase_line:0"
+msgid "Purchase Line"
+msgstr "Ligne d'achat"
+
+msgctxt "field:purchase.line-recreated-stock.move,rec_name:0"
+msgid "Name"
+msgstr "Nom"
+
+msgctxt "field:purchase.product_supplier,code:0"
+msgid "Code"
+msgstr "Code"
+
+msgctxt "field:purchase.product_supplier,company:0"
+msgid "Company"
+msgstr "Société"
+
+msgctxt "field:purchase.product_supplier,delivery_time:0"
+msgid "Delivery Time"
+msgstr "Délai de livraison"
+
+msgctxt "field:purchase.product_supplier,name:0"
+msgid "Name"
+msgstr "Nom"
+
+msgctxt "field:purchase.product_supplier,party:0"
+msgid "Supplier"
+msgstr "Fournisseur"
+
+msgctxt "field:purchase.product_supplier,prices:0"
+msgid "Prices"
+msgstr "Prix"
+
+msgctxt "field:purchase.product_supplier,product:0"
+msgid "Product"
+msgstr "Produit"
+
+msgctxt "field:purchase.product_supplier,rec_name:0"
+msgid "Name"
+msgstr "Nom"
+
+msgctxt "field:purchase.product_supplier,sequence:0"
+msgid "Sequence"
+msgstr "Séquence"
+
+msgctxt "field:purchase.product_supplier.price,product_supplier:0"
+msgid "Supplier"
+msgstr "Fournisseur"
+
+msgctxt "field:purchase.product_supplier.price,quantity:0"
+msgid "Quantity"
+msgstr "Quantité"
+
+msgctxt "field:purchase.product_supplier.price,rec_name:0"
+msgid "Name"
+msgstr "Nom"
+
+msgctxt "field:purchase.product_supplier.price,unit_price:0"
+msgid "Unit Price"
+msgstr "Prix unitaire"
+
+msgctxt "field:purchase.purchase,comment:0"
+msgid "Comment"
+msgstr "Commentaire"
+
+msgctxt "field:purchase.purchase,company:0"
+msgid "Company"
+msgstr "Société"
+
+msgctxt "field:purchase.purchase,currency:0"
+msgid "Currency"
+msgstr "Devise"
+
+msgctxt "field:purchase.purchase,currency_digits:0"
+msgid "Currency Digits"
+msgstr "Décimales de la devise"
+
+msgctxt "field:purchase.purchase,description:0"
+msgid "Description"
+msgstr "Description"
+
+msgctxt "field:purchase.purchase,invoice_address:0"
+msgid "Invoice Address"
+msgstr "Adresse de facturation"
+
+msgctxt "field:purchase.purchase,invoice_exception:0"
+msgid "Invoices Exception"
+msgstr "Factures en exception"
+
+msgctxt "field:purchase.purchase,invoice_method:0"
+msgid "Invoice Method"
+msgstr "Méthode de facturation"
+
+msgctxt "field:purchase.purchase,invoice_paid:0"
+msgid "Invoices Paid"
+msgstr "Factures payées"
+
+msgctxt "field:purchase.purchase,invoice_state:0"
+msgid "Invoice State"
+msgstr "État de la facture"
+
+msgctxt "field:purchase.purchase,invoices:0"
+msgid "Invoices"
+msgstr "Factures"
+
+msgctxt "field:purchase.purchase,invoices_ignored:0"
+msgid "Ignored Invoices"
+msgstr "Factures ignorées"
+
+msgctxt "field:purchase.purchase,invoices_recreated:0"
+msgid "Recreated Invoices"
+msgstr "Factures recréées"
+
+msgctxt "field:purchase.purchase,lines:0"
+msgid "Lines"
+msgstr "Lignes"
+
+msgctxt "field:purchase.purchase,moves:0"
+msgid "Moves"
+msgstr "Mouvements"
+
+msgctxt "field:purchase.purchase,party:0"
+msgid "Party"
+msgstr "Tiers"
+
+msgctxt "field:purchase.purchase,party_lang:0"
+msgid "Party Language"
+msgstr "Langue du tiers"
+
+msgctxt "field:purchase.purchase,payment_term:0"
+msgid "Payment Term"
+msgstr "Conditions de paiement"
+
+msgctxt "field:purchase.purchase,purchase_date:0"
+msgid "Purchase Date"
+msgstr "Date d'achat"
+
+msgctxt "field:purchase.purchase,rec_name:0"
+msgid "Name"
+msgstr "Nom"
+
+msgctxt "field:purchase.purchase,reference:0"
+msgid "Reference"
+msgstr "Référence"
+
+msgctxt "field:purchase.purchase,shipment_done:0"
+msgid "Shipment Done"
+msgstr "Expédition effectuée"
+
+msgctxt "field:purchase.purchase,shipment_exception:0"
+msgid "Shipments Exception"
+msgstr "Expéditions en exception"
+
+msgctxt "field:purchase.purchase,shipment_state:0"
+msgid "Shipment State"
+msgstr "État de l'expédition"
+
+msgctxt "field:purchase.purchase,shipments:0"
+msgid "Shipments"
+msgstr "Expéditions"
+
+msgctxt "field:purchase.purchase,state:0"
+msgid "State"
+msgstr "État"
+
+msgctxt "field:purchase.purchase,supplier_reference:0"
+msgid "Supplier Reference"
+msgstr "Référence fournisseur"
+
+msgctxt "field:purchase.purchase,tax_amount:0"
+msgid "Tax"
+msgstr "Taxe"
+
+msgctxt "field:purchase.purchase,total_amount:0"
+msgid "Total"
+msgstr "Total"
+
+msgctxt "field:purchase.purchase,untaxed_amount:0"
+msgid "Untaxed"
+msgstr "Non-taxé"
+
+msgctxt "field:purchase.purchase,warehouse:0"
+msgid "Warehouse"
+msgstr "Entrepôt"
+
+msgctxt "field:purchase.purchase-account.invoice,invoice:0"
+msgid "Invoice"
+msgstr "Facture"
+
+msgctxt "field:purchase.purchase-account.invoice,purchase:0"
+msgid "Purchase"
+msgstr "Achat"
+
+msgctxt "field:purchase.purchase-account.invoice,rec_name:0"
+msgid "Name"
+msgstr "Nom"
+
+msgctxt "field:purchase.purchase-ignored-account.invoice,invoice:0"
+msgid "Invoice"
+msgstr "Facture"
+
+msgctxt "field:purchase.purchase-ignored-account.invoice,purchase:0"
+msgid "Purchase"
+msgstr "Achat"
+
+msgctxt "field:purchase.purchase-ignored-account.invoice,rec_name:0"
+msgid "Name"
+msgstr "Nom"
+
+msgctxt "field:purchase.purchase-recreated-account.invoice,invoice:0"
+msgid "Invoice"
+msgstr "Facture"
+
+msgctxt "field:purchase.purchase-recreated-account.invoice,purchase:0"
+msgid "Purchase"
+msgstr "Achat"
+
+msgctxt "field:purchase.purchase-recreated-account.invoice,rec_name:0"
+msgid "Name"
+msgstr "Nom"
+
+msgctxt "field:stock.move,purchase:0"
+msgid "Purchase"
+msgstr "Achat"
+
+msgctxt "field:stock.move,purchase_currency:0"
+msgid "Purchase Currency"
+msgstr "Devise de l'achat"
+
+msgctxt "field:stock.move,purchase_exception_state:0"
+msgid "Exception State"
+msgstr "État d'exception"
+
+msgctxt "field:stock.move,purchase_line:0"
+msgid "Purchase Line"
+msgstr "Ligne d'achat"
+
+msgctxt "field:stock.move,purchase_quantity:0"
+msgid "Purchase Quantity"
+msgstr "Quantité d'achat"
+
+msgctxt "field:stock.move,purchase_unit:0"
+msgid "Purchase Unit"
+msgstr "Unité d'achat"
+
+msgctxt "field:stock.move,purchase_unit_digits:0"
+msgid "Purchase Unit Digits"
+msgstr "Décimales de l'unité d'achat"
+
+msgctxt "field:stock.move,purchase_unit_price:0"
+msgid "Purchase Unit Price"
+msgstr "Prix unitaire d'achat"
+
+msgctxt "field:stock.move,purchase_visible:0"
+msgid "Purchase Visible"
+msgstr "Achat visible"
+
+msgctxt "field:stock.move,supplier:0"
+msgid "Supplier"
+msgstr "Fournisseur"
+
+msgctxt "help:purchase.handle.invoice.exception.ask,recreate_invoices:0"
+msgid ""
+"The selected invoices will be recreated. The other ones will be ignored."
+msgstr ""
+"Les factures sélectionnées seront recréés. Les autres seront ignorées."
+
+msgctxt "help:purchase.handle.shipment.exception.ask,recreate_moves:0"
+msgid "The selected moves will be recreated. The other ones will be ignored."
+msgstr ""
+"Les mouvements sélectionnés seront recréés. Les autres seront ignorés."
+
+msgctxt "help:purchase.product_supplier,delivery_time:0"
+msgid "In number of days"
+msgstr "En nombre de jours"
+
+msgctxt "help:purchase.product_supplier.price,quantity:0"
+msgid "Minimal quantity"
+msgstr "Quantité minimale"
+
+msgctxt "model:ir.action,name:act_invoice_form"
+msgid "Invoices"
+msgstr "Factures"
+
+msgctxt "model:ir.action,name:act_open_supplier"
+msgid "Parties associated to Purchases"
+msgstr "Tiers associés à des achats"
+
+msgctxt "model:ir.action,name:act_purchase_configuration_form"
+msgid "Purchase Configuration"
+msgstr "Configuration des achats"
+
+msgctxt "model:ir.action,name:act_purchase_form"
+msgid "Purchases"
+msgstr "Achats"
+
+msgctxt "model:ir.action,name:act_purchase_form2"
+msgid "Purchases"
+msgstr "Achats"
+
+msgctxt "model:ir.action,name:act_purchase_form_confirmed"
+msgid "Confirmed Purchases"
+msgstr "Achats confirmés"
+
+msgctxt "model:ir.action,name:act_purchase_form_draft"
+msgid "Draft Purchases"
+msgstr "Achats brouillons"
+
+msgctxt "model:ir.action,name:act_purchase_form_quotation"
+msgid "Purchases in Quotation"
+msgstr "Devis"
+
+msgctxt "model:ir.action,name:act_shipment_form"
+msgid "Shipments"
+msgstr "Expéditions"
+
+msgctxt "model:ir.action,name:report_purchase"
+msgid "Purchase"
+msgstr "Achat"
+
+msgctxt "model:ir.action,name:wizard_invoice_handle_exception"
+msgid "Handle Invoice Exception"
+msgstr "Gérer l'exception de facture"
+
+msgctxt "model:ir.action,name:wizard_shipment_handle_exception"
+msgid "Handle Shipment Exception"
+msgstr "Gérer l'exception d'expédition"
+
+msgctxt "model:ir.sequence,name:sequence_purchase"
+msgid "Purchase"
+msgstr "Achat"
+
+msgctxt "model:ir.sequence.type,name:sequence_type_purchase"
+msgid "Purchase"
+msgstr "Achat"
+
+msgctxt "model:ir.ui.menu,name:menu_configuration"
+msgid "Configuration"
+msgstr "Configuration"
+
+msgctxt "model:ir.ui.menu,name:menu_purchase"
+msgid "Purchase"
+msgstr "Achats"
+
+msgctxt "model:ir.ui.menu,name:menu_purchase_configuration"
+msgid "Purchase Configuration"
+msgstr "Configuration des achats"
+
+msgctxt "model:ir.ui.menu,name:menu_purchase_form"
+msgid "Purchases"
+msgstr "Achats"
+
+msgctxt "model:ir.ui.menu,name:menu_purchase_form_confirmed"
+msgid "Confirmed Purchases"
+msgstr "Achats confirmé"
+
+msgctxt "model:ir.ui.menu,name:menu_purchase_form_draft"
+msgid "Draft Purchases"
+msgstr "Achats brouillons"
+
+msgctxt "model:ir.ui.menu,name:menu_purchase_form_quotation"
+msgid "Purchases in Quotation"
+msgstr "Devis"
+
+msgctxt "model:ir.ui.menu,name:menu_reporting"
+msgid "Reporting"
+msgstr "Rapport"
+
+msgctxt "model:ir.ui.menu,name:menu_supplier"
+msgid "Parties associated to Purchases"
+msgstr "Tiers associés à des achats"
+
+msgctxt "model:purchase.configuration,name:0"
+msgid "Purchase Configuration"
+msgstr "Configuration des achats"
+
+msgctxt "model:purchase.handle.invoice.exception.ask,name:0"
+msgid "Invoice Exception Ask"
+msgstr "Exception de facture - Demande"
+
+msgctxt "model:purchase.handle.shipment.exception.ask,name:0"
+msgid "Shipment Exception Ask"
+msgstr "Exception d'expédition - Demande"
+
+msgctxt "model:purchase.line,name:0"
+msgid "Purchase Line"
+msgstr "Ligne d'achat"
+
+msgctxt "model:purchase.line-account.invoice.line,name:0"
+msgid "Purchase Line - Invoice Line"
+msgstr "Ligne d'achat - Ligne de facture"
+
+msgctxt "model:purchase.line-account.tax,name:0"
+msgid "Purchase Line - Tax"
+msgstr "Ligne d'achat - Taxe"
+
+msgctxt "model:purchase.line-ignored-stock.move,name:0"
+msgid "Purchase Line - Ignored Move"
+msgstr "Ligne d'achat - Mouvement ignoré"
+
+msgctxt "model:purchase.line-recreated-stock.move,name:0"
+msgid "Purchase Line - Ignored Move"
+msgstr "Ligne d'achat - Mouvement ignoré"
+
+msgctxt "model:purchase.product_supplier,name:0"
+msgid "Product Supplier"
+msgstr "Produit Fournisseur"
+
+msgctxt "model:purchase.product_supplier.price,name:0"
+msgid "Product Supplier Price"
+msgstr "Produit Prix Fournisseur"
+
+msgctxt "model:purchase.purchase,name:0"
+msgid "Purchase"
+msgstr "Achat"
+
+msgctxt "model:purchase.purchase-account.invoice,name:0"
+msgid "Purchase - Invoice"
+msgstr "Achat - Facture"
+
+msgctxt "model:purchase.purchase-ignored-account.invoice,name:0"
+msgid "Purchase - Ignored Invoice"
+msgstr "Achat - Facture ignorée"
+
+msgctxt "model:purchase.purchase-recreated-account.invoice,name:0"
+msgid "Purchase - Recreated Invoice"
+msgstr "Achat - Facture recréée"
+
+msgctxt "model:res.group,name:group_purchase"
+msgid "Purchase"
+msgstr "Achat"
+
+msgctxt "model:res.group,name:group_purchase_admin"
+msgid "Purchase Administrator"
+msgstr "Administrateur des achats"
+
+msgctxt "model:workflow,name:purchase_workflow"
+msgid "Purchase workflow"
+msgstr "Workflow d'achat"
+
+msgctxt "model:workflow.activity,name:purchase_activity_cancel"
+msgid "Canceled"
+msgstr "Annulé"
+
+msgctxt "model:workflow.activity,name:purchase_activity_confirmed"
+msgid "Confirmed"
+msgstr "Confirmé"
+
+msgctxt "model:workflow.activity,name:purchase_activity_done"
+msgid "Done"
+msgstr "Fait"
+
+msgctxt "model:workflow.activity,name:purchase_activity_draft"
+msgid "Draft"
+msgstr "Brouillon"
+
+msgctxt "model:workflow.activity,name:purchase_activity_invoice_done"
+msgid "Invoice Done"
+msgstr "Facture faite"
+
+msgctxt "model:workflow.activity,name:purchase_activity_invoice_method"
+msgid "Invoice Method"
+msgstr "Méthode de facturation"
+
+msgctxt "model:workflow.activity,name:purchase_activity_invoice_method_done"
+msgid "Invoice Method Done"
+msgstr "Méthode de facturation faite"
+
+msgctxt ""
+"model:workflow.activity,name:purchase_activity_invoice_purchase_exception"
+msgid "Invoice Exception"
+msgstr "Facture en exception"
+
+msgctxt "model:workflow.activity,name:purchase_activity_invoice_shipment"
+msgid "Invoice Shipment"
+msgstr "Facture d'expédition"
+
+msgctxt "model:workflow.activity,name:purchase_activity_invoice_shipment_done"
+msgid "Invoice Shipment Done"
+msgstr "Facture expédition faite"
+
+msgctxt ""
+"model:workflow.activity,name:purchase_activity_invoice_shipment_exception"
+msgid "Invoice Shipment Exception"
+msgstr "Facture expédition en exception"
+
+msgctxt ""
+"model:workflow.activity,name:purchase_activity_invoice_shipment_method"
+msgid "Invoice Shipment Method"
+msgstr "Méthode facture expédition"
+
+msgctxt ""
+"model:workflow.activity,name:purchase_activity_invoice_shipment_method_done"
+msgid "Invoice Shipment Method Done"
+msgstr "Méthode facture expédition faite"
+
+msgctxt "model:workflow.activity,name:purchase_activity_quotation"
+msgid "Quotation"
+msgstr "Devis"
+
+msgctxt "model:workflow.activity,name:purchase_activity_shipment_exception"
+msgid "Shipment Exception"
+msgstr "Expédition en exception"
+
+msgctxt ""
+"model:workflow.activity,name:purchase_activity_waiting_invoice_purchase"
+msgid "Waiting Invoice"
+msgstr "Facture en attente"
+
+msgctxt ""
+"model:workflow.activity,name:purchase_activity_waiting_invoice_shipment"
+msgid "Waiting Invoice Shipment"
+msgstr "Facture expédition en attente"
+
+msgctxt "model:workflow.activity,name:purchase_activity_waiting_shipment"
+msgid "Waiting Shipment"
+msgstr "Expédition en attente"
+
+msgctxt "odt:purchase.purchase:0"
+msgid "Amount"
+msgstr "Montant"
+
+msgctxt "odt:purchase.purchase:0"
+msgid "Date:"
+msgstr "Date:"
+
+msgctxt "odt:purchase.purchase:0"
+msgid "Description"
+msgstr "Description"
+
+msgctxt "odt:purchase.purchase:0"
+msgid "Description:"
+msgstr "Description:"
+
+msgctxt "odt:purchase.purchase:0"
+msgid "Draft Purchase Order"
+msgstr "Commande d'achat"
+
+msgctxt "odt:purchase.purchase:0"
+msgid "E-Mail:"
+msgstr "E-Mail:"
+
+msgctxt "odt:purchase.purchase:0"
+msgid "Phone:"
+msgstr "Téléphone"
+
+msgctxt "odt:purchase.purchase:0"
+msgid "Purchase Order N°:"
+msgstr "Commande d'achat n° :"
+
+msgctxt "odt:purchase.purchase:0"
+msgid "Quantity"
+msgstr "Quantité"
+
+msgctxt "odt:purchase.purchase:0"
+msgid "Request for Quotation N°:"
+msgstr "Demande pour le devis n°"
+
+msgctxt "odt:purchase.purchase:0"
+msgid "Taxes"
+msgstr "Taxes"
+
+msgctxt "odt:purchase.purchase:0"
+msgid "Taxes:"
+msgstr "Taxes:"
+
+msgctxt "odt:purchase.purchase:0"
+msgid "Total (excl. taxes):"
+msgstr "Total (htva)"
+
+msgctxt "odt:purchase.purchase:0"
+msgid "Total:"
+msgstr "Total:"
+
+msgctxt "odt:purchase.purchase:0"
+msgid "Unit Price"
+msgstr "Prix unitaire"
+
+msgctxt "odt:purchase.purchase:0"
+msgid "VAT Number:"
+msgstr "Numéro TVA:"
+
+msgctxt "odt:purchase.purchase:0"
+msgid "VAT:"
+msgstr "TVA:"
+
+msgctxt "selection:account.invoice,purchase_exception_state:0"
+msgid ""
+msgstr ""
+
+msgctxt "selection:account.invoice,purchase_exception_state:0"
+msgid "Ignored"
+msgstr "Ignoré"
+
+msgctxt "selection:account.invoice,purchase_exception_state:0"
+msgid "Recreated"
+msgstr "Recréé"
+
+msgctxt "selection:purchase.configuration,purchase_invoice_method:0"
+msgid "Based On Order"
+msgstr "Basé sur la commande"
+
+msgctxt "selection:purchase.configuration,purchase_invoice_method:0"
+msgid "Based On Shipment"
+msgstr "Basé sur la livraison"
+
+msgctxt "selection:purchase.configuration,purchase_invoice_method:0"
+msgid "Manual"
+msgstr "Manuel"
+
+msgctxt "selection:purchase.line,type:0"
+msgid "Comment"
+msgstr "Commentaire"
+
+msgctxt "selection:purchase.line,type:0"
+msgid "Line"
+msgstr "Ligne"
+
+msgctxt "selection:purchase.line,type:0"
+msgid "Subtotal"
+msgstr "Sous-total"
+
+msgctxt "selection:purchase.line,type:0"
+msgid "Title"
+msgstr "Titre"
+
+msgctxt "selection:purchase.purchase,invoice_method:0"
+msgid "Based On Order"
+msgstr "Basé sur la commande"
+
+msgctxt "selection:purchase.purchase,invoice_method:0"
+msgid "Based On Shipment"
+msgstr "Basé sur la livraison"
+
+msgctxt "selection:purchase.purchase,invoice_method:0"
+msgid "Manual"
+msgstr "Manuel"
+
+msgctxt "selection:purchase.purchase,invoice_state:0"
+msgid "Exception"
+msgstr "Exception"
+
+msgctxt "selection:purchase.purchase,invoice_state:0"
+msgid "None"
+msgstr "Aucun"
+
+msgctxt "selection:purchase.purchase,invoice_state:0"
+msgid "Paid"
+msgstr "Payé"
+
+msgctxt "selection:purchase.purchase,invoice_state:0"
+msgid "Waiting"
+msgstr "En attente"
+
+msgctxt "selection:purchase.purchase,shipment_state:0"
+msgid "Exception"
+msgstr "Exception"
+
+msgctxt "selection:purchase.purchase,shipment_state:0"
+msgid "None"
+msgstr "Aucun"
+
+msgctxt "selection:purchase.purchase,shipment_state:0"
+msgid "Received"
+msgstr "Reçu"
+
+msgctxt "selection:purchase.purchase,shipment_state:0"
+msgid "Waiting"
+msgstr "En attente"
+
+msgctxt "selection:purchase.purchase,state:0"
+msgid "Canceled"
+msgstr "Annulé"
+
+msgctxt "selection:purchase.purchase,state:0"
+msgid "Confirmed"
+msgstr "Confirmé"
+
+msgctxt "selection:purchase.purchase,state:0"
+msgid "Done"
+msgstr "Fait"
+
+msgctxt "selection:purchase.purchase,state:0"
+msgid "Draft"
+msgstr "Brouillon"
+
+msgctxt "selection:purchase.purchase,state:0"
+msgid "Quotation"
+msgstr "Devis"
+
+msgctxt "selection:stock.move,purchase_exception_state:0"
+msgid ""
+msgstr ""
+
+msgctxt "selection:stock.move,purchase_exception_state:0"
+msgid "Ignored"
+msgstr "Ignoré"
+
+msgctxt "selection:stock.move,purchase_exception_state:0"
+msgid "Recreated"
+msgstr "Recréé"
+
+msgctxt "view:product.product:0"
+msgid "Product Suppliers"
+msgstr "Fournisseurs"
+
+msgctxt "view:product.product:0"
+msgid "Suppliers"
+msgstr "Fournisseurs"
+
+msgctxt "view:product.template:0"
+msgid "Product Suppliers"
+msgstr "Produit Fournisseur"
+
+msgctxt "view:product.template:0"
+msgid "Suppliers"
+msgstr "Fournisseurs"
+
+msgctxt "view:purchase.configuration:0"
+msgid "Purchase Configuration"
+msgstr "Configuration des achats"
+
+msgctxt "view:purchase.handle.invoice.exception.ask:0"
+msgid "Choose invoices to recreate"
+msgstr "Choisir les factures à recréer"
+
+msgctxt "view:purchase.handle.invoice.exception.ask:0"
+msgid "Handle Invoice Exception"
+msgstr "Gérer l'exception de facture"
+
+msgctxt "view:purchase.handle.shipment.exception.ask:0"
+msgid "Choose move to recreate"
+msgstr "Choisir le mouvement à recréer"
+
+msgctxt "view:purchase.handle.shipment.exception.ask:0"
+msgid "Choose moves to recreate"
+msgstr "Choisir les mouvements à recréer"
+
+msgctxt "view:purchase.handle.shipment.exception.ask:0"
+msgid "Handle shipment Exception"
+msgstr "Gérer l'exception d'expédition"
+
+msgctxt "view:purchase.handle.shipment.exception.ask:0"
+msgid "Recreated Moves"
+msgstr "Mouvements recréés"
+
+msgctxt "view:purchase.line:0"
+msgid "General"
+msgstr "Général"
+
+msgctxt "view:purchase.line:0"
+msgid "Notes"
+msgstr "Notes"
+
+msgctxt "view:purchase.line:0"
+msgid "Products"
+msgstr "Produits"
+
+msgctxt "view:purchase.line:0"
+msgid "Purchase Line"
+msgstr "Ligne d'achat"
+
+msgctxt "view:purchase.line:0"
+msgid "Purchase Lines"
+msgstr "Lignes d'achat"
+
+msgctxt "view:purchase.product_supplier.price:0"
+msgid "Product Supplier Price"
+msgstr "Prix du fournisseur du produit"
+
+msgctxt "view:purchase.product_supplier.price:0"
+msgid "Product Supplier Prices"
+msgstr "Prix du fournisseur du produit"
+
+msgctxt "view:purchase.product_supplier:0"
+msgid "Product Supplier"
+msgstr "Fournisseur du produit"
+
+msgctxt "view:purchase.product_supplier:0"
+msgid "Product Suppliers"
+msgstr "Fournisseurs du produit"
+
+msgctxt "view:purchase.purchase:0"
+msgid "Cancel"
+msgstr "Annuler"
+
+msgctxt "view:purchase.purchase:0"
+msgid "Confirm"
+msgstr "Confirmer"
+
+msgctxt "view:purchase.purchase:0"
+msgid "Draft"
+msgstr "Brouillon"
+
+msgctxt "view:purchase.purchase:0"
+msgid "Handle Invoice Exception"
+msgstr "Gérer l'exception de facture"
+
+msgctxt "view:purchase.purchase:0"
+msgid "Handle Shipment Exception"
+msgstr "Gérer l'exception d'expédition"
+
+msgctxt "view:purchase.purchase:0"
+msgid "Ignore Invoice Exception"
+msgstr "Ignorer l'exception de facturation"
+
+msgctxt "view:purchase.purchase:0"
+msgid "Ignore Shipment Exception"
+msgstr "Ignorer l'exception d'expédition"
+
+msgctxt "view:purchase.purchase:0"
+msgid "Invoices"
+msgstr "Factures"
+
+msgctxt "view:purchase.purchase:0"
+msgid "Lines"
+msgstr "Lignes"
+
+msgctxt "view:purchase.purchase:0"
+msgid "Moves"
+msgstr "Mouvements"
+
+msgctxt "view:purchase.purchase:0"
+msgid "Other Info"
+msgstr "Autre information"
+
+msgctxt "view:purchase.purchase:0"
+msgid "Purchase"
+msgstr "Achat"
+
+msgctxt "view:purchase.purchase:0"
+msgid "Purchases"
+msgstr "Achats"
+
+msgctxt "view:purchase.purchase:0"
+msgid "Quotation"
+msgstr "Devis"
+
+msgctxt "view:purchase.purchase:0"
+msgid "Shipments"
+msgstr "Expéditions"
+
+msgctxt "wizard_button:purchase.handle.invoice.exception,init,end:0"
+msgid "Cancel"
+msgstr "Annuler"
+
+msgctxt "wizard_button:purchase.handle.invoice.exception,init,ok:0"
+msgid "Ok"
+msgstr "Ok"
+
+msgctxt "wizard_button:purchase.handle.shipment.exception,init,end:0"
+msgid "Cancel"
+msgstr "Annuler"
+
+msgctxt "wizard_button:purchase.handle.shipment.exception,init,ok:0"
+msgid "Ok"
+msgstr "Ok"
diff --git a/locale/nl_NL.po b/locale/nl_NL.po
new file mode 100644
index 0000000..ad039b3
--- /dev/null
+++ b/locale/nl_NL.po
@@ -0,0 +1,1212 @@
+# 
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "error:account.invoice:0"
+msgid "You can not delete invoices that come from a purchase!"
+msgstr ""
+
+msgctxt "error:account.invoice:0"
+msgid "You cannot reset to draft an invoice generated by a purchase."
+msgstr ""
+
+msgctxt "error:product.template:0"
+msgid ""
+"Purchase prices are based on the purchase uom, are you sure to change it?"
+msgstr ""
+
+msgctxt "error:purchase.line:0"
+msgid "It misses an \"Account Expense\" on product \"%s\"!"
+msgstr ""
+
+msgctxt "error:purchase.line:0"
+msgid "It misses an \"account expense\" default property!"
+msgstr ""
+
+msgctxt "error:purchase.line:0"
+msgid "The supplier location is required!"
+msgstr ""
+
+msgctxt "error:purchase.purchase:0"
+msgid "Invoice addresses must be defined for the quotation."
+msgstr ""
+
+msgctxt "error:purchase.purchase:0"
+msgid "It misses an \"Account Payable\" on the party \"%s\"!"
+msgstr ""
+
+msgctxt "error:stock.shipment.in:0"
+msgid "You cannot reset to draft a move generated by a purchase."
+msgstr ""
+
+#, fuzzy
+msgctxt "field:account.invoice,purchase_exception_state:0"
+msgid "Exception State"
+msgstr "Uitzonderingstoestand"
+
+msgctxt "field:account.invoice,purchases:0"
+msgid "Purchases"
+msgstr ""
+
+msgctxt "field:account.invoice.line,purchase_lines:0"
+msgid "Purchase Lines"
+msgstr ""
+
+msgctxt "field:product.template,product_suppliers:0"
+msgid "Suppliers"
+msgstr ""
+
+msgctxt "field:product.template,purchasable:0"
+msgid "Purchasable"
+msgstr ""
+
+msgctxt "field:product.template,purchase_uom:0"
+msgid "Purchase UOM"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:purchase.configuration,purchase_invoice_method:0"
+msgid "Invoice Method"
+msgstr "Factuur afhandeling"
+
+msgctxt "field:purchase.configuration,purchase_sequence:0"
+msgid "Purchase Reference Sequence"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:purchase.configuration,rec_name:0"
+msgid "Name"
+msgstr "Naam bijlage"
+
+#, fuzzy
+msgctxt "field:purchase.handle.invoice.exception.ask,domain_invoices:0"
+msgid "Domain Invoices"
+msgstr "Domein facturen"
+
+#, fuzzy
+msgctxt "field:purchase.handle.invoice.exception.ask,recreate_invoices:0"
+msgid "Recreate Invoices"
+msgstr "Facturen opnieuw aanmaken"
+
+#, fuzzy
+msgctxt "field:purchase.handle.shipment.exception.ask,domain_moves:0"
+msgid "Domain Moves"
+msgstr "Domein boekingen"
+
+#, fuzzy
+msgctxt "field:purchase.handle.shipment.exception.ask,recreate_moves:0"
+msgid "Recreate Moves"
+msgstr "Boekingen opnieuw aanmaken"
+
+#, fuzzy
+msgctxt "field:purchase.line,amount:0"
+msgid "Amount"
+msgstr "Bedrag"
+
+#, fuzzy
+msgctxt "field:purchase.line,description:0"
+msgid "Description"
+msgstr "Specificatie"
+
+#, fuzzy
+msgctxt "field:purchase.line,invoice_lines:0"
+msgid "Invoice Lines"
+msgstr "Factuurregels"
+
+#, fuzzy
+msgctxt "field:purchase.line,move_done:0"
+msgid "Moves Done"
+msgstr "Boekingen klaar"
+
+#, fuzzy
+msgctxt "field:purchase.line,move_exception:0"
+msgid "Moves Exception"
+msgstr "Boekingen uitzondering"
+
+#, fuzzy
+msgctxt "field:purchase.line,moves:0"
+msgid "Moves"
+msgstr "Boekingen"
+
+#, fuzzy
+msgctxt "field:purchase.line,moves_ignored:0"
+msgid "Ignored Moves"
+msgstr "Genegeerde boekingen"
+
+#, fuzzy
+msgctxt "field:purchase.line,moves_recreated:0"
+msgid "Recreated Moves"
+msgstr "Opnieuw aangemaakte boekingen"
+
+#, fuzzy
+msgctxt "field:purchase.line,note:0"
+msgid "Note"
+msgstr "Aantekening"
+
+#, fuzzy
+msgctxt "field:purchase.line,product:0"
+msgid "Product"
+msgstr "Producten"
+
+msgctxt "field:purchase.line,purchase:0"
+msgid "Purchase"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:purchase.line,quantity:0"
+msgid "Quantity"
+msgstr "Hoeveelheid"
+
+#, fuzzy
+msgctxt "field:purchase.line,rec_name:0"
+msgid "Name"
+msgstr "Naam bijlage"
+
+#, fuzzy
+msgctxt "field:purchase.line,sequence:0"
+msgid "Sequence"
+msgstr "Reeks"
+
+#, fuzzy
+msgctxt "field:purchase.line,taxes:0"
+msgid "Taxes"
+msgstr "Belastingen"
+
+#, fuzzy
+msgctxt "field:purchase.line,type:0"
+msgid "Type"
+msgstr "Type"
+
+#, fuzzy
+msgctxt "field:purchase.line,unit:0"
+msgid "Unit"
+msgstr "Eenheid"
+
+#, fuzzy
+msgctxt "field:purchase.line,unit_digits:0"
+msgid "Unit Digits"
+msgstr "Decimalen eenheid"
+
+#, fuzzy
+msgctxt "field:purchase.line,unit_price:0"
+msgid "Unit Price"
+msgstr "Eenheidsprijs"
+
+#, fuzzy
+msgctxt "field:purchase.line-account.invoice.line,invoice_line:0"
+msgid "Invoice Line"
+msgstr "Factuurregel"
+
+msgctxt "field:purchase.line-account.invoice.line,purchase_line:0"
+msgid "Purchase Line"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:purchase.line-account.invoice.line,rec_name:0"
+msgid "Name"
+msgstr "Naam bijlage"
+
+msgctxt "field:purchase.line-account.tax,line:0"
+msgid "Purchase Line"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:purchase.line-account.tax,rec_name:0"
+msgid "Name"
+msgstr "Naam bijlage"
+
+#, fuzzy
+msgctxt "field:purchase.line-account.tax,tax:0"
+msgid "Tax"
+msgstr "Belasting"
+
+#, fuzzy
+msgctxt "field:purchase.line-ignored-stock.move,move:0"
+msgid "Move"
+msgstr "Boeking"
+
+msgctxt "field:purchase.line-ignored-stock.move,purchase_line:0"
+msgid "Purchase Line"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:purchase.line-ignored-stock.move,rec_name:0"
+msgid "Name"
+msgstr "Naam bijlage"
+
+#, fuzzy
+msgctxt "field:purchase.line-recreated-stock.move,move:0"
+msgid "Move"
+msgstr "Boeking"
+
+msgctxt "field:purchase.line-recreated-stock.move,purchase_line:0"
+msgid "Purchase Line"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:purchase.line-recreated-stock.move,rec_name:0"
+msgid "Name"
+msgstr "Naam bijlage"
+
+#, fuzzy
+msgctxt "field:purchase.product_supplier,code:0"
+msgid "Code"
+msgstr "Code"
+
+#, fuzzy
+msgctxt "field:purchase.product_supplier,company:0"
+msgid "Company"
+msgstr "Bedrijf"
+
+msgctxt "field:purchase.product_supplier,delivery_time:0"
+msgid "Delivery Time"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:purchase.product_supplier,name:0"
+msgid "Name"
+msgstr "Naam bijlage"
+
+#, fuzzy
+msgctxt "field:purchase.product_supplier,party:0"
+msgid "Supplier"
+msgstr "Leverancier"
+
+msgctxt "field:purchase.product_supplier,prices:0"
+msgid "Prices"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:purchase.product_supplier,product:0"
+msgid "Product"
+msgstr "Producten"
+
+#, fuzzy
+msgctxt "field:purchase.product_supplier,rec_name:0"
+msgid "Name"
+msgstr "Naam bijlage"
+
+#, fuzzy
+msgctxt "field:purchase.product_supplier,sequence:0"
+msgid "Sequence"
+msgstr "Reeks"
+
+#, fuzzy
+msgctxt "field:purchase.product_supplier.price,product_supplier:0"
+msgid "Supplier"
+msgstr "Leverancier"
+
+#, fuzzy
+msgctxt "field:purchase.product_supplier.price,quantity:0"
+msgid "Quantity"
+msgstr "Hoeveelheid"
+
+#, fuzzy
+msgctxt "field:purchase.product_supplier.price,rec_name:0"
+msgid "Name"
+msgstr "Naam bijlage"
+
+#, fuzzy
+msgctxt "field:purchase.product_supplier.price,unit_price:0"
+msgid "Unit Price"
+msgstr "Eenheidsprijs"
+
+#, fuzzy
+msgctxt "field:purchase.purchase,comment:0"
+msgid "Comment"
+msgstr "Opmerking"
+
+#, fuzzy
+msgctxt "field:purchase.purchase,company:0"
+msgid "Company"
+msgstr "Bedrijf"
+
+#, fuzzy
+msgctxt "field:purchase.purchase,currency:0"
+msgid "Currency"
+msgstr "Valuta"
+
+#, fuzzy
+msgctxt "field:purchase.purchase,currency_digits:0"
+msgid "Currency Digits"
+msgstr "Valuta decimalen"
+
+#, fuzzy
+msgctxt "field:purchase.purchase,description:0"
+msgid "Description"
+msgstr "Specificatie"
+
+#, fuzzy
+msgctxt "field:purchase.purchase,invoice_address:0"
+msgid "Invoice Address"
+msgstr "Factuuradres"
+
+#, fuzzy
+msgctxt "field:purchase.purchase,invoice_exception:0"
+msgid "Invoices Exception"
+msgstr "Facturen uitzondering"
+
+#, fuzzy
+msgctxt "field:purchase.purchase,invoice_method:0"
+msgid "Invoice Method"
+msgstr "Factuur afhandeling"
+
+#, fuzzy
+msgctxt "field:purchase.purchase,invoice_paid:0"
+msgid "Invoices Paid"
+msgstr "Facturen betaald"
+
+#, fuzzy
+msgctxt "field:purchase.purchase,invoice_state:0"
+msgid "Invoice State"
+msgstr "Factuur status"
+
+#, fuzzy
+msgctxt "field:purchase.purchase,invoices:0"
+msgid "Invoices"
+msgstr "Verkoopfacturen"
+
+#, fuzzy
+msgctxt "field:purchase.purchase,invoices_ignored:0"
+msgid "Ignored Invoices"
+msgstr "Genegeerde facturen"
+
+#, fuzzy
+msgctxt "field:purchase.purchase,invoices_recreated:0"
+msgid "Recreated Invoices"
+msgstr "Opnieuw aangemaakte facturen"
+
+#, fuzzy
+msgctxt "field:purchase.purchase,lines:0"
+msgid "Lines"
+msgstr "Regels"
+
+#, fuzzy
+msgctxt "field:purchase.purchase,moves:0"
+msgid "Moves"
+msgstr "Boekingen"
+
+#, fuzzy
+msgctxt "field:purchase.purchase,party:0"
+msgid "Party"
+msgstr "Relaties"
+
+#, fuzzy
+msgctxt "field:purchase.purchase,party_lang:0"
+msgid "Party Language"
+msgstr "Taal relatie"
+
+#, fuzzy
+msgctxt "field:purchase.purchase,payment_term:0"
+msgid "Payment Term"
+msgstr "Betalingstermijn"
+
+msgctxt "field:purchase.purchase,purchase_date:0"
+msgid "Purchase Date"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:purchase.purchase,rec_name:0"
+msgid "Name"
+msgstr "Naam bijlage"
+
+#, fuzzy
+msgctxt "field:purchase.purchase,reference:0"
+msgid "Reference"
+msgstr "Referentie"
+
+#, fuzzy
+msgctxt "field:purchase.purchase,shipment_done:0"
+msgid "Shipment Done"
+msgstr "Afgeleverd"
+
+#, fuzzy
+msgctxt "field:purchase.purchase,shipment_exception:0"
+msgid "Shipments Exception"
+msgstr "Leveringen uitzonderingen"
+
+#, fuzzy
+msgctxt "field:purchase.purchase,shipment_state:0"
+msgid "Shipment State"
+msgstr "Levering status"
+
+#, fuzzy
+msgctxt "field:purchase.purchase,shipments:0"
+msgid "Shipments"
+msgstr "Leveringen"
+
+#, fuzzy
+msgctxt "field:purchase.purchase,state:0"
+msgid "State"
+msgstr "Status"
+
+msgctxt "field:purchase.purchase,supplier_reference:0"
+msgid "Supplier Reference"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:purchase.purchase,tax_amount:0"
+msgid "Tax"
+msgstr "Belasting"
+
+#, fuzzy
+msgctxt "field:purchase.purchase,total_amount:0"
+msgid "Total"
+msgstr "Totaal"
+
+#, fuzzy
+msgctxt "field:purchase.purchase,untaxed_amount:0"
+msgid "Untaxed"
+msgstr "Onbelast"
+
+#, fuzzy
+msgctxt "field:purchase.purchase,warehouse:0"
+msgid "Warehouse"
+msgstr "Magazijn"
+
+#, fuzzy
+msgctxt "field:purchase.purchase-account.invoice,invoice:0"
+msgid "Invoice"
+msgstr "Verkoopfactuur"
+
+msgctxt "field:purchase.purchase-account.invoice,purchase:0"
+msgid "Purchase"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:purchase.purchase-account.invoice,rec_name:0"
+msgid "Name"
+msgstr "Naam bijlage"
+
+#, fuzzy
+msgctxt "field:purchase.purchase-ignored-account.invoice,invoice:0"
+msgid "Invoice"
+msgstr "Verkoopfactuur"
+
+msgctxt "field:purchase.purchase-ignored-account.invoice,purchase:0"
+msgid "Purchase"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:purchase.purchase-ignored-account.invoice,rec_name:0"
+msgid "Name"
+msgstr "Naam bijlage"
+
+#, fuzzy
+msgctxt "field:purchase.purchase-recreated-account.invoice,invoice:0"
+msgid "Invoice"
+msgstr "Verkoopfactuur"
+
+msgctxt "field:purchase.purchase-recreated-account.invoice,purchase:0"
+msgid "Purchase"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:purchase.purchase-recreated-account.invoice,rec_name:0"
+msgid "Name"
+msgstr "Naam bijlage"
+
+msgctxt "field:stock.move,purchase:0"
+msgid "Purchase"
+msgstr ""
+
+msgctxt "field:stock.move,purchase_currency:0"
+msgid "Purchase Currency"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.move,purchase_exception_state:0"
+msgid "Exception State"
+msgstr "Uitzonderingstoestand"
+
+msgctxt "field:stock.move,purchase_line:0"
+msgid "Purchase Line"
+msgstr ""
+
+msgctxt "field:stock.move,purchase_quantity:0"
+msgid "Purchase Quantity"
+msgstr ""
+
+msgctxt "field:stock.move,purchase_unit:0"
+msgid "Purchase Unit"
+msgstr ""
+
+msgctxt "field:stock.move,purchase_unit_digits:0"
+msgid "Purchase Unit Digits"
+msgstr ""
+
+msgctxt "field:stock.move,purchase_unit_price:0"
+msgid "Purchase Unit Price"
+msgstr ""
+
+msgctxt "field:stock.move,purchase_visible:0"
+msgid "Purchase Visible"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.move,supplier:0"
+msgid "Supplier"
+msgstr "Leverancier"
+
+#, fuzzy
+msgctxt "help:purchase.handle.invoice.exception.ask,recreate_invoices:0"
+msgid ""
+"The selected invoices will be recreated. The other ones will be ignored."
+msgstr ""
+"De geselecteerde facturen worden opnieuw aangemaakt. De rest wordt "
+"genegeerd."
+
+msgctxt "help:purchase.handle.shipment.exception.ask,recreate_moves:0"
+msgid "The selected moves will be recreated. The other ones will be ignored."
+msgstr ""
+
+msgctxt "help:purchase.product_supplier,delivery_time:0"
+msgid "In number of days"
+msgstr ""
+
+msgctxt "help:purchase.product_supplier.price,quantity:0"
+msgid "Minimal quantity"
+msgstr ""
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_invoice_form"
+msgid "Invoices"
+msgstr "Verkoopfacturen"
+
+msgctxt "model:ir.action,name:act_open_supplier"
+msgid "Parties associated to Purchases"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_purchase_configuration_form"
+msgid "Purchase Configuration"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_purchase_form"
+msgid "Purchases"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_purchase_form2"
+msgid "Purchases"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_purchase_form_confirmed"
+msgid "Confirmed Purchases"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_purchase_form_draft"
+msgid "Draft Purchases"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_purchase_form_quotation"
+msgid "Purchases in Quotation"
+msgstr ""
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_shipment_form"
+msgid "Shipments"
+msgstr "Leveringen"
+
+msgctxt "model:ir.action,name:report_purchase"
+msgid "Purchase"
+msgstr ""
+
+#, fuzzy
+msgctxt "model:ir.action,name:wizard_invoice_handle_exception"
+msgid "Handle Invoice Exception"
+msgstr "Factuuruitzondering afhandelen"
+
+#, fuzzy
+msgctxt "model:ir.action,name:wizard_shipment_handle_exception"
+msgid "Handle Shipment Exception"
+msgstr "Zendinguitzondering afhandelen"
+
+msgctxt "model:ir.sequence,name:sequence_purchase"
+msgid "Purchase"
+msgstr ""
+
+msgctxt "model:ir.sequence.type,name:sequence_type_purchase"
+msgid "Purchase"
+msgstr ""
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_configuration"
+msgid "Configuration"
+msgstr "Instellingen"
+
+msgctxt "model:ir.ui.menu,name:menu_purchase"
+msgid "Purchase"
+msgstr ""
+
+msgctxt "model:ir.ui.menu,name:menu_purchase_configuration"
+msgid "Purchase Configuration"
+msgstr ""
+
+msgctxt "model:ir.ui.menu,name:menu_purchase_form"
+msgid "Purchases"
+msgstr ""
+
+msgctxt "model:ir.ui.menu,name:menu_purchase_form_confirmed"
+msgid "Confirmed Purchases"
+msgstr ""
+
+msgctxt "model:ir.ui.menu,name:menu_purchase_form_draft"
+msgid "Draft Purchases"
+msgstr ""
+
+msgctxt "model:ir.ui.menu,name:menu_purchase_form_quotation"
+msgid "Purchases in Quotation"
+msgstr ""
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_reporting"
+msgid "Reporting"
+msgstr "Rapportage"
+
+msgctxt "model:ir.ui.menu,name:menu_supplier"
+msgid "Parties associated to Purchases"
+msgstr ""
+
+msgctxt "model:purchase.configuration,name:0"
+msgid "Purchase Configuration"
+msgstr ""
+
+#, fuzzy
+msgctxt "model:purchase.handle.invoice.exception.ask,name:0"
+msgid "Invoice Exception Ask"
+msgstr "Factuur uitzondering vragen"
+
+#, fuzzy
+msgctxt "model:purchase.handle.shipment.exception.ask,name:0"
+msgid "Shipment Exception Ask"
+msgstr "Afleveren uitzondering vragen"
+
+msgctxt "model:purchase.line,name:0"
+msgid "Purchase Line"
+msgstr ""
+
+msgctxt "model:purchase.line-account.invoice.line,name:0"
+msgid "Purchase Line - Invoice Line"
+msgstr ""
+
+msgctxt "model:purchase.line-account.tax,name:0"
+msgid "Purchase Line - Tax"
+msgstr ""
+
+msgctxt "model:purchase.line-ignored-stock.move,name:0"
+msgid "Purchase Line - Ignored Move"
+msgstr ""
+
+msgctxt "model:purchase.line-recreated-stock.move,name:0"
+msgid "Purchase Line - Ignored Move"
+msgstr ""
+
+msgctxt "model:purchase.product_supplier,name:0"
+msgid "Product Supplier"
+msgstr ""
+
+msgctxt "model:purchase.product_supplier.price,name:0"
+msgid "Product Supplier Price"
+msgstr ""
+
+msgctxt "model:purchase.purchase,name:0"
+msgid "Purchase"
+msgstr ""
+
+msgctxt "model:purchase.purchase-account.invoice,name:0"
+msgid "Purchase - Invoice"
+msgstr ""
+
+msgctxt "model:purchase.purchase-ignored-account.invoice,name:0"
+msgid "Purchase - Ignored Invoice"
+msgstr ""
+
+msgctxt "model:purchase.purchase-recreated-account.invoice,name:0"
+msgid "Purchase - Recreated Invoice"
+msgstr ""
+
+msgctxt "model:res.group,name:group_purchase"
+msgid "Purchase"
+msgstr ""
+
+msgctxt "model:res.group,name:group_purchase_admin"
+msgid "Purchase Administrator"
+msgstr ""
+
+msgctxt "model:workflow,name:purchase_workflow"
+msgid "Purchase workflow"
+msgstr ""
+
+#, fuzzy
+msgctxt "model:workflow.activity,name:purchase_activity_cancel"
+msgid "Canceled"
+msgstr "Geannuleerd"
+
+#, fuzzy
+msgctxt "model:workflow.activity,name:purchase_activity_confirmed"
+msgid "Confirmed"
+msgstr "Bevestigd"
+
+#, fuzzy
+msgctxt "model:workflow.activity,name:purchase_activity_done"
+msgid "Done"
+msgstr "Klaar"
+
+#, fuzzy
+msgctxt "model:workflow.activity,name:purchase_activity_draft"
+msgid "Draft"
+msgstr "Concept"
+
+#, fuzzy
+msgctxt "model:workflow.activity,name:purchase_activity_invoice_done"
+msgid "Invoice Done"
+msgstr "Factuur klaar"
+
+#, fuzzy
+msgctxt "model:workflow.activity,name:purchase_activity_invoice_method"
+msgid "Invoice Method"
+msgstr "Factuur afhandeling"
+
+#, fuzzy
+msgctxt "model:workflow.activity,name:purchase_activity_invoice_method_done"
+msgid "Invoice Method Done"
+msgstr "Factuur afhandeling klaar"
+
+#, fuzzy
+msgctxt ""
+"model:workflow.activity,name:purchase_activity_invoice_purchase_exception"
+msgid "Invoice Exception"
+msgstr "Factuur uitzondering"
+
+#, fuzzy
+msgctxt "model:workflow.activity,name:purchase_activity_invoice_shipment"
+msgid "Invoice Shipment"
+msgstr "Factuur zending"
+
+#, fuzzy
+msgctxt "model:workflow.activity,name:purchase_activity_invoice_shipment_done"
+msgid "Invoice Shipment Done"
+msgstr "Factuur zending klaar"
+
+#, fuzzy
+msgctxt ""
+"model:workflow.activity,name:purchase_activity_invoice_shipment_exception"
+msgid "Invoice Shipment Exception"
+msgstr "Factuur zending uitzondering"
+
+#, fuzzy
+msgctxt ""
+"model:workflow.activity,name:purchase_activity_invoice_shipment_method"
+msgid "Invoice Shipment Method"
+msgstr "Factuur zending afhandeling"
+
+#, fuzzy
+msgctxt ""
+"model:workflow.activity,name:purchase_activity_invoice_shipment_method_done"
+msgid "Invoice Shipment Method Done"
+msgstr "Factuur zending afhandeling klaar"
+
+#, fuzzy
+msgctxt "model:workflow.activity,name:purchase_activity_quotation"
+msgid "Quotation"
+msgstr "Offerte"
+
+#, fuzzy
+msgctxt "model:workflow.activity,name:purchase_activity_shipment_exception"
+msgid "Shipment Exception"
+msgstr "Afleveren uitzondering"
+
+#, fuzzy
+msgctxt ""
+"model:workflow.activity,name:purchase_activity_waiting_invoice_purchase"
+msgid "Waiting Invoice"
+msgstr "Wacht op factuur"
+
+#, fuzzy
+msgctxt ""
+"model:workflow.activity,name:purchase_activity_waiting_invoice_shipment"
+msgid "Waiting Invoice Shipment"
+msgstr "Wacht op factuur levering"
+
+#, fuzzy
+msgctxt "model:workflow.activity,name:purchase_activity_waiting_shipment"
+msgid "Waiting Shipment"
+msgstr "Wacht op aflevering"
+
+#, fuzzy
+msgctxt "odt:purchase.purchase:0"
+msgid "Amount"
+msgstr "Bedrag"
+
+#, fuzzy
+msgctxt "odt:purchase.purchase:0"
+msgid "Date:"
+msgstr "Datum:"
+
+#, fuzzy
+msgctxt "odt:purchase.purchase:0"
+msgid "Description"
+msgstr "Specificatie"
+
+#, fuzzy
+msgctxt "odt:purchase.purchase:0"
+msgid "Description:"
+msgstr "Betreft:"
+
+msgctxt "odt:purchase.purchase:0"
+msgid "Draft Purchase Order"
+msgstr ""
+
+#, fuzzy
+msgctxt "odt:purchase.purchase:0"
+msgid "E-Mail:"
+msgstr "E-mail:"
+
+#, fuzzy
+msgctxt "odt:purchase.purchase:0"
+msgid "Phone:"
+msgstr "Telefoon:"
+
+msgctxt "odt:purchase.purchase:0"
+msgid "Purchase Order N°:"
+msgstr ""
+
+#, fuzzy
+msgctxt "odt:purchase.purchase:0"
+msgid "Quantity"
+msgstr "Hoeveelheid"
+
+msgctxt "odt:purchase.purchase:0"
+msgid "Request for Quotation N°:"
+msgstr ""
+
+#, fuzzy
+msgctxt "odt:purchase.purchase:0"
+msgid "Taxes"
+msgstr "Belastingen"
+
+#, fuzzy
+msgctxt "odt:purchase.purchase:0"
+msgid "Taxes:"
+msgstr "Belastingen:"
+
+#, fuzzy
+msgctxt "odt:purchase.purchase:0"
+msgid "Total (excl. taxes):"
+msgstr "Totaal (excl. belasting):"
+
+#, fuzzy
+msgctxt "odt:purchase.purchase:0"
+msgid "Total:"
+msgstr "Totaal:"
+
+#, fuzzy
+msgctxt "odt:purchase.purchase:0"
+msgid "Unit Price"
+msgstr "Eenheidsprijs"
+
+#, fuzzy
+msgctxt "odt:purchase.purchase:0"
+msgid "VAT Number:"
+msgstr "BTW-nummer:"
+
+#, fuzzy
+msgctxt "odt:purchase.purchase:0"
+msgid "VAT:"
+msgstr "BTW:"
+
+msgctxt "selection:account.invoice,purchase_exception_state:0"
+msgid ""
+msgstr ""
+
+#, fuzzy
+msgctxt "selection:account.invoice,purchase_exception_state:0"
+msgid "Ignored"
+msgstr "Genegeerd"
+
+#, fuzzy
+msgctxt "selection:account.invoice,purchase_exception_state:0"
+msgid "Recreated"
+msgstr "Opnieuw aangemaakt"
+
+msgctxt "selection:purchase.configuration,purchase_invoice_method:0"
+msgid "Based On Order"
+msgstr ""
+
+msgctxt "selection:purchase.configuration,purchase_invoice_method:0"
+msgid "Based On Shipment"
+msgstr ""
+
+#, fuzzy
+msgctxt "selection:purchase.configuration,purchase_invoice_method:0"
+msgid "Manual"
+msgstr "Handmatig"
+
+#, fuzzy
+msgctxt "selection:purchase.line,type:0"
+msgid "Comment"
+msgstr "Opmerking"
+
+#, fuzzy
+msgctxt "selection:purchase.line,type:0"
+msgid "Line"
+msgstr "Regel"
+
+#, fuzzy
+msgctxt "selection:purchase.line,type:0"
+msgid "Subtotal"
+msgstr "Subtotaal"
+
+#, fuzzy
+msgctxt "selection:purchase.line,type:0"
+msgid "Title"
+msgstr "Titel"
+
+msgctxt "selection:purchase.purchase,invoice_method:0"
+msgid "Based On Order"
+msgstr ""
+
+msgctxt "selection:purchase.purchase,invoice_method:0"
+msgid "Based On Shipment"
+msgstr ""
+
+#, fuzzy
+msgctxt "selection:purchase.purchase,invoice_method:0"
+msgid "Manual"
+msgstr "Handmatig"
+
+#, fuzzy
+msgctxt "selection:purchase.purchase,invoice_state:0"
+msgid "Exception"
+msgstr "Uitzondering"
+
+#, fuzzy
+msgctxt "selection:purchase.purchase,invoice_state:0"
+msgid "None"
+msgstr "Geen"
+
+#, fuzzy
+msgctxt "selection:purchase.purchase,invoice_state:0"
+msgid "Paid"
+msgstr "Betaald"
+
+#, fuzzy
+msgctxt "selection:purchase.purchase,invoice_state:0"
+msgid "Waiting"
+msgstr "In afwachting"
+
+#, fuzzy
+msgctxt "selection:purchase.purchase,shipment_state:0"
+msgid "Exception"
+msgstr "Uitzondering"
+
+#, fuzzy
+msgctxt "selection:purchase.purchase,shipment_state:0"
+msgid "None"
+msgstr "Geen"
+
+msgctxt "selection:purchase.purchase,shipment_state:0"
+msgid "Received"
+msgstr ""
+
+#, fuzzy
+msgctxt "selection:purchase.purchase,shipment_state:0"
+msgid "Waiting"
+msgstr "In afwachting"
+
+#, fuzzy
+msgctxt "selection:purchase.purchase,state:0"
+msgid "Canceled"
+msgstr "Geannuleerd"
+
+#, fuzzy
+msgctxt "selection:purchase.purchase,state:0"
+msgid "Confirmed"
+msgstr "Bevestigd"
+
+#, fuzzy
+msgctxt "selection:purchase.purchase,state:0"
+msgid "Done"
+msgstr "Klaar"
+
+#, fuzzy
+msgctxt "selection:purchase.purchase,state:0"
+msgid "Draft"
+msgstr "Concept"
+
+#, fuzzy
+msgctxt "selection:purchase.purchase,state:0"
+msgid "Quotation"
+msgstr "Offerte"
+
+msgctxt "selection:stock.move,purchase_exception_state:0"
+msgid ""
+msgstr ""
+
+#, fuzzy
+msgctxt "selection:stock.move,purchase_exception_state:0"
+msgid "Ignored"
+msgstr "Genegeerd"
+
+#, fuzzy
+msgctxt "selection:stock.move,purchase_exception_state:0"
+msgid "Recreated"
+msgstr "Opnieuw aangemaakt"
+
+msgctxt "view:product.template:0"
+msgid "Product Suppliers"
+msgstr ""
+
+msgctxt "view:product.template:0"
+msgid "Suppliers"
+msgstr ""
+
+msgctxt "view:purchase.configuration:0"
+msgid "Purchase Configuration"
+msgstr ""
+
+#, fuzzy
+msgctxt "view:purchase.handle.invoice.exception.ask:0"
+msgid "Choose invoices to recreate"
+msgstr "Kies facturen om opnieuw aan te maken"
+
+#, fuzzy
+msgctxt "view:purchase.handle.invoice.exception.ask:0"
+msgid "Handle Invoice Exception"
+msgstr "Factuuruitzondering afhandelen"
+
+#, fuzzy
+msgctxt "view:purchase.handle.shipment.exception.ask:0"
+msgid "Choose move to recreate"
+msgstr "Kies boeking om opnieuw aan te maken"
+
+#, fuzzy
+msgctxt "view:purchase.handle.shipment.exception.ask:0"
+msgid "Handle shipment Exception"
+msgstr "Zendinguitzondering afhandelen"
+
+#, fuzzy
+msgctxt "view:purchase.handle.shipment.exception.ask:0"
+msgid "Recreated Moves"
+msgstr "Opnieuw aangemaakte boekingen"
+
+#, fuzzy
+msgctxt "view:purchase.line:0"
+msgid "General"
+msgstr "Algemeen"
+
+#, fuzzy
+msgctxt "view:purchase.line:0"
+msgid "Notes"
+msgstr "Aantekeningen"
+
+#, fuzzy
+msgctxt "view:purchase.line:0"
+msgid "Products"
+msgstr "Producten"
+
+msgctxt "view:purchase.line:0"
+msgid "Purchase Line"
+msgstr ""
+
+msgctxt "view:purchase.line:0"
+msgid "Purchase Lines"
+msgstr ""
+
+msgctxt "view:purchase.product_supplier.price:0"
+msgid "Product Supplier Price"
+msgstr ""
+
+msgctxt "view:purchase.product_supplier.price:0"
+msgid "Product Supplier Prices"
+msgstr ""
+
+msgctxt "view:purchase.product_supplier:0"
+msgid "Product Supplier"
+msgstr ""
+
+msgctxt "view:purchase.product_supplier:0"
+msgid "Product Suppliers"
+msgstr ""
+
+#, fuzzy
+msgctxt "view:purchase.purchase:0"
+msgid "Cancel"
+msgstr "Annuleren"
+
+#, fuzzy
+msgctxt "view:purchase.purchase:0"
+msgid "Confirm"
+msgstr "Bevestig"
+
+#, fuzzy
+msgctxt "view:purchase.purchase:0"
+msgid "Draft"
+msgstr "Concept"
+
+#, fuzzy
+msgctxt "view:purchase.purchase:0"
+msgid "Handle Invoice Exception"
+msgstr "Factuuruitzondering afhandelen"
+
+#, fuzzy
+msgctxt "view:purchase.purchase:0"
+msgid "Handle Shipment Exception"
+msgstr "Zendinguitzondering afhandelen"
+
+#, fuzzy
+msgctxt "view:purchase.purchase:0"
+msgid "Invoices"
+msgstr "Verkoopfacturen"
+
+#, fuzzy
+msgctxt "view:purchase.purchase:0"
+msgid "Lines"
+msgstr "Regels"
+
+#, fuzzy
+msgctxt "view:purchase.purchase:0"
+msgid "Moves"
+msgstr "Boekingen"
+
+#, fuzzy
+msgctxt "view:purchase.purchase:0"
+msgid "Other Info"
+msgstr "Aanvullende informatie"
+
+msgctxt "view:purchase.purchase:0"
+msgid "Purchase"
+msgstr ""
+
+msgctxt "view:purchase.purchase:0"
+msgid "Purchases"
+msgstr ""
+
+#, fuzzy
+msgctxt "view:purchase.purchase:0"
+msgid "Quotation"
+msgstr "Offerte"
+
+#, fuzzy
+msgctxt "view:purchase.purchase:0"
+msgid "Shipments"
+msgstr "Leveringen"
+
+#, fuzzy
+msgctxt "wizard_button:purchase.handle.invoice.exception,init,end:0"
+msgid "Cancel"
+msgstr "Annuleren"
+
+#, fuzzy
+msgctxt "wizard_button:purchase.handle.invoice.exception,init,ok:0"
+msgid "Ok"
+msgstr "Oké"
+
+#, fuzzy
+msgctxt "wizard_button:purchase.handle.shipment.exception,init,end:0"
+msgid "Cancel"
+msgstr "Annuleren"
+
+#, fuzzy
+msgctxt "wizard_button:purchase.handle.shipment.exception,init,ok:0"
+msgid "Ok"
+msgstr "Oké"
diff --git a/locale/ru_RU.po b/locale/ru_RU.po
new file mode 100644
index 0000000..bbfb0ba
--- /dev/null
+++ b/locale/ru_RU.po
@@ -0,0 +1,1122 @@
+# 
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "error:account.invoice:0"
+msgid "You can not delete invoices that come from a purchase!"
+msgstr ""
+
+msgctxt "error:account.invoice:0"
+msgid "You cannot reset to draft an invoice generated by a purchase."
+msgstr ""
+
+msgctxt "error:product.template:0"
+msgid ""
+"Purchase prices are based on the purchase uom, are you sure to change it?"
+msgstr ""
+
+msgctxt "error:purchase.line:0"
+msgid "It misses an \"Account Expense\" on product \"%s\"!"
+msgstr ""
+
+msgctxt "error:purchase.line:0"
+msgid "It misses an \"account expense\" default property!"
+msgstr ""
+
+msgctxt "error:purchase.line:0"
+msgid "The supplier location is required!"
+msgstr ""
+
+msgctxt "error:purchase.purchase:0"
+msgid "Invoice addresses must be defined for the quotation."
+msgstr ""
+
+msgctxt "error:purchase.purchase:0"
+msgid "It misses an \"Account Payable\" on the party \"%s\"!"
+msgstr ""
+
+msgctxt "error:stock.shipment.in:0"
+msgid "You cannot reset to draft a move generated by a purchase."
+msgstr ""
+
+msgctxt "field:account.invoice,purchase_exception_state:0"
+msgid "Exception State"
+msgstr ""
+
+msgctxt "field:account.invoice,purchases:0"
+msgid "Purchases"
+msgstr ""
+
+msgctxt "field:account.invoice.line,purchase_lines:0"
+msgid "Purchase Lines"
+msgstr ""
+
+msgctxt "field:product.template,product_suppliers:0"
+msgid "Suppliers"
+msgstr ""
+
+msgctxt "field:product.template,purchasable:0"
+msgid "Purchasable"
+msgstr ""
+
+msgctxt "field:product.template,purchase_uom:0"
+msgid "Purchase UOM"
+msgstr ""
+
+msgctxt "field:purchase.configuration,purchase_invoice_method:0"
+msgid "Invoice Method"
+msgstr ""
+
+msgctxt "field:purchase.configuration,purchase_sequence:0"
+msgid "Purchase Reference Sequence"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:purchase.configuration,rec_name:0"
+msgid "Name"
+msgstr "Наименование"
+
+msgctxt "field:purchase.handle.invoice.exception.ask,domain_invoices:0"
+msgid "Domain Invoices"
+msgstr ""
+
+msgctxt "field:purchase.handle.invoice.exception.ask,recreate_invoices:0"
+msgid "Recreate Invoices"
+msgstr ""
+
+msgctxt "field:purchase.handle.shipment.exception.ask,domain_moves:0"
+msgid "Domain Moves"
+msgstr ""
+
+msgctxt "field:purchase.handle.shipment.exception.ask,recreate_moves:0"
+msgid "Recreate Moves"
+msgstr ""
+
+msgctxt "field:purchase.line,amount:0"
+msgid "Amount"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:purchase.line,description:0"
+msgid "Description"
+msgstr "Описание"
+
+msgctxt "field:purchase.line,invoice_lines:0"
+msgid "Invoice Lines"
+msgstr ""
+
+msgctxt "field:purchase.line,move_done:0"
+msgid "Moves Done"
+msgstr ""
+
+msgctxt "field:purchase.line,move_exception:0"
+msgid "Moves Exception"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:purchase.line,moves:0"
+msgid "Moves"
+msgstr "Перемещения"
+
+msgctxt "field:purchase.line,moves_ignored:0"
+msgid "Ignored Moves"
+msgstr ""
+
+msgctxt "field:purchase.line,moves_recreated:0"
+msgid "Recreated Moves"
+msgstr ""
+
+msgctxt "field:purchase.line,note:0"
+msgid "Note"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:purchase.line,product:0"
+msgid "Product"
+msgstr "Товарно материальные ценности (ТМЦ)"
+
+msgctxt "field:purchase.line,purchase:0"
+msgid "Purchase"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:purchase.line,quantity:0"
+msgid "Quantity"
+msgstr "Кол-во"
+
+#, fuzzy
+msgctxt "field:purchase.line,rec_name:0"
+msgid "Name"
+msgstr "Наименование"
+
+#, fuzzy
+msgctxt "field:purchase.line,sequence:0"
+msgid "Sequence"
+msgstr "Последовательность"
+
+msgctxt "field:purchase.line,taxes:0"
+msgid "Taxes"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:purchase.line,type:0"
+msgid "Type"
+msgstr "Тип"
+
+#, fuzzy
+msgctxt "field:purchase.line,unit:0"
+msgid "Unit"
+msgstr "Штука"
+
+#, fuzzy
+msgctxt "field:purchase.line,unit_digits:0"
+msgid "Unit Digits"
+msgstr "Группа цифр"
+
+#, fuzzy
+msgctxt "field:purchase.line,unit_price:0"
+msgid "Unit Price"
+msgstr "Цена за единицу"
+
+msgctxt "field:purchase.line-account.invoice.line,invoice_line:0"
+msgid "Invoice Line"
+msgstr ""
+
+msgctxt "field:purchase.line-account.invoice.line,purchase_line:0"
+msgid "Purchase Line"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:purchase.line-account.invoice.line,rec_name:0"
+msgid "Name"
+msgstr "Наименование"
+
+msgctxt "field:purchase.line-account.tax,line:0"
+msgid "Purchase Line"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:purchase.line-account.tax,rec_name:0"
+msgid "Name"
+msgstr "Наименование"
+
+msgctxt "field:purchase.line-account.tax,tax:0"
+msgid "Tax"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:purchase.line-ignored-stock.move,move:0"
+msgid "Move"
+msgstr "Перемещение"
+
+msgctxt "field:purchase.line-ignored-stock.move,purchase_line:0"
+msgid "Purchase Line"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:purchase.line-ignored-stock.move,rec_name:0"
+msgid "Name"
+msgstr "Наименование"
+
+#, fuzzy
+msgctxt "field:purchase.line-recreated-stock.move,move:0"
+msgid "Move"
+msgstr "Перемещение"
+
+msgctxt "field:purchase.line-recreated-stock.move,purchase_line:0"
+msgid "Purchase Line"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:purchase.line-recreated-stock.move,rec_name:0"
+msgid "Name"
+msgstr "Наименование"
+
+#, fuzzy
+msgctxt "field:purchase.product_supplier,code:0"
+msgid "Code"
+msgstr "Код страны"
+
+#, fuzzy
+msgctxt "field:purchase.product_supplier,company:0"
+msgid "Company"
+msgstr "Учет.орг."
+
+msgctxt "field:purchase.product_supplier,delivery_time:0"
+msgid "Delivery Time"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:purchase.product_supplier,name:0"
+msgid "Name"
+msgstr "Наименование"
+
+#, fuzzy
+msgctxt "field:purchase.product_supplier,party:0"
+msgid "Supplier"
+msgstr "Поставщик"
+
+msgctxt "field:purchase.product_supplier,prices:0"
+msgid "Prices"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:purchase.product_supplier,product:0"
+msgid "Product"
+msgstr "Товарно материальные ценности (ТМЦ)"
+
+#, fuzzy
+msgctxt "field:purchase.product_supplier,rec_name:0"
+msgid "Name"
+msgstr "Наименование"
+
+#, fuzzy
+msgctxt "field:purchase.product_supplier,sequence:0"
+msgid "Sequence"
+msgstr "Последовательность"
+
+#, fuzzy
+msgctxt "field:purchase.product_supplier.price,product_supplier:0"
+msgid "Supplier"
+msgstr "Поставщик"
+
+#, fuzzy
+msgctxt "field:purchase.product_supplier.price,quantity:0"
+msgid "Quantity"
+msgstr "Кол-во"
+
+#, fuzzy
+msgctxt "field:purchase.product_supplier.price,rec_name:0"
+msgid "Name"
+msgstr "Наименование"
+
+#, fuzzy
+msgctxt "field:purchase.product_supplier.price,unit_price:0"
+msgid "Unit Price"
+msgstr "Цена за единицу"
+
+#, fuzzy
+msgctxt "field:purchase.purchase,comment:0"
+msgid "Comment"
+msgstr "Комментарии"
+
+#, fuzzy
+msgctxt "field:purchase.purchase,company:0"
+msgid "Company"
+msgstr "Учет.орг."
+
+#, fuzzy
+msgctxt "field:purchase.purchase,currency:0"
+msgid "Currency"
+msgstr "Валюты"
+
+msgctxt "field:purchase.purchase,currency_digits:0"
+msgid "Currency Digits"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:purchase.purchase,description:0"
+msgid "Description"
+msgstr "Описание"
+
+msgctxt "field:purchase.purchase,invoice_address:0"
+msgid "Invoice Address"
+msgstr ""
+
+msgctxt "field:purchase.purchase,invoice_exception:0"
+msgid "Invoices Exception"
+msgstr ""
+
+msgctxt "field:purchase.purchase,invoice_method:0"
+msgid "Invoice Method"
+msgstr ""
+
+msgctxt "field:purchase.purchase,invoice_paid:0"
+msgid "Invoices Paid"
+msgstr ""
+
+msgctxt "field:purchase.purchase,invoice_state:0"
+msgid "Invoice State"
+msgstr ""
+
+msgctxt "field:purchase.purchase,invoices:0"
+msgid "Invoices"
+msgstr ""
+
+msgctxt "field:purchase.purchase,invoices_ignored:0"
+msgid "Ignored Invoices"
+msgstr ""
+
+msgctxt "field:purchase.purchase,invoices_recreated:0"
+msgid "Recreated Invoices"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:purchase.purchase,lines:0"
+msgid "Lines"
+msgstr "Строки"
+
+#, fuzzy
+msgctxt "field:purchase.purchase,moves:0"
+msgid "Moves"
+msgstr "Перемещения"
+
+#, fuzzy
+msgctxt "field:purchase.purchase,party:0"
+msgid "Party"
+msgstr "Организации"
+
+msgctxt "field:purchase.purchase,party_lang:0"
+msgid "Party Language"
+msgstr ""
+
+msgctxt "field:purchase.purchase,payment_term:0"
+msgid "Payment Term"
+msgstr ""
+
+msgctxt "field:purchase.purchase,purchase_date:0"
+msgid "Purchase Date"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:purchase.purchase,rec_name:0"
+msgid "Name"
+msgstr "Наименование"
+
+#, fuzzy
+msgctxt "field:purchase.purchase,reference:0"
+msgid "Reference"
+msgstr "Ссылка"
+
+msgctxt "field:purchase.purchase,shipment_done:0"
+msgid "Shipment Done"
+msgstr ""
+
+msgctxt "field:purchase.purchase,shipment_exception:0"
+msgid "Shipments Exception"
+msgstr ""
+
+msgctxt "field:purchase.purchase,shipment_state:0"
+msgid "Shipment State"
+msgstr ""
+
+msgctxt "field:purchase.purchase,shipments:0"
+msgid "Shipments"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:purchase.purchase,state:0"
+msgid "State"
+msgstr "Статус"
+
+msgctxt "field:purchase.purchase,supplier_reference:0"
+msgid "Supplier Reference"
+msgstr ""
+
+msgctxt "field:purchase.purchase,tax_amount:0"
+msgid "Tax"
+msgstr ""
+
+msgctxt "field:purchase.purchase,total_amount:0"
+msgid "Total"
+msgstr ""
+
+msgctxt "field:purchase.purchase,untaxed_amount:0"
+msgid "Untaxed"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:purchase.purchase,warehouse:0"
+msgid "Warehouse"
+msgstr "Товарный склад"
+
+msgctxt "field:purchase.purchase-account.invoice,invoice:0"
+msgid "Invoice"
+msgstr ""
+
+msgctxt "field:purchase.purchase-account.invoice,purchase:0"
+msgid "Purchase"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:purchase.purchase-account.invoice,rec_name:0"
+msgid "Name"
+msgstr "Наименование"
+
+msgctxt "field:purchase.purchase-ignored-account.invoice,invoice:0"
+msgid "Invoice"
+msgstr ""
+
+msgctxt "field:purchase.purchase-ignored-account.invoice,purchase:0"
+msgid "Purchase"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:purchase.purchase-ignored-account.invoice,rec_name:0"
+msgid "Name"
+msgstr "Наименование"
+
+msgctxt "field:purchase.purchase-recreated-account.invoice,invoice:0"
+msgid "Invoice"
+msgstr ""
+
+msgctxt "field:purchase.purchase-recreated-account.invoice,purchase:0"
+msgid "Purchase"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:purchase.purchase-recreated-account.invoice,rec_name:0"
+msgid "Name"
+msgstr "Наименование"
+
+msgctxt "field:stock.move,purchase:0"
+msgid "Purchase"
+msgstr ""
+
+msgctxt "field:stock.move,purchase_currency:0"
+msgid "Purchase Currency"
+msgstr ""
+
+msgctxt "field:stock.move,purchase_exception_state:0"
+msgid "Exception State"
+msgstr ""
+
+msgctxt "field:stock.move,purchase_line:0"
+msgid "Purchase Line"
+msgstr ""
+
+msgctxt "field:stock.move,purchase_quantity:0"
+msgid "Purchase Quantity"
+msgstr ""
+
+msgctxt "field:stock.move,purchase_unit:0"
+msgid "Purchase Unit"
+msgstr ""
+
+msgctxt "field:stock.move,purchase_unit_digits:0"
+msgid "Purchase Unit Digits"
+msgstr ""
+
+msgctxt "field:stock.move,purchase_unit_price:0"
+msgid "Purchase Unit Price"
+msgstr ""
+
+msgctxt "field:stock.move,purchase_visible:0"
+msgid "Purchase Visible"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.move,supplier:0"
+msgid "Supplier"
+msgstr "Поставщик"
+
+msgctxt "help:purchase.handle.invoice.exception.ask,recreate_invoices:0"
+msgid ""
+"The selected invoices will be recreated. The other ones will be ignored."
+msgstr ""
+
+msgctxt "help:purchase.handle.shipment.exception.ask,recreate_moves:0"
+msgid "The selected moves will be recreated. The other ones will be ignored."
+msgstr ""
+
+msgctxt "help:purchase.product_supplier,delivery_time:0"
+msgid "In number of days"
+msgstr ""
+
+msgctxt "help:purchase.product_supplier.price,quantity:0"
+msgid "Minimal quantity"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_invoice_form"
+msgid "Invoices"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_open_supplier"
+msgid "Parties associated to Purchases"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_purchase_configuration_form"
+msgid "Purchase Configuration"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_purchase_form"
+msgid "Purchases"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_purchase_form2"
+msgid "Purchases"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_purchase_form_confirmed"
+msgid "Confirmed Purchases"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_purchase_form_draft"
+msgid "Draft Purchases"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_purchase_form_quotation"
+msgid "Purchases in Quotation"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_shipment_form"
+msgid "Shipments"
+msgstr ""
+
+msgctxt "model:ir.action,name:report_purchase"
+msgid "Purchase"
+msgstr ""
+
+msgctxt "model:ir.action,name:wizard_invoice_handle_exception"
+msgid "Handle Invoice Exception"
+msgstr ""
+
+msgctxt "model:ir.action,name:wizard_shipment_handle_exception"
+msgid "Handle Shipment Exception"
+msgstr ""
+
+msgctxt "model:ir.sequence,name:sequence_purchase"
+msgid "Purchase"
+msgstr ""
+
+msgctxt "model:ir.sequence.type,name:sequence_type_purchase"
+msgid "Purchase"
+msgstr ""
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_configuration"
+msgid "Configuration"
+msgstr "Конфигурация"
+
+msgctxt "model:ir.ui.menu,name:menu_purchase"
+msgid "Purchase"
+msgstr ""
+
+msgctxt "model:ir.ui.menu,name:menu_purchase_configuration"
+msgid "Purchase Configuration"
+msgstr ""
+
+msgctxt "model:ir.ui.menu,name:menu_purchase_form"
+msgid "Purchases"
+msgstr ""
+
+msgctxt "model:ir.ui.menu,name:menu_purchase_form_confirmed"
+msgid "Confirmed Purchases"
+msgstr ""
+
+msgctxt "model:ir.ui.menu,name:menu_purchase_form_draft"
+msgid "Draft Purchases"
+msgstr ""
+
+msgctxt "model:ir.ui.menu,name:menu_purchase_form_quotation"
+msgid "Purchases in Quotation"
+msgstr ""
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_reporting"
+msgid "Reporting"
+msgstr "Отчетность"
+
+msgctxt "model:ir.ui.menu,name:menu_supplier"
+msgid "Parties associated to Purchases"
+msgstr ""
+
+msgctxt "model:purchase.configuration,name:0"
+msgid "Purchase Configuration"
+msgstr ""
+
+msgctxt "model:purchase.handle.invoice.exception.ask,name:0"
+msgid "Invoice Exception Ask"
+msgstr ""
+
+msgctxt "model:purchase.handle.shipment.exception.ask,name:0"
+msgid "Shipment Exception Ask"
+msgstr ""
+
+msgctxt "model:purchase.line,name:0"
+msgid "Purchase Line"
+msgstr ""
+
+msgctxt "model:purchase.line-account.invoice.line,name:0"
+msgid "Purchase Line - Invoice Line"
+msgstr ""
+
+msgctxt "model:purchase.line-account.tax,name:0"
+msgid "Purchase Line - Tax"
+msgstr ""
+
+msgctxt "model:purchase.line-ignored-stock.move,name:0"
+msgid "Purchase Line - Ignored Move"
+msgstr ""
+
+msgctxt "model:purchase.line-recreated-stock.move,name:0"
+msgid "Purchase Line - Ignored Move"
+msgstr ""
+
+msgctxt "model:purchase.product_supplier,name:0"
+msgid "Product Supplier"
+msgstr ""
+
+msgctxt "model:purchase.product_supplier.price,name:0"
+msgid "Product Supplier Price"
+msgstr ""
+
+msgctxt "model:purchase.purchase,name:0"
+msgid "Purchase"
+msgstr ""
+
+msgctxt "model:purchase.purchase-account.invoice,name:0"
+msgid "Purchase - Invoice"
+msgstr ""
+
+msgctxt "model:purchase.purchase-ignored-account.invoice,name:0"
+msgid "Purchase - Ignored Invoice"
+msgstr ""
+
+msgctxt "model:purchase.purchase-recreated-account.invoice,name:0"
+msgid "Purchase - Recreated Invoice"
+msgstr ""
+
+msgctxt "model:res.group,name:group_purchase"
+msgid "Purchase"
+msgstr ""
+
+msgctxt "model:res.group,name:group_purchase_admin"
+msgid "Purchase Administrator"
+msgstr ""
+
+msgctxt "model:workflow,name:purchase_workflow"
+msgid "Purchase workflow"
+msgstr ""
+
+#, fuzzy
+msgctxt "model:workflow.activity,name:purchase_activity_cancel"
+msgid "Canceled"
+msgstr "Отменено"
+
+#, fuzzy
+msgctxt "model:workflow.activity,name:purchase_activity_confirmed"
+msgid "Confirmed"
+msgstr "Подтвержденно"
+
+#, fuzzy
+msgctxt "model:workflow.activity,name:purchase_activity_done"
+msgid "Done"
+msgstr "Выполнено"
+
+#, fuzzy
+msgctxt "model:workflow.activity,name:purchase_activity_draft"
+msgid "Draft"
+msgstr "Черновик"
+
+msgctxt "model:workflow.activity,name:purchase_activity_invoice_done"
+msgid "Invoice Done"
+msgstr ""
+
+msgctxt "model:workflow.activity,name:purchase_activity_invoice_method"
+msgid "Invoice Method"
+msgstr ""
+
+msgctxt "model:workflow.activity,name:purchase_activity_invoice_method_done"
+msgid "Invoice Method Done"
+msgstr ""
+
+msgctxt ""
+"model:workflow.activity,name:purchase_activity_invoice_purchase_exception"
+msgid "Invoice Exception"
+msgstr ""
+
+msgctxt "model:workflow.activity,name:purchase_activity_invoice_shipment"
+msgid "Invoice Shipment"
+msgstr ""
+
+msgctxt "model:workflow.activity,name:purchase_activity_invoice_shipment_done"
+msgid "Invoice Shipment Done"
+msgstr ""
+
+msgctxt ""
+"model:workflow.activity,name:purchase_activity_invoice_shipment_exception"
+msgid "Invoice Shipment Exception"
+msgstr ""
+
+msgctxt ""
+"model:workflow.activity,name:purchase_activity_invoice_shipment_method"
+msgid "Invoice Shipment Method"
+msgstr ""
+
+msgctxt ""
+"model:workflow.activity,name:purchase_activity_invoice_shipment_method_done"
+msgid "Invoice Shipment Method Done"
+msgstr ""
+
+msgctxt "model:workflow.activity,name:purchase_activity_quotation"
+msgid "Quotation"
+msgstr ""
+
+msgctxt "model:workflow.activity,name:purchase_activity_shipment_exception"
+msgid "Shipment Exception"
+msgstr ""
+
+msgctxt ""
+"model:workflow.activity,name:purchase_activity_waiting_invoice_purchase"
+msgid "Waiting Invoice"
+msgstr ""
+
+msgctxt ""
+"model:workflow.activity,name:purchase_activity_waiting_invoice_shipment"
+msgid "Waiting Invoice Shipment"
+msgstr ""
+
+msgctxt "model:workflow.activity,name:purchase_activity_waiting_shipment"
+msgid "Waiting Shipment"
+msgstr ""
+
+msgctxt "odt:purchase.purchase:0"
+msgid "Amount"
+msgstr ""
+
+#, fuzzy
+msgctxt "odt:purchase.purchase:0"
+msgid "Date:"
+msgstr "Дата:"
+
+#, fuzzy
+msgctxt "odt:purchase.purchase:0"
+msgid "Description"
+msgstr "Описание"
+
+msgctxt "odt:purchase.purchase:0"
+msgid "Description:"
+msgstr ""
+
+msgctxt "odt:purchase.purchase:0"
+msgid "Draft Purchase Order"
+msgstr ""
+
+#, fuzzy
+msgctxt "odt:purchase.purchase:0"
+msgid "E-Mail:"
+msgstr "E-Mail:"
+
+#, fuzzy
+msgctxt "odt:purchase.purchase:0"
+msgid "Phone:"
+msgstr "Телефон:"
+
+msgctxt "odt:purchase.purchase:0"
+msgid "Purchase Order N°:"
+msgstr ""
+
+#, fuzzy
+msgctxt "odt:purchase.purchase:0"
+msgid "Quantity"
+msgstr "Кол-во"
+
+msgctxt "odt:purchase.purchase:0"
+msgid "Request for Quotation N°:"
+msgstr ""
+
+msgctxt "odt:purchase.purchase:0"
+msgid "Taxes"
+msgstr ""
+
+msgctxt "odt:purchase.purchase:0"
+msgid "Taxes:"
+msgstr ""
+
+msgctxt "odt:purchase.purchase:0"
+msgid "Total (excl. taxes):"
+msgstr ""
+
+msgctxt "odt:purchase.purchase:0"
+msgid "Total:"
+msgstr ""
+
+#, fuzzy
+msgctxt "odt:purchase.purchase:0"
+msgid "Unit Price"
+msgstr "Цена за единицу"
+
+msgctxt "odt:purchase.purchase:0"
+msgid "VAT Number:"
+msgstr ""
+
+msgctxt "odt:purchase.purchase:0"
+msgid "VAT:"
+msgstr ""
+
+#, fuzzy
+msgctxt "selection:account.invoice,purchase_exception_state:0"
+msgid ""
+msgstr "Резервный счет"
+
+msgctxt "selection:account.invoice,purchase_exception_state:0"
+msgid "Ignored"
+msgstr ""
+
+msgctxt "selection:account.invoice,purchase_exception_state:0"
+msgid "Recreated"
+msgstr ""
+
+msgctxt "selection:purchase.configuration,purchase_invoice_method:0"
+msgid "Based On Order"
+msgstr ""
+
+msgctxt "selection:purchase.configuration,purchase_invoice_method:0"
+msgid "Based On Shipment"
+msgstr ""
+
+msgctxt "selection:purchase.configuration,purchase_invoice_method:0"
+msgid "Manual"
+msgstr ""
+
+#, fuzzy
+msgctxt "selection:purchase.line,type:0"
+msgid "Comment"
+msgstr "Комментарии"
+
+msgctxt "selection:purchase.line,type:0"
+msgid "Line"
+msgstr ""
+
+msgctxt "selection:purchase.line,type:0"
+msgid "Subtotal"
+msgstr ""
+
+msgctxt "selection:purchase.line,type:0"
+msgid "Title"
+msgstr ""
+
+msgctxt "selection:purchase.purchase,invoice_method:0"
+msgid "Based On Order"
+msgstr ""
+
+msgctxt "selection:purchase.purchase,invoice_method:0"
+msgid "Based On Shipment"
+msgstr ""
+
+msgctxt "selection:purchase.purchase,invoice_method:0"
+msgid "Manual"
+msgstr ""
+
+msgctxt "selection:purchase.purchase,invoice_state:0"
+msgid "Exception"
+msgstr ""
+
+#, fuzzy
+msgctxt "selection:purchase.purchase,invoice_state:0"
+msgid "None"
+msgstr "Отсутствует"
+
+msgctxt "selection:purchase.purchase,invoice_state:0"
+msgid "Paid"
+msgstr ""
+
+#, fuzzy
+msgctxt "selection:purchase.purchase,invoice_state:0"
+msgid "Waiting"
+msgstr "Ожидание"
+
+msgctxt "selection:purchase.purchase,shipment_state:0"
+msgid "Exception"
+msgstr ""
+
+#, fuzzy
+msgctxt "selection:purchase.purchase,shipment_state:0"
+msgid "None"
+msgstr "Отсутствует"
+
+#, fuzzy
+msgctxt "selection:purchase.purchase,shipment_state:0"
+msgid "Received"
+msgstr "Поступило"
+
+#, fuzzy
+msgctxt "selection:purchase.purchase,shipment_state:0"
+msgid "Waiting"
+msgstr "Ожидание"
+
+#, fuzzy
+msgctxt "selection:purchase.purchase,state:0"
+msgid "Canceled"
+msgstr "Отменено"
+
+#, fuzzy
+msgctxt "selection:purchase.purchase,state:0"
+msgid "Confirmed"
+msgstr "Подтвержденно"
+
+#, fuzzy
+msgctxt "selection:purchase.purchase,state:0"
+msgid "Done"
+msgstr "Выполнено"
+
+#, fuzzy
+msgctxt "selection:purchase.purchase,state:0"
+msgid "Draft"
+msgstr "Черновик"
+
+msgctxt "selection:purchase.purchase,state:0"
+msgid "Quotation"
+msgstr ""
+
+#, fuzzy
+msgctxt "selection:stock.move,purchase_exception_state:0"
+msgid ""
+msgstr "Резервный счет"
+
+msgctxt "selection:stock.move,purchase_exception_state:0"
+msgid "Ignored"
+msgstr ""
+
+msgctxt "selection:stock.move,purchase_exception_state:0"
+msgid "Recreated"
+msgstr ""
+
+msgctxt "view:product.template:0"
+msgid "Product Suppliers"
+msgstr ""
+
+msgctxt "view:product.template:0"
+msgid "Suppliers"
+msgstr ""
+
+msgctxt "view:purchase.configuration:0"
+msgid "Purchase Configuration"
+msgstr ""
+
+msgctxt "view:purchase.handle.invoice.exception.ask:0"
+msgid "Choose invoices to recreate"
+msgstr ""
+
+msgctxt "view:purchase.handle.invoice.exception.ask:0"
+msgid "Handle Invoice Exception"
+msgstr ""
+
+msgctxt "view:purchase.handle.shipment.exception.ask:0"
+msgid "Choose move to recreate"
+msgstr ""
+
+msgctxt "view:purchase.handle.shipment.exception.ask:0"
+msgid "Handle shipment Exception"
+msgstr ""
+
+msgctxt "view:purchase.handle.shipment.exception.ask:0"
+msgid "Recreated Moves"
+msgstr ""
+
+#, fuzzy
+msgctxt "view:purchase.line:0"
+msgid "General"
+msgstr "Основной"
+
+#, fuzzy
+msgctxt "view:purchase.line:0"
+msgid "Notes"
+msgstr "Комментарии"
+
+#, fuzzy
+msgctxt "view:purchase.line:0"
+msgid "Products"
+msgstr "ТМЦ"
+
+msgctxt "view:purchase.line:0"
+msgid "Purchase Line"
+msgstr ""
+
+msgctxt "view:purchase.line:0"
+msgid "Purchase Lines"
+msgstr ""
+
+msgctxt "view:purchase.product_supplier.price:0"
+msgid "Product Supplier Price"
+msgstr ""
+
+msgctxt "view:purchase.product_supplier.price:0"
+msgid "Product Supplier Prices"
+msgstr ""
+
+msgctxt "view:purchase.product_supplier:0"
+msgid "Product Supplier"
+msgstr ""
+
+msgctxt "view:purchase.product_supplier:0"
+msgid "Product Suppliers"
+msgstr ""
+
+#, fuzzy
+msgctxt "view:purchase.purchase:0"
+msgid "Cancel"
+msgstr "Отменить"
+
+#, fuzzy
+msgctxt "view:purchase.purchase:0"
+msgid "Confirm"
+msgstr "Подтверждать"
+
+#, fuzzy
+msgctxt "view:purchase.purchase:0"
+msgid "Draft"
+msgstr "Черновик"
+
+msgctxt "view:purchase.purchase:0"
+msgid "Handle Invoice Exception"
+msgstr ""
+
+msgctxt "view:purchase.purchase:0"
+msgid "Handle Shipment Exception"
+msgstr ""
+
+msgctxt "view:purchase.purchase:0"
+msgid "Invoices"
+msgstr ""
+
+#, fuzzy
+msgctxt "view:purchase.purchase:0"
+msgid "Lines"
+msgstr "Строки"
+
+#, fuzzy
+msgctxt "view:purchase.purchase:0"
+msgid "Moves"
+msgstr "Перемещения"
+
+msgctxt "view:purchase.purchase:0"
+msgid "Other Info"
+msgstr ""
+
+msgctxt "view:purchase.purchase:0"
+msgid "Purchase"
+msgstr ""
+
+msgctxt "view:purchase.purchase:0"
+msgid "Purchases"
+msgstr ""
+
+msgctxt "view:purchase.purchase:0"
+msgid "Quotation"
+msgstr ""
+
+msgctxt "view:purchase.purchase:0"
+msgid "Shipments"
+msgstr ""
+
+#, fuzzy
+msgctxt "wizard_button:purchase.handle.invoice.exception,init,end:0"
+msgid "Cancel"
+msgstr "Отменить"
+
+#, fuzzy
+msgctxt "wizard_button:purchase.handle.invoice.exception,init,ok:0"
+msgid "Ok"
+msgstr "Ок"
+
+#, fuzzy
+msgctxt "wizard_button:purchase.handle.shipment.exception,init,end:0"
+msgid "Cancel"
+msgstr "Отменить"
+
+#, fuzzy
+msgctxt "wizard_button:purchase.handle.shipment.exception,init,ok:0"
+msgid "Ok"
+msgstr "Ок"
diff --git a/party.xml b/party.xml
index 432c019..4f70ba5 100644
--- a/party.xml
+++ b/party.xml
@@ -11,9 +11,14 @@ this repository contains the full copyright notices and license terms. -->
         <record model="ir.action.keyword"
                 id="act_open_purchase_keyword1">
             <field name="keyword">form_relate</field>
-            <field name="model">party.party,0</field>
+            <field name="model">party.party,-1</field>
             <field name="action" ref="act_purchase_form2"/>
         </record>
+        <record model="ir.action-res.group"
+            id="act_purchase_form2-group_purchase">
+            <field name="action" ref="act_purchase_form2"/>
+            <field name="group" ref="group_purchase"/>
+        </record>
 
     </data>
 </tryton>
diff --git a/purchase.py b/purchase.py
index 1f41916..9d3fbb5 100644
--- a/purchase.py
+++ b/purchase.py
@@ -1,6 +1,5 @@
 #This file is part of Tryton.  The COPYRIGHT file at the top level of
 #this repository contains the full copyright notices and license terms.
-from __future__ import with_statement
 import datetime
 import copy
 from decimal import Decimal
@@ -8,31 +7,35 @@ from trytond.model import ModelWorkflow, ModelView, ModelSQL, fields
 from trytond.modules.company import CompanyReport
 from trytond.wizard import Wizard
 from trytond.backend import TableHandler
-from trytond.pyson import Not, Equal, Eval, Or, Bool, If, In, Get, And, \
-        PYSONEncoder
+from trytond.pyson import Eval, Bool, If, PYSONEncoder
 from trytond.transaction import Transaction
+from trytond.pool import Pool
 
 _STATES = {
-    'readonly': Not(Equal(Eval('state'), 'draft')),
-}
+    'readonly': Eval('state') != 'draft',
+    }
+_DEPENDS = ['state']
 
 
 class Purchase(ModelWorkflow, ModelSQL, ModelView):
     'Purchase'
     _name = 'purchase.purchase'
+    _rec_name = 'reference'
     _description = __doc__
 
     company = fields.Many2One('company.company', 'Company', required=True,
-            states={
-                'readonly': Or(Not(Equal(Eval('state'), 'draft')),
-                    Bool(Eval('lines'))),
-            }, domain=[
-                ('id', If(In('company', Eval('context', {})), '=', '!='),
-                    Get(Eval('context', {}), 'company', 0)),
-            ])
+        states={
+            'readonly': (Eval('state') != 'draft') | Eval('lines'),
+            },
+        domain=[
+            ('id', If(Eval('context', {}).contains('company'), '=', '!='),
+                Eval('context', {}).get('company', 0)),
+            ],
+        depends=['state', 'lines'])
     reference = fields.Char('Reference', size=None, readonly=True, select=1)
     supplier_reference = fields.Char('Supplier Reference', select=1)
-    description = fields.Char('Description', size=None, states=_STATES)
+    description = fields.Char('Description', size=None, states=_STATES,
+        depends=_DEPENDS)
     state = fields.Selection([
         ('draft', 'Draft'),
         ('quotation', 'Quotation'),
@@ -40,39 +43,48 @@ class Purchase(ModelWorkflow, ModelSQL, ModelView):
         ('done', 'Done'),
         ('cancel', 'Canceled'),
     ], 'State', readonly=True, required=True)
-    purchase_date = fields.Date('Purchase Date', required=True, states=_STATES)
+    purchase_date = fields.Date('Purchase Date', required=True, states=_STATES,
+        depends=_DEPENDS)
     payment_term = fields.Many2One('account.invoice.payment_term',
-        'Payment Term', required=True, states=_STATES)
+        'Payment Term', required=True, states=_STATES, depends=_DEPENDS)
     party = fields.Many2One('party.party', 'Party', change_default=True,
             required=True, states=_STATES, on_change=['party', 'payment_term'],
-            select=1)
+            select=1, depends=_DEPENDS)
     party_lang = fields.Function(fields.Char('Party Language',
         on_change_with=['party']), 'get_function_fields')
     invoice_address = fields.Many2One('party.address', 'Invoice Address',
-            domain=[('party', '=', Eval('party'))], states=_STATES)
+        domain=[('party', '=', Eval('party'))], states=_STATES,
+        depends=['state', 'party'])
     warehouse = fields.Many2One('stock.location', 'Warehouse',
-            domain=[('type', '=', 'warehouse')], required=True, states=_STATES)
+        domain=[('type', '=', 'warehouse')], required=True, states=_STATES,
+        depends=_DEPENDS)
     currency = fields.Many2One('currency.currency', 'Currency', required=True,
         states={
-            'readonly': Or(Not(Equal(Eval('state'), 'draft')),
-                And(Bool(Eval('lines')), Bool(Eval('currency')))),
-        })
+            'readonly': ((Eval('state') != 'draft')
+                | (Eval('lines') & Eval('currency'))),
+            },
+        depends=['state', 'lines'])
     currency_digits = fields.Function(fields.Integer('Currency Digits',
         on_change_with=['currency']), 'get_function_fields')
     lines = fields.One2Many('purchase.line', 'purchase', 'Lines',
-            states=_STATES, on_change=['lines', 'currency', 'party'])
+        states=_STATES, on_change=['lines', 'currency', 'party'],
+        depends=_DEPENDS)
     comment = fields.Text('Comment')
     untaxed_amount = fields.Function(fields.Numeric('Untaxed',
-        digits=(16, Eval('currency_digits', 2))), 'get_function_fields')
+            digits=(16, Eval('currency_digits', 2)),
+            depends=['currency_digits']), 'get_function_fields')
     tax_amount = fields.Function(fields.Numeric('Tax',
-        digits=(16, Eval('currency_digits', 2))), 'get_function_fields')
+            digits=(16, Eval('currency_digits', 2)),
+            depends=['currency_digits']), 'get_function_fields')
     total_amount = fields.Function(fields.Numeric('Total',
-        digits=(16, Eval('currency_digits', 2))), 'get_function_fields')
+            digits=(16, Eval('currency_digits', 2)),
+            depends=['currency_digits']), 'get_function_fields')
     invoice_method = fields.Selection([
-        ('manual', 'Manual'),
-        ('order', 'Based On Order'),
-        ('shipment', 'Based On Shipment'),
-    ], 'Invoice Method', required=True, states=_STATES)
+            ('manual', 'Manual'),
+            ('order', 'Based On Order'),
+            ('shipment', 'Based On Shipment'),
+            ], 'Invoice Method', required=True, states=_STATES,
+        depends=_DEPENDS)
     invoice_state = fields.Selection([
         ('none', 'None'),
         ('waiting', 'Waiting'),
@@ -146,14 +158,14 @@ class Purchase(ModelWorkflow, ModelSQL, ModelView):
         table.index_action('create_date', action='add')
 
     def default_payment_term(self):
-        payment_term_obj = self.pool.get('account.invoice.payment_term')
+        payment_term_obj = Pool().get('account.invoice.payment_term')
         payment_term_ids = payment_term_obj.search(self.payment_term.domain)
         if len(payment_term_ids) == 1:
             return payment_term_ids[0]
         return False
 
     def default_warehouse(self):
-        location_obj = self.pool.get('stock.location')
+        location_obj = Pool().get('stock.location')
         location_ids = location_obj.search(self.warehouse.domain)
         if len(location_ids) == 1:
             return location_ids[0]
@@ -166,12 +178,12 @@ class Purchase(ModelWorkflow, ModelSQL, ModelView):
         return 'draft'
 
     def default_purchase_date(self):
-        date_obj = self.pool.get('ir.date')
+        date_obj = Pool().get('ir.date')
         return date_obj.today()
 
     def default_currency(self):
-        company_obj = self.pool.get('company.company')
-        currency_obj = self.pool.get('currency.currency')
+        company_obj = Pool().get('company.company')
+        currency_obj = Pool().get('currency.currency')
         company = Transaction().context.get('company')
         if company:
             company = company_obj.browse(company)
@@ -179,7 +191,7 @@ class Purchase(ModelWorkflow, ModelSQL, ModelView):
         return False
 
     def default_currency_digits(self):
-        company_obj = self.pool.get('company.company')
+        company_obj = Pool().get('company.company')
         company = Transaction().context.get('company')
         if company:
             company = company_obj.browse(company)
@@ -187,7 +199,7 @@ class Purchase(ModelWorkflow, ModelSQL, ModelView):
         return 2
 
     def default_invoice_method(self):
-        configuration_obj = self.pool.get('purchase.configuration')
+        configuration_obj = Pool().get('purchase.configuration')
         configuration = configuration_obj.browse(1)
         return configuration.purchase_invoice_method
 
@@ -198,9 +210,10 @@ class Purchase(ModelWorkflow, ModelSQL, ModelView):
         return 'none'
 
     def on_change_party(self, vals):
-        party_obj = self.pool.get('party.party')
-        address_obj = self.pool.get('party.address')
-        payment_term_obj = self.pool.get('account.invoice.payment_term')
+        pool = Pool()
+        party_obj = pool.get('party.party')
+        address_obj = pool.get('party.address')
+        payment_term_obj = pool.get('account.invoice.payment_term')
         res = {
             'invoice_address': False,
             'payment_term': False,
@@ -223,7 +236,7 @@ class Purchase(ModelWorkflow, ModelSQL, ModelView):
         return res
 
     def on_change_with_currency_digits(self, vals):
-        currency_obj = self.pool.get('currency.currency')
+        currency_obj = Pool().get('currency.currency')
         if vals.get('currency'):
             currency = currency_obj.browse(vals['currency'])
             return currency.digits
@@ -243,7 +256,7 @@ class Purchase(ModelWorkflow, ModelSQL, ModelView):
         return res
 
     def on_change_with_party_lang(self, vals):
-        party_obj = self.pool.get('party.party')
+        party_obj = Pool().get('party.party')
         if vals.get('party'):
             party = party_obj.browse(vals['party'])
             if party.lang:
@@ -251,7 +264,7 @@ class Purchase(ModelWorkflow, ModelSQL, ModelView):
         return 'en_US'
 
     def get_tax_context(self, purchase):
-        party_obj = self.pool.get('party.party')
+        party_obj = Pool().get('party.party')
         res = {}
         if isinstance(purchase, dict):
             if purchase.get('party'):
@@ -264,9 +277,10 @@ class Purchase(ModelWorkflow, ModelSQL, ModelView):
         return res
 
     def on_change_lines(self, vals):
-        currency_obj = self.pool.get('currency.currency')
-        tax_obj = self.pool.get('account.tax')
-        invoice_obj = self.pool.get('account.invoice')
+        pool = Pool()
+        currency_obj = pool.get('currency.currency')
+        tax_obj = pool.get('account.tax')
+        invoice_obj = pool.get('account.invoice')
 
         res = {
             'untaxed_amount': Decimal('0.0'),
@@ -367,7 +381,7 @@ class Purchase(ModelWorkflow, ModelSQL, ModelView):
         :return: a dictionary with purchase id as key and
             the untaxed amount as value
         '''
-        currency_obj = self.pool.get('currency.currency')
+        currency_obj = Pool().get('currency.currency')
         res = {}
         for purchase in purchases:
             res.setdefault(purchase.id, Decimal('0.0'))
@@ -387,9 +401,10 @@ class Purchase(ModelWorkflow, ModelSQL, ModelView):
         :return: a dictionary with purchase id as key and
             the tax amount as value
         '''
-        currency_obj = self.pool.get('currency.currency')
-        tax_obj = self.pool.get('account.tax')
-        invoice_obj = self.pool.get('account.invoice')
+        pool = Pool()
+        currency_obj = pool.get('currency.currency')
+        tax_obj = pool.get('account.tax')
+        invoice_obj = pool.get('account.invoice')
 
         res = {}
         for purchase in purchases:
@@ -424,7 +439,7 @@ class Purchase(ModelWorkflow, ModelSQL, ModelView):
         :return: a dictionary with purchase id as key and
             total amount as value
         '''
-        currency_obj = self.pool.get('currency.currency')
+        currency_obj = Pool().get('currency.currency')
         res = {}
         untaxed_amounts = self.get_untaxed_amount(purchases)
         tax_amounts = self.get_tax_amount(purchases)
@@ -583,8 +598,8 @@ class Purchase(ModelWorkflow, ModelSQL, ModelView):
         return True
 
     def set_reference(self, purchase_id):
-        sequence_obj = self.pool.get('ir.sequence')
-        config_obj = self.pool.get('purchase.configuration')
+        sequence_obj = Pool().get('ir.sequence')
+        config_obj = Pool().get('purchase.configuration')
 
         purchase = self.browse(purchase_id)
 
@@ -599,7 +614,7 @@ class Purchase(ModelWorkflow, ModelSQL, ModelView):
         return True
 
     def set_purchase_date(self, purchase_id):
-        date_obj = self.pool.get('ir.date')
+        date_obj = Pool().get('ir.date')
 
         self.write(purchase_id, {
             'purchase_date': date_obj.today(),
@@ -614,7 +629,7 @@ class Purchase(ModelWorkflow, ModelSQL, ModelView):
         :return: a dictionary with invoiced purchase line id as key
             and a list of invoice line values as value
         '''
-        line_obj = self.pool.get('purchase.line')
+        line_obj = Pool().get('purchase.line')
         res = {}
         for line in purchase.lines:
             val = line_obj.get_invoice_line(line)
@@ -631,7 +646,7 @@ class Purchase(ModelWorkflow, ModelSQL, ModelView):
         :return: a dictionary with purchase fields as key and
             purchase values as value
         '''
-        journal_obj = self.pool.get('account.journal')
+        journal_obj = Pool().get('account.journal')
 
         journal_id = journal_obj.search([
             ('type', '=', 'expense'),
@@ -659,9 +674,10 @@ class Purchase(ModelWorkflow, ModelSQL, ModelView):
         :param purchase_id: the id of the purchase
         :return: the id of the invoice or None
         '''
-        invoice_obj = self.pool.get('account.invoice')
-        invoice_line_obj = self.pool.get('account.invoice.line')
-        purchase_line_obj = self.pool.get('purchase.line')
+        pool = Pool()
+        invoice_obj = pool.get('account.invoice')
+        invoice_line_obj = pool.get('account.invoice.line')
+        purchase_line_obj = pool.get('purchase.line')
 
         purchase = self.browse(purchase_id)
 
@@ -700,12 +716,114 @@ class Purchase(ModelWorkflow, ModelSQL, ModelView):
         '''
         Create move for each purchase lines
         '''
-        line_obj = self.pool.get('purchase.line')
+        line_obj = Pool().get('purchase.line')
 
         purchase = self.browse(purchase_id)
         for line in purchase.lines:
             line_obj.create_move(line)
 
+    def wkf_draft(self, purchase):
+        self.write(purchase.id, {'state': 'draft'})
+
+    def wkf_quotation(self, purchase):
+        self.check_for_quotation(purchase.id)
+        self.set_reference(purchase.id)
+        self.write(purchase.id, {'state': 'quotation'})
+
+    def wkf_confirmed(self, purchase):
+        self.set_purchase_date(purchase.id)
+        self.write(purchase.id, {'state': 'confirmed'})
+
+    def wkf_invoice_waiting(self, purchase):
+        self.create_invoice(purchase.id)
+        self.write(purchase.id, {'invoice_state': 'waiting'})
+
+    def wkf_invoice_exception(self, purchase):
+        self.write(purchase.id, {'invoice_state': 'exception'})
+
+    def wkf_invoice_done(self, purchase):
+        self.write(purchase.id, {'invoice_state': 'paid'})
+
+    def wkf_shipment_waiting(self, purchase):
+        self.write(purchase.id, {'shipment_state': 'waiting'})
+        self.create_move(purchase.id)
+
+    def wkf_shipment_exception(self, purchase):
+        self.write(purchase.id, {'shipment_state': 'exception'})
+
+    def wkf_invoice_shipment(self, purchase):
+        self.create_invoice(purchase.id)
+        self.write(purchase.id, {'invoice_state': 'waiting'})
+
+    def wkf_invoice_shipment_waiting(self, purchase):
+        self.write(purchase.id,
+            {'invoice_state': 'waiting', 'shipment_state': 'received'})
+
+    def wkf_invoice_shipment_exception(self, purchase):
+        self.write(purchase.id, {'invoice_state': 'exception'})
+
+    def wkf_invoice_shipment_done(self, purchase):
+        self.write(purchase.id, {'invoice_state': 'paid'})
+
+    def wkf_invoice_shipment_method_done(self, purchase):
+        self.write(purchase.id, {'shipment_state': 'received'})
+
+    def wkf_done(self, purchase):
+        self.write(purchase.id, {'state': 'done'})
+
+    def wkf_cancel(self, purchase):
+        self.write(purchase.id, {'state': 'cancel'})
+
+    def wkf_draft2quotation(self, purchase):
+        return bool(purchase.lines)
+
+    def wkf_invoice_method2invoice_waiting(self, purchase):
+        return purchase.invoice_method == 'order'
+
+    def wkf_invoice_method2invoice_done(self, purchase):
+        return purchase.invoice_method != 'order'
+
+    def wkf_triggered_invoices(self, purchase):
+        return [x.id for x in purchase.invoices]
+
+    def wkf_invoice_waiting2invoice_purchase_exception(self, purchase):
+        return purchase.invoice_exception
+
+    def wkf_invoice_waiting2invoice_done(self, purchase):
+        return purchase.invoice_paid
+
+    def wkf_shipment_waiting2shipment_exception(self, purchase):
+        return purchase.shipment_exception
+
+    def wkf_shipment_waiting2invoice_shipment_method(self, purchase):
+        return not purchase.shipment_exception
+
+    def wkf_shipment_waiting2invoice_shipment_method_nosignal(self, purchase):
+        return purchase.shipment_done
+
+    def wkf_invoice_shipment_method2invoice_shipment(self, purchase):
+        return purchase.invoice_method == 'shipment'
+
+    def wkf_invoice_shipment_method2inv_shipment_method_done(self, purchase):
+        return purchase.invoice_method != 'shipment' and purchase.shipment_done
+
+    def wkf_invoice_shipment_method2shipment_waiting(self, purchase):
+        return (purchase.invoice_method != 'shipment'
+            and not purchase.shipment_done)
+
+    def wkf_invoice_shipment2shipment_waiting(self, purchase):
+        return not purchase.shipment_done
+
+    def wkf_invoice_shipment2waiting_invoice_shipment(self, purchase):
+        return purchase.shipment_done
+
+    def wkf_waiting_invoice_shipment2invoice_shipment_exception(self,
+            purchase):
+        return purchase.invoice_exception
+
+    def wkf_waiting_invoice_shipment2invoice_shipment_done(self, purchase):
+        return purchase.invoice_paid
+
 Purchase()
 
 
@@ -764,69 +882,73 @@ class PurchaseLine(ModelSQL, ModelView):
         ('comment', 'Comment'),
         ], 'Type', select=1, required=True)
     quantity = fields.Float('Quantity',
-            digits=(16, Eval('unit_digits', 2)),
-            states={
-                'invisible': Not(Equal(Eval('type'), 'line')),
-                'required': Equal(Eval('type'), 'line'),
-                'readonly': Not(Bool(Eval('_parent_purchase'))),
+        digits=(16, Eval('unit_digits', 2)),
+        states={
+            'invisible': Eval('type') != 'line',
+            'required': Eval('type') == 'line',
+            'readonly': ~Eval('_parent_purchase'),
             }, on_change=['product', 'quantity', 'unit',
-                '_parent_purchase.currency', '_parent_purchase.party'])
+            '_parent_purchase.currency', '_parent_purchase.party'],
+        depends=['unit_digits', 'type'])
     unit = fields.Many2One('product.uom', 'Unit',
-            states={
-                'required': Bool(Eval('product')),
-                'invisible': Not(Equal(Eval('type'), 'line')),
-                'readonly': Not(Bool(Eval('_parent_purchase'))),
+        states={
+            'required': Bool(Eval('product')),
+            'invisible': Eval('type') != 'line',
+            'readonly': ~Eval('_parent_purchase'),
             }, domain=[
-                ('category', '=',
-                    (Eval('product'), 'product.default_uom.category')),
+            ('category', '=',
+                (Eval('product'), 'product.default_uom.category')),
             ],
-            context={
-                'category': (Eval('product'), 'product.default_uom.category'),
+        context={
+            'category': (Eval('product'), 'product.default_uom.category'),
             },
-            on_change=['product', 'quantity', 'unit', '_parent_purchase.currency',
-                '_parent_purchase.party'])
+        on_change=['product', 'quantity', 'unit', '_parent_purchase.currency',
+            '_parent_purchase.party'],
+        depends=['product', 'type'])
     unit_digits = fields.Function(fields.Integer('Unit Digits',
         on_change_with=['unit']), 'get_unit_digits')
     product = fields.Many2One('product.product', 'Product',
-            domain=[('purchasable', '=', True)],
-            states={
-                'invisible': Not(Equal(Eval('type'), 'line')),
-                'readonly': Not(Bool(Eval('_parent_purchase'))),
+        domain=[('purchasable', '=', True)],
+        states={
+            'invisible': Eval('type') != 'line',
+            'readonly': ~Eval('_parent_purchase'),
             }, on_change=['product', 'unit', 'quantity', 'description',
-                '_parent_purchase.party', '_parent_purchase.currency'],
-            context={
-                'locations': If(Bool(Get(Eval('_parent_purchase', {}),
-                    'warehouse')),
-                    [Get(Eval('_parent_purchase', {}), 'warehouse')],
-                    []),
-                'stock_date_end': Get(Eval('_parent_purchase', {}),
-                    'purchase_date'),
-                'purchasable': True,
-                'stock_skip_warehouse': True,
-            })
+            '_parent_purchase.party', '_parent_purchase.currency'],
+        context={
+            'locations': If(Bool(Eval('_parent_purchase', {}).get(
+                        'warehouse')),
+                [Eval('_parent_purchase', {}).get('warehouse', False)],
+                []),
+            'stock_date_end': Eval('_parent_purchase', {}).get(
+                'purchase_date'),
+            'purchasable': True,
+            'stock_skip_warehouse': True,
+            }, depends=['type'])
     unit_price = fields.Numeric('Unit Price', digits=(16, 4),
-            states={
-                'invisible': Not(Equal(Eval('type'), 'line')),
-                'required': Equal(Eval('type'), 'line'),
-            })
-    amount = fields.Function(fields.Numeric('Amount',
-        digits=(16, Get(Eval('_parent_purchase', {}), 'currency_digits', 2)),
         states={
-            'invisible': Not(In(Eval('type'), ['line', 'subtotal'])),
-            'readonly': Not(Bool(Eval('_parent_purchase'))),
-        }, on_change_with=['type', 'quantity', 'unit_price',
-            '_parent_purchase.currency']), 'get_amount')
+            'invisible': Eval('type') != 'line',
+            'required': Eval('type') == 'line',
+            }, depends=['type'])
+    amount = fields.Function(fields.Numeric('Amount',
+            digits=(16,
+                Eval('_parent_purchase', {}).get('currency_digits', 2)),
+            states={
+                'invisible': ~Eval('type').in_(['line', 'subtotal']),
+                'readonly': ~Eval('_parent_purchase'),
+                }, on_change_with=['type', 'quantity', 'unit_price',
+                '_parent_purchase.currency'],
+            depends=['type']), 'get_amount')
     description = fields.Text('Description', size=None, required=True)
     note = fields.Text('Note')
     taxes = fields.Many2Many('purchase.line-account.tax',
-            'line', 'tax', 'Taxes', domain=[('parent', '=', False)],
-            states={
-                'invisible': Not(Equal(Eval('type'), 'line')),
-            })
+        'line', 'tax', 'Taxes', domain=[('parent', '=', False)],
+        states={
+            'invisible': Eval('type') != 'line',
+            }, depends=['type'])
     invoice_lines = fields.Many2Many('purchase.line-account.invoice.line',
             'purchase_line', 'invoice_line', 'Invoice Lines', readonly=True)
     moves = fields.One2Many('stock.move', 'purchase_line', 'Moves',
-            readonly=True, select=1)
+            readonly=True)
     moves_ignored = fields.Many2Many('purchase.line-ignored-stock.move',
             'purchase_line', 'move', 'Ignored Moves', readonly=True)
     moves_recreated = fields.Many2Many('purchase.line-recreated-stock.move',
@@ -867,7 +989,7 @@ class PurchaseLine(ModelSQL, ModelView):
         return Decimal('0.0')
 
     def get_move_done(self, ids, name):
-        uom_obj = self.pool.get('product.uom')
+        uom_obj = Pool().get('product.uom')
         res = {}
         for line in self.browse(ids):
             val = True
@@ -908,7 +1030,7 @@ class PurchaseLine(ModelSQL, ModelView):
         return res
 
     def on_change_with_unit_digits(self, vals):
-        uom_obj = self.pool.get('product.uom')
+        uom_obj = Pool().get('product.uom')
         if vals.get('unit'):
             uom = uom_obj.browse(vals['unit'])
             return uom.digits
@@ -935,10 +1057,11 @@ class PurchaseLine(ModelSQL, ModelView):
         return res
 
     def on_change_product(self, vals):
-        party_obj = self.pool.get('party.party')
-        product_obj = self.pool.get('product.product')
-        uom_obj = self.pool.get('product.uom')
-        tax_rule_obj = self.pool.get('account.tax.rule')
+        pool = Pool()
+        party_obj = pool.get('party.party')
+        product_obj = pool.get('product.product')
+        uom_obj = pool.get('product.uom')
+        tax_rule_obj = pool.get('account.tax.rule')
 
         if not vals.get('product'):
             return {}
@@ -967,6 +1090,9 @@ class PurchaseLine(ModelSQL, ModelView):
         with Transaction().set_context(context2):
             res['unit_price'] = product_obj.get_purchase_price([product.id],
                     vals.get('quantity', 0))[product.id]
+            if res['unit_price']:
+                res['unit_price'] = res['unit_price'].quantize(
+                    Decimal(1) / 10 ** self.unit_price.digits[1])
         res['taxes'] = []
         pattern = self._get_tax_rule_pattern(party, vals)
         for tax in product.supplier_taxes_used:
@@ -1001,7 +1127,7 @@ class PurchaseLine(ModelSQL, ModelView):
         return res
 
     def on_change_quantity(self, vals):
-        product_obj = self.pool.get('product.product')
+        product_obj = Pool().get('product.product')
 
         if not vals.get('product'):
             return {}
@@ -1022,13 +1148,16 @@ class PurchaseLine(ModelSQL, ModelView):
             res['unit_price'] = product_obj.get_purchase_price(
                     [vals['product']], vals.get('quantity', 0)
                     )[vals['product']]
+            if res['unit_price']:
+                res['unit_price'] = res['unit_price'].quantize(
+                    Decimal(1) / 10 ** self.unit_price.digits[1])
         return res
 
     def on_change_unit(self, vals):
         return self.on_change_quantity(vals)
 
     def on_change_with_amount(self, vals):
-        currency_obj = self.pool.get('currency.currency')
+        currency_obj = Pool().get('currency.currency')
         if vals.get('type') == 'line':
             currency = vals.get('_parent_purchase.currency')
             if currency and isinstance(currency, (int, long)):
@@ -1042,7 +1171,7 @@ class PurchaseLine(ModelSQL, ModelView):
         return Decimal('0.0')
 
     def get_amount(self, ids, name):
-        currency_obj = self.pool.get('currency.currency')
+        currency_obj = Pool().get('currency.currency')
         res = {}
         for line in self.browse(ids):
             if line.type == 'line':
@@ -1070,8 +1199,8 @@ class PurchaseLine(ModelSQL, ModelView):
         :param line: a BrowseRecord of the purchase line
         :return: a list of invoice line values
         '''
-        uom_obj = self.pool.get('product.uom')
-        property_obj = self.pool.get('ir.property')
+        uom_obj = Pool().get('product.uom')
+        property_obj = Pool().get('ir.property')
 
         res = {}
         res['sequence'] = line.sequence
@@ -1106,7 +1235,7 @@ class PurchaseLine(ModelSQL, ModelView):
 
 
         if res['quantity'] <= 0.0:
-            return None
+            return []
         res['unit'] = line.unit.id
         res['product'] = line.product.id
         res['unit_price'] = line.unit_price
@@ -1139,9 +1268,10 @@ class PurchaseLine(ModelSQL, ModelView):
         '''
         Create move line
         '''
-        move_obj = self.pool.get('stock.move')
-        uom_obj = self.pool.get('product.uom')
-        product_supplier_obj = self.pool.get('purchase.product_supplier')
+        pool = Pool()
+        move_obj = pool.get('stock.move')
+        uom_obj = pool.get('product.uom')
+        product_supplier_obj = pool.get('purchase.product_supplier')
 
         vals = {}
         if line.type != 'line':
@@ -1253,21 +1383,23 @@ class Template(ModelSQL, ModelView):
     _name = "product.template"
 
     purchasable = fields.Boolean('Purchasable', states={
-        'readonly': Not(Bool(Eval('active'))),
-        })
+            'readonly': ~Eval('active', True),
+            }, depends=['active'])
     product_suppliers = fields.One2Many('purchase.product_supplier',
-            'product', 'Suppliers', states={
-                'readonly': Not(Bool(Eval('active'))),
-                'invisible': Or(Not(Bool(Eval('purchasable'))),
-                    Not(Bool(Eval('company')))),
-            })
+        'product', 'Suppliers', states={
+            'readonly': ~Eval('active', True),
+            'invisible': (~Eval('purchasable', False)
+                | ~Eval('context', {}).get('company', 0)),
+            }, depends=['active', 'purchasable'])
     purchase_uom = fields.Many2One('product.uom', 'Purchase UOM', states={
-        'readonly': Not(Bool(Eval('active'))),
-        'invisible': Not(Bool(Eval('purchasable'))),
-        'required': Bool(Eval('purchasable')),
-        }, domain=[('category', '=', (Eval('default_uom'), 'uom.category'))],
+            'readonly': ~Eval('active'),
+            'invisible': ~Eval('purchasable'),
+            'required': Eval('purchasable', False),
+            },
+        domain=[('category', '=', (Eval('default_uom'), 'uom.category'))],
         context={'category': (Eval('default_uom'), 'uom.category')},
-        on_change_with=['default_uom', 'purchase_uom', 'purchasable'])
+        on_change_with=['default_uom', 'purchase_uom', 'purchasable'],
+        depends=['active', 'default_uom', 'purchasable'])
 
     def __init__(self):
         super(Template, self).__init__()
@@ -1277,14 +1409,12 @@ class Template(ModelSQL, ModelView):
             })
         self.account_expense = copy.copy(self.account_expense)
         self.account_expense.states = copy.copy(self.account_expense.states)
-        required = And(Not(Bool(Eval('account_category'))),
-                Bool(Eval('purchasable')))
+        required = ~Eval('account_category') & Eval('purchasable', False)
         if not self.account_expense.states.get('required'):
             self.account_expense.states['required'] = required
         else:
-            self.account_expense.states['required'] = \
-                    Or(self.account_expense.states['required'],
-                            required)
+            self.account_expense.states['required'] = (
+                self.account_expense.states['required'] | required)
         if 'account_category' not in self.account_expense.depends:
             self.account_expense = copy.copy(self.account_expense)
             self.account_expense.depends = \
@@ -1301,7 +1431,7 @@ class Template(ModelSQL, ModelView):
         return Transaction().context.get('purchasable') or False
 
     def on_change_with_purchase_uom(self, vals):
-        uom_obj = self.pool.get('product.uom')
+        uom_obj = Pool().get('product.uom')
         res = False
 
         if vals.get('default_uom'):
@@ -1351,10 +1481,11 @@ class Product(ModelSQL, ModelView):
         :param quantity: the quantity of products
         :return: a dictionary with for each product ids keys the computed price
         '''
-        uom_obj = self.pool.get('product.uom')
-        user_obj = self.pool.get('res.user')
-        currency_obj = self.pool.get('currency.currency')
-        date_obj = self.pool.get('ir.date')
+        pool = Pool()
+        uom_obj = pool.get('product.uom')
+        user_obj = pool.get('res.user')
+        currency_obj = pool.get('currency.currency')
+        date_obj = pool.get('ir.date')
 
         today = date_obj.today()
         res = {}
@@ -1392,7 +1523,7 @@ class Product(ModelSQL, ModelView):
                     with Transaction().set_context(date=date):
                         res[product.id] = currency_obj.compute(
                             user.company.currency.id, res[product.id],
-                            currency.id)
+                            currency.id, round=False)
         return res
 
 Product()
@@ -1413,10 +1544,10 @@ class ProductSupplier(ModelSQL, ModelView):
     prices = fields.One2Many('purchase.product_supplier.price',
             'product_supplier', 'Prices')
     company = fields.Many2One('company.company', 'Company', required=True,
-            ondelete='CASCADE', select=1,
-            domain=[
-                ('id', If(In('company', Eval('context', {})), '=', '!='),
-                    Get(Eval('context', {}), 'company', 0)),
+        ondelete='CASCADE', select=1,
+        domain=[
+            ('id', If(Eval('context', {}).contains('company'), '=', '!='),
+                Eval('context', {}).get('company', 0)),
             ])
     delivery_time = fields.Integer('Delivery Time',
             help="In number of days")
@@ -1437,7 +1568,7 @@ class ProductSupplier(ModelSQL, ModelView):
         :param date: the date of the purchase if None the current date
         :return: a tuple with the supply date and the next one
         '''
-        date_obj = self.pool.get('ir.date')
+        date_obj = Pool().get('ir.date')
 
         if not date:
             date = date_obj.today()
@@ -1453,7 +1584,7 @@ class ProductSupplier(ModelSQL, ModelView):
         :param date: the date of the supply
         :return: the purchase date
         '''
-        date_obj = self.pool.get('ir.date')
+        date_obj = Pool().get('ir.date')
 
         if not product_supplier.delivery_time:
             return date_obj.today()
@@ -1477,8 +1608,8 @@ class ProductSupplierPrice(ModelSQL, ModelView):
         self._order.insert(0, ('quantity', 'ASC'))
 
     def default_currency(self):
-        company_obj = self.pool.get('company.company')
-        currency_obj = self.pool.get('currency.currency')
+        company_obj = Pool().get('company.company')
+        currency_obj = Pool().get('currency.currency')
         company = None
         if Transaction().context.get('company'):
             company = company_obj.browse(Transaction().context['company'])
@@ -1514,8 +1645,8 @@ class ShipmentIn(ModelSQL, ModelView):
             })
 
     def write(self, ids, vals):
-        purchase_obj = self.pool.get('purchase.purchase')
-        purchase_line_obj = self.pool.get('purchase.line')
+        purchase_obj = Pool().get('purchase.purchase')
+        purchase_line_obj = Pool().get('purchase.line')
 
         res = super(ShipmentIn, self).write(ids, vals)
 
@@ -1555,32 +1686,36 @@ class Move(ModelSQL, ModelView):
     _name = 'stock.move'
 
     purchase_line = fields.Many2One('purchase.line', 'Purchase Line', select=1,
-            states={
-                'readonly': Not(Equal(Eval('state'), 'draft')),
-            })
+        states={
+            'readonly': Eval('state') != 'draft',
+            },
+        depends=['state'])
     purchase = fields.Function(fields.Many2One('purchase.purchase', 'Purchase',
-        select=1, states={
-            'invisible': Not(Bool(Eval('purchase_visible'))),
-        }, depends=['purchase_visible']), 'get_purchase',
+            select=1, states={
+                'invisible': ~Eval('purchase_visible', False),
+                }, depends=['purchase_visible']), 'get_purchase',
         searcher='search_purchase')
     purchase_quantity = fields.Function(fields.Float('Purchase Quantity',
-        digits=(16, Eval('unit_digits', 2)), states={
-            'invisible': Not(Bool(Eval('purchase_visible'))),
-        }, depends=['purchase_visible']), 'get_purchase_fields')
+            digits=(16, Eval('unit_digits', 2)),
+            states={
+                'invisible': ~Eval('purchase_visible', False),
+                },
+            depends=['purchase_visible', 'unit_digits']),
+        'get_purchase_fields')
     purchase_unit = fields.Function(fields.Many2One('product.uom',
-        'Purchase Unit', states={
-            'invisible': Not(Bool(Eval('purchase_visible'))),
-        }, depends=['purchase_visible']), 'get_purchase_fields')
+            'Purchase Unit', states={
+                'invisible': ~Eval('purchase_visible', False),
+                }, depends=['purchase_visible']), 'get_purchase_fields')
     purchase_unit_digits = fields.Function(fields.Integer(
         'Purchase Unit Digits'), 'get_purchase_fields')
     purchase_unit_price = fields.Function(fields.Numeric('Purchase Unit Price',
-        digits=(16, 4), states={
-            'invisible': Not(Bool(Eval('purchase_visible'))),
-        }, depends=['purchase_visible']), 'get_purchase_fields')
+            digits=(16, 4), states={
+                'invisible': ~Eval('purchase_visible', False),
+                }, depends=['purchase_visible']), 'get_purchase_fields')
     purchase_currency = fields.Function(fields.Many2One('currency.currency',
-        'Purchase Currency', states={
-            'invisible': Not(Bool(Eval('purchase_visible'))),
-        }, depends=['purchase_visible']), 'get_purchase_fields')
+            'Purchase Currency', states={
+                'invisible': ~Eval('purchase_visible', False),
+                }, depends=['purchase_visible']), 'get_purchase_fields')
     purchase_visible = fields.Function(fields.Boolean('Purchase Visible',
         on_change_with=['from_location']), 'get_purchase_visible')
     supplier = fields.Function(fields.Many2One('party.party', 'Supplier',
@@ -1645,7 +1780,7 @@ class Move(ModelSQL, ModelView):
         return self.on_change_with_purchase_visible(vals)
 
     def on_change_with_purchase_visible(self, vals):
-        location_obj = self.pool.get('stock.location')
+        location_obj = Pool().get('stock.location')
         if vals.get('from_location'):
             from_location = location_obj.browse(vals['from_location'])
             if from_location.type == 'supplier':
@@ -1672,8 +1807,8 @@ class Move(ModelSQL, ModelView):
         return [('purchase_line.purchase.party',) + clause[1:]]
 
     def write(self, ids, vals):
-        purchase_obj = self.pool.get('purchase.purchase')
-        purchase_line_obj = self.pool.get('purchase.line')
+        purchase_obj = Pool().get('purchase.purchase')
+        purchase_line_obj = Pool().get('purchase.line')
 
         res = super(Move, self).write(ids, vals)
         if 'state' in vals and vals['state'] in ('cancel',):
@@ -1693,8 +1828,8 @@ class Move(ModelSQL, ModelView):
         return res
 
     def delete(self, ids):
-        purchase_obj = self.pool.get('purchase.purchase')
-        purchase_line_obj = self.pool.get('purchase.line')
+        purchase_obj = Pool().get('purchase.purchase')
+        purchase_line_obj = Pool().get('purchase.line')
 
         if isinstance(ids, (int, long)):
             ids = [ids]
@@ -1735,7 +1870,7 @@ class Invoice(ModelSQL, ModelView):
             })
 
     def button_draft(self, ids):
-        purchase_obj = self.pool.get('purchase.purchase')
+        purchase_obj = Pool().get('purchase.purchase')
         purchase_ids = purchase_obj.search([
             ('invoices', 'in', ids),
             ])
@@ -1746,7 +1881,7 @@ class Invoice(ModelSQL, ModelView):
         return super(Invoice, self).button_draft(ids)
 
     def get_purchase_exception_state(self, ids, name):
-        purchase_obj = self.pool.get('purchase.purchase')
+        purchase_obj = Pool().get('purchase.purchase')
         purchase_ids = purchase_obj.search([
             ('invoices', 'in', ids),
             ])
@@ -1795,9 +1930,10 @@ class OpenSupplier(Wizard):
     }
 
     def _action_open(self, datas):
-        model_data_obj = self.pool.get('ir.model.data')
-        act_window_obj = self.pool.get('ir.action.act_window')
-        wizard_obj = self.pool.get('ir.action.wizard')
+        pool = Pool()
+        model_data_obj = pool.get('ir.model.data')
+        act_window_obj = pool.get('ir.action.act_window')
+        wizard_obj = pool.get('ir.action.wizard')
         cursor = Transaction().cursor
 
         act_window_id = model_data_obj.get_id('party', 'act_party_form')
@@ -1847,7 +1983,7 @@ class HandleShipmentExceptionAsk(ModelView):
         return self.default_domain_moves()
 
     def default_domain_moves(self):
-        purchase_line_obj = self.pool.get('purchase.line')
+        purchase_line_obj = Pool().get('purchase.line')
         active_id = Transaction().context.get('active_id')
         if not active_id:
             return []
@@ -1894,9 +2030,10 @@ class HandleShipmentException(Wizard):
     }
 
     def _handle_moves(self, data):
-        purchase_obj = self.pool.get('purchase.purchase')
-        purchase_line_obj = self.pool.get('purchase.line')
-        move_obj = self.pool.get('stock.move')
+        pool = Pool()
+        purchase_obj = pool.get('purchase.purchase')
+        purchase_line_obj = pool.get('purchase.line')
+        move_obj = pool.get('stock.move')
         to_recreate = data['form']['recreate_moves'][0][1]
         domain_moves = data['form']['domain_moves'][0][1]
 
@@ -1946,7 +2083,7 @@ class HandleInvoiceExceptionAsk(ModelView):
         return self.default_domain_invoices()
 
     def default_domain_invoices(self):
-        purchase_obj = self.pool.get('purchase.purchase')
+        purchase_obj = Pool().get('purchase.purchase')
         active_id = Transaction().context.get('active_id')
         if not active_id:
             return []
@@ -1989,8 +2126,8 @@ class HandleInvoiceException(Wizard):
     }
 
     def _handle_invoices(self, data):
-        purchase_obj = self.pool.get('purchase.purchase')
-        invoice_obj = self.pool.get('account.invoice')
+        purchase_obj = Pool().get('purchase.purchase')
+        invoice_obj = Pool().get('account.invoice')
         to_recreate = data['form']['recreate_invoices'][0][1]
         domain_invoices = data['form']['domain_invoices'][0][1]
 
diff --git a/purchase.xml b/purchase.xml
index 6bd4795..1567f80 100644
--- a/purchase.xml
+++ b/purchase.xml
@@ -3,27 +3,45 @@
 this repository contains the full copyright notices and license terms. -->
 <tryton>
     <data>
-        <menuitem name="Purchase Management" id="menu_purchase" sequence="4"/>
-
         <record model="res.group" id="group_purchase_admin">
             <field name="name">Purchase Administrator</field>
         </record>
         <record model="res.group" id="group_purchase">
             <field name="name">Purchase</field>
         </record>
-        <record model="res.user" id="res.user_admin">
-            <field name="groups"
-                eval="[('add', ref('group_purchase')), ('add', ref('group_purchase_admin'))]"/>
+        <record model="res.user-res.group" id="user_admin_group_purchase">
+            <field name="user" ref="res.user_admin"/>
+            <field name="group" ref="group_purchase"/>
+        </record>
+        <record model="res.user-res.group" id="user_admin_group_purchase_admin">
+            <field name="user" ref="res.user_admin"/>
+            <field name="group" ref="group_purchase_admin"/>
+        </record>
+
+        <record model="res.user-res.group" id="user_trigger_group_purchase">
+            <field name="user" ref="res.user_trigger"/>
+            <field name="group" ref="group_purchase"/>
+        </record>
+        <record model="res.user-res.group" id="user_trigger_group_purchase_admin">
+            <field name="user" ref="res.user_trigger"/>
+            <field name="group" ref="group_purchase_admin"/>
         </record>
-        <record model="res.user" id="res.user_trigger">
-            <field name="groups"
-                eval="[('add', ref('group_purchase')), ('add', ref('group_purchase_admin'))]"/>
+
+        <menuitem name="Purchase" id="menu_purchase" sequence="4"/>
+        <record model="ir.ui.menu-res.group" id="menu_purchase_group_purchase">
+            <field name="menu" ref="menu_purchase"/>
+            <field name="group" ref="group_purchase"/>
         </record>
 
         <!-- set active for 1.4 migration -->
         <menuitem name="Configuration" parent="menu_purchase"
-            id="menu_configuration" groups="group_purchase_admin"
-            sequence="0" icon="tryton-preferences" active="1"/>
+            id="menu_configuration" sequence="0" icon="tryton-preferences"
+            active="1"/>
+        <record model="ir.ui.menu-res.group"
+            id="menu_configuration_group_purchase_admin">
+            <field name="menu" ref="menu_configuration"/>
+            <field name="group" ref="group_purchase_admin"/>
+        </record>
 
         <record model="ir.action.wizard" id="wizard_shipment_handle_exception">
             <field name="name">Handle Shipment Exception</field>
@@ -82,19 +100,19 @@ this repository contains the full copyright notices and license terms. -->
                                 <field name="invoice_state"/>
                                 <label name="shipment_state"/>
                                 <field name="shipment_state"/>
-                            </group>
-                            <group col="2" colspan="2" id="amount_state_buttons">
-                                <label name="untaxed_amount"/>
-                                <field name="untaxed_amount"/>
-                                <label name="tax_amount"/>
-                                <field name="tax_amount"/>
-                                <label name="total_amount"/>
-                                <field name="total_amount"/>
                                 <label name="state"/>
                                 <field name="state"/>
+                            </group>
+                            <group col="2" colspan="2" id="amount_buttons">
+                                <label name="untaxed_amount" xalign="1.0" xexpand="1"/>
+                                <field name="untaxed_amount" xalign="1.0" xexpand="0"/>
+                                <label name="tax_amount" xalign="1.0" xexpand="1"/>
+                                <field name="tax_amount" xalign="1.0" xexpand="0"/>
+                                <label name="total_amount" xalign="1.0" xexpand="1"/>
+                                <field name="total_amount" xalign="1.0" xexpand="0"/>
                                 <group col="6" colspan="2" id="buttons">
                                     <button name="cancel" string="Cancel"
-                                        states="{'invisible': Or(Equal(Eval('state'), 'cancel'), Not(In(Eval('state'), ['draft', 'quotation'])), Equal(Eval('invoice_state'), 'exception'), Equal(Eval('shipment_state'), 'exception')), 'readonly': Not(In(%(group_purchase)d, Eval('groups', [])))}"
+                                        states="{'invisible': Or(Equal(Eval('state'), 'cancel'), And(Not(In(Eval('state'), ['draft', 'quotation'])), Not(Equal(Eval('invoice_state'), 'exception')), Not(Equal(Eval('shipment_state'), 'exception')))), 'readonly': Not(In(%(group_purchase)d, Eval('groups', [])))}"
                                         icon="tryton-cancel"/>
                                     <button name="draft" string="Draft"
                                         states="{'invisible': Not(Equal(Eval('state'), 'quotation')), 'readonly': Not(In(%(group_purchase)d, Eval('groups', [])))}"
@@ -127,27 +145,25 @@ this repository contains the full copyright notices and license terms. -->
                             <field name="comment" colspan="4" spell="Eval('party_lang')"/>
                         </page>
                         <page string="Invoices" id="invoices">
-                            <separator name="invoices" colspan="4"/>
                             <field name="invoices" colspan="4">
                                 <tree>
-                                    <field name="number" select="1"/>
-                                    <field name="reference" select="1"/>
-                                    <field name="invoice_date" select="2"/>
-                                    <field name="party" select="1"/>
-                                    <field name="currency" select="2"/>
-                                    <field name="untaxed_amount" select="2"/>
-                                    <field name="tax_amount" select="2"/>
-                                    <field name="total_amount" select="2"/>
-                                    <field name="state" select="2"/>
+                                    <field name="number"/>
+                                    <field name="reference"/>
+                                    <field name="invoice_date"/>
+                                    <field name="party"/>
+                                    <field name="currency"/>
+                                    <field name="untaxed_amount"/>
+                                    <field name="tax_amount"/>
+                                    <field name="total_amount"/>
+                                    <field name="state"/>
                                     <field name="purchase_exception_state"/>
                                     <field name="amount_to_pay_today"/>
-                                    <field name="description" select="2"/>
+                                    <field name="description"/>
                                     <field name="currency_digits" tree_invisible="1"/>
                                 </tree>
                             </field>
                         </page>
                         <page string="Shipments" id="shipments">
-                            <separator name="moves" colspan="4"/>
                             <field name="moves" colspan="4">
                                 <tree string="Moves">
                                     <field name="product"/>
@@ -160,7 +176,6 @@ this repository contains the full copyright notices and license terms. -->
                                     <field name="unit_digits" tree_invisible="1"/>
                                 </tree>
                             </field>
-                            <separator name="shipments" colspan="4"/>
                             <field name="shipments" colspan="4"/>
                         </page>
                     </notebook>
@@ -176,20 +191,20 @@ this repository contains the full copyright notices and license terms. -->
             <field name="arch" type="xml">
                 <![CDATA[
                 <tree string="Purchases">
-                    <field name="reference" select="1"/>
-                    <field name="supplier_reference" select="1"/>
-                    <field name="purchase_date" select="2"/>
-                    <field name="party" select="1"/>
+                    <field name="reference"/>
+                    <field name="supplier_reference"/>
+                    <field name="purchase_date"/>
+                    <field name="party"/>
                     <field name="warehouse"/>
-                    <field name="currency" select="2"/>
-                    <field name="untaxed_amount" select="2"/>
-                    <field name="total_amount" select="2"/>
-                    <field name="state" select="2"/>
-                    <field name="invoice_state" select="2"/>
-                    <field name="shipment_state" select="2"/>
-                    <field name="description" select="2"/>
+                    <field name="currency"/>
+                    <field name="untaxed_amount"/>
+                    <field name="total_amount"/>
+                    <field name="state"/>
+                    <field name="invoice_state"/>
+                    <field name="shipment_state"/>
+                    <field name="description"/>
                     <field name="currency_digits" tree_invisible="1"/>
-                    <field name="create_date" tree_invisible="1" select="2"/>
+                    <field name="create_date" tree_invisible="1"/>
                 </tree>
                 ]]>
             </field>
@@ -203,7 +218,7 @@ this repository contains the full copyright notices and license terms. -->
         <record model="ir.action.keyword"
                 id="act_open_shipment_keyword1">
             <field name="keyword">form_relate</field>
-            <field name="model">purchase.purchase,0</field>
+            <field name="model">purchase.purchase,-1</field>
             <field name="action" ref="act_shipment_form"/>
         </record>
         <record model="ir.action.act_window" id="act_invoice_form">
@@ -215,7 +230,7 @@ this repository contains the full copyright notices and license terms. -->
         <record model="ir.action.keyword"
                 id="act_open_invoice_keyword1">
             <field name="keyword">form_relate</field>
-            <field name="model">purchase.purchase,0</field>
+            <field name="model">purchase.purchase,-1</field>
             <field name="action" ref="act_invoice_form"/>
         </record>
 
@@ -224,10 +239,13 @@ this repository contains the full copyright notices and license terms. -->
             <field name="type">form</field>
             <field name="arch" type="xml">
                 <![CDATA[
-                <form string="Handle shipment Exception" col="1">
-                    <separator string="Choose moves to recreate"
-                               id="choose"/>
-                    <field name="recreate_moves">
+                <form string="Handle shipment Exception" col="2">
+                    <image name="tryton-dialog-information" xexpand="0"
+                        xfill="0"/>
+                    <label string="Choose move to recreate"
+                        id="choose"
+                        yalign="0.0" xalign="0.0" xexpand="1"/>
+                    <field name="recreate_moves" colspan="2">
                         <tree string="Recreated Moves" fill="1">
                             <field name="product"/>
                             <field name="quantity"/>
@@ -245,10 +263,13 @@ this repository contains the full copyright notices and license terms. -->
             <field name="type">form</field>
             <field name="arch" type="xml">
                 <![CDATA[
-                <form string="Handle Invoice Exception" col="1">
-                    <separator string="Choose invoices to recreate"
-                               id="choose"/>
-                    <field name="recreate_invoices"/>
+                <form string="Handle Invoice Exception" col="2">
+                    <image name="tryton-dialog-information" xexpand="0"
+                        xfill="0"/>
+                    <label string="Choose invoices to recreate"
+                        id="choose"
+                        yalign="0.0" xalign="0.0" xexpand="1"/>
+                    <field name="recreate_invoices" colspan="2"/>
                 </form>
                 ]]>
             </field>
@@ -257,7 +278,7 @@ this repository contains the full copyright notices and license terms. -->
         <record model="ir.action.act_window" id="act_purchase_form">
             <field name="name">Purchases</field>
             <field name="res_model">purchase.purchase</field>
-            <field name="search_value">{'create_date': ['between', Date(delta_years=-1)]}</field>
+            <field name="search_value">[('create_date', '>=', DateTime(hour=0, minute=0, second=0, microsecond=0, delta_years=-1))]</field>
         </record>
         <record model="ir.action.act_window.view" id="act_purchase_form_view1">
             <field name="sequence" eval="10"/>
@@ -271,23 +292,10 @@ this repository contains the full copyright notices and license terms. -->
         </record>
         <menuitem parent="menu_purchase" action="act_purchase_form"
             id="menu_purchase_form" sequence="10"/>
-
-        <record model="ir.action.act_window" id="act_purchase_form_new">
-            <field name="name">New Purchase</field>
-            <field name="res_model">purchase.purchase</field>
-        </record>
-        <record model="ir.action.act_window.view" id="act_purchase_form_new_view1">
-            <field name="sequence" eval="20"/>
-            <field name="view" ref="purchase_view_tree"/>
-            <field name="act_window" ref="act_purchase_form_new"/>
-        </record>
-        <record model="ir.action.act_window.view" id="act_purchase_form_new_view2">
-            <field name="sequence" eval="10"/>
-            <field name="view" ref="purchase_view_form"/>
-            <field name="act_window" ref="act_purchase_form_new"/>
+        <record model="ir.ui.menu-res.group" id="menu_purchase_form_group_purchase">
+            <field name="menu" ref="menu_purchase_form"/>
+            <field name="group" ref="group_purchase"/>
         </record>
-        <menuitem parent="menu_purchase_form" action="act_purchase_form_new"
-            id="menu_purchase_form_new" sequence="10"/>
 
         <record model="ir.action.act_window" id="act_purchase_form_draft">
             <field name="name">Draft Purchases</field>
@@ -348,7 +356,7 @@ this repository contains the full copyright notices and license terms. -->
 
         <record model="ir.model.access" id="access_purchase">
             <field name="model" search="[('model', '=', 'purchase.purchase')]"/>
-            <field name="perm_read" eval="True"/>
+            <field name="perm_read" eval="False"/>
             <field name="perm_write" eval="False"/>
             <field name="perm_create" eval="False"/>
             <field name="perm_delete" eval="False"/>
@@ -364,9 +372,18 @@ this repository contains the full copyright notices and license terms. -->
         <record model="ir.sequence.type" id="sequence_type_purchase">
             <field name="name">Purchase</field>
             <field name="code">purchase.purchase</field>
-            <field name="groups"
-                eval="[('add', ref('res.group_admin')), ('add', ref('group_purchase_admin'))]"/>
         </record>
+        <record model="ir.sequence.type-res.group"
+            id="sequence_type_purchase_group_admin">
+            <field name="sequence_type" ref="sequence_type_purchase"/>
+            <field name="group" ref="res.group_admin"/>
+        </record>
+        <record model="ir.sequence.type-res.group"
+            id="sequence_type_purchase_group_purchase_admin">
+            <field name="sequence_type" ref="sequence_type_purchase"/>
+            <field name="group" ref="group_purchase_admin"/>
+        </record>
+
         <record model="ir.sequence" id="sequence_purchase">
             <field name="name">Purchase</field>
             <field name="code">purchase.purchase</field>
@@ -379,22 +396,19 @@ this repository contains the full copyright notices and license terms. -->
         <record model="workflow.activity" id="purchase_activity_draft">
             <field name="name">Draft</field>
             <field name="workflow" ref="purchase_workflow"/>
-            <field name="kind">function</field>
-            <field name="action">write({'state': 'draft'})</field>
+            <field name="method">wkf_draft</field>
             <field name="flow_start" eval="True"/>
         </record>
         <record model="workflow.activity" id="purchase_activity_quotation">
             <field name="name">Quotation</field>
             <field name="workflow" ref="purchase_workflow"/>
-            <field name="kind">function</field>
-            <field name="action">check_for_quotation()
set_reference()
write({'state': 'quotation'})</field>
+            <field name="method">wkf_quotation</field>
         </record>
         <record model="workflow.activity" id="purchase_activity_confirmed">
             <field name="name">Confirmed</field>
             <field name="workflow" ref="purchase_workflow"/>
             <field name="split_mode">AND</field>
-            <field name="kind">function</field>
-            <field name="action">set_purchase_date()
write({'state': 'confirmed'})</field>
+            <field name="method">wkf_confirmed</field>
         </record>
         <record model="workflow.activity" id="purchase_activity_invoice_method">
             <field name="name">Invoice Method</field>
@@ -404,20 +418,17 @@ this repository contains the full copyright notices and license terms. -->
         <record model="workflow.activity" id="purchase_activity_waiting_invoice_purchase">
             <field name="name">Waiting Invoice</field>
             <field name="workflow" ref="purchase_workflow"/>
-            <field name="kind">function</field>
-            <field name="action">create_invoice()
write({'invoice_state': 'waiting'})</field>
+            <field name="method">wkf_invoice_waiting</field>
         </record>
         <record model="workflow.activity" id="purchase_activity_invoice_purchase_exception">
             <field name="name">Invoice Exception</field>
             <field name="workflow" ref="purchase_workflow"/>
-            <field name="kind">function</field>
-            <field name="action">write({'invoice_state': 'exception'})</field>
+            <field name="method">wkf_invoice_exception</field>
         </record>
         <record model="workflow.activity" id="purchase_activity_invoice_done">
             <field name="name">Invoice Done</field>
             <field name="workflow" ref="purchase_workflow"/>
-            <field name="kind">function</field>
-            <field name="action">write({'invoice_state': 'paid'})</field>
+            <field name="method">wkf_invoice_done</field>
         </record>
         <record model="workflow.activity" id="purchase_activity_invoice_method_done">
             <field name="name">Invoice Method Done</field>
@@ -426,14 +437,12 @@ this repository contains the full copyright notices and license terms. -->
         <record model="workflow.activity" id="purchase_activity_waiting_shipment">
             <field name="name">Waiting Shipment</field>
             <field name="workflow" ref="purchase_workflow"/>
-            <field name="kind">function</field>
-            <field name="action">write({'shipment_state': 'waiting'})
create_move()</field>
+            <field name="method">wkf_shipment_waiting</field>
         </record>
         <record model="workflow.activity" id="purchase_activity_shipment_exception">
             <field name="name">Shipment Exception</field>
             <field name="workflow" ref="purchase_workflow"/>
-            <field name="kind">function</field>
-            <field name="action">write({'shipment_state': 'exception'})</field>
+            <field name="method">wkf_shipment_exception</field>
         </record>
         <record model="workflow.activity" id="purchase_activity_invoice_shipment_method">
             <field name="name">Invoice Shipment Method</field>
@@ -443,51 +452,45 @@ this repository contains the full copyright notices and license terms. -->
         <record model="workflow.activity" id="purchase_activity_invoice_shipment">
             <field name="name">Invoice Shipment</field>
             <field name="workflow" ref="purchase_workflow"/>
-            <field name="kind">function</field>
-            <field name="action">create_invoice()
write({'invoice_state': 'waiting'})</field>
+            <field name="method">wkf_invoice_shipment</field>
         </record>
         <record model="workflow.activity" id="purchase_activity_waiting_invoice_shipment">
             <field name="name">Waiting Invoice Shipment</field>
             <field name="workflow" ref="purchase_workflow"/>
-            <field name="kind">function</field>
-            <field name="action">write({'invoice_state': 'waiting', 'shipment_state': 'received'})</field>
+            <field name="method">wkf_invoice_shipment_waiting</field>
         </record>
         <record model="workflow.activity" id="purchase_activity_invoice_shipment_exception">
             <field name="name">Invoice Shipment Exception</field>
             <field name="workflow" ref="purchase_workflow"/>
-            <field name="action">write({'invoice_state': 'exception'})</field>
+            <field name="method">wkf_invoice_shipment_exception</field>
         </record>
         <record model="workflow.activity" id="purchase_activity_invoice_shipment_done">
             <field name="name">Invoice Shipment Done</field>
             <field name="workflow" ref="purchase_workflow"/>
-            <field name="kind">function</field>
-            <field name="action">write({'invoice_state': 'paid'})</field>
+            <field name="method">wkf_invoice_shipment_done</field>
         </record>
         <record model="workflow.activity" id="purchase_activity_invoice_shipment_method_done">
             <field name="name">Invoice Shipment Method Done</field>
             <field name="workflow" ref="purchase_workflow"/>
-            <field name="kind">function</field>
-            <field name="action">write({'shipment_state': 'received'})</field>
+            <field name="method">wkf_invoice_shipment_method_done</field>
         </record>
         <record model="workflow.activity" id="purchase_activity_done">
             <field name="name">Done</field>
             <field name="workflow" ref="purchase_workflow"/>
             <field name="join_mode">AND</field>
-            <field name="kind">function</field>
-            <field name="action">write({'state': 'done'})</field>
+            <field name="method">wkf_done</field>
             <field name="flow_stop" eval="True"/>
         </record>
         <record model="workflow.activity" id="purchase_activity_cancel">
             <field name="name">Canceled</field>
             <field name="workflow" ref="purchase_workflow"/>
-            <field name="kind">function</field>
-            <field name="action">write({'state': 'cancel'})</field>
+            <field name="method">wkf_cancel</field>
             <field name="flow_stop" eval="True"/>
         </record>
         <record model="workflow.transition" id="purchase_transition_draft_quotation">
             <field name="act_from" ref="purchase_activity_draft"/>
             <field name="act_to" ref="purchase_activity_quotation"/>
-            <field name="condition">bool(lines)</field>
+            <field name="condition">wkf_draft2quotation</field>
             <field name="signal">quotation</field>
             <field name="group" ref="group_purchase"/>
         </record>
@@ -522,19 +525,19 @@ this repository contains the full copyright notices and license terms. -->
         <record model="workflow.transition" id="purchase_transition_invoice_method_waiting_invoice_purchase">
             <field name="act_from" ref="purchase_activity_invoice_method"/>
             <field name="act_to" ref="purchase_activity_waiting_invoice_purchase"/>
-            <field name="condition">invoice_method == 'order'</field>
+            <field name="condition">wkf_invoice_method2invoice_waiting</field>
         </record>
         <record model="workflow.transition" id="purchase_transition_invoice_method_invoice_done">
             <field name="act_from" ref="purchase_activity_invoice_method"/>
             <field name="act_to" ref="purchase_activity_invoice_method_done"/>
-            <field name="condition">invoice_method != 'order'</field>
+            <field name="condition">wkf_invoice_method2invoice_done</field>
         </record>
         <record model="workflow.transition" id="purchase_transition_waiting_invoice_purchase_invoice_purchase_exception">
             <field name="act_from" ref="purchase_activity_waiting_invoice_purchase"/>
             <field name="act_to" ref="purchase_activity_invoice_purchase_exception"/>
             <field name="trigger_model">account.invoice</field>
-            <field name="trigger_expr_id">[x.id for x in invoices]</field>
-            <field name="condition">invoice_exception</field>
+            <field name="trigger_ids">wkf_triggered_invoices</field>
+            <field name="condition">wkf_invoice_waiting2invoice_purchase_exception</field>
         </record>
         <record model="workflow.transition" id="purchase_transition_invoice_purchase_exception_invoice_purchase">
             <field name="act_from" ref="purchase_activity_invoice_purchase_exception"/>
@@ -552,8 +555,8 @@ this repository contains the full copyright notices and license terms. -->
             <field name="act_from" ref="purchase_activity_waiting_invoice_purchase"/>
             <field name="act_to" ref="purchase_activity_invoice_done"/>
             <field name="trigger_model">account.invoice</field>
-            <field name="trigger_expr_id">[x.id for x in invoices]</field>
-            <field name="condition">invoice_paid</field>
+            <field name="trigger_ids">wkf_triggered_invoices</field>
+            <field name="condition">wkf_invoice_waiting2invoice_done</field>
         </record>
         <record model="workflow.transition" id="purchase_transition_invoice_done_invoice_method_done">
             <field name="act_from" ref="purchase_activity_invoice_done"/>
@@ -571,7 +574,7 @@ this repository contains the full copyright notices and license terms. -->
             <field name="act_from" ref="purchase_activity_waiting_shipment"/>
             <field name="act_to" ref="purchase_activity_shipment_exception"/>
             <field name="signal">shipment_update</field>
-            <field name="condition">shipment_exception</field>
+            <field name="condition">wkf_shipment_waiting2shipment_exception</field>
         </record>
         <record model="workflow.transition" id="purchase_transition_shipment_exception_cancel">
             <field name="act_from" ref="purchase_activity_shipment_exception"/>
@@ -589,44 +592,51 @@ this repository contains the full copyright notices and license terms. -->
             <field name="act_from" ref="purchase_activity_waiting_shipment"/>
             <field name="act_to" ref="purchase_activity_invoice_shipment_method"/>
             <field name="signal">shipment_update</field>
-            <field name="condition">not shipment_exception</field>
+            <field
+                name="condition">wkf_shipment_waiting2invoice_shipment_method</field>
         </record>
         <record model="workflow.transition" id="purchase_transition_waiting_shipment_invoice_shipment_method2">
             <field name="act_from" ref="purchase_activity_waiting_shipment"/>
             <field name="act_to" ref="purchase_activity_invoice_shipment_method"/>
-            <field name="condition">shipment_done</field>
+            <field
+                name="condition">wkf_shipment_waiting2invoice_shipment_method_nosignal</field>
         </record>
         <record model="workflow.transition" id="purchase_transition_invoice_shipment_method_invoice_shipment">
             <field name="act_from" ref="purchase_activity_invoice_shipment_method"/>
             <field name="act_to" ref="purchase_activity_invoice_shipment"/>
-            <field name="condition">invoice_method == 'shipment'</field>
+            <field
+                name="condition">wkf_invoice_shipment_method2invoice_shipment</field>
         </record>
         <record model="workflow.transition" id="purchase_transition_invoice_shipment_method_invoice_shipment_method_done">
             <field name="act_from" ref="purchase_activity_invoice_shipment_method"/>
             <field name="act_to" ref="purchase_activity_invoice_shipment_method_done"/>
-            <field name="condition">invoice_method != 'shipment' and shipment_done</field>
+            <field
+                name="condition">wkf_invoice_shipment_method2inv_shipment_method_done</field>
         </record>
         <record model="workflow.transition" id="purchase_transition_invoice_shipment_method_waiting_shipment">
             <field name="act_from" ref="purchase_activity_invoice_shipment_method"/>
             <field name="act_to" ref="purchase_activity_waiting_shipment"/>
-            <field name="condition">invoice_method != 'shipment' and not shipment_done</field>
+            <field
+                name="condition">wkf_invoice_shipment_method2shipment_waiting</field>
         </record>
         <record model="workflow.transition" id="purchase_transition_invoice_shipment_waiting_shipment">
             <field name="act_from" ref="purchase_activity_invoice_shipment"/>
             <field name="act_to" ref="purchase_activity_waiting_shipment"/>
-            <field name="condition">not shipment_done</field>
+            <field name="condition">wkf_invoice_shipment2shipment_waiting</field>
         </record>
         <record model="workflow.transition" id="purchase_transition_invoice_shipment_waiting_invoice_shipment">
             <field name="act_from" ref="purchase_activity_invoice_shipment"/>
             <field name="act_to" ref="purchase_activity_waiting_invoice_shipment"/>
-            <field name="condition">shipment_done</field>
+            <field
+                name="condition">wkf_invoice_shipment2waiting_invoice_shipment</field>
         </record>
         <record model="workflow.transition" id="purchase_transition_waiting_invoice_shipment_invoice_shipment_exception">
             <field name="act_from" ref="purchase_activity_waiting_invoice_shipment"/>
             <field name="act_to" ref="purchase_activity_invoice_shipment_exception"/>
             <field name="trigger_model">account.invoice</field>
-            <field name="trigger_expr_id">[x.id for x in invoices]</field>
-            <field name="condition">invoice_exception</field>
+            <field name="trigger_ids">wkf_triggered_invoices</field>
+            <field
+                name="condition">wkf_waiting_invoice_shipment2invoice_shipment_exception</field>
         </record>
         <record model="workflow.transition" id="purchase_transition_invoice_shipment_exception_cancel">
             <field name="act_from" ref="purchase_activity_invoice_shipment_exception"/>
@@ -644,8 +654,9 @@ this repository contains the full copyright notices and license terms. -->
             <field name="act_from" ref="purchase_activity_waiting_invoice_shipment"/>
             <field name="act_to" ref="purchase_activity_invoice_shipment_done"/>
             <field name="trigger_model">account.invoice</field>
-            <field name="trigger_expr_id">[x.id for x in invoices]</field>
-            <field name="condition">invoice_paid</field>
+            <field name="trigger_ids">wkf_triggered_invoices</field>
+            <field
+                name="condition">wkf_waiting_invoice_shipment2invoice_shipment_done</field>
         </record>
         <record model="workflow.transition" id="purchase_transition_invoice_shipment_done_invoice_shipment_method_done">
             <field name="act_from" ref="purchase_activity_invoice_shipment_done"/>
@@ -665,7 +676,7 @@ this repository contains the full copyright notices and license terms. -->
         </record>
         <record model="ir.action.keyword" id="report_purchase_keyword">
             <field name="keyword">form_print</field>
-            <field name="model">purchase.purchase,0</field>
+            <field name="model">purchase.purchase,-1</field>
             <field name="action" ref="report_purchase"/>
         </record>
 
@@ -686,14 +697,14 @@ this repository contains the full copyright notices and license terms. -->
                             <label name="product"/>
                             <field name="product">
                                 <tree string="Products">
-                                    <field name="name" select="1"/>
-                                    <field name="code" select="1"/>
-                                    <field name="list_price_uom" select="2"/>
-                                    <field name="cost_price_uom" select="2"/>
-                                    <field name="quantity" select="2"/>
-                                    <field name="forecast_quantity" select="2"/>
-                                    <field name="default_uom" select="2"/>
-                                    <field name="active" select="2"/>
+                                    <field name="name"/>
+                                    <field name="code"/>
+                                    <field name="list_price_uom"/>
+                                    <field name="cost_price_uom"/>
+                                    <field name="quantity"/>
+                                    <field name="forecast_quantity"/>
+                                    <field name="default_uom"/>
+                                    <field name="active"/>
                                 </tree>
                             </field>
                             <newline/>
@@ -708,7 +719,6 @@ this repository contains the full copyright notices and license terms. -->
                             <field name="unit_price"/>
                             <label name="amount"/>
                             <field name="amount"/>
-                            <separator name="taxes" colspan="4"/>
                             <field name="taxes" colspan="4"/>
                         </page>
                         <page string="Notes" id="notes">
@@ -729,13 +739,13 @@ this repository contains the full copyright notices and license terms. -->
             <field name="arch" type="xml">
                 <![CDATA[
                 <tree string="Purchase Lines">
-                    <field name="purchase" select="1"/>
-                    <field name="type" select="1"/>
-                    <field name="product" select="1"/>
-                    <field name="description" select="1"/>
-                    <field name="quantity" select="1"/>
-                    <field name="unit" select="2"/>
-                    <field name="unit_price" select="2"/>
+                    <field name="purchase"/>
+                    <field name="type"/>
+                    <field name="product"/>
+                    <field name="description"/>
+                    <field name="quantity"/>
+                    <field name="unit"/>
+                    <field name="unit_price"/>
                     <field name="taxes"/>
                     <field name="amount"/>
                     <field name="unit_digits" tree_invisible="1"/>
@@ -745,10 +755,10 @@ this repository contains the full copyright notices and license terms. -->
         </record>
         <record model="ir.model.access" id="access_purchase_line">
             <field name="model" search="[('model', '=', 'purchase.line')]"/>
-            <field name="perm_read" eval="True"/>
-            <field name="perm_write" eval="True"/>
-            <field name="perm_create" eval="True"/>
-            <field name="perm_delete" eval="True"/>
+            <field name="perm_read" eval="False"/>
+            <field name="perm_write" eval="False"/>
+            <field name="perm_create" eval="False"/>
+            <field name="perm_delete" eval="False"/>
         </record>
         <record model="ir.model.access" id="access_purchase_line_purchase">
             <field name="model" search="[('model', '=', 'purchase.line')]"/>
@@ -766,7 +776,7 @@ this repository contains the full copyright notices and license terms. -->
                 <![CDATA[
                 <form string="Product Supplier">
                     <label name="product"/>
-                    <field name="product" colspan="4"/>
+                    <field name="product" colspan="3"/>
                     <label name="party"/>
                     <field name="party"/>
                     <label name="sequence"/>
@@ -788,11 +798,11 @@ this repository contains the full copyright notices and license terms. -->
             <field name="arch" type="xml">
                 <![CDATA[
                 <tree string="Product Suppliers">
-                    <field name="product" select="1"/>
-                    <field name="party" select="1"/>
-                    <field name="name" select="1"/>
-                    <field name="code" select="1"/>
-                    <field name="sequence" select="2"/>
+                    <field name="product"/>
+                    <field name="party"/>
+                    <field name="name"/>
+                    <field name="code"/>
+                    <field name="sequence"/>
                 </tree>
                 ]]>
             </field>
@@ -880,7 +890,7 @@ this repository contains the full copyright notices and license terms. -->
                 <data>
                     <xpath expr="/tree/field[@name="default_uom"]"
                         position="after">
-                        <field name="purchasable" select="2"/>
+                        <field name="purchasable"/>
                     </xpath>
                 </data>
                 ]]>
@@ -895,7 +905,7 @@ this repository contains the full copyright notices and license terms. -->
                 <data>
                     <xpath expr="/form/notebook/page/field[@name="incoming_moves"]/tree/field[@name="uom"]"
                         position="after">
-                        <field name="purchase" select="1"/>
+                        <field name="purchase"/>
                     </xpath>
                 </data>
                 ]]>
@@ -958,5 +968,41 @@ this repository contains the full copyright notices and license terms. -->
             <field name="rule_group" ref="rule_group_purchase"/>
         </record>
 
+        <record model="ir.model.access" id="access_invoice_purchase">
+            <field name="model" search="[('model', '=', 'account.invoice')]"/>
+            <field name="group" ref="group_purchase"/>
+            <field name="perm_read" eval="True"/>
+            <field name="perm_write" eval="False"/>
+            <field name="perm_create" eval="False"/>
+            <field name="perm_delete" eval="False"/>
+        </record>
+
+        <record model="ir.model.access" id="access_invoice_line_purchase">
+            <field name="model" search="[('model', '=', 'account.invoice.line')]"/>
+            <field name="group" ref="group_purchase"/>
+            <field name="perm_read" eval="True"/>
+            <field name="perm_write" eval="False"/>
+            <field name="perm_create" eval="False"/>
+            <field name="perm_delete" eval="False"/>
+        </record>
+
+        <record model="ir.model.access" id="access_move_group_purchase">
+            <field name="model" search="[('model', '=', 'stock.move')]"/>
+            <field name="group" ref="group_purchase"/>
+            <field name="perm_read" eval="True"/>
+            <field name="perm_write" eval="False"/>
+            <field name="perm_create" eval="False"/>
+            <field name="perm_delete" eval="False"/>
+        </record>
+
+        <record model="ir.model.access" id="access_shipment_in_group_purchase">
+            <field name="model" search="[('model', '=', 'stock.shipment.in')]"/>
+            <field name="group" ref="group_purchase"/>
+            <field name="perm_read" eval="True"/>
+            <field name="perm_write" eval="False"/>
+            <field name="perm_create" eval="False"/>
+            <field name="perm_delete" eval="False"/>
+        </record>
+
     </data>
 </tryton>
diff --git a/setup.py b/setup.py
index a9fbe5c..fbb5df3 100644
--- a/setup.py
+++ b/setup.py
@@ -40,17 +40,20 @@ setup(name='trytond_purchase',
     classifiers=[
         'Development Status :: 5 - Production/Stable',
         'Environment :: Plugins',
+        'Framework :: Tryton',
         'Intended Audience :: Developers',
         'Intended Audience :: Financial and Insurance Industry',
         'Intended Audience :: Legal Industry',
         'License :: OSI Approved :: GNU General Public License (GPL)',
         'Natural Language :: Bulgarian',
+        'Natural Language :: Czech',
+        'Natural Language :: Dutch',
         'Natural Language :: English',
         'Natural Language :: French',
         'Natural Language :: German',
+        'Natural Language :: Russian',
         'Natural Language :: Spanish',
         'Operating System :: OS Independent',
-        'Programming Language :: Python :: 2.5',
         'Programming Language :: Python :: 2.6',
         'Programming Language :: Python :: 2.7',
         'Topic :: Office/Business',
diff --git a/tests/test_purchase.py b/tests/test_purchase.py
index 4457cfa..620ac79 100644
--- a/tests/test_purchase.py
+++ b/tests/test_purchase.py
@@ -10,7 +10,7 @@ if os.path.isdir(DIR):
 
 import unittest
 import trytond.tests.test_tryton
-from trytond.tests.test_tryton import test_view
+from trytond.tests.test_tryton import test_view, test_depends
 
 
 class PurchaseTestCase(unittest.TestCase):
@@ -27,6 +27,12 @@ class PurchaseTestCase(unittest.TestCase):
         '''
         test_view('purchase')
 
+    def test0006depends(self):
+        '''
+        Test depends.
+        '''
+        test_depends()
+
 def suite():
     suite = trytond.tests.test_tryton.suite()
     suite.addTests(unittest.TestLoader().loadTestsFromTestCase(
diff --git a/trytond_purchase.egg-info/PKG-INFO b/trytond_purchase.egg-info/PKG-INFO
index baefecc..c64b585 100644
--- a/trytond_purchase.egg-info/PKG-INFO
+++ b/trytond_purchase.egg-info/PKG-INFO
@@ -1,6 +1,6 @@
 Metadata-Version: 1.0
 Name: trytond-purchase
-Version: 2.0.3
+Version: 2.2.0
 Summary: Define purchase order.
 Add product supplier and purchase informations.
 Define the purchase price as the supplier price or the cost price.
@@ -16,22 +16,25 @@ Home-page: http://www.tryton.org/
 Author: B2CK
 Author-email: info at b2ck.com
 License: GPL-3
-Download-URL: http://downloads.tryton.org/2.0/
+Download-URL: http://downloads.tryton.org/2.2/
 Description: UNKNOWN
 Platform: UNKNOWN
 Classifier: Development Status :: 5 - Production/Stable
 Classifier: Environment :: Plugins
+Classifier: Framework :: Tryton
 Classifier: Intended Audience :: Developers
 Classifier: Intended Audience :: Financial and Insurance Industry
 Classifier: Intended Audience :: Legal Industry
 Classifier: License :: OSI Approved :: GNU General Public License (GPL)
 Classifier: Natural Language :: Bulgarian
+Classifier: Natural Language :: Czech
+Classifier: Natural Language :: Dutch
 Classifier: Natural Language :: English
 Classifier: Natural Language :: French
 Classifier: Natural Language :: German
+Classifier: Natural Language :: Russian
 Classifier: Natural Language :: Spanish
 Classifier: Operating System :: OS Independent
-Classifier: Programming Language :: Python :: 2.5
 Classifier: Programming Language :: Python :: 2.6
 Classifier: Programming Language :: Python :: 2.7
 Classifier: Topic :: Office/Business
diff --git a/trytond_purchase.egg-info/SOURCES.txt b/trytond_purchase.egg-info/SOURCES.txt
index 90c167e..6a215f4 100644
--- a/trytond_purchase.egg-info/SOURCES.txt
+++ b/trytond_purchase.egg-info/SOURCES.txt
@@ -5,12 +5,7 @@ LICENSE
 MANIFEST.in
 README
 TODO
-bg_BG.csv
 configuration.xml
-de_DE.csv
-es_CO.csv
-es_ES.csv
-fr_FR.csv
 party.xml
 purchase.odt
 purchase.xml
@@ -23,6 +18,14 @@ setup.py
 ./tests/__init__.py
 ./tests/test_purchase.py
 doc/index.rst
+locale/bg_BG.po
+locale/cs_CZ.po
+locale/de_DE.po
+locale/es_CO.po
+locale/es_ES.po
+locale/fr_FR.po
+locale/nl_NL.po
+locale/ru_RU.po
 trytond_purchase.egg-info/PKG-INFO
 trytond_purchase.egg-info/SOURCES.txt
 trytond_purchase.egg-info/dependency_links.txt
diff --git a/trytond_purchase.egg-info/requires.txt b/trytond_purchase.egg-info/requires.txt
index 7d8b694..e3b51f8 100644
--- a/trytond_purchase.egg-info/requires.txt
+++ b/trytond_purchase.egg-info/requires.txt
@@ -1,9 +1,9 @@
-trytond_company >= 2.0, < 2.1
-trytond_party >= 2.0, < 2.1
-trytond_stock >= 2.0, < 2.1
-trytond_account >= 2.0, < 2.1
-trytond_product >= 2.0, < 2.1
-trytond_account_invoice >= 2.0, < 2.1
-trytond_currency >= 2.0, < 2.1
-trytond_account_product >= 2.0, < 2.1
-trytond >= 2.0, < 2.1
\ No newline at end of file
+trytond_company >= 2.2, < 2.3
+trytond_party >= 2.2, < 2.3
+trytond_stock >= 2.2, < 2.3
+trytond_account >= 2.2, < 2.3
+trytond_product >= 2.2, < 2.3
+trytond_account_invoice >= 2.2, < 2.3
+trytond_currency >= 2.2, < 2.3
+trytond_account_product >= 2.2, < 2.3
+trytond >= 2.2, < 2.3
\ No newline at end of file
commit 89dab9b8a6ae1dfbfc7d1318bd864a20e553cb0a
Author: Mathias Behrle <mathiasb at m9s.biz>
Date:   Mon Oct 3 14:49:08 2011 +0200

    Adding upstream version 2.0.3.

diff --git a/CHANGELOG b/CHANGELOG
index c145315..2f635f7 100644
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -1,3 +1,9 @@
+Version 2.0.3 - 2011-10-01
+* Bug fixes (see mercurial logs for details)
+
+Version 2.0.2 - 2011-09-10
+* Bug fixes (see mercurial logs for details)
+
 Version 2.0.1 - 2011-05-29
 * Bug fixes (see mercurial logs for details)
 
diff --git a/PKG-INFO b/PKG-INFO
index 0e23b70..fcc34da 100644
--- a/PKG-INFO
+++ b/PKG-INFO
@@ -1,6 +1,6 @@
 Metadata-Version: 1.0
 Name: trytond_purchase
-Version: 2.0.1
+Version: 2.0.3
 Summary: Define purchase order.
 Add product supplier and purchase informations.
 Define the purchase price as the supplier price or the cost price.
diff --git a/__tryton__.py b/__tryton__.py
index 42a9e9e..b8f6691 100644
--- a/__tryton__.py
+++ b/__tryton__.py
@@ -7,7 +7,7 @@
     'name_es_CO': 'Compras',
     'name_es_ES': 'Compras',
     'name_fr_FR': 'Achat',
-    'version': '2.0.1',
+    'version': '2.0.3',
     'author': 'B2CK',
     'email': 'info at b2ck.com',
     'website': 'http://www.tryton.org/',
diff --git a/purchase.py b/purchase.py
index 05e8436..1f41916 100644
--- a/purchase.py
+++ b/purchase.py
@@ -1080,7 +1080,9 @@ class PurchaseLine(ModelSQL, ModelView):
         res['note'] = line.note
         if line.type != 'line':
             return [res]
-        if line.purchase.invoice_method == 'order':
+        if (line.purchase.invoice_method == 'order'
+                or not line.product
+                or line.product.type == 'service'):
             quantity = line.quantity
         else:
             quantity = 0.0
diff --git a/trytond_purchase.egg-info/PKG-INFO b/trytond_purchase.egg-info/PKG-INFO
index 0d7da08..baefecc 100644
--- a/trytond_purchase.egg-info/PKG-INFO
+++ b/trytond_purchase.egg-info/PKG-INFO
@@ -1,6 +1,6 @@
 Metadata-Version: 1.0
 Name: trytond-purchase
-Version: 2.0.1
+Version: 2.0.3
 Summary: Define purchase order.
 Add product supplier and purchase informations.
 Define the purchase price as the supplier price or the cost price.
commit e5c5cf3b440d36856254ade7df1ce80346caf6d1
Author: Mathias Behrle <mathiasb at m9s.biz>
Date:   Sun Jun 5 13:14:55 2011 +0200

    Adding upstream version 2.0.1.

diff --git a/CHANGELOG b/CHANGELOG
index 78fcdaf..c145315 100644
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -1,3 +1,6 @@
+Version 2.0.1 - 2011-05-29
+* Bug fixes (see mercurial logs for details)
+
 Version 2.0.0 - 2011-04-27
 * Bug fixes (see mercurial logs for details)
 
diff --git a/PKG-INFO b/PKG-INFO
index 1f13257..0e23b70 100644
--- a/PKG-INFO
+++ b/PKG-INFO
@@ -1,6 +1,6 @@
 Metadata-Version: 1.0
 Name: trytond_purchase
-Version: 2.0.0
+Version: 2.0.1
 Summary: Define purchase order.
 Add product supplier and purchase informations.
 Define the purchase price as the supplier price or the cost price.
diff --git a/__tryton__.py b/__tryton__.py
index 3fbf0b9..42a9e9e 100644
--- a/__tryton__.py
+++ b/__tryton__.py
@@ -7,7 +7,7 @@
     'name_es_CO': 'Compras',
     'name_es_ES': 'Compras',
     'name_fr_FR': 'Achat',
-    'version': '2.0.0',
+    'version': '2.0.1',
     'author': 'B2CK',
     'email': 'info at b2ck.com',
     'website': 'http://www.tryton.org/',
diff --git a/purchase.py b/purchase.py
index 6a5eff1..05e8436 100644
--- a/purchase.py
+++ b/purchase.py
@@ -611,8 +611,8 @@ class Purchase(ModelWorkflow, ModelSQL, ModelView):
         Return invoice line values for each purchase lines
 
         :param purchase: a BrowseRecord of the purchase
-        :return: a dictionary with line id as key and a list
-            of invoice line values as value
+        :return: a dictionary with invoiced purchase line id as key
+            and a list of invoice line values as value
         '''
         line_obj = self.pool.get('purchase.line')
         res = {}
@@ -677,12 +677,14 @@ class Purchase(ModelWorkflow, ModelSQL, ModelView):
         with Transaction().set_user(0, set_context=True):
             invoice_id = invoice_obj.create(vals)
 
-        for line_id in invoice_lines:
-            for vals in invoice_lines[line_id]:
+        for line in purchase.lines:
+            if line.id not in invoice_lines:
+                continue
+            for vals in invoice_lines[line.id]:
                 vals['invoice'] = invoice_id
                 with Transaction().set_user(0, set_context=True):
                     invoice_line_id = invoice_line_obj.create(vals)
-                purchase_line_obj.write(line_id, {
+                purchase_line_obj.write(line.id, {
                     'invoice_lines': [('add', invoice_line_id)],
                     })
 
diff --git a/trytond_purchase.egg-info/PKG-INFO b/trytond_purchase.egg-info/PKG-INFO
index 790b4b3..0d7da08 100644
--- a/trytond_purchase.egg-info/PKG-INFO
+++ b/trytond_purchase.egg-info/PKG-INFO
@@ -1,6 +1,6 @@
 Metadata-Version: 1.0
 Name: trytond-purchase
-Version: 2.0.0
+Version: 2.0.1
 Summary: Define purchase order.
 Add product supplier and purchase informations.
 Define the purchase price as the supplier price or the cost price.
commit 5cb564c5dc3a16e07da786bedcc3502fa9871540
Author: Mathias Behrle <mathiasb at m9s.biz>
Date:   Tue May 24 19:12:59 2011 +0200

    Adding upstream version 2.0.0.

diff --git a/CHANGELOG b/CHANGELOG
index 2d479a6..78fcdaf 100644
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -1,4 +1,4 @@
-Version 1.8.1 - 2011-02-13
+Version 2.0.0 - 2011-04-27
 * Bug fixes (see mercurial logs for details)
 
 Version 1.8.0 - 2010-11-01
diff --git a/COPYRIGHT b/COPYRIGHT
index 97eff54..a9feb41 100644
--- a/COPYRIGHT
+++ b/COPYRIGHT
@@ -1,7 +1,7 @@
-Copyright (C) 2004-2008 Tiny SPRL.
 Copyright (C) 2008-2011 Cédric Krier.
 Copyright (C) 2008-2011 Bertrand Chenal.
 Copyright (C) 2008-2011 B2CK SPRL.
+Copyright (C) 2004-2008 Tiny SPRL.
 
 This program is free software: you can redistribute it and/or modify
 it under the terms of the GNU General Public License as published by
diff --git a/PKG-INFO b/PKG-INFO
index ad5df9b..1f13257 100644
--- a/PKG-INFO
+++ b/PKG-INFO
@@ -1,6 +1,6 @@
 Metadata-Version: 1.0
 Name: trytond_purchase
-Version: 1.8.1
+Version: 2.0.0
 Summary: Define purchase order.
 Add product supplier and purchase informations.
 Define the purchase price as the supplier price or the cost price.
@@ -16,7 +16,7 @@ Home-page: http://www.tryton.org/
 Author: B2CK
 Author-email: info at b2ck.com
 License: GPL-3
-Download-URL: http://downloads.tryton.org/1.8/
+Download-URL: http://downloads.tryton.org/2.0/
 Description: UNKNOWN
 Platform: UNKNOWN
 Classifier: Development Status :: 5 - Production/Stable
@@ -25,11 +25,14 @@ Classifier: Intended Audience :: Developers
 Classifier: Intended Audience :: Financial and Insurance Industry
 Classifier: Intended Audience :: Legal Industry
 Classifier: License :: OSI Approved :: GNU General Public License (GPL)
+Classifier: Natural Language :: Bulgarian
 Classifier: Natural Language :: English
 Classifier: Natural Language :: French
 Classifier: Natural Language :: German
 Classifier: Natural Language :: Spanish
 Classifier: Operating System :: OS Independent
-Classifier: Programming Language :: Python
+Classifier: Programming Language :: Python :: 2.5
+Classifier: Programming Language :: Python :: 2.6
+Classifier: Programming Language :: Python :: 2.7
 Classifier: Topic :: Office/Business
 Classifier: Topic :: Office/Business :: Financial :: Accounting
diff --git a/__init__.py b/__init__.py
index 35ed4f7..5c8fb9f 100644
--- a/__init__.py
+++ b/__init__.py
@@ -3,3 +3,4 @@
 
 from purchase import *
 from configuration import *
+from invoice import *
diff --git a/__tryton__.py b/__tryton__.py
index 20b9af5..3fbf0b9 100644
--- a/__tryton__.py
+++ b/__tryton__.py
@@ -2,11 +2,12 @@
 #this repository contains the full copyright notices and license terms.
 {
     'name': 'Purchase',
+    'name_bg_BG': 'Покупки',
     'name_de_DE': 'Einkauf',
     'name_es_CO': 'Compras',
     'name_es_ES': 'Compras',
     'name_fr_FR': 'Achat',
-    'version': '1.8.1',
+    'version': '2.0.0',
     'author': 'B2CK',
     'email': 'info at b2ck.com',
     'website': 'http://www.tryton.org/',
@@ -21,6 +22,17 @@ With the possibilities:
         - Based On Order
         - Based On Shipment
 ''',
+    'description_bg_BG': ''' Задаване на поръчки за покупки.
+ - Добавяне на доставчици на продукти и информация за покупки.
+ - Задаване на цената на покупка като цена на доствчик или фабричната цена.
+
+Със следните възможности:
+    - проследяване на фактури и състоянията на доставката от поръчка за покупка
+    - задаване на начини на фактуриране:
+        - Ръчно
+        - Въз основа на поръчка
+        - Въз основа на доставка
+''',
     'description_de_DE': ''' - Dient der Erstellung von Einkaufsvorgängen (Entwurf, Angebot, Auftrag).
  - Fügt den Artikeln Lieferanten und Einkaufsinformationen hinzu.
  - Erlaubt die Definition des Einkaufspreises als Lieferpreis oder Einkaufspreis.
@@ -85,6 +97,7 @@ Avec la possibilité:
         'party.xml',
     ],
     'translation': [
+        'bg_BG.csv',
         'de_DE.csv',
         'es_CO.csv',
         'es_ES.csv',
diff --git a/bg_BG.csv b/bg_BG.csv
new file mode 100644
index 0000000..d18bef0
--- /dev/null
+++ b/bg_BG.csv
@@ -0,0 +1,260 @@
+type,name,res_id,src,value,fuzzy
+error,account.invoice,0,You can not delete invoices that come from a purchase!,Не може да изтривате фактури които идват от покупка!,0
+error,account.invoice,0,You cannot reset to draft an invoice generated by a purchase.,Не може да прехвърляте в проект фактура генерирана при покупка.,0
+error,product.template,0,"Purchase prices are based on the purchase uom, are you sure to change it?","Покупните цени се основават мер, ед, на покупката, сигурни ли сте че искате да я смените?",0
+error,purchase.line,0,"It misses an ""Account Expense"" on product ""%s""!","Не е зададена ""Сметка за разходи"" за продукт ""%s""!",0
+error,purchase.line,0,"It misses an ""account expense"" default property!","Няма е зададено свойство по подразбиране ""Сметка за разходи""!",0
+error,purchase.line,0,The supplier location is required!,Местонахождението на доставчика е задължително!,0
+error,purchase.purchase,0,Invoice addresses must be defined for the quotation.,За запитването трябва да бъдат зададени адреси за фактуриране .,0
+error,purchase.purchase,0,"It misses an ""Account Payable"" on the party ""%s""!","Липсва ""Разходна сметка"" за партньор ""%s""!",0
+error,stock.shipment.in,0,You cannot reset to draft a move generated by a purchase.,Не може да преместите в проект движение създадено от покупка.,0
+field,"account.invoice,purchase_exception_state",0,Exception State,Състояние на грешка,0
+field,"account.invoice,purchases",0,Purchases,Покупки,0
+field,"account.invoice.line,purchase_lines",0,Purchase Lines,Редове от покупка,0
+field,"product.template,product_suppliers",0,Suppliers,Доставчици,0
+field,"product.template,purchasable",0,Purchasable,Купуваем,0
+field,"product.template,purchase_uom",0,Purchase UOM,Мер. ед. на покупка,0
+field,"purchase.configuration,purchase_invoice_method",0,Invoice Method,Начин на фактуриране,0
+field,"purchase.configuration,purchase_sequence",0,Purchase Reference Sequence,Последователност за отпратка на покупка,0
+field,"purchase.configuration,rec_name",0,Name,Име,0
+field,"purchase.handle.invoice.exception.ask,domain_invoices",0,Domain Invoices,Фактури на домейн,0
+field,"purchase.handle.invoice.exception.ask,recreate_invoices",0,Recreate Invoices,Наново създаване на фактури,0
+field,"purchase.handle.shipment.exception.ask,domain_moves",0,Domain Moves,Движение на домейн,0
+field,"purchase.handle.shipment.exception.ask,recreate_moves",0,Recreate Moves,Наново създаване на движения,0
+field,"purchase.line,amount",0,Amount,Сума,0
+field,"purchase.line,description",0,Description,Описание,0
+field,"purchase.line,invoice_lines",0,Invoice Lines,Редове от фактура,0
+field,"purchase.line,move_done",0,Moves Done,Направени движения,0
+field,"purchase.line,move_exception",0,Moves Exception,Грешка при движение,0
+field,"purchase.line,moves",0,Moves,Движения,0
+field,"purchase.line,moves_ignored",0,Ignored Moves,Игнорирани движения,0
+field,"purchase.line,moves_recreated",0,Recreated Moves,Наново създаване на движения,0
+field,"purchase.line,note",0,Note,Бележка,0
+field,"purchase.line,product",0,Product,Продукт,0
+field,"purchase.line,purchase",0,Purchase,Покупка,0
+field,"purchase.line,quantity",0,Quantity,Количество,0
+field,"purchase.line,rec_name",0,Name,Име,0
+field,"purchase.line,sequence",0,Sequence,Последователност,0
+field,"purchase.line,taxes",0,Taxes,Данъци,0
+field,"purchase.line,type",0,Type,Вид,0
+field,"purchase.line,unit",0,Unit,Единица,0
+field,"purchase.line,unit_digits",0,Unit Digits,Десетични единици,0
+field,"purchase.line,unit_price",0,Unit Price,Единична цена,0
+field,"purchase.line-account.invoice.line,invoice_line",0,Invoice Line,Ред от фактура,0
+field,"purchase.line-account.invoice.line,purchase_line",0,Purchase Line,Ред от покупка,0
+field,"purchase.line-account.invoice.line,rec_name",0,Name,Име,0
+field,"purchase.line-account.tax,line",0,Purchase Line,Ред от покупка,0
+field,"purchase.line-account.tax,rec_name",0,Name,Име,0
+field,"purchase.line-account.tax,tax",0,Tax,Данък,0
+field,"purchase.line-ignored-stock.move,move",0,Move,Движение,0
+field,"purchase.line-ignored-stock.move,purchase_line",0,Purchase Line,Ред от покупка,0
+field,"purchase.line-ignored-stock.move,rec_name",0,Name,Име,0
+field,"purchase.line-recreated-stock.move,move",0,Move,Движение,0
+field,"purchase.line-recreated-stock.move,purchase_line",0,Purchase Line,Ред от покупка,0
+field,"purchase.line-recreated-stock.move,rec_name",0,Name,Име,0
+field,"purchase.product_supplier,code",0,Code,Код,0
+field,"purchase.product_supplier,company",0,Company,Фирма,0
+field,"purchase.product_supplier,delivery_time",0,Delivery Time,Време за доставка,0
+field,"purchase.product_supplier,name",0,Name,Име,0
+field,"purchase.product_supplier,party",0,Supplier,Доставчик,0
+field,"purchase.product_supplier,prices",0,Prices,Цени,0
+field,"purchase.product_supplier,product",0,Product,Продукт,0
+field,"purchase.product_supplier,rec_name",0,Name,Име,0
+field,"purchase.product_supplier,sequence",0,Sequence,Последователност,0
+field,"purchase.product_supplier.price,product_supplier",0,Supplier,Доставчик,0
+field,"purchase.product_supplier.price,quantity",0,Quantity,Количество,0
+field,"purchase.product_supplier.price,rec_name",0,Name,Име,0
+field,"purchase.product_supplier.price,unit_price",0,Unit Price,Единична цена,0
+field,"purchase.purchase,comment",0,Comment,Коментар,0
+field,"purchase.purchase,company",0,Company,Фирма,0
+field,"purchase.purchase,currency",0,Currency,Валута,0
+field,"purchase.purchase,currency_digits",0,Currency Digits,Цифри за валута,0
+field,"purchase.purchase,description",0,Description,Описание,0
+field,"purchase.purchase,invoice_address",0,Invoice Address,Адрес за фактура,0
+field,"purchase.purchase,invoice_exception",0,Invoices Exception,Грешка при фактури,0
+field,"purchase.purchase,invoice_method",0,Invoice Method,Начин на фактуриране,0
+field,"purchase.purchase,invoice_paid",0,Invoices Paid,Платени фактури,0
+field,"purchase.purchase,invoice_state",0,Invoice State,Състояние на фактура,0
+field,"purchase.purchase,invoices",0,Invoices,Фактури,0
+field,"purchase.purchase,invoices_ignored",0,Ignored Invoices,Игнорирани фактури,0
+field,"purchase.purchase,invoices_recreated",0,Recreated Invoices,Наново създадени на фактури,0
+field,"purchase.purchase,lines",0,Lines,Редове,0
+field,"purchase.purchase,moves",0,Moves,Движения,0
+field,"purchase.purchase,party",0,Party,Партньор,0
+field,"purchase.purchase,party_lang",0,Party Language,Език на партньор,0
+field,"purchase.purchase,payment_term",0,Payment Term,Условие за плащане,0
+field,"purchase.purchase,purchase_date",0,Purchase Date,Дата на покупка,0
+field,"purchase.purchase,rec_name",0,Name,Име,0
+field,"purchase.purchase,reference",0,Reference,Отпратка,0
+field,"purchase.purchase,shipment_done",0,Shipment Done,Направена пратка,0
+field,"purchase.purchase,shipment_exception",0,Shipments Exception,Грешка при пратка,0
+field,"purchase.purchase,shipment_state",0,Shipment State,Състояние на пратка,0
+field,"purchase.purchase,shipments",0,Shipments,Изпращания,0
+field,"purchase.purchase,state",0,State,Състояние,0
+field,"purchase.purchase,supplier_reference",0,Supplier Reference,Отпратка към доставчик,0
+field,"purchase.purchase,tax_amount",0,Tax,Данък,0
+field,"purchase.purchase,total_amount",0,Total,Общо,0
+field,"purchase.purchase,untaxed_amount",0,Untaxed,Необложен с данък,0
+field,"purchase.purchase,warehouse",0,Warehouse,Склад,0
+field,"purchase.purchase-account.invoice,invoice",0,Invoice,Фактура,0
+field,"purchase.purchase-account.invoice,purchase",0,Purchase,Покупка,0
+field,"purchase.purchase-account.invoice,rec_name",0,Name,Име,0
+field,"purchase.purchase-ignored-account.invoice,invoice",0,Invoice,Фактура,0
+field,"purchase.purchase-ignored-account.invoice,purchase",0,Purchase,Покупка,0
+field,"purchase.purchase-ignored-account.invoice,rec_name",0,Name,Име,0
+field,"purchase.purchase-recreated-account.invoice,invoice",0,Invoice,Фактура,0
+field,"purchase.purchase-recreated-account.invoice,purchase",0,Purchase,Покупка,0
+field,"purchase.purchase-recreated-account.invoice,rec_name",0,Name,Име,0
+field,"stock.move,purchase",0,Purchase,Покупка,0
+field,"stock.move,purchase_currency",0,Purchase Currency,Валута на покупка,0
+field,"stock.move,purchase_exception_state",0,Exception State,Състояние на грешка,0
+field,"stock.move,purchase_line",0,Purchase Line,Ред от покупка,0
+field,"stock.move,purchase_quantity",0,Purchase Quantity,Количество на покупка,0
+field,"stock.move,purchase_unit",0,Purchase Unit,Единица на покупка,0
+field,"stock.move,purchase_unit_digits",0,Purchase Unit Digits,Десетични единици на покупка,0
+field,"stock.move,purchase_unit_price",0,Purchase Unit Price,Единична цена при покупка,0
+field,"stock.move,purchase_visible",0,Purchase Visible,Покупката е видима,0
+field,"stock.move,supplier",0,Supplier,Доставчик,0
+help,"purchase.handle.invoice.exception.ask,recreate_invoices",0,The selected invoices will be recreated. The other ones will be ignored.,Избраните фактури ще бъдат наново създадени. Останалите ще бъдат игнорирани.,0
+help,"purchase.handle.shipment.exception.ask,recreate_moves",0,The selected moves will be recreated. The other ones will be ignored.,"Избраните движение ще бъдат наново създадени, Останалите ще бъдат игнорирани.",0
+help,"purchase.product_supplier,delivery_time",0,In number of days,В брой дни,0
+help,"purchase.product_supplier.price,quantity",0,Minimal quantity,Минимално количество,0
+model,"ir.action,name",act_invoice_form,Invoices,Фактури,0
+model,"ir.action,name",act_open_supplier,Parties associated to Purchases,Партньори свързани с покупки,0
+model,"ir.action,name",act_purchase_configuration_form,Purchase Configuration,Конфигуриране на покупка,0
+model,"ir.action,name",act_purchase_form,Purchases,Покупки,0
+model,"ir.action,name",act_purchase_form2,Purchases,Покупки,0
+model,"ir.action,name",act_purchase_form_confirmed,Confirmed Purchases,Потвърдена покупка,0
+model,"ir.action,name",act_purchase_form_draft,Draft Purchases,Проект на покупки,0
+model,"ir.action,name",act_purchase_form_new,New Purchase,Нова покупка,0
+model,"ir.action,name",act_purchase_form_quotation,Purchases in Quotation,Покупки в запитване,0
+model,"ir.action,name",act_shipment_form,Shipments,Изпращания,0
+model,"ir.action,name",report_purchase,Purchase,Покупка,0
+model,"ir.action,name",wizard_invoice_handle_exception,Handle Invoice Exception,Обработка на грешка към фактура,0
+model,"ir.action,name",wizard_shipment_handle_exception,Handle Shipment Exception,Обработка на грешка при изпращане,0
+model,"ir.sequence,name",sequence_purchase,Purchase,Покупка,0
+model,"ir.sequence.type,name",sequence_type_purchase,Purchase,Покупка,0
+model,"ir.ui.menu,name",menu_configuration,Configuration,Конфигурация,0
+model,"ir.ui.menu,name",menu_purchase,Purchase Management,Управление на покупки,0
+model,"ir.ui.menu,name",menu_purchase_configuration,Purchase Configuration,Конфигуриране на покупка,0
+model,"ir.ui.menu,name",menu_purchase_form,Purchases,Покупки,0
+model,"ir.ui.menu,name",menu_purchase_form_confirmed,Confirmed Purchases,Потвърдена покупка,0
+model,"ir.ui.menu,name",menu_purchase_form_draft,Draft Purchases,Проект на покупки,0
+model,"ir.ui.menu,name",menu_purchase_form_new,New Purchase,Нова покупка,0
+model,"ir.ui.menu,name",menu_purchase_form_quotation,Purchases in Quotation,Покупки в запитване,0
+model,"ir.ui.menu,name",menu_reporting,Reporting,Справки,0
+model,"ir.ui.menu,name",menu_supplier,Parties associated to Purchases,Партньори свързани с покупки,0
+model,"purchase.configuration,name",0,Purchase Configuration,Конфигуриране на покупка,0
+model,"purchase.handle.invoice.exception.ask,name",0,Invoice Exception Ask,Запитване за грешка в фактура,0
+model,"purchase.handle.shipment.exception.ask,name",0,Shipment Exception Ask,Запитване за грешка при пратка,0
+model,"purchase.line,name",0,Purchase Line,Ред от покупка,0
+model,"purchase.line-account.invoice.line,name",0,Purchase Line - Invoice Line,Ред от покупка - Ред от фактура,0
+model,"purchase.line-account.tax,name",0,Purchase Line - Tax,Ред от покупка - Данък,0
+model,"purchase.line-ignored-stock.move,name",0,Purchase Line - Ignored Move,Ред от покупка - Игнорирано движение,0
+model,"purchase.line-recreated-stock.move,name",0,Purchase Line - Ignored Move,Ред от покупка - Игнорирано движение,0
+model,"purchase.product_supplier,name",0,Product Supplier,Доставчик на продукт,0
+model,"purchase.product_supplier.price,name",0,Product Supplier Price,Цена на доставчик на продукт,0
+model,"purchase.purchase,name",0,Purchase,Покупка,0
+model,"purchase.purchase-account.invoice,name",0,Purchase - Invoice,Покупка - Фактура,0
+model,"purchase.purchase-ignored-account.invoice,name",0,Purchase - Ignored Invoice,Покупка - Игнорирана фактура,0
+model,"purchase.purchase-recreated-account.invoice,name",0,Purchase - Recreated Invoice,Покупка - Наново създаване на фактури,0
+model,"res.group,name",group_purchase,Purchase,Покупка,0
+model,"res.group,name",group_purchase_admin,Purchase Administrator,Отгоровник за покупки,0
+model,"workflow,name",purchase_workflow,Purchase workflow,Работен процес на покупка,0
+model,"workflow.activity,name",purchase_activity_cancel,Canceled,Отказан,0
+model,"workflow.activity,name",purchase_activity_confirmed,Confirmed,Потвърден,0
+model,"workflow.activity,name",purchase_activity_done,Done,Приключен,0
+model,"workflow.activity,name",purchase_activity_draft,Draft,Проект,0
+model,"workflow.activity,name",purchase_activity_invoice_done,Invoice Done,Направени фактури,0
+model,"workflow.activity,name",purchase_activity_invoice_method,Invoice Method,Начин на фактуриране,0
+model,"workflow.activity,name",purchase_activity_invoice_method_done,Invoice Method Done,Направен начин на фактуриране,0
+model,"workflow.activity,name",purchase_activity_invoice_purchase_exception,Invoice Exception,Грешка при фактура,0
+model,"workflow.activity,name",purchase_activity_invoice_shipment,Invoice Shipment,Фактуриране на пратка,0
+model,"workflow.activity,name",purchase_activity_invoice_shipment_done,Invoice Shipment Done,Направено фактуриране на пратка,0
+model,"workflow.activity,name",purchase_activity_invoice_shipment_exception,Invoice Shipment Exception,Грешка при фактуриране на пратка,0
+model,"workflow.activity,name",purchase_activity_invoice_shipment_method,Invoice Shipment Method,Начин на фактуриране на изпращане,0
+model,"workflow.activity,name",purchase_activity_invoice_shipment_method_done,Invoice Shipment Method Done,Направено фактуриране на начина на изпращане,0
+model,"workflow.activity,name",purchase_activity_quotation,Quotation,Запитване,0
+model,"workflow.activity,name",purchase_activity_shipment_exception,Shipment Exception,Грешка при пратка,0
+model,"workflow.activity,name",purchase_activity_waiting_invoice_purchase,Waiting Invoice,Очакващи фактура,0
+model,"workflow.activity,name",purchase_activity_waiting_invoice_shipment,Waiting Invoice Shipment,Изчакващи фактури за пратки,0
+model,"workflow.activity,name",purchase_activity_waiting_shipment,Waiting Shipment,Очаква изпращане,0
+odt,purchase.purchase,0,Amount,Сума,0
+odt,purchase.purchase,0,Date:,Дата:,0
+odt,purchase.purchase,0,Description,Описание,0
+odt,purchase.purchase,0,Description:,Описание:,0
+odt,purchase.purchase,0,Draft Purchase Order,Проект на поръчка за покупка,0
+odt,purchase.purchase,0,E-Mail:,E-Mail:,0
+odt,purchase.purchase,0,Phone:,Телефон:,0
+odt,purchase.purchase,0,Purchase Order N°:,Поръчка за покупка N°:,0
+odt,purchase.purchase,0,Quantity,Количество,0
+odt,purchase.purchase,0,Request for Quotation N°:,Заявки за запитване N°:,0
+odt,purchase.purchase,0,Taxes,Данъци,0
+odt,purchase.purchase,0,Taxes:,Данъци:,0
+odt,purchase.purchase,0,Total (excl. taxes):,Общо (без данъци):,0
+odt,purchase.purchase,0,Total:,Общо:,0
+odt,purchase.purchase,0,Unit Price,Единична цена,0
+odt,purchase.purchase,0,VAT:,ДДС:,0
+selection,"account.invoice,purchase_exception_state",0,,,0
+selection,"account.invoice,purchase_exception_state",0,Ignored,Игнорирано,0
+selection,"account.invoice,purchase_exception_state",0,Recreated,Създаден наново,0
+selection,"purchase.configuration,purchase_invoice_method",0,Based On Order,Въз основа на поръчка,0
+selection,"purchase.configuration,purchase_invoice_method",0,Based On Shipment,Въз основа на изпращане,0
+selection,"purchase.configuration,purchase_invoice_method",0,Manual,Ръчно,0
+selection,"purchase.line,type",0,Comment,Коментар,0
+selection,"purchase.line,type",0,Line,Ред,0
+selection,"purchase.line,type",0,Subtotal,Междинна сума,0
+selection,"purchase.line,type",0,Title,Заглавие,0
+selection,"purchase.purchase,invoice_method",0,Based On Order,Въз основа на поръчка,0
+selection,"purchase.purchase,invoice_method",0,Based On Shipment,Въз основа на изпращане,0
+selection,"purchase.purchase,invoice_method",0,Manual,Ръчно,0
+selection,"purchase.purchase,invoice_state",0,Exception,Грешка,0
+selection,"purchase.purchase,invoice_state",0,None,Няма,0
+selection,"purchase.purchase,invoice_state",0,Paid,Платен,0
+selection,"purchase.purchase,invoice_state",0,Waiting,Изчакващ,0
+selection,"purchase.purchase,shipment_state",0,Exception,Грешка,0
+selection,"purchase.purchase,shipment_state",0,None,Няма,0
+selection,"purchase.purchase,shipment_state",0,Received,Получен,0
+selection,"purchase.purchase,shipment_state",0,Waiting,Изчакващ,0
+selection,"purchase.purchase,state",0,Canceled,Отказан,0
+selection,"purchase.purchase,state",0,Confirmed,Потвърден,0
+selection,"purchase.purchase,state",0,Done,Приключен,0
+selection,"purchase.purchase,state",0,Draft,Проект,0
+selection,"purchase.purchase,state",0,Quotation,Запитване,0
+selection,"stock.move,purchase_exception_state",0,,,0
+selection,"stock.move,purchase_exception_state",0,Ignored,Игнорирано,0
+selection,"stock.move,purchase_exception_state",0,Recreated,Създаден наново,0
+view,product.template,0,Product Suppliers,Доставчици на продукт,0
+view,product.template,0,Suppliers,Доставчици,0
+view,purchase.configuration,0,Purchase Configuration,Конфигуриране на покупка,0
+view,purchase.handle.invoice.exception.ask,0,Choose invoices to recreate,Избор на фактури за ново създаване,0
+view,purchase.handle.invoice.exception.ask,0,Handle Invoice Exception,Обработка на грешка към фактура,0
+view,purchase.handle.shipment.exception.ask,0,Choose moves to recreate,Избор на движения за ново създаване,0
+view,purchase.handle.shipment.exception.ask,0,Handle shipment Exception,Обработване на грешка при изпращане,0
+view,purchase.handle.shipment.exception.ask,0,Recreated Moves,Наново създаване на движения,0
+view,purchase.line,0,General,Основен,0
+view,purchase.line,0,Notes,Бележки,0
+view,purchase.line,0,Products,Продукти,0
+view,purchase.line,0,Purchase Line,Ред от покупка,0
+view,purchase.line,0,Purchase Lines,Редове от покупка,0
+view,purchase.product_supplier,0,Product Supplier,Доставчик на продукт,0
+view,purchase.product_supplier,0,Product Suppliers,Доставчици на продукт,0
+view,purchase.product_supplier.price,0,Product Supplier Price,Цена на доставчик на продукт,0
+view,purchase.product_supplier.price,0,Product Supplier Prices,Цена на доставчик на продукт,0
+view,purchase.purchase,0,Cancel,Отказ,0
+view,purchase.purchase,0,Confirm,Потвърждаване,0
+view,purchase.purchase,0,Draft,Проект,0
+view,purchase.purchase,0,Handle Invoice Exception,Обработка на грешка към фактура,0
+view,purchase.purchase,0,Handle Shipment Exception,Обработване на грешка при изпращане,0
+view,purchase.purchase,0,Invoices,Фактури,0
+view,purchase.purchase,0,Lines,Редове,0
+view,purchase.purchase,0,Moves,Движения,0
+view,purchase.purchase,0,Other Info,Друга информация,0
+view,purchase.purchase,0,Purchase,Покупка,0
+view,purchase.purchase,0,Purchases,Покупки,0
+view,purchase.purchase,0,Quotation,Запитване,0
+view,purchase.purchase,0,Shipments,Изпращане,0
+wizard_button,"purchase.handle.invoice.exception,init,end",0,Cancel,Отказ,0
+wizard_button,"purchase.handle.invoice.exception,init,ok",0,Ok,Добре,0
+wizard_button,"purchase.handle.shipment.exception,init,end",0,Cancel,Отказ,0
+wizard_button,"purchase.handle.shipment.exception,init,ok",0,Ok,Добре,0
diff --git a/configuration.py b/configuration.py
index 7c49444..2cd82ad 100644
--- a/configuration.py
+++ b/configuration.py
@@ -1,7 +1,7 @@
 #This file is part of Tryton.  The COPYRIGHT file at the top level of
 #this repository contains the full copyright notices and license terms.
 from trytond.model import ModelView, ModelSQL, ModelSingleton, fields
-from trytond.pyson import Eval
+from trytond.pyson import Eval, Bool
 
 
 class Configuration(ModelSingleton, ModelSQL, ModelView):
@@ -14,5 +14,12 @@ class Configuration(ModelSingleton, ModelSQL, ModelView):
             ('company', 'in', [Eval('company'), False]),
             ('code', '=', 'purchase.purchase'),
         ], required=True))
+    purchase_invoice_method = fields.Property(fields.Selection([
+        ('manual', 'Manual'),
+        ('order', 'Based On Order'),
+        ('shipment', 'Based On Shipment'),
+    ], 'Invoice Method', states={
+        'required': Bool(Eval('company')),
+    }))
 
 Configuration()
diff --git a/configuration.xml b/configuration.xml
index 91c7ed6..dc837cd 100644
--- a/configuration.xml
+++ b/configuration.xml
@@ -11,6 +11,8 @@ this repository contains the full copyright notices and license terms. -->
                 <form string="Purchase Configuration">
                     <label name="purchase_sequence"/>
                     <field name="purchase_sequence"/>
+                    <label name="purchase_invoice_method" />
+                    <field name="purchase_invoice_method" />
                 </form>
                 ]]>
             </field>
@@ -18,7 +20,6 @@ this repository contains the full copyright notices and license terms. -->
         <record model="ir.action.act_window" id="act_purchase_configuration_form">
             <field name="name">Purchase Configuration</field>
             <field name="res_model">purchase.configuration</field>
-            <field name="view_type">form</field>
         </record>
         <record model="ir.action.act_window.view"
             id="act_purchase_configuration_view1">
@@ -36,5 +37,12 @@ this repository contains the full copyright notices and license terms. -->
                 search="[('model.model', '=', 'purchase.configuration'), ('name', '=', 'purchase_sequence')]"/>
             <field name="value" eval="'ir.sequence,' + str(ref('sequence_purchase'))"/>
         </record>
+        <record model="ir.property"
+            id="property_purchase_invoice_method">
+            <field name="name">purchase_invoice_method</field>
+            <field name="field"
+               search="[('model.model', '=', 'purchase.configuration'), ('name', '=', 'purchase_invoice_method')]" />
+           <field name="value">,order</field>
+        </record>
     </data>
 </tryton>
diff --git a/de_DE.csv b/de_DE.csv
index 75860a8..d6583b6 100644
--- a/de_DE.csv
+++ b/de_DE.csv
@@ -10,9 +10,12 @@ error,purchase.purchase,0,Invoice addresses must be defined for the quotation.,D
 error,purchase.purchase,0,"It misses an ""Account Payable"" on the party ""%s""!","Es ist kein Verbindlichkeitskonto für Partei ""%s"" definiert!",0
 error,stock.shipment.in,0,You cannot reset to draft a move generated by a purchase.,Eine durch einen Einkauf generierte Bewegung kann nicht auf Entwurf zurückgesetzt werden.,0
 field,"account.invoice,purchase_exception_state",0,Exception State,Status Vorbehalt,0
+field,"account.invoice,purchases",0,Purchases,Einkäufe,0
+field,"account.invoice.line,purchase_lines",0,Purchase Lines,Positionen Einkauf,0
 field,"product.template,product_suppliers",0,Suppliers,Lieferanten,0
 field,"product.template,purchasable",0,Purchasable,Käuflich,0
 field,"product.template,purchase_uom",0,Purchase UOM,Einheit Einkauf,0
+field,"purchase.configuration,purchase_invoice_method",0,Invoice Method,Rechnungsstellung,0
 field,"purchase.configuration,purchase_sequence",0,Purchase Reference Sequence,Nummernkreis Einkauf,0
 field,"purchase.configuration,rec_name",0,Name,Name,0
 field,"purchase.handle.invoice.exception.ask,domain_invoices",0,Domain Invoices,Wertebereich Rechnungen (Domain),0
@@ -122,10 +125,10 @@ model,"ir.action,name",act_open_supplier,Parties associated to Purchases,Parteie
 model,"ir.action,name",act_purchase_configuration_form,Purchase Configuration,Einstellungen Einkauf,0
 model,"ir.action,name",act_purchase_form,Purchases,Einkäufe,0
 model,"ir.action,name",act_purchase_form2,Purchases,Einkäufe,0
-model,"ir.action,name",act_purchase_form_confirmed,Confirmed Purchases,Aufträge (Einkäufe),0
-model,"ir.action,name",act_purchase_form_draft,Draft Purchases,Entwürfe (Einkäufe),0
+model,"ir.action,name",act_purchase_form_confirmed,Confirmed Purchases,Aufträge Einkäufe,0
+model,"ir.action,name",act_purchase_form_draft,Draft Purchases,Entwürfe Einkäufe,0
 model,"ir.action,name",act_purchase_form_new,New Purchase,Neuer Einkauf,0
-model,"ir.action,name",act_purchase_form_quotation,Purchases in Quotation,Angebote (Einkäufe),0
+model,"ir.action,name",act_purchase_form_quotation,Purchases in Quotation,Angebote Einkäufe,0
 model,"ir.action,name",act_shipment_form,Shipments,Lieferposten,0
 model,"ir.action,name",report_purchase,Purchase,Einkauf,0
 model,"ir.action,name",wizard_invoice_handle_exception,Handle Invoice Exception,Rechnungsvorbehalt bearbeiten,0
@@ -140,7 +143,7 @@ model,"ir.ui.menu,name",menu_purchase_form_confirmed,Confirmed Purchases,Aufträ
 model,"ir.ui.menu,name",menu_purchase_form_draft,Draft Purchases,Entwürfe (Einkäufe),0
 model,"ir.ui.menu,name",menu_purchase_form_new,New Purchase,Neuer Einkauf,0
 model,"ir.ui.menu,name",menu_purchase_form_quotation,Purchases in Quotation,Angebote (Einkäufe),0
-model,"ir.ui.menu,name",menu_reporting,Reporting,Berichte,0
+model,"ir.ui.menu,name",menu_reporting,Reporting,Auswertungen,0
 model,"ir.ui.menu,name",menu_supplier,Parties associated to Purchases,Parteien: Einkäufen zugeordnet,0
 model,"purchase.configuration,name",0,Purchase Configuration,Einstellungen Einkauf,0
 model,"purchase.handle.invoice.exception.ask,name",0,Invoice Exception Ask,Nachfrage Rechnungsvorbehalt,0
@@ -174,9 +177,9 @@ model,"workflow.activity,name",purchase_activity_invoice_shipment_method,Invoice
 model,"workflow.activity,name",purchase_activity_invoice_shipment_method_done,Invoice Shipment Method Done,Rechnung Liefermethode erledigt,0
 model,"workflow.activity,name",purchase_activity_quotation,Quotation,Angebot,0
 model,"workflow.activity,name",purchase_activity_shipment_exception,Shipment Exception,Lieferposten Vorbehalt,0
-model,"workflow.activity,name",purchase_activity_waiting_invoice_purchase,Waiting Invoice,Rechnung wartend,0
+model,"workflow.activity,name",purchase_activity_waiting_invoice_purchase,Waiting Invoice,Rechnung Wartend,0
 model,"workflow.activity,name",purchase_activity_waiting_invoice_shipment,Waiting Invoice Shipment,Rechnung Lieferposten Wartend,0
-model,"workflow.activity,name",purchase_activity_waiting_shipment,Waiting Shipment,Lieferposten wartend,0
+model,"workflow.activity,name",purchase_activity_waiting_shipment,Waiting Shipment,Lieferposten Wartend,0
 odt,purchase.purchase,0,Amount,Betrag,0
 odt,purchase.purchase,0,Date:,Datum:,0
 odt,purchase.purchase,0,Description,Bezeichnung,0
@@ -197,11 +200,14 @@ odt,purchase.purchase,0,VAT:,USt.:,0
 selection,"account.invoice,purchase_exception_state",0,,,0
 selection,"account.invoice,purchase_exception_state",0,Ignored,Ignoriert,0
 selection,"account.invoice,purchase_exception_state",0,Recreated,Nachgebildet,0
+selection,"purchase.configuration,purchase_invoice_method",0,Based On Order,Bei Beauftragung,0
+selection,"purchase.configuration,purchase_invoice_method",0,Based On Shipment,Bei Lieferung,0
+selection,"purchase.configuration,purchase_invoice_method",0,Manual,Manuell,0
 selection,"purchase.line,type",0,Comment,Kommentar,0
 selection,"purchase.line,type",0,Line,Position,0
 selection,"purchase.line,type",0,Subtotal,Zwischensumme,0
 selection,"purchase.line,type",0,Title,Überschrift,0
-selection,"purchase.purchase,invoice_method",0,Based On Order,Nach Auftrag,0
+selection,"purchase.purchase,invoice_method",0,Based On Order,Bei Beauftragung,0
 selection,"purchase.purchase,invoice_method",0,Based On Shipment,Bei Lieferung,0
 selection,"purchase.purchase,invoice_method",0,Manual,Manuell,0
 selection,"purchase.purchase,invoice_state",0,Exception,Vorbehalt,0
diff --git a/fr_FR.csv b/fr_FR.csv
index f90998e..1bf86b6 100644
--- a/fr_FR.csv
+++ b/fr_FR.csv
@@ -9,9 +9,12 @@ error,purchase.purchase,0,Invoice addresses must be defined for the quotation.,L
 error,purchase.purchase,0,"It misses an ""Account Payable"" on the party ""%s""!","Il manque un compte à payer sur le tiers ""%s"" !",0
 error,stock.shipment.in,0,You cannot reset to draft a move generated by a purchase.,Vous ne pouvez pas réinitialiser un mouvement généré par un achat.,0
 field,"account.invoice,purchase_exception_state",0,Exception State,État d'exception,0
+field,"account.invoice,purchases",0,Purchases,Achats,1
+field,"account.invoice.line,purchase_lines",0,Purchase Lines,Lignes d'achat,1
 field,"product.template,product_suppliers",0,Suppliers,Fournisseurs,0
 field,"product.template,purchasable",0,Purchasable,Achetable,0
 field,"product.template,purchase_uom",0,Purchase UOM,UDM à l'achat,0
+field,"purchase.configuration,purchase_invoice_method",0,Invoice Method,Méthode de facturation,1
 field,"purchase.configuration,purchase_sequence",0,Purchase Reference Sequence,Séquence de référence d'achat,0
 field,"purchase.configuration,rec_name",0,Name,Nom,0
 field,"purchase.handle.invoice.exception.ask,domain_invoices",0,Domain Invoices,Domaine des factures,0
@@ -196,6 +199,9 @@ odt,purchase.purchase,0,VAT:,TVA:,0
 selection,"account.invoice,purchase_exception_state",0,,,0
 selection,"account.invoice,purchase_exception_state",0,Ignored,Ignoré,0
 selection,"account.invoice,purchase_exception_state",0,Recreated,Recréé,0
+selection,"purchase.configuration,purchase_invoice_method",0,Based On Order,À la commande,1
+selection,"purchase.configuration,purchase_invoice_method",0,Based On Shipment,À la livraison,1
+selection,"purchase.configuration,purchase_invoice_method",0,Manual,Manuel,1
 selection,"purchase.line,type",0,Comment,Commentaire,0
 selection,"purchase.line,type",0,Line,Ligne,0
 selection,"purchase.line,type",0,Subtotal,Sous-total,0
diff --git a/invoice.py b/invoice.py
new file mode 100644
index 0000000..07e14b8
--- /dev/null
+++ b/invoice.py
@@ -0,0 +1,21 @@
+#This file is part of Tryton.  The COPYRIGHT file at the top level of
+#this repository contains the full copyright notices and license terms.
+from trytond.model import ModelView, ModelSQL, fields
+
+
+class Invoice(ModelSQL, ModelView):
+    _name = 'account.invoice'
+
+    purchases = fields.Many2Many('purchase.purchase-account.invoice',
+            'invoice', 'purchase', 'Purchases', readonly=True)
+
+Invoice()
+
+
+class InvoiceLine(ModelSQL, ModelView):
+    _name = 'account.invoice.line'
+
+    purchase_lines = fields.Many2Many('purchase.line-account.invoice.line',
+            'invoice_line', 'purchase_line', 'Purchase Lines', readonly=True)
+
+InvoiceLine()
diff --git a/party.xml b/party.xml
index aee5623..432c019 100644
--- a/party.xml
+++ b/party.xml
@@ -6,7 +6,6 @@ this repository contains the full copyright notices and license terms. -->
         <record model="ir.action.act_window" id="act_purchase_form2">
             <field name="name">Purchases</field>
             <field name="res_model">purchase.purchase</field>
-            <field name="view_type">form</field>
             <field name="domain">[("party", "=", Eval('active_id'))]</field>
         </record>
         <record model="ir.action.keyword"
diff --git a/purchase.py b/purchase.py
index ff1b605..6a5eff1 100644
--- a/purchase.py
+++ b/purchase.py
@@ -187,7 +187,9 @@ class Purchase(ModelWorkflow, ModelSQL, ModelView):
         return 2
 
     def default_invoice_method(self):
-        return 'order'
+        configuration_obj = self.pool.get('purchase.configuration')
+        configuration = configuration_obj.browse(1)
+        return configuration.purchase_invoice_method
 
     def default_invoice_state(self):
         return 'none'
@@ -958,6 +960,8 @@ class PurchaseLine(ModelSQL, ModelView):
             context2['uom'] = vals['unit']
         else:
             context2['uom'] = product.purchase_uom.id
+        if vals.get('_parent_purchase.purchase_date'):
+            context2['purchase_date'] = vals['_parent_purchase.purchase_date']
         with Transaction().set_context(context2):
             res['unit_price'] = product_obj.get_purchase_price([product.id],
                     vals.get('quantity', 0))[product.id]
@@ -1008,6 +1012,8 @@ class PurchaseLine(ModelSQL, ModelView):
             context['currency'] = vals['_parent_purchase.currency']
         if vals.get('_parent_purchase.party'):
             context['supplier'] = vals['_parent_purchase.party']
+        if vals.get('_parent_purchase.purchase_date'):
+            context['purchase_date'] = vals['_parent_purchase.purchase_date']
         if vals.get('unit'):
             context['uom'] = vals['unit']
         with Transaction().set_context(context):
@@ -1022,11 +1028,10 @@ class PurchaseLine(ModelSQL, ModelView):
     def on_change_with_amount(self, vals):
         currency_obj = self.pool.get('currency.currency')
         if vals.get('type') == 'line':
-            if isinstance(vals.get('_parent_purchase.currency'), (int, long)):
+            currency = vals.get('_parent_purchase.currency')
+            if currency and isinstance(currency, (int, long)):
                 currency = currency_obj.browse(
                         vals['_parent_purchase.currency'])
-            else:
-                currency = vals['_parent_purchase.currency']
             amount = Decimal(str(vals.get('quantity') or '0.0')) * \
                     (vals.get('unit_price') or Decimal('0.0'))
             if currency:
@@ -1345,7 +1350,9 @@ class Product(ModelSQL, ModelView):
         uom_obj = self.pool.get('product.uom')
         user_obj = self.pool.get('res.user')
         currency_obj = self.pool.get('currency.currency')
+        date_obj = self.pool.get('ir.date')
 
+        today = date_obj.today()
         res = {}
 
         uom = None
@@ -1377,8 +1384,11 @@ class Product(ModelSQL, ModelView):
                     res[product.id], uom)
             if currency and user.company:
                 if user.company.currency.id != currency.id:
-                    res[product.id] = currency_obj.compute(
-                            user.company.currency, res[product.id], currency)
+                    date = Transaction().context.get('purchase_date') or today
+                    with Transaction().set_context(date=date):
+                        res[product.id] = currency_obj.compute(
+                            user.company.currency.id, res[product.id],
+                            currency.id)
         return res
 
 Product()
diff --git a/purchase.xml b/purchase.xml
index 30de1e6..6bd4795 100644
--- a/purchase.xml
+++ b/purchase.xml
@@ -198,7 +198,6 @@ this repository contains the full copyright notices and license terms. -->
         <record model="ir.action.act_window" id="act_shipment_form">
             <field name="name">Shipments</field>
             <field name="res_model">stock.shipment.in</field>
-            <field name="view_type">form</field>
             <field name="domain">[("id", "in", Eval('shipments'))]</field>
         </record>
         <record model="ir.action.keyword"
@@ -210,7 +209,6 @@ this repository contains the full copyright notices and license terms. -->
         <record model="ir.action.act_window" id="act_invoice_form">
             <field name="name">Invoices</field>
             <field name="res_model">account.invoice</field>
-            <field name="view_type">form</field>
             <field name="domain">[("id", "in", Eval('invoices'))]</field>
             <field name="context">{'type': 'in_invoice'}</field>
         </record>
@@ -259,7 +257,6 @@ this repository contains the full copyright notices and license terms. -->
         <record model="ir.action.act_window" id="act_purchase_form">
             <field name="name">Purchases</field>
             <field name="res_model">purchase.purchase</field>
-            <field name="view_type">form</field>
             <field name="search_value">{'create_date': ['between', Date(delta_years=-1)]}</field>
         </record>
         <record model="ir.action.act_window.view" id="act_purchase_form_view1">
@@ -278,7 +275,6 @@ this repository contains the full copyright notices and license terms. -->
         <record model="ir.action.act_window" id="act_purchase_form_new">
             <field name="name">New Purchase</field>
             <field name="res_model">purchase.purchase</field>
-            <field name="view_type">form</field>
         </record>
         <record model="ir.action.act_window.view" id="act_purchase_form_new_view1">
             <field name="sequence" eval="20"/>
@@ -296,7 +292,6 @@ this repository contains the full copyright notices and license terms. -->
         <record model="ir.action.act_window" id="act_purchase_form_draft">
             <field name="name">Draft Purchases</field>
             <field name="res_model">purchase.purchase</field>
-            <field name="view_type">form</field>
             <field name="domain">[('state', '=', 'draft')]</field>
         </record>
         <record model="ir.action.act_window.view" id="act_purchase_form_draft_view1">
@@ -315,7 +310,6 @@ this repository contains the full copyright notices and license terms. -->
         <record model="ir.action.act_window" id="act_purchase_form_quotation">
             <field name="name">Purchases in Quotation</field>
             <field name="res_model">purchase.purchase</field>
-            <field name="view_type">form</field>
             <field name="domain">[('state', '=', 'quotation')]</field>
         </record>
         <record model="ir.action.act_window.view" id="act_purchase_form_quotation_view1">
@@ -334,7 +328,6 @@ this repository contains the full copyright notices and license terms. -->
         <record model="ir.action.act_window" id="act_purchase_form_confirmed">
             <field name="name">Confirmed Purchases</field>
             <field name="res_model">purchase.purchase</field>
-            <field name="view_type">form</field>
             <field name="domain">[('state', '=', 'confirmed')]</field>
         </record>
         <record model="ir.action.act_window.view" id="act_purchase_form_confirmed_view1">
diff --git a/setup.py b/setup.py
index 40efce4..a9fbe5c 100644
--- a/setup.py
+++ b/setup.py
@@ -44,12 +44,15 @@ setup(name='trytond_purchase',
         'Intended Audience :: Financial and Insurance Industry',
         'Intended Audience :: Legal Industry',
         'License :: OSI Approved :: GNU General Public License (GPL)',
+        'Natural Language :: Bulgarian',
         'Natural Language :: English',
         'Natural Language :: French',
         'Natural Language :: German',
         'Natural Language :: Spanish',
         'Operating System :: OS Independent',
-        'Programming Language :: Python',
+        'Programming Language :: Python :: 2.5',
+        'Programming Language :: Python :: 2.6',
+        'Programming Language :: Python :: 2.7',
         'Topic :: Office/Business',
         'Topic :: Office/Business :: Financial :: Accounting',
     ],
diff --git a/trytond_purchase.egg-info/PKG-INFO b/trytond_purchase.egg-info/PKG-INFO
index 687f135..790b4b3 100644
--- a/trytond_purchase.egg-info/PKG-INFO
+++ b/trytond_purchase.egg-info/PKG-INFO
@@ -1,6 +1,6 @@
 Metadata-Version: 1.0
 Name: trytond-purchase
-Version: 1.8.1
+Version: 2.0.0
 Summary: Define purchase order.
 Add product supplier and purchase informations.
 Define the purchase price as the supplier price or the cost price.
@@ -16,7 +16,7 @@ Home-page: http://www.tryton.org/
 Author: B2CK
 Author-email: info at b2ck.com
 License: GPL-3
-Download-URL: http://downloads.tryton.org/1.8/
+Download-URL: http://downloads.tryton.org/2.0/
 Description: UNKNOWN
 Platform: UNKNOWN
 Classifier: Development Status :: 5 - Production/Stable
@@ -25,11 +25,14 @@ Classifier: Intended Audience :: Developers
 Classifier: Intended Audience :: Financial and Insurance Industry
 Classifier: Intended Audience :: Legal Industry
 Classifier: License :: OSI Approved :: GNU General Public License (GPL)
+Classifier: Natural Language :: Bulgarian
 Classifier: Natural Language :: English
 Classifier: Natural Language :: French
 Classifier: Natural Language :: German
 Classifier: Natural Language :: Spanish
 Classifier: Operating System :: OS Independent
-Classifier: Programming Language :: Python
+Classifier: Programming Language :: Python :: 2.5
+Classifier: Programming Language :: Python :: 2.6
+Classifier: Programming Language :: Python :: 2.7
 Classifier: Topic :: Office/Business
 Classifier: Topic :: Office/Business :: Financial :: Accounting
diff --git a/trytond_purchase.egg-info/SOURCES.txt b/trytond_purchase.egg-info/SOURCES.txt
index 5b9cd86..90c167e 100644
--- a/trytond_purchase.egg-info/SOURCES.txt
+++ b/trytond_purchase.egg-info/SOURCES.txt
@@ -5,6 +5,7 @@ LICENSE
 MANIFEST.in
 README
 TODO
+bg_BG.csv
 configuration.xml
 de_DE.csv
 es_CO.csv
@@ -17,6 +18,7 @@ setup.py
 ./__init__.py
 ./__tryton__.py
 ./configuration.py
+./invoice.py
 ./purchase.py
 ./tests/__init__.py
 ./tests/test_purchase.py
diff --git a/trytond_purchase.egg-info/requires.txt b/trytond_purchase.egg-info/requires.txt
index df87b5a..7d8b694 100644
--- a/trytond_purchase.egg-info/requires.txt
+++ b/trytond_purchase.egg-info/requires.txt
@@ -1,9 +1,9 @@
-trytond_company >= 1.8, < 1.9
-trytond_party >= 1.8, < 1.9
-trytond_stock >= 1.8, < 1.9
-trytond_account >= 1.8, < 1.9
-trytond_product >= 1.8, < 1.9
-trytond_account_invoice >= 1.8, < 1.9
-trytond_currency >= 1.8, < 1.9
-trytond_account_product >= 1.8, < 1.9
-trytond >= 1.8, < 1.9
\ No newline at end of file
+trytond_company >= 2.0, < 2.1
+trytond_party >= 2.0, < 2.1
+trytond_stock >= 2.0, < 2.1
+trytond_account >= 2.0, < 2.1
+trytond_product >= 2.0, < 2.1
+trytond_account_invoice >= 2.0, < 2.1
+trytond_currency >= 2.0, < 2.1
+trytond_account_product >= 2.0, < 2.1
+trytond >= 2.0, < 2.1
\ No newline at end of file
commit cee4f23774b36d2bff0332049deecd60f89d64b0
Author: Mathias Behrle <mathiasb at m9s.biz>
Date:   Tue Feb 15 11:46:24 2011 +0100

    Adding upstream version 1.8.1.

diff --git a/CHANGELOG b/CHANGELOG
index dca930e..2d479a6 100644
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -1,3 +1,6 @@
+Version 1.8.1 - 2011-02-13
+* Bug fixes (see mercurial logs for details)
+
 Version 1.8.0 - 2010-11-01
 * Bug fixes (see mercurial logs for details)
 
diff --git a/COPYRIGHT b/COPYRIGHT
index 94a43fb..97eff54 100644
--- a/COPYRIGHT
+++ b/COPYRIGHT
@@ -1,7 +1,7 @@
 Copyright (C) 2004-2008 Tiny SPRL.
-Copyright (C) 2008-2010 Cédric Krier.
-Copyright (C) 2008-2010 Bertrand Chenal.
-Copyright (C) 2008-2010 B2CK SPRL.
+Copyright (C) 2008-2011 Cédric Krier.
+Copyright (C) 2008-2011 Bertrand Chenal.
+Copyright (C) 2008-2011 B2CK SPRL.
 
 This program is free software: you can redistribute it and/or modify
 it under the terms of the GNU General Public License as published by
diff --git a/PKG-INFO b/PKG-INFO
index 188562d..ad5df9b 100644
--- a/PKG-INFO
+++ b/PKG-INFO
@@ -1,6 +1,6 @@
 Metadata-Version: 1.0
 Name: trytond_purchase
-Version: 1.8.0
+Version: 1.8.1
 Summary: Define purchase order.
 Add product supplier and purchase informations.
 Define the purchase price as the supplier price or the cost price.
diff --git a/__tryton__.py b/__tryton__.py
index 45f8593..20b9af5 100644
--- a/__tryton__.py
+++ b/__tryton__.py
@@ -6,7 +6,7 @@
     'name_es_CO': 'Compras',
     'name_es_ES': 'Compras',
     'name_fr_FR': 'Achat',
-    'version': '1.8.0',
+    'version': '1.8.1',
     'author': 'B2CK',
     'email': 'info at b2ck.com',
     'website': 'http://www.tryton.org/',
diff --git a/purchase.py b/purchase.py
index e65096b..ff1b605 100644
--- a/purchase.py
+++ b/purchase.py
@@ -1088,8 +1088,9 @@ class PurchaseLine(ModelSQL, ModelView):
         else:
             ignored_ids = ()
         for invoice_line in line.invoice_lines:
-            if invoice_line.invoice.state != 'cancel' or \
-                    invoice_line.id in ignored_ids:
+            if ((invoice_line.invoice and
+                    invoice_line.invoice.state != 'cancel') or
+                invoice_line.id in ignored_ids):
                 quantity -= uom_obj.compute_qty(invoice_line.unit,
                         invoice_line.quantity, line.unit)
         res['quantity'] = quantity
diff --git a/trytond_purchase.egg-info/PKG-INFO b/trytond_purchase.egg-info/PKG-INFO
index b9ec68b..687f135 100644
--- a/trytond_purchase.egg-info/PKG-INFO
+++ b/trytond_purchase.egg-info/PKG-INFO
@@ -1,6 +1,6 @@
 Metadata-Version: 1.0
 Name: trytond-purchase
-Version: 1.8.0
+Version: 1.8.1
 Summary: Define purchase order.
 Add product supplier and purchase informations.
 Define the purchase price as the supplier price or the cost price.
commit 5b8c57424691e2a5ae41fb1457cda669f668e0a5
Author: Daniel Baumann <daniel at debian.org>
Date:   Thu Nov 4 20:12:30 2010 +0100

    Adding upstream version 1.8.0.

diff --git a/CHANGELOG b/CHANGELOG
index 62723b3..dca930e 100644
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -1,3 +1,6 @@
+Version 1.8.0 - 2010-11-01
+* Bug fixes (see mercurial logs for details)
+
 Version 1.6.0 - 2010-05-13
 * Bug fixes (see mercurial logs for details)
 * Use model singleton to define which purchase sequence to use
diff --git a/INSTALL b/INSTALL
index ac9529c..762cf21 100644
--- a/INSTALL
+++ b/INSTALL
@@ -4,7 +4,7 @@ Installing trytond_purchase
 Prerequisites
 -------------
 
- * Python 2.4 or later (http://www.python.org/)
+ * Python 2.5 or later (http://www.python.org/)
  * trytond (http://www.tryton.org/)
  * trytond_company (http://www.tryton.org/)
  * trytond_party (http://www.tryton.org/)
diff --git a/PKG-INFO b/PKG-INFO
index 157ee5a..188562d 100644
--- a/PKG-INFO
+++ b/PKG-INFO
@@ -1,6 +1,6 @@
 Metadata-Version: 1.0
 Name: trytond_purchase
-Version: 1.6.0
+Version: 1.8.0
 Summary: Define purchase order.
 Add product supplier and purchase informations.
 Define the purchase price as the supplier price or the cost price.
@@ -16,7 +16,7 @@ Home-page: http://www.tryton.org/
 Author: B2CK
 Author-email: info at b2ck.com
 License: GPL-3
-Download-URL: http://downloads.tryton.org/1.6/
+Download-URL: http://downloads.tryton.org/1.8/
 Description: UNKNOWN
 Platform: UNKNOWN
 Classifier: Development Status :: 5 - Production/Stable
diff --git a/__tryton__.py b/__tryton__.py
index 4dacfb9..45f8593 100644
--- a/__tryton__.py
+++ b/__tryton__.py
@@ -6,7 +6,7 @@
     'name_es_CO': 'Compras',
     'name_es_ES': 'Compras',
     'name_fr_FR': 'Achat',
-    'version': '1.6.0',
+    'version': '1.8.0',
     'author': 'B2CK',
     'email': 'info at b2ck.com',
     'website': 'http://www.tryton.org/',
diff --git a/de_DE.csv b/de_DE.csv
index d6a0739..75860a8 100644
--- a/de_DE.csv
+++ b/de_DE.csv
@@ -3,8 +3,8 @@ error,account.invoice,0,You can not delete invoices that come from a purchase!,D
 error,account.invoice,0,You cannot reset to draft an invoice generated by a purchase.,Eine durch einen Einkauf generierte Bewegung kann nicht auf Entwurf zurückgesetzt werden.,0
 error,product.template,0,"Purchase prices are based on the purchase uom, are you sure to change it?","Einkaufspreise basieren auf der Maßeinheit für den Einkauf.
 Soll sie wirklich geändert werden?",0
-error,purchase.line,0,"It misses an ""account expense"" default property!",Es ist keine Standardeigenschaft für das Aufwandskonto definiert!,0
 error,purchase.line,0,"It misses an ""Account Expense"" on product ""%s""!","Es ist ken Aufwandskonto für Artikel ""%s"" definiert!",0
+error,purchase.line,0,"It misses an ""account expense"" default property!",Es ist keine Standardeigenschaft für das Aufwandskonto definiert!,0
 error,purchase.line,0,The supplier location is required!,Der Lagerort des Lieferanten muss eingegeben werden!,0
 error,purchase.purchase,0,Invoice addresses must be defined for the quotation.,Die Rechnungsadresse muss für ein Angebot angegeben werden.,0
 error,purchase.purchase,0,"It misses an ""Account Payable"" on the party ""%s""!","Es ist kein Verbindlichkeitskonto für Partei ""%s"" definiert!",0
@@ -19,17 +19,8 @@ field,"purchase.handle.invoice.exception.ask,domain_invoices",0,Domain Invoices,
 field,"purchase.handle.invoice.exception.ask,recreate_invoices",0,Recreate Invoices,Rechnungen nachbilden,0
 field,"purchase.handle.shipment.exception.ask,domain_moves",0,Domain Moves,Wertebereich Bewegungen (Domain),0
 field,"purchase.handle.shipment.exception.ask,recreate_moves",0,Recreate Moves,Bewegungen nachbilden,0
-field,"purchase.line-account.invoice.line,invoice_line",0,Invoice Line,Rechnungsposition,0
-field,"purchase.line-account.invoice.line,purchase_line",0,Purchase Line,Position Einkauf,0
-field,"purchase.line-account.invoice.line,rec_name",0,Name,Name,0
-field,"purchase.line-account.tax,line",0,Purchase Line,Position Einkauf,0
-field,"purchase.line-account.tax,rec_name",0,Name,Name,0
-field,"purchase.line-account.tax,tax",0,Tax,Steuer,0
 field,"purchase.line,amount",0,Amount,Betrag,0
 field,"purchase.line,description",0,Description,Bezeichnung,0
-field,"purchase.line-ignored-stock.move,move",0,Move,Bewegung,0
-field,"purchase.line-ignored-stock.move,purchase_line",0,Purchase Line,Position Einkauf,0
-field,"purchase.line-ignored-stock.move,rec_name",0,Name,Name,0
 field,"purchase.line,invoice_lines",0,Invoice Lines,Rechnungspositionen,0
 field,"purchase.line,move_done",0,Moves Done,Bewegungen erledigt,0
 field,"purchase.line,move_exception",0,Moves Exception,Bewegungsvorbehalt,0
@@ -41,47 +32,50 @@ field,"purchase.line,product",0,Product,Artikel,0
 field,"purchase.line,purchase",0,Purchase,Einkauf,0
 field,"purchase.line,quantity",0,Quantity,Anzahl,0
 field,"purchase.line,rec_name",0,Name,Name,0
-field,"purchase.line-recreated-stock.move,move",0,Move,Bewegung,0
-field,"purchase.line-recreated-stock.move,purchase_line",0,Purchase Line,Position Einkauf,0
-field,"purchase.line-recreated-stock.move,rec_name",0,Name,Name,0
 field,"purchase.line,sequence",0,Sequence,Reihenfolge,0
 field,"purchase.line,taxes",0,Taxes,Steuern,0
 field,"purchase.line,type",0,Type,Typ,0
 field,"purchase.line,unit",0,Unit,Einheit,0
 field,"purchase.line,unit_digits",0,Unit Digits,Anzahl Stellen,0
 field,"purchase.line,unit_price",0,Unit Price,Einzelpreis,0
+field,"purchase.line-account.invoice.line,invoice_line",0,Invoice Line,Rechnungsposition,0
+field,"purchase.line-account.invoice.line,purchase_line",0,Purchase Line,Position Einkauf,0
+field,"purchase.line-account.invoice.line,rec_name",0,Name,Name,0
+field,"purchase.line-account.tax,line",0,Purchase Line,Position Einkauf,0
+field,"purchase.line-account.tax,rec_name",0,Name,Name,0
+field,"purchase.line-account.tax,tax",0,Tax,Steuer,0
+field,"purchase.line-ignored-stock.move,move",0,Move,Bewegung,0
+field,"purchase.line-ignored-stock.move,purchase_line",0,Purchase Line,Position Einkauf,0
+field,"purchase.line-ignored-stock.move,rec_name",0,Name,Name,0
+field,"purchase.line-recreated-stock.move,move",0,Move,Bewegung,0
+field,"purchase.line-recreated-stock.move,purchase_line",0,Purchase Line,Position Einkauf,0
+field,"purchase.line-recreated-stock.move,rec_name",0,Name,Name,0
 field,"purchase.product_supplier,code",0,Code,Artikelnummer Lieferant,0
 field,"purchase.product_supplier,company",0,Company,Lieferfirma,0
 field,"purchase.product_supplier,delivery_time",0,Delivery Time,Lieferfrist,0
 field,"purchase.product_supplier,name",0,Name,Name,0
 field,"purchase.product_supplier,party",0,Supplier,Lieferant,0
-field,"purchase.product_supplier.price,product_supplier",0,Supplier,Lieferant,0
-field,"purchase.product_supplier.price,quantity",0,Quantity,Anzahl,0
-field,"purchase.product_supplier.price,rec_name",0,Name,Name,0
 field,"purchase.product_supplier,prices",0,Prices,Preise,0
-field,"purchase.product_supplier.price,unit_price",0,Unit Price,Einzelpreis,0
 field,"purchase.product_supplier,product",0,Product,Artikel,0
 field,"purchase.product_supplier,rec_name",0,Name,Name,0
 field,"purchase.product_supplier,sequence",0,Sequence,Reihenfolge,0
-field,"purchase.purchase-account.invoice,invoice",0,Invoice,Rechnung,0
-field,"purchase.purchase-account.invoice,purchase",0,Purchase,Einkauf,0
-field,"purchase.purchase-account.invoice,rec_name",0,Name,Name,0
+field,"purchase.product_supplier.price,product_supplier",0,Supplier,Lieferant,0
+field,"purchase.product_supplier.price,quantity",0,Quantity,Anzahl,0
+field,"purchase.product_supplier.price,rec_name",0,Name,Name,0
+field,"purchase.product_supplier.price,unit_price",0,Unit Price,Einzelpreis,0
 field,"purchase.purchase,comment",0,Comment,Kommentar,0
 field,"purchase.purchase,company",0,Company,Unternehmen,0
 field,"purchase.purchase,currency",0,Currency,Währung,0
 field,"purchase.purchase,currency_digits",0,Currency Digits,Währung (signifikante Stellen),0
 field,"purchase.purchase,description",0,Description,Beschreibung,0
-field,"purchase.purchase-ignored-account.invoice,invoice",0,Invoice,Rechnung,0
-field,"purchase.purchase-ignored-account.invoice,purchase",0,Purchase,Einkauf,0
-field,"purchase.purchase-ignored-account.invoice,rec_name",0,Name,Name,0
 field,"purchase.purchase,invoice_address",0,Invoice Address,Rechnungsadresse,0
 field,"purchase.purchase,invoice_exception",0,Invoices Exception,Rechnungsvorbehalt,0
 field,"purchase.purchase,invoice_method",0,Invoice Method,Rechnungsstellung,0
 field,"purchase.purchase,invoice_paid",0,Invoices Paid,Bezahlte Rechnungen,0
+field,"purchase.purchase,invoice_state",0,Invoice State,Rechnungsstatus,0
 field,"purchase.purchase,invoices",0,Invoices,Rechnungen,0
 field,"purchase.purchase,invoices_ignored",0,Ignored Invoices,Ignorierte Rechnungen,0
 field,"purchase.purchase,invoices_recreated",0,Recreated Invoices,Nachgebildete Rechnungen,0
-field,"purchase.purchase,invoice_state",0,Invoice State,Rechnungsstatus,0
 field,"purchase.purchase,lines",0,Lines,Positionen,0
 field,"purchase.purchase,moves",0,Moves,Bewegungen,0
 field,"purchase.purchase,party",0,Party,Partei,0
@@ -89,20 +83,26 @@ field,"purchase.purchase,party_lang",0,Party Language,Sprache Partei,0
 field,"purchase.purchase,payment_term",0,Payment Term,Zahlungsbedingung,0
 field,"purchase.purchase,purchase_date",0,Purchase Date,Kaufdatum,0
 field,"purchase.purchase,rec_name",0,Name,Name,0
-field,"purchase.purchase-recreated-account.invoice,invoice",0,Invoice,Rechnung,0
-field,"purchase.purchase-recreated-account.invoice,purchase",0,Purchase,Einkauf,0
-field,"purchase.purchase-recreated-account.invoice,rec_name",0,Name,Name,0
 field,"purchase.purchase,reference",0,Reference,Beleg-Nr.,0
 field,"purchase.purchase,shipment_done",0,Shipment Done,Lieferposten erledigt,0
 field,"purchase.purchase,shipment_exception",0,Shipments Exception,Lieferungsvorbehalt,0
-field,"purchase.purchase,shipments",0,Shipments,Lieferposten,0
 field,"purchase.purchase,shipment_state",0,Shipment State,Lieferstatus,0
+field,"purchase.purchase,shipments",0,Shipments,Lieferposten,0
 field,"purchase.purchase,state",0,State,Status,0
 field,"purchase.purchase,supplier_reference",0,Supplier Reference,Beleg-Nr. Lieferant,0
 field,"purchase.purchase,tax_amount",0,Tax,Steuer,0
 field,"purchase.purchase,total_amount",0,Total,Gesamt,0
 field,"purchase.purchase,untaxed_amount",0,Untaxed,Netto,0
 field,"purchase.purchase,warehouse",0,Warehouse,Warenlager,0
+field,"purchase.purchase-account.invoice,invoice",0,Invoice,Rechnung,0
+field,"purchase.purchase-account.invoice,purchase",0,Purchase,Einkauf,0
+field,"purchase.purchase-account.invoice,rec_name",0,Name,Name,0
+field,"purchase.purchase-ignored-account.invoice,invoice",0,Invoice,Rechnung,0
+field,"purchase.purchase-ignored-account.invoice,purchase",0,Purchase,Einkauf,0
+field,"purchase.purchase-ignored-account.invoice,rec_name",0,Name,Name,0
+field,"purchase.purchase-recreated-account.invoice,invoice",0,Invoice,Rechnung,0
+field,"purchase.purchase-recreated-account.invoice,purchase",0,Purchase,Einkauf,0
+field,"purchase.purchase-recreated-account.invoice,rec_name",0,Name,Name,0
 field,"stock.move,purchase",0,Purchase,Einkauf,0
 field,"stock.move,purchase_currency",0,Purchase Currency,Einkaufswährung,0
 field,"stock.move,purchase_exception_state",0,Exception State,Status Vorbehalt,0
@@ -117,55 +117,56 @@ help,"purchase.handle.invoice.exception.ask,recreate_invoices",0,The selected in
 help,"purchase.handle.shipment.exception.ask,recreate_moves",0,The selected moves will be recreated. The other ones will be ignored.,Die ausgewählten Bewegungen werden nachgebildet. Alle anderen werden ignoriert.,0
 help,"purchase.product_supplier,delivery_time",0,In number of days,In Anzahl von Tagen,0
 help,"purchase.product_supplier.price,quantity",0,Minimal quantity,Minimale Anzahl,0
-model,"ir.action,name",act_purchase_form_confirmed,Confirmed Purchases,Aufträge (Einkäufe),0
-model,"ir.action,name",act_purchase_form_draft,Draft Purchases,Entwürfe (Einkäufe),0
-model,"ir.action,name",wizard_invoice_handle_exception,Handle Invoice Exception,Rechnungsvorbehalt bearbeiten,0
-model,"ir.action,name",wizard_shipment_handle_exception,Handle Shipment Exception,Liefervorbehalt bearbeiten,0
 model,"ir.action,name",act_invoice_form,Invoices,Rechnungseingang,0
-model,"ir.action,name",act_purchase_form_new,New Purchase,Neuer Einkauf,0
 model,"ir.action,name",act_open_supplier,Parties associated to Purchases,Parteien: Einkäufen zugeordnet,0
-model,"ir.action,name",report_purchase,Purchase,Einkauf,0
 model,"ir.action,name",act_purchase_configuration_form,Purchase Configuration,Einstellungen Einkauf,0
 model,"ir.action,name",act_purchase_form,Purchases,Einkäufe,0
 model,"ir.action,name",act_purchase_form2,Purchases,Einkäufe,0
+model,"ir.action,name",act_purchase_form_confirmed,Confirmed Purchases,Aufträge (Einkäufe),0
+model,"ir.action,name",act_purchase_form_draft,Draft Purchases,Entwürfe (Einkäufe),0
+model,"ir.action,name",act_purchase_form_new,New Purchase,Neuer Einkauf,0
 model,"ir.action,name",act_purchase_form_quotation,Purchases in Quotation,Angebote (Einkäufe),0
 model,"ir.action,name",act_shipment_form,Shipments,Lieferposten,0
+model,"ir.action,name",report_purchase,Purchase,Einkauf,0
+model,"ir.action,name",wizard_invoice_handle_exception,Handle Invoice Exception,Rechnungsvorbehalt bearbeiten,0
+model,"ir.action,name",wizard_shipment_handle_exception,Handle Shipment Exception,Liefervorbehalt bearbeiten,0
 model,"ir.sequence,name",sequence_purchase,Purchase,Einkauf,0
 model,"ir.sequence.type,name",sequence_type_purchase,Purchase,Einkauf,0
 model,"ir.ui.menu,name",menu_configuration,Configuration,Einstellungen,0
+model,"ir.ui.menu,name",menu_purchase,Purchase Management,Einkauf,0
+model,"ir.ui.menu,name",menu_purchase_configuration,Purchase Configuration,Einstellungen Einkauf,0
+model,"ir.ui.menu,name",menu_purchase_form,Purchases,Einkäufe,0
 model,"ir.ui.menu,name",menu_purchase_form_confirmed,Confirmed Purchases,Aufträge (Einkäufe),0
 model,"ir.ui.menu,name",menu_purchase_form_draft,Draft Purchases,Entwürfe (Einkäufe),0
 model,"ir.ui.menu,name",menu_purchase_form_new,New Purchase,Neuer Einkauf,0
-model,"ir.ui.menu,name",menu_supplier,Parties associated to Purchases,Parteien: Einkäufen zugeordnet,0
-model,"ir.ui.menu,name",menu_purchase_configuration,Purchase Configuration,Einstellungen Einkauf,0
-model,"ir.ui.menu,name",menu_purchase,Purchase Management,Einkauf,0
-model,"ir.ui.menu,name",menu_purchase_form,Purchases,Einkäufe,0
 model,"ir.ui.menu,name",menu_purchase_form_quotation,Purchases in Quotation,Angebote (Einkäufe),0
 model,"ir.ui.menu,name",menu_reporting,Reporting,Berichte,0
+model,"ir.ui.menu,name",menu_supplier,Parties associated to Purchases,Parteien: Einkäufen zugeordnet,0
 model,"purchase.configuration,name",0,Purchase Configuration,Einstellungen Einkauf,0
 model,"purchase.handle.invoice.exception.ask,name",0,Invoice Exception Ask,Nachfrage Rechnungsvorbehalt,0
 model,"purchase.handle.shipment.exception.ask,name",0,Shipment Exception Ask,Nachfrage Liefervorbehalt,0
+model,"purchase.line,name",0,Purchase Line,Einkauf Position,0
 model,"purchase.line-account.invoice.line,name",0,Purchase Line - Invoice Line,Position Einkauf - Rechnungszeile,0
 model,"purchase.line-account.tax,name",0,Purchase Line - Tax,Position Einkauf - Steuer,0
 model,"purchase.line-ignored-stock.move,name",0,Purchase Line - Ignored Move,Position Einkauf - Bewegung Ignoriert,0
-model,"purchase.line,name",0,Purchase Line,Einkauf Position,0
 model,"purchase.line-recreated-stock.move,name",0,Purchase Line - Ignored Move,Position Einkauf - Bewegung Nachgebildet,0
 model,"purchase.product_supplier,name",0,Product Supplier,Artikel Lieferant,0
 model,"purchase.product_supplier.price,name",0,Product Supplier Price,Artikel Einkaufspreis,0
+model,"purchase.purchase,name",0,Purchase,Einkauf,0
 model,"purchase.purchase-account.invoice,name",0,Purchase - Invoice,Einkauf - Rechnung,0
 model,"purchase.purchase-ignored-account.invoice,name",0,Purchase - Ignored Invoice,Einkauf - Rechnung Ignoriert,0
-model,"purchase.purchase,name",0,Purchase,Einkauf,0
 model,"purchase.purchase-recreated-account.invoice,name",0,Purchase - Recreated Invoice,Einkauf - Rechnung Nachgebildet,0
 model,"res.group,name",group_purchase,Purchase,Einkauf,0
 model,"res.group,name",group_purchase_admin,Purchase Administrator,Einkauf Administration,0
+model,"workflow,name",purchase_workflow,Purchase workflow,Workflow Einkauf,0
 model,"workflow.activity,name",purchase_activity_cancel,Canceled,Annulliert,0
 model,"workflow.activity,name",purchase_activity_confirmed,Confirmed,Beauftragt,0
 model,"workflow.activity,name",purchase_activity_done,Done,Erledigt,0
 model,"workflow.activity,name",purchase_activity_draft,Draft,Entwurf,0
 model,"workflow.activity,name",purchase_activity_invoice_done,Invoice Done,Rechnung erledigt,0
-model,"workflow.activity,name",purchase_activity_invoice_purchase_exception,Invoice Exception,Rechnungsvorbehalt,0
 model,"workflow.activity,name",purchase_activity_invoice_method,Invoice Method,Rechnungsstellung,0
 model,"workflow.activity,name",purchase_activity_invoice_method_done,Invoice Method Done,Rechnungsstellung erledigt,0
+model,"workflow.activity,name",purchase_activity_invoice_purchase_exception,Invoice Exception,Rechnungsvorbehalt,0
 model,"workflow.activity,name",purchase_activity_invoice_shipment,Invoice Shipment,Rechnung Lieferposten,0
 model,"workflow.activity,name",purchase_activity_invoice_shipment_done,Invoice Shipment Done,Rechnung Lieferposten erledigt,0
 model,"workflow.activity,name",purchase_activity_invoice_shipment_exception,Invoice Shipment Exception,Rechnung Lieferposten Vorbehalt,0
@@ -176,7 +177,6 @@ model,"workflow.activity,name",purchase_activity_shipment_exception,Shipment Exc
 model,"workflow.activity,name",purchase_activity_waiting_invoice_purchase,Waiting Invoice,Rechnung wartend,0
 model,"workflow.activity,name",purchase_activity_waiting_invoice_shipment,Waiting Invoice Shipment,Rechnung Lieferposten Wartend,0
 model,"workflow.activity,name",purchase_activity_waiting_shipment,Waiting Shipment,Lieferposten wartend,0
-model,"workflow,name",purchase_workflow,Purchase workflow,Workflow Einkauf,0
 odt,purchase.purchase,0,Amount,Betrag,0
 odt,purchase.purchase,0,Date:,Datum:,0
 odt,purchase.purchase,0,Description,Bezeichnung,0
@@ -189,9 +189,10 @@ odt,purchase.purchase,0,Quantity,Anzahl,0
 odt,purchase.purchase,0,Request for Quotation N°:,Angebotsanfrage Nr.:,0
 odt,purchase.purchase,0,Taxes,Steuern,0
 odt,purchase.purchase,0,Taxes:,Steuern:,0
-odt,purchase.purchase,0,Total:,Gesamt:,0
 odt,purchase.purchase,0,Total (excl. taxes):,Netto:,0
+odt,purchase.purchase,0,Total:,Gesamt:,0
 odt,purchase.purchase,0,Unit Price,Einzelpreis,0
+odt,purchase.purchase,0,VAT Number:,USt-ID-Nr.:,0
 odt,purchase.purchase,0,VAT:,USt.:,0
 selection,"account.invoice,purchase_exception_state",0,,,0
 selection,"account.invoice,purchase_exception_state",0,Ignored,Ignoriert,0
@@ -227,9 +228,9 @@ view,purchase.configuration,0,Purchase Configuration,Einstellungen Einkauf,0
 view,purchase.handle.invoice.exception.ask,0,Choose invoices to duplicate,Auswahl Rechnungen für Duplizierung,0
 view,purchase.handle.invoice.exception.ask,0,Choose invoices to recreate,Rechnungen zum Nachbilden auswählen,0
 view,purchase.handle.invoice.exception.ask,0,Handle Invoice Exception,Rechnungsvorbehalt bearbeiten,0
-view,purchase.handle.shipment.exception.ask,0,Choose moves to recreate,Auswahl Bewegungen zur Nachbildung,0
 view,purchase.handle.shipment.exception.ask,0,Choose move to duplicate,Auswahl Bewegungen für Duplizierung,0
 view,purchase.handle.shipment.exception.ask,0,Choose move to recreate,Bewegungen zum Nachbilden auswählen,0
+view,purchase.handle.shipment.exception.ask,0,Choose moves to recreate,Auswahl Bewegungen zur Nachbildung,0
 view,purchase.handle.shipment.exception.ask,0,Duplicate Moves,Bewegungen duplizieren,0
 view,purchase.handle.shipment.exception.ask,0,Handle shipment Exception,Liefervorbehalt bearbeiten,0
 view,purchase.handle.shipment.exception.ask,0,Recreated Moves,Nachgebildete Bewegungen,0
diff --git a/fr_FR.csv b/fr_FR.csv
index 408a749..f90998e 100644
--- a/fr_FR.csv
+++ b/fr_FR.csv
@@ -2,8 +2,8 @@ type,name,res_id,src,value,fuzzy
 error,account.invoice,0,You can not delete invoices that come from a purchase!,Vous ne pouvez pas supprimer une facture qui provient d'un achat,0
 error,account.invoice,0,You cannot reset to draft an invoice generated by a purchase.,Vous ne pouvez pas réinitialiser une facture générée par un achat.,0
 error,product.template,0,"Purchase prices are based on the purchase uom, are you sure to change it?","Les prix d'achat sont basé sur l'UDM d'achat, êtes-vous sur de vouloir la modifier ?",0
-error,purchase.line,0,"It misses an ""account expense"" default property!","il manque une propriété par défaut ""compte de charge"" !",0
 error,purchase.line,0,"It misses an ""Account Expense"" on product ""%s""!","Il manque un compte de charge sur le produit ""%s"" !",0
+error,purchase.line,0,"It misses an ""account expense"" default property!","il manque une propriété par défaut ""compte de charge"" !",0
 error,purchase.line,0,The supplier location is required!,L'emplacement fournisseur est requis !,0
 error,purchase.purchase,0,Invoice addresses must be defined for the quotation.,L'adresse de facturation doit être définie pour le devis.,0
 error,purchase.purchase,0,"It misses an ""Account Payable"" on the party ""%s""!","Il manque un compte à payer sur le tiers ""%s"" !",0
@@ -18,17 +18,8 @@ field,"purchase.handle.invoice.exception.ask,domain_invoices",0,Domain Invoices,
 field,"purchase.handle.invoice.exception.ask,recreate_invoices",0,Recreate Invoices,Recréer les factures,0
 field,"purchase.handle.shipment.exception.ask,domain_moves",0,Domain Moves,Domaine des mouvements,0
 field,"purchase.handle.shipment.exception.ask,recreate_moves",0,Recreate Moves,Recréer les mouvements,0
-field,"purchase.line-account.invoice.line,invoice_line",0,Invoice Line,Ligne de Facture,0
-field,"purchase.line-account.invoice.line,purchase_line",0,Purchase Line,Ligne d'achat,0
-field,"purchase.line-account.invoice.line,rec_name",0,Name,Nom,0
-field,"purchase.line-account.tax,line",0,Purchase Line,Ligne d'achat,0
-field,"purchase.line-account.tax,rec_name",0,Name,Nom,0
-field,"purchase.line-account.tax,tax",0,Tax,Taxe,0
 field,"purchase.line,amount",0,Amount,Montant,0
 field,"purchase.line,description",0,Description,Description,0
-field,"purchase.line-ignored-stock.move,move",0,Move,Mouvement,0
-field,"purchase.line-ignored-stock.move,purchase_line",0,Purchase Line,Ligne d'achat,0
-field,"purchase.line-ignored-stock.move,rec_name",0,Name,Nom,0
 field,"purchase.line,invoice_lines",0,Invoice Lines,Lignes de factures,0
 field,"purchase.line,move_done",0,Moves Done,Mouvements effectués,0
 field,"purchase.line,move_exception",0,Moves Exception,Mouvements en exception,0
@@ -40,47 +31,50 @@ field,"purchase.line,product",0,Product,Produit,0
 field,"purchase.line,purchase",0,Purchase,Achat,0
 field,"purchase.line,quantity",0,Quantity,Quantité,0
 field,"purchase.line,rec_name",0,Name,Nom,0
-field,"purchase.line-recreated-stock.move,move",0,Move,Mouvement,0
-field,"purchase.line-recreated-stock.move,purchase_line",0,Purchase Line,Ligne d'achat,0
-field,"purchase.line-recreated-stock.move,rec_name",0,Name,Nom,0
 field,"purchase.line,sequence",0,Sequence,Séquence,0
 field,"purchase.line,taxes",0,Taxes,Taxes,0
 field,"purchase.line,type",0,Type,Type,0
 field,"purchase.line,unit",0,Unit,Unité,0
 field,"purchase.line,unit_digits",0,Unit Digits,Décimales de l'unité,0
 field,"purchase.line,unit_price",0,Unit Price,Prix unitaire,0
+field,"purchase.line-account.invoice.line,invoice_line",0,Invoice Line,Ligne de Facture,0
+field,"purchase.line-account.invoice.line,purchase_line",0,Purchase Line,Ligne d'achat,0
+field,"purchase.line-account.invoice.line,rec_name",0,Name,Nom,0
+field,"purchase.line-account.tax,line",0,Purchase Line,Ligne d'achat,0
+field,"purchase.line-account.tax,rec_name",0,Name,Nom,0
+field,"purchase.line-account.tax,tax",0,Tax,Taxe,0
+field,"purchase.line-ignored-stock.move,move",0,Move,Mouvement,0
+field,"purchase.line-ignored-stock.move,purchase_line",0,Purchase Line,Ligne d'achat,0
+field,"purchase.line-ignored-stock.move,rec_name",0,Name,Nom,0
+field,"purchase.line-recreated-stock.move,move",0,Move,Mouvement,0
+field,"purchase.line-recreated-stock.move,purchase_line",0,Purchase Line,Ligne d'achat,0
+field,"purchase.line-recreated-stock.move,rec_name",0,Name,Nom,0
 field,"purchase.product_supplier,code",0,Code,Code,0
 field,"purchase.product_supplier,company",0,Company,Société,0
 field,"purchase.product_supplier,delivery_time",0,Delivery Time,Temps de livraison,0
 field,"purchase.product_supplier,name",0,Name,Nom,0
 field,"purchase.product_supplier,party",0,Supplier,Fournisseur,0
-field,"purchase.product_supplier.price,product_supplier",0,Supplier,Fournisseur,0
-field,"purchase.product_supplier.price,quantity",0,Quantity,Quantité,0
-field,"purchase.product_supplier.price,rec_name",0,Name,Nom,0
 field,"purchase.product_supplier,prices",0,Prices,Prix,0
-field,"purchase.product_supplier.price,unit_price",0,Unit Price,Prix unitaire,0
 field,"purchase.product_supplier,product",0,Product,Produit,0
 field,"purchase.product_supplier,rec_name",0,Name,Nom,0
 field,"purchase.product_supplier,sequence",0,Sequence,Séquence,0
-field,"purchase.purchase-account.invoice,invoice",0,Invoice,Facture,0
-field,"purchase.purchase-account.invoice,purchase",0,Purchase,Achat,0
-field,"purchase.purchase-account.invoice,rec_name",0,Name,Nom,0
+field,"purchase.product_supplier.price,product_supplier",0,Supplier,Fournisseur,0
+field,"purchase.product_supplier.price,quantity",0,Quantity,Quantité,0
+field,"purchase.product_supplier.price,rec_name",0,Name,Nom,0
+field,"purchase.product_supplier.price,unit_price",0,Unit Price,Prix unitaire,0
 field,"purchase.purchase,comment",0,Comment,Commentaire,0
 field,"purchase.purchase,company",0,Company,Société,0
 field,"purchase.purchase,currency",0,Currency,Devise,0
 field,"purchase.purchase,currency_digits",0,Currency Digits,Décimales de la devise,0
 field,"purchase.purchase,description",0,Description,Description,0
-field,"purchase.purchase-ignored-account.invoice,invoice",0,Invoice,Facture,0
-field,"purchase.purchase-ignored-account.invoice,purchase",0,Purchase,Achat,0
-field,"purchase.purchase-ignored-account.invoice,rec_name",0,Name,Nom,0
 field,"purchase.purchase,invoice_address",0,Invoice Address,Adresse de facturation,0
 field,"purchase.purchase,invoice_exception",0,Invoices Exception,Factures en exception,0
 field,"purchase.purchase,invoice_method",0,Invoice Method,Méthode de facturation,0
 field,"purchase.purchase,invoice_paid",0,Invoices Paid,Factures payées,0
+field,"purchase.purchase,invoice_state",0,Invoice State,État de la facture,0
 field,"purchase.purchase,invoices",0,Invoices,Factures,0
 field,"purchase.purchase,invoices_ignored",0,Ignored Invoices,Factures ignorées,0
 field,"purchase.purchase,invoices_recreated",0,Recreated Invoices,Factures recréées,0
-field,"purchase.purchase,invoice_state",0,Invoice State,État de la facture,0
 field,"purchase.purchase,lines",0,Lines,Lignes,0
 field,"purchase.purchase,moves",0,Moves,Mouvements,0
 field,"purchase.purchase,party",0,Party,Tiers,0
@@ -88,20 +82,26 @@ field,"purchase.purchase,party_lang",0,Party Language,Langue du tiers,0
 field,"purchase.purchase,payment_term",0,Payment Term,Conditions de paiement,0
 field,"purchase.purchase,purchase_date",0,Purchase Date,Date d'achat,0
 field,"purchase.purchase,rec_name",0,Name,Nom,0
-field,"purchase.purchase-recreated-account.invoice,invoice",0,Invoice,Facture,0
-field,"purchase.purchase-recreated-account.invoice,purchase",0,Purchase,Achat,0
-field,"purchase.purchase-recreated-account.invoice,rec_name",0,Name,Nom,0
 field,"purchase.purchase,reference",0,Reference,Référence,0
 field,"purchase.purchase,shipment_done",0,Shipment Done,Expédition effectuée,0
 field,"purchase.purchase,shipment_exception",0,Shipments Exception,Expéditions en exception,0
-field,"purchase.purchase,shipments",0,Shipments,Expéditions,0
 field,"purchase.purchase,shipment_state",0,Shipment State,État de l'expédition,0
+field,"purchase.purchase,shipments",0,Shipments,Expéditions,0
 field,"purchase.purchase,state",0,State,État,0
 field,"purchase.purchase,supplier_reference",0,Supplier Reference,Référence fournisseur,0
 field,"purchase.purchase,tax_amount",0,Tax,Taxe,0
 field,"purchase.purchase,total_amount",0,Total,Total,0
 field,"purchase.purchase,untaxed_amount",0,Untaxed,Non-taxé,0
 field,"purchase.purchase,warehouse",0,Warehouse,Entrepôt,0
+field,"purchase.purchase-account.invoice,invoice",0,Invoice,Facture,0
+field,"purchase.purchase-account.invoice,purchase",0,Purchase,Achat,0
+field,"purchase.purchase-account.invoice,rec_name",0,Name,Nom,0
+field,"purchase.purchase-ignored-account.invoice,invoice",0,Invoice,Facture,0
+field,"purchase.purchase-ignored-account.invoice,purchase",0,Purchase,Achat,0
+field,"purchase.purchase-ignored-account.invoice,rec_name",0,Name,Nom,0
+field,"purchase.purchase-recreated-account.invoice,invoice",0,Invoice,Facture,0
+field,"purchase.purchase-recreated-account.invoice,purchase",0,Purchase,Achat,0
+field,"purchase.purchase-recreated-account.invoice,rec_name",0,Name,Nom,0
 field,"stock.move,purchase",0,Purchase,Achat,0
 field,"stock.move,purchase_currency",0,Purchase Currency,Devise de l'achat,0
 field,"stock.move,purchase_exception_state",0,Exception State,État d'exception,0
@@ -116,55 +116,56 @@ help,"purchase.handle.invoice.exception.ask,recreate_invoices",0,The selected in
 help,"purchase.handle.shipment.exception.ask,recreate_moves",0,The selected moves will be recreated. The other ones will be ignored.,Les mouvements sélectionnés seront recréés. Les autres seront ignorés.,0
 help,"purchase.product_supplier,delivery_time",0,In number of days,En nombre de jours,0
 help,"purchase.product_supplier.price,quantity",0,Minimal quantity,Quantité minimale,0
-model,"ir.action,name",act_purchase_form_confirmed,Confirmed Purchases,Achats confirmés,0
-model,"ir.action,name",act_purchase_form_draft,Draft Purchases,Achats brouillons,0
-model,"ir.action,name",wizard_invoice_handle_exception,Handle Invoice Exception,Gérer l'exception de facture,0
-model,"ir.action,name",wizard_shipment_handle_exception,Handle Shipment Exception,Gérer l'exception d'expédition,0
 model,"ir.action,name",act_invoice_form,Invoices,Factures,0
-model,"ir.action,name",act_purchase_form_new,New Purchase,Nouvel achat,0
 model,"ir.action,name",act_open_supplier,Parties associated to Purchases,Tiers associés à des achats,0
-model,"ir.action,name",report_purchase,Purchase,Achat,0
 model,"ir.action,name",act_purchase_configuration_form,Purchase Configuration,Configuration des achats,0
 model,"ir.action,name",act_purchase_form,Purchases,Achats,0
 model,"ir.action,name",act_purchase_form2,Purchases,Achats,0
+model,"ir.action,name",act_purchase_form_confirmed,Confirmed Purchases,Achats confirmés,0
+model,"ir.action,name",act_purchase_form_draft,Draft Purchases,Achats brouillons,0
+model,"ir.action,name",act_purchase_form_new,New Purchase,Nouvel achat,0
 model,"ir.action,name",act_purchase_form_quotation,Purchases in Quotation,Devis,0
 model,"ir.action,name",act_shipment_form,Shipments,Expéditions,0
+model,"ir.action,name",report_purchase,Purchase,Achat,0
+model,"ir.action,name",wizard_invoice_handle_exception,Handle Invoice Exception,Gérer l'exception de facture,0
+model,"ir.action,name",wizard_shipment_handle_exception,Handle Shipment Exception,Gérer l'exception d'expédition,0
 model,"ir.sequence,name",sequence_purchase,Purchase,Achat,0
 model,"ir.sequence.type,name",sequence_type_purchase,Purchase,Achat,0
 model,"ir.ui.menu,name",menu_configuration,Configuration,Configuration,0
+model,"ir.ui.menu,name",menu_purchase,Purchase Management,Gestion des achats,0
+model,"ir.ui.menu,name",menu_purchase_configuration,Purchase Configuration,Configuration des achats,0
+model,"ir.ui.menu,name",menu_purchase_form,Purchases,Achats,0
 model,"ir.ui.menu,name",menu_purchase_form_confirmed,Confirmed Purchases,Achats confirmé,0
 model,"ir.ui.menu,name",menu_purchase_form_draft,Draft Purchases,Achats brouillons,0
 model,"ir.ui.menu,name",menu_purchase_form_new,New Purchase,Nouvel achat,0
-model,"ir.ui.menu,name",menu_supplier,Parties associated to Purchases,Tiers associés à des achats,0
-model,"ir.ui.menu,name",menu_purchase_configuration,Purchase Configuration,Configuration des achats,0
-model,"ir.ui.menu,name",menu_purchase,Purchase Management,Gestion des achats,0
-model,"ir.ui.menu,name",menu_purchase_form,Purchases,Achats,0
 model,"ir.ui.menu,name",menu_purchase_form_quotation,Purchases in Quotation,Devis,0
 model,"ir.ui.menu,name",menu_reporting,Reporting,Rapport,0
-model,"purchase.configuration,name",0,purchase.configuration,,0
+model,"ir.ui.menu,name",menu_supplier,Parties associated to Purchases,Tiers associés à des achats,0
+model,"purchase.configuration,name",0,Purchase Configuration,Configuration des achats,0
 model,"purchase.handle.invoice.exception.ask,name",0,Invoice Exception Ask,Exception de facture - Demande,0
 model,"purchase.handle.shipment.exception.ask,name",0,Shipment Exception Ask,Exception d'expédition - Demande,0
+model,"purchase.line,name",0,Purchase Line,Ligne d'achat,0
 model,"purchase.line-account.invoice.line,name",0,Purchase Line - Invoice Line,Ligne d'achat - Ligne de facture,0
 model,"purchase.line-account.tax,name",0,Purchase Line - Tax,Ligne d'achat - Taxe,0
 model,"purchase.line-ignored-stock.move,name",0,Purchase Line - Ignored Move,Ligne d'achat - Mouvement ignoré,0
-model,"purchase.line,name",0,Purchase Line,Ligne d'achat,0
 model,"purchase.line-recreated-stock.move,name",0,Purchase Line - Ignored Move,Ligne d'achat - Mouvement ignoré,0
 model,"purchase.product_supplier,name",0,Product Supplier,Produit Fournisseur,0
 model,"purchase.product_supplier.price,name",0,Product Supplier Price,Produit Prix Fournisseur,0
+model,"purchase.purchase,name",0,Purchase,Achat,0
 model,"purchase.purchase-account.invoice,name",0,Purchase - Invoice,Achat - Facture,0
 model,"purchase.purchase-ignored-account.invoice,name",0,Purchase - Ignored Invoice,Achat - Facture ignorée,0
-model,"purchase.purchase,name",0,Purchase,Achat,0
 model,"purchase.purchase-recreated-account.invoice,name",0,Purchase - Recreated Invoice,Achat - Facture recréée,0
 model,"res.group,name",group_purchase,Purchase,Achat,0
 model,"res.group,name",group_purchase_admin,Purchase Administrator,Administrateur des achats,0
+model,"workflow,name",purchase_workflow,Purchase workflow,Workflow d'achat,0
 model,"workflow.activity,name",purchase_activity_cancel,Canceled,Annulé,0
 model,"workflow.activity,name",purchase_activity_confirmed,Confirmed,Confirmé,0
 model,"workflow.activity,name",purchase_activity_done,Done,Fait,0
 model,"workflow.activity,name",purchase_activity_draft,Draft,Brouillon,0
 model,"workflow.activity,name",purchase_activity_invoice_done,Invoice Done,Facture faite,0
-model,"workflow.activity,name",purchase_activity_invoice_purchase_exception,Invoice Exception,Facture en exception,0
 model,"workflow.activity,name",purchase_activity_invoice_method,Invoice Method,Méthode de facturation,0
 model,"workflow.activity,name",purchase_activity_invoice_method_done,Invoice Method Done,Méthode de facturation faite,0
+model,"workflow.activity,name",purchase_activity_invoice_purchase_exception,Invoice Exception,Facture en exception,0
 model,"workflow.activity,name",purchase_activity_invoice_shipment,Invoice Shipment,Facture d'expédition,0
 model,"workflow.activity,name",purchase_activity_invoice_shipment_done,Invoice Shipment Done,Facture expédition faite,0
 model,"workflow.activity,name",purchase_activity_invoice_shipment_exception,Invoice Shipment Exception,Facture expédition en exception,0
@@ -175,7 +176,6 @@ model,"workflow.activity,name",purchase_activity_shipment_exception,Shipment Exc
 model,"workflow.activity,name",purchase_activity_waiting_invoice_purchase,Waiting Invoice,Facture en attente,0
 model,"workflow.activity,name",purchase_activity_waiting_invoice_shipment,Waiting Invoice Shipment,Facture expédition en attente,0
 model,"workflow.activity,name",purchase_activity_waiting_shipment,Waiting Shipment,Expédition en attente,0
-model,"workflow,name",purchase_workflow,Purchase workflow,Workflow d'achat,0
 odt,purchase.purchase,0,Amount,Montant,0
 odt,purchase.purchase,0,Date:,Date:,0
 odt,purchase.purchase,0,Description,Description,0
@@ -188,9 +188,10 @@ odt,purchase.purchase,0,Quantity,Quantité,0
 odt,purchase.purchase,0,Request for Quotation N°:,Demande pour le devis n°,0
 odt,purchase.purchase,0,Taxes,Taxes,0
 odt,purchase.purchase,0,Taxes:,Taxes:,0
-odt,purchase.purchase,0,Total:,Total:,0
 odt,purchase.purchase,0,Total (excl. taxes):,Total (htva),0
+odt,purchase.purchase,0,Total:,Total:,0
 odt,purchase.purchase,0,Unit Price,Prix unitaire,0
+odt,purchase.purchase,0,VAT Number:,Numéro TVA:,0
 odt,purchase.purchase,0,VAT:,TVA:,0
 selection,"account.invoice,purchase_exception_state",0,,,0
 selection,"account.invoice,purchase_exception_state",0,Ignored,Ignoré,0
diff --git a/purchase.py b/purchase.py
index 6e09c44..e65096b 100644
--- a/purchase.py
+++ b/purchase.py
@@ -1,15 +1,16 @@
 #This file is part of Tryton.  The COPYRIGHT file at the top level of
 #this repository contains the full copyright notices and license terms.
-"Purchase"
+from __future__ import with_statement
+import datetime
+import copy
+from decimal import Decimal
 from trytond.model import ModelWorkflow, ModelView, ModelSQL, fields
 from trytond.modules.company import CompanyReport
 from trytond.wizard import Wizard
 from trytond.backend import TableHandler
 from trytond.pyson import Not, Equal, Eval, Or, Bool, If, In, Get, And, \
         PYSONEncoder
-from decimal import Decimal
-import datetime
-import copy
+from trytond.transaction import Transaction
 
 _STATES = {
     'readonly': Not(Equal(Eval('state'), 'draft')),
@@ -116,7 +117,8 @@ class Purchase(ModelWorkflow, ModelSQL, ModelView):
                         'an "Account Payable" on the party "%s"!',
             })
 
-    def init(self, cursor, module_name):
+    def init(self, module_name):
+        cursor = Transaction().cursor
         # Migration from 1.2: packing renamed into shipment
         cursor.execute("UPDATE ir_model_data "\
                 "SET fs_id = REPLACE(fs_id, 'packing', 'shipment') "\
@@ -131,7 +133,7 @@ class Purchase(ModelWorkflow, ModelSQL, ModelView):
         table = TableHandler(cursor, self, module_name)
         table.column_rename('packing_state', 'shipment_state')
 
-        super(Purchase, self).init(cursor, module_name)
+        super(Purchase, self).init(module_name)
 
         # Migration from 1.2: rename packing to shipment in
         # invoice_method values
@@ -143,69 +145,57 @@ class Purchase(ModelWorkflow, ModelSQL, ModelView):
         table = TableHandler(cursor, self, module_name)
         table.index_action('create_date', action='add')
 
-    def default_payment_term(self, cursor, user, context=None):
+    def default_payment_term(self):
         payment_term_obj = self.pool.get('account.invoice.payment_term')
-        payment_term_ids = payment_term_obj.search(cursor, user,
-                self.payment_term.domain, context=context)
+        payment_term_ids = payment_term_obj.search(self.payment_term.domain)
         if len(payment_term_ids) == 1:
             return payment_term_ids[0]
         return False
 
-    def default_warehouse(self, cursor, user, context=None):
+    def default_warehouse(self):
         location_obj = self.pool.get('stock.location')
-        location_ids = location_obj.search(cursor, user,
-                self.warehouse.domain, context=context)
+        location_ids = location_obj.search(self.warehouse.domain)
         if len(location_ids) == 1:
             return location_ids[0]
         return False
 
-    def default_company(self, cursor, user, context=None):
-        if context is None:
-            context = {}
-        if context.get('company'):
-            return context['company']
-        return False
+    def default_company(self):
+        return Transaction().context.get('company') or False
 
-    def default_state(self, cursor, user, context=None):
+    def default_state(self):
         return 'draft'
 
-    def default_purchase_date(self, cursor, user, context=None):
+    def default_purchase_date(self):
         date_obj = self.pool.get('ir.date')
-        return date_obj.today(cursor, user, context=context)
+        return date_obj.today()
 
-    def default_currency(self, cursor, user, context=None):
+    def default_currency(self):
         company_obj = self.pool.get('company.company')
         currency_obj = self.pool.get('currency.currency')
-        if context is None:
-            context = {}
-        company = None
-        if context.get('company'):
-            company = company_obj.browse(cursor, user, context['company'],
-                    context=context)
+        company = Transaction().context.get('company')
+        if company:
+            company = company_obj.browse(company)
             return company.currency.id
         return False
 
-    def default_currency_digits(self, cursor, user, context=None):
+    def default_currency_digits(self):
         company_obj = self.pool.get('company.company')
-        if context is None:
-            context = {}
-        company = None
-        if context.get('company'):
-            company = company_obj.browse(cursor, user, context['company'],
-                    context=context)
+        company = Transaction().context.get('company')
+        if company:
+            company = company_obj.browse(company)
             return company.currency.digits
         return 2
 
-    def default_invoice_method(self, cursor, user, context=None):
+    def default_invoice_method(self):
         return 'order'
 
-    def default_invoice_state(self, cursor, user, context=None):
+    def default_invoice_state(self):
         return 'none'
 
-    def default_shipment_state(self, cursor, user, context=None):
+    def default_shipment_state(self):
         return 'none'
 
-    def on_change_party(self, cursor, user, vals, context=None):
+    def on_change_party(self, vals):
         party_obj = self.pool.get('party.party')
         address_obj = self.pool.get('party.address')
         payment_term_obj = self.pool.get('account.invoice.payment_term')
@@ -214,41 +204,34 @@ class Purchase(ModelWorkflow, ModelSQL, ModelView):
             'payment_term': False,
         }
         if vals.get('party'):
-            party = party_obj.browse(cursor, user, vals['party'],
-                    context=context)
-            res['invoice_address'] = party_obj.address_get(cursor, user,
-                    party.id, type='invoice', context=context)
+            party = party_obj.browse(vals['party'])
+            res['invoice_address'] = party_obj.address_get(party.id,
+                    type='invoice')
             if party.supplier_payment_term:
                 res['payment_term'] = party.supplier_payment_term.id
 
         if res['invoice_address']:
-            res['invoice_address.rec_name'] = address_obj.browse(cursor, user,
-                    res['invoice_address'], context=context).rec_name
+            res['invoice_address.rec_name'] = address_obj.browse(
+                    res['invoice_address']).rec_name
         if not res['payment_term']:
-            res['payment_term'] = self.default_payment_term(cursor, user,
-                    context=context)
+            res['payment_term'] = self.default_payment_term()
         if res['payment_term']:
-            res['payment_term.rec_name'] = payment_term_obj.browse(cursor, user,
-                    res['payment_term'], context=context).rec_name
+            res['payment_term.rec_name'] = payment_term_obj.browse(
+                    res['payment_term']).rec_name
         return res
 
-    def on_change_with_currency_digits(self, cursor, user, vals,
-            context=None):
+    def on_change_with_currency_digits(self, vals):
         currency_obj = self.pool.get('currency.currency')
         if vals.get('currency'):
-            currency = currency_obj.browse(cursor, user, vals['currency'],
-                    context=context)
+            currency = currency_obj.browse(vals['currency'])
             return currency.digits
         return 2
 
-    def get_currency_digits(self, cursor, user, purchases, context=None):
+    def get_currency_digits(self, purchases):
         '''
         Return the number of digits of the currency for each purchases
 
-        :param cursor: the database cursor
-        :param user: the user id
         :param purchases: a BrowseRecordList of purchases
-        :param context: the context
         :return: a dictionary with purchase id as key and
             number of digits as value
         '''
@@ -257,22 +240,20 @@ class Purchase(ModelWorkflow, ModelSQL, ModelView):
             res[purchase.id] = purchase.currency.digits
         return res
 
-    def on_change_with_party_lang(self, cursor, user, vals, context=None):
+    def on_change_with_party_lang(self, vals):
         party_obj = self.pool.get('party.party')
         if vals.get('party'):
-            party = party_obj.browse(cursor, user, vals['party'],
-                    context=context)
+            party = party_obj.browse(vals['party'])
             if party.lang:
                 return party.lang.code
         return 'en_US'
 
-    def get_tax_context(self, cursor, user, purchase, context=None):
+    def get_tax_context(self, purchase):
         party_obj = self.pool.get('party.party')
         res = {}
         if isinstance(purchase, dict):
             if purchase.get('party'):
-                party = party_obj.browse(cursor, user, purchase['party'],
-                        context=context)
+                party = party_obj.browse(purchase['party'])
                 if party.lang:
                     res['language'] = party.lang.code
         else:
@@ -280,13 +261,11 @@ class Purchase(ModelWorkflow, ModelSQL, ModelView):
                 res['language'] = purchase.party.lang.code
         return res
 
-    def on_change_lines(self, cursor, user, vals, context=None):
+    def on_change_lines(self, vals):
         currency_obj = self.pool.get('currency.currency')
         tax_obj = self.pool.get('account.tax')
         invoice_obj = self.pool.get('account.invoice')
 
-        if context is None:
-            context = {}
         res = {
             'untaxed_amount': Decimal('0.0'),
             'tax_amount': Decimal('0.0'),
@@ -294,100 +273,79 @@ class Purchase(ModelWorkflow, ModelSQL, ModelView):
         }
         currency = None
         if vals.get('currency'):
-            currency = currency_obj.browse(cursor, user, vals['currency'],
-                    context=context)
+            currency = currency_obj.browse(vals['currency'])
         if vals.get('lines'):
-            ctx = context.copy()
-            ctx.update(self.get_tax_context(cursor, user, vals,
-                context=context))
+            context = self.get_tax_context(vals)
             taxes = {}
             for line in vals['lines']:
                 if line.get('type', 'line') != 'line':
                     continue
                 res['untaxed_amount'] += line.get('amount', Decimal('0.0'))
 
-                for tax in tax_obj.compute(cursor, user, line.get('taxes', []),
-                        line.get('unit_price', Decimal('0.0')),
-                        line.get('quantity', 0.0), context=context):
-                    key, val = invoice_obj._compute_tax(cursor, user, tax,
-                            'in_invoice', context=context)
+                with Transaction().set_context(context):
+                    tax_list = tax_obj.compute(line.get('taxes', []),
+                            line.get('unit_price', Decimal('0.0')),
+                            line.get('quantity', 0.0))
+                for tax in tax_list:
+                    key, val = invoice_obj._compute_tax(tax, 'in_invoice')
                     if not key in taxes:
                         taxes[key] = val['amount']
                     else:
                         taxes[key] += val['amount']
             if currency:
                 for key in taxes:
-                    res['tax_amount'] += currency_obj.round(cursor, user,
-                            currency, taxes[key])
+                    res['tax_amount'] += currency_obj.round(currency, taxes[key])
         if currency:
-            res['untaxed_amount'] = currency_obj.round(cursor, user, currency,
+            res['untaxed_amount'] = currency_obj.round(currency,
                     res['untaxed_amount'])
-            res['tax_amount'] = currency_obj.round(cursor, user, currency,
-                    res['tax_amount'])
+            res['tax_amount'] = currency_obj.round(currency, res['tax_amount'])
         res['total_amount'] = res['untaxed_amount'] + res['tax_amount']
         if currency:
-            res['total_amount'] = currency_obj.round(cursor, user, currency,
+            res['total_amount'] = currency_obj.round(currency,
                     res['total_amount'])
         return res
 
-    def get_function_fields(self, cursor, user, ids, names, context=None):
+    def get_function_fields(self, ids, names):
         '''
         Function to compute function fields for purchase ids.
 
-        :param cursor: the database cursor
-        :param user: the user id
         :param ids: the ids of the purchases
         :param names: the list of field name to compute
         :param args: optional argument
-        :param context: the context
         :return: a dictionary with all field names as key and
             a dictionary as value with id as key
         '''
         res = {}
-        purchases = self.browse(cursor, user, ids, context=context)
+        purchases = self.browse(ids)
         if 'currency_digits' in names:
-            res['currency_digits'] = self.get_currency_digits(cursor, user,
-                    purchases, context=context)
+            res['currency_digits'] = self.get_currency_digits(purchases)
         if 'party_lang' in names:
-            res['party_lang'] = self.get_party_lang(cursor, user, purchases,
-                    context=context)
+            res['party_lang'] = self.get_party_lang(purchases)
         if 'untaxed_amount' in names:
-            res['untaxed_amount'] = self.get_untaxed_amount(cursor, user,
-                    purchases, context=context)
+            res['untaxed_amount'] = self.get_untaxed_amount(purchases)
         if 'tax_amount' in names:
-            res['tax_amount'] = self.get_tax_amount(cursor, user, purchases,
-                    context=context)
+            res['tax_amount'] = self.get_tax_amount(purchases)
         if 'total_amount' in names:
-            res['total_amount'] = self.get_total_amount(cursor, user,
-                    purchases, context=context)
+            res['total_amount'] = self.get_total_amount(purchases)
         if 'invoice_paid' in names:
-            res['invoice_paid'] = self.get_invoice_paid(cursor, user,
-                    purchases, context=context)
+            res['invoice_paid'] = self.get_invoice_paid(purchases)
         if 'invoice_exception' in names:
-            res['invoice_exception'] = self.get_invoice_exception(cursor, user,
-                    purchases, context=context)
+            res['invoice_exception'] = self.get_invoice_exception(purchases)
         if 'shipments' in names:
-            res['shipments'] = self.get_shipments(cursor, user, purchases,
-                    context=context)
+            res['shipments'] = self.get_shipments(purchases)
         if 'moves' in names:
-            res['moves'] = self.get_moves(cursor, user, purchases,
-                    context=context)
+            res['moves'] = self.get_moves(purchases)
         if 'shipment_done' in names:
-            res['shipment_done'] = self.get_shipment_done(cursor, user,
-                    purchases, context=context)
+            res['shipment_done'] = self.get_shipment_done(purchases)
         if 'shipment_exception' in names:
-            res['shipment_exception'] = self.get_shipment_exception(cursor,
-                    user, purchases, context=context)
+            res['shipment_exception'] = self.get_shipment_exception(purchases)
         return res
 
-    def get_party_lang(self, cursor, user, purchases, context=None):
+    def get_party_lang(self, purchases):
         '''
         Return the language code of the party of each purchases
 
-        :param cursor: the database cursor
-        :param user: the user id
         :param purchases: a BrowseRecordList of purchases
-        :param context: the context
         :return: a dictionary with purchase id as key and
             a language code as value
         '''
@@ -399,14 +357,11 @@ class Purchase(ModelWorkflow, ModelSQL, ModelView):
                 res[purchase.id] = 'en_US'
         return res
 
-    def get_untaxed_amount(self, cursor, user, purchases, context=None):
+    def get_untaxed_amount(self, purchases):
         '''
         Return the untaxed amount for each purchases
 
-        :param cursor: the database cursor
-        :param user: the user id
         :param purchases: a BrowseRecordList of purchases
-        :param context: the context
         :return: a dictionary with purchase id as key and
             the untaxed amount as value
         '''
@@ -418,18 +373,15 @@ class Purchase(ModelWorkflow, ModelSQL, ModelView):
                 if line.type != 'line':
                     continue
                 res[purchase.id] += line.amount
-            res[purchase.id] = currency_obj.round(cursor, user, purchase.currency,
+            res[purchase.id] = currency_obj.round(purchase.currency,
                     res[purchase.id])
         return res
 
-    def get_tax_amount(self, cursor, user, purchases, context=None):
+    def get_tax_amount(self, purchases):
         '''
         Return the tax amount for each purchases
 
-        :param cursor: the database cursor
-        :param user: the user id
         :param purchases: a BrowseRecordList of purchases
-        :param context: the context
         :return: a dictionary with purchase id as key and
             the tax amount as value
         '''
@@ -437,65 +389,53 @@ class Purchase(ModelWorkflow, ModelSQL, ModelView):
         tax_obj = self.pool.get('account.tax')
         invoice_obj = self.pool.get('account.invoice')
 
-        if context is None:
-            context = {}
         res = {}
         for purchase in purchases:
-            ctx = context.copy()
-            ctx.update(self.get_tax_context(cursor, user,
-                purchase, context=context))
+            context = self.get_tax_context(purchase)
             res.setdefault(purchase.id, Decimal('0.0'))
             taxes = {}
             for line in purchase.lines:
                 if line.type != 'line':
                     continue
+                with Transaction().set_context(context):
+                    tax_list = tax_obj.compute([t.id for t in line.taxes],
+                            line.unit_price, line.quantity)
                 # Don't round on each line to handle rounding error
-                for tax in tax_obj.compute(
-                    cursor, user, [t.id for t in line.taxes], line.unit_price,
-                    line.quantity, context=ctx):
-                    key, val = invoice_obj._compute_tax(cursor, user, tax,
-                            'in_invoice', context=context)
+                for tax in tax_list:
+                    key, val = invoice_obj._compute_tax(tax, 'in_invoice')
                     if not key in taxes:
                         taxes[key] = val['amount']
                     else:
                         taxes[key] += val['amount']
             for key in taxes:
-                res[purchase.id] += currency_obj.round(cursor, user,
-                        purchase.currency, taxes[key])
-            res[purchase.id] = currency_obj.round(cursor, user, purchase.currency,
+                res[purchase.id] += currency_obj.round(purchase.currency,
+                        taxes[key])
+            res[purchase.id] = currency_obj.round(purchase.currency,
                     res[purchase.id])
         return res
 
-    def get_total_amount(self, cursor, user, purchases, context=None):
+    def get_total_amount(self, purchases):
         '''
         Return the total amount of each purchases
 
-        :param cursor: the database cursor
-        :param user: the user id
         :param purchases: a BrowseRecordList of purchases
-        :param context: the context
         :return: a dictionary with purchase id as key and
             total amount as value
         '''
         currency_obj = self.pool.get('currency.currency')
         res = {}
-        untaxed_amounts = self.get_untaxed_amount(cursor, user, purchases,
-                context=context)
-        tax_amounts = self.get_tax_amount(cursor, user, purchases,
-                context=context)
+        untaxed_amounts = self.get_untaxed_amount(purchases)
+        tax_amounts = self.get_tax_amount(purchases)
         for purchase in purchases:
-            res[purchase.id] = currency_obj.round(cursor, user, purchase.currency,
+            res[purchase.id] = currency_obj.round(purchase.currency,
                     untaxed_amounts[purchase.id] + tax_amounts[purchase.id])
         return res
 
-    def get_invoice_paid(self, cursor, user, purchases, context=None):
+    def get_invoice_paid(self, purchases):
         '''
         Return if all invoices have been paid for each purchases
 
-        :param cursor: the database cursor
-        :param user: the user id
         :param purchases: a BrowseRecordList of purchases
-        :param context: the context
         :return: a dictionary with purchase id as key and
             a boolean as value
         '''
@@ -512,14 +452,11 @@ class Purchase(ModelWorkflow, ModelSQL, ModelView):
             res[purchase.id] = val
         return res
 
-    def get_invoice_exception(self, cursor, user, purchases, context=None):
+    def get_invoice_exception(self, purchases):
         '''
         Return if there is an invoice exception for each purchases
 
-        :param cursor: the database cursor
-        :param user: the user id
         :param purchases: a BrowseRecordList of purchases
-        :param context: the context
         :return: a dictionary with purchase id as key and
             a boolean as value
         '''
@@ -536,14 +473,11 @@ class Purchase(ModelWorkflow, ModelSQL, ModelView):
             res[purchase.id] = val
         return res
 
-    def get_shipments(self, cursor, user, purchases, context=None):
+    def get_shipments(self, purchases):
         '''
         Return the shipments for the purchases.
 
-        :param cursor: the database cursor
-        :param user: the user id
         :param purchases: a BrowseRecordList of purchases
-        :param context: the context
         :return: a dictionary with purchase id as key and
             a list of shipment_in id as value
         '''
@@ -557,14 +491,11 @@ class Purchase(ModelWorkflow, ModelSQL, ModelView):
                             res[purchase.id].append(move.shipment_in.id)
         return res
 
-    def get_moves(self, cursor, user, purchases, context=None):
+    def get_moves(self, purchases):
         '''
         Return the moves for the purchases.
 
-        :param cursor: the database cursor
-        :param user: the user id
         :param purchases: a BrowseRecordList of purchases
-        :param context: the context
         :return: a dictionary with purchase id as key and
             a list of moves id as value
         '''
@@ -575,14 +506,11 @@ class Purchase(ModelWorkflow, ModelSQL, ModelView):
                 res[purchase.id].extend([x.id for x in line.moves])
         return res
 
-    def get_shipment_done(self, cursor, user, purchases, context=None):
+    def get_shipment_done(self, purchases):
         '''
         Return if all the move have been done for the purchases
 
-        :param cursor: the database cursor
-        :param user: the user id
         :param purchases: a BrowseRecordList of purchases
-        :param context: the context
         :return: a dictionary with purchase id as key and
             a boolean as value
         '''
@@ -596,14 +524,11 @@ class Purchase(ModelWorkflow, ModelSQL, ModelView):
             res[purchase.id] = val
         return res
 
-    def get_shipment_exception(self, cursor, user, purchases, context=None):
+    def get_shipment_exception(self, purchases):
         '''
         Return if there is a shipment in exception for the purchases
 
-        :param cursor: the database cursor
-        :param user: the user id
         :param purchases: a BrowseRecordList of purchases
-        :param context: the context
         :return: a dictionary with purchase id as key and
             a boolean as value
         '''
@@ -617,27 +542,27 @@ class Purchase(ModelWorkflow, ModelSQL, ModelView):
             res[purchase.id] = val
         return res
 
-    def get_rec_name(self, cursor, user, ids, name, context=None):
+    def get_rec_name(self, ids, name):
         if not ids:
             return {}
         res = {}
-        for purchase in self.browse(cursor, user, ids, context=context):
+        for purchase in self.browse(ids):
             res[purchase.id] = purchase.reference or str(purchase.id) \
                     + ' - ' + purchase.party.name
         return res
 
-    def search_rec_name(self, cursor, user, name, clause, context=None):
+    def search_rec_name(self, name, clause):
         names = clause[2].split(' - ', 1)
-        ids = self.search(cursor, user, ['OR',
+        ids = self.search(['OR',
             ('reference', clause[1], names[0]),
             ('supplier_reference', clause[1], names[0]),
-            ], order=[], context=context)
+            ], order=[])
         res = [('id', 'in', ids)]
         if len(names) != 1 and names[1]:
             res.append(('party', clause[1], names[1]))
         return res
 
-    def copy(self, cursor, user, ids, default=None, context=None):
+    def copy(self, ids, default=None):
         if default is None:
             default = {}
         default = default.copy()
@@ -647,78 +572,68 @@ class Purchase(ModelWorkflow, ModelSQL, ModelView):
         default['invoices'] = False
         default['invoices_ignored'] = False
         default['shipment_state'] = 'none'
-        return super(Purchase, self).copy(cursor, user, ids, default=default,
-                context=context)
+        return super(Purchase, self).copy(ids, default=default)
 
-    def check_for_quotation(self, cursor, user, purchase_id, context=None):
-        purchase = self.browse(cursor, user, purchase_id, context=context)
+    def check_for_quotation(self, purchase_id):
+        purchase = self.browse(purchase_id)
         if not purchase.invoice_address:
-            self.raise_user_error(cursor, 'invoice_addresse_required', context=context)
+            self.raise_user_error('invoice_addresse_required')
         return True
 
-    def set_reference(self, cursor, user, purchase_id, context=None):
+    def set_reference(self, purchase_id):
         sequence_obj = self.pool.get('ir.sequence')
         config_obj = self.pool.get('purchase.configuration')
 
-        purchase = self.browse(cursor, user, purchase_id, context=context)
+        purchase = self.browse(purchase_id)
 
         if purchase.reference:
             return True
 
-        config = config_obj.browse(cursor, user, 1, context=context)
-        reference = sequence_obj.get_id(cursor, user,
-                config.purchase_sequence.id, context=context)
-        self.write(cursor, user, purchase_id, {
+        config = config_obj.browse(1)
+        reference = sequence_obj.get_id(config.purchase_sequence.id)
+        self.write(purchase_id, {
             'reference': reference,
-            }, context=context)
+            })
         return True
 
-    def set_purchase_date(self, cursor, user, purchase_id, context=None):
+    def set_purchase_date(self, purchase_id):
         date_obj = self.pool.get('ir.date')
 
-        self.write(cursor, user, purchase_id, {
-            'purchase_date': date_obj.today(cursor, user, context=context),
-            }, context=context)
+        self.write(purchase_id, {
+            'purchase_date': date_obj.today(),
+            })
         return True
 
-    def _get_invoice_line_purchase_line(self, cursor, user, purchase,
-            context=None):
+    def _get_invoice_line_purchase_line(self, purchase):
         '''
         Return invoice line values for each purchase lines
 
-        :param cursor: the database cursor
-        :param user: the user id
         :param purchase: a BrowseRecord of the purchase
-        :param context: the context
         :return: a dictionary with line id as key and a list
             of invoice line values as value
         '''
         line_obj = self.pool.get('purchase.line')
         res = {}
         for line in purchase.lines:
-            val = line_obj.get_invoice_line(cursor, user, line,
-                    context=context)
+            val = line_obj.get_invoice_line(line)
             if val:
                 res[line.id] = val
         return res
 
-    def _get_invoice_purchase(self, cursor, user, purchase, context=None):
+    def _get_invoice_purchase(self, purchase):
         '''
         Return invoice values for purchase
 
-        :param cursor: the database cursor
-        :param user: the user id
         :param purchase: the BrowseRecord of the purchase
-        :param context: the context
 
         :return: a dictionary with purchase fields as key and
             purchase values as value
         '''
         journal_obj = self.pool.get('account.journal')
 
-        journal_id = journal_obj.search(cursor, user, [
+        journal_id = journal_obj.search([
             ('type', '=', 'expense'),
-            ], limit=1, context=context)
+            ], limit=1)
         if journal_id:
             journal_id = journal_id[0]
 
@@ -735,64 +650,57 @@ class Purchase(ModelWorkflow, ModelSQL, ModelView):
         }
         return res
 
-    def create_invoice(self, cursor, user, purchase_id, context=None):
+    def create_invoice(self, purchase_id):
         '''
         Create invoice for the purchase id
 
-        :param cursor: the database cursor
-        :param user: the user id
         :param purchase_id: the id of the purchase
-        :param context: the context
         :return: the id of the invoice or None
         '''
         invoice_obj = self.pool.get('account.invoice')
         invoice_line_obj = self.pool.get('account.invoice.line')
         purchase_line_obj = self.pool.get('purchase.line')
 
-        if context is None:
-            context = {}
-
-        purchase = self.browse(cursor, user, purchase_id, context=context)
+        purchase = self.browse(purchase_id)
 
         if not purchase.party.account_payable:
-            self.raise_user_error(cursor, 'missing_account_payable',
-                    error_args=(purchase.party.rec_name,), context=context)
+            self.raise_user_error('missing_account_payable',
+                    error_args=(purchase.party.rec_name,))
 
-        invoice_lines = self._get_invoice_line_purchase_line(cursor, user,
-                purchase, context=context)
+        invoice_lines = self._get_invoice_line_purchase_line(purchase)
         if not invoice_lines:
             return
 
-        ctx = context.copy()
-        ctx['user'] = user
-        vals = self._get_invoice_purchase(cursor, user, purchase, context=context)
-        invoice_id = invoice_obj.create(cursor, 0, vals, context=ctx)
+        vals = self._get_invoice_purchase(purchase)
+        with Transaction().set_user(0, set_context=True):
+            invoice_id = invoice_obj.create(vals)
 
         for line_id in invoice_lines:
             for vals in invoice_lines[line_id]:
                 vals['invoice'] = invoice_id
-                invoice_line_id = invoice_line_obj.create(cursor, 0, vals,
-                        context=ctx)
-                purchase_line_obj.write(cursor, user, line_id, {
+                with Transaction().set_user(0, set_context=True):
+                    invoice_line_id = invoice_line_obj.create(vals)
+                purchase_line_obj.write(line_id, {
                     'invoice_lines': [('add', invoice_line_id)],
-                    }, context=context)
+                    })
 
-        invoice_obj.update_taxes(cursor, 0, [invoice_id], context=ctx)
+        with Transaction().set_user(0, set_context=True):
+            invoice_obj.update_taxes([invoice_id])
 
-        self.write(cursor, user, purchase_id, {
+        self.write(purchase_id, {
             'invoices': [('add', invoice_id)],
-        }, context=context)
+        })
         return invoice_id
 
-    def create_move(self, cursor, user, purchase_id, context=None):
+    def create_move(self, purchase_id):
         '''
         Create move for each purchase lines
         '''
         line_obj = self.pool.get('purchase.line')
 
-        purchase = self.browse(cursor, user, purchase_id, context=context)
+        purchase = self.browse(purchase_id)
         for line in purchase.lines:
-            line_obj.create_move(cursor, user, line, context=context)
+            line_obj.create_move(line)
 
 Purchase()
 
@@ -934,8 +842,9 @@ class PurchaseLine(ModelSQL, ModelView):
                     'an "account expense" default property!',
             })
 
-    def init(self, cursor, module_name):
-        super(PurchaseLine, self).init(cursor, module_name)
+    def init(self, module_name):
+        super(PurchaseLine, self).init(module_name)
+        cursor = Transaction().cursor
         table = TableHandler(cursor, self, module_name)
 
         # Migration from 1.0 comment change into note
@@ -944,19 +853,19 @@ class PurchaseLine(ModelSQL, ModelView):
                     'SET note = comment')
             table.drop_column('comment', exception=True)
 
-    def default_type(self, cursor, user, context=None):
+    def default_type(self):
         return 'line'
 
-    def default_quantity(self, cursor, user, context=None):
+    def default_quantity(self):
         return 0.0
 
-    def default_unit_price(self, cursor, user, context=None):
+    def default_unit_price(self):
         return Decimal('0.0')
 
-    def get_move_done(self, cursor, user, ids, name, context=None):
+    def get_move_done(self, ids, name):
         uom_obj = self.pool.get('product.uom')
         res = {}
-        for line in self.browse(cursor, user, ids, context=context):
+        for line in self.browse(ids):
             val = True
             if not line.product:
                 res[line.id] = True
@@ -972,17 +881,17 @@ class PurchaseLine(ModelSQL, ModelView):
                         and move.id not in skip_ids:
                     val = False
                     break
-                quantity -= uom_obj.compute_qty(cursor, user, move.uom,
-                     move.quantity, line.unit, context=context)
+                quantity -= uom_obj.compute_qty(move.uom, move.quantity,
+                        line.unit)
             if val:
                 if quantity > 0.0:
                     val = False
             res[line.id] = val
         return res
 
-    def get_move_exception(self, cursor, user, ids, name, context=None):
+    def get_move_exception(self, ids, name):
         res = {}
-        for line in self.browse(cursor, user, ids, context=context):
+        for line in self.browse(ids):
             val = False
             skip_ids = set(x.id for x in line.moves_ignored + \
                                line.moves_recreated)
@@ -994,93 +903,83 @@ class PurchaseLine(ModelSQL, ModelView):
             res[line.id] = val
         return res
 
-    def on_change_with_unit_digits(self, cursor, user, vals, context=None):
+    def on_change_with_unit_digits(self, vals):
         uom_obj = self.pool.get('product.uom')
         if vals.get('unit'):
-            uom = uom_obj.browse(cursor, user, vals['unit'],
-                    context=context)
+            uom = uom_obj.browse(vals['unit'])
             return uom.digits
         return 2
 
-    def get_unit_digits(self, cursor, user, ids, name, context=None):
+    def get_unit_digits(self, ids, name):
         res = {}
-        for line in self.browse(cursor, user, ids, context=context):
+        for line in self.browse(ids):
             if line.unit:
                 res[line.id] = line.unit.digits
             else:
                 res[line.id] = 2
         return res
 
-    def _get_tax_rule_pattern(self, cursor, user, party, vals, context=None):
+    def _get_tax_rule_pattern(self, party, vals):
         '''
         Get tax rule pattern
 
-        :param cursor: the database cursor
-        :param user: the user id
         :param party: the BrowseRecord of the party
         :param vals: a dictionary with value from on_change
-        :param context: the context
         :return: a dictionary to use as pattern for tax rule
         '''
         res = {}
         return res
 
-    def on_change_product(self, cursor, user, vals, context=None):
+    def on_change_product(self, vals):
         party_obj = self.pool.get('party.party')
         product_obj = self.pool.get('product.product')
         uom_obj = self.pool.get('product.uom')
         tax_rule_obj = self.pool.get('account.tax.rule')
 
-        if context is None:
-            context = {}
         if not vals.get('product'):
             return {}
         res = {}
 
-        ctx = context.copy()
+        context = {}
         party = None
         if vals.get('_parent_purchase.party'):
-            party = party_obj.browse(cursor, user, vals['_parent_purchase.party'],
-                    context=context)
+            party = party_obj.browse(vals['_parent_purchase.party'])
             if party.lang:
-                ctx['language'] = party.lang.code
+                context['language'] = party.lang.code
 
-        product = product_obj.browse(cursor, user, vals['product'],
-                context=context)
+        product = product_obj.browse(vals['product'])
 
-        ctx2 = context.copy()
+        context2 = {}
         if vals.get('_parent_purchase.currency'):
-            ctx2['currency'] = vals['_parent_purchase.currency']
+            context2['currency'] = vals['_parent_purchase.currency']
         if vals.get('_parent_purchase.party'):
-            ctx2['supplier'] = vals['_parent_purchase.party']
+            context2['supplier'] = vals['_parent_purchase.party']
         if vals.get('unit'):
-            ctx2['uom'] = vals['unit']
+            context2['uom'] = vals['unit']
         else:
-            ctx2['uom'] = product.purchase_uom.id
-        res['unit_price'] = product_obj.get_purchase_price(cursor, user,
-                [product.id], vals.get('quantity', 0), context=ctx2)[product.id]
+            context2['uom'] = product.purchase_uom.id
+        with Transaction().set_context(context2):
+            res['unit_price'] = product_obj.get_purchase_price([product.id],
+                    vals.get('quantity', 0))[product.id]
         res['taxes'] = []
-        pattern = self._get_tax_rule_pattern(cursor, user, party, vals,
-                context=context)
+        pattern = self._get_tax_rule_pattern(party, vals)
         for tax in product.supplier_taxes_used:
             if party and party.supplier_tax_rule:
-                tax_ids = tax_rule_obj.apply(cursor, user,
-                        party.supplier_tax_rule, tax, pattern,
-                        context=context)
+                tax_ids = tax_rule_obj.apply(party.supplier_tax_rule, tax,
+                        pattern)
                 if tax_ids:
                     res['taxes'].extend(tax_ids)
                 continue
             res['taxes'].append(tax.id)
         if party and party.supplier_tax_rule:
-            tax_ids = tax_rule_obj.apply(cursor, user,
-                    party.supplier_tax_rule, False, pattern,
-                    context=context)
+            tax_ids = tax_rule_obj.apply(party.supplier_tax_rule, False,
+                    pattern)
             if tax_ids:
                 res['taxes'].extend(tax_ids)
 
         if not vals.get('description'):
-            res['description'] = product_obj.browse(cursor, user, product.id,
-                    context=ctx).rec_name
+            with Transaction().set_context(context):
+                res['description'] = product_obj.browse(product.id).rec_name
 
         category = product.purchase_uom.category
         if not vals.get('unit') \
@@ -1092,65 +991,61 @@ class PurchaseLine(ModelSQL, ModelView):
         vals = vals.copy()
         vals['unit_price'] = res['unit_price']
         vals['type'] = 'line'
-        res['amount'] = self.on_change_with_amount(cursor, user, vals,
-                context=context)
+        res['amount'] = self.on_change_with_amount(vals)
         return res
 
-    def on_change_quantity(self, cursor, user, vals, context=None):
+    def on_change_quantity(self, vals):
         product_obj = self.pool.get('product.product')
 
-        if context is None:
-            context = {}
         if not vals.get('product'):
             return {}
         res = {}
 
-        product = product_obj.browse(cursor, user, vals['product'],
-                context=context)
+        product = product_obj.browse(vals['product'])
 
-        ctx2 = context.copy()
+        context = {}
         if vals.get('_parent_purchase.currency'):
-            ctx2['currency'] = vals['_parent_purchase.currency']
+            context['currency'] = vals['_parent_purchase.currency']
         if vals.get('_parent_purchase.party'):
-            ctx2['supplier'] = vals['_parent_purchase.party']
+            context['supplier'] = vals['_parent_purchase.party']
         if vals.get('unit'):
-            ctx2['uom'] = vals['unit']
-        res['unit_price'] = product_obj.get_purchase_price(cursor, user,
-                [vals['product']], vals.get('quantity', 0),
-                context=ctx2)[vals['product']]
+            context['uom'] = vals['unit']
+        with Transaction().set_context(context):
+            res['unit_price'] = product_obj.get_purchase_price(
+                    [vals['product']], vals.get('quantity', 0)
+                    )[vals['product']]
         return res
 
-    def on_change_unit(self, cursor, user, vals, context=None):
-        return self.on_change_quantity(cursor, user, vals, context=context)
+    def on_change_unit(self, vals):
+        return self.on_change_quantity(vals)
 
-    def on_change_with_amount(self, cursor, user, vals, context=None):
+    def on_change_with_amount(self, vals):
         currency_obj = self.pool.get('currency.currency')
         if vals.get('type') == 'line':
             if isinstance(vals.get('_parent_purchase.currency'), (int, long)):
-                currency = currency_obj.browse(cursor, user,
-                        vals['_parent_purchase.currency'], context=context)
+                currency = currency_obj.browse(
+                        vals['_parent_purchase.currency'])
             else:
                 currency = vals['_parent_purchase.currency']
             amount = Decimal(str(vals.get('quantity') or '0.0')) * \
                     (vals.get('unit_price') or Decimal('0.0'))
             if currency:
-                return currency_obj.round(cursor, user, currency, amount)
+                return currency_obj.round(currency, amount)
             return amount
         return Decimal('0.0')
 
-    def get_amount(self, cursor, user, ids, name, context=None):
+    def get_amount(self, ids, name):
         currency_obj = self.pool.get('currency.currency')
         res = {}
-        for line in self.browse(cursor, user, ids, context=context):
+        for line in self.browse(ids):
             if line.type == 'line':
-                res[line.id] = currency_obj.round(cursor, user,
-                        line.purchase.currency,
+                res[line.id] = currency_obj.round(line.purchase.currency,
                         Decimal(str(line.quantity)) * line.unit_price)
             elif line.type == 'subtotal':
                 res[line.id] = Decimal('0.0')
                 for line2 in line.purchase.lines:
                     if line2.type == 'line':
-                        res[line.id] += currency_obj.round(cursor, user,
+                        res[line.id] += currency_obj.round(
                                 line2.purchase.currency,
                                 Decimal(str(line2.quantity)) * line2.unit_price)
                     elif line2.type == 'subtotal':
@@ -1161,14 +1056,11 @@ class PurchaseLine(ModelSQL, ModelView):
                 res[line.id] = Decimal('0.0')
         return res
 
-    def get_invoice_line(self, cursor, user, line, context=None):
+    def get_invoice_line(self, line):
         '''
         Return invoice line values for purchase line
 
-        :param cursor: the database cursor
-        :param user: the user id
         :param line: a BrowseRecord of the purchase line
-        :param context: the context
         :return: a list of invoice line values
         '''
         uom_obj = self.pool.get('product.uom')
@@ -1187,8 +1079,8 @@ class PurchaseLine(ModelSQL, ModelView):
             quantity = 0.0
             for move in line.moves:
                 if move.state == 'done':
-                    quantity += uom_obj.compute_qty(cursor, user, move.uom,
-                            move.quantity, line.unit, context=context)
+                    quantity += uom_obj.compute_qty(move.uom, move.quantity,
+                            line.unit)
 
         if line.purchase.invoices_ignored:
             ignored_ids = set(
@@ -1198,9 +1090,8 @@ class PurchaseLine(ModelSQL, ModelView):
         for invoice_line in line.invoice_lines:
             if invoice_line.invoice.state != 'cancel' or \
                     invoice_line.id in ignored_ids:
-                quantity -= uom_obj.compute_qty(
-                    cursor, user, invoice_line.unit, invoice_line.quantity,
-                    line.unit, context=context)
+                quantity -= uom_obj.compute_qty(invoice_line.unit,
+                        invoice_line.quantity, line.unit)
         res['quantity'] = quantity
 
 
@@ -1213,20 +1104,18 @@ class PurchaseLine(ModelSQL, ModelView):
         if line.product:
             res['account'] = line.product.account_expense_used.id
             if not res['account']:
-                self.raise_user_error(cursor, 'missing_account_expense',
-                        error_args=(line.product.rec_name,), context=context)
+                self.raise_user_error('missing_account_expense',
+                        error_args=(line.product.rec_name,))
         else:
             for model in ('product.template', 'product.category'):
-                res['account'] = property_obj.get(cursor, user,
-                        'account_expense', model, context=context)
+                res['account'] = property_obj.get('account_expense', model)
                 if res['account']:
                     break
             if not res['account']:
-                self.raise_user_error(cursor,
-                        'missing_account_expense_property', context=context)
+                self.raise_user_error('missing_account_expense_property')
         return [res]
 
-    def copy(self, cursor, user, ids, default=None, context=None):
+    def copy(self, ids, default=None):
         if default is None:
             default = {}
         default = default.copy()
@@ -1234,10 +1123,9 @@ class PurchaseLine(ModelSQL, ModelView):
         default['moves_ignored'] = False
         default['moves_recreated'] = False
         default['invoice_lines'] = False
-        return super(PurchaseLine, self).copy(cursor, user, ids,
-                default=default, context=context)
+        return super(PurchaseLine, self).copy(ids, default=default)
 
-    def create_move(self, cursor, user, line, context=None):
+    def create_move(self, line):
         '''
         Create move line
         '''
@@ -1245,9 +1133,6 @@ class PurchaseLine(ModelSQL, ModelView):
         uom_obj = self.pool.get('product.uom')
         product_supplier_obj = self.pool.get('purchase.product_supplier')
 
-        if context is None:
-            context = {}
-
         vals = {}
         if line.type != 'line':
             return
@@ -1259,13 +1144,12 @@ class PurchaseLine(ModelSQL, ModelView):
         quantity = line.quantity
         for move in line.moves:
             if move.id not in skip_ids:
-                quantity -= uom_obj.compute_qty(cursor, user, move.uom,
-                        move.quantity, line.unit, context=context)
+                quantity -= uom_obj.compute_qty(move.uom, move.quantity,
+                        line.unit)
         if quantity <= 0.0:
             return
         if not line.purchase.party.supplier_location:
-            self.raise_user_error(cursor, 'supplier_location_required',
-                    context=context)
+            self.raise_user_error('supplier_location_required')
         vals['quantity'] = quantity
         vals['uom'] = line.unit.id
         vals['product'] = line.product.id
@@ -1281,18 +1165,16 @@ class PurchaseLine(ModelSQL, ModelView):
                 if product_supplier.party.id == line.purchase.party.id:
                     vals['planned_date'] = \
                             product_supplier_obj.compute_supply_date(
-                                    cursor, user, product_supplier,
-                                    date=line.purchase.purchase_date,
-                                    context=context)[0]
+                                    product_supplier,
+                                    date=line.purchase.purchase_date)[0]
                     break
 
-        ctx = context.copy()
-        ctx['user'] = user
-        move_id = move_obj.create(cursor, 0, vals, context=ctx)
+        with Transaction().set_user(0, set_context=True):
+            move_id = move_obj.create(vals)
 
-        self.write(cursor, 0, line.id, {
-            'moves': [('add', move_id)],
-        }, context=ctx)
+            self.write(line.id, {
+                'moves': [('add', move_id)],
+            })
         return move_id
 
 PurchaseLine()
@@ -1405,23 +1287,17 @@ class Template(ModelSQL, ModelView):
             self.account_expense.depends.append('purchasable')
         self._reset_columns()
 
-    def default_purchasable(self, cursor, user, context=None):
-        if context is None:
-            context = {}
-        if context.get('purchasable'):
-            return True
-        return False
+    def default_purchasable(self):
+        return Transaction().context.get('purchasable') or False
 
-    def on_change_with_purchase_uom(self, cursor, user, vals, context=None):
+    def on_change_with_purchase_uom(self, vals):
         uom_obj = self.pool.get('product.uom')
         res = False
 
         if vals.get('default_uom'):
-            default_uom = uom_obj.browse(cursor, user, vals['default_uom'],
-                    context=context)
+            default_uom = uom_obj.browse(vals['default_uom'])
             if vals.get('purchase_uom'):
-                purchase_uom = uom_obj.browse(cursor, user, vals['purchase_uom'],
-                        context=context)
+                purchase_uom = uom_obj.browse(vals['purchase_uom'])
                 if default_uom.category.id == purchase_uom.category.id:
                     res = purchase_uom.id
                 else:
@@ -1430,9 +1306,9 @@ class Template(ModelSQL, ModelView):
                 res = default_uom.id
         return res
 
-    def write(self, cursor, user, ids, vals, context=None):
+    def write(self, ids, vals):
         if vals.get("purchase_uom"):
-            templates = self.browse(cursor, user, ids, context=context)
+            templates = self.browse(ids)
             for template in templates:
                 if not template.purchase_uom:
                     continue
@@ -1442,10 +1318,10 @@ class Template(ModelSQL, ModelView):
                     if not product.product_suppliers:
                         continue
                     self.raise_user_warning(
-                        cursor, user, '%s at product_template' % template.id,
-                        'change_purchase_uom')
+                            '%s at product_template' % template.id,
+                            'change_purchase_uom')
 
-        super(Template, self).write(cursor, user, ids, vals, context=context)
+        return super(Template, self).write(ids, vals)
 
 Template()
 
@@ -1453,64 +1329,55 @@ Template()
 class Product(ModelSQL, ModelView):
     _name = 'product.product'
 
-    def get_purchase_price(self, cursor, user, ids, quantity=0, context=None):
+    def get_purchase_price(self, ids, quantity=0):
         '''
         Return purchase price for product ids.
-
-        :param cursor: the database cursor
-        :param user: the user id
-        :param ids: the product ids
-        :param quantity: the quantity of products
-        :param context: the context that can have as keys:
+        The context that can have as keys:
             uom: the unit of measure
             supplier: the supplier party id
             currency: the currency id for the returned price
+
+        :param ids: the product ids
+        :param quantity: the quantity of products
         :return: a dictionary with for each product ids keys the computed price
         '''
         uom_obj = self.pool.get('product.uom')
         user_obj = self.pool.get('res.user')
         currency_obj = self.pool.get('currency.currency')
 
-        if context is None:
-            context = {}
-
         res = {}
 
         uom = None
-        if context.get('uom'):
-            uom = uom_obj.browse(cursor, user, context['uom'],
-                    context=context)
+        if Transaction().context.get('uom'):
+            uom = uom_obj.browse(Transaction().context['uom'])
 
         currency = None
-        if context.get('currency'):
-            currency = currency_obj.browse(cursor, user, context['currency'],
-                    context=context)
+        if Transaction().context.get('currency'):
+            currency = currency_obj.browse(Transaction().context['currency'])
 
-        user2 = user_obj.browse(cursor, user, user, context=context)
+        user = user_obj.browse(Transaction().user)
 
-        for product in self.browse(cursor, user, ids, context=context):
+        for product in self.browse(ids):
             res[product.id] = product.cost_price
             default_uom = product.default_uom
             if not uom:
                 uom = default_uom
-            if context.get('supplier') and product.product_suppliers:
-                supplier_id = context['supplier']
+            if Transaction().context.get('supplier') and product.product_suppliers:
+                supplier_id = Transaction().context['supplier']
                 for product_supplier in product.product_suppliers:
                     if product_supplier.party.id == supplier_id:
                         for price in product_supplier.prices:
-                            if uom_obj.compute_qty(cursor, user,
-                                    product.purchase_uom, price.quantity, uom,
-                                    context=context) <= quantity:
+                            if uom_obj.compute_qty(product.purchase_uom,
+                                    price.quantity, uom) <= quantity:
                                 res[product.id] = price.unit_price
                                 default_uom = product.purchase_uom
                         break
-            res[product.id] = uom_obj.compute_price(cursor, user,
-                    default_uom, res[product.id], uom, context=context)
-            if currency and user2.company:
-                if user2.company.currency.id != currency.id:
-                    res[product.id] = currency_obj.compute(cursor, user,
-                            user2.company.currency, res[product.id],
-                            currency, context=context)
+            res[product.id] = uom_obj.compute_price(default_uom,
+                    res[product.id], uom)
+            if currency and user.company:
+                if user.company.currency.id != currency.id:
+                    res[product.id] = currency_obj.compute(
+                            user.company.currency, res[product.id], currency)
         return res
 
 Product()
@@ -1543,50 +1410,38 @@ class ProductSupplier(ModelSQL, ModelView):
         super(ProductSupplier, self).__init__()
         self._order.insert(0, ('sequence', 'ASC'))
 
-    def default_company(self, cursor, user, context=None):
-        if context is None:
-            context = {}
-        if context.get('company'):
-            return context['company']
-        return False
+    def default_company(self):
+        return Transaction().context.get('company') or False
 
-    def compute_supply_date(self, cursor, user, product_supplier, date=None,
-            context=None):
+    def compute_supply_date(self, product_supplier, date=None):
         '''
         Compute the supply date for the Product Supplier at the given date
             and the next supply date
 
-        :param cursor: the database cursor
-        :param user: the user id
         :param product_supplier: a BrowseRecord of the Product Supplier
         :param date: the date of the purchase if None the current date
-        :param context: the context
         :return: a tuple with the supply date and the next one
         '''
         date_obj = self.pool.get('ir.date')
 
         if not date:
-            date = date_obj.today(cursor, user, context=context)
+            date = date_obj.today()
         next_date = date + datetime.timedelta(1)
         return (date + datetime.timedelta(product_supplier.delivery_time),
                 next_date + datetime.timedelta(product_supplier.delivery_time))
 
-    def compute_purchase_date(self, cursor, user, product_supplier, date,
-            context=None):
+    def compute_purchase_date(self, product_supplier, date):
         '''
         Compute the purchase date for the Product Supplier at the given date
 
-        :param cursor: the database cursor
-        :param user: the user id
         :param product_supplier: a BrowseRecord of the Product Supplier
         :param date: the date of the supply
-        :param context: the context
         :return: the purchase date
         '''
         date_obj = self.pool.get('ir.date')
 
         if not product_supplier.delivery_time:
-            return date_obj.today(cursor, user, context=context)
+            return date_obj.today()
         return date - datetime.timedelta(product_supplier.delivery_time)
 
 ProductSupplier()
@@ -1606,15 +1461,12 @@ class ProductSupplierPrice(ModelSQL, ModelView):
         super(ProductSupplierPrice, self).__init__()
         self._order.insert(0, ('quantity', 'ASC'))
 
-    def default_currency(self, cursor, user, context=None):
+    def default_currency(self):
         company_obj = self.pool.get('company.company')
         currency_obj = self.pool.get('currency.currency')
-        if context is None:
-            context = {}
         company = None
-        if context.get('company'):
-            company = company_obj.browse(cursor, user, context['company'],
-                    context=context)
+        if Transaction().context.get('company'):
+            company = company_obj.browse(Transaction().context['company'])
             return company.currency.id
         return False
 
@@ -1646,42 +1498,40 @@ class ShipmentIn(ModelSQL, ModelView):
                     'by a purchase.',
             })
 
-    def write(self, cursor, user, ids, vals, context=None):
+    def write(self, ids, vals):
         purchase_obj = self.pool.get('purchase.purchase')
         purchase_line_obj = self.pool.get('purchase.line')
 
-        res = super(ShipmentIn, self).write(cursor, user, ids, vals,
-                context=context)
+        res = super(ShipmentIn, self).write(ids, vals)
 
         if 'state' in vals and vals['state'] in ('received', 'cancel'):
             purchase_ids = []
             move_ids = []
             if isinstance(ids, (int, long)):
                 ids = [ids]
-            for shipment in self.browse(cursor, user, ids, context=context):
+            for shipment in self.browse(ids):
                 move_ids.extend([x.id for x in shipment.incoming_moves])
 
-            purchase_line_ids = purchase_line_obj.search(cursor, user, [
+            purchase_line_ids = purchase_line_obj.search([
                 ('moves', 'in', move_ids),
-                ], context=context)
+                ])
             if purchase_line_ids:
-                for purchase_line in purchase_line_obj.browse(cursor, user,
-                        purchase_line_ids, context=context):
+                for purchase_line in purchase_line_obj.browse(
+                        purchase_line_ids):
                     if purchase_line.purchase.id not in purchase_ids:
                         purchase_ids.append(purchase_line.purchase.id)
 
-            purchase_obj.workflow_trigger_validate(cursor, user, purchase_ids,
-                    'shipment_update', context=context)
+            purchase_obj.workflow_trigger_validate(purchase_ids,
+                    'shipment_update')
         return res
 
-    def button_draft(self, cursor, user, ids, context=None):
-        for shipment in self.browse(cursor, user, ids, context=context):
+    def button_draft(self, ids):
+        for shipment in self.browse(ids):
             for move in shipment.incoming_moves:
                 if move.state == 'cancel' and move.purchase_line:
-                    self.raise_user_error(cursor, 'reset_move')
+                    self.raise_user_error('reset_move')
 
-        return super(ShipmentIn, self).button_draft(
-            cursor, user, ids, context=context)
+        return super(ShipmentIn, self).button_draft(ids)
 
 ShipmentIn()
 
@@ -1726,18 +1576,17 @@ class Move(ModelSQL, ModelView):
         ('recreated', 'Recreated'),
         ], 'Exception State'), 'get_purchase_exception_state')
 
-    def get_purchase(self, cursor, user, ids, name, context=None):
+    def get_purchase(self, ids, name):
         res = {}
-        for move in self.browse(cursor, user, ids, context=context):
+        for move in self.browse(ids):
             res[move.id] = False
             if move.purchase_line:
                 res[move.id] = move.purchase_line.purchase.id
         return res
 
-    def get_purchase_exception_state(self, cursor, user, ids, name,
-            context=None):
+    def get_purchase_exception_state(self, ids, name):
         res = {}.fromkeys(ids, '')
-        for move in self.browse(cursor, user, ids, context=context):
+        for move in self.browse(ids):
             if not move.purchase_line:
                 continue
             if move.id in (x.id for x in move.purchase_line.moves_recreated):
@@ -1746,15 +1595,15 @@ class Move(ModelSQL, ModelView):
                 res[move.id] = 'ignored'
         return res
 
-    def search_purchase(self, cursor, user, name, clause, context=None):
+    def search_purchase(self, name, clause):
         return [('purchase_line.' + name,) + clause[1:]]
 
-    def get_purchase_fields(self, cursor, user, ids, names, context=None):
+    def get_purchase_fields(self, ids, names):
         res = {}
         for name in names:
             res[name] = {}
 
-        for move in self.browse(cursor, user, ids, context=context):
+        for move in self.browse(ids):
             for name in res.keys():
                 if name[9:] == 'quantity':
                     res[name][move.id] = 0.0
@@ -1773,67 +1622,62 @@ class Move(ModelSQL, ModelView):
                         res[name][move.id] = move.purchase_line[name[9:]].id
         return res
 
-    def default_purchase_visible(self, cursor, user, context=None):
-        from_location = self.default_from_location(cursor, user,
-                context=context)
+    def default_purchase_visible(self):
+        from_location = self.default_from_location()
         vals = {
             'from_location': from_location,
         }
-        return self.on_change_with_purchase_visible(cursor, user, vals,
-                context=context)
+        return self.on_change_with_purchase_visible(vals)
 
-    def on_change_with_purchase_visible(self, cursor, user, vals,
-            context=None):
+    def on_change_with_purchase_visible(self, vals):
         location_obj = self.pool.get('stock.location')
         if vals.get('from_location'):
-            from_location = location_obj.browse(cursor, user,
-                    vals['from_location'], context=context)
+            from_location = location_obj.browse(vals['from_location'])
             if from_location.type == 'supplier':
                 return True
         return False
 
-    def get_purchase_visible(self, cursor, user, ids, name, context=None):
+    def get_purchase_visible(self, ids, name):
         res = {}
-        for move in self.browse(cursor, user, ids, context=context):
+        for move in self.browse(ids):
             res[move.id] = False
             if move.from_location.type == 'supplier':
                 res[move.id] = True
         return res
 
-    def get_supplier(self, cursor, user, ids, name, context=None):
+    def get_supplier(self, ids, name):
         res = {}
-        for move in self.browse(cursor, user, ids, context=context):
+        for move in self.browse(ids):
             res[move.id] = False
             if move.purchase_line:
                 res[move.id] = move.purchase_line.purchase.party.id
         return res
 
-    def search_supplier(self, cursor, user, name, clause, context=None):
+    def search_supplier(self, name, clause):
         return [('purchase_line.purchase.party',) + clause[1:]]
 
-    def write(self, cursor, user, ids, vals, context=None):
+    def write(self, ids, vals):
         purchase_obj = self.pool.get('purchase.purchase')
         purchase_line_obj = self.pool.get('purchase.line')
 
-        res = super(Move, self).write(cursor, user, ids, vals,
-                context=context)
+        res = super(Move, self).write(ids, vals)
         if 'state' in vals and vals['state'] in ('cancel',):
             if isinstance(ids, (int, long)):
                 ids = [ids]
             purchase_ids = set()
-            purchase_line_ids = purchase_line_obj.search(cursor, user, [
+            purchase_line_ids = purchase_line_obj.search([
                 ('moves', 'in', ids),
-                ], context=context)
+                ])
             if purchase_line_ids:
-                for purchase_line in purchase_line_obj.browse(cursor, user,
-                        purchase_line_ids, context=context):
+                for purchase_line in purchase_line_obj.browse(
+                        purchase_line_ids):
                     purchase_ids.add(purchase_line.purchase.id)
             if purchase_ids:
-                purchase_obj.workflow_trigger_validate(cursor, user,
-                        list(purchase_ids), 'shipment_update', context=context)
+                purchase_obj.workflow_trigger_validate(list(purchase_ids),
+                        'shipment_update')
         return res
 
-    def delete(self, cursor, user, ids, context=None):
+    def delete(self, ids):
         purchase_obj = self.pool.get('purchase.purchase')
         purchase_line_obj = self.pool.get('purchase.line')
 
@@ -1841,19 +1685,18 @@ class Move(ModelSQL, ModelView):
             ids = [ids]
 
         purchase_ids = set()
-        purchase_line_ids = purchase_line_obj.search(cursor, user, [
+        purchase_line_ids = purchase_line_obj.search([
             ('moves', 'in', ids),
-            ], context=context)
+            ])
 
-        res = super(Move, self).delete(cursor, user, ids, context=context)
+        res = super(Move, self).delete(ids)
 
         if purchase_line_ids:
-            for purchase_line in purchase_line_obj.browse(cursor, user,
-                    purchase_line_ids, context=context):
+            for purchase_line in purchase_line_obj.browse(purchase_line_ids):
                 purchase_ids.add(purchase_line.purchase.id)
             if purchase_ids:
-                purchase_obj.workflow_trigger_validate(cursor, user,
-                        list(purchase_ids), 'shipment_update', context=context)
+                purchase_obj.workflow_trigger_validate(list(purchase_ids),
+                        'shipment_update')
         return res
 Move()
 
@@ -1876,31 +1719,30 @@ class Invoice(ModelSQL, ModelView):
                         'an invoice generated by a purchase.',
             })
 
-    def button_draft(self, cursor, user, ids, context=None):
+    def button_draft(self, ids):
         purchase_obj = self.pool.get('purchase.purchase')
-        purchase_ids = purchase_obj.search(
-            cursor, user, [('invoices', 'in', ids)], context=context)
+        purchase_ids = purchase_obj.search([
+            ('invoices', 'in', ids),
+            ])
 
         if purchase_ids:
-            self.raise_user_error(cursor, 'reset_invoice_purchase')
+            self.raise_user_error('reset_invoice_purchase')
 
-        return super(Invoice, self).button_draft(
-            cursor, user, ids, context=context)
+        return super(Invoice, self).button_draft(ids)
 
-    def get_purchase_exception_state(self, cursor, user, ids, name,
-            context=None):
+    def get_purchase_exception_state(self, ids, name):
         purchase_obj = self.pool.get('purchase.purchase')
-        purchase_ids = purchase_obj.search(
-            cursor, user, [('invoices', 'in', ids)], context=context)
+        purchase_ids = purchase_obj.search([
+            ('invoices', 'in', ids),
+            ])
 
-        purchases = purchase_obj.browse(
-            cursor, user, purchase_ids, context=context)
+        purchases = purchase_obj.browse(purchase_ids)
 
         recreated_ids = tuple(i.id for p in purchases for i in p.invoices_recreated)
         ignored_ids = tuple(i.id for p in purchases for i in p.invoices_ignored)
 
         res = {}.fromkeys(ids, '')
-        for invoice in self.browse(cursor, user, ids, context=context):
+        for invoice in self.browse(ids):
             if invoice.id in recreated_ids:
                 res[invoice.id] = 'recreated'
             elif invoice.id in ignored_ids:
@@ -1908,7 +1750,8 @@ class Invoice(ModelSQL, ModelView):
 
         return res
 
-    def delete(self, cursor, user, ids, context=None):
+    def delete(self, ids):
+        cursor = Transaction().cursor
         if not ids:
             return True
         if isinstance(ids, (int, long)):
@@ -1917,10 +1760,8 @@ class Invoice(ModelSQL, ModelView):
                 'WHERE invoice IN (' + ','.join(('%s',) * len(ids)) + ')',
                 ids)
         if cursor.fetchone():
-            self.raise_user_error(cursor, 'delete_purchase_invoice',
-                    context=context)
-        return super(Invoice, self).delete(cursor, user, ids,
-                context=context)
+            self.raise_user_error('delete_purchase_invoice')
+        return super(Invoice, self).delete(ids)
 
 Invoice()
 
@@ -1938,27 +1779,26 @@ class OpenSupplier(Wizard):
         },
     }
 
-    def _action_open(self, cursor, user, datas, context=None):
+    def _action_open(self, datas):
         model_data_obj = self.pool.get('ir.model.data')
         act_window_obj = self.pool.get('ir.action.act_window')
         wizard_obj = self.pool.get('ir.action.wizard')
-        act_window_id = model_data_obj.get_id(cursor, user, 'party',
-                'act_party_form', context=context)
-        res = act_window_obj.read(cursor, user, act_window_id, context=context)
+        cursor = Transaction().cursor
+
+        act_window_id = model_data_obj.get_id('party', 'act_party_form')
+        res = act_window_obj.read(act_window_id)
         cursor.execute("SELECT DISTINCT(party) FROM purchase_purchase")
         supplier_ids = [line[0] for line in cursor.fetchall()]
         res['pyson_domain'] = PYSONEncoder().encode(
                 [('id', 'in', supplier_ids)])
 
-        model_data_ids = model_data_obj.search(cursor, user, [
+        model_data_ids = model_data_obj.search([
             ('fs_id', '=', 'act_open_supplier'),
             ('module', '=', 'purchase'),
             ('inherit', '=', False),
-            ], limit=1, context=context)
-        model_data = model_data_obj.browse(cursor, user, model_data_ids[0],
-                context=context)
-        wizard = wizard_obj.browse(cursor, user, model_data.db_id,
-                context=context)
+            ], limit=1)
+        model_data = model_data_obj.browse(model_data_ids[0])
+        wizard = wizard_obj.browse(model_data.db_id)
 
         res['name'] = wizard.name
         return res
@@ -1979,27 +1819,28 @@ class HandleShipmentExceptionAsk(ModelView):
     domain_moves = fields.Many2Many(
         'stock.move', None, None, 'Domain Moves')
 
-    def init(self, cursor, module_name):
+    def init(self, module_name):
+        cursor = Transaction().cursor
         # Migration from 1.2: packing renamed into shipment
         cursor.execute("UPDATE ir_model "\
                 "SET model = REPLACE(model, 'packing', 'shipment') "\
                 "WHERE model like '%%packing%%' AND module = %s",
                 (module_name,))
-        super(HandleShipmentExceptionAsk, self).init(cursor, module_name)
+        super(HandleShipmentExceptionAsk, self).init(module_name)
 
-    def default_recreate_moves(self, cursor, user, context=None):
-        return self.default_domain_moves(cursor, user, context=context)
+    def default_recreate_moves(self):
+        return self.default_domain_moves()
 
-    def default_domain_moves(self, cursor, user, context=None):
+    def default_domain_moves(self):
         purchase_line_obj = self.pool.get('purchase.line')
-        active_id = context and context.get('active_id')
+        active_id = Transaction().context.get('active_id')
         if not active_id:
             return []
 
-        line_ids = purchase_line_obj.search(
-            cursor, user, [('purchase', '=', active_id)],
-            context=context)
-        lines = purchase_line_obj.browse(cursor, user, line_ids, context=context)
+        line_ids = purchase_line_obj.search([
+            ('purchase', '=', active_id),
+            ])
+        lines = purchase_line_obj.browse(line_ids)
 
         domain_moves = []
         for line in lines:
@@ -2037,17 +1878,17 @@ class HandleShipmentException(Wizard):
         },
     }
 
-    def _handle_moves(self, cursor, user, data, context=None):
+    def _handle_moves(self, data):
         purchase_obj = self.pool.get('purchase.purchase')
         purchase_line_obj = self.pool.get('purchase.line')
         move_obj = self.pool.get('stock.move')
         to_recreate = data['form']['recreate_moves'][0][1]
         domain_moves = data['form']['domain_moves'][0][1]
 
-        line_ids = purchase_line_obj.search(
-            cursor, user, [('purchase', '=', data['id'])],
-            context=context)
-        lines = purchase_line_obj.browse(cursor, user, line_ids, context=context)
+        line_ids = purchase_line_obj.search([
+            ('purchase', '=', data['id']),
+            ])
+        lines = purchase_line_obj.browse(line_ids)
 
         for line in lines:
             moves_ignored = []
@@ -2062,14 +1903,12 @@ class HandleShipmentException(Wizard):
                 else:
                     moves_ignored.append(move.id)
 
-            purchase_line_obj.write(
-                cursor, user, line.id,
-                {'moves_ignored': [('add', moves_ignored)],
-                 'moves_recreated': [('add', moves_recreated)]},
-                context=context)
+            purchase_line_obj.write(line.id, {
+                'moves_ignored': [('add', moves_ignored)],
+                'moves_recreated': [('add', moves_recreated)],
+                })
 
-        purchase_obj.workflow_trigger_validate(cursor, user, data['id'],
-                'shipment_ok', context=context)
+        purchase_obj.workflow_trigger_validate(data['id'], 'shipment_ok')
 
 HandleShipmentException()
 
@@ -2088,17 +1927,16 @@ class HandleInvoiceExceptionAsk(ModelView):
     domain_invoices = fields.Many2Many(
         'account.invoice', None, None, 'Domain Invoices')
 
-    def default_recreate_invoices(self, cursor, user, context=None):
-        return self.default_domain_invoices(cursor, user, context=context)
+    def default_recreate_invoices(self):
+        return self.default_domain_invoices()
 
-    def default_domain_invoices(self, cursor, user, context=None):
+    def default_domain_invoices(self):
         purchase_obj = self.pool.get('purchase.purchase')
-        active_id = context and context.get('active_id')
+        active_id = Transaction().context.get('active_id')
         if not active_id:
             return []
 
-        purchase = purchase_obj.browse(
-            cursor, user, active_id, context=context)
+        purchase = purchase_obj.browse(active_id)
         skip_ids = set(x.id for x in purchase.invoices_ignored)
         skip_ids.update(x.id for x in purchase.invoices_recreated)
         domain_invoices = []
@@ -2135,13 +1973,13 @@ class HandleInvoiceException(Wizard):
         },
     }
 
-    def _handle_invoices(self, cursor, user, data, context=None):
+    def _handle_invoices(self, data):
         purchase_obj = self.pool.get('purchase.purchase')
         invoice_obj = self.pool.get('account.invoice')
         to_recreate = data['form']['recreate_invoices'][0][1]
         domain_invoices = data['form']['domain_invoices'][0][1]
 
-        purchase = purchase_obj.browse(cursor, user, data['id'], context=context)
+        purchase = purchase_obj.browse(data['id'])
 
         skip_ids = set(x.id for x in purchase.invoices_ignored)
         skip_ids.update(x.id for x in purchase.invoices_recreated)
@@ -2155,13 +1993,11 @@ class HandleInvoiceException(Wizard):
             else:
                 invoices_ignored.append(invoice.id)
 
-        purchase_obj.write(
-            cursor, user, purchase.id,
-            {'invoices_ignored': [('add', invoices_ignored)],
-             'invoices_recreated': [('add', invoices_recreated)],},
-            context=context)
+        purchase_obj.write(purchase.id, {
+            'invoices_ignored': [('add', invoices_ignored)],
+            'invoices_recreated': [('add', invoices_recreated)],
+            })
 
-        purchase_obj.workflow_trigger_validate(cursor, user, data['id'],
-                'invoice_ok', context=context)
+        purchase_obj.workflow_trigger_validate(data['id'], 'invoice_ok')
 
 HandleInvoiceException()
diff --git a/purchase.xml b/purchase.xml
index b9758c1..30de1e6 100644
--- a/purchase.xml
+++ b/purchase.xml
@@ -15,6 +15,10 @@ this repository contains the full copyright notices and license terms. -->
             <field name="groups"
                 eval="[('add', ref('group_purchase')), ('add', ref('group_purchase_admin'))]"/>
         </record>
+        <record model="res.user" id="res.user_trigger">
+            <field name="groups"
+                eval="[('add', ref('group_purchase')), ('add', ref('group_purchase_admin'))]"/>
+        </record>
 
         <!-- set active for 1.4 migration -->
         <menuitem name="Configuration" parent="menu_purchase"
diff --git a/tests/test_purchase.py b/tests/test_purchase.py
index 517f1a8..4457cfa 100644
--- a/tests/test_purchase.py
+++ b/tests/test_purchase.py
@@ -25,7 +25,7 @@ class PurchaseTestCase(unittest.TestCase):
         '''
         Test views.
         '''
-        self.assertRaises(Exception, test_view('purchase'))
+        test_view('purchase')
 
 def suite():
     suite = trytond.tests.test_tryton.suite()
diff --git a/trytond_purchase.egg-info/PKG-INFO b/trytond_purchase.egg-info/PKG-INFO
index 2eb6ed0..b9ec68b 100644
--- a/trytond_purchase.egg-info/PKG-INFO
+++ b/trytond_purchase.egg-info/PKG-INFO
@@ -1,6 +1,6 @@
 Metadata-Version: 1.0
 Name: trytond-purchase
-Version: 1.6.0
+Version: 1.8.0
 Summary: Define purchase order.
 Add product supplier and purchase informations.
 Define the purchase price as the supplier price or the cost price.
@@ -16,7 +16,7 @@ Home-page: http://www.tryton.org/
 Author: B2CK
 Author-email: info at b2ck.com
 License: GPL-3
-Download-URL: http://downloads.tryton.org/1.6/
+Download-URL: http://downloads.tryton.org/1.8/
 Description: UNKNOWN
 Platform: UNKNOWN
 Classifier: Development Status :: 5 - Production/Stable
diff --git a/trytond_purchase.egg-info/requires.txt b/trytond_purchase.egg-info/requires.txt
index 917bf70..df87b5a 100644
--- a/trytond_purchase.egg-info/requires.txt
+++ b/trytond_purchase.egg-info/requires.txt
@@ -1,9 +1,9 @@
-trytond_company >= 1.6, < 1.7
-trytond_party >= 1.6, < 1.7
-trytond_stock >= 1.6, < 1.7
-trytond_account >= 1.6, < 1.7
-trytond_product >= 1.6, < 1.7
-trytond_account_invoice >= 1.6, < 1.7
-trytond_currency >= 1.6, < 1.7
-trytond_account_product >= 1.6, < 1.7
-trytond >= 1.6, < 1.7
\ No newline at end of file
+trytond_company >= 1.8, < 1.9
+trytond_party >= 1.8, < 1.9
+trytond_stock >= 1.8, < 1.9
+trytond_account >= 1.8, < 1.9
+trytond_product >= 1.8, < 1.9
+trytond_account_invoice >= 1.8, < 1.9
+trytond_currency >= 1.8, < 1.9
+trytond_account_product >= 1.8, < 1.9
+trytond >= 1.8, < 1.9
\ No newline at end of file
commit 82d625abab901ccffbc25a5d63451ece3da67133
Author: Mathias Behrle <mathiasb at mbsolutions.selfip.biz>
Date:   Thu May 13 20:41:37 2010 +0200

    Adding upstream version 1.6.0.

diff --git a/CHANGELOG b/CHANGELOG
index 792a793..62723b3 100644
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -1,8 +1,7 @@
-Version 1.4.2 - 2010-02-17
-* Some bug fixes (see mercurial logs for details)
-
-Version 1.4.1 - 2009-11-24
-* Some bug fixes (see mercurial logs for details)
+Version 1.6.0 - 2010-05-13
+* Bug fixes (see mercurial logs for details)
+* Use model singleton to define which purchase sequence to use
+* Add default search value on purchase
 
 Version 1.4.0 - 2009-10-19
 * Bug fixes (see mercurial logs for details)
diff --git a/MANIFEST.in b/MANIFEST.in
index b2a140e..dcb2afa 100644
--- a/MANIFEST.in
+++ b/MANIFEST.in
@@ -7,5 +7,4 @@ include LICENSE
 include *.xml
 include *.odt
 include *.csv
-include tests/*
 include doc/*
diff --git a/PKG-INFO b/PKG-INFO
index 04ee24c..157ee5a 100644
--- a/PKG-INFO
+++ b/PKG-INFO
@@ -1,6 +1,6 @@
 Metadata-Version: 1.0
 Name: trytond_purchase
-Version: 1.4.2
+Version: 1.6.0
 Summary: Define purchase order.
 Add product supplier and purchase informations.
 Define the purchase price as the supplier price or the cost price.
@@ -16,7 +16,7 @@ Home-page: http://www.tryton.org/
 Author: B2CK
 Author-email: info at b2ck.com
 License: GPL-3
-Download-URL: http://downloads.tryton.org/1.4/
+Download-URL: http://downloads.tryton.org/1.6/
 Description: UNKNOWN
 Platform: UNKNOWN
 Classifier: Development Status :: 5 - Production/Stable
diff --git a/__init__.py b/__init__.py
index 5720822..35ed4f7 100644
--- a/__init__.py
+++ b/__init__.py
@@ -2,3 +2,4 @@
 #this repository contains the full copyright notices and license terms.
 
 from purchase import *
+from configuration import *
diff --git a/__tryton__.py b/__tryton__.py
index b42ba68..4dacfb9 100644
--- a/__tryton__.py
+++ b/__tryton__.py
@@ -6,7 +6,7 @@
     'name_es_CO': 'Compras',
     'name_es_ES': 'Compras',
     'name_fr_FR': 'Achat',
-    'version': '1.4.2',
+    'version': '1.6.0',
     'author': 'B2CK',
     'email': 'info at b2ck.com',
     'website': 'http://www.tryton.org/',
@@ -81,6 +81,7 @@ Avec la possibilité:
     ],
     'xml': [
         'purchase.xml',
+        'configuration.xml',
         'party.xml',
     ],
     'translation': [
diff --git a/configuration.py b/configuration.py
new file mode 100644
index 0000000..7c49444
--- /dev/null
+++ b/configuration.py
@@ -0,0 +1,18 @@
+#This file is part of Tryton.  The COPYRIGHT file at the top level of
+#this repository contains the full copyright notices and license terms.
+from trytond.model import ModelView, ModelSQL, ModelSingleton, fields
+from trytond.pyson import Eval
+
+
+class Configuration(ModelSingleton, ModelSQL, ModelView):
+    'Purchase Configuration'
+    _name = 'purchase.configuration'
+    _description = __doc__
+
+    purchase_sequence = fields.Property(fields.Many2One('ir.sequence',
+        'Purchase Reference Sequence', domain=[
+            ('company', 'in', [Eval('company'), False]),
+            ('code', '=', 'purchase.purchase'),
+        ], required=True))
+
+Configuration()
diff --git a/configuration.xml b/configuration.xml
new file mode 100644
index 0000000..91c7ed6
--- /dev/null
+++ b/configuration.xml
@@ -0,0 +1,40 @@
+<?xml version="1.0"?>
+<!-- This file is part of Tryton.  The COPYRIGHT file at the top level of
+this repository contains the full copyright notices and license terms. -->
+<tryton>
+    <data>
+        <record model="ir.ui.view" id="purchase_configuration_view_form">
+            <field name="model">purchase.configuration</field>
+            <field name="type">form</field>
+            <field name="arch" type="xml">
+                <![CDATA[
+                <form string="Purchase Configuration">
+                    <label name="purchase_sequence"/>
+                    <field name="purchase_sequence"/>
+                </form>
+                ]]>
+            </field>
+        </record>
+        <record model="ir.action.act_window" id="act_purchase_configuration_form">
+            <field name="name">Purchase Configuration</field>
+            <field name="res_model">purchase.configuration</field>
+            <field name="view_type">form</field>
+        </record>
+        <record model="ir.action.act_window.view"
+            id="act_purchase_configuration_view1">
+            <field name="sequence" eval="1"/>
+            <field name="view" ref="purchase_configuration_view_form"/>
+            <field name="act_window" ref="act_purchase_configuration_form"/>
+        </record>
+        <menuitem parent="menu_configuration"
+            action="act_purchase_configuration_form"
+            id="menu_purchase_configuration" icon="tryton-list"/>
+
+        <record model="ir.property" id="property_purchase_sequence">
+            <field name="name">purchase_sequence</field>
+            <field name="field"
+                search="[('model.model', '=', 'purchase.configuration'), ('name', '=', 'purchase_sequence')]"/>
+            <field name="value" eval="'ir.sequence,' + str(ref('sequence_purchase'))"/>
+        </record>
+    </data>
+</tryton>
diff --git a/de_DE.csv b/de_DE.csv
index 6827c54..d6a0739 100644
--- a/de_DE.csv
+++ b/de_DE.csv
@@ -13,9 +13,11 @@ field,"account.invoice,purchase_exception_state",0,Exception State,Status Vorbeh
 field,"product.template,product_suppliers",0,Suppliers,Lieferanten,0
 field,"product.template,purchasable",0,Purchasable,Käuflich,0
 field,"product.template,purchase_uom",0,Purchase UOM,Einheit Einkauf,0
-field,"purchase.handle.invoice.exception.ask,domain_invoices",0,Domain Invoices,Domain Rechnungen,0
+field,"purchase.configuration,purchase_sequence",0,Purchase Reference Sequence,Nummernkreis Einkauf,0
+field,"purchase.configuration,rec_name",0,Name,Name,0
+field,"purchase.handle.invoice.exception.ask,domain_invoices",0,Domain Invoices,Wertebereich Rechnungen (Domain),0
 field,"purchase.handle.invoice.exception.ask,recreate_invoices",0,Recreate Invoices,Rechnungen nachbilden,0
-field,"purchase.handle.shipment.exception.ask,domain_moves",0,Domain Moves,Domain Bewegungen,0
+field,"purchase.handle.shipment.exception.ask,domain_moves",0,Domain Moves,Wertebereich Bewegungen (Domain),0
 field,"purchase.handle.shipment.exception.ask,recreate_moves",0,Recreate Moves,Bewegungen nachbilden,0
 field,"purchase.line-account.invoice.line,invoice_line",0,Invoice Line,Rechnungsposition,0
 field,"purchase.line-account.invoice.line,purchase_line",0,Purchase Line,Position Einkauf,0
@@ -42,7 +44,7 @@ field,"purchase.line,rec_name",0,Name,Name,0
 field,"purchase.line-recreated-stock.move,move",0,Move,Bewegung,0
 field,"purchase.line-recreated-stock.move,purchase_line",0,Purchase Line,Position Einkauf,0
 field,"purchase.line-recreated-stock.move,rec_name",0,Name,Name,0
-field,"purchase.line,sequence",0,Sequence,Sequenz,0
+field,"purchase.line,sequence",0,Sequence,Reihenfolge,0
 field,"purchase.line,taxes",0,Taxes,Steuern,0
 field,"purchase.line,type",0,Type,Typ,0
 field,"purchase.line,unit",0,Unit,Einheit,0
@@ -60,7 +62,7 @@ field,"purchase.product_supplier,prices",0,Prices,Preise,0
 field,"purchase.product_supplier.price,unit_price",0,Unit Price,Einzelpreis,0
 field,"purchase.product_supplier,product",0,Product,Artikel,0
 field,"purchase.product_supplier,rec_name",0,Name,Name,0
-field,"purchase.product_supplier,sequence",0,Sequence,Sequenz,0
+field,"purchase.product_supplier,sequence",0,Sequence,Reihenfolge,0
 field,"purchase.purchase-account.invoice,invoice",0,Invoice,Rechnung,0
 field,"purchase.purchase-account.invoice,purchase",0,Purchase,Einkauf,0
 field,"purchase.purchase-account.invoice,rec_name",0,Name,Name,0
@@ -90,13 +92,13 @@ field,"purchase.purchase,rec_name",0,Name,Name,0
 field,"purchase.purchase-recreated-account.invoice,invoice",0,Invoice,Rechnung,0
 field,"purchase.purchase-recreated-account.invoice,purchase",0,Purchase,Einkauf,0
 field,"purchase.purchase-recreated-account.invoice,rec_name",0,Name,Name,0
-field,"purchase.purchase,reference",0,Reference,Referenz,0
+field,"purchase.purchase,reference",0,Reference,Beleg-Nr.,0
 field,"purchase.purchase,shipment_done",0,Shipment Done,Lieferposten erledigt,0
 field,"purchase.purchase,shipment_exception",0,Shipments Exception,Lieferungsvorbehalt,0
 field,"purchase.purchase,shipments",0,Shipments,Lieferposten,0
 field,"purchase.purchase,shipment_state",0,Shipment State,Lieferstatus,0
 field,"purchase.purchase,state",0,State,Status,0
-field,"purchase.purchase,supplier_reference",0,Supplier Reference,Rechnungsnr. Lieferant,0
+field,"purchase.purchase,supplier_reference",0,Supplier Reference,Beleg-Nr. Lieferant,0
 field,"purchase.purchase,tax_amount",0,Tax,Steuer,0
 field,"purchase.purchase,total_amount",0,Total,Gesamt,0
 field,"purchase.purchase,untaxed_amount",0,Untaxed,Netto,0
@@ -104,7 +106,7 @@ field,"purchase.purchase,warehouse",0,Warehouse,Warenlager,0
 field,"stock.move,purchase",0,Purchase,Einkauf,0
 field,"stock.move,purchase_currency",0,Purchase Currency,Einkaufswährung,0
 field,"stock.move,purchase_exception_state",0,Exception State,Status Vorbehalt,0
-field,"stock.move,purchase_line",0,,,0
+field,"stock.move,purchase_line",0,Purchase Line,Position Einkauf,0
 field,"stock.move,purchase_quantity",0,Purchase Quantity,Anzahl Einkauf,0
 field,"stock.move,purchase_unit",0,Purchase Unit,Einheit Einkauf,0
 field,"stock.move,purchase_unit_digits",0,Purchase Unit Digits,Anzahl Stellen Einkauf,0
@@ -122,7 +124,8 @@ model,"ir.action,name",wizard_shipment_handle_exception,Handle Shipment Exceptio
 model,"ir.action,name",act_invoice_form,Invoices,Rechnungseingang,0
 model,"ir.action,name",act_purchase_form_new,New Purchase,Neuer Einkauf,0
 model,"ir.action,name",act_open_supplier,Parties associated to Purchases,Parteien: Einkäufen zugeordnet,0
-model,"ir.action,name",report_purchase,Purchase,Einkauf drucken,0
+model,"ir.action,name",report_purchase,Purchase,Einkauf,0
+model,"ir.action,name",act_purchase_configuration_form,Purchase Configuration,Einstellungen Einkauf,0
 model,"ir.action,name",act_purchase_form,Purchases,Einkäufe,0
 model,"ir.action,name",act_purchase_form2,Purchases,Einkäufe,0
 model,"ir.action,name",act_purchase_form_quotation,Purchases in Quotation,Angebote (Einkäufe),0
@@ -134,10 +137,12 @@ model,"ir.ui.menu,name",menu_purchase_form_confirmed,Confirmed Purchases,Aufträ
 model,"ir.ui.menu,name",menu_purchase_form_draft,Draft Purchases,Entwürfe (Einkäufe),0
 model,"ir.ui.menu,name",menu_purchase_form_new,New Purchase,Neuer Einkauf,0
 model,"ir.ui.menu,name",menu_supplier,Parties associated to Purchases,Parteien: Einkäufen zugeordnet,0
+model,"ir.ui.menu,name",menu_purchase_configuration,Purchase Configuration,Einstellungen Einkauf,0
 model,"ir.ui.menu,name",menu_purchase,Purchase Management,Einkauf,0
 model,"ir.ui.menu,name",menu_purchase_form,Purchases,Einkäufe,0
 model,"ir.ui.menu,name",menu_purchase_form_quotation,Purchases in Quotation,Angebote (Einkäufe),0
 model,"ir.ui.menu,name",menu_reporting,Reporting,Berichte,0
+model,"purchase.configuration,name",0,Purchase Configuration,Einstellungen Einkauf,0
 model,"purchase.handle.invoice.exception.ask,name",0,Invoice Exception Ask,Nachfrage Rechnungsvorbehalt,0
 model,"purchase.handle.shipment.exception.ask,name",0,Shipment Exception Ask,Nachfrage Liefervorbehalt,0
 model,"purchase.line-account.invoice.line,name",0,Purchase Line - Invoice Line,Position Einkauf - Rechnungszeile,0
@@ -218,6 +223,7 @@ view,product.product,0,Product Suppliers,Lieferanten,0
 view,product.product,0,Suppliers,Lieferanten,0
 view,product.template,0,Product Suppliers,Lieferanten,0
 view,product.template,0,Suppliers,Lieferanten,0
+view,purchase.configuration,0,Purchase Configuration,Einstellungen Einkauf,0
 view,purchase.handle.invoice.exception.ask,0,Choose invoices to duplicate,Auswahl Rechnungen für Duplizierung,0
 view,purchase.handle.invoice.exception.ask,0,Choose invoices to recreate,Rechnungen zum Nachbilden auswählen,0
 view,purchase.handle.invoice.exception.ask,0,Handle Invoice Exception,Rechnungsvorbehalt bearbeiten,0
diff --git a/es_CO.csv b/es_CO.csv
index b0c14ba..5935dcc 100644
--- a/es_CO.csv
+++ b/es_CO.csv
@@ -12,6 +12,8 @@ field,"account.invoice,purchase_exception_state",0,Exception State,Estado Excepc
 field,"product.template,product_suppliers",0,Suppliers,Proveedores,0
 field,"product.template,purchasable",0,Purchasable,Comprable,0
 field,"product.template,purchase_uom",0,Purchase UOM,UdM de Compra,0
+field,"purchase.configuration,purchase_sequence",0,Purchase Reference Sequence,,0
+field,"purchase.configuration,rec_name",0,Name,Nombre de Contacto,1
 field,"purchase.handle.invoice.exception.ask,domain_invoices",0,Domain Invoices,Rango de facturas,0
 field,"purchase.handle.invoice.exception.ask,recreate_invoices",0,Recreate Invoices,Rehacer facturas,0
 field,"purchase.handle.shipment.exception.ask,domain_moves",0,Domain Moves,Rango de movimientos,0
@@ -122,6 +124,7 @@ model,"ir.action,name",act_invoice_form,Invoices,Facturas,0
 model,"ir.action,name",act_purchase_form_new,New Purchase,Nueva Compra,0
 model,"ir.action,name",act_open_supplier,Parties associated to Purchases,Terceros Asociados a Compras,0
 model,"ir.action,name",report_purchase,Purchase,Compra,0
+model,"ir.action,name",act_purchase_configuration_form,Purchase Configuration,,0
 model,"ir.action,name",act_purchase_form,Purchases,Compras,0
 model,"ir.action,name",act_purchase_form2,Purchases,Compras,0
 model,"ir.action,name",act_purchase_form_quotation,Purchases in Quotation,Cotizaciones de Compras,0
@@ -133,10 +136,12 @@ model,"ir.ui.menu,name",menu_purchase_form_confirmed,Confirmed Purchases,Compras
 model,"ir.ui.menu,name",menu_purchase_form_draft,Draft Purchases,Compras en Borrador,0
 model,"ir.ui.menu,name",menu_purchase_form_new,New Purchase,Nueva Compra,0
 model,"ir.ui.menu,name",menu_supplier,Parties associated to Purchases,Terceros Asociados a Compras,0
+model,"ir.ui.menu,name",menu_purchase_configuration,Purchase Configuration,,0
 model,"ir.ui.menu,name",menu_purchase,Purchase Management,Gestión de Compras,0
 model,"ir.ui.menu,name",menu_purchase_form,Purchases,Compras,0
 model,"ir.ui.menu,name",menu_purchase_form_quotation,Purchases in Quotation,Cotizaciones de Compras,0
 model,"ir.ui.menu,name",menu_reporting,Reporting,Reportes,0
+model,"purchase.configuration,name",0,purchase.configuration,,0
 model,"purchase.handle.invoice.exception.ask,name",0,Invoice Exception Ask,Pregunta de Excepción de Factura,0
 model,"purchase.handle.shipment.exception.ask,name",0,Shipment Exception Ask,Preguntar Excepción de Envío,0
 model,"purchase.line-account.invoice.line,name",0,Purchase Line - Invoice Line,Línea de Compra - Línea de Factura,0
@@ -186,7 +191,7 @@ odt,purchase.purchase,0,Taxes:,Impuestos,0
 odt,purchase.purchase,0,Total:,Total:,0
 odt,purchase.purchase,0,Total (excl. taxes):,Total(excl. impuestos):,0
 odt,purchase.purchase,0,Unit Price,Precio Unitario,0
-odt,purchase.purchase,0,VAT:,IVA:,0
+odt,purchase.purchase,0,VAT:,NIT:,0
 selection,"account.invoice,purchase_exception_state",0,,,0
 selection,"account.invoice,purchase_exception_state",0,Ignored,Ignorado,0
 selection,"account.invoice,purchase_exception_state",0,Recreated,Rehecho,0
@@ -217,6 +222,7 @@ view,product.product,0,Products,Productos,0
 view,product.product,0,Suppliers,Proveedores,0
 view,product.template,0,Product Suppliers,Proveedores de Productos,0
 view,product.template,0,Suppliers,Proveedores,0
+view,purchase.configuration,0,Purchase Configuration,,0
 view,purchase.handle.invoice.exception.ask,0,Choose invoices to recreate,Escoja una factura a rehacer,0
 view,purchase.handle.invoice.exception.ask,0,Handle Invoice Exception,Manejar excepción de factura,0
 view,purchase.handle.shipment.exception.ask,0,Choose moves to recreate,Elegir movimientos a recrear,0
diff --git a/fr_FR.csv b/fr_FR.csv
index b9cec37..408a749 100644
--- a/fr_FR.csv
+++ b/fr_FR.csv
@@ -12,6 +12,8 @@ field,"account.invoice,purchase_exception_state",0,Exception State,État d'excep
 field,"product.template,product_suppliers",0,Suppliers,Fournisseurs,0
 field,"product.template,purchasable",0,Purchasable,Achetable,0
 field,"product.template,purchase_uom",0,Purchase UOM,UDM à l'achat,0
+field,"purchase.configuration,purchase_sequence",0,Purchase Reference Sequence,Séquence de référence d'achat,0
+field,"purchase.configuration,rec_name",0,Name,Nom,0
 field,"purchase.handle.invoice.exception.ask,domain_invoices",0,Domain Invoices,Domaine des factures,0
 field,"purchase.handle.invoice.exception.ask,recreate_invoices",0,Recreate Invoices,Recréer les factures,0
 field,"purchase.handle.shipment.exception.ask,domain_moves",0,Domain Moves,Domaine des mouvements,0
@@ -103,7 +105,7 @@ field,"purchase.purchase,warehouse",0,Warehouse,Entrepôt,0
 field,"stock.move,purchase",0,Purchase,Achat,0
 field,"stock.move,purchase_currency",0,Purchase Currency,Devise de l'achat,0
 field,"stock.move,purchase_exception_state",0,Exception State,État d'exception,0
-field,"stock.move,purchase_line",0,,,0
+field,"stock.move,purchase_line",0,Purchase Line,Ligne d'achat,0
 field,"stock.move,purchase_quantity",0,Purchase Quantity,Quantité d'achat,0
 field,"stock.move,purchase_unit",0,Purchase Unit,Unité d'achat,0
 field,"stock.move,purchase_unit_digits",0,Purchase Unit Digits,Décimales de l'unité d'achat,0
@@ -122,6 +124,7 @@ model,"ir.action,name",act_invoice_form,Invoices,Factures,0
 model,"ir.action,name",act_purchase_form_new,New Purchase,Nouvel achat,0
 model,"ir.action,name",act_open_supplier,Parties associated to Purchases,Tiers associés à des achats,0
 model,"ir.action,name",report_purchase,Purchase,Achat,0
+model,"ir.action,name",act_purchase_configuration_form,Purchase Configuration,Configuration des achats,0
 model,"ir.action,name",act_purchase_form,Purchases,Achats,0
 model,"ir.action,name",act_purchase_form2,Purchases,Achats,0
 model,"ir.action,name",act_purchase_form_quotation,Purchases in Quotation,Devis,0
@@ -133,10 +136,12 @@ model,"ir.ui.menu,name",menu_purchase_form_confirmed,Confirmed Purchases,Achats
 model,"ir.ui.menu,name",menu_purchase_form_draft,Draft Purchases,Achats brouillons,0
 model,"ir.ui.menu,name",menu_purchase_form_new,New Purchase,Nouvel achat,0
 model,"ir.ui.menu,name",menu_supplier,Parties associated to Purchases,Tiers associés à des achats,0
+model,"ir.ui.menu,name",menu_purchase_configuration,Purchase Configuration,Configuration des achats,0
 model,"ir.ui.menu,name",menu_purchase,Purchase Management,Gestion des achats,0
 model,"ir.ui.menu,name",menu_purchase_form,Purchases,Achats,0
 model,"ir.ui.menu,name",menu_purchase_form_quotation,Purchases in Quotation,Devis,0
 model,"ir.ui.menu,name",menu_reporting,Reporting,Rapport,0
+model,"purchase.configuration,name",0,purchase.configuration,,0
 model,"purchase.handle.invoice.exception.ask,name",0,Invoice Exception Ask,Exception de facture - Demande,0
 model,"purchase.handle.shipment.exception.ask,name",0,Shipment Exception Ask,Exception d'expédition - Demande,0
 model,"purchase.line-account.invoice.line,name",0,Purchase Line - Invoice Line,Ligne d'achat - Ligne de facture,0
@@ -151,7 +156,7 @@ model,"purchase.purchase-ignored-account.invoice,name",0,Purchase - Ignored Invo
 model,"purchase.purchase,name",0,Purchase,Achat,0
 model,"purchase.purchase-recreated-account.invoice,name",0,Purchase - Recreated Invoice,Achat - Facture recréée,0
 model,"res.group,name",group_purchase,Purchase,Achat,0
-model,"res.group,name",group_purchase_admin,Purchase Administrator,Administrateur d'achat,0
+model,"res.group,name",group_purchase_admin,Purchase Administrator,Administrateur des achats,0
 model,"workflow.activity,name",purchase_activity_cancel,Canceled,Annulé,0
 model,"workflow.activity,name",purchase_activity_confirmed,Confirmed,Confirmé,0
 model,"workflow.activity,name",purchase_activity_done,Done,Fait,0
@@ -217,6 +222,7 @@ view,product.product,0,Product Suppliers,Fournisseurs,0
 view,product.product,0,Suppliers,Fournisseurs,0
 view,product.template,0,Product Suppliers,Produit Fournisseur,0
 view,product.template,0,Suppliers,Fournisseurs,0
+view,purchase.configuration,0,Purchase Configuration,Configuration des achats,0
 view,purchase.handle.invoice.exception.ask,0,Choose invoices to recreate,Choisir les factures à recréer,0
 view,purchase.handle.invoice.exception.ask,0,Handle Invoice Exception,Gérer l'exception de facture,0
 view,purchase.handle.shipment.exception.ask,0,Choose moves to recreate,Choisir les mouvements à recréer,0
diff --git a/party.xml b/party.xml
index 4e214d9..aee5623 100644
--- a/party.xml
+++ b/party.xml
@@ -7,7 +7,7 @@ this repository contains the full copyright notices and license terms. -->
             <field name="name">Purchases</field>
             <field name="res_model">purchase.purchase</field>
             <field name="view_type">form</field>
-            <field name="domain">[("party", "=", active_id)]</field>
+            <field name="domain">[("party", "=", Eval('active_id'))]</field>
         </record>
         <record model="ir.action.keyword"
                 id="act_open_purchase_keyword1">
diff --git a/purchase.py b/purchase.py
index d871a3b..6e09c44 100644
--- a/purchase.py
+++ b/purchase.py
@@ -1,16 +1,18 @@
-#This file is part of Tryton.  The COPYRIGHT file at the top level
-#of this repository contains the full copyright notices and license terms.
+#This file is part of Tryton.  The COPYRIGHT file at the top level of
+#this repository contains the full copyright notices and license terms.
 "Purchase"
 from trytond.model import ModelWorkflow, ModelView, ModelSQL, fields
 from trytond.modules.company import CompanyReport
 from trytond.wizard import Wizard
 from trytond.backend import TableHandler
+from trytond.pyson import Not, Equal, Eval, Or, Bool, If, In, Get, And, \
+        PYSONEncoder
 from decimal import Decimal
 import datetime
 import copy
 
 _STATES = {
-    'readonly': "state != 'draft'",
+    'readonly': Not(Equal(Eval('state'), 'draft')),
 }
 
 
@@ -21,9 +23,12 @@ class Purchase(ModelWorkflow, ModelSQL, ModelView):
 
     company = fields.Many2One('company.company', 'Company', required=True,
             states={
-                'readonly': "state != 'draft' or bool(lines)",
-            }, domain=["('id', 'company' in context and '=' or '!=', " \
-                    "context.get('company', 0))"])
+                'readonly': Or(Not(Equal(Eval('state'), 'draft')),
+                    Bool(Eval('lines'))),
+            }, domain=[
+                ('id', If(In('company', Eval('context', {})), '=', '!='),
+                    Get(Eval('context', {}), 'company', 0)),
+            ])
     reference = fields.Char('Reference', size=None, readonly=True, select=1)
     supplier_reference = fields.Char('Supplier Reference', select=1)
     description = fields.Char('Description', size=None, states=_STATES)
@@ -40,27 +45,28 @@ class Purchase(ModelWorkflow, ModelSQL, ModelView):
     party = fields.Many2One('party.party', 'Party', change_default=True,
             required=True, states=_STATES, on_change=['party', 'payment_term'],
             select=1)
-    party_lang = fields.Function('get_function_fields', type='char',
-            string='Party Language', on_change_with=['party'])
+    party_lang = fields.Function(fields.Char('Party Language',
+        on_change_with=['party']), 'get_function_fields')
     invoice_address = fields.Many2One('party.address', 'Invoice Address',
-            domain=["('party', '=', party)"], states=_STATES)
+            domain=[('party', '=', Eval('party'))], states=_STATES)
     warehouse = fields.Many2One('stock.location', 'Warehouse',
             domain=[('type', '=', 'warehouse')], required=True, states=_STATES)
     currency = fields.Many2One('currency.currency', 'Currency', required=True,
         states={
-            'readonly': "state != 'draft' or (bool(lines) and bool(currency))",
+            'readonly': Or(Not(Equal(Eval('state'), 'draft')),
+                And(Bool(Eval('lines')), Bool(Eval('currency')))),
         })
-    currency_digits = fields.Function('get_function_fields', type='integer',
-            string='Currency Digits', on_change_with=['currency'])
+    currency_digits = fields.Function(fields.Integer('Currency Digits',
+        on_change_with=['currency']), 'get_function_fields')
     lines = fields.One2Many('purchase.line', 'purchase', 'Lines',
             states=_STATES, on_change=['lines', 'currency', 'party'])
     comment = fields.Text('Comment')
-    untaxed_amount = fields.Function('get_function_fields', type='numeric',
-            digits="(16, currency_digits)", string='Untaxed')
-    tax_amount = fields.Function('get_function_fields', type='numeric',
-            digits="(16, currency_digits)", string='Tax')
-    total_amount = fields.Function('get_function_fields', type='numeric',
-            digits="(16, currency_digits)", string='Total')
+    untaxed_amount = fields.Function(fields.Numeric('Untaxed',
+        digits=(16, Eval('currency_digits', 2))), 'get_function_fields')
+    tax_amount = fields.Function(fields.Numeric('Tax',
+        digits=(16, Eval('currency_digits', 2))), 'get_function_fields')
+    total_amount = fields.Function(fields.Numeric('Total',
+        digits=(16, Eval('currency_digits', 2))), 'get_function_fields')
     invoice_method = fields.Selection([
         ('manual', 'Manual'),
         ('order', 'Based On Order'),
@@ -80,24 +86,24 @@ class Purchase(ModelWorkflow, ModelSQL, ModelView):
     invoices_recreated = fields.Many2Many(
             'purchase.purchase-recreated-account.invoice',
             'purchase', 'invoice', 'Recreated Invoices', readonly=True)
-    invoice_paid = fields.Function('get_function_fields', type='boolean',
-            string='Invoices Paid')
-    invoice_exception = fields.Function('get_function_fields', type='boolean',
-            string='Invoices Exception')
+    invoice_paid = fields.Function(fields.Boolean('Invoices Paid'),
+            'get_function_fields')
+    invoice_exception = fields.Function(fields.Boolean('Invoices Exception'),
+            'get_function_fields')
     shipment_state = fields.Selection([
         ('none', 'None'),
         ('waiting', 'Waiting'),
         ('received', 'Received'),
         ('exception', 'Exception'),
     ], 'Shipment State', readonly=True, required=True)
-    shipments = fields.Function('get_function_fields', type='many2many',
-            relation='stock.shipment.in', string='Shipments')
-    moves = fields.Function('get_function_fields', type='many2many',
-            relation='stock.move', string='Moves')
-    shipment_done = fields.Function('get_function_fields', type='boolean',
-            string='Shipment Done')
-    shipment_exception = fields.Function('get_function_fields', type='boolean',
-            string='Shipments Exception')
+    shipments = fields.Function(fields.One2Many('stock.shipment.in', None,
+        'Shipments'), 'get_function_fields')
+    moves = fields.Function(fields.One2Many('stock.move', None, 'Moves'),
+            'get_function_fields')
+    shipment_done = fields.Function(fields.Boolean('Shipment Done'),
+            'get_function_fields')
+    shipment_exception = fields.Function(fields.Boolean('Shipments Exception'),
+            'get_function_fields')
 
     def __init__(self):
         super(Purchase, self).__init__()
@@ -133,6 +139,10 @@ class Purchase(ModelWorkflow, ModelSQL, ModelView):
                 "SET invoice_method = 'shipment' "\
                 "WHERE invoice_method = 'packing'")
 
+        # Add index on create_date
+        table = TableHandler(cursor, self, module_name)
+        table.index_action('create_date', action='add')
+
     def default_payment_term(self, cursor, user, context=None):
         payment_term_obj = self.pool.get('account.invoice.payment_term')
         payment_term_ids = payment_term_obj.search(cursor, user,
@@ -150,7 +160,6 @@ class Purchase(ModelWorkflow, ModelSQL, ModelView):
         return False
 
     def default_company(self, cursor, user, context=None):
-        company_obj = self.pool.get('company.company')
         if context is None:
             context = {}
         if context.get('company'):
@@ -196,7 +205,7 @@ class Purchase(ModelWorkflow, ModelSQL, ModelView):
     def default_shipment_state(self, cursor, user, context=None):
         return 'none'
 
-    def on_change_party(self, cursor, user, ids, vals, context=None):
+    def on_change_party(self, cursor, user, vals, context=None):
         party_obj = self.pool.get('party.party')
         address_obj = self.pool.get('party.address')
         payment_term_obj = self.pool.get('account.invoice.payment_term')
@@ -223,7 +232,7 @@ class Purchase(ModelWorkflow, ModelSQL, ModelView):
                     res['payment_term'], context=context).rec_name
         return res
 
-    def on_change_with_currency_digits(self, cursor, user, ids, vals,
+    def on_change_with_currency_digits(self, cursor, user, vals,
             context=None):
         currency_obj = self.pool.get('currency.currency')
         if vals.get('currency'):
@@ -248,8 +257,7 @@ class Purchase(ModelWorkflow, ModelSQL, ModelView):
             res[purchase.id] = purchase.currency.digits
         return res
 
-    def on_change_with_party_lang(self, cursor, user, ids, vals,
-            context=None):
+    def on_change_with_party_lang(self, cursor, user, vals, context=None):
         party_obj = self.pool.get('party.party')
         if vals.get('party'):
             party = party_obj.browse(cursor, user, vals['party'],
@@ -272,7 +280,7 @@ class Purchase(ModelWorkflow, ModelSQL, ModelView):
                 res['language'] = purchase.party.lang.code
         return res
 
-    def on_change_lines(self, cursor, user, ids, vals, context=None):
+    def on_change_lines(self, cursor, user, vals, context=None):
         currency_obj = self.pool.get('currency.currency')
         tax_obj = self.pool.get('account.tax')
         invoice_obj = self.pool.get('account.invoice')
@@ -322,7 +330,7 @@ class Purchase(ModelWorkflow, ModelSQL, ModelView):
                     res['total_amount'])
         return res
 
-    def get_function_fields(self, cursor, user, ids, names, args, context=None):
+    def get_function_fields(self, cursor, user, ids, names, context=None):
         '''
         Function to compute function fields for purchase ids.
 
@@ -609,7 +617,7 @@ class Purchase(ModelWorkflow, ModelSQL, ModelView):
             res[purchase.id] = val
         return res
 
-    def get_rec_name(self, cursor, user, ids, name, arg, context=None):
+    def get_rec_name(self, cursor, user, ids, name, context=None):
         if not ids:
             return {}
         res = {}
@@ -618,20 +626,16 @@ class Purchase(ModelWorkflow, ModelSQL, ModelView):
                     + ' - ' + purchase.party.name
         return res
 
-    def search_rec_name(self, cursor, user, name, args, context=None):
-        args2 = []
-        i = 0
-        while i < len(args):
-            names = args[i][2].split(' - ', 1)
-            ids = self.search(cursor, user, ['OR',
-                ('reference', args[i][1], names[0]),
-                ('supplier_reference', args[i][1], names[0]),
-                ], context=context)
-            args2.append(('id', 'in', ids))
-            if len(names) != 1 and names[1]:
-                args2.append(('party', args[i][1], names[1]))
-            i += 1
-        return args2
+    def search_rec_name(self, cursor, user, name, clause, context=None):
+        names = clause[2].split(' - ', 1)
+        ids = self.search(cursor, user, ['OR',
+            ('reference', clause[1], names[0]),
+            ('supplier_reference', clause[1], names[0]),
+            ], order=[], context=context)
+        res = [('id', 'in', ids)]
+        if len(names) != 1 and names[1]:
+            res.append(('party', clause[1], names[1]))
+        return res
 
     def copy(self, cursor, user, ids, default=None, context=None):
         if default is None:
@@ -654,14 +658,16 @@ class Purchase(ModelWorkflow, ModelSQL, ModelView):
 
     def set_reference(self, cursor, user, purchase_id, context=None):
         sequence_obj = self.pool.get('ir.sequence')
+        config_obj = self.pool.get('purchase.configuration')
 
         purchase = self.browse(cursor, user, purchase_id, context=context)
 
         if purchase.reference:
             return True
 
-        reference = sequence_obj.get(cursor, user, 'purchase.purchase',
-                context=context)
+        config = config_obj.browse(cursor, user, 1, context=context)
+        reference = sequence_obj.get_id(cursor, user,
+                config.purchase_sequence.id, context=context)
         self.write(cursor, user, purchase_id, {
             'reference': reference,
             }, context=context)
@@ -846,56 +852,64 @@ class PurchaseLine(ModelSQL, ModelView):
         ('comment', 'Comment'),
         ], 'Type', select=1, required=True)
     quantity = fields.Float('Quantity',
-            digits="(16, unit_digits)",
+            digits=(16, Eval('unit_digits', 2)),
             states={
-                'invisible': "type != 'line'",
-                'required': "type == 'line'",
-                'readonly': "not globals().get('_parent_purchase')",
+                'invisible': Not(Equal(Eval('type'), 'line')),
+                'required': Equal(Eval('type'), 'line'),
+                'readonly': Not(Bool(Eval('_parent_purchase'))),
             }, on_change=['product', 'quantity', 'unit',
                 '_parent_purchase.currency', '_parent_purchase.party'])
     unit = fields.Many2One('product.uom', 'Unit',
             states={
-                'required': "product",
-                'invisible': "type != 'line'",
-                'readonly': "not globals().get('_parent_purchase')",
-            }, domain=["('category', '=', " \
-                    "(product, 'product.default_uom.category'))"],
-            context="{'category': (product, 'product.default_uom.category')}",
+                'required': Bool(Eval('product')),
+                'invisible': Not(Equal(Eval('type'), 'line')),
+                'readonly': Not(Bool(Eval('_parent_purchase'))),
+            }, domain=[
+                ('category', '=',
+                    (Eval('product'), 'product.default_uom.category')),
+            ],
+            context={
+                'category': (Eval('product'), 'product.default_uom.category'),
+            },
             on_change=['product', 'quantity', 'unit', '_parent_purchase.currency',
                 '_parent_purchase.party'])
-    unit_digits = fields.Function('get_unit_digits', type='integer',
-            string='Unit Digits', on_change_with=['unit'])
+    unit_digits = fields.Function(fields.Integer('Unit Digits',
+        on_change_with=['unit']), 'get_unit_digits')
     product = fields.Many2One('product.product', 'Product',
             domain=[('purchasable', '=', True)],
             states={
-                'invisible': "type != 'line'",
-                'readonly': "not globals().get('_parent_purchase')",
+                'invisible': Not(Equal(Eval('type'), 'line')),
+                'readonly': Not(Bool(Eval('_parent_purchase'))),
             }, on_change=['product', 'unit', 'quantity', 'description',
                 '_parent_purchase.party', '_parent_purchase.currency'],
-            context="{'locations': " \
-                        "_parent_purchase.warehouse and " \
-                        "[_parent_purchase.warehouse] or False, " \
-                    "'stock_date_end': _parent_purchase.purchase_date, " \
-                    "'purchasable': True, " \
-                    "'stock_skip_warehouse': True}")
+            context={
+                'locations': If(Bool(Get(Eval('_parent_purchase', {}),
+                    'warehouse')),
+                    [Get(Eval('_parent_purchase', {}), 'warehouse')],
+                    []),
+                'stock_date_end': Get(Eval('_parent_purchase', {}),
+                    'purchase_date'),
+                'purchasable': True,
+                'stock_skip_warehouse': True,
+            })
     unit_price = fields.Numeric('Unit Price', digits=(16, 4),
             states={
-                'invisible': "type != 'line'",
-                'required': "type == 'line'",
+                'invisible': Not(Equal(Eval('type'), 'line')),
+                'required': Equal(Eval('type'), 'line'),
             })
-    amount = fields.Function('get_amount', type='numeric', string='Amount',
-            digits="(16, _parent_purchase.currency_digits)",
-            states={
-                'invisible': "type not in ('line', 'subtotal')",
-                'readonly': "not globals().get('_parent_purchase')",
-            }, on_change_with=['type', 'quantity', 'unit_price',
-                '_parent_purchase.currency'])
+    amount = fields.Function(fields.Numeric('Amount',
+        digits=(16, Get(Eval('_parent_purchase', {}), 'currency_digits', 2)),
+        states={
+            'invisible': Not(In(Eval('type'), ['line', 'subtotal'])),
+            'readonly': Not(Bool(Eval('_parent_purchase'))),
+        }, on_change_with=['type', 'quantity', 'unit_price',
+            '_parent_purchase.currency']), 'get_amount')
     description = fields.Text('Description', size=None, required=True)
     note = fields.Text('Note')
     taxes = fields.Many2Many('purchase.line-account.tax',
             'line', 'tax', 'Taxes', domain=[('parent', '=', False)],
             states={
-                'invisible': "type != 'line'",
+                'invisible': Not(Equal(Eval('type'), 'line')),
             })
     invoice_lines = fields.Many2Many('purchase.line-account.invoice.line',
             'purchase_line', 'invoice_line', 'Invoice Lines', readonly=True)
@@ -905,10 +919,9 @@ class PurchaseLine(ModelSQL, ModelView):
             'purchase_line', 'move', 'Ignored Moves', readonly=True)
     moves_recreated = fields.Many2Many('purchase.line-recreated-stock.move',
             'purchase_line', 'move', 'Recreated Moves', readonly=True)
-    move_done = fields.Function('get_move_done', type='boolean',
-            string='Moves Done')
-    move_exception = fields.Function('get_move_exception', type='boolean',
-            string='Moves Exception')
+    move_done = fields.Function(fields.Boolean('Moves Done'), 'get_move_done')
+    move_exception = fields.Function(fields.Boolean('Moves Exception'),
+            'get_move_exception')
 
     def __init__(self):
         super(PurchaseLine, self).__init__()
@@ -940,7 +953,7 @@ class PurchaseLine(ModelSQL, ModelView):
     def default_unit_price(self, cursor, user, context=None):
         return Decimal('0.0')
 
-    def get_move_done(self, cursor, user, ids, name, args, context=None):
+    def get_move_done(self, cursor, user, ids, name, context=None):
         uom_obj = self.pool.get('product.uom')
         res = {}
         for line in self.browse(cursor, user, ids, context=context):
@@ -967,7 +980,7 @@ class PurchaseLine(ModelSQL, ModelView):
             res[line.id] = val
         return res
 
-    def get_move_exception(self, cursor, user, ids, name, args, context=None):
+    def get_move_exception(self, cursor, user, ids, name, context=None):
         res = {}
         for line in self.browse(cursor, user, ids, context=context):
             val = False
@@ -981,8 +994,7 @@ class PurchaseLine(ModelSQL, ModelView):
             res[line.id] = val
         return res
 
-    def on_change_with_unit_digits(self, cursor, user, ids, vals,
-            context=None):
+    def on_change_with_unit_digits(self, cursor, user, vals, context=None):
         uom_obj = self.pool.get('product.uom')
         if vals.get('unit'):
             uom = uom_obj.browse(cursor, user, vals['unit'],
@@ -990,7 +1002,7 @@ class PurchaseLine(ModelSQL, ModelView):
             return uom.digits
         return 2
 
-    def get_unit_digits(self, cursor, user, ids, name, arg, context=None):
+    def get_unit_digits(self, cursor, user, ids, name, context=None):
         res = {}
         for line in self.browse(cursor, user, ids, context=context):
             if line.unit:
@@ -1013,7 +1025,7 @@ class PurchaseLine(ModelSQL, ModelView):
         res = {}
         return res
 
-    def on_change_product(self, cursor, user, ids, vals, context=None):
+    def on_change_product(self, cursor, user, vals, context=None):
         party_obj = self.pool.get('party.party')
         product_obj = self.pool.get('product.product')
         uom_obj = self.pool.get('product.uom')
@@ -1080,11 +1092,11 @@ class PurchaseLine(ModelSQL, ModelView):
         vals = vals.copy()
         vals['unit_price'] = res['unit_price']
         vals['type'] = 'line'
-        res['amount'] = self.on_change_with_amount(cursor, user, ids,
-                vals, context=context)
+        res['amount'] = self.on_change_with_amount(cursor, user, vals,
+                context=context)
         return res
 
-    def on_change_quantity(self, cursor, user, ids, vals, context=None):
+    def on_change_quantity(self, cursor, user, vals, context=None):
         product_obj = self.pool.get('product.product')
 
         if context is None:
@@ -1108,10 +1120,10 @@ class PurchaseLine(ModelSQL, ModelView):
                 context=ctx2)[vals['product']]
         return res
 
-    def on_change_unit(self, cursor, user, ids, vals, context=None):
-        return self.on_change_quantity(cursor, user, ids, vals, context=context)
+    def on_change_unit(self, cursor, user, vals, context=None):
+        return self.on_change_quantity(cursor, user, vals, context=context)
 
-    def on_change_with_amount(self, cursor, user, ids, vals, context=None):
+    def on_change_with_amount(self, cursor, user, vals, context=None):
         currency_obj = self.pool.get('currency.currency')
         if vals.get('type') == 'line':
             if isinstance(vals.get('_parent_purchase.currency'), (int, long)):
@@ -1126,7 +1138,7 @@ class PurchaseLine(ModelSQL, ModelView):
             return amount
         return Decimal('0.0')
 
-    def get_amount(self, cursor, user, ids, name, arg, context=None):
+    def get_amount(self, cursor, user, ids, name, context=None):
         currency_obj = self.pool.get('currency.currency')
         res = {}
         for line in self.browse(cursor, user, ids, context=context):
@@ -1349,19 +1361,20 @@ class Template(ModelSQL, ModelView):
     _name = "product.template"
 
     purchasable = fields.Boolean('Purchasable', states={
-        'readonly': "active == False",
+        'readonly': Not(Bool(Eval('active'))),
         })
     product_suppliers = fields.One2Many('purchase.product_supplier',
             'product', 'Suppliers', states={
-                'readonly': "active == False",
-                'invisible': "(not purchasable) or (not company)",
+                'readonly': Not(Bool(Eval('active'))),
+                'invisible': Or(Not(Bool(Eval('purchasable'))),
+                    Not(Bool(Eval('company')))),
             })
     purchase_uom = fields.Many2One('product.uom', 'Purchase UOM', states={
-        'readonly': "active == False",
-        'invisible': "not purchasable",
-        'required': "purchasable",
-        }, domain=["('category', '=', (default_uom, 'uom.category'))"],
-        context="{'category': (default_uom, 'uom.category')}",
+        'readonly': Not(Bool(Eval('active'))),
+        'invisible': Not(Bool(Eval('purchasable'))),
+        'required': Bool(Eval('purchasable')),
+        }, domain=[('category', '=', (Eval('default_uom'), 'uom.category'))],
+        context={'category': (Eval('default_uom'), 'uom.category')},
         on_change_with=['default_uom', 'purchase_uom', 'purchasable'])
 
     def __init__(self):
@@ -1370,17 +1383,16 @@ class Template(ModelSQL, ModelView):
                 'change_purchase_uom': 'Purchase prices are based on the purchase uom, '\
                     'are you sure to change it?',
             })
-        if 'not bool(account_category) and bool(purchasable)' not in \
-                self.account_expense.states.get('required', ''):
-            self.account_expense = copy.copy(self.account_expense)
-            self.account_expense.states = copy.copy(self.account_expense.states)
-            if not self.account_expense.states.get('required'):
-                self.account_expense.states['required'] = \
-                        "not bool(account_category) and bool(purchasable)"
-            else:
-                self.account_expense.states['required'] = '(' + \
-                        self.account_expense.states['required'] + ') ' \
-                        'or (not bool(account_category) and bool(purchasable))'
+        self.account_expense = copy.copy(self.account_expense)
+        self.account_expense.states = copy.copy(self.account_expense.states)
+        required = And(Not(Bool(Eval('account_category'))),
+                Bool(Eval('purchasable')))
+        if not self.account_expense.states.get('required'):
+            self.account_expense.states['required'] = required
+        else:
+            self.account_expense.states['required'] = \
+                    Or(self.account_expense.states['required'],
+                            required)
         if 'account_category' not in self.account_expense.depends:
             self.account_expense = copy.copy(self.account_expense)
             self.account_expense.depends = \
@@ -1400,8 +1412,7 @@ class Template(ModelSQL, ModelView):
             return True
         return False
 
-    def on_change_with_purchase_uom(self, cursor, user, ids, vals,
-            context=None):
+    def on_change_with_purchase_uom(self, cursor, user, vals, context=None):
         uom_obj = self.pool.get('product.uom')
         res = False
 
@@ -1442,11 +1453,6 @@ Template()
 class Product(ModelSQL, ModelView):
     _name = 'product.product'
 
-    def on_change_with_purchase_uom(self, cursor, user, ids, vals, context=None):
-        template_obj = self.pool.get('product.template')
-        return template_obj.on_change_with_purchase_uom(cursor, user, ids, vals,
-                context=context)
-
     def get_purchase_price(self, cursor, user, ids, quantity=0, context=None):
         '''
         Return purchase price for product ids.
@@ -1526,8 +1532,10 @@ class ProductSupplier(ModelSQL, ModelView):
             'product_supplier', 'Prices')
     company = fields.Many2One('company.company', 'Company', required=True,
             ondelete='CASCADE', select=1,
-            domain=["('id', 'company' in context and '=' or '!=', " \
-                    "context.get('company', 0))"])
+            domain=[
+                ('id', If(In('company', Eval('context', {})), '=', '!='),
+                    Get(Eval('context', {}), 'company', 0)),
+            ])
     delivery_time = fields.Integer('Delivery Time',
             help="In number of days")
 
@@ -1536,7 +1544,6 @@ class ProductSupplier(ModelSQL, ModelView):
         self._order.insert(0, ('sequence', 'ASC'))
 
     def default_company(self, cursor, user, context=None):
-        company_obj = self.pool.get('company.company')
         if context is None:
             context = {}
         if context.get('company'):
@@ -1620,10 +1627,18 @@ class ShipmentIn(ModelSQL, ModelView):
     def __init__(self):
         super(ShipmentIn, self).__init__()
         self.incoming_moves = copy.copy(self.incoming_moves)
-        if "('supplier', '=', supplier)" not in self.incoming_moves.add_remove:
-            self.incoming_moves.add_remove = "[" + \
-                    self.incoming_moves.add_remove + ", " \
-                    "('supplier', '=', supplier)]"
+        add_remove = [
+            ('supplier', '=', Eval('supplier')),
+        ]
+        if not self.incoming_moves.add_remove:
+            self.incoming_moves.add_remove = add_remove
+        else:
+            self.incoming_moves.add_remove = \
+                    copy.copy(self.incoming_moves.add_remove)
+            self.incoming_moves.add_remove = [
+                add_remove,
+                self.incoming_moves.add_remove,
+            ]
         self._reset_columns()
 
         self._error_messages.update({
@@ -1674,55 +1689,44 @@ ShipmentIn()
 class Move(ModelSQL, ModelView):
     _name = 'stock.move'
 
-    purchase_line = fields.Many2One('purchase.line', select=1,
+    purchase_line = fields.Many2One('purchase.line', 'Purchase Line', select=1,
             states={
-                'readonly': "state != 'draft'",
+                'readonly': Not(Equal(Eval('state'), 'draft')),
             })
-    purchase = fields.Function('get_purchase', type='many2one',
-            relation='purchase.purchase', string='Purchase',
-            fnct_search='search_purchase', select=1, states={
-                'invisible': "not purchase_visible",
-            }, depends=['purchase_visible'])
-    purchase_quantity = fields.Function('get_purchase_fields',
-            type='float', digits="(16, unit_digits)",
-            string='Purchase Quantity',
-            states={
-                'invisible': "not purchase_visible",
-            }, depends=['purchase_visible'])
-    purchase_unit = fields.Function('get_purchase_fields',
-            type='many2one', relation='product.uom',
-            string='Purchase Unit',
-            states={
-                'invisible': "not purchase_visible",
-            }, depends=['purchase_visible'])
-    purchase_unit_digits = fields.Function('get_purchase_fields',
-            type='integer', string='Purchase Unit Digits')
-    purchase_unit_price = fields.Function('get_purchase_fields',
-            type='numeric', digits=(16, 4), string='Purchase Unit Price',
-            states={
-                'invisible': "not purchase_visible",
-            }, depends=['purchase_visible'])
-    purchase_currency = fields.Function('get_purchase_fields',
-            type='many2one', relation='currency.currency',
-            string='Purchase Currency',
-            states={
-                'invisible': "not purchase_visible",
-            }, depends=['purchase_visible'])
-    purchase_visible = fields.Function('get_purchase_visible',
-            type="boolean", string='Purchase Visible',
-            on_change_with=['from_location'])
-    supplier = fields.Function('get_supplier', type='many2one',
-            relation='party.party', string='Supplier',
-            fnct_search='search_supplier', select=1)
-
-    purchase_exception_state = fields.Function('get_purchase_exception_state',
-            type='selection',
-            selection=[('', ''),
-                       ('ignored', 'Ignored'),
-                       ('recreated', 'Recreated')],
-            string='Exception State')
-
-    def get_purchase(self, cursor, user, ids, name, arg, context=None):
+    purchase = fields.Function(fields.Many2One('purchase.purchase', 'Purchase',
+        select=1, states={
+            'invisible': Not(Bool(Eval('purchase_visible'))),
+        }, depends=['purchase_visible']), 'get_purchase',
+        searcher='search_purchase')
+    purchase_quantity = fields.Function(fields.Float('Purchase Quantity',
+        digits=(16, Eval('unit_digits', 2)), states={
+            'invisible': Not(Bool(Eval('purchase_visible'))),
+        }, depends=['purchase_visible']), 'get_purchase_fields')
+    purchase_unit = fields.Function(fields.Many2One('product.uom',
+        'Purchase Unit', states={
+            'invisible': Not(Bool(Eval('purchase_visible'))),
+        }, depends=['purchase_visible']), 'get_purchase_fields')
+    purchase_unit_digits = fields.Function(fields.Integer(
+        'Purchase Unit Digits'), 'get_purchase_fields')
+    purchase_unit_price = fields.Function(fields.Numeric('Purchase Unit Price',
+        digits=(16, 4), states={
+            'invisible': Not(Bool(Eval('purchase_visible'))),
+        }, depends=['purchase_visible']), 'get_purchase_fields')
+    purchase_currency = fields.Function(fields.Many2One('currency.currency',
+        'Purchase Currency', states={
+            'invisible': Not(Bool(Eval('purchase_visible'))),
+        }, depends=['purchase_visible']), 'get_purchase_fields')
+    purchase_visible = fields.Function(fields.Boolean('Purchase Visible',
+        on_change_with=['from_location']), 'get_purchase_visible')
+    supplier = fields.Function(fields.Many2One('party.party', 'Supplier',
+        select=1), 'get_supplier', searcher='search_supplier')
+    purchase_exception_state = fields.Function(fields.Selection([
+        ('', ''),
+        ('ignored', 'Ignored'),
+        ('recreated', 'Recreated'),
+        ], 'Exception State'), 'get_purchase_exception_state')
+
+    def get_purchase(self, cursor, user, ids, name, context=None):
         res = {}
         for move in self.browse(cursor, user, ids, context=context):
             res[move.id] = False
@@ -1730,8 +1734,8 @@ class Move(ModelSQL, ModelView):
                 res[move.id] = move.purchase_line.purchase.id
         return res
 
-    def get_purchase_exception_state(self, cursor, user, ids, name, arg,
-                                     context=None):
+    def get_purchase_exception_state(self, cursor, user, ids, name,
+            context=None):
         res = {}.fromkeys(ids, '')
         for move in self.browse(cursor, user, ids, context=context):
             if not move.purchase_line:
@@ -1742,16 +1746,10 @@ class Move(ModelSQL, ModelView):
                 res[move.id] = 'ignored'
         return res
 
-    def search_purchase(self, cursor, user, name, args, context=None):
-        args2 = []
-        i = 0
-        while i < len(args):
-            field = args[i][0]
-            args2.append(('purchase_line.' + field, args[i][1], args[i][2]))
-            i += 1
-        return args2
+    def search_purchase(self, cursor, user, name, clause, context=None):
+        return [('purchase_line.' + name,) + clause[1:]]
 
-    def get_purchase_fields(self, cursor, user, ids, names, arg, context=None):
+    def get_purchase_fields(self, cursor, user, ids, names, context=None):
         res = {}
         for name in names:
             res[name] = {}
@@ -1781,10 +1779,10 @@ class Move(ModelSQL, ModelView):
         vals = {
             'from_location': from_location,
         }
-        return self.on_change_with_purchase_visible(cursor, user, [], vals,
+        return self.on_change_with_purchase_visible(cursor, user, vals,
                 context=context)
 
-    def on_change_with_purchase_visible(self, cursor, user, ids, vals,
+    def on_change_with_purchase_visible(self, cursor, user, vals,
             context=None):
         location_obj = self.pool.get('stock.location')
         if vals.get('from_location'):
@@ -1794,7 +1792,7 @@ class Move(ModelSQL, ModelView):
                 return True
         return False
 
-    def get_purchase_visible(self, cursor, user, ids, name, arg, context=None):
+    def get_purchase_visible(self, cursor, user, ids, name, context=None):
         res = {}
         for move in self.browse(cursor, user, ids, context=context):
             res[move.id] = False
@@ -1802,7 +1800,7 @@ class Move(ModelSQL, ModelView):
                 res[move.id] = True
         return res
 
-    def get_supplier(self, cursor, user, ids, name, arg, context=None):
+    def get_supplier(self, cursor, user, ids, name, context=None):
         res = {}
         for move in self.browse(cursor, user, ids, context=context):
             res[move.id] = False
@@ -1810,14 +1808,8 @@ class Move(ModelSQL, ModelView):
                 res[move.id] = move.purchase_line.purchase.party.id
         return res
 
-    def search_supplier(self, cursor, user, name, args, context=None):
-        args2 = []
-        i = 0
-        while i < len(args):
-            args2.append(('purchase_line.purchase.party', args[i][1],
-                args[i][2]))
-            i += 1
-        return args2
+    def search_supplier(self, cursor, user, name, clause, context=None):
+        return [('purchase_line.purchase.party',) + clause[1:]]
 
     def write(self, cursor, user, ids, vals, context=None):
         purchase_obj = self.pool.get('purchase.purchase')
@@ -1869,12 +1861,11 @@ Move()
 class Invoice(ModelSQL, ModelView):
     _name = 'account.invoice'
 
-    purchase_exception_state = fields.Function('get_purchase_exception_state',
-            type='selection',
-            selection=[('', ''),
-                       ('ignored', 'Ignored'),
-                       ('recreated', 'Recreated')],
-            string='Exception State')
+    purchase_exception_state = fields.Function(fields.Selection([
+        ('', ''),
+        ('ignored', 'Ignored'),
+        ('recreated', 'Recreated'),
+        ], 'Exception State'), 'get_purchase_exception_state')
 
     def __init__(self):
         super(Invoice, self).__init__()
@@ -1896,8 +1887,8 @@ class Invoice(ModelSQL, ModelView):
         return super(Invoice, self).button_draft(
             cursor, user, ids, context=context)
 
-    def get_purchase_exception_state(self, cursor, user, ids, name, arg,
-                                     context=None):
+    def get_purchase_exception_state(self, cursor, user, ids, name,
+            context=None):
         purchase_obj = self.pool.get('purchase.purchase')
         purchase_ids = purchase_obj.search(
             cursor, user, [('invoices', 'in', ids)], context=context)
@@ -1951,19 +1942,13 @@ class OpenSupplier(Wizard):
         model_data_obj = self.pool.get('ir.model.data')
         act_window_obj = self.pool.get('ir.action.act_window')
         wizard_obj = self.pool.get('ir.action.wizard')
-
-        model_data_ids = model_data_obj.search(cursor, user, [
-            ('fs_id', '=', 'act_party_form'),
-            ('module', '=', 'party'),
-            ('inherit', '=', False),
-            ], limit=1, context=context)
-        model_data = model_data_obj.browse(cursor, user, model_data_ids[0],
-                context=context)
-        res = act_window_obj.read(cursor, user, model_data.db_id,
-                context=context)
+        act_window_id = model_data_obj.get_id(cursor, user, 'party',
+                'act_party_form', context=context)
+        res = act_window_obj.read(cursor, user, act_window_id, context=context)
         cursor.execute("SELECT DISTINCT(party) FROM purchase_purchase")
         supplier_ids = [line[0] for line in cursor.fetchall()]
-        res['domain'] = str([('id', 'in', supplier_ids)])
+        res['pyson_domain'] = PYSONEncoder().encode(
+                [('id', 'in', supplier_ids)])
 
         model_data_ids = model_data_obj.search(cursor, user, [
             ('fs_id', '=', 'act_open_supplier'),
@@ -1988,7 +1973,7 @@ class HandleShipmentExceptionAsk(ModelView):
 
     recreate_moves = fields.Many2Many(
         'stock.move', None, None, 'Recreate Moves',
-        domain=["('id', 'in', domain_moves)"], depends=['domain_moves'],
+        domain=[('id', 'in', Eval('domain_moves'))], depends=['domain_moves'],
         help='The selected moves will be recreated. '\
             'The other ones will be ignored.')
     domain_moves = fields.Many2Many(
@@ -2096,7 +2081,8 @@ class HandleInvoiceExceptionAsk(ModelView):
 
     recreate_invoices = fields.Many2Many(
         'account.invoice', None, None, 'Recreate Invoices',
-        domain=["('id', 'in', domain_invoices)"], depends=['domain_invoices'],
+        domain=[('id', 'in', Eval('domain_invoices'))],
+        depends=['domain_invoices'],
         help='The selected invoices will be recreated. '\
             'The other ones will be ignored.')
     domain_invoices = fields.Many2Many(
diff --git a/purchase.xml b/purchase.xml
index 1a7f64f..b9758c1 100644
--- a/purchase.xml
+++ b/purchase.xml
@@ -16,9 +16,10 @@ this repository contains the full copyright notices and license terms. -->
                 eval="[('add', ref('group_purchase')), ('add', ref('group_purchase_admin'))]"/>
         </record>
 
+        <!-- set active for 1.4 migration -->
         <menuitem name="Configuration" parent="menu_purchase"
             id="menu_configuration" groups="group_purchase_admin"
-            sequence="0" icon="tryton-preferences" active="0"/>
+            sequence="0" icon="tryton-preferences" active="1"/>
 
         <record model="ir.action.wizard" id="wizard_shipment_handle_exception">
             <field name="name">Handle Shipment Exception</field>
@@ -89,26 +90,26 @@ this repository contains the full copyright notices and license terms. -->
                                 <field name="state"/>
                                 <group col="6" colspan="2" id="buttons">
                                     <button name="cancel" string="Cancel"
-                                        states="{'invisible': '''state == 'cancel' or not ((state in ('draft', 'quotation')) or (invoice_state == 'exception') or (shipment_state == 'exception'))''', 'readonly': '''%(group_purchase)d not in groups'''}"
+                                        states="{'invisible': Or(Equal(Eval('state'), 'cancel'), Not(In(Eval('state'), ['draft', 'quotation'])), Equal(Eval('invoice_state'), 'exception'), Equal(Eval('shipment_state'), 'exception')), 'readonly': Not(In(%(group_purchase)d, Eval('groups', [])))}"
                                         icon="tryton-cancel"/>
                                     <button name="draft" string="Draft"
-                                        states="{'invisible': '''state != 'quotation' ''', 'readonly': '''%(group_purchase)d not in groups'''}"
+                                        states="{'invisible': Not(Equal(Eval('state'), 'quotation')), 'readonly': Not(In(%(group_purchase)d, Eval('groups', [])))}"
                                         icon="tryton-go-previous"/>
                                     <button name="quotation" string="Quotation"
-                                        states="{'invisible': '''state != 'draft' ''', 'readonly': '''(not bool(lines)) or %(group_purchase)d not in groups '''}"
+                                        states="{'invisible': Not(Equal(Eval('state'), 'draft')), 'readonly': Or(Not(Bool(Eval('lines'))), Not(In(%(group_purchase)d, Eval('groups', []))))}"
                                         icon="tryton-go-next"/>
                                     <button name="%(wizard_invoice_handle_exception)d"
                                             string="Handle Invoice Exception"
                                             type="action"
-                                            states="{'invisible': '''invoice_state != 'exception' or state == 'cancel' ''', 'readonly': '''%(group_purchase)d not in groups'''}"
+                                            states="{'invisible': Or(Not(Equal(Eval('invoice_state'), 'exception')), Equal(Eval('state'), 'cancel')), 'readonly': Not(In(%(group_purchase)d, Eval('groups', [])))}"
                                             icon="tryton-go-next"/>
                                     <button name="%(wizard_shipment_handle_exception)d"
                                             string="Handle Shipment Exception"
                                             type="action"
-                                            states="{'invisible': '''shipment_state != 'exception' or state == 'cancel' ''', 'readonly': '''%(group_purchase)d not in groups'''}"
+                                            states="{'invisible': Or(Not(Equal(Eval('shipment_state'), 'exception')), Equal(Eval('state'), 'cancel')), 'readonly': Not(In(%(group_purchase)d, Eval('groups', [])))}"
                                             icon="tryton-go-next"/>
                                     <button name="confirm" string="Confirm"
-                                        states="{'invisible': '''state != 'quotation' ''', 'readonly': '''%(group_purchase)d not in groups'''}"
+                                        states="{'invisible': Not(Equal(Eval('state'), 'quotation')), 'readonly': Not(In(%(group_purchase)d, Eval('groups', [])))}"
                                         icon="tryton-ok"/>
                                 </group>
                             </group>
@@ -119,7 +120,7 @@ this repository contains the full copyright notices and license terms. -->
                             <label name="invoice_method"/>
                             <field name="invoice_method"/>
                             <separator name="comment" colspan="4"/>
-                            <field name="comment" colspan="4" spell="party_lang"/>
+                            <field name="comment" colspan="4" spell="Eval('party_lang')"/>
                         </page>
                         <page string="Invoices" id="invoices">
                             <separator name="invoices" colspan="4"/>
@@ -184,6 +185,7 @@ this repository contains the full copyright notices and license terms. -->
                     <field name="shipment_state" select="2"/>
                     <field name="description" select="2"/>
                     <field name="currency_digits" tree_invisible="1"/>
+                    <field name="create_date" tree_invisible="1" select="2"/>
                 </tree>
                 ]]>
             </field>
@@ -193,7 +195,7 @@ this repository contains the full copyright notices and license terms. -->
             <field name="name">Shipments</field>
             <field name="res_model">stock.shipment.in</field>
             <field name="view_type">form</field>
-            <field name="domain">[("id", "in", shipments)]</field>
+            <field name="domain">[("id", "in", Eval('shipments'))]</field>
         </record>
         <record model="ir.action.keyword"
                 id="act_open_shipment_keyword1">
@@ -205,7 +207,7 @@ this repository contains the full copyright notices and license terms. -->
             <field name="name">Invoices</field>
             <field name="res_model">account.invoice</field>
             <field name="view_type">form</field>
-            <field name="domain">[("id", "in", invoices)]</field>
+            <field name="domain">[("id", "in", Eval('invoices'))]</field>
             <field name="context">{'type': 'in_invoice'}</field>
         </record>
         <record model="ir.action.keyword"
@@ -254,7 +256,7 @@ this repository contains the full copyright notices and license terms. -->
             <field name="name">Purchases</field>
             <field name="res_model">purchase.purchase</field>
             <field name="view_type">form</field>
-            <field name="search_value"></field>
+            <field name="search_value">{'create_date': ['between', Date(delta_years=-1)]}</field>
         </record>
         <record model="ir.action.act_window.view" id="act_purchase_form_view1">
             <field name="sequence" eval="10"/>
@@ -365,6 +367,8 @@ this repository contains the full copyright notices and license terms. -->
         <record model="ir.sequence.type" id="sequence_type_purchase">
             <field name="name">Purchase</field>
             <field name="code">purchase.purchase</field>
+            <field name="groups"
+                eval="[('add', ref('res.group_admin')), ('add', ref('group_purchase_admin'))]"/>
         </record>
         <record model="ir.sequence" id="sequence_purchase">
             <field name="name">Purchase</field>
@@ -698,7 +702,7 @@ this repository contains the full copyright notices and license terms. -->
                             <newline/>
                             <label name="description"/>
                             <field name="description" colspan="3"
-                                spell="_parent_purchase.party_lang"/>
+                                spell="Get(Eval('_parent_purchase', {}), 'party_lang')"/>
                             <label name="quantity"/>
                             <field name="quantity"/>
                             <label name="unit"/>
@@ -713,7 +717,7 @@ this repository contains the full copyright notices and license terms. -->
                         <page string="Notes" id="notes">
                             <separator name="note" colspan="4"/>
                             <field name="note" colspan="4"
-                                spell="_parent_purchase.party_lang"/>
+                                spell="Get(Eval('_parent_purchase', {}), 'party_lang')"/>
                         </page>
                     </notebook>
                     <field name="unit_digits" invisible="1" colspan="4"/>
@@ -851,7 +855,7 @@ this repository contains the full copyright notices and license terms. -->
                     <xpath expr="/form/notebook/page[@id="general"]"
                         position="after">
                         <page string="Suppliers"
-                            states="{'invisible': '''not purchasable'''}"
+                            states="{'invisible': Not(Bool(Eval('purchasable')))}"
                             id="suppliers">
                             <label name="purchasable"/>
                             <field name="purchasable"/>
diff --git a/setup.py b/setup.py
index 9c6e11a..40efce4 100644
--- a/setup.py
+++ b/setup.py
@@ -2,19 +2,22 @@
 #This file is part of Tryton.  The COPYRIGHT file at the top level of
 #this repository contains the full copyright notices and license terms.
 
-from setuptools import setup, find_packages
+from setuptools import setup
 import re
 
-info = eval(file('__tryton__.py').read())
+info = eval(open('__tryton__.py').read())
+major_version, minor_version, _ = info.get('version', '0.0.1').split('.', 2)
+major_version = int(major_version)
+minor_version = int(minor_version)
 
 requires = []
 for dep in info.get('depends', []):
     if not re.match(r'(ir|res|workflow|webdav)(\W|$)', dep):
-        requires.append('trytond_' + dep)
-
-major_version, minor_version, _ = info.get('version', '0.0.1').split('.', 2)
-requires.append('trytond >= %s.%s' % (major_version, minor_version))
-requires.append('trytond < %s.%s' % (major_version, int(minor_version) + 1))
+        requires.append('trytond_%s >= %s.%s, < %s.%s' %
+                (dep, major_version, minor_version, major_version,
+                    minor_version + 1))
+requires.append('trytond >= %s.%s, < %s.%s' %
+        (major_version, minor_version, major_version, minor_version + 1))
 
 setup(name='trytond_purchase',
     version=info.get('version', '0.0.1'),
@@ -27,6 +30,7 @@ setup(name='trytond_purchase',
     package_dir={'trytond.modules.purchase': '.'},
     packages=[
         'trytond.modules.purchase',
+        'trytond.modules.purchase.tests',
     ],
     package_data={
         'trytond.modules.purchase': info.get('xml', []) \
@@ -56,4 +60,6 @@ setup(name='trytond_purchase',
     [trytond.modules]
     purchase = trytond.modules.purchase
     """,
+    test_suite='tests',
+    test_loader='trytond.test_loader:Loader',
 )
diff --git a/tests/__init__.py b/tests/__init__.py
index 761e0db..56a98e7 100644
--- a/tests/__init__.py
+++ b/tests/__init__.py
@@ -1,4 +1,4 @@
 #This file is part of Tryton.  The COPYRIGHT file at the top level of
 #this repository contains the full copyright notices and license terms.
 
-from test_purchase import *
+from test_purchase import suite
diff --git a/tests/test_purchase.py b/tests/test_purchase.py
index f0a1226..517f1a8 100644
--- a/tests/test_purchase.py
+++ b/tests/test_purchase.py
@@ -10,7 +10,7 @@ if os.path.isdir(DIR):
 
 import unittest
 import trytond.tests.test_tryton
-from trytond.tests.test_tryton import RPCProxy, CONTEXT, SOCK, test_view
+from trytond.tests.test_tryton import test_view
 
 
 class PurchaseTestCase(unittest.TestCase):
@@ -28,11 +28,10 @@ class PurchaseTestCase(unittest.TestCase):
         self.assertRaises(Exception, test_view('purchase'))
 
 def suite():
-    return unittest.TestLoader().loadTestsFromTestCase(PurchaseTestCase)
+    suite = trytond.tests.test_tryton.suite()
+    suite.addTests(unittest.TestLoader().loadTestsFromTestCase(
+        PurchaseTestCase))
+    return suite
 
 if __name__ == '__main__':
-    suiteTrytond = trytond.tests.test_tryton.suite()
-    suitePurchase = suite()
-    alltests = unittest.TestSuite([suiteTrytond, suitePurchase])
-    unittest.TextTestRunner(verbosity=2).run(alltests)
-    SOCK.disconnect()
+    unittest.TextTestRunner(verbosity=2).run(suite())
diff --git a/trytond_purchase.egg-info/PKG-INFO b/trytond_purchase.egg-info/PKG-INFO
index 402424f..2eb6ed0 100644
--- a/trytond_purchase.egg-info/PKG-INFO
+++ b/trytond_purchase.egg-info/PKG-INFO
@@ -1,6 +1,6 @@
 Metadata-Version: 1.0
 Name: trytond-purchase
-Version: 1.4.2
+Version: 1.6.0
 Summary: Define purchase order.
 Add product supplier and purchase informations.
 Define the purchase price as the supplier price or the cost price.
@@ -16,7 +16,7 @@ Home-page: http://www.tryton.org/
 Author: B2CK
 Author-email: info at b2ck.com
 License: GPL-3
-Download-URL: http://downloads.tryton.org/1.4/
+Download-URL: http://downloads.tryton.org/1.6/
 Description: UNKNOWN
 Platform: UNKNOWN
 Classifier: Development Status :: 5 - Production/Stable
diff --git a/trytond_purchase.egg-info/SOURCES.txt b/trytond_purchase.egg-info/SOURCES.txt
index a2a2883..5b9cd86 100644
--- a/trytond_purchase.egg-info/SOURCES.txt
+++ b/trytond_purchase.egg-info/SOURCES.txt
@@ -5,6 +5,7 @@ LICENSE
 MANIFEST.in
 README
 TODO
+configuration.xml
 de_DE.csv
 es_CO.csv
 es_ES.csv
@@ -15,10 +16,11 @@ purchase.xml
 setup.py
 ./__init__.py
 ./__tryton__.py
+./configuration.py
 ./purchase.py
+./tests/__init__.py
+./tests/test_purchase.py
 doc/index.rst
-tests/__init__.py
-tests/test_purchase.py
 trytond_purchase.egg-info/PKG-INFO
 trytond_purchase.egg-info/SOURCES.txt
 trytond_purchase.egg-info/dependency_links.txt
diff --git a/trytond_purchase.egg-info/requires.txt b/trytond_purchase.egg-info/requires.txt
index 8bba34c..917bf70 100644
--- a/trytond_purchase.egg-info/requires.txt
+++ b/trytond_purchase.egg-info/requires.txt
@@ -1,10 +1,9 @@
-trytond_company
-trytond_party
-trytond_stock
-trytond_account
-trytond_product
-trytond_account_invoice
-trytond_currency
-trytond_account_product
-trytond >= 1.4
-trytond < 1.5
\ No newline at end of file
+trytond_company >= 1.6, < 1.7
+trytond_party >= 1.6, < 1.7
+trytond_stock >= 1.6, < 1.7
+trytond_account >= 1.6, < 1.7
+trytond_product >= 1.6, < 1.7
+trytond_account_invoice >= 1.6, < 1.7
+trytond_currency >= 1.6, < 1.7
+trytond_account_product >= 1.6, < 1.7
+trytond >= 1.6, < 1.7
\ No newline at end of file
commit f3f4aad8392703fd7f9109af573224d09b922dde
Author: Daniel Baumann <daniel at debian.org>
Date:   Sat Feb 20 10:48:16 2010 +0100

    Adding upstream version 1.4.2.

diff --git a/CHANGELOG b/CHANGELOG
index 733cba3..792a793 100644
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -1,3 +1,6 @@
+Version 1.4.2 - 2010-02-17
+* Some bug fixes (see mercurial logs for details)
+
 Version 1.4.1 - 2009-11-24
 * Some bug fixes (see mercurial logs for details)
 
diff --git a/COPYRIGHT b/COPYRIGHT
index da277a9..94a43fb 100644
--- a/COPYRIGHT
+++ b/COPYRIGHT
@@ -1,7 +1,7 @@
 Copyright (C) 2004-2008 Tiny SPRL.
-Copyright (C) 2008-2009 Cédric Krier.
-Copyright (C) 2008-2009 Bertrand Chenal.
-Copyright (C) 2008-2009 B2CK SPRL.
+Copyright (C) 2008-2010 Cédric Krier.
+Copyright (C) 2008-2010 Bertrand Chenal.
+Copyright (C) 2008-2010 B2CK SPRL.
 
 This program is free software: you can redistribute it and/or modify
 it under the terms of the GNU General Public License as published by
diff --git a/PKG-INFO b/PKG-INFO
index 3aa3384..04ee24c 100644
--- a/PKG-INFO
+++ b/PKG-INFO
@@ -1,6 +1,6 @@
 Metadata-Version: 1.0
 Name: trytond_purchase
-Version: 1.4.1
+Version: 1.4.2
 Summary: Define purchase order.
 Add product supplier and purchase informations.
 Define the purchase price as the supplier price or the cost price.
diff --git a/__tryton__.py b/__tryton__.py
index ad4319f..b42ba68 100644
--- a/__tryton__.py
+++ b/__tryton__.py
@@ -6,7 +6,7 @@
     'name_es_CO': 'Compras',
     'name_es_ES': 'Compras',
     'name_fr_FR': 'Achat',
-    'version': '1.4.1',
+    'version': '1.4.2',
     'author': 'B2CK',
     'email': 'info at b2ck.com',
     'website': 'http://www.tryton.org/',
diff --git a/purchase.py b/purchase.py
index 83f875e..d871a3b 100644
--- a/purchase.py
+++ b/purchase.py
@@ -1278,9 +1278,9 @@ class PurchaseLine(ModelSQL, ModelView):
         ctx['user'] = user
         move_id = move_obj.create(cursor, 0, vals, context=ctx)
 
-        self.write(cursor, user, line.id, {
+        self.write(cursor, 0, line.id, {
             'moves': [('add', move_id)],
-        }, context=context)
+        }, context=ctx)
         return move_id
 
 PurchaseLine()
diff --git a/trytond_purchase.egg-info/PKG-INFO b/trytond_purchase.egg-info/PKG-INFO
index 0725ada..402424f 100644
--- a/trytond_purchase.egg-info/PKG-INFO
+++ b/trytond_purchase.egg-info/PKG-INFO
@@ -1,6 +1,6 @@
 Metadata-Version: 1.0
 Name: trytond-purchase
-Version: 1.4.1
+Version: 1.4.2
 Summary: Define purchase order.
 Add product supplier and purchase informations.
 Define the purchase price as the supplier price or the cost price.
commit 1b7170a3e4594db4589388b294944f63d110e5a7
Author: Daniel Baumann <daniel at debian.org>
Date:   Wed Nov 25 13:15:45 2009 +0100

    Adding upstream version 1.4.1.

diff --git a/CHANGELOG b/CHANGELOG
index bad924f..733cba3 100644
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -1,3 +1,6 @@
+Version 1.4.1 - 2009-11-24
+* Some bug fixes (see mercurial logs for details)
+
 Version 1.4.0 - 2009-10-19
 * Bug fixes (see mercurial logs for details)
 * Migrate packing* objects and tables to shipment*
diff --git a/PKG-INFO b/PKG-INFO
index 2b62144..3aa3384 100644
--- a/PKG-INFO
+++ b/PKG-INFO
@@ -1,6 +1,6 @@
 Metadata-Version: 1.0
 Name: trytond_purchase
-Version: 1.4.0
+Version: 1.4.1
 Summary: Define purchase order.
 Add product supplier and purchase informations.
 Define the purchase price as the supplier price or the cost price.
diff --git a/__tryton__.py b/__tryton__.py
index 72be0ca..ad4319f 100644
--- a/__tryton__.py
+++ b/__tryton__.py
@@ -6,7 +6,7 @@
     'name_es_CO': 'Compras',
     'name_es_ES': 'Compras',
     'name_fr_FR': 'Achat',
-    'version': '1.4.0',
+    'version': '1.4.1',
     'author': 'B2CK',
     'email': 'info at b2ck.com',
     'website': 'http://www.tryton.org/',
diff --git a/purchase.py b/purchase.py
index f671498..83f875e 100644
--- a/purchase.py
+++ b/purchase.py
@@ -22,7 +22,8 @@ class Purchase(ModelWorkflow, ModelSQL, ModelView):
     company = fields.Many2One('company.company', 'Company', required=True,
             states={
                 'readonly': "state != 'draft' or bool(lines)",
-            }, domain=["('id', '=', context.get('company', 0))"])
+            }, domain=["('id', 'company' in context and '=' or '!=', " \
+                    "context.get('company', 0))"])
     reference = fields.Char('Reference', size=None, readonly=True, select=1)
     supplier_reference = fields.Char('Supplier Reference', select=1)
     description = fields.Char('Description', size=None, states=_STATES)
@@ -1525,7 +1526,8 @@ class ProductSupplier(ModelSQL, ModelView):
             'product_supplier', 'Prices')
     company = fields.Many2One('company.company', 'Company', required=True,
             ondelete='CASCADE', select=1,
-            domain=["('id', '=', context.get('company', 0))"])
+            domain=["('id', 'company' in context and '=' or '!=', " \
+                    "context.get('company', 0))"])
     delivery_time = fields.Integer('Delivery Time',
             help="In number of days")
 
diff --git a/trytond_purchase.egg-info/PKG-INFO b/trytond_purchase.egg-info/PKG-INFO
index 2dffef3..0725ada 100644
--- a/trytond_purchase.egg-info/PKG-INFO
+++ b/trytond_purchase.egg-info/PKG-INFO
@@ -1,6 +1,6 @@
 Metadata-Version: 1.0
 Name: trytond-purchase
-Version: 1.4.0
+Version: 1.4.1
 Summary: Define purchase order.
 Add product supplier and purchase informations.
 Define the purchase price as the supplier price or the cost price.
commit b489cf2404a4952b2aca711be532493f4e2807ee
Author: Daniel Baumann <daniel at debian.org>
Date:   Mon Oct 19 22:22:24 2009 +0200

    Adding upstream version 1.4.0.

diff --git a/CHANGELOG b/CHANGELOG
index 2b6647b..bad924f 100644
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -1,5 +1,6 @@
-Version 1.2.1 - 2009-07-07
-* Some bug fixes (see mercurial logs for details)
+Version 1.4.0 - 2009-10-19
+* Bug fixes (see mercurial logs for details)
+* Migrate packing* objects and tables to shipment*
 
 Version 1.2.0 - 2009-04-20
 * Bug fixes (see mercurial logs for details)
diff --git a/INSTALL b/INSTALL
index 7ad1327..ac9529c 100644
--- a/INSTALL
+++ b/INSTALL
@@ -5,7 +5,7 @@ Prerequisites
 -------------
 
  * Python 2.4 or later (http://www.python.org/)
- * trytond 0.0.x (http://www.tryton.org/)
+ * trytond (http://www.tryton.org/)
  * trytond_company (http://www.tryton.org/)
  * trytond_party (http://www.tryton.org/)
  * trytond_stock (http://www.tryton.org/)
diff --git a/MANIFEST.in b/MANIFEST.in
index 5343ad8..b2a140e 100644
--- a/MANIFEST.in
+++ b/MANIFEST.in
@@ -7,3 +7,5 @@ include LICENSE
 include *.xml
 include *.odt
 include *.csv
+include tests/*
+include doc/*
diff --git a/PKG-INFO b/PKG-INFO
index 9974321..2b62144 100644
--- a/PKG-INFO
+++ b/PKG-INFO
@@ -1,12 +1,12 @@
 Metadata-Version: 1.0
 Name: trytond_purchase
-Version: 1.2.1
+Version: 1.4.0
 Summary: Define purchase order.
 Add product supplier and purchase informations.
 Define the purchase price as the supplier price or the cost price.
 
 With the possibilities:
-    - to follow invoice and packing states from the purchase order.
+    - to follow invoice and shipment states from the purchase order.
     - to define invoice method:
         - Manual
         - Based On Order
@@ -16,7 +16,7 @@ Home-page: http://www.tryton.org/
 Author: B2CK
 Author-email: info at b2ck.com
 License: GPL-3
-Download-URL: http://downloads.tryton.org/1.2/
+Download-URL: http://downloads.tryton.org/1.4/
 Description: UNKNOWN
 Platform: UNKNOWN
 Classifier: Development Status :: 5 - Production/Stable
diff --git a/__init__.py b/__init__.py
index dda1fb6..5720822 100644
--- a/__init__.py
+++ b/__init__.py
@@ -1,3 +1,4 @@
-#This file is part of Tryton.  The COPYRIGHT file at the top level of this repository contains the full copyright notices and license terms.
+#This file is part of Tryton.  The COPYRIGHT file at the top level of
+#this repository contains the full copyright notices and license terms.
 
 from purchase import *
diff --git a/__tryton__.py b/__tryton__.py
index 6b0ac8a..72be0ca 100644
--- a/__tryton__.py
+++ b/__tryton__.py
@@ -6,7 +6,7 @@
     'name_es_CO': 'Compras',
     'name_es_ES': 'Compras',
     'name_fr_FR': 'Achat',
-    'version': '1.2.1',
+    'version': '1.4.0',
     'author': 'B2CK',
     'email': 'info at b2ck.com',
     'website': 'http://www.tryton.org/',
@@ -15,7 +15,7 @@ Add product supplier and purchase informations.
 Define the purchase price as the supplier price or the cost price.
 
 With the possibilities:
-    - to follow invoice and packing states from the purchase order.
+    - to follow invoice and shipment states from the purchase order.
     - to define invoice method:
         - Manual
         - Based On Order
@@ -44,16 +44,16 @@ Ermöglicht:
         - Basado en Orden
         - Basado en Empaque
 ''',
-    'description_es_ES': ''' - Definición de orden de compras.
- - Se añade información de proveedor y de compra de un producto.
- - Se define el precio de compra con el precio de proveedor o costo.
+    'description_es_ES': '''Define ordenes de compra.
+ - Añade información de proveedor y de compra de un producto.
+ - Define el precio de compra como el precio del proveedor o el precio de coste.
 
  - Con la posibilidad de:
-    - seguir el estado de facturación y empaque desde la orden de compra.
-    - elegir el método de facturación:
+    - seguir el estado de facturación y envio desde la orden de compra.
+    - definir el método de facturación:
         - Manual
-        - Basado en Orden
-        - Basado en Empaque
+        - Basado en orden
+        - Basado en envio
 ''',
     'description_fr_FR': '''Defini l'ordre d'achat.
 Ajoute les fournisseurs et les informations d'achat sur le produit.
diff --git a/de_DE.csv b/de_DE.csv
index 5642667..6827c54 100644
--- a/de_DE.csv
+++ b/de_DE.csv
@@ -1,5 +1,6 @@
 type,name,res_id,src,value,fuzzy
 error,account.invoice,0,You can not delete invoices that come from a purchase!,Durch einen Einkauf generierte Rechnungen können nicht gelöscht werden!,0
+error,account.invoice,0,You cannot reset to draft an invoice generated by a purchase.,Eine durch einen Einkauf generierte Bewegung kann nicht auf Entwurf zurückgesetzt werden.,0
 error,product.template,0,"Purchase prices are based on the purchase uom, are you sure to change it?","Einkaufspreise basieren auf der Maßeinheit für den Einkauf.
 Soll sie wirklich geändert werden?",0
 error,purchase.line,0,"It misses an ""account expense"" default property!",Es ist keine Standardeigenschaft für das Aufwandskonto definiert!,0
@@ -7,15 +8,15 @@ error,purchase.line,0,"It misses an ""Account Expense"" on product ""%s""!","Es
 error,purchase.line,0,The supplier location is required!,Der Lagerort des Lieferanten muss eingegeben werden!,0
 error,purchase.purchase,0,Invoice addresses must be defined for the quotation.,Die Rechnungsadresse muss für ein Angebot angegeben werden.,0
 error,purchase.purchase,0,"It misses an ""Account Payable"" on the party ""%s""!","Es ist kein Verbindlichkeitskonto für Partei ""%s"" definiert!",0
-error,stock.packing.in,0,You cannot reset to draft a move generated by a purchase.,Eine durch einen Einkauf generierte Bewegung kann nicht auf Entwurf zurückgesetzt werden.,0
+error,stock.shipment.in,0,You cannot reset to draft a move generated by a purchase.,Eine durch einen Einkauf generierte Bewegung kann nicht auf Entwurf zurückgesetzt werden.,0
 field,"account.invoice,purchase_exception_state",0,Exception State,Status Vorbehalt,0
 field,"product.template,product_suppliers",0,Suppliers,Lieferanten,0
 field,"product.template,purchasable",0,Purchasable,Käuflich,0
 field,"product.template,purchase_uom",0,Purchase UOM,Einheit Einkauf,0
 field,"purchase.handle.invoice.exception.ask,domain_invoices",0,Domain Invoices,Domain Rechnungen,0
 field,"purchase.handle.invoice.exception.ask,recreate_invoices",0,Recreate Invoices,Rechnungen nachbilden,0
-field,"purchase.handle.packing.exception.ask,domain_moves",0,Domain Moves,Domain Bewegungen,0
-field,"purchase.handle.packing.exception.ask,recreate_moves",0,Recreate Moves,Bewegungen nachbilden,0
+field,"purchase.handle.shipment.exception.ask,domain_moves",0,Domain Moves,Domain Bewegungen,0
+field,"purchase.handle.shipment.exception.ask,recreate_moves",0,Recreate Moves,Bewegungen nachbilden,0
 field,"purchase.line-account.invoice.line,invoice_line",0,Invoice Line,Rechnungsposition,0
 field,"purchase.line-account.invoice.line,purchase_line",0,Purchase Line,Position Einkauf,0
 field,"purchase.line-account.invoice.line,rec_name",0,Name,Name,0
@@ -81,10 +82,6 @@ field,"purchase.purchase,invoices_recreated",0,Recreated Invoices,Nachgebildete
 field,"purchase.purchase,invoice_state",0,Invoice State,Rechnungsstatus,0
 field,"purchase.purchase,lines",0,Lines,Positionen,0
 field,"purchase.purchase,moves",0,Moves,Bewegungen,0
-field,"purchase.purchase,packing_done",0,Shipment Done,Lieferposten erledigt,0
-field,"purchase.purchase,packing_exception",0,Shipments Exception,Lieferungsvorbehalt,0
-field,"purchase.purchase,packings",0,Shipments,Lieferposten,0
-field,"purchase.purchase,packing_state",0,Shipment State,Lieferstatus,0
 field,"purchase.purchase,party",0,Party,Partei,0
 field,"purchase.purchase,party_lang",0,Party Language,Sprache Partei,0
 field,"purchase.purchase,payment_term",0,Payment Term,Zahlungsbedingung,0
@@ -94,6 +91,10 @@ field,"purchase.purchase-recreated-account.invoice,invoice",0,Invoice,Rechnung,0
 field,"purchase.purchase-recreated-account.invoice,purchase",0,Purchase,Einkauf,0
 field,"purchase.purchase-recreated-account.invoice,rec_name",0,Name,Name,0
 field,"purchase.purchase,reference",0,Reference,Referenz,0
+field,"purchase.purchase,shipment_done",0,Shipment Done,Lieferposten erledigt,0
+field,"purchase.purchase,shipment_exception",0,Shipments Exception,Lieferungsvorbehalt,0
+field,"purchase.purchase,shipments",0,Shipments,Lieferposten,0
+field,"purchase.purchase,shipment_state",0,Shipment State,Lieferstatus,0
 field,"purchase.purchase,state",0,State,Status,0
 field,"purchase.purchase,supplier_reference",0,Supplier Reference,Rechnungsnr. Lieferant,0
 field,"purchase.purchase,tax_amount",0,Tax,Steuer,0
@@ -108,15 +109,16 @@ field,"stock.move,purchase_quantity",0,Purchase Quantity,Anzahl Einkauf,0
 field,"stock.move,purchase_unit",0,Purchase Unit,Einheit Einkauf,0
 field,"stock.move,purchase_unit_digits",0,Purchase Unit Digits,Anzahl Stellen Einkauf,0
 field,"stock.move,purchase_unit_price",0,Purchase Unit Price,Einzelpreis Einkauf,0
+field,"stock.move,purchase_visible",0,Purchase Visible,Verkauf sichtbar,0
 field,"stock.move,supplier",0,Supplier,Lieferant,0
 help,"purchase.handle.invoice.exception.ask,recreate_invoices",0,The selected invoices will be recreated. The other ones will be ignored.,Die ausgewählten Rechnungen werden nachgebildet. Alle anderen werden ignoriert.,0
-help,"purchase.handle.packing.exception.ask,recreate_moves",0,The selected moves will be recreated. The other ones will be ignored.,Die ausgewählten Bewegungen werden nachgebildet. Alle anderen werden ignoriert.,0
+help,"purchase.handle.shipment.exception.ask,recreate_moves",0,The selected moves will be recreated. The other ones will be ignored.,Die ausgewählten Bewegungen werden nachgebildet. Alle anderen werden ignoriert.,0
 help,"purchase.product_supplier,delivery_time",0,In number of days,In Anzahl von Tagen,0
 help,"purchase.product_supplier.price,quantity",0,Minimal quantity,Minimale Anzahl,0
 model,"ir.action,name",act_purchase_form_confirmed,Confirmed Purchases,Aufträge (Einkäufe),0
 model,"ir.action,name",act_purchase_form_draft,Draft Purchases,Entwürfe (Einkäufe),0
 model,"ir.action,name",wizard_invoice_handle_exception,Handle Invoice Exception,Rechnungsvorbehalt bearbeiten,0
-model,"ir.action,name",wizard_packing_handle_exception,Handle Shipment Exception,Liefervorbehalt bearbeiten,0
+model,"ir.action,name",wizard_shipment_handle_exception,Handle Shipment Exception,Liefervorbehalt bearbeiten,0
 model,"ir.action,name",act_invoice_form,Invoices,Rechnungseingang,0
 model,"ir.action,name",act_purchase_form_new,New Purchase,Neuer Einkauf,0
 model,"ir.action,name",act_open_supplier,Parties associated to Purchases,Parteien: Einkäufen zugeordnet,0
@@ -124,7 +126,7 @@ model,"ir.action,name",report_purchase,Purchase,Einkauf drucken,0
 model,"ir.action,name",act_purchase_form,Purchases,Einkäufe,0
 model,"ir.action,name",act_purchase_form2,Purchases,Einkäufe,0
 model,"ir.action,name",act_purchase_form_quotation,Purchases in Quotation,Angebote (Einkäufe),0
-model,"ir.action,name",act_packing_form,Shipments,Lieferposten,0
+model,"ir.action,name",act_shipment_form,Shipments,Lieferposten,0
 model,"ir.sequence,name",sequence_purchase,Purchase,Einkauf,0
 model,"ir.sequence.type,name",sequence_type_purchase,Purchase,Einkauf,0
 model,"ir.ui.menu,name",menu_configuration,Configuration,Einstellungen,0
@@ -137,7 +139,7 @@ model,"ir.ui.menu,name",menu_purchase_form,Purchases,Einkäufe,0
 model,"ir.ui.menu,name",menu_purchase_form_quotation,Purchases in Quotation,Angebote (Einkäufe),0
 model,"ir.ui.menu,name",menu_reporting,Reporting,Berichte,0
 model,"purchase.handle.invoice.exception.ask,name",0,Invoice Exception Ask,Nachfrage Rechnungsvorbehalt,0
-model,"purchase.handle.packing.exception.ask,name",0,Shipment Exception Ask,Nachfrage Liefervorbehalt,0
+model,"purchase.handle.shipment.exception.ask,name",0,Shipment Exception Ask,Nachfrage Liefervorbehalt,0
 model,"purchase.line-account.invoice.line,name",0,Purchase Line - Invoice Line,Position Einkauf - Rechnungszeile,0
 model,"purchase.line-account.tax,name",0,Purchase Line - Tax,Position Einkauf - Steuer,0
 model,"purchase.line-ignored-stock.move,name",0,Purchase Line - Ignored Move,Position Einkauf - Bewegung Ignoriert,0
@@ -150,7 +152,7 @@ model,"purchase.purchase-ignored-account.invoice,name",0,Purchase - Ignored Invo
 model,"purchase.purchase,name",0,Purchase,Einkauf,0
 model,"purchase.purchase-recreated-account.invoice,name",0,Purchase - Recreated Invoice,Einkauf - Rechnung Nachgebildet,0
 model,"res.group,name",group_purchase,Purchase,Einkauf,0
-model,"res.group,name",group_purchase_admin,Purchase Administrator,Administration Einkauf,0
+model,"res.group,name",group_purchase_admin,Purchase Administrator,Einkauf Administration,0
 model,"workflow.activity,name",purchase_activity_cancel,Canceled,Annulliert,0
 model,"workflow.activity,name",purchase_activity_confirmed,Confirmed,Beauftragt,0
 model,"workflow.activity,name",purchase_activity_done,Done,Erledigt,0
@@ -159,16 +161,16 @@ model,"workflow.activity,name",purchase_activity_invoice_done,Invoice Done,Rechn
 model,"workflow.activity,name",purchase_activity_invoice_purchase_exception,Invoice Exception,Rechnungsvorbehalt,0
 model,"workflow.activity,name",purchase_activity_invoice_method,Invoice Method,Rechnungsstellung,0
 model,"workflow.activity,name",purchase_activity_invoice_method_done,Invoice Method Done,Rechnungsstellung erledigt,0
-model,"workflow.activity,name",purchase_activity_invoice_packing,Invoice Shipment,Rechnung Lieferposten,0
-model,"workflow.activity,name",purchase_activity_invoice_packing_done,Invoice Shipment Done,Rechnung Lieferposten erledigt,0
-model,"workflow.activity,name",purchase_activity_invoice_packing_exception,Invoice Shipment Exception,Rechnung Lieferposten Vorbehalt,0
-model,"workflow.activity,name",purchase_activity_invoice_packing_method,Invoice Shipment Method,Rechnung Liefermethode,0
-model,"workflow.activity,name",purchase_activity_invoice_packing_method_done,Invoice Shipment Method Done,Rechnung Liefermethode erledigt,0
+model,"workflow.activity,name",purchase_activity_invoice_shipment,Invoice Shipment,Rechnung Lieferposten,0
+model,"workflow.activity,name",purchase_activity_invoice_shipment_done,Invoice Shipment Done,Rechnung Lieferposten erledigt,0
+model,"workflow.activity,name",purchase_activity_invoice_shipment_exception,Invoice Shipment Exception,Rechnung Lieferposten Vorbehalt,0
+model,"workflow.activity,name",purchase_activity_invoice_shipment_method,Invoice Shipment Method,Rechnung Liefermethode,0
+model,"workflow.activity,name",purchase_activity_invoice_shipment_method_done,Invoice Shipment Method Done,Rechnung Liefermethode erledigt,0
 model,"workflow.activity,name",purchase_activity_quotation,Quotation,Angebot,0
-model,"workflow.activity,name",purchase_activity_packing_exception,Shipment Exception,Lieferposten Vorbehalt,0
+model,"workflow.activity,name",purchase_activity_shipment_exception,Shipment Exception,Lieferposten Vorbehalt,0
 model,"workflow.activity,name",purchase_activity_waiting_invoice_purchase,Waiting Invoice,Rechnung wartend,0
-model,"workflow.activity,name",purchase_activity_waiting_invoice_packing,Waiting Invoice Shipment,Rechnung Lieferposten Wartend,0
-model,"workflow.activity,name",purchase_activity_waiting_packing,Waiting Shipment,Lieferposten wartend,0
+model,"workflow.activity,name",purchase_activity_waiting_invoice_shipment,Waiting Invoice Shipment,Rechnung Lieferposten Wartend,0
+model,"workflow.activity,name",purchase_activity_waiting_shipment,Waiting Shipment,Lieferposten wartend,0
 model,"workflow,name",purchase_workflow,Purchase workflow,Workflow Einkauf,0
 odt,purchase.purchase,0,Amount,Betrag,0
 odt,purchase.purchase,0,Date:,Datum:,0
@@ -200,10 +202,10 @@ selection,"purchase.purchase,invoice_state",0,Exception,Vorbehalt,0
 selection,"purchase.purchase,invoice_state",0,None,Kein,0
 selection,"purchase.purchase,invoice_state",0,Paid,Bezahlt,0
 selection,"purchase.purchase,invoice_state",0,Waiting,Wartend,0
-selection,"purchase.purchase,packing_state",0,Exception,Vorbehalt,0
-selection,"purchase.purchase,packing_state",0,None,Kein,0
-selection,"purchase.purchase,packing_state",0,Received,Erhalten,0
-selection,"purchase.purchase,packing_state",0,Waiting,Wartend,0
+selection,"purchase.purchase,shipment_state",0,Exception,Vorbehalt,0
+selection,"purchase.purchase,shipment_state",0,None,Kein,0
+selection,"purchase.purchase,shipment_state",0,Received,Erhalten,0
+selection,"purchase.purchase,shipment_state",0,Waiting,Wartend,0
 selection,"purchase.purchase,state",0,Canceled,Annulliert,0
 selection,"purchase.purchase,state",0,Confirmed,Beauftragt,0
 selection,"purchase.purchase,state",0,Done,Erledigt,0
@@ -219,12 +221,12 @@ view,product.template,0,Suppliers,Lieferanten,0
 view,purchase.handle.invoice.exception.ask,0,Choose invoices to duplicate,Auswahl Rechnungen für Duplizierung,0
 view,purchase.handle.invoice.exception.ask,0,Choose invoices to recreate,Rechnungen zum Nachbilden auswählen,0
 view,purchase.handle.invoice.exception.ask,0,Handle Invoice Exception,Rechnungsvorbehalt bearbeiten,0
-view,purchase.handle.packing.exception.ask,0,Choose moves to recreate,Auswahl Bewegungen zur Nachbildung,0
-view,purchase.handle.packing.exception.ask,0,Choose move to duplicate,Auswahl Bewegungen für Duplizierung,0
-view,purchase.handle.packing.exception.ask,0,Choose move to recreate,Bewegungen zum Nachbilden auswählen,0
-view,purchase.handle.packing.exception.ask,0,Duplicate Moves,Bewegungen duplizieren,0
-view,purchase.handle.packing.exception.ask,0,Handle packing Exception,Liefervorbehalt bearbeiten,0
-view,purchase.handle.packing.exception.ask,0,Recreated Moves,Nachgebildete Bewegungen,0
+view,purchase.handle.shipment.exception.ask,0,Choose moves to recreate,Auswahl Bewegungen zur Nachbildung,0
+view,purchase.handle.shipment.exception.ask,0,Choose move to duplicate,Auswahl Bewegungen für Duplizierung,0
+view,purchase.handle.shipment.exception.ask,0,Choose move to recreate,Bewegungen zum Nachbilden auswählen,0
+view,purchase.handle.shipment.exception.ask,0,Duplicate Moves,Bewegungen duplizieren,0
+view,purchase.handle.shipment.exception.ask,0,Handle shipment Exception,Liefervorbehalt bearbeiten,0
+view,purchase.handle.shipment.exception.ask,0,Recreated Moves,Nachgebildete Bewegungen,0
 view,purchase.line,0,General,Allgemein,0
 view,purchase.line,0,Notes,Notizen,0
 view,purchase.line,0,Products,Artikel,0
@@ -238,20 +240,17 @@ view,purchase.purchase,0,Cancel,Annullieren,0
 view,purchase.purchase,0,Confirm,Beauftragen,0
 view,purchase.purchase,0,Draft,Entwurf,0
 view,purchase.purchase,0,Handle Invoice Exception,Rechnungsvorbehalt bearbeiten,0
-view,purchase.purchase,0,Handle Packing Exception,Liefervorbehalt bearbeiten,0
 view,purchase.purchase,0,Handle Shipment Exception,Liefervorbehalt bearbeiten,0
 view,purchase.purchase,0,Ignore Invoice Exception,Rechnungsvorbehalt ignorieren,0
-view,purchase.purchase,0,Ignore Packing Exception,Verpackungsvorbehalt ignorieren,0
 view,purchase.purchase,0,Invoices,Rechnungen,0
 view,purchase.purchase,0,Lines,Positionen,0
 view,purchase.purchase,0,Moves,Bewegungen,0
 view,purchase.purchase,0,Other Info,Sonstiges,0
-view,purchase.purchase,0,Packings,Lieferposten,0
 view,purchase.purchase,0,Purchase,Einkauf,0
 view,purchase.purchase,0,Purchases,Einkäufe,0
 view,purchase.purchase,0,Quotation,Angebot,0
 view,purchase.purchase,0,Shipments,Lieferposten,0
 wizard_button,"purchase.handle.invoice.exception,init,end",0,Cancel,Abbrechen,0
 wizard_button,"purchase.handle.invoice.exception,init,ok",0,Ok,OK,0
-wizard_button,"purchase.handle.packing.exception,init,end",0,Cancel,Abbrechen,0
-wizard_button,"purchase.handle.packing.exception,init,ok",0,Ok,OK,0
+wizard_button,"purchase.handle.shipment.exception,init,end",0,Cancel,Abbrechen,0
+wizard_button,"purchase.handle.shipment.exception,init,ok",0,Ok,OK,0
diff --git a/doc/index.rst b/doc/index.rst
new file mode 100644
index 0000000..99512af
--- /dev/null
+++ b/doc/index.rst
@@ -0,0 +1,70 @@
+Purchase Module
+###############
+
+The purchase module defines the Purchase model.
+
+
+Purchase
+********
+
+The purchase is mainly defined by a party from which the products will
+be purchased and a list of purchase lines, each one containing a
+product and a quantity. Here is the extensive list of the fields, most
+of them are optional or completed with sensible default values:
+
+- Party: The supplier.
+- Invoice Address: The invoice address of the supplier.
+- Supplier Reference: Allow to keep track of the supplier reference
+  for this order.
+- Description: An optional description for the order.
+- Reference: The internal reference of the purchase (will be generated
+  automatically on confirmation).
+- Purchase Date: The date the purchase is made.
+- Payment Term: Define which payment term will be use for the future
+  invoice.
+- Warehouse: Define the warehouse where the shipment will be made.
+- Currency: define the currency to use for this purchase. All product
+  prices will be computed accordingly.
+- Purchase Lines:
+
+  - Type: The type of the line. The default value is *Line* which
+    means that the current purchase line contains the fields defined
+    hereunder. The other values of Type (*Comment*, *Subtotal*,
+    *Title*) are used to add extra lines that will appear on the
+    report, thus allowing to easily customise it.
+  - Sequence: Allow to order lines. The value of this field is also
+    updated with a drag and drop between the lines.
+  - Product: An optional reference to the product to purchase.
+  - Description: The description of the product to purchase.
+  - Quantity: The quantity to purchase.
+  - Unit: The unit of measure in which is expressed the quantity.
+  - Unit Price: The unit price of the product expressed in the
+    currency of the purchase.
+  - Amount: The amount of the current line (Unit Price multiplied by
+    Quantity).
+  - Taxes: The list of taxes that will be applied to the current line.
+
+- Invoice State: The state of the invoice related to the purchase.
+- Shipment State: The state of the shipment related to the purchase.
+- Untaxed: The untaxed amount.
+- Tax: The tax amount.
+- Total: The total amount.
+- State: The state of the purchase. May take one of the following
+  values: Draft, Quotation, Confirmed, Cancelled.
+- Company: The company which issue the purchase order.
+- Invoice Method: May take one of the following values:
+
+  - Base on order: The invoice is created when the purchase order is confirmed.
+  - Base on shipment: The invoice is created when the shipment is
+    received and will contains the shipped quantities. If there are
+    several shipments for the same purchase, several invoices will be
+    created.
+  - Manual: Tryton doesn't create any invoice automatically.
+
+- Comments: A text fields to add custom comments.
+- Invoices: The list of related invoices.
+- Moves: The list of related stock moves.
+- Shipments: The list of related shipments.
+
+The *Purchase* report allow to print the purchase orders or to send
+them by mail.
diff --git a/es_CO.csv b/es_CO.csv
index 5d7d9ec..b0c14ba 100644
--- a/es_CO.csv
+++ b/es_CO.csv
@@ -1,20 +1,21 @@
 type,name,res_id,src,value,fuzzy
 error,account.invoice,0,You can not delete invoices that come from a purchase!,¡No puede borrar facturas que vienen de una compra!,0
+error,account.invoice,0,You cannot reset to draft an invoice generated by a purchase.,No puede regresar a borrador una factura generada por una compra.,0
 error,product.template,0,"Purchase prices are based on the purchase uom, are you sure to change it?","Los precios de compra están basados en la UdM de compra,¿desea cambiarlo?",0
 error,purchase.line,0,"It misses an ""account expense"" default property!","¡Hace falta una propiedad predeterminada de ""cuenta de gastos""!",0
 error,purchase.line,0,"It misses an ""Account Expense"" on product ""%s""!","¡Hace falta una ""Cuenta de Gasto"" del producto ""%s""!",0
 error,purchase.line,0,The supplier location is required!,¡Se requiere el lugar del proveedor!,0
 error,purchase.purchase,0,Invoice addresses must be defined for the quotation.,Debe definir las direcciones para la cotización.,0
 error,purchase.purchase,0,"It misses an ""Account Payable"" on the party ""%s""!","¡Al tercero le hace falta una ""Cuenta de Pagos""!",0
-error,stock.packing.in,0,You cannot reset to draft a move generated by a purchase.,No puede revertir a borrador un movimiento generado por una compra.,0
+error,stock.shipment.in,0,You cannot reset to draft a move generated by a purchase.,No puede revertir a borrador un movimiento generado por una compra.,0
 field,"account.invoice,purchase_exception_state",0,Exception State,Estado Excepción,0
 field,"product.template,product_suppliers",0,Suppliers,Proveedores,0
 field,"product.template,purchasable",0,Purchasable,Comprable,0
 field,"product.template,purchase_uom",0,Purchase UOM,UdM de Compra,0
 field,"purchase.handle.invoice.exception.ask,domain_invoices",0,Domain Invoices,Rango de facturas,0
 field,"purchase.handle.invoice.exception.ask,recreate_invoices",0,Recreate Invoices,Rehacer facturas,0
-field,"purchase.handle.packing.exception.ask,domain_moves",0,Domain Moves,Rango de movimientos,0
-field,"purchase.handle.packing.exception.ask,recreate_moves",0,Recreate Moves,Rehacer movimientos,0
+field,"purchase.handle.shipment.exception.ask,domain_moves",0,Domain Moves,Rango de movimientos,0
+field,"purchase.handle.shipment.exception.ask,recreate_moves",0,Recreate Moves,Rehacer movimientos,0
 field,"purchase.line-account.invoice.line,invoice_line",0,Invoice Line,Línea de Factura,0
 field,"purchase.line-account.invoice.line,purchase_line",0,Purchase Line,Línea de Compra,0
 field,"purchase.line-account.invoice.line,rec_name",0,Name,Nombre,0
@@ -80,10 +81,6 @@ field,"purchase.purchase,invoices_recreated",0,Recreated Invoices,Facturas recre
 field,"purchase.purchase,invoice_state",0,Invoice State,Estado de Factura,0
 field,"purchase.purchase,lines",0,Lines,Líneas,0
 field,"purchase.purchase,moves",0,Moves,Movimientos,0
-field,"purchase.purchase,packing_done",0,Shipment Done,Envío Finalizado,0
-field,"purchase.purchase,packing_exception",0,Shipments Exception,Excepción de Envío,0
-field,"purchase.purchase,packings",0,Shipments,Envíos,0
-field,"purchase.purchase,packing_state",0,Shipment State,Estado de Envío,0
 field,"purchase.purchase,party",0,Party,Terceros,0
 field,"purchase.purchase,party_lang",0,Party Language,Idioma del Tercero,0
 field,"purchase.purchase,payment_term",0,Payment Term,Término de Pago,0
@@ -93,6 +90,10 @@ field,"purchase.purchase-recreated-account.invoice,invoice",0,Invoice,Factura,0
 field,"purchase.purchase-recreated-account.invoice,purchase",0,Purchase,Compra,0
 field,"purchase.purchase-recreated-account.invoice,rec_name",0,Name,Nombre,0
 field,"purchase.purchase,reference",0,Reference,Referencia,0
+field,"purchase.purchase,shipment_done",0,Shipment Done,Envío Finalizado,0
+field,"purchase.purchase,shipment_exception",0,Shipments Exception,Excepción de Envío,0
+field,"purchase.purchase,shipments",0,Shipments,Envíos,0
+field,"purchase.purchase,shipment_state",0,Shipment State,Estado de Envío,0
 field,"purchase.purchase,state",0,State,Estado,0
 field,"purchase.purchase,supplier_reference",0,Supplier Reference,Referencia de Proveedor,0
 field,"purchase.purchase,tax_amount",0,Tax,Impuesto,0
@@ -107,15 +108,16 @@ field,"stock.move,purchase_quantity",0,Purchase Quantity,Cantidad de Compra,0
 field,"stock.move,purchase_unit",0,Purchase Unit,Unidad de Compra,0
 field,"stock.move,purchase_unit_digits",0,Purchase Unit Digits,Dígitos de Unidad de Compra,0
 field,"stock.move,purchase_unit_price",0,Purchase Unit Price,Precio Unitario de Compra,0
+field,"stock.move,purchase_visible",0,Purchase Visible,,0
 field,"stock.move,supplier",0,Supplier,Proveedor,0
 help,"purchase.handle.invoice.exception.ask,recreate_invoices",0,The selected invoices will be recreated. The other ones will be ignored.,La factura seleccionada será recreada. Las otras serán ignoradas.,0
-help,"purchase.handle.packing.exception.ask,recreate_moves",0,The selected moves will be recreated. The other ones will be ignored.,Se recrearán los movimientos seleccionados. Los demás se ignorarán.,0
+help,"purchase.handle.shipment.exception.ask,recreate_moves",0,The selected moves will be recreated. The other ones will be ignored.,Se recrearán los movimientos seleccionados. Los demás se ignorarán.,0
 help,"purchase.product_supplier,delivery_time",0,In number of days,En número de días,0
 help,"purchase.product_supplier.price,quantity",0,Minimal quantity,Cantidad Mínima,0
 model,"ir.action,name",act_purchase_form_confirmed,Confirmed Purchases,Compras confirmadas,0
 model,"ir.action,name",act_purchase_form_draft,Draft Purchases,Compras en Borrador,0
-model,"ir.action,name",wizard_invoice_handle_exception,Handle Invoice Exception,Excepción de Manejo de Factura,0
-model,"ir.action,name",wizard_packing_handle_exception,Handle Shipment Exception,Excepción de Manejo de Envío,0
+model,"ir.action,name",wizard_invoice_handle_exception,Handle Invoice Exception,Tratar Excepción de Factura,0
+model,"ir.action,name",wizard_shipment_handle_exception,Handle Shipment Exception,Tratar Excepción de Envío,0
 model,"ir.action,name",act_invoice_form,Invoices,Facturas,0
 model,"ir.action,name",act_purchase_form_new,New Purchase,Nueva Compra,0
 model,"ir.action,name",act_open_supplier,Parties associated to Purchases,Terceros Asociados a Compras,0
@@ -123,7 +125,7 @@ model,"ir.action,name",report_purchase,Purchase,Compra,0
 model,"ir.action,name",act_purchase_form,Purchases,Compras,0
 model,"ir.action,name",act_purchase_form2,Purchases,Compras,0
 model,"ir.action,name",act_purchase_form_quotation,Purchases in Quotation,Cotizaciones de Compras,0
-model,"ir.action,name",act_packing_form,Shipments,Envíos,0
+model,"ir.action,name",act_shipment_form,Shipments,Envíos,0
 model,"ir.sequence,name",sequence_purchase,Purchase,Compras,0
 model,"ir.sequence.type,name",sequence_type_purchase,Purchase,Compras,0
 model,"ir.ui.menu,name",menu_configuration,Configuration,Configuración,0
@@ -136,7 +138,7 @@ model,"ir.ui.menu,name",menu_purchase_form,Purchases,Compras,0
 model,"ir.ui.menu,name",menu_purchase_form_quotation,Purchases in Quotation,Cotizaciones de Compras,0
 model,"ir.ui.menu,name",menu_reporting,Reporting,Reportes,0
 model,"purchase.handle.invoice.exception.ask,name",0,Invoice Exception Ask,Pregunta de Excepción de Factura,0
-model,"purchase.handle.packing.exception.ask,name",0,Shipment Exception Ask,Preguntar Excepción de Envío,0
+model,"purchase.handle.shipment.exception.ask,name",0,Shipment Exception Ask,Preguntar Excepción de Envío,0
 model,"purchase.line-account.invoice.line,name",0,Purchase Line - Invoice Line,Línea de Compra - Línea de Factura,0
 model,"purchase.line-account.tax,name",0,Purchase Line - Tax,Línea de Compra - Impuesto,0
 model,"purchase.line-ignored-stock.move,name",0,Purchase Line - Ignored Move,Línea de Compra - Movimiento Ignorado,0
@@ -158,16 +160,16 @@ model,"workflow.activity,name",purchase_activity_invoice_done,Invoice Done,Factu
 model,"workflow.activity,name",purchase_activity_invoice_purchase_exception,Invoice Exception,Excepción de Factura,0
 model,"workflow.activity,name",purchase_activity_invoice_method,Invoice Method,Método de Facturación,0
 model,"workflow.activity,name",purchase_activity_invoice_method_done,Invoice Method Done,Método de Factura Completo,0
-model,"workflow.activity,name",purchase_activity_invoice_packing,Invoice Shipment,Envío de Factura,0
-model,"workflow.activity,name",purchase_activity_invoice_packing_done,Invoice Shipment Done,Envío de Factura Completo,0
-model,"workflow.activity,name",purchase_activity_invoice_packing_exception,Invoice Shipment Exception,Excepción de Envío de Factura,0
-model,"workflow.activity,name",purchase_activity_invoice_packing_method,Invoice Shipment Method,Método de Envío de Factura,0
-model,"workflow.activity,name",purchase_activity_invoice_packing_method_done,Invoice Shipment Method Done,Método de Envío de Factura Completo,0
+model,"workflow.activity,name",purchase_activity_invoice_shipment,Invoice Shipment,Envío de Factura,0
+model,"workflow.activity,name",purchase_activity_invoice_shipment_done,Invoice Shipment Done,Envío de Factura Completo,0
+model,"workflow.activity,name",purchase_activity_invoice_shipment_exception,Invoice Shipment Exception,Excepción de Envío de Factura,0
+model,"workflow.activity,name",purchase_activity_invoice_shipment_method,Invoice Shipment Method,Método de Envío de Factura,0
+model,"workflow.activity,name",purchase_activity_invoice_shipment_method_done,Invoice Shipment Method Done,Método de Envío de Factura Completo,0
 model,"workflow.activity,name",purchase_activity_quotation,Quotation,Cotización,0
-model,"workflow.activity,name",purchase_activity_packing_exception,Shipment Exception,Excepción de Envío,0
+model,"workflow.activity,name",purchase_activity_shipment_exception,Shipment Exception,Excepción de Envío,0
 model,"workflow.activity,name",purchase_activity_waiting_invoice_purchase,Waiting Invoice,Esperando Factura,0
-model,"workflow.activity,name",purchase_activity_waiting_invoice_packing,Waiting Invoice Shipment,Esperando Envío de Factura,0
-model,"workflow.activity,name",purchase_activity_waiting_packing,Waiting Shipment,Esperando Envío,0
+model,"workflow.activity,name",purchase_activity_waiting_invoice_shipment,Waiting Invoice Shipment,Esperando Envío de Factura,0
+model,"workflow.activity,name",purchase_activity_waiting_shipment,Waiting Shipment,Esperando Envío,0
 model,"workflow,name",purchase_workflow,Purchase workflow,Flujo de Trabajo de Compras,0
 odt,purchase.purchase,0,Amount,Cantidad,0
 odt,purchase.purchase,0,Date:,Fecha:,0
@@ -184,7 +186,7 @@ odt,purchase.purchase,0,Taxes:,Impuestos,0
 odt,purchase.purchase,0,Total:,Total:,0
 odt,purchase.purchase,0,Total (excl. taxes):,Total(excl. impuestos):,0
 odt,purchase.purchase,0,Unit Price,Precio Unitario,0
-odt,purchase.purchase,0,VAT:,VAT:,0
+odt,purchase.purchase,0,VAT:,IVA:,0
 selection,"account.invoice,purchase_exception_state",0,,,0
 selection,"account.invoice,purchase_exception_state",0,Ignored,Ignorado,0
 selection,"account.invoice,purchase_exception_state",0,Recreated,Rehecho,0
@@ -199,10 +201,10 @@ selection,"purchase.purchase,invoice_state",0,Exception,Excepción,0
 selection,"purchase.purchase,invoice_state",0,None,Ninguno,0
 selection,"purchase.purchase,invoice_state",0,Paid,Pagado,0
 selection,"purchase.purchase,invoice_state",0,Waiting,En Espera,0
-selection,"purchase.purchase,packing_state",0,Exception,Excepción,0
-selection,"purchase.purchase,packing_state",0,None,Ninguno,0
-selection,"purchase.purchase,packing_state",0,Received,Recibido,0
-selection,"purchase.purchase,packing_state",0,Waiting,En Espera,0
+selection,"purchase.purchase,shipment_state",0,Exception,Excepción,0
+selection,"purchase.purchase,shipment_state",0,None,Ninguno,0
+selection,"purchase.purchase,shipment_state",0,Received,Recibido,0
+selection,"purchase.purchase,shipment_state",0,Waiting,En Espera,0
 selection,"purchase.purchase,state",0,Canceled,Cancelado,0
 selection,"purchase.purchase,state",0,Confirmed,Confirmado,0
 selection,"purchase.purchase,state",0,Done,Hecho,0
@@ -217,9 +219,9 @@ view,product.template,0,Product Suppliers,Proveedores de Productos,0
 view,product.template,0,Suppliers,Proveedores,0
 view,purchase.handle.invoice.exception.ask,0,Choose invoices to recreate,Escoja una factura a rehacer,0
 view,purchase.handle.invoice.exception.ask,0,Handle Invoice Exception,Manejar excepción de factura,0
-view,purchase.handle.packing.exception.ask,0,Choose moves to recreate,Elegir movimientos a recrear,0
-view,purchase.handle.packing.exception.ask,0,Handle packing Exception,Maneje Excepciones de envío,0
-view,purchase.handle.packing.exception.ask,0,Recreated Moves,Movimientos recreados,0
+view,purchase.handle.shipment.exception.ask,0,Choose moves to recreate,Elegir movimientos a recrear,0
+view,purchase.handle.shipment.exception.ask,0,Handle shipment Exception,Maneje Excepciones de envío,0
+view,purchase.handle.shipment.exception.ask,0,Recreated Moves,Movimientos recreados,0
 view,purchase.line,0,General,General,0
 view,purchase.line,0,Notes,Notas,0
 view,purchase.line,0,Products,Productos,0
@@ -233,7 +235,7 @@ view,purchase.purchase,0,Cancel,Cancelar,0
 view,purchase.purchase,0,Confirm,Confirmar,0
 view,purchase.purchase,0,Draft,Borrador,0
 view,purchase.purchase,0,Handle Invoice Exception,Manejar excepción de factura,0
-view,purchase.purchase,0,Handle Shipment Exception,Excepción de manejo de envíos,0
+view,purchase.purchase,0,Handle Shipment Exception,Tratar Excepción de Envío,0
 view,purchase.purchase,0,Invoices,Facturas,0
 view,purchase.purchase,0,Lines,Líneas,0
 view,purchase.purchase,0,Moves,Movimientos,0
@@ -244,5 +246,5 @@ view,purchase.purchase,0,Quotation,Cotización,0
 view,purchase.purchase,0,Shipments,Envíos,0
 wizard_button,"purchase.handle.invoice.exception,init,end",0,Cancel,Cancelar,0
 wizard_button,"purchase.handle.invoice.exception,init,ok",0,Ok,Aceptar,0
-wizard_button,"purchase.handle.packing.exception,init,end",0,Cancel,Cancelar,0
-wizard_button,"purchase.handle.packing.exception,init,ok",0,Ok,Aceptar,0
+wizard_button,"purchase.handle.shipment.exception,init,end",0,Cancel,Cancelar,0
+wizard_button,"purchase.handle.shipment.exception,init,ok",0,Ok,Aceptar,0
diff --git a/es_ES.csv b/es_ES.csv
index 32305aa..e81cff9 100644
--- a/es_ES.csv
+++ b/es_ES.csv
@@ -1,20 +1,21 @@
 type,name,res_id,src,value,fuzzy
 error,account.invoice,0,You can not delete invoices that come from a purchase!,No puede borrar facturas que vienen de una compra,0
+error,account.invoice,0,You cannot reset to draft an invoice generated by a purchase.,No puede cambiar a borrador una factura generada por una compra.,0
 error,product.template,0,"Purchase prices are based on the purchase uom, are you sure to change it?","Los precios de compra están basados en la UdM de compra, ¿desea cambiarlo?",0
 error,purchase.line,0,"It misses an ""account expense"" default property!",Hace falta la propiedad predeterminada de «cuenta de gastos»,0
 error,purchase.line,0,"It misses an ""Account Expense"" on product ""%s""!",Hace falta una «Cuenta de gasto» del producto «%s»,0
 error,purchase.line,0,The supplier location is required!,Se necesita la ubicación del proveedor,0
 error,purchase.purchase,0,Invoice addresses must be defined for the quotation.,Debe definir las direcciones para la cotización.,0
 error,purchase.purchase,0,"It misses an ""Account Payable"" on the party ""%s""!",Al tercero «%s» le hace falta una «Cuenta de pagos»,0
-error,stock.packing.in,0,You cannot reset to draft a move generated by a purchase.,No puede restablecer a borrador un movimiento generado por una compra.,0
+error,stock.shipment.in,0,You cannot reset to draft a move generated by a purchase.,No puede restablecer a borrador un movimiento generado por una compra.,0
 field,"account.invoice,purchase_exception_state",0,Exception State,Estado excepción,0
 field,"product.template,product_suppliers",0,Suppliers,Proveedores,0
 field,"product.template,purchasable",0,Purchasable,Comprable,0
 field,"product.template,purchase_uom",0,Purchase UOM,UdM de compra,0
 field,"purchase.handle.invoice.exception.ask,domain_invoices",0,Domain Invoices,Facturas de dominio,0
 field,"purchase.handle.invoice.exception.ask,recreate_invoices",0,Recreate Invoices,Rehacer facturas,0
-field,"purchase.handle.packing.exception.ask,domain_moves",0,Domain Moves,Movimientos de dominio,0
-field,"purchase.handle.packing.exception.ask,recreate_moves",0,Recreate Moves,Rehacer movimientos,0
+field,"purchase.handle.shipment.exception.ask,domain_moves",0,Domain Moves,Movimientos de dominio,0
+field,"purchase.handle.shipment.exception.ask,recreate_moves",0,Recreate Moves,Rehacer movimientos,0
 field,"purchase.line-account.invoice.line,invoice_line",0,Invoice Line,Línea de factura,0
 field,"purchase.line-account.invoice.line,purchase_line",0,Purchase Line,Línea de compra,0
 field,"purchase.line-account.invoice.line,rec_name",0,Name,Nombre,0
@@ -27,7 +28,7 @@ field,"purchase.line-ignored-stock.move,move",0,Move,Movimiento,0
 field,"purchase.line-ignored-stock.move,purchase_line",0,Purchase Line,Línea de compra,0
 field,"purchase.line-ignored-stock.move,rec_name",0,Name,Nombre,0
 field,"purchase.line,invoice_lines",0,Invoice Lines,Líneas de factura,0
-field,"purchase.line,move_done",0,Moves Done,Movimientos hechos,0
+field,"purchase.line,move_done",0,Moves Done,Movimientos terminados,0
 field,"purchase.line,move_exception",0,Moves Exception,Exepción de movimientos,0
 field,"purchase.line,moves",0,Moves,Movimientos,0
 field,"purchase.line,moves_ignored",0,Ignored Moves,Movimientos ignorados,0
@@ -80,10 +81,6 @@ field,"purchase.purchase,invoices_recreated",0,Recreated Invoices,Facturas recre
 field,"purchase.purchase,invoice_state",0,Invoice State,Estado de factura,0
 field,"purchase.purchase,lines",0,Lines,Líneas,0
 field,"purchase.purchase,moves",0,Moves,Movimientos,0
-field,"purchase.purchase,packing_done",0,Shipment Done,Envío Finalizado,0
-field,"purchase.purchase,packing_exception",0,Shipments Exception,Excepción de envios,0
-field,"purchase.purchase,packings",0,Shipments,Envíos,0
-field,"purchase.purchase,packing_state",0,Shipment State,Estado de envío,0
 field,"purchase.purchase,party",0,Party,Terceros,0
 field,"purchase.purchase,party_lang",0,Party Language,Idioma del tercero,0
 field,"purchase.purchase,payment_term",0,Payment Term,Término de pago,0
@@ -93,6 +90,10 @@ field,"purchase.purchase-recreated-account.invoice,invoice",0,Invoice,Factura,0
 field,"purchase.purchase-recreated-account.invoice,purchase",0,Purchase,Compra,0
 field,"purchase.purchase-recreated-account.invoice,rec_name",0,Name,Nombre,0
 field,"purchase.purchase,reference",0,Reference,Referencia,0
+field,"purchase.purchase,shipment_done",0,Shipment Done,Envío terminado,0
+field,"purchase.purchase,shipment_exception",0,Shipments Exception,Excepción de envios,0
+field,"purchase.purchase,shipments",0,Shipments,Envíos,0
+field,"purchase.purchase,shipment_state",0,Shipment State,Estado de envío,0
 field,"purchase.purchase,state",0,State,Estado,0
 field,"purchase.purchase,supplier_reference",0,Supplier Reference,Referencia de proveedor,0
 field,"purchase.purchase,tax_amount",0,Tax,Impuesto,0
@@ -107,15 +108,16 @@ field,"stock.move,purchase_quantity",0,Purchase Quantity,Cantidad de compra,0
 field,"stock.move,purchase_unit",0,Purchase Unit,Unidad de compra,0
 field,"stock.move,purchase_unit_digits",0,Purchase Unit Digits,Decimales de la unidad de compra,0
 field,"stock.move,purchase_unit_price",0,Purchase Unit Price,Precio de la unidad de compra,0
+field,"stock.move,purchase_visible",0,Purchase Visible,Compra visible,0
 field,"stock.move,supplier",0,Supplier,Proveedor,0
 help,"purchase.handle.invoice.exception.ask,recreate_invoices",0,The selected invoices will be recreated. The other ones will be ignored.,La factura seleccionada será recreada. Las otras serán ignoradas.,0
-help,"purchase.handle.packing.exception.ask,recreate_moves",0,The selected moves will be recreated. The other ones will be ignored.,Los movimientos seleccionados se reharán. Los demás se ignorarán.,0
+help,"purchase.handle.shipment.exception.ask,recreate_moves",0,The selected moves will be recreated. The other ones will be ignored.,Los movimientos seleccionados se reharán. Los demás se ignorarán.,0
 help,"purchase.product_supplier,delivery_time",0,In number of days,En número de días,0
 help,"purchase.product_supplier.price,quantity",0,Minimal quantity,Cantidad mínima,0
 model,"ir.action,name",act_purchase_form_confirmed,Confirmed Purchases,Compras confirmadas,0
 model,"ir.action,name",act_purchase_form_draft,Draft Purchases,Compras en borrador,0
 model,"ir.action,name",wizard_invoice_handle_exception,Handle Invoice Exception,Gestionar excepción de factura,0
-model,"ir.action,name",wizard_packing_handle_exception,Handle Shipment Exception,Gestionar excepción de envio,0
+model,"ir.action,name",wizard_shipment_handle_exception,Handle Shipment Exception,Gestionar excepción de envio,0
 model,"ir.action,name",act_invoice_form,Invoices,Facturas,0
 model,"ir.action,name",act_purchase_form_new,New Purchase,Nueva compra,0
 model,"ir.action,name",act_open_supplier,Parties associated to Purchases,Terceros asociados con compras,0
@@ -123,7 +125,7 @@ model,"ir.action,name",report_purchase,Purchase,Compra,0
 model,"ir.action,name",act_purchase_form,Purchases,Compras,0
 model,"ir.action,name",act_purchase_form2,Purchases,Compras,0
 model,"ir.action,name",act_purchase_form_quotation,Purchases in Quotation,Compras en cotización,0
-model,"ir.action,name",act_packing_form,Shipments,Envíos,0
+model,"ir.action,name",act_shipment_form,Shipments,Envíos,0
 model,"ir.sequence,name",sequence_purchase,Purchase,Compra,0
 model,"ir.sequence.type,name",sequence_type_purchase,Purchase,Compra,0
 model,"ir.ui.menu,name",menu_configuration,Configuration,Configuración,0
@@ -135,8 +137,8 @@ model,"ir.ui.menu,name",menu_purchase,Purchase Management,Gestión de compras,0
 model,"ir.ui.menu,name",menu_purchase_form,Purchases,Compras,0
 model,"ir.ui.menu,name",menu_purchase_form_quotation,Purchases in Quotation,Compras en cotización,0
 model,"ir.ui.menu,name",menu_reporting,Reporting,Informes,0
-model,"purchase.handle.invoice.exception.ask,name",0,Invoice Exception Ask,,0
-model,"purchase.handle.packing.exception.ask,name",0,Shipment Exception Ask,,0
+model,"purchase.handle.invoice.exception.ask,name",0,Invoice Exception Ask,Factura de excepcion - Petición,0
+model,"purchase.handle.shipment.exception.ask,name",0,Shipment Exception Ask,Envio de excepcion - Petición,0
 model,"purchase.line-account.invoice.line,name",0,Purchase Line - Invoice Line,Línea de compra - Línea de factura,0
 model,"purchase.line-account.tax,name",0,Purchase Line - Tax,Línea de compra - Impuesto,0
 model,"purchase.line-ignored-stock.move,name",0,Purchase Line - Ignored Move,Línea de compra - Movimiento Ignorado,0
@@ -152,22 +154,22 @@ model,"res.group,name",group_purchase,Purchase,Compra,0
 model,"res.group,name",group_purchase_admin,Purchase Administrator,Administrador de compra,0
 model,"workflow.activity,name",purchase_activity_cancel,Canceled,Cancelado,0
 model,"workflow.activity,name",purchase_activity_confirmed,Confirmed,Confirmado,0
-model,"workflow.activity,name",purchase_activity_done,Done,Hecho,0
+model,"workflow.activity,name",purchase_activity_done,Done,Terminada,0
 model,"workflow.activity,name",purchase_activity_draft,Draft,Borrador,0
-model,"workflow.activity,name",purchase_activity_invoice_done,Invoice Done,Factura hecha,0
+model,"workflow.activity,name",purchase_activity_invoice_done,Invoice Done,Factura terminada,0
 model,"workflow.activity,name",purchase_activity_invoice_purchase_exception,Invoice Exception,Factura de excepción,0
 model,"workflow.activity,name",purchase_activity_invoice_method,Invoice Method,Método de facturación,0
-model,"workflow.activity,name",purchase_activity_invoice_method_done,Invoice Method Done,Método de factura hecho,0
-model,"workflow.activity,name",purchase_activity_invoice_packing,Invoice Shipment,Envío de factura,0
-model,"workflow.activity,name",purchase_activity_invoice_packing_done,Invoice Shipment Done,Envío de factura hecho,0
-model,"workflow.activity,name",purchase_activity_invoice_packing_exception,Invoice Shipment Exception,Excepción de envío de factura,0
-model,"workflow.activity,name",purchase_activity_invoice_packing_method,Invoice Shipment Method,Método de envio de factura,0
-model,"workflow.activity,name",purchase_activity_invoice_packing_method_done,Invoice Shipment Method Done,Método de envío de factura hecho,0
+model,"workflow.activity,name",purchase_activity_invoice_method_done,Invoice Method Done,Método de factura terminado,0
+model,"workflow.activity,name",purchase_activity_invoice_shipment,Invoice Shipment,Envío de factura,0
+model,"workflow.activity,name",purchase_activity_invoice_shipment_done,Invoice Shipment Done,Envío de factura terminado,0
+model,"workflow.activity,name",purchase_activity_invoice_shipment_exception,Invoice Shipment Exception,Excepción de envío de factura,0
+model,"workflow.activity,name",purchase_activity_invoice_shipment_method,Invoice Shipment Method,Método de envio de factura,0
+model,"workflow.activity,name",purchase_activity_invoice_shipment_method_done,Invoice Shipment Method Done,Método de envío de factura terminado,0
 model,"workflow.activity,name",purchase_activity_quotation,Quotation,Cotización,0
-model,"workflow.activity,name",purchase_activity_packing_exception,Shipment Exception,Excepción de envio,0
+model,"workflow.activity,name",purchase_activity_shipment_exception,Shipment Exception,Excepción de envio,0
 model,"workflow.activity,name",purchase_activity_waiting_invoice_purchase,Waiting Invoice,Esperando factura,0
-model,"workflow.activity,name",purchase_activity_waiting_invoice_packing,Waiting Invoice Shipment,Esperando envío de factura,0
-model,"workflow.activity,name",purchase_activity_waiting_packing,Waiting Shipment,Esperando envio,0
+model,"workflow.activity,name",purchase_activity_waiting_invoice_shipment,Waiting Invoice Shipment,Esperando envío de factura,0
+model,"workflow.activity,name",purchase_activity_waiting_shipment,Waiting Shipment,Esperando envio,0
 model,"workflow,name",purchase_workflow,Purchase workflow,Flujo de trabajo de compra,0
 odt,purchase.purchase,0,Amount,Cantidad,0
 odt,purchase.purchase,0,Date:,Fecha:,0
@@ -199,13 +201,13 @@ selection,"purchase.purchase,invoice_state",0,Exception,Excepción,0
 selection,"purchase.purchase,invoice_state",0,None,Ninguno,0
 selection,"purchase.purchase,invoice_state",0,Paid,Pagado,0
 selection,"purchase.purchase,invoice_state",0,Waiting,En espera,0
-selection,"purchase.purchase,packing_state",0,Exception,Excepción,0
-selection,"purchase.purchase,packing_state",0,None,Ninguno,0
-selection,"purchase.purchase,packing_state",0,Received,Recibido,0
-selection,"purchase.purchase,packing_state",0,Waiting,En espera,0
+selection,"purchase.purchase,shipment_state",0,Exception,Excepción,0
+selection,"purchase.purchase,shipment_state",0,None,Ninguno,0
+selection,"purchase.purchase,shipment_state",0,Received,Recibido,0
+selection,"purchase.purchase,shipment_state",0,Waiting,En espera,0
 selection,"purchase.purchase,state",0,Canceled,Cancelado,0
 selection,"purchase.purchase,state",0,Confirmed,Confirmado,0
-selection,"purchase.purchase,state",0,Done,Hecho,0
+selection,"purchase.purchase,state",0,Done,Terminada,0
 selection,"purchase.purchase,state",0,Draft,Borrador,0
 selection,"purchase.purchase,state",0,Quotation,Presupuesto,0
 selection,"stock.move,purchase_exception_state",0,,,0
@@ -217,9 +219,9 @@ view,product.template,0,Product Suppliers,Proveedores de productos,0
 view,product.template,0,Suppliers,Proveedores,0
 view,purchase.handle.invoice.exception.ask,0,Choose invoices to recreate,Seleccione las facturas a recrear,0
 view,purchase.handle.invoice.exception.ask,0,Handle Invoice Exception,Manejar excepción de factura,0
-view,purchase.handle.packing.exception.ask,0,Choose moves to recreate,Elegir movimientos a recrear,0
-view,purchase.handle.packing.exception.ask,0,Handle packing Exception,Gestionar excepciones de envio,0
-view,purchase.handle.packing.exception.ask,0,Recreated Moves,Movimientos recreados,0
+view,purchase.handle.shipment.exception.ask,0,Choose moves to recreate,Elegir movimientos a recrear,0
+view,purchase.handle.shipment.exception.ask,0,Handle shipment Exception,Gestionar excepciones de envio,0
+view,purchase.handle.shipment.exception.ask,0,Recreated Moves,Movimientos recreados,0
 view,purchase.line,0,General,General,0
 view,purchase.line,0,Notes,Notas,0
 view,purchase.line,0,Products,Productos,0
@@ -244,5 +246,5 @@ view,purchase.purchase,0,Quotation,Presupuesto,0
 view,purchase.purchase,0,Shipments,Envíos,0
 wizard_button,"purchase.handle.invoice.exception,init,end",0,Cancel,Cancelar,0
 wizard_button,"purchase.handle.invoice.exception,init,ok",0,Ok,Aceptar,0
-wizard_button,"purchase.handle.packing.exception,init,end",0,Cancel,Cancelar,0
-wizard_button,"purchase.handle.packing.exception,init,ok",0,Ok,Aceptar,0
+wizard_button,"purchase.handle.shipment.exception,init,end",0,Cancel,Cancelar,0
+wizard_button,"purchase.handle.shipment.exception,init,ok",0,Ok,Aceptar,0
diff --git a/fr_FR.csv b/fr_FR.csv
index 9c457b4..b9cec37 100644
--- a/fr_FR.csv
+++ b/fr_FR.csv
@@ -2,20 +2,20 @@ type,name,res_id,src,value,fuzzy
 error,account.invoice,0,You can not delete invoices that come from a purchase!,Vous ne pouvez pas supprimer une facture qui provient d'un achat,0
 error,account.invoice,0,You cannot reset to draft an invoice generated by a purchase.,Vous ne pouvez pas réinitialiser une facture générée par un achat.,0
 error,product.template,0,"Purchase prices are based on the purchase uom, are you sure to change it?","Les prix d'achat sont basé sur l'UDM d'achat, êtes-vous sur de vouloir la modifier ?",0
-error,purchase.line,0,"It misses an ""account expense"" default property!","il manque une propriété par défaut ""compte de dépense"" !",0
-error,purchase.line,0,"It misses an ""Account Expense"" on product ""%s""!","Il manque un compte de dépense sur le produit ""%s"" !",0
+error,purchase.line,0,"It misses an ""account expense"" default property!","il manque une propriété par défaut ""compte de charge"" !",0
+error,purchase.line,0,"It misses an ""Account Expense"" on product ""%s""!","Il manque un compte de charge sur le produit ""%s"" !",0
 error,purchase.line,0,The supplier location is required!,L'emplacement fournisseur est requis !,0
 error,purchase.purchase,0,Invoice addresses must be defined for the quotation.,L'adresse de facturation doit être définie pour le devis.,0
-error,purchase.purchase,0,"It misses an ""Account Payable"" on the party ""%s""!","Il manque un compte de paiement sur le tiers ""%s"" !",0
-error,stock.packing.in,0,You cannot reset to draft a move generated by a purchase.,Vous ne pouvez pas réinitialiser un mouvement généré par un achat.,0
+error,purchase.purchase,0,"It misses an ""Account Payable"" on the party ""%s""!","Il manque un compte à payer sur le tiers ""%s"" !",0
+error,stock.shipment.in,0,You cannot reset to draft a move generated by a purchase.,Vous ne pouvez pas réinitialiser un mouvement généré par un achat.,0
 field,"account.invoice,purchase_exception_state",0,Exception State,État d'exception,0
 field,"product.template,product_suppliers",0,Suppliers,Fournisseurs,0
 field,"product.template,purchasable",0,Purchasable,Achetable,0
 field,"product.template,purchase_uom",0,Purchase UOM,UDM à l'achat,0
 field,"purchase.handle.invoice.exception.ask,domain_invoices",0,Domain Invoices,Domaine des factures,0
 field,"purchase.handle.invoice.exception.ask,recreate_invoices",0,Recreate Invoices,Recréer les factures,0
-field,"purchase.handle.packing.exception.ask,domain_moves",0,Domain Moves,Domaine des mouvements,0
-field,"purchase.handle.packing.exception.ask,recreate_moves",0,Recreate Moves,Recréer les mouvements,0
+field,"purchase.handle.shipment.exception.ask,domain_moves",0,Domain Moves,Domaine des mouvements,0
+field,"purchase.handle.shipment.exception.ask,recreate_moves",0,Recreate Moves,Recréer les mouvements,0
 field,"purchase.line-account.invoice.line,invoice_line",0,Invoice Line,Ligne de Facture,0
 field,"purchase.line-account.invoice.line,purchase_line",0,Purchase Line,Ligne d'achat,0
 field,"purchase.line-account.invoice.line,rec_name",0,Name,Nom,0
@@ -81,10 +81,6 @@ field,"purchase.purchase,invoices_recreated",0,Recreated Invoices,Factures recr
 field,"purchase.purchase,invoice_state",0,Invoice State,État de la facture,0
 field,"purchase.purchase,lines",0,Lines,Lignes,0
 field,"purchase.purchase,moves",0,Moves,Mouvements,0
-field,"purchase.purchase,packing_done",0,Shipment Done,Expédition effectuée,0
-field,"purchase.purchase,packing_exception",0,Shipments Exception,Expéditions en exception,0
-field,"purchase.purchase,packings",0,Shipments,Expéditions,0
-field,"purchase.purchase,packing_state",0,Shipment State,État de l'expédition,0
 field,"purchase.purchase,party",0,Party,Tiers,0
 field,"purchase.purchase,party_lang",0,Party Language,Langue du tiers,0
 field,"purchase.purchase,payment_term",0,Payment Term,Conditions de paiement,0
@@ -94,6 +90,10 @@ field,"purchase.purchase-recreated-account.invoice,invoice",0,Invoice,Facture,0
 field,"purchase.purchase-recreated-account.invoice,purchase",0,Purchase,Achat,0
 field,"purchase.purchase-recreated-account.invoice,rec_name",0,Name,Nom,0
 field,"purchase.purchase,reference",0,Reference,Référence,0
+field,"purchase.purchase,shipment_done",0,Shipment Done,Expédition effectuée,0
+field,"purchase.purchase,shipment_exception",0,Shipments Exception,Expéditions en exception,0
+field,"purchase.purchase,shipments",0,Shipments,Expéditions,0
+field,"purchase.purchase,shipment_state",0,Shipment State,État de l'expédition,0
 field,"purchase.purchase,state",0,State,État,0
 field,"purchase.purchase,supplier_reference",0,Supplier Reference,Référence fournisseur,0
 field,"purchase.purchase,tax_amount",0,Tax,Taxe,0
@@ -108,15 +108,16 @@ field,"stock.move,purchase_quantity",0,Purchase Quantity,Quantité d'achat,0
 field,"stock.move,purchase_unit",0,Purchase Unit,Unité d'achat,0
 field,"stock.move,purchase_unit_digits",0,Purchase Unit Digits,Décimales de l'unité d'achat,0
 field,"stock.move,purchase_unit_price",0,Purchase Unit Price,Prix unitaire d'achat,0
+field,"stock.move,purchase_visible",0,Purchase Visible,Achat visible,0
 field,"stock.move,supplier",0,Supplier,Fournisseur,0
 help,"purchase.handle.invoice.exception.ask,recreate_invoices",0,The selected invoices will be recreated. The other ones will be ignored.,Les factures sélectionnées seront recréés. Les autres seront ignorées.,0
-help,"purchase.handle.packing.exception.ask,recreate_moves",0,The selected moves will be recreated. The other ones will be ignored.,Les mouvements sélectionnés seront recréés. Les autres seront ignorés.,0
+help,"purchase.handle.shipment.exception.ask,recreate_moves",0,The selected moves will be recreated. The other ones will be ignored.,Les mouvements sélectionnés seront recréés. Les autres seront ignorés.,0
 help,"purchase.product_supplier,delivery_time",0,In number of days,En nombre de jours,0
 help,"purchase.product_supplier.price,quantity",0,Minimal quantity,Quantité minimale,0
 model,"ir.action,name",act_purchase_form_confirmed,Confirmed Purchases,Achats confirmés,0
 model,"ir.action,name",act_purchase_form_draft,Draft Purchases,Achats brouillons,0
 model,"ir.action,name",wizard_invoice_handle_exception,Handle Invoice Exception,Gérer l'exception de facture,0
-model,"ir.action,name",wizard_packing_handle_exception,Handle Shipment Exception,Gérer l'exception d'expédition,0
+model,"ir.action,name",wizard_shipment_handle_exception,Handle Shipment Exception,Gérer l'exception d'expédition,0
 model,"ir.action,name",act_invoice_form,Invoices,Factures,0
 model,"ir.action,name",act_purchase_form_new,New Purchase,Nouvel achat,0
 model,"ir.action,name",act_open_supplier,Parties associated to Purchases,Tiers associés à des achats,0
@@ -124,7 +125,7 @@ model,"ir.action,name",report_purchase,Purchase,Achat,0
 model,"ir.action,name",act_purchase_form,Purchases,Achats,0
 model,"ir.action,name",act_purchase_form2,Purchases,Achats,0
 model,"ir.action,name",act_purchase_form_quotation,Purchases in Quotation,Devis,0
-model,"ir.action,name",act_packing_form,Shipments,Expéditions,0
+model,"ir.action,name",act_shipment_form,Shipments,Expéditions,0
 model,"ir.sequence,name",sequence_purchase,Purchase,Achat,0
 model,"ir.sequence.type,name",sequence_type_purchase,Purchase,Achat,0
 model,"ir.ui.menu,name",menu_configuration,Configuration,Configuration,0
@@ -137,7 +138,7 @@ model,"ir.ui.menu,name",menu_purchase_form,Purchases,Achats,0
 model,"ir.ui.menu,name",menu_purchase_form_quotation,Purchases in Quotation,Devis,0
 model,"ir.ui.menu,name",menu_reporting,Reporting,Rapport,0
 model,"purchase.handle.invoice.exception.ask,name",0,Invoice Exception Ask,Exception de facture - Demande,0
-model,"purchase.handle.packing.exception.ask,name",0,Shipment Exception Ask,Exception d'expédition - Demande,0
+model,"purchase.handle.shipment.exception.ask,name",0,Shipment Exception Ask,Exception d'expédition - Demande,0
 model,"purchase.line-account.invoice.line,name",0,Purchase Line - Invoice Line,Ligne d'achat - Ligne de facture,0
 model,"purchase.line-account.tax,name",0,Purchase Line - Tax,Ligne d'achat - Taxe,0
 model,"purchase.line-ignored-stock.move,name",0,Purchase Line - Ignored Move,Ligne d'achat - Mouvement ignoré,0
@@ -159,16 +160,16 @@ model,"workflow.activity,name",purchase_activity_invoice_done,Invoice Done,Factu
 model,"workflow.activity,name",purchase_activity_invoice_purchase_exception,Invoice Exception,Facture en exception,0
 model,"workflow.activity,name",purchase_activity_invoice_method,Invoice Method,Méthode de facturation,0
 model,"workflow.activity,name",purchase_activity_invoice_method_done,Invoice Method Done,Méthode de facturation faite,0
-model,"workflow.activity,name",purchase_activity_invoice_packing,Invoice Shipment,Facture d'expédition,0
-model,"workflow.activity,name",purchase_activity_invoice_packing_done,Invoice Shipment Done,Facture expédition faite,0
-model,"workflow.activity,name",purchase_activity_invoice_packing_exception,Invoice Shipment Exception,Facture expédition en exception,0
-model,"workflow.activity,name",purchase_activity_invoice_packing_method,Invoice Shipment Method,Méthode facture expédition,0
-model,"workflow.activity,name",purchase_activity_invoice_packing_method_done,Invoice Shipment Method Done,Méthode facture expédition faite,0
+model,"workflow.activity,name",purchase_activity_invoice_shipment,Invoice Shipment,Facture d'expédition,0
+model,"workflow.activity,name",purchase_activity_invoice_shipment_done,Invoice Shipment Done,Facture expédition faite,0
+model,"workflow.activity,name",purchase_activity_invoice_shipment_exception,Invoice Shipment Exception,Facture expédition en exception,0
+model,"workflow.activity,name",purchase_activity_invoice_shipment_method,Invoice Shipment Method,Méthode facture expédition,0
+model,"workflow.activity,name",purchase_activity_invoice_shipment_method_done,Invoice Shipment Method Done,Méthode facture expédition faite,0
 model,"workflow.activity,name",purchase_activity_quotation,Quotation,Devis,0
-model,"workflow.activity,name",purchase_activity_packing_exception,Shipment Exception,Expédition en exception,0
+model,"workflow.activity,name",purchase_activity_shipment_exception,Shipment Exception,Expédition en exception,0
 model,"workflow.activity,name",purchase_activity_waiting_invoice_purchase,Waiting Invoice,Facture en attente,0
-model,"workflow.activity,name",purchase_activity_waiting_invoice_packing,Waiting Invoice Shipment,Facture expédition en attente,0
-model,"workflow.activity,name",purchase_activity_waiting_packing,Waiting Shipment,Expédition en attente,0
+model,"workflow.activity,name",purchase_activity_waiting_invoice_shipment,Waiting Invoice Shipment,Facture expédition en attente,0
+model,"workflow.activity,name",purchase_activity_waiting_shipment,Waiting Shipment,Expédition en attente,0
 model,"workflow,name",purchase_workflow,Purchase workflow,Workflow d'achat,0
 odt,purchase.purchase,0,Amount,Montant,0
 odt,purchase.purchase,0,Date:,Date:,0
@@ -193,17 +194,17 @@ selection,"purchase.line,type",0,Comment,Commentaire,0
 selection,"purchase.line,type",0,Line,Ligne,0
 selection,"purchase.line,type",0,Subtotal,Sous-total,0
 selection,"purchase.line,type",0,Title,Titre,0
-selection,"purchase.purchase,invoice_method",0,Based On Order,A la commande,0
-selection,"purchase.purchase,invoice_method",0,Based On Shipment,A la livraison,0
+selection,"purchase.purchase,invoice_method",0,Based On Order,À la commande,0
+selection,"purchase.purchase,invoice_method",0,Based On Shipment,À la livraison,0
 selection,"purchase.purchase,invoice_method",0,Manual,Manuel,0
 selection,"purchase.purchase,invoice_state",0,Exception,Exception,0
 selection,"purchase.purchase,invoice_state",0,None,Aucun,0
 selection,"purchase.purchase,invoice_state",0,Paid,Payé,0
 selection,"purchase.purchase,invoice_state",0,Waiting,En attente,0
-selection,"purchase.purchase,packing_state",0,Exception,Exception,0
-selection,"purchase.purchase,packing_state",0,None,Aucun,0
-selection,"purchase.purchase,packing_state",0,Received,Reçu,0
-selection,"purchase.purchase,packing_state",0,Waiting,En attente,0
+selection,"purchase.purchase,shipment_state",0,Exception,Exception,0
+selection,"purchase.purchase,shipment_state",0,None,Aucun,0
+selection,"purchase.purchase,shipment_state",0,Received,Reçu,0
+selection,"purchase.purchase,shipment_state",0,Waiting,En attente,0
 selection,"purchase.purchase,state",0,Canceled,Annulé,0
 selection,"purchase.purchase,state",0,Confirmed,Confirmé,0
 selection,"purchase.purchase,state",0,Done,Fait,0
@@ -218,9 +219,9 @@ view,product.template,0,Product Suppliers,Produit Fournisseur,0
 view,product.template,0,Suppliers,Fournisseurs,0
 view,purchase.handle.invoice.exception.ask,0,Choose invoices to recreate,Choisir les factures à recréer,0
 view,purchase.handle.invoice.exception.ask,0,Handle Invoice Exception,Gérer l'exception de facture,0
-view,purchase.handle.packing.exception.ask,0,Choose moves to recreate,Choisir les mouvements à recréer,0
-view,purchase.handle.packing.exception.ask,0,Handle packing Exception,Gérer l'exception d'expédition,0
-view,purchase.handle.packing.exception.ask,0,Recreated Moves,Mouvements recréés,0
+view,purchase.handle.shipment.exception.ask,0,Choose moves to recreate,Choisir les mouvements à recréer,0
+view,purchase.handle.shipment.exception.ask,0,Handle shipment Exception,Gérer l'exception d'expédition,0
+view,purchase.handle.shipment.exception.ask,0,Recreated Moves,Mouvements recréés,0
 view,purchase.line,0,General,Général,0
 view,purchase.line,0,Notes,Notes,0
 view,purchase.line,0,Products,Produits,0
@@ -247,5 +248,5 @@ view,purchase.purchase,0,Quotation,Devis,0
 view,purchase.purchase,0,Shipments,Expéditions,0
 wizard_button,"purchase.handle.invoice.exception,init,end",0,Cancel,Annuler,0
 wizard_button,"purchase.handle.invoice.exception,init,ok",0,Ok,Ok,0
-wizard_button,"purchase.handle.packing.exception,init,end",0,Cancel,Annuler,0
-wizard_button,"purchase.handle.packing.exception,init,ok",0,Ok,Ok,0
+wizard_button,"purchase.handle.shipment.exception,init,end",0,Cancel,Annuler,0
+wizard_button,"purchase.handle.shipment.exception,init,ok",0,Ok,Ok,0
diff --git a/purchase.py b/purchase.py
index 039d847..f671498 100644
--- a/purchase.py
+++ b/purchase.py
@@ -2,7 +2,7 @@
 #of this repository contains the full copyright notices and license terms.
 "Purchase"
 from trytond.model import ModelWorkflow, ModelView, ModelSQL, fields
-from trytond.report import CompanyReport
+from trytond.modules.company import CompanyReport
 from trytond.wizard import Wizard
 from trytond.backend import TableHandler
 from decimal import Decimal
@@ -22,7 +22,7 @@ class Purchase(ModelWorkflow, ModelSQL, ModelView):
     company = fields.Many2One('company.company', 'Company', required=True,
             states={
                 'readonly': "state != 'draft' or bool(lines)",
-            }, domain="[('id', '=', context.get('company', 0))]")
+            }, domain=["('id', '=', context.get('company', 0))"])
     reference = fields.Char('Reference', size=None, readonly=True, select=1)
     supplier_reference = fields.Char('Supplier Reference', select=1)
     description = fields.Char('Description', size=None, states=_STATES)
@@ -42,7 +42,7 @@ class Purchase(ModelWorkflow, ModelSQL, ModelView):
     party_lang = fields.Function('get_function_fields', type='char',
             string='Party Language', on_change_with=['party'])
     invoice_address = fields.Many2One('party.address', 'Invoice Address',
-            domain="[('party', '=', party)]", states=_STATES)
+            domain=["('party', '=', party)"], states=_STATES)
     warehouse = fields.Many2One('stock.location', 'Warehouse',
             domain=[('type', '=', 'warehouse')], required=True, states=_STATES)
     currency = fields.Many2One('currency.currency', 'Currency', required=True,
@@ -63,7 +63,7 @@ class Purchase(ModelWorkflow, ModelSQL, ModelView):
     invoice_method = fields.Selection([
         ('manual', 'Manual'),
         ('order', 'Based On Order'),
-        ('packing', 'Based On Shipment'),
+        ('shipment', 'Based On Shipment'),
     ], 'Invoice Method', required=True, states=_STATES)
     invoice_state = fields.Selection([
         ('none', 'None'),
@@ -83,19 +83,19 @@ class Purchase(ModelWorkflow, ModelSQL, ModelView):
             string='Invoices Paid')
     invoice_exception = fields.Function('get_function_fields', type='boolean',
             string='Invoices Exception')
-    packing_state = fields.Selection([
+    shipment_state = fields.Selection([
         ('none', 'None'),
         ('waiting', 'Waiting'),
         ('received', 'Received'),
         ('exception', 'Exception'),
     ], 'Shipment State', readonly=True, required=True)
-    packings = fields.Function('get_function_fields', type='many2many',
-            relation='stock.packing.in', string='Shipments')
+    shipments = fields.Function('get_function_fields', type='many2many',
+            relation='stock.shipment.in', string='Shipments')
     moves = fields.Function('get_function_fields', type='many2many',
             relation='stock.move', string='Moves')
-    packing_done = fields.Function('get_function_fields', type='boolean',
+    shipment_done = fields.Function('get_function_fields', type='boolean',
             string='Shipment Done')
-    packing_exception = fields.Function('get_function_fields', type='boolean',
+    shipment_exception = fields.Function('get_function_fields', type='boolean',
             string='Shipments Exception')
 
     def __init__(self):
@@ -109,6 +109,29 @@ class Purchase(ModelWorkflow, ModelSQL, ModelView):
                         'an "Account Payable" on the party "%s"!',
             })
 
+    def init(self, cursor, module_name):
+        # Migration from 1.2: packing renamed into shipment
+        cursor.execute("UPDATE ir_model_data "\
+                "SET fs_id = REPLACE(fs_id, 'packing', 'shipment') "\
+                "WHERE fs_id like '%%packing%%' AND module = %s",
+                (module_name,))
+        cursor.execute("UPDATE ir_model_field "\
+                "SET relation = REPLACE(relation, 'packing', 'shipment'), "\
+                    "name = REPLACE(name, 'packing', 'shipment') "
+                "WHERE (relation like '%%packing%%' "\
+                    "OR name like '%%packing%%') AND module = %s",
+                (module_name,))
+        table = TableHandler(cursor, self, module_name)
+        table.column_rename('packing_state', 'shipment_state')
+
+        super(Purchase, self).init(cursor, module_name)
+
+        # Migration from 1.2: rename packing to shipment in
+        # invoice_method values
+        cursor.execute("UPDATE " + self._table + " "\
+                "SET invoice_method = 'shipment' "\
+                "WHERE invoice_method = 'packing'")
+
     def default_payment_term(self, cursor, user, context=None):
         payment_term_obj = self.pool.get('account.invoice.payment_term')
         payment_term_ids = payment_term_obj.search(cursor, user,
@@ -169,7 +192,7 @@ class Purchase(ModelWorkflow, ModelSQL, ModelView):
     def default_invoice_state(self, cursor, user, context=None):
         return 'none'
 
-    def default_packing_state(self, cursor, user, context=None):
+    def default_shipment_state(self, cursor, user, context=None):
         return 'none'
 
     def on_change_party(self, cursor, user, ids, vals, context=None):
@@ -334,17 +357,17 @@ class Purchase(ModelWorkflow, ModelSQL, ModelView):
         if 'invoice_exception' in names:
             res['invoice_exception'] = self.get_invoice_exception(cursor, user,
                     purchases, context=context)
-        if 'packings' in names:
-            res['packings'] = self.get_packings(cursor, user, purchases,
+        if 'shipments' in names:
+            res['shipments'] = self.get_shipments(cursor, user, purchases,
                     context=context)
         if 'moves' in names:
             res['moves'] = self.get_moves(cursor, user, purchases,
                     context=context)
-        if 'packing_done' in names:
-            res['packing_done'] = self.get_packing_done(cursor, user,
+        if 'shipment_done' in names:
+            res['shipment_done'] = self.get_shipment_done(cursor, user,
                     purchases, context=context)
-        if 'packing_exception' in names:
-            res['packing_exception'] = self.get_packing_exception(cursor,
+        if 'shipment_exception' in names:
+            res['shipment_exception'] = self.get_shipment_exception(cursor,
                     user, purchases, context=context)
         return res
 
@@ -504,25 +527,25 @@ class Purchase(ModelWorkflow, ModelSQL, ModelView):
             res[purchase.id] = val
         return res
 
-    def get_packings(self, cursor, user, purchases, context=None):
+    def get_shipments(self, cursor, user, purchases, context=None):
         '''
-        Return the packings for the purchases.
+        Return the shipments for the purchases.
 
         :param cursor: the database cursor
         :param user: the user id
         :param purchases: a BrowseRecordList of purchases
         :param context: the context
         :return: a dictionary with purchase id as key and
-            a list of packing_in id as value
+            a list of shipment_in id as value
         '''
         res = {}
         for purchase in purchases:
             res[purchase.id] = []
             for line in purchase.lines:
                 for move in line.moves:
-                    if move.packing_in:
-                        if move.packing_in.id not in res[purchase.id]:
-                            res[purchase.id].append(move.packing_in.id)
+                    if move.shipment_in:
+                        if move.shipment_in.id not in res[purchase.id]:
+                            res[purchase.id].append(move.shipment_in.id)
         return res
 
     def get_moves(self, cursor, user, purchases, context=None):
@@ -543,7 +566,7 @@ class Purchase(ModelWorkflow, ModelSQL, ModelView):
                 res[purchase.id].extend([x.id for x in line.moves])
         return res
 
-    def get_packing_done(self, cursor, user, purchases, context=None):
+    def get_shipment_done(self, cursor, user, purchases, context=None):
         '''
         Return if all the move have been done for the purchases
 
@@ -564,9 +587,9 @@ class Purchase(ModelWorkflow, ModelSQL, ModelView):
             res[purchase.id] = val
         return res
 
-    def get_packing_exception(self, cursor, user, purchases, context=None):
+    def get_shipment_exception(self, cursor, user, purchases, context=None):
         '''
-        Return if there is a packing in exception for the purchases
+        Return if there is a shipment in exception for the purchases
 
         :param cursor: the database cursor
         :param user: the user id
@@ -618,7 +641,7 @@ class Purchase(ModelWorkflow, ModelSQL, ModelView):
         default['invoice_state'] = 'none'
         default['invoices'] = False
         default['invoices_ignored'] = False
-        default['packing_state'] = 'none'
+        default['shipment_state'] = 'none'
         return super(Purchase, self).copy(cursor, user, ids, default=default,
                 context=context)
 
@@ -672,6 +695,39 @@ class Purchase(ModelWorkflow, ModelSQL, ModelView):
                 res[line.id] = val
         return res
 
+    def _get_invoice_purchase(self, cursor, user, purchase, context=None):
+        '''
+        Return invoice values for purchase
+
+        :param cursor: the database cursor
+        :param user: the user id
+        :param purchase: the BrowseRecord of the purchase
+        :param context: the context
+
+        :return: a dictionary with purchase fields as key and
+            purchase values as value
+        '''
+        journal_obj = self.pool.get('account.journal')
+
+        journal_id = journal_obj.search(cursor, user, [
+            ('type', '=', 'expense'),
+            ], limit=1, context=context)
+        if journal_id:
+            journal_id = journal_id[0]
+
+        res = {
+            'company': purchase.company.id,
+            'type': 'in_invoice',
+            'reference': purchase.reference,
+            'journal': journal_id,
+            'party': purchase.party.id,
+            'invoice_address': purchase.invoice_address.id,
+            'currency': purchase.currency.id,
+            'account': purchase.party.account_payable.id,
+            'payment_term': purchase.payment_term.id,
+        }
+        return res
+
     def create_invoice(self, cursor, user, purchase_id, context=None):
         '''
         Create invoice for the purchase id
@@ -683,7 +739,6 @@ class Purchase(ModelWorkflow, ModelSQL, ModelView):
         :return: the id of the invoice or None
         '''
         invoice_obj = self.pool.get('account.invoice')
-        journal_obj = self.pool.get('account.journal')
         invoice_line_obj = self.pool.get('account.invoice.line')
         purchase_line_obj = self.pool.get('purchase.line')
 
@@ -701,25 +756,10 @@ class Purchase(ModelWorkflow, ModelSQL, ModelView):
         if not invoice_lines:
             return
 
-        journal_id = journal_obj.search(cursor, user, [
-            ('type', '=', 'expense'),
-            ], limit=1, context=context)
-        if journal_id:
-            journal_id = journal_id[0]
-
         ctx = context.copy()
         ctx['user'] = user
-        invoice_id = invoice_obj.create(cursor, 0, {
-            'company': purchase.company.id,
-            'type': 'in_invoice',
-            'reference': purchase.reference,
-            'journal': journal_id,
-            'party': purchase.party.id,
-            'invoice_address': purchase.invoice_address.id,
-            'currency': purchase.currency.id,
-            'account': purchase.party.account_payable.id,
-            'payment_term': purchase.payment_term.id,
-        }, context=ctx)
+        vals = self._get_invoice_purchase(cursor, user, purchase, context=context)
+        invoice_id = invoice_obj.create(cursor, 0, vals, context=ctx)
 
         for line_id in invoice_lines:
             for vals in invoice_lines[line_id]:
@@ -817,8 +857,8 @@ class PurchaseLine(ModelSQL, ModelView):
                 'required': "product",
                 'invisible': "type != 'line'",
                 'readonly': "not globals().get('_parent_purchase')",
-            }, domain="[('category', '=', " \
-                    "(product, 'product.default_uom.category'))]",
+            }, domain=["('category', '=', " \
+                    "(product, 'product.default_uom.category'))"],
             context="{'category': (product, 'product.default_uom.category')}",
             on_change=['product', 'quantity', 'unit', '_parent_purchase.currency',
                 '_parent_purchase.party'])
@@ -1319,10 +1359,9 @@ class Template(ModelSQL, ModelView):
         'readonly': "active == False",
         'invisible': "not purchasable",
         'required': "purchasable",
-        }, domain="[('category', '=', " \
-                "(default_uom, 'uom.category'))]",
+        }, domain=["('category', '=', (default_uom, 'uom.category'))"],
         context="{'category': (default_uom, 'uom.category')}",
-        on_change_with=['default_uom', 'purchase_uom'])
+        on_change_with=['default_uom', 'purchase_uom', 'purchasable'])
 
     def __init__(self):
         super(Template, self).__init__()
@@ -1330,7 +1369,28 @@ class Template(ModelSQL, ModelView):
                 'change_purchase_uom': 'Purchase prices are based on the purchase uom, '\
                     'are you sure to change it?',
             })
-
+        if 'not bool(account_category) and bool(purchasable)' not in \
+                self.account_expense.states.get('required', ''):
+            self.account_expense = copy.copy(self.account_expense)
+            self.account_expense.states = copy.copy(self.account_expense.states)
+            if not self.account_expense.states.get('required'):
+                self.account_expense.states['required'] = \
+                        "not bool(account_category) and bool(purchasable)"
+            else:
+                self.account_expense.states['required'] = '(' + \
+                        self.account_expense.states['required'] + ') ' \
+                        'or (not bool(account_category) and bool(purchasable))'
+        if 'account_category' not in self.account_expense.depends:
+            self.account_expense = copy.copy(self.account_expense)
+            self.account_expense.depends = \
+                    copy.copy(self.account_expense.depends)
+            self.account_expense.depends.append('account_category')
+        if 'purchasable' not in self.account_expense.depends:
+            self.account_expense = copy.copy(self.account_expense)
+            self.account_expense.depends = \
+                    copy.copy(self.account_expense.depends)
+            self.account_expense.depends.append('purchasable')
+        self._reset_columns()
 
     def default_purchasable(self, cursor, user, context=None):
         if context is None:
@@ -1465,7 +1525,7 @@ class ProductSupplier(ModelSQL, ModelView):
             'product_supplier', 'Prices')
     company = fields.Many2One('company.company', 'Company', required=True,
             ondelete='CASCADE', select=1,
-            domain="[('id', '=', context.get('company', 0))]")
+            domain=["('id', '=', context.get('company', 0))"])
     delivery_time = fields.Integer('Delivery Time',
             help="In number of days")
 
@@ -1552,11 +1612,11 @@ class ProductSupplierPrice(ModelSQL, ModelView):
 ProductSupplierPrice()
 
 
-class PackingIn(ModelSQL, ModelView):
-    _name = 'stock.packing.in'
+class ShipmentIn(ModelSQL, ModelView):
+    _name = 'stock.shipment.in'
 
     def __init__(self):
-        super(PackingIn, self).__init__()
+        super(ShipmentIn, self).__init__()
         self.incoming_moves = copy.copy(self.incoming_moves)
         if "('supplier', '=', supplier)" not in self.incoming_moves.add_remove:
             self.incoming_moves.add_remove = "[" + \
@@ -1573,7 +1633,7 @@ class PackingIn(ModelSQL, ModelView):
         purchase_obj = self.pool.get('purchase.purchase')
         purchase_line_obj = self.pool.get('purchase.line')
 
-        res = super(PackingIn, self).write(cursor, user, ids, vals,
+        res = super(ShipmentIn, self).write(cursor, user, ids, vals,
                 context=context)
 
         if 'state' in vals and vals['state'] in ('received', 'cancel'):
@@ -1581,8 +1641,8 @@ class PackingIn(ModelSQL, ModelView):
             move_ids = []
             if isinstance(ids, (int, long)):
                 ids = [ids]
-            for packing in self.browse(cursor, user, ids, context=context):
-                move_ids.extend([x.id for x in packing.incoming_moves])
+            for shipment in self.browse(cursor, user, ids, context=context):
+                move_ids.extend([x.id for x in shipment.incoming_moves])
 
             purchase_line_ids = purchase_line_obj.search(cursor, user, [
                 ('moves', 'in', move_ids),
@@ -1594,19 +1654,19 @@ class PackingIn(ModelSQL, ModelView):
                         purchase_ids.append(purchase_line.purchase.id)
 
             purchase_obj.workflow_trigger_validate(cursor, user, purchase_ids,
-                    'packing_update', context=context)
+                    'shipment_update', context=context)
         return res
 
     def button_draft(self, cursor, user, ids, context=None):
-        for packing in self.browse(cursor, user, ids, context=context):
-            for move in packing.incoming_moves:
+        for shipment in self.browse(cursor, user, ids, context=context):
+            for move in shipment.incoming_moves:
                 if move.state == 'cancel' and move.purchase_line:
                     self.raise_user_error(cursor, 'reset_move')
 
-        return super(PackingIn, self).button_draft(
+        return super(ShipmentIn, self).button_draft(
             cursor, user, ids, context=context)
 
-PackingIn()
+ShipmentIn()
 
 
 class Move(ModelSQL, ModelView):
@@ -1619,33 +1679,36 @@ class Move(ModelSQL, ModelView):
     purchase = fields.Function('get_purchase', type='many2one',
             relation='purchase.purchase', string='Purchase',
             fnct_search='search_purchase', select=1, states={
-                'invisible': "type != 'input'",
-            })
+                'invisible': "not purchase_visible",
+            }, depends=['purchase_visible'])
     purchase_quantity = fields.Function('get_purchase_fields',
             type='float', digits="(16, unit_digits)",
             string='Purchase Quantity',
             states={
-                'invisible': "type != 'input'",
-            })
+                'invisible': "not purchase_visible",
+            }, depends=['purchase_visible'])
     purchase_unit = fields.Function('get_purchase_fields',
             type='many2one', relation='product.uom',
             string='Purchase Unit',
             states={
-                'invisible': "type != 'input'",
-            })
+                'invisible': "not purchase_visible",
+            }, depends=['purchase_visible'])
     purchase_unit_digits = fields.Function('get_purchase_fields',
             type='integer', string='Purchase Unit Digits')
     purchase_unit_price = fields.Function('get_purchase_fields',
             type='numeric', digits=(16, 4), string='Purchase Unit Price',
             states={
-                'invisible': "type != 'input'",
-            })
+                'invisible': "not purchase_visible",
+            }, depends=['purchase_visible'])
     purchase_currency = fields.Function('get_purchase_fields',
             type='many2one', relation='currency.currency',
             string='Purchase Currency',
             states={
-                'invisible': "type != 'input'",
-            })
+                'invisible': "not purchase_visible",
+            }, depends=['purchase_visible'])
+    purchase_visible = fields.Function('get_purchase_visible',
+            type="boolean", string='Purchase Visible',
+            on_change_with=['from_location'])
     supplier = fields.Function('get_supplier', type='many2one',
             relation='party.party', string='Supplier',
             fnct_search='search_supplier', select=1)
@@ -1710,6 +1773,33 @@ class Move(ModelSQL, ModelView):
                         res[name][move.id] = move.purchase_line[name[9:]].id
         return res
 
+    def default_purchase_visible(self, cursor, user, context=None):
+        from_location = self.default_from_location(cursor, user,
+                context=context)
+        vals = {
+            'from_location': from_location,
+        }
+        return self.on_change_with_purchase_visible(cursor, user, [], vals,
+                context=context)
+
+    def on_change_with_purchase_visible(self, cursor, user, ids, vals,
+            context=None):
+        location_obj = self.pool.get('stock.location')
+        if vals.get('from_location'):
+            from_location = location_obj.browse(cursor, user,
+                    vals['from_location'], context=context)
+            if from_location.type == 'supplier':
+                return True
+        return False
+
+    def get_purchase_visible(self, cursor, user, ids, name, arg, context=None):
+        res = {}
+        for move in self.browse(cursor, user, ids, context=context):
+            res[move.id] = False
+            if move.from_location.type == 'supplier':
+                res[move.id] = True
+        return res
+
     def get_supplier(self, cursor, user, ids, name, arg, context=None):
         res = {}
         for move in self.browse(cursor, user, ids, context=context):
@@ -1746,7 +1836,7 @@ class Move(ModelSQL, ModelView):
                     purchase_ids.add(purchase_line.purchase.id)
             if purchase_ids:
                 purchase_obj.workflow_trigger_validate(cursor, user,
-                        list(purchase_ids), 'packing_update', context=context)
+                        list(purchase_ids), 'shipment_update', context=context)
         return res
 
     def delete(self, cursor, user, ids, context=None):
@@ -1769,7 +1859,7 @@ class Move(ModelSQL, ModelView):
                 purchase_ids.add(purchase_line.purchase.id)
             if purchase_ids:
                 purchase_obj.workflow_trigger_validate(cursor, user,
-                        list(purchase_ids), 'packing_update', context=context)
+                        list(purchase_ids), 'shipment_update', context=context)
         return res
 Move()
 
@@ -1831,9 +1921,9 @@ class Invoice(ModelSQL, ModelView):
         if isinstance(ids, (int, long)):
             ids = [ids]
         cursor.execute('SELECT id FROM purchase_invoices_rel ' \
-                'WHERE invoice IN (' + ','.join(['%s' for x in ids]) + ')',
+                'WHERE invoice IN (' + ','.join(('%s',) * len(ids)) + ')',
                 ids)
-        if cursor.rowcount:
+        if cursor.fetchone():
             self.raise_user_error(cursor, 'delete_purchase_invoice',
                     context=context)
         return super(Invoice, self).delete(cursor, user, ids,
@@ -1889,19 +1979,27 @@ class OpenSupplier(Wizard):
 OpenSupplier()
 
 
-class HandlePackingExceptionAsk(ModelView):
+class HandleShipmentExceptionAsk(ModelView):
     'Shipment Exception Ask'
-    _name = 'purchase.handle.packing.exception.ask'
+    _name = 'purchase.handle.shipment.exception.ask'
     _description = __doc__
 
     recreate_moves = fields.Many2Many(
         'stock.move', None, None, 'Recreate Moves',
-        domain="[('id', 'in', domain_moves)]", depends=['domain_moves'],
+        domain=["('id', 'in', domain_moves)"], depends=['domain_moves'],
         help='The selected moves will be recreated. '\
             'The other ones will be ignored.')
     domain_moves = fields.Many2Many(
         'stock.move', None, None, 'Domain Moves')
 
+    def init(self, cursor, module_name):
+        # Migration from 1.2: packing renamed into shipment
+        cursor.execute("UPDATE ir_model "\
+                "SET model = REPLACE(model, 'packing', 'shipment') "\
+                "WHERE model like '%%packing%%' AND module = %s",
+                (module_name,))
+        super(HandleShipmentExceptionAsk, self).init(cursor, module_name)
+
     def default_recreate_moves(self, cursor, user, context=None):
         return self.default_domain_moves(cursor, user, context=context)
 
@@ -1926,17 +2024,17 @@ class HandlePackingExceptionAsk(ModelView):
 
         return domain_moves
 
-HandlePackingExceptionAsk()
+HandleShipmentExceptionAsk()
 
-class HandlePackingException(Wizard):
+class HandleShipmentException(Wizard):
     'Handle Shipment Exception'
-    _name = 'purchase.handle.packing.exception'
+    _name = 'purchase.handle.shipment.exception'
     states = {
         'init': {
             'actions': [],
             'result': {
                 'type': 'form',
-                'object': 'purchase.handle.packing.exception.ask',
+                'object': 'purchase.handle.shipment.exception.ask',
                 'state': [
                     ('end', 'Cancel', 'tryton-cancel'),
                     ('ok', 'Ok', 'tryton-ok', True),
@@ -1984,9 +2082,9 @@ class HandlePackingException(Wizard):
                 context=context)
 
         purchase_obj.workflow_trigger_validate(cursor, user, data['id'],
-                'packing_ok', context=context)
+                'shipment_ok', context=context)
 
-HandlePackingException()
+HandleShipmentException()
 
 
 class HandleInvoiceExceptionAsk(ModelView):
@@ -1996,7 +2094,7 @@ class HandleInvoiceExceptionAsk(ModelView):
 
     recreate_invoices = fields.Many2Many(
         'account.invoice', None, None, 'Recreate Invoices',
-        domain="[('id', 'in', domain_invoices)]", depends=['domain_invoices'],
+        domain=["('id', 'in', domain_invoices)"], depends=['domain_invoices'],
         help='The selected invoices will be recreated. '\
             'The other ones will be ignored.')
     domain_invoices = fields.Many2Many(
diff --git a/purchase.xml b/purchase.xml
index 487d637..1a7f64f 100644
--- a/purchase.xml
+++ b/purchase.xml
@@ -20,9 +20,9 @@ this repository contains the full copyright notices and license terms. -->
             id="menu_configuration" groups="group_purchase_admin"
             sequence="0" icon="tryton-preferences" active="0"/>
 
-        <record model="ir.action.wizard" id="wizard_packing_handle_exception">
+        <record model="ir.action.wizard" id="wizard_shipment_handle_exception">
             <field name="name">Handle Shipment Exception</field>
-            <field name="wiz_name">purchase.handle.packing.exception</field>
+            <field name="wiz_name">purchase.handle.shipment.exception</field>
             <field name="model">purchase.purchase</field>
         </record>
 
@@ -75,8 +75,8 @@ this repository contains the full copyright notices and license terms. -->
                             <group col="2" colspan="2" id="states">
                                 <label name="invoice_state"/>
                                 <field name="invoice_state"/>
-                                <label name="packing_state"/>
-                                <field name="packing_state"/>
+                                <label name="shipment_state"/>
+                                <field name="shipment_state"/>
                             </group>
                             <group col="2" colspan="2" id="amount_state_buttons">
                                 <label name="untaxed_amount"/>
@@ -89,7 +89,7 @@ this repository contains the full copyright notices and license terms. -->
                                 <field name="state"/>
                                 <group col="6" colspan="2" id="buttons">
                                     <button name="cancel" string="Cancel"
-                                        states="{'invisible': '''not ((state in ('draft', 'quotation')) or (invoice_state == 'exception') or (packing_state == 'exception')) ''', 'readonly': '''%(group_purchase)d not in groups'''}"
+                                        states="{'invisible': '''state == 'cancel' or not ((state in ('draft', 'quotation')) or (invoice_state == 'exception') or (shipment_state == 'exception'))''', 'readonly': '''%(group_purchase)d not in groups'''}"
                                         icon="tryton-cancel"/>
                                     <button name="draft" string="Draft"
                                         states="{'invisible': '''state != 'quotation' ''', 'readonly': '''%(group_purchase)d not in groups'''}"
@@ -102,10 +102,10 @@ this repository contains the full copyright notices and license terms. -->
                                             type="action"
                                             states="{'invisible': '''invoice_state != 'exception' or state == 'cancel' ''', 'readonly': '''%(group_purchase)d not in groups'''}"
                                             icon="tryton-go-next"/>
-                                    <button name="%(wizard_packing_handle_exception)d"
+                                    <button name="%(wizard_shipment_handle_exception)d"
                                             string="Handle Shipment Exception"
                                             type="action"
-                                            states="{'invisible': '''packing_state != 'exception' or state == 'cancel' ''', 'readonly': '''%(group_purchase)d not in groups'''}"
+                                            states="{'invisible': '''shipment_state != 'exception' or state == 'cancel' ''', 'readonly': '''%(group_purchase)d not in groups'''}"
                                             icon="tryton-go-next"/>
                                     <button name="confirm" string="Confirm"
                                         states="{'invisible': '''state != 'quotation' ''', 'readonly': '''%(group_purchase)d not in groups'''}"
@@ -141,7 +141,7 @@ this repository contains the full copyright notices and license terms. -->
                                 </tree>
                             </field>
                         </page>
-                        <page string="Shipments" id="packings">
+                        <page string="Shipments" id="shipments">
                             <separator name="moves" colspan="4"/>
                             <field name="moves" colspan="4">
                                 <tree string="Moves">
@@ -155,8 +155,8 @@ this repository contains the full copyright notices and license terms. -->
                                     <field name="unit_digits" tree_invisible="1"/>
                                 </tree>
                             </field>
-                            <separator name="packings" colspan="4"/>
-                            <field name="packings" colspan="4"/>
+                            <separator name="shipments" colspan="4"/>
+                            <field name="shipments" colspan="4"/>
                         </page>
                     </notebook>
                     <field name="currency_digits" invisible="1" colspan="6"/>
@@ -181,7 +181,7 @@ this repository contains the full copyright notices and license terms. -->
                     <field name="total_amount" select="2"/>
                     <field name="state" select="2"/>
                     <field name="invoice_state" select="2"/>
-                    <field name="packing_state" select="2"/>
+                    <field name="shipment_state" select="2"/>
                     <field name="description" select="2"/>
                     <field name="currency_digits" tree_invisible="1"/>
                 </tree>
@@ -189,17 +189,17 @@ this repository contains the full copyright notices and license terms. -->
             </field>
         </record>
 
-        <record model="ir.action.act_window" id="act_packing_form">
+        <record model="ir.action.act_window" id="act_shipment_form">
             <field name="name">Shipments</field>
-            <field name="res_model">stock.packing.in</field>
+            <field name="res_model">stock.shipment.in</field>
             <field name="view_type">form</field>
-            <field name="domain">[("id", "in", packings)]</field>
+            <field name="domain">[("id", "in", shipments)]</field>
         </record>
         <record model="ir.action.keyword"
-                id="act_open_packing_keyword1">
+                id="act_open_shipment_keyword1">
             <field name="keyword">form_relate</field>
             <field name="model">purchase.purchase,0</field>
-            <field name="action" ref="act_packing_form"/>
+            <field name="action" ref="act_shipment_form"/>
         </record>
         <record model="ir.action.act_window" id="act_invoice_form">
             <field name="name">Invoices</field>
@@ -215,12 +215,12 @@ this repository contains the full copyright notices and license terms. -->
             <field name="action" ref="act_invoice_form"/>
         </record>
 
-        <record model="ir.ui.view" id="handle_packing_exception_view_form">
-            <field name="model">purchase.handle.packing.exception.ask</field>
+        <record model="ir.ui.view" id="handle_shipment_exception_view_form">
+            <field name="model">purchase.handle.shipment.exception.ask</field>
             <field name="type">form</field>
             <field name="arch" type="xml">
                 <![CDATA[
-                <form string="Handle packing Exception" col="1">
+                <form string="Handle shipment Exception" col="1">
                     <separator string="Choose moves to recreate"
                                id="choose"/>
                     <field name="recreate_moves">
@@ -372,7 +372,7 @@ this repository contains the full copyright notices and license terms. -->
         </record>
         <record model="workflow" id="purchase_workflow">
             <field name="name">Purchase workflow</field>
-            <field name="osv">purchase.purchase</field>
+            <field name="model">purchase.purchase</field>
             <field name="on_create" eval="True"/>
         </record>
         <record model="workflow.activity" id="purchase_activity_draft">
@@ -422,51 +422,51 @@ this repository contains the full copyright notices and license terms. -->
             <field name="name">Invoice Method Done</field>
             <field name="workflow" ref="purchase_workflow"/>
         </record>
-        <record model="workflow.activity" id="purchase_activity_waiting_packing">
+        <record model="workflow.activity" id="purchase_activity_waiting_shipment">
             <field name="name">Waiting Shipment</field>
             <field name="workflow" ref="purchase_workflow"/>
             <field name="kind">function</field>
-            <field name="action">write({'packing_state': 'waiting'})
create_move()</field>
+            <field name="action">write({'shipment_state': 'waiting'})
create_move()</field>
         </record>
-        <record model="workflow.activity" id="purchase_activity_packing_exception">
+        <record model="workflow.activity" id="purchase_activity_shipment_exception">
             <field name="name">Shipment Exception</field>
             <field name="workflow" ref="purchase_workflow"/>
             <field name="kind">function</field>
-            <field name="action">write({'packing_state': 'exception'})</field>
+            <field name="action">write({'shipment_state': 'exception'})</field>
         </record>
-        <record model="workflow.activity" id="purchase_activity_invoice_packing_method">
+        <record model="workflow.activity" id="purchase_activity_invoice_shipment_method">
             <field name="name">Invoice Shipment Method</field>
             <field name="workflow" ref="purchase_workflow"/>
             <field name="split_mode">OR</field>
         </record>
-        <record model="workflow.activity" id="purchase_activity_invoice_packing">
+        <record model="workflow.activity" id="purchase_activity_invoice_shipment">
             <field name="name">Invoice Shipment</field>
             <field name="workflow" ref="purchase_workflow"/>
             <field name="kind">function</field>
             <field name="action">create_invoice()
write({'invoice_state': 'waiting'})</field>
         </record>
-        <record model="workflow.activity" id="purchase_activity_waiting_invoice_packing">
+        <record model="workflow.activity" id="purchase_activity_waiting_invoice_shipment">
             <field name="name">Waiting Invoice Shipment</field>
             <field name="workflow" ref="purchase_workflow"/>
             <field name="kind">function</field>
-            <field name="action">write({'invoice_state': 'waiting', 'packing_state': 'received'})</field>
+            <field name="action">write({'invoice_state': 'waiting', 'shipment_state': 'received'})</field>
         </record>
-        <record model="workflow.activity" id="purchase_activity_invoice_packing_exception">
+        <record model="workflow.activity" id="purchase_activity_invoice_shipment_exception">
             <field name="name">Invoice Shipment Exception</field>
             <field name="workflow" ref="purchase_workflow"/>
             <field name="action">write({'invoice_state': 'exception'})</field>
         </record>
-        <record model="workflow.activity" id="purchase_activity_invoice_packing_done">
+        <record model="workflow.activity" id="purchase_activity_invoice_shipment_done">
             <field name="name">Invoice Shipment Done</field>
             <field name="workflow" ref="purchase_workflow"/>
             <field name="kind">function</field>
             <field name="action">write({'invoice_state': 'paid'})</field>
         </record>
-        <record model="workflow.activity" id="purchase_activity_invoice_packing_method_done">
+        <record model="workflow.activity" id="purchase_activity_invoice_shipment_method_done">
             <field name="name">Invoice Shipment Method Done</field>
             <field name="workflow" ref="purchase_workflow"/>
             <field name="kind">function</field>
-            <field name="action">write({'packing_state': 'received'})</field>
+            <field name="action">write({'shipment_state': 'received'})</field>
         </record>
         <record model="workflow.activity" id="purchase_activity_done">
             <field name="name">Done</field>
@@ -562,96 +562,96 @@ this repository contains the full copyright notices and license terms. -->
             <field name="act_from" ref="purchase_activity_invoice_method_done"/>
             <field name="act_to" ref="purchase_activity_done"/>
         </record>
-        <record model="workflow.transition" id="purchase_transition_confirmed_waiting_packing">
+        <record model="workflow.transition" id="purchase_transition_confirmed_waiting_shipment">
             <field name="act_from" ref="purchase_activity_confirmed"/>
-            <field name="act_to" ref="purchase_activity_waiting_packing"/>
+            <field name="act_to" ref="purchase_activity_waiting_shipment"/>
         </record>
-        <record model="workflow.transition" id="purchase_transition_waiting_packing_packing_exception">
-            <field name="act_from" ref="purchase_activity_waiting_packing"/>
-            <field name="act_to" ref="purchase_activity_packing_exception"/>
-            <field name="signal">packing_update</field>
-            <field name="condition">packing_exception</field>
+        <record model="workflow.transition" id="purchase_transition_waiting_shipment_shipment_exception">
+            <field name="act_from" ref="purchase_activity_waiting_shipment"/>
+            <field name="act_to" ref="purchase_activity_shipment_exception"/>
+            <field name="signal">shipment_update</field>
+            <field name="condition">shipment_exception</field>
         </record>
-        <record model="workflow.transition" id="purchase_transition_packing_exception_cancel">
-            <field name="act_from" ref="purchase_activity_packing_exception"/>
+        <record model="workflow.transition" id="purchase_transition_shipment_exception_cancel">
+            <field name="act_from" ref="purchase_activity_shipment_exception"/>
             <field name="act_to" ref="purchase_activity_cancel"/>
             <field name="signal">cancel</field>
             <field name="group" ref="group_purchase"/>
         </record>
-        <record model="workflow.transition" id="purchase_transition_packing_exception_waiting_packing">
-            <field name="act_from" ref="purchase_activity_packing_exception"/>
-            <field name="act_to" ref="purchase_activity_waiting_packing"/>
-            <field name="signal">packing_ok</field>
+        <record model="workflow.transition" id="purchase_transition_shipment_exception_waiting_shipment">
+            <field name="act_from" ref="purchase_activity_shipment_exception"/>
+            <field name="act_to" ref="purchase_activity_waiting_shipment"/>
+            <field name="signal">shipment_ok</field>
             <field name="group" ref="group_purchase"/>
         </record>
-        <record model="workflow.transition" id="purchase_transition_waiting_packing_invoice_packing_method">
-            <field name="act_from" ref="purchase_activity_waiting_packing"/>
-            <field name="act_to" ref="purchase_activity_invoice_packing_method"/>
-            <field name="signal">packing_update</field>
-            <field name="condition">not packing_exception</field>
-        </record>
-        <record model="workflow.transition" id="purchase_transition_waiting_packing_invoice_packing_method2">
-            <field name="act_from" ref="purchase_activity_waiting_packing"/>
-            <field name="act_to" ref="purchase_activity_invoice_packing_method"/>
-            <field name="condition">packing_done</field>
-        </record>
-        <record model="workflow.transition" id="purchase_transition_invoice_packing_method_invoice_packing">
-            <field name="act_from" ref="purchase_activity_invoice_packing_method"/>
-            <field name="act_to" ref="purchase_activity_invoice_packing"/>
-            <field name="condition">invoice_method == 'packing'</field>
-        </record>
-        <record model="workflow.transition" id="purchase_transition_invoice_packing_method_invoice_packing_method_done">
-            <field name="act_from" ref="purchase_activity_invoice_packing_method"/>
-            <field name="act_to" ref="purchase_activity_invoice_packing_method_done"/>
-            <field name="condition">invoice_method != 'packing' and packing_done</field>
-        </record>
-        <record model="workflow.transition" id="purchase_transition_invoice_packing_method_waiting_packing">
-            <field name="act_from" ref="purchase_activity_invoice_packing_method"/>
-            <field name="act_to" ref="purchase_activity_waiting_packing"/>
-            <field name="condition">invoice_method != 'packing' and not packing_done</field>
-        </record>
-        <record model="workflow.transition" id="purchase_transition_invoice_packing_waiting_packing">
-            <field name="act_from" ref="purchase_activity_invoice_packing"/>
-            <field name="act_to" ref="purchase_activity_waiting_packing"/>
-            <field name="condition">not packing_done</field>
-        </record>
-        <record model="workflow.transition" id="purchase_transition_invoice_packing_waiting_invoice_packing">
-            <field name="act_from" ref="purchase_activity_invoice_packing"/>
-            <field name="act_to" ref="purchase_activity_waiting_invoice_packing"/>
-            <field name="condition">packing_done</field>
-        </record>
-        <record model="workflow.transition" id="purchase_transition_waiting_invoice_packing_invoice_packing_exception">
-            <field name="act_from" ref="purchase_activity_waiting_invoice_packing"/>
-            <field name="act_to" ref="purchase_activity_invoice_packing_exception"/>
+        <record model="workflow.transition" id="purchase_transition_waiting_shipment_invoice_shipment_method">
+            <field name="act_from" ref="purchase_activity_waiting_shipment"/>
+            <field name="act_to" ref="purchase_activity_invoice_shipment_method"/>
+            <field name="signal">shipment_update</field>
+            <field name="condition">not shipment_exception</field>
+        </record>
+        <record model="workflow.transition" id="purchase_transition_waiting_shipment_invoice_shipment_method2">
+            <field name="act_from" ref="purchase_activity_waiting_shipment"/>
+            <field name="act_to" ref="purchase_activity_invoice_shipment_method"/>
+            <field name="condition">shipment_done</field>
+        </record>
+        <record model="workflow.transition" id="purchase_transition_invoice_shipment_method_invoice_shipment">
+            <field name="act_from" ref="purchase_activity_invoice_shipment_method"/>
+            <field name="act_to" ref="purchase_activity_invoice_shipment"/>
+            <field name="condition">invoice_method == 'shipment'</field>
+        </record>
+        <record model="workflow.transition" id="purchase_transition_invoice_shipment_method_invoice_shipment_method_done">
+            <field name="act_from" ref="purchase_activity_invoice_shipment_method"/>
+            <field name="act_to" ref="purchase_activity_invoice_shipment_method_done"/>
+            <field name="condition">invoice_method != 'shipment' and shipment_done</field>
+        </record>
+        <record model="workflow.transition" id="purchase_transition_invoice_shipment_method_waiting_shipment">
+            <field name="act_from" ref="purchase_activity_invoice_shipment_method"/>
+            <field name="act_to" ref="purchase_activity_waiting_shipment"/>
+            <field name="condition">invoice_method != 'shipment' and not shipment_done</field>
+        </record>
+        <record model="workflow.transition" id="purchase_transition_invoice_shipment_waiting_shipment">
+            <field name="act_from" ref="purchase_activity_invoice_shipment"/>
+            <field name="act_to" ref="purchase_activity_waiting_shipment"/>
+            <field name="condition">not shipment_done</field>
+        </record>
+        <record model="workflow.transition" id="purchase_transition_invoice_shipment_waiting_invoice_shipment">
+            <field name="act_from" ref="purchase_activity_invoice_shipment"/>
+            <field name="act_to" ref="purchase_activity_waiting_invoice_shipment"/>
+            <field name="condition">shipment_done</field>
+        </record>
+        <record model="workflow.transition" id="purchase_transition_waiting_invoice_shipment_invoice_shipment_exception">
+            <field name="act_from" ref="purchase_activity_waiting_invoice_shipment"/>
+            <field name="act_to" ref="purchase_activity_invoice_shipment_exception"/>
             <field name="trigger_model">account.invoice</field>
             <field name="trigger_expr_id">[x.id for x in invoices]</field>
             <field name="condition">invoice_exception</field>
         </record>
-        <record model="workflow.transition" id="purchase_transition_invoice_packing_exception_cancel">
-            <field name="act_from" ref="purchase_activity_invoice_packing_exception"/>
+        <record model="workflow.transition" id="purchase_transition_invoice_shipment_exception_cancel">
+            <field name="act_from" ref="purchase_activity_invoice_shipment_exception"/>
             <field name="act_to" ref="purchase_activity_cancel"/>
             <field name="signal">cancel</field>
             <field name="group" ref="group_purchase"/>
         </record>
-        <record model="workflow.transition" id="purchase_transition_invoice_packing_exception_waiting_invoice_packing">
-            <field name="act_from" ref="purchase_activity_invoice_packing_exception"/>
-            <field name="act_to" ref="purchase_activity_waiting_invoice_packing"/>
+        <record model="workflow.transition" id="purchase_transition_invoice_shipment_exception_waiting_invoice_shipment">
+            <field name="act_from" ref="purchase_activity_invoice_shipment_exception"/>
+            <field name="act_to" ref="purchase_activity_waiting_invoice_shipment"/>
             <field name="signal">invoice_ok</field>
             <field name="group" ref="group_purchase"/>
         </record>
-        <record model="workflow.transition" id="purchase_transition_waiting_invoice_packing_invoice_packing_done">
-            <field name="act_from" ref="purchase_activity_waiting_invoice_packing"/>
-            <field name="act_to" ref="purchase_activity_invoice_packing_done"/>
+        <record model="workflow.transition" id="purchase_transition_waiting_invoice_shipment_invoice_shipment_done">
+            <field name="act_from" ref="purchase_activity_waiting_invoice_shipment"/>
+            <field name="act_to" ref="purchase_activity_invoice_shipment_done"/>
             <field name="trigger_model">account.invoice</field>
             <field name="trigger_expr_id">[x.id for x in invoices]</field>
             <field name="condition">invoice_paid</field>
         </record>
-        <record model="workflow.transition" id="purchase_transition_invoice_packing_done_invoice_packing_method_done">
-            <field name="act_from" ref="purchase_activity_invoice_packing_done"/>
-            <field name="act_to" ref="purchase_activity_invoice_packing_method_done"/>
+        <record model="workflow.transition" id="purchase_transition_invoice_shipment_done_invoice_shipment_method_done">
+            <field name="act_from" ref="purchase_activity_invoice_shipment_done"/>
+            <field name="act_to" ref="purchase_activity_invoice_shipment_method_done"/>
         </record>
-        <record model="workflow.transition" id="purchase_transition_invoice_packing_done_done">
-            <field name="act_from" ref="purchase_activity_invoice_packing_method_done"/>
+        <record model="workflow.transition" id="purchase_transition_invoice_shipment_done_done">
+            <field name="act_from" ref="purchase_activity_invoice_shipment_method_done"/>
             <field name="act_to" ref="purchase_activity_done"/>
         </record>
 
@@ -886,9 +886,9 @@ this repository contains the full copyright notices and license terms. -->
             </field>
         </record>
 
-        <record model="ir.ui.view" id="packing_in_view_form">
-            <field name="model">stock.packing.in</field>
-            <field name="inherit" ref="stock.packing_in_view_form"/>
+        <record model="ir.ui.view" id="shipment_in_view_form">
+            <field name="model">stock.shipment.in</field>
+            <field name="inherit" ref="stock.shipment_in_view_form"/>
             <field name="arch" type="xml">
                 <![CDATA[
                 <data>
diff --git a/setup.py b/setup.py
index 2da658d..9c6e11a 100644
--- a/setup.py
+++ b/setup.py
@@ -9,17 +9,12 @@ info = eval(file('__tryton__.py').read())
 
 requires = []
 for dep in info.get('depends', []):
-    match = re.compile(
-            '(ir|res|workflow|webdav)((\s|$|<|>|<=|>=|==|!=).*?$)').match(dep)
-    if match:
-        continue
-    else:
-        dep = 'trytond_' + dep
-    requires.append(dep)
+    if not re.match(r'(ir|res|workflow|webdav)(\W|$)', dep):
+        requires.append('trytond_' + dep)
 
 major_version, minor_version, _ = info.get('version', '0.0.1').split('.', 2)
 requires.append('trytond >= %s.%s' % (major_version, minor_version))
-requires.append('trytond < %s.%s' % (major_version, str(int(minor_version) + 1)))
+requires.append('trytond < %s.%s' % (major_version, int(minor_version) + 1))
 
 setup(name='trytond_purchase',
     version=info.get('version', '0.0.1'),
diff --git a/tests/__init__.py b/tests/__init__.py
new file mode 100644
index 0000000..761e0db
--- /dev/null
+++ b/tests/__init__.py
@@ -0,0 +1,4 @@
+#This file is part of Tryton.  The COPYRIGHT file at the top level of
+#this repository contains the full copyright notices and license terms.
+
+from test_purchase import *
diff --git a/tests/test_purchase.py b/tests/test_purchase.py
new file mode 100644
index 0000000..f0a1226
--- /dev/null
+++ b/tests/test_purchase.py
@@ -0,0 +1,38 @@
+#!/usr/bin/env python
+#This file is part of Tryton.  The COPYRIGHT file at the top level of
+#this repository contains the full copyright notices and license terms.
+
+import sys, os
+DIR = os.path.abspath(os.path.normpath(os.path.join(__file__,
+    '..', '..', '..', '..', '..', 'trytond')))
+if os.path.isdir(DIR):
+    sys.path.insert(0, os.path.dirname(DIR))
+
+import unittest
+import trytond.tests.test_tryton
+from trytond.tests.test_tryton import RPCProxy, CONTEXT, SOCK, test_view
+
+
+class PurchaseTestCase(unittest.TestCase):
+    '''
+    Test Purchase module.
+    '''
+
+    def setUp(self):
+        trytond.tests.test_tryton.install_module('purchase')
+
+    def test0005views(self):
+        '''
+        Test views.
+        '''
+        self.assertRaises(Exception, test_view('purchase'))
+
+def suite():
+    return unittest.TestLoader().loadTestsFromTestCase(PurchaseTestCase)
+
+if __name__ == '__main__':
+    suiteTrytond = trytond.tests.test_tryton.suite()
+    suitePurchase = suite()
+    alltests = unittest.TestSuite([suiteTrytond, suitePurchase])
+    unittest.TextTestRunner(verbosity=2).run(alltests)
+    SOCK.disconnect()
diff --git a/trytond_purchase.egg-info/PKG-INFO b/trytond_purchase.egg-info/PKG-INFO
index 0e48f38..2dffef3 100644
--- a/trytond_purchase.egg-info/PKG-INFO
+++ b/trytond_purchase.egg-info/PKG-INFO
@@ -1,12 +1,12 @@
 Metadata-Version: 1.0
 Name: trytond-purchase
-Version: 1.2.1
+Version: 1.4.0
 Summary: Define purchase order.
 Add product supplier and purchase informations.
 Define the purchase price as the supplier price or the cost price.
 
 With the possibilities:
-    - to follow invoice and packing states from the purchase order.
+    - to follow invoice and shipment states from the purchase order.
     - to define invoice method:
         - Manual
         - Based On Order
@@ -16,7 +16,7 @@ Home-page: http://www.tryton.org/
 Author: B2CK
 Author-email: info at b2ck.com
 License: GPL-3
-Download-URL: http://downloads.tryton.org/1.2/
+Download-URL: http://downloads.tryton.org/1.4/
 Description: UNKNOWN
 Platform: UNKNOWN
 Classifier: Development Status :: 5 - Production/Stable
diff --git a/trytond_purchase.egg-info/SOURCES.txt b/trytond_purchase.egg-info/SOURCES.txt
index c9d6c92..a2a2883 100644
--- a/trytond_purchase.egg-info/SOURCES.txt
+++ b/trytond_purchase.egg-info/SOURCES.txt
@@ -16,6 +16,9 @@ setup.py
 ./__init__.py
 ./__tryton__.py
 ./purchase.py
+doc/index.rst
+tests/__init__.py
+tests/test_purchase.py
 trytond_purchase.egg-info/PKG-INFO
 trytond_purchase.egg-info/SOURCES.txt
 trytond_purchase.egg-info/dependency_links.txt
diff --git a/trytond_purchase.egg-info/requires.txt b/trytond_purchase.egg-info/requires.txt
index fbf666b..8bba34c 100644
--- a/trytond_purchase.egg-info/requires.txt
+++ b/trytond_purchase.egg-info/requires.txt
@@ -6,5 +6,5 @@ trytond_product
 trytond_account_invoice
 trytond_currency
 trytond_account_product
-trytond >= 1.2
-trytond < 1.3
\ No newline at end of file
+trytond >= 1.4
+trytond < 1.5
\ No newline at end of file
commit 8268f367b805dcabf18c8a9ca7233e6fbbba91ee
Author: Daniel Baumann <daniel at debian.org>
Date:   Fri Jul 10 14:17:22 2009 +0200

    Adding upstream version 1.2.1.

diff --git a/CHANGELOG b/CHANGELOG
index b9f6a62..2b6647b 100644
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -1,3 +1,6 @@
+Version 1.2.1 - 2009-07-07
+* Some bug fixes (see mercurial logs for details)
+
 Version 1.2.0 - 2009-04-20
 * Bug fixes (see mercurial logs for details)
 * Use the purchase uom to compute purchase price from product supplier
diff --git a/PKG-INFO b/PKG-INFO
index 5d298bd..9974321 100644
--- a/PKG-INFO
+++ b/PKG-INFO
@@ -1,6 +1,6 @@
 Metadata-Version: 1.0
 Name: trytond_purchase
-Version: 1.2.0
+Version: 1.2.1
 Summary: Define purchase order.
 Add product supplier and purchase informations.
 Define the purchase price as the supplier price or the cost price.
diff --git a/__tryton__.py b/__tryton__.py
index ff9e052..6b0ac8a 100644
--- a/__tryton__.py
+++ b/__tryton__.py
@@ -6,7 +6,7 @@
     'name_es_CO': 'Compras',
     'name_es_ES': 'Compras',
     'name_fr_FR': 'Achat',
-    'version': '1.2.0',
+    'version': '1.2.1',
     'author': 'B2CK',
     'email': 'info at b2ck.com',
     'website': 'http://www.tryton.org/',
diff --git a/purchase.py b/purchase.py
index 7a52313..039d847 100644
--- a/purchase.py
+++ b/purchase.py
@@ -251,6 +251,8 @@ class Purchase(ModelWorkflow, ModelSQL, ModelView):
     def on_change_lines(self, cursor, user, ids, vals, context=None):
         currency_obj = self.pool.get('currency.currency')
         tax_obj = self.pool.get('account.tax')
+        invoice_obj = self.pool.get('account.invoice')
+
         if context is None:
             context = {}
         res = {
@@ -266,6 +268,7 @@ class Purchase(ModelWorkflow, ModelSQL, ModelView):
             ctx = context.copy()
             ctx.update(self.get_tax_context(cursor, user, vals,
                 context=context))
+            taxes = {}
             for line in vals['lines']:
                 if line.get('type', 'line') != 'line':
                     continue
@@ -274,7 +277,16 @@ class Purchase(ModelWorkflow, ModelSQL, ModelView):
                 for tax in tax_obj.compute(cursor, user, line.get('taxes', []),
                         line.get('unit_price', Decimal('0.0')),
                         line.get('quantity', 0.0), context=context):
-                    res['tax_amount'] += tax['amount']
+                    key, val = invoice_obj._compute_tax(cursor, user, tax,
+                            'in_invoice', context=context)
+                    if not key in taxes:
+                        taxes[key] = val['amount']
+                    else:
+                        taxes[key] += val['amount']
+            if currency:
+                for key in taxes:
+                    res['tax_amount'] += currency_obj.round(cursor, user,
+                            currency, taxes[key])
         if currency:
             res['untaxed_amount'] = currency_obj.round(cursor, user, currency,
                     res['untaxed_amount'])
@@ -391,6 +403,8 @@ class Purchase(ModelWorkflow, ModelSQL, ModelView):
         '''
         currency_obj = self.pool.get('currency.currency')
         tax_obj = self.pool.get('account.tax')
+        invoice_obj = self.pool.get('account.invoice')
+
         if context is None:
             context = {}
         res = {}
@@ -399,6 +413,7 @@ class Purchase(ModelWorkflow, ModelSQL, ModelView):
             ctx.update(self.get_tax_context(cursor, user,
                 purchase, context=context))
             res.setdefault(purchase.id, Decimal('0.0'))
+            taxes = {}
             for line in purchase.lines:
                 if line.type != 'line':
                     continue
@@ -406,7 +421,15 @@ class Purchase(ModelWorkflow, ModelSQL, ModelView):
                 for tax in tax_obj.compute(
                     cursor, user, [t.id for t in line.taxes], line.unit_price,
                     line.quantity, context=ctx):
-                    res[purchase.id] += tax['amount']
+                    key, val = invoice_obj._compute_tax(cursor, user, tax,
+                            'in_invoice', context=context)
+                    if not key in taxes:
+                        taxes[key] = val['amount']
+                    else:
+                        taxes[key] += val['amount']
+            for key in taxes:
+                res[purchase.id] += currency_obj.round(cursor, user,
+                        purchase.currency, taxes[key])
             res[purchase.id] = currency_obj.round(cursor, user, purchase.currency,
                     res[purchase.id])
         return res
diff --git a/trytond_purchase.egg-info/PKG-INFO b/trytond_purchase.egg-info/PKG-INFO
index 7c10f5e..0e48f38 100644
--- a/trytond_purchase.egg-info/PKG-INFO
+++ b/trytond_purchase.egg-info/PKG-INFO
@@ -1,6 +1,6 @@
 Metadata-Version: 1.0
 Name: trytond-purchase
-Version: 1.2.0
+Version: 1.2.1
 Summary: Define purchase order.
 Add product supplier and purchase informations.
 Define the purchase price as the supplier price or the cost price.
commit 957d7afdc51df7d1e9817efa0f561f6f768cb312
Author: Daniel Baumann <daniel at debian.org>
Date:   Tue Apr 21 10:43:25 2009 +0200

    Adding upstream version 1.2.0.

diff --git a/CHANGELOG b/CHANGELOG
index bf8a718..b9f6a62 100644
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -1,7 +1,7 @@
-Version 1.0.2 - 2009-01-06
-* Some bug fixes (see mercurial logs for details)
-
-Version 1.0.1 - 2008-12-01
+Version 1.2.0 - 2009-04-20
+* Bug fixes (see mercurial logs for details)
+* Use the purchase uom to compute purchase price from product supplier
+* Add buttons to handle invoice and packing exceptions
 * Allow egg installation
 
 Version 1.0.0 - 2008-11-17
diff --git a/COPYRIGHT b/COPYRIGHT
index 37fef2d..da277a9 100644
--- a/COPYRIGHT
+++ b/COPYRIGHT
@@ -1,7 +1,7 @@
 Copyright (C) 2004-2008 Tiny SPRL.
-Copyright (C) 2008 Cédric Krier.
-Copyright (C) 2008 Bertrand Chenal.
-Copyright (C) 2008 B2CK SPRL.
+Copyright (C) 2008-2009 Cédric Krier.
+Copyright (C) 2008-2009 Bertrand Chenal.
+Copyright (C) 2008-2009 B2CK SPRL.
 
 This program is free software: you can redistribute it and/or modify
 it under the terms of the GNU General Public License as published by
diff --git a/INSTALL b/INSTALL
index fc3e707..7ad1327 100644
--- a/INSTALL
+++ b/INSTALL
@@ -18,7 +18,7 @@ Prerequisites
 Installation
 ------------
 
-Once you've downloaded and unpacked a trytond_purchase source release, enter the
+Once you've downloaded and unpacked the trytond_purchase source release, enter the
 directory where the archive was unpacked, and run:
 
     python setup.py install
diff --git a/PKG-INFO b/PKG-INFO
index ff01e1a..5d298bd 100644
--- a/PKG-INFO
+++ b/PKG-INFO
@@ -1,6 +1,6 @@
 Metadata-Version: 1.0
 Name: trytond_purchase
-Version: 1.0.2
+Version: 1.2.0
 Summary: Define purchase order.
 Add product supplier and purchase informations.
 Define the purchase price as the supplier price or the cost price.
@@ -10,13 +10,13 @@ With the possibilities:
     - to define invoice method:
         - Manual
         - Based On Order
-        - Based On Packing
+        - Based On Shipment
 
 Home-page: http://www.tryton.org/
 Author: B2CK
 Author-email: info at b2ck.com
 License: GPL-3
-Download-URL: http://downloads.tryton.org/1.0/
+Download-URL: http://downloads.tryton.org/1.2/
 Description: UNKNOWN
 Platform: UNKNOWN
 Classifier: Development Status :: 5 - Production/Stable
diff --git a/TODO b/TODO
index 2a0a2cc..c720b5a 100644
--- a/TODO
+++ b/TODO
@@ -1,4 +1,3 @@
-- Add button to recreate move when in exception
-- Add button to recreate invoice when in exception
-- Add form_relate from party to party's purchase
 - Add historization of quotation
+- Allow to customize purchase.product_supplier to handle delivery_time depending of quantity
+- Cancel draft moves and draft invoices when canceling purchase order
diff --git a/__tryton__.py b/__tryton__.py
index 021437e..ff9e052 100644
--- a/__tryton__.py
+++ b/__tryton__.py
@@ -3,9 +3,10 @@
 {
     'name': 'Purchase',
     'name_de_DE': 'Einkauf',
-    'name_fr_FR': 'Achat',
+    'name_es_CO': 'Compras',
     'name_es_ES': 'Compras',
-    'version': '1.0.2',
+    'name_fr_FR': 'Achat',
+    'version': '1.2.0',
     'author': 'B2CK',
     'email': 'info at b2ck.com',
     'website': 'http://www.tryton.org/',
@@ -18,7 +19,7 @@ With the possibilities:
     - to define invoice method:
         - Manual
         - Based On Order
-        - Based On Packing
+        - Based On Shipment
 ''',
     'description_de_DE': ''' - Dient der Erstellung von Einkaufsvorgängen (Entwurf, Angebot, Auftrag).
  - Fügt den Artikeln Lieferanten und Einkaufsinformationen hinzu.
@@ -32,16 +33,16 @@ Ermöglicht:
         - Nach Auftrag
         - Nach Lieferung
 ''',
-    'description_fr_FR': '''Defini l'ordre d'achat.
-Ajoute les fournisseurs et les informations d'achat sur le produit.
-Défini un prix d'achat par fournisseur et un prix de revient.
+    'description_es_CO': ''' - Definición de orden de compras.
+ - Se añade información de proveedor y de compra de un producto.
+ - Se define el precio de compra con el precio de proveedor o costo.
 
-Avec la possibilité:
-    - de suivre les états de la facture et du colis depuis la commande d'achat.
-    - de choisir la méthode de facturation:
-        - Manuelle
-        - Sur base de la commande
-        - Sur base du colis
+ - Con la posibilidad de:
+    - seguir el estado de facturación y empaque desde la orden de compra.
+    - elegir el método de facturación:
+        - Manual
+        - Basado en Orden
+        - Basado en Empaque
 ''',
     'description_es_ES': ''' - Definición de orden de compras.
  - Se añade información de proveedor y de compra de un producto.
@@ -54,7 +55,17 @@ Avec la possibilité:
         - Basado en Orden
         - Basado en Empaque
 ''',
+    'description_fr_FR': '''Defini l'ordre d'achat.
+Ajoute les fournisseurs et les informations d'achat sur le produit.
+Défini un prix d'achat par fournisseur et un prix de revient.
 
+Avec la possibilité:
+    - de suivre les états de la facture et du colis depuis la commande d'achat.
+    - de choisir la méthode de facturation:
+        - Manuelle
+        - Sur base de la commande
+        - Sur base du colis
+''',
     'depends': [
         'company',
         'party',
@@ -70,9 +81,11 @@ Avec la possibilité:
     ],
     'xml': [
         'purchase.xml',
+        'party.xml',
     ],
     'translation': [
         'de_DE.csv',
+        'es_CO.csv',
         'es_ES.csv',
         'fr_FR.csv',
     ],
diff --git a/de_DE.csv b/de_DE.csv
index 51863f7..5642667 100644
--- a/de_DE.csv
+++ b/de_DE.csv
@@ -1,23 +1,46 @@
 type,name,res_id,src,value,fuzzy
-error,account.invoice,0,You can not delete invoices that comes from a purchase!,Aus einem Einkauf stammende Rechnungen können nicht gelöscht werden!,0
-error,purchase.line,0,"It miss an ""account_expense"" default property!","Es ist keine allgemeine Eigenschaft ""Konto Aufwand"" definiert",0
+error,account.invoice,0,You can not delete invoices that come from a purchase!,Durch einen Einkauf generierte Rechnungen können nicht gelöscht werden!,0
+error,product.template,0,"Purchase prices are based on the purchase uom, are you sure to change it?","Einkaufspreise basieren auf der Maßeinheit für den Einkauf.
+Soll sie wirklich geändert werden?",0
+error,purchase.line,0,"It misses an ""account expense"" default property!",Es ist keine Standardeigenschaft für das Aufwandskonto definiert!,0
+error,purchase.line,0,"It misses an ""Account Expense"" on product ""%s""!","Es ist ken Aufwandskonto für Artikel ""%s"" definiert!",0
 error,purchase.line,0,The supplier location is required!,Der Lagerort des Lieferanten muss eingegeben werden!,0
-error,purchase.purchase,0,Contact and Invoice addresses must be defined for the quotation.,Kontakt- und Rechnungsadresse müssen für das Angebot angegeben werden.,0
 error,purchase.purchase,0,Invoice addresses must be defined for the quotation.,Die Rechnungsadresse muss für ein Angebot angegeben werden.,0
+error,purchase.purchase,0,"It misses an ""Account Payable"" on the party ""%s""!","Es ist kein Verbindlichkeitskonto für Partei ""%s"" definiert!",0
+error,stock.packing.in,0,You cannot reset to draft a move generated by a purchase.,Eine durch einen Einkauf generierte Bewegung kann nicht auf Entwurf zurückgesetzt werden.,0
+field,"account.invoice,purchase_exception_state",0,Exception State,Status Vorbehalt,0
 field,"product.template,product_suppliers",0,Suppliers,Lieferanten,0
 field,"product.template,purchasable",0,Purchasable,Käuflich,0
 field,"product.template,purchase_uom",0,Purchase UOM,Einheit Einkauf,0
+field,"purchase.handle.invoice.exception.ask,domain_invoices",0,Domain Invoices,Domain Rechnungen,0
+field,"purchase.handle.invoice.exception.ask,recreate_invoices",0,Recreate Invoices,Rechnungen nachbilden,0
+field,"purchase.handle.packing.exception.ask,domain_moves",0,Domain Moves,Domain Bewegungen,0
+field,"purchase.handle.packing.exception.ask,recreate_moves",0,Recreate Moves,Bewegungen nachbilden,0
+field,"purchase.line-account.invoice.line,invoice_line",0,Invoice Line,Rechnungsposition,0
+field,"purchase.line-account.invoice.line,purchase_line",0,Purchase Line,Position Einkauf,0
+field,"purchase.line-account.invoice.line,rec_name",0,Name,Name,0
+field,"purchase.line-account.tax,line",0,Purchase Line,Position Einkauf,0
+field,"purchase.line-account.tax,rec_name",0,Name,Name,0
+field,"purchase.line-account.tax,tax",0,Tax,Steuer,0
 field,"purchase.line,amount",0,Amount,Betrag,0
-field,"purchase.line,comment",0,Comment,Kommentar,0
 field,"purchase.line,description",0,Description,Bezeichnung,0
+field,"purchase.line-ignored-stock.move,move",0,Move,Bewegung,0
+field,"purchase.line-ignored-stock.move,purchase_line",0,Purchase Line,Position Einkauf,0
+field,"purchase.line-ignored-stock.move,rec_name",0,Name,Name,0
 field,"purchase.line,invoice_lines",0,Invoice Lines,Rechnungspositionen,0
 field,"purchase.line,move_done",0,Moves Done,Bewegungen erledigt,0
 field,"purchase.line,move_exception",0,Moves Exception,Bewegungsvorbehalt,0
 field,"purchase.line,moves",0,Moves,Bewegungen,0
-field,"purchase.line,moves_ignored",0,Moves Ignored,Ignorierte Bewegungen,0
+field,"purchase.line,moves_ignored",0,Ignored Moves,Ignorierte Bewegungen,0
+field,"purchase.line,moves_recreated",0,Recreated Moves,Nachgebildete Bewegungen,0
+field,"purchase.line,note",0,Note,Notiz,0
 field,"purchase.line,product",0,Product,Artikel,0
 field,"purchase.line,purchase",0,Purchase,Einkauf,0
-field,"purchase.line,quantity",0,Quantity,Menge,0
+field,"purchase.line,quantity",0,Quantity,Anzahl,0
+field,"purchase.line,rec_name",0,Name,Name,0
+field,"purchase.line-recreated-stock.move,move",0,Move,Bewegung,0
+field,"purchase.line-recreated-stock.move,purchase_line",0,Purchase Line,Position Einkauf,0
+field,"purchase.line-recreated-stock.move,rec_name",0,Name,Name,0
 field,"purchase.line,sequence",0,Sequence,Sequenz,0
 field,"purchase.line,taxes",0,Taxes,Steuern,0
 field,"purchase.line,type",0,Type,Typ,0
@@ -30,107 +53,148 @@ field,"purchase.product_supplier,delivery_time",0,Delivery Time,Lieferfrist,0
 field,"purchase.product_supplier,name",0,Name,Name,0
 field,"purchase.product_supplier,party",0,Supplier,Lieferant,0
 field,"purchase.product_supplier.price,product_supplier",0,Supplier,Lieferant,0
-field,"purchase.product_supplier.price,quantity",0,Quantity,Menge,0
+field,"purchase.product_supplier.price,quantity",0,Quantity,Anzahl,0
+field,"purchase.product_supplier.price,rec_name",0,Name,Name,0
 field,"purchase.product_supplier,prices",0,Prices,Preise,0
 field,"purchase.product_supplier.price,unit_price",0,Unit Price,Einzelpreis,0
 field,"purchase.product_supplier,product",0,Product,Artikel,0
+field,"purchase.product_supplier,rec_name",0,Name,Name,0
 field,"purchase.product_supplier,sequence",0,Sequence,Sequenz,0
+field,"purchase.purchase-account.invoice,invoice",0,Invoice,Rechnung,0
+field,"purchase.purchase-account.invoice,purchase",0,Purchase,Einkauf,0
+field,"purchase.purchase-account.invoice,rec_name",0,Name,Name,0
 field,"purchase.purchase,comment",0,Comment,Kommentar,0
 field,"purchase.purchase,company",0,Company,Unternehmen,0
-field,"purchase.purchase,contact_address",0,Contact Address,Kontaktadresse,0
 field,"purchase.purchase,currency",0,Currency,Währung,0
 field,"purchase.purchase,currency_digits",0,Currency Digits,Währung (signifikante Stellen),0
 field,"purchase.purchase,description",0,Description,Beschreibung,0
+field,"purchase.purchase-ignored-account.invoice,invoice",0,Invoice,Rechnung,0
+field,"purchase.purchase-ignored-account.invoice,purchase",0,Purchase,Einkauf,0
+field,"purchase.purchase-ignored-account.invoice,rec_name",0,Name,Name,0
 field,"purchase.purchase,invoice_address",0,Invoice Address,Rechnungsadresse,0
 field,"purchase.purchase,invoice_exception",0,Invoices Exception,Rechnungsvorbehalt,0
 field,"purchase.purchase,invoice_method",0,Invoice Method,Rechnungsstellung,0
 field,"purchase.purchase,invoice_paid",0,Invoices Paid,Bezahlte Rechnungen,0
 field,"purchase.purchase,invoices",0,Invoices,Rechnungen,0
-field,"purchase.purchase,invoices_ignored",0,Invoices Ignored,Ignorierte Rechnungen,0
+field,"purchase.purchase,invoices_ignored",0,Ignored Invoices,Ignorierte Rechnungen,0
+field,"purchase.purchase,invoices_recreated",0,Recreated Invoices,Nachgebildete Rechnungen,0
 field,"purchase.purchase,invoice_state",0,Invoice State,Rechnungsstatus,0
 field,"purchase.purchase,lines",0,Lines,Positionen,0
 field,"purchase.purchase,moves",0,Moves,Bewegungen,0
-field,"purchase.purchase,packing_done",0,Packing Done,Lieferschein erledigt,0
-field,"purchase.purchase,packing_exception",0,Packings Exception,Lieferungsvorbehalt,0
-field,"purchase.purchase,packings",0,Packings,Lieferscheine,0
-field,"purchase.purchase,packing_state",0,Packing State,Lieferstatus,0
+field,"purchase.purchase,packing_done",0,Shipment Done,Lieferposten erledigt,0
+field,"purchase.purchase,packing_exception",0,Shipments Exception,Lieferungsvorbehalt,0
+field,"purchase.purchase,packings",0,Shipments,Lieferposten,0
+field,"purchase.purchase,packing_state",0,Shipment State,Lieferstatus,0
 field,"purchase.purchase,party",0,Party,Partei,0
 field,"purchase.purchase,party_lang",0,Party Language,Sprache Partei,0
 field,"purchase.purchase,payment_term",0,Payment Term,Zahlungsbedingung,0
 field,"purchase.purchase,purchase_date",0,Purchase Date,Kaufdatum,0
+field,"purchase.purchase,rec_name",0,Name,Name,0
+field,"purchase.purchase-recreated-account.invoice,invoice",0,Invoice,Rechnung,0
+field,"purchase.purchase-recreated-account.invoice,purchase",0,Purchase,Einkauf,0
+field,"purchase.purchase-recreated-account.invoice,rec_name",0,Name,Name,0
 field,"purchase.purchase,reference",0,Reference,Referenz,0
 field,"purchase.purchase,state",0,State,Status,0
+field,"purchase.purchase,supplier_reference",0,Supplier Reference,Rechnungsnr. Lieferant,0
 field,"purchase.purchase,tax_amount",0,Tax,Steuer,0
 field,"purchase.purchase,total_amount",0,Total,Gesamt,0
 field,"purchase.purchase,untaxed_amount",0,Untaxed,Netto,0
 field,"purchase.purchase,warehouse",0,Warehouse,Warenlager,0
 field,"stock.move,purchase",0,Purchase,Einkauf,0
 field,"stock.move,purchase_currency",0,Purchase Currency,Einkaufswährung,0
-field,"stock.move,purchase_line",0,unknown,unbekannt,0
-field,"stock.move,purchase_quantity",0,Purchase Quantity,Menge Einkauf,0
+field,"stock.move,purchase_exception_state",0,Exception State,Status Vorbehalt,0
+field,"stock.move,purchase_line",0,,,0
+field,"stock.move,purchase_quantity",0,Purchase Quantity,Anzahl Einkauf,0
 field,"stock.move,purchase_unit",0,Purchase Unit,Einheit Einkauf,0
 field,"stock.move,purchase_unit_digits",0,Purchase Unit Digits,Anzahl Stellen Einkauf,0
 field,"stock.move,purchase_unit_price",0,Purchase Unit Price,Einzelpreis Einkauf,0
 field,"stock.move,supplier",0,Supplier,Lieferant,0
+help,"purchase.handle.invoice.exception.ask,recreate_invoices",0,The selected invoices will be recreated. The other ones will be ignored.,Die ausgewählten Rechnungen werden nachgebildet. Alle anderen werden ignoriert.,0
+help,"purchase.handle.packing.exception.ask,recreate_moves",0,The selected moves will be recreated. The other ones will be ignored.,Die ausgewählten Bewegungen werden nachgebildet. Alle anderen werden ignoriert.,0
 help,"purchase.product_supplier,delivery_time",0,In number of days,In Anzahl von Tagen,0
-help,"purchase.product_supplier.price,quantity",0,Minimal quantity,Mindestmenge,0
+help,"purchase.product_supplier.price,quantity",0,Minimal quantity,Minimale Anzahl,0
 model,"ir.action,name",act_purchase_form_confirmed,Confirmed Purchases,Aufträge (Einkäufe),0
 model,"ir.action,name",act_purchase_form_draft,Draft Purchases,Entwürfe (Einkäufe),0
+model,"ir.action,name",wizard_invoice_handle_exception,Handle Invoice Exception,Rechnungsvorbehalt bearbeiten,0
+model,"ir.action,name",wizard_packing_handle_exception,Handle Shipment Exception,Liefervorbehalt bearbeiten,0
+model,"ir.action,name",act_invoice_form,Invoices,Rechnungseingang,0
+model,"ir.action,name",act_purchase_form_new,New Purchase,Neuer Einkauf,0
+model,"ir.action,name",act_open_supplier,Parties associated to Purchases,Parteien: Einkäufen zugeordnet,0
 model,"ir.action,name",report_purchase,Purchase,Einkauf drucken,0
 model,"ir.action,name",act_purchase_form,Purchases,Einkäufe,0
+model,"ir.action,name",act_purchase_form2,Purchases,Einkäufe,0
 model,"ir.action,name",act_purchase_form_quotation,Purchases in Quotation,Angebote (Einkäufe),0
-model,"ir.action,name",act_open_supplier,Suppliers,Lieferanten,0
+model,"ir.action,name",act_packing_form,Shipments,Lieferposten,0
 model,"ir.sequence,name",sequence_purchase,Purchase,Einkauf,0
 model,"ir.sequence.type,name",sequence_type_purchase,Purchase,Einkauf,0
+model,"ir.ui.menu,name",menu_configuration,Configuration,Einstellungen,0
 model,"ir.ui.menu,name",menu_purchase_form_confirmed,Confirmed Purchases,Aufträge (Einkäufe),0
 model,"ir.ui.menu,name",menu_purchase_form_draft,Draft Purchases,Entwürfe (Einkäufe),0
+model,"ir.ui.menu,name",menu_purchase_form_new,New Purchase,Neuer Einkauf,0
+model,"ir.ui.menu,name",menu_supplier,Parties associated to Purchases,Parteien: Einkäufen zugeordnet,0
 model,"ir.ui.menu,name",menu_purchase,Purchase Management,Einkauf,0
 model,"ir.ui.menu,name",menu_purchase_form,Purchases,Einkäufe,0
 model,"ir.ui.menu,name",menu_purchase_form_quotation,Purchases in Quotation,Angebote (Einkäufe),0
-model,"ir.ui.menu,name",menu_supplier,Suppliers,Lieferanten,0
+model,"ir.ui.menu,name",menu_reporting,Reporting,Berichte,0
+model,"purchase.handle.invoice.exception.ask,name",0,Invoice Exception Ask,Nachfrage Rechnungsvorbehalt,0
+model,"purchase.handle.packing.exception.ask,name",0,Shipment Exception Ask,Nachfrage Liefervorbehalt,0
+model,"purchase.line-account.invoice.line,name",0,Purchase Line - Invoice Line,Position Einkauf - Rechnungszeile,0
+model,"purchase.line-account.tax,name",0,Purchase Line - Tax,Position Einkauf - Steuer,0
+model,"purchase.line-ignored-stock.move,name",0,Purchase Line - Ignored Move,Position Einkauf - Bewegung Ignoriert,0
+model,"purchase.line,name",0,Purchase Line,Einkauf Position,0
+model,"purchase.line-recreated-stock.move,name",0,Purchase Line - Ignored Move,Position Einkauf - Bewegung Nachgebildet,0
+model,"purchase.product_supplier,name",0,Product Supplier,Artikel Lieferant,0
+model,"purchase.product_supplier.price,name",0,Product Supplier Price,Artikel Einkaufspreis,0
+model,"purchase.purchase-account.invoice,name",0,Purchase - Invoice,Einkauf - Rechnung,0
+model,"purchase.purchase-ignored-account.invoice,name",0,Purchase - Ignored Invoice,Einkauf - Rechnung Ignoriert,0
+model,"purchase.purchase,name",0,Purchase,Einkauf,0
+model,"purchase.purchase-recreated-account.invoice,name",0,Purchase - Recreated Invoice,Einkauf - Rechnung Nachgebildet,0
 model,"res.group,name",group_purchase,Purchase,Einkauf,0
-model,"workflow.activity,name",purchase_activity_cancel,Cancel,Abbrechen,0
+model,"res.group,name",group_purchase_admin,Purchase Administrator,Administration Einkauf,0
+model,"workflow.activity,name",purchase_activity_cancel,Canceled,Annulliert,0
 model,"workflow.activity,name",purchase_activity_confirmed,Confirmed,Beauftragt,0
 model,"workflow.activity,name",purchase_activity_done,Done,Erledigt,0
 model,"workflow.activity,name",purchase_activity_draft,Draft,Entwurf,0
-model,"workflow.activity,name",purchase_activity_invoice_purchase,Invoice,Rechnung,0
 model,"workflow.activity,name",purchase_activity_invoice_done,Invoice Done,Rechnung erledigt,0
 model,"workflow.activity,name",purchase_activity_invoice_purchase_exception,Invoice Exception,Rechnungsvorbehalt,0
 model,"workflow.activity,name",purchase_activity_invoice_method,Invoice Method,Rechnungsstellung,0
 model,"workflow.activity,name",purchase_activity_invoice_method_done,Invoice Method Done,Rechnungsstellung erledigt,0
-model,"workflow.activity,name",purchase_activity_invoice_packing,Invoice Packing,Lieferschein Rechnung,0
-model,"workflow.activity,name",purchase_activity_invoice_packing_done,Invoice Packing Done,Lieferschein Rechnung erledigt,0
-model,"workflow.activity,name",purchase_activity_invoice_packing_exception,Invoice Packing Exception,Lieferschein Rechnung Vorbehalt,0
-model,"workflow.activity,name",purchase_activity_invoice_packing_method,Invoice Packing Method,Lieferschein Rechnungsstellung,0
-model,"workflow.activity,name",purchase_activity_invoice_packing_method_done,Invoice Packing Method Done,Lieferschein Rechnungsstellung erledigt,0
-model,"workflow.activity,name",purchase_activity_packing,Packing,Lieferschein,0
-model,"workflow.activity,name",purchase_activity_packing_exception,Packing Exception,Lieferschein Vorbehalt,0
+model,"workflow.activity,name",purchase_activity_invoice_packing,Invoice Shipment,Rechnung Lieferposten,0
+model,"workflow.activity,name",purchase_activity_invoice_packing_done,Invoice Shipment Done,Rechnung Lieferposten erledigt,0
+model,"workflow.activity,name",purchase_activity_invoice_packing_exception,Invoice Shipment Exception,Rechnung Lieferposten Vorbehalt,0
+model,"workflow.activity,name",purchase_activity_invoice_packing_method,Invoice Shipment Method,Rechnung Liefermethode,0
+model,"workflow.activity,name",purchase_activity_invoice_packing_method_done,Invoice Shipment Method Done,Rechnung Liefermethode erledigt,0
 model,"workflow.activity,name",purchase_activity_quotation,Quotation,Angebot,0
+model,"workflow.activity,name",purchase_activity_packing_exception,Shipment Exception,Lieferposten Vorbehalt,0
 model,"workflow.activity,name",purchase_activity_waiting_invoice_purchase,Waiting Invoice,Rechnung wartend,0
-model,"workflow.activity,name",purchase_activity_waiting_invoice_packing,Waiting Invoice Packing,Rechnung Lieferschein wartend,0
-model,"workflow.activity,name",purchase_activity_waiting_packing,Waiting Packing,Lieferschein wartend,0
+model,"workflow.activity,name",purchase_activity_waiting_invoice_packing,Waiting Invoice Shipment,Rechnung Lieferposten Wartend,0
+model,"workflow.activity,name",purchase_activity_waiting_packing,Waiting Shipment,Lieferposten wartend,0
 model,"workflow,name",purchase_workflow,Purchase workflow,Workflow Einkauf,0
 odt,purchase.purchase,0,Amount,Betrag,0
 odt,purchase.purchase,0,Date:,Datum:,0
 odt,purchase.purchase,0,Description,Bezeichnung,0
 odt,purchase.purchase,0,Description:,Bezeichnung:,0
-odt,purchase.purchase,0,Draft Purchase Order,Auftragsentwurf,0
+odt,purchase.purchase,0,Draft Purchase Order,Auftrag (Entwurf),0
 odt,purchase.purchase,0,E-Mail:,E-Mail:,0
 odt,purchase.purchase,0,Phone:,Telefon:,0
 odt,purchase.purchase,0,Purchase Order N°:,Auftrag Nr. ,0
-odt,purchase.purchase,0,Quantity,Menge,0
+odt,purchase.purchase,0,Quantity,Anzahl,0
 odt,purchase.purchase,0,Request for Quotation N°:,Angebotsanfrage Nr.:,0
 odt,purchase.purchase,0,Taxes,Steuern,0
 odt,purchase.purchase,0,Taxes:,Steuern:,0
 odt,purchase.purchase,0,Total:,Gesamt:,0
 odt,purchase.purchase,0,Total (excl. taxes):,Netto:,0
 odt,purchase.purchase,0,Unit Price,Einzelpreis,0
-odt,purchase.purchase,0,VAT:,USt:,0
+odt,purchase.purchase,0,VAT:,USt.:,0
+selection,"account.invoice,purchase_exception_state",0,,,0
+selection,"account.invoice,purchase_exception_state",0,Ignored,Ignoriert,0
+selection,"account.invoice,purchase_exception_state",0,Recreated,Nachgebildet,0
+selection,"purchase.line,type",0,Comment,Kommentar,0
 selection,"purchase.line,type",0,Line,Position,0
 selection,"purchase.line,type",0,Subtotal,Zwischensumme,0
 selection,"purchase.line,type",0,Title,Überschrift,0
 selection,"purchase.purchase,invoice_method",0,Based On Order,Nach Auftrag,0
-selection,"purchase.purchase,invoice_method",0,Based On Packing,Nach Lieferung,0
+selection,"purchase.purchase,invoice_method",0,Based On Shipment,Bei Lieferung,0
 selection,"purchase.purchase,invoice_method",0,Manual,Manuell,0
 selection,"purchase.purchase,invoice_state",0,Exception,Vorbehalt,0
 selection,"purchase.purchase,invoice_state",0,None,Kein,0
@@ -140,13 +204,29 @@ selection,"purchase.purchase,packing_state",0,Exception,Vorbehalt,0
 selection,"purchase.purchase,packing_state",0,None,Kein,0
 selection,"purchase.purchase,packing_state",0,Received,Erhalten,0
 selection,"purchase.purchase,packing_state",0,Waiting,Wartend,0
-selection,"purchase.purchase,state",0,Cancel,Abbrechen,0
+selection,"purchase.purchase,state",0,Canceled,Annulliert,0
 selection,"purchase.purchase,state",0,Confirmed,Beauftragt,0
 selection,"purchase.purchase,state",0,Done,Erledigt,0
 selection,"purchase.purchase,state",0,Draft,Entwurf,0
 selection,"purchase.purchase,state",0,Quotation,Angebot,0
+selection,"stock.move,purchase_exception_state",0,,,0
+selection,"stock.move,purchase_exception_state",0,Ignored,Ignoriert,0
+selection,"stock.move,purchase_exception_state",0,Recreated,Nachgebildet,0
 view,product.product,0,Product Suppliers,Lieferanten,0
 view,product.product,0,Suppliers,Lieferanten,0
+view,product.template,0,Product Suppliers,Lieferanten,0
+view,product.template,0,Suppliers,Lieferanten,0
+view,purchase.handle.invoice.exception.ask,0,Choose invoices to duplicate,Auswahl Rechnungen für Duplizierung,0
+view,purchase.handle.invoice.exception.ask,0,Choose invoices to recreate,Rechnungen zum Nachbilden auswählen,0
+view,purchase.handle.invoice.exception.ask,0,Handle Invoice Exception,Rechnungsvorbehalt bearbeiten,0
+view,purchase.handle.packing.exception.ask,0,Choose moves to recreate,Auswahl Bewegungen zur Nachbildung,0
+view,purchase.handle.packing.exception.ask,0,Choose move to duplicate,Auswahl Bewegungen für Duplizierung,0
+view,purchase.handle.packing.exception.ask,0,Choose move to recreate,Bewegungen zum Nachbilden auswählen,0
+view,purchase.handle.packing.exception.ask,0,Duplicate Moves,Bewegungen duplizieren,0
+view,purchase.handle.packing.exception.ask,0,Handle packing Exception,Liefervorbehalt bearbeiten,0
+view,purchase.handle.packing.exception.ask,0,Recreated Moves,Nachgebildete Bewegungen,0
+view,purchase.line,0,General,Allgemein,0
+view,purchase.line,0,Notes,Notizen,0
 view,purchase.line,0,Products,Artikel,0
 view,purchase.line,0,Purchase Line,Position Einkauf,0
 view,purchase.line,0,Purchase Lines,Positionen Einkauf,0
@@ -154,15 +234,24 @@ view,purchase.product_supplier,0,Product Supplier,Lieferant,0
 view,purchase.product_supplier,0,Product Suppliers,Lieferanten,0
 view,purchase.product_supplier.price,0,Product Supplier Price,Einkaufspreis,0
 view,purchase.product_supplier.price,0,Product Supplier Prices,Einkaufspreise,0
-view,purchase.purchase,0,Cancel,Abbrechen,0
+view,purchase.purchase,0,Cancel,Annullieren,0
 view,purchase.purchase,0,Confirm,Beauftragen,0
 view,purchase.purchase,0,Draft,Entwurf,0
+view,purchase.purchase,0,Handle Invoice Exception,Rechnungsvorbehalt bearbeiten,0
+view,purchase.purchase,0,Handle Packing Exception,Liefervorbehalt bearbeiten,0
+view,purchase.purchase,0,Handle Shipment Exception,Liefervorbehalt bearbeiten,0
 view,purchase.purchase,0,Ignore Invoice Exception,Rechnungsvorbehalt ignorieren,0
 view,purchase.purchase,0,Ignore Packing Exception,Verpackungsvorbehalt ignorieren,0
 view,purchase.purchase,0,Invoices,Rechnungen,0
 view,purchase.purchase,0,Lines,Positionen,0
+view,purchase.purchase,0,Moves,Bewegungen,0
 view,purchase.purchase,0,Other Info,Sonstiges,0
-view,purchase.purchase,0,Packings,Lieferscheine,0
+view,purchase.purchase,0,Packings,Lieferposten,0
 view,purchase.purchase,0,Purchase,Einkauf,0
 view,purchase.purchase,0,Purchases,Einkäufe,0
 view,purchase.purchase,0,Quotation,Angebot,0
+view,purchase.purchase,0,Shipments,Lieferposten,0
+wizard_button,"purchase.handle.invoice.exception,init,end",0,Cancel,Abbrechen,0
+wizard_button,"purchase.handle.invoice.exception,init,ok",0,Ok,OK,0
+wizard_button,"purchase.handle.packing.exception,init,end",0,Cancel,Abbrechen,0
+wizard_button,"purchase.handle.packing.exception,init,ok",0,Ok,OK,0
diff --git a/es_CO.csv b/es_CO.csv
new file mode 100644
index 0000000..5d7d9ec
--- /dev/null
+++ b/es_CO.csv
@@ -0,0 +1,248 @@
+type,name,res_id,src,value,fuzzy
+error,account.invoice,0,You can not delete invoices that come from a purchase!,¡No puede borrar facturas que vienen de una compra!,0
+error,product.template,0,"Purchase prices are based on the purchase uom, are you sure to change it?","Los precios de compra están basados en la UdM de compra,¿desea cambiarlo?",0
+error,purchase.line,0,"It misses an ""account expense"" default property!","¡Hace falta una propiedad predeterminada de ""cuenta de gastos""!",0
+error,purchase.line,0,"It misses an ""Account Expense"" on product ""%s""!","¡Hace falta una ""Cuenta de Gasto"" del producto ""%s""!",0
+error,purchase.line,0,The supplier location is required!,¡Se requiere el lugar del proveedor!,0
+error,purchase.purchase,0,Invoice addresses must be defined for the quotation.,Debe definir las direcciones para la cotización.,0
+error,purchase.purchase,0,"It misses an ""Account Payable"" on the party ""%s""!","¡Al tercero le hace falta una ""Cuenta de Pagos""!",0
+error,stock.packing.in,0,You cannot reset to draft a move generated by a purchase.,No puede revertir a borrador un movimiento generado por una compra.,0
+field,"account.invoice,purchase_exception_state",0,Exception State,Estado Excepción,0
+field,"product.template,product_suppliers",0,Suppliers,Proveedores,0
+field,"product.template,purchasable",0,Purchasable,Comprable,0
+field,"product.template,purchase_uom",0,Purchase UOM,UdM de Compra,0
+field,"purchase.handle.invoice.exception.ask,domain_invoices",0,Domain Invoices,Rango de facturas,0
+field,"purchase.handle.invoice.exception.ask,recreate_invoices",0,Recreate Invoices,Rehacer facturas,0
+field,"purchase.handle.packing.exception.ask,domain_moves",0,Domain Moves,Rango de movimientos,0
+field,"purchase.handle.packing.exception.ask,recreate_moves",0,Recreate Moves,Rehacer movimientos,0
+field,"purchase.line-account.invoice.line,invoice_line",0,Invoice Line,Línea de Factura,0
+field,"purchase.line-account.invoice.line,purchase_line",0,Purchase Line,Línea de Compra,0
+field,"purchase.line-account.invoice.line,rec_name",0,Name,Nombre,0
+field,"purchase.line-account.tax,line",0,Purchase Line,Línea de Compra,0
+field,"purchase.line-account.tax,rec_name",0,Name,Nombre,0
+field,"purchase.line-account.tax,tax",0,Tax,Impuesto,0
+field,"purchase.line,amount",0,Amount,Cantidad,0
+field,"purchase.line,description",0,Description,Descripción,0
+field,"purchase.line-ignored-stock.move,move",0,Move,Movimiento,0
+field,"purchase.line-ignored-stock.move,purchase_line",0,Purchase Line,Línea de Compra,0
+field,"purchase.line-ignored-stock.move,rec_name",0,Name,Nombre,0
+field,"purchase.line,invoice_lines",0,Invoice Lines,Líneas de Factura,0
+field,"purchase.line,move_done",0,Moves Done,Movimientos Hechos,0
+field,"purchase.line,move_exception",0,Moves Exception,Exepción de Movimientos,0
+field,"purchase.line,moves",0,Moves,Movimientos,0
+field,"purchase.line,moves_ignored",0,Ignored Moves,Movimientos Ignorados,0
+field,"purchase.line,moves_recreated",0,Recreated Moves,Movimientos recreados,0
+field,"purchase.line,note",0,Note,Nota,0
+field,"purchase.line,product",0,Product,Producto,0
+field,"purchase.line,purchase",0,Purchase,Compra,0
+field,"purchase.line,quantity",0,Quantity,Cantidad,0
+field,"purchase.line,rec_name",0,Name,Nombre,0
+field,"purchase.line-recreated-stock.move,move",0,Move,Movimiento,0
+field,"purchase.line-recreated-stock.move,purchase_line",0,Purchase Line,Línea de Compra,0
+field,"purchase.line-recreated-stock.move,rec_name",0,Name,Nombre,0
+field,"purchase.line,sequence",0,Sequence,Secuencia,0
+field,"purchase.line,taxes",0,Taxes,Impuestos,0
+field,"purchase.line,type",0,Type,Tipo,0
+field,"purchase.line,unit",0,Unit,Unidad,0
+field,"purchase.line,unit_digits",0,Unit Digits,Dígitos Unitarios,0
+field,"purchase.line,unit_price",0,Unit Price,Precio Unitario,0
+field,"purchase.product_supplier,code",0,Code,Código,0
+field,"purchase.product_supplier,company",0,Company,Compañía,0
+field,"purchase.product_supplier,delivery_time",0,Delivery Time,Tiempo de Envío,0
+field,"purchase.product_supplier,name",0,Name,Nombre,0
+field,"purchase.product_supplier,party",0,Supplier,Proveedor,0
+field,"purchase.product_supplier.price,product_supplier",0,Supplier,Proveedor,0
+field,"purchase.product_supplier.price,quantity",0,Quantity,Cantidad,0
+field,"purchase.product_supplier.price,rec_name",0,Name,Nombre,0
+field,"purchase.product_supplier,prices",0,Prices,Precios,0
+field,"purchase.product_supplier.price,unit_price",0,Unit Price,Precio Unitario,0
+field,"purchase.product_supplier,product",0,Product,Producto,0
+field,"purchase.product_supplier,rec_name",0,Name,Nombre,0
+field,"purchase.product_supplier,sequence",0,Sequence,Secuencia,0
+field,"purchase.purchase-account.invoice,invoice",0,Invoice,Factura,0
+field,"purchase.purchase-account.invoice,purchase",0,Purchase,Compra,0
+field,"purchase.purchase-account.invoice,rec_name",0,Name,Nombre,0
+field,"purchase.purchase,comment",0,Comment,Comentario,0
+field,"purchase.purchase,company",0,Company,Compañía,0
+field,"purchase.purchase,currency",0,Currency,Moneda,0
+field,"purchase.purchase,currency_digits",0,Currency Digits,Dígitos de Moneda,0
+field,"purchase.purchase,description",0,Description,Descripción,0
+field,"purchase.purchase-ignored-account.invoice,invoice",0,Invoice,Factura,0
+field,"purchase.purchase-ignored-account.invoice,purchase",0,Purchase,Compra,0
+field,"purchase.purchase-ignored-account.invoice,rec_name",0,Name,Nombre,0
+field,"purchase.purchase,invoice_address",0,Invoice Address,Dirección de Facturación,0
+field,"purchase.purchase,invoice_exception",0,Invoices Exception,Excepción de Facturación,0
+field,"purchase.purchase,invoice_method",0,Invoice Method,Método de Facturación,0
+field,"purchase.purchase,invoice_paid",0,Invoices Paid,Facturas Pagadas,0
+field,"purchase.purchase,invoices",0,Invoices,Facturas,0
+field,"purchase.purchase,invoices_ignored",0,Ignored Invoices,Facturas Ignoradas,0
+field,"purchase.purchase,invoices_recreated",0,Recreated Invoices,Facturas recreadas,0
+field,"purchase.purchase,invoice_state",0,Invoice State,Estado de Factura,0
+field,"purchase.purchase,lines",0,Lines,Líneas,0
+field,"purchase.purchase,moves",0,Moves,Movimientos,0
+field,"purchase.purchase,packing_done",0,Shipment Done,Envío Finalizado,0
+field,"purchase.purchase,packing_exception",0,Shipments Exception,Excepción de Envío,0
+field,"purchase.purchase,packings",0,Shipments,Envíos,0
+field,"purchase.purchase,packing_state",0,Shipment State,Estado de Envío,0
+field,"purchase.purchase,party",0,Party,Terceros,0
+field,"purchase.purchase,party_lang",0,Party Language,Idioma del Tercero,0
+field,"purchase.purchase,payment_term",0,Payment Term,Término de Pago,0
+field,"purchase.purchase,purchase_date",0,Purchase Date,Fecha de Compra,0
+field,"purchase.purchase,rec_name",0,Name,Nombre,0
+field,"purchase.purchase-recreated-account.invoice,invoice",0,Invoice,Factura,0
+field,"purchase.purchase-recreated-account.invoice,purchase",0,Purchase,Compra,0
+field,"purchase.purchase-recreated-account.invoice,rec_name",0,Name,Nombre,0
+field,"purchase.purchase,reference",0,Reference,Referencia,0
+field,"purchase.purchase,state",0,State,Estado,0
+field,"purchase.purchase,supplier_reference",0,Supplier Reference,Referencia de Proveedor,0
+field,"purchase.purchase,tax_amount",0,Tax,Impuesto,0
+field,"purchase.purchase,total_amount",0,Total,Total,0
+field,"purchase.purchase,untaxed_amount",0,Untaxed,Sin Impuesto,0
+field,"purchase.purchase,warehouse",0,Warehouse,Depósito,0
+field,"stock.move,purchase",0,Purchase,Compra,0
+field,"stock.move,purchase_currency",0,Purchase Currency,Moneda de Compra,0
+field,"stock.move,purchase_exception_state",0,Exception State,Estado Excepción,0
+field,"stock.move,purchase_line",0,,,0
+field,"stock.move,purchase_quantity",0,Purchase Quantity,Cantidad de Compra,0
+field,"stock.move,purchase_unit",0,Purchase Unit,Unidad de Compra,0
+field,"stock.move,purchase_unit_digits",0,Purchase Unit Digits,Dígitos de Unidad de Compra,0
+field,"stock.move,purchase_unit_price",0,Purchase Unit Price,Precio Unitario de Compra,0
+field,"stock.move,supplier",0,Supplier,Proveedor,0
+help,"purchase.handle.invoice.exception.ask,recreate_invoices",0,The selected invoices will be recreated. The other ones will be ignored.,La factura seleccionada será recreada. Las otras serán ignoradas.,0
+help,"purchase.handle.packing.exception.ask,recreate_moves",0,The selected moves will be recreated. The other ones will be ignored.,Se recrearán los movimientos seleccionados. Los demás se ignorarán.,0
+help,"purchase.product_supplier,delivery_time",0,In number of days,En número de días,0
+help,"purchase.product_supplier.price,quantity",0,Minimal quantity,Cantidad Mínima,0
+model,"ir.action,name",act_purchase_form_confirmed,Confirmed Purchases,Compras confirmadas,0
+model,"ir.action,name",act_purchase_form_draft,Draft Purchases,Compras en Borrador,0
+model,"ir.action,name",wizard_invoice_handle_exception,Handle Invoice Exception,Excepción de Manejo de Factura,0
+model,"ir.action,name",wizard_packing_handle_exception,Handle Shipment Exception,Excepción de Manejo de Envío,0
+model,"ir.action,name",act_invoice_form,Invoices,Facturas,0
+model,"ir.action,name",act_purchase_form_new,New Purchase,Nueva Compra,0
+model,"ir.action,name",act_open_supplier,Parties associated to Purchases,Terceros Asociados a Compras,0
+model,"ir.action,name",report_purchase,Purchase,Compra,0
+model,"ir.action,name",act_purchase_form,Purchases,Compras,0
+model,"ir.action,name",act_purchase_form2,Purchases,Compras,0
+model,"ir.action,name",act_purchase_form_quotation,Purchases in Quotation,Cotizaciones de Compras,0
+model,"ir.action,name",act_packing_form,Shipments,Envíos,0
+model,"ir.sequence,name",sequence_purchase,Purchase,Compras,0
+model,"ir.sequence.type,name",sequence_type_purchase,Purchase,Compras,0
+model,"ir.ui.menu,name",menu_configuration,Configuration,Configuración,0
+model,"ir.ui.menu,name",menu_purchase_form_confirmed,Confirmed Purchases,Compras confirmadas,0
+model,"ir.ui.menu,name",menu_purchase_form_draft,Draft Purchases,Compras en Borrador,0
+model,"ir.ui.menu,name",menu_purchase_form_new,New Purchase,Nueva Compra,0
+model,"ir.ui.menu,name",menu_supplier,Parties associated to Purchases,Terceros Asociados a Compras,0
+model,"ir.ui.menu,name",menu_purchase,Purchase Management,Gestión de Compras,0
+model,"ir.ui.menu,name",menu_purchase_form,Purchases,Compras,0
+model,"ir.ui.menu,name",menu_purchase_form_quotation,Purchases in Quotation,Cotizaciones de Compras,0
+model,"ir.ui.menu,name",menu_reporting,Reporting,Reportes,0
+model,"purchase.handle.invoice.exception.ask,name",0,Invoice Exception Ask,Pregunta de Excepción de Factura,0
+model,"purchase.handle.packing.exception.ask,name",0,Shipment Exception Ask,Preguntar Excepción de Envío,0
+model,"purchase.line-account.invoice.line,name",0,Purchase Line - Invoice Line,Línea de Compra - Línea de Factura,0
+model,"purchase.line-account.tax,name",0,Purchase Line - Tax,Línea de Compra - Impuesto,0
+model,"purchase.line-ignored-stock.move,name",0,Purchase Line - Ignored Move,Línea de Compra - Movimiento Ignorado,0
+model,"purchase.line,name",0,Purchase Line,Línea de Compra,0
+model,"purchase.line-recreated-stock.move,name",0,Purchase Line - Ignored Move,Línea de Compra - Movimiento Ignorado,0
+model,"purchase.product_supplier,name",0,Product Supplier,Proveedor de Producto,0
+model,"purchase.product_supplier.price,name",0,Product Supplier Price,Precio del Proveedor de Producto,0
+model,"purchase.purchase-account.invoice,name",0,Purchase - Invoice,Compra - Factura,0
+model,"purchase.purchase-ignored-account.invoice,name",0,Purchase - Ignored Invoice,Compra - Factura Ignorada,0
+model,"purchase.purchase,name",0,Purchase,Compra,0
+model,"purchase.purchase-recreated-account.invoice,name",0,Purchase - Recreated Invoice,Compra - Factura Recreada,0
+model,"res.group,name",group_purchase,Purchase,Compras,0
+model,"res.group,name",group_purchase_admin,Purchase Administrator,Administrador de Compra,0
+model,"workflow.activity,name",purchase_activity_cancel,Canceled,Cancelado,0
+model,"workflow.activity,name",purchase_activity_confirmed,Confirmed,Confirmado,0
+model,"workflow.activity,name",purchase_activity_done,Done,Hecho,0
+model,"workflow.activity,name",purchase_activity_draft,Draft,Borrador,0
+model,"workflow.activity,name",purchase_activity_invoice_done,Invoice Done,Factura Completa,0
+model,"workflow.activity,name",purchase_activity_invoice_purchase_exception,Invoice Exception,Excepción de Factura,0
+model,"workflow.activity,name",purchase_activity_invoice_method,Invoice Method,Método de Facturación,0
+model,"workflow.activity,name",purchase_activity_invoice_method_done,Invoice Method Done,Método de Factura Completo,0
+model,"workflow.activity,name",purchase_activity_invoice_packing,Invoice Shipment,Envío de Factura,0
+model,"workflow.activity,name",purchase_activity_invoice_packing_done,Invoice Shipment Done,Envío de Factura Completo,0
+model,"workflow.activity,name",purchase_activity_invoice_packing_exception,Invoice Shipment Exception,Excepción de Envío de Factura,0
+model,"workflow.activity,name",purchase_activity_invoice_packing_method,Invoice Shipment Method,Método de Envío de Factura,0
+model,"workflow.activity,name",purchase_activity_invoice_packing_method_done,Invoice Shipment Method Done,Método de Envío de Factura Completo,0
+model,"workflow.activity,name",purchase_activity_quotation,Quotation,Cotización,0
+model,"workflow.activity,name",purchase_activity_packing_exception,Shipment Exception,Excepción de Envío,0
+model,"workflow.activity,name",purchase_activity_waiting_invoice_purchase,Waiting Invoice,Esperando Factura,0
+model,"workflow.activity,name",purchase_activity_waiting_invoice_packing,Waiting Invoice Shipment,Esperando Envío de Factura,0
+model,"workflow.activity,name",purchase_activity_waiting_packing,Waiting Shipment,Esperando Envío,0
+model,"workflow,name",purchase_workflow,Purchase workflow,Flujo de Trabajo de Compras,0
+odt,purchase.purchase,0,Amount,Cantidad,0
+odt,purchase.purchase,0,Date:,Fecha:,0
+odt,purchase.purchase,0,Description,Descripción,0
+odt,purchase.purchase,0,Description:,Descripción:,0
+odt,purchase.purchase,0,Draft Purchase Order,Borrador de Orden de Compra,0
+odt,purchase.purchase,0,E-Mail:,Correo electrónico:,0
+odt,purchase.purchase,0,Phone:,Teléfono:,0
+odt,purchase.purchase,0,Purchase Order N°:,Nº de Orden de Compra:,0
+odt,purchase.purchase,0,Quantity,Cantidad,0
+odt,purchase.purchase,0,Request for Quotation N°:,Solicitud de Factura Nº:,0
+odt,purchase.purchase,0,Taxes,Impuestos,0
+odt,purchase.purchase,0,Taxes:,Impuestos,0
+odt,purchase.purchase,0,Total:,Total:,0
+odt,purchase.purchase,0,Total (excl. taxes):,Total(excl. impuestos):,0
+odt,purchase.purchase,0,Unit Price,Precio Unitario,0
+odt,purchase.purchase,0,VAT:,VAT:,0
+selection,"account.invoice,purchase_exception_state",0,,,0
+selection,"account.invoice,purchase_exception_state",0,Ignored,Ignorado,0
+selection,"account.invoice,purchase_exception_state",0,Recreated,Rehecho,0
+selection,"purchase.line,type",0,Comment,Comentario,0
+selection,"purchase.line,type",0,Line,Línea,0
+selection,"purchase.line,type",0,Subtotal,Subtotal,0
+selection,"purchase.line,type",0,Title,Título,0
+selection,"purchase.purchase,invoice_method",0,Based On Order,Basado en Orden,0
+selection,"purchase.purchase,invoice_method",0,Based On Shipment,Basado en Envío,0
+selection,"purchase.purchase,invoice_method",0,Manual,Manual,0
+selection,"purchase.purchase,invoice_state",0,Exception,Excepción,0
+selection,"purchase.purchase,invoice_state",0,None,Ninguno,0
+selection,"purchase.purchase,invoice_state",0,Paid,Pagado,0
+selection,"purchase.purchase,invoice_state",0,Waiting,En Espera,0
+selection,"purchase.purchase,packing_state",0,Exception,Excepción,0
+selection,"purchase.purchase,packing_state",0,None,Ninguno,0
+selection,"purchase.purchase,packing_state",0,Received,Recibido,0
+selection,"purchase.purchase,packing_state",0,Waiting,En Espera,0
+selection,"purchase.purchase,state",0,Canceled,Cancelado,0
+selection,"purchase.purchase,state",0,Confirmed,Confirmado,0
+selection,"purchase.purchase,state",0,Done,Hecho,0
+selection,"purchase.purchase,state",0,Draft,Borrador,0
+selection,"purchase.purchase,state",0,Quotation,Cotización,0
+selection,"stock.move,purchase_exception_state",0,,,0
+selection,"stock.move,purchase_exception_state",0,Ignored,Ignorado,0
+selection,"stock.move,purchase_exception_state",0,Recreated,Rehecho,0
+view,product.product,0,Products,Productos,0
+view,product.product,0,Suppliers,Proveedores,0
+view,product.template,0,Product Suppliers,Proveedores de Productos,0
+view,product.template,0,Suppliers,Proveedores,0
+view,purchase.handle.invoice.exception.ask,0,Choose invoices to recreate,Escoja una factura a rehacer,0
+view,purchase.handle.invoice.exception.ask,0,Handle Invoice Exception,Manejar excepción de factura,0
+view,purchase.handle.packing.exception.ask,0,Choose moves to recreate,Elegir movimientos a recrear,0
+view,purchase.handle.packing.exception.ask,0,Handle packing Exception,Maneje Excepciones de envío,0
+view,purchase.handle.packing.exception.ask,0,Recreated Moves,Movimientos recreados,0
+view,purchase.line,0,General,General,0
+view,purchase.line,0,Notes,Notas,0
+view,purchase.line,0,Products,Productos,0
+view,purchase.line,0,Purchase Line,Línea de Compra,0
+view,purchase.line,0,Purchase Lines,Líneas de Compra,0
+view,purchase.product_supplier,0,Product Supplier,Proveedor del Producto,0
+view,purchase.product_supplier,0,Product Suppliers,Proveedores de Productos,0
+view,purchase.product_supplier.price,0,Product Supplier Price,Precio del Proveedor del Producto,0
+view,purchase.product_supplier.price,0,Product Supplier Prices,Precios del Proveedor del Producto,0
+view,purchase.purchase,0,Cancel,Cancelar,0
+view,purchase.purchase,0,Confirm,Confirmar,0
+view,purchase.purchase,0,Draft,Borrador,0
+view,purchase.purchase,0,Handle Invoice Exception,Manejar excepción de factura,0
+view,purchase.purchase,0,Handle Shipment Exception,Excepción de manejo de envíos,0
+view,purchase.purchase,0,Invoices,Facturas,0
+view,purchase.purchase,0,Lines,Líneas,0
+view,purchase.purchase,0,Moves,Movimientos,0
+view,purchase.purchase,0,Other Info,Información Adicional,0
+view,purchase.purchase,0,Purchase,Compra,0
+view,purchase.purchase,0,Purchases,Compras,0
+view,purchase.purchase,0,Quotation,Cotización,0
+view,purchase.purchase,0,Shipments,Envíos,0
+wizard_button,"purchase.handle.invoice.exception,init,end",0,Cancel,Cancelar,0
+wizard_button,"purchase.handle.invoice.exception,init,ok",0,Ok,Aceptar,0
+wizard_button,"purchase.handle.packing.exception,init,end",0,Cancel,Cancelar,0
+wizard_button,"purchase.handle.packing.exception,init,ok",0,Ok,Aceptar,0
diff --git a/es_ES.csv b/es_ES.csv
index e4c8cb6..32305aa 100644
--- a/es_ES.csv
+++ b/es_ES.csv
@@ -1,137 +1,248 @@
 type,name,res_id,src,value,fuzzy
-error,account.invoice,0,You can not delete invoices that comes from a purchase!,No puede borrar facturas que provienen de una compra!,0
-error,purchase.line,0,"It miss an ""account_expense"" default property!","Hace falta la propiedad predeterminada ""cuenta_de_gastos""!",0
-error,purchase.line,0,The supplier location is required!,El lugar del proveedor es indispensable!,0
-error,purchase.purchase,0,Contact and Invoice addresses must be defined for the quotation.,Las direcciones de contacto y facturación deben estar definidas para la cotización.,0
+error,account.invoice,0,You can not delete invoices that come from a purchase!,No puede borrar facturas que vienen de una compra,0
+error,product.template,0,"Purchase prices are based on the purchase uom, are you sure to change it?","Los precios de compra están basados en la UdM de compra, ¿desea cambiarlo?",0
+error,purchase.line,0,"It misses an ""account expense"" default property!",Hace falta la propiedad predeterminada de «cuenta de gastos»,0
+error,purchase.line,0,"It misses an ""Account Expense"" on product ""%s""!",Hace falta una «Cuenta de gasto» del producto «%s»,0
+error,purchase.line,0,The supplier location is required!,Se necesita la ubicación del proveedor,0
+error,purchase.purchase,0,Invoice addresses must be defined for the quotation.,Debe definir las direcciones para la cotización.,0
+error,purchase.purchase,0,"It misses an ""Account Payable"" on the party ""%s""!",Al tercero «%s» le hace falta una «Cuenta de pagos»,0
+error,stock.packing.in,0,You cannot reset to draft a move generated by a purchase.,No puede restablecer a borrador un movimiento generado por una compra.,0
+field,"account.invoice,purchase_exception_state",0,Exception State,Estado excepción,0
 field,"product.template,product_suppliers",0,Suppliers,Proveedores,0
 field,"product.template,purchasable",0,Purchasable,Comprable,0
-field,"product.template,purchase_uom",0,Purchase UOM,UdM de Compra,0
+field,"product.template,purchase_uom",0,Purchase UOM,UdM de compra,0
+field,"purchase.handle.invoice.exception.ask,domain_invoices",0,Domain Invoices,Facturas de dominio,0
+field,"purchase.handle.invoice.exception.ask,recreate_invoices",0,Recreate Invoices,Rehacer facturas,0
+field,"purchase.handle.packing.exception.ask,domain_moves",0,Domain Moves,Movimientos de dominio,0
+field,"purchase.handle.packing.exception.ask,recreate_moves",0,Recreate Moves,Rehacer movimientos,0
+field,"purchase.line-account.invoice.line,invoice_line",0,Invoice Line,Línea de factura,0
+field,"purchase.line-account.invoice.line,purchase_line",0,Purchase Line,Línea de compra,0
+field,"purchase.line-account.invoice.line,rec_name",0,Name,Nombre,0
+field,"purchase.line-account.tax,line",0,Purchase Line,Línea de compra,0
+field,"purchase.line-account.tax,rec_name",0,Name,Nombre,0
+field,"purchase.line-account.tax,tax",0,Tax,Impuesto,0
 field,"purchase.line,amount",0,Amount,Cantidad,0
-field,"purchase.line,comment",0,Comment,Comentario,0
 field,"purchase.line,description",0,Description,Descripción,0
-field,"purchase.line,invoice_lines",0,Invoice Lines,Líneas de Factura,0
-field,"purchase.line,move_done",0,Moves Done,Movimientos Hechos,0
-field,"purchase.line,move_exception",0,Moves Exception,Excepción de Movimientos,0
+field,"purchase.line-ignored-stock.move,move",0,Move,Movimiento,0
+field,"purchase.line-ignored-stock.move,purchase_line",0,Purchase Line,Línea de compra,0
+field,"purchase.line-ignored-stock.move,rec_name",0,Name,Nombre,0
+field,"purchase.line,invoice_lines",0,Invoice Lines,Líneas de factura,0
+field,"purchase.line,move_done",0,Moves Done,Movimientos hechos,0
+field,"purchase.line,move_exception",0,Moves Exception,Exepción de movimientos,0
 field,"purchase.line,moves",0,Moves,Movimientos,0
-field,"purchase.line,moves_ignored",0,Moves Ignored,Movimientos Ignorados,0
+field,"purchase.line,moves_ignored",0,Ignored Moves,Movimientos ignorados,0
+field,"purchase.line,moves_recreated",0,Recreated Moves,Rehacer movimientos,0
+field,"purchase.line,note",0,Note,Nota,0
 field,"purchase.line,product",0,Product,Producto,0
 field,"purchase.line,purchase",0,Purchase,Compra,0
 field,"purchase.line,quantity",0,Quantity,Cantidad,0
+field,"purchase.line,rec_name",0,Name,Nombre,0
+field,"purchase.line-recreated-stock.move,move",0,Move,Movimiento,0
+field,"purchase.line-recreated-stock.move,purchase_line",0,Purchase Line,Línea de compra,0
+field,"purchase.line-recreated-stock.move,rec_name",0,Name,Nombre,0
 field,"purchase.line,sequence",0,Sequence,Secuencia,0
 field,"purchase.line,taxes",0,Taxes,Impuestos,0
 field,"purchase.line,type",0,Type,Tipo,0
 field,"purchase.line,unit",0,Unit,Unidad,0
-field,"purchase.line,unit_digits",0,Unit Digits,Dígitos Unitarios,0
-field,"purchase.line,unit_price",0,Unit Price,Precio Unitario,0
+field,"purchase.line,unit_digits",0,Unit Digits,Dígitos unitarios,0
+field,"purchase.line,unit_price",0,Unit Price,Precio unitario,0
 field,"purchase.product_supplier,code",0,Code,Código,0
 field,"purchase.product_supplier,company",0,Company,Compañía,0
-field,"purchase.product_supplier,delivery_time",0,Delivery Time,Hora de Envío,0
+field,"purchase.product_supplier,delivery_time",0,Delivery Time,Tiempo de envío,0
 field,"purchase.product_supplier,name",0,Name,Nombre,0
 field,"purchase.product_supplier,party",0,Supplier,Proveedor,0
 field,"purchase.product_supplier.price,product_supplier",0,Supplier,Proveedor,0
 field,"purchase.product_supplier.price,quantity",0,Quantity,Cantidad,0
+field,"purchase.product_supplier.price,rec_name",0,Name,Nombre,0
 field,"purchase.product_supplier,prices",0,Prices,Precios,0
-field,"purchase.product_supplier.price,unit_price",0,Unit Price,Precio Unitario,0
+field,"purchase.product_supplier.price,unit_price",0,Unit Price,Precio unitario,0
 field,"purchase.product_supplier,product",0,Product,Producto,0
+field,"purchase.product_supplier,rec_name",0,Name,Nombre,0
 field,"purchase.product_supplier,sequence",0,Sequence,Secuencia,0
+field,"purchase.purchase-account.invoice,invoice",0,Invoice,Factura,0
+field,"purchase.purchase-account.invoice,purchase",0,Purchase,Compra,0
+field,"purchase.purchase-account.invoice,rec_name",0,Name,Nombre,0
 field,"purchase.purchase,comment",0,Comment,Comentario,0
-field,"purchase.purchase,company",0,Company,Compañía,0
-field,"purchase.purchase,contact_address",0,Contact Address,Dirección de contacto,0
-field,"purchase.purchase,currency",0,Currency,Moneda,0
-field,"purchase.purchase,currency_digits",0,Currency Digits,Dígitos de Moneda,0
+field,"purchase.purchase,company",0,Company,Empresa,0
+field,"purchase.purchase,currency",0,Currency,Divisa,0
+field,"purchase.purchase,currency_digits",0,Currency Digits,Dígitos de la divisa,0
 field,"purchase.purchase,description",0,Description,Descripción,0
+field,"purchase.purchase-ignored-account.invoice,invoice",0,Invoice,Factura,0
+field,"purchase.purchase-ignored-account.invoice,purchase",0,Purchase,Compra,0
+field,"purchase.purchase-ignored-account.invoice,rec_name",0,Name,Nombre,0
 field,"purchase.purchase,invoice_address",0,Invoice Address,Dirección de facturación,0
-field,"purchase.purchase,invoice_exception",0,Invoices Exception,Excepciones de Facturas,0
+field,"purchase.purchase,invoice_exception",0,Invoices Exception,Excepción de facturaciones,0
 field,"purchase.purchase,invoice_method",0,Invoice Method,Método de facturación,0
-field,"purchase.purchase,invoice_paid",0,Invoices Paid,Facturas pagas,0
+field,"purchase.purchase,invoice_paid",0,Invoices Paid,Facturas pagadas,0
 field,"purchase.purchase,invoices",0,Invoices,Facturas,0
-field,"purchase.purchase,invoices_ignored",0,Invoices Ignored,Facturas Ignoradas,0
-field,"purchase.purchase,invoice_state",0,Invoice State,Estado de Factura,0
+field,"purchase.purchase,invoices_ignored",0,Ignored Invoices,Facturas ignoradas,0
+field,"purchase.purchase,invoices_recreated",0,Recreated Invoices,Facturas recreadas,0
+field,"purchase.purchase,invoice_state",0,Invoice State,Estado de factura,0
 field,"purchase.purchase,lines",0,Lines,Líneas,0
 field,"purchase.purchase,moves",0,Moves,Movimientos,0
-field,"purchase.purchase,packing_done",0,Packing Done,Empaque hecho,0
-field,"purchase.purchase,packing_exception",0,Packings Exception,Excepción de Empaques,0
-field,"purchase.purchase,packings",0,Packings,Empaques,0
-field,"purchase.purchase,packing_state",0,Packing State,Estado de Empaque,0
-field,"purchase.purchase,party",0,Party,Tercero,0
-field,"purchase.purchase,party_lang",0,Party Language,Lenguaje del Tercero,0
-field,"purchase.purchase,payment_term",0,Payment Term,Término de Pago,0
-field,"purchase.purchase,purchase_date",0,Purchase Date,Fecha de Compra,0
+field,"purchase.purchase,packing_done",0,Shipment Done,Envío Finalizado,0
+field,"purchase.purchase,packing_exception",0,Shipments Exception,Excepción de envios,0
+field,"purchase.purchase,packings",0,Shipments,Envíos,0
+field,"purchase.purchase,packing_state",0,Shipment State,Estado de envío,0
+field,"purchase.purchase,party",0,Party,Terceros,0
+field,"purchase.purchase,party_lang",0,Party Language,Idioma del tercero,0
+field,"purchase.purchase,payment_term",0,Payment Term,Término de pago,0
+field,"purchase.purchase,purchase_date",0,Purchase Date,Fecha de compra,0
+field,"purchase.purchase,rec_name",0,Name,Nombre,0
+field,"purchase.purchase-recreated-account.invoice,invoice",0,Invoice,Factura,0
+field,"purchase.purchase-recreated-account.invoice,purchase",0,Purchase,Compra,0
+field,"purchase.purchase-recreated-account.invoice,rec_name",0,Name,Nombre,0
 field,"purchase.purchase,reference",0,Reference,Referencia,0
 field,"purchase.purchase,state",0,State,Estado,0
+field,"purchase.purchase,supplier_reference",0,Supplier Reference,Referencia de proveedor,0
 field,"purchase.purchase,tax_amount",0,Tax,Impuesto,0
 field,"purchase.purchase,total_amount",0,Total,Total,0
 field,"purchase.purchase,untaxed_amount",0,Untaxed,Sin impuesto,0
-field,"purchase.purchase,warehouse",0,Warehouse,Bodega,0
+field,"purchase.purchase,warehouse",0,Warehouse,Almacén,0
 field,"stock.move,purchase",0,Purchase,Compra,0
-field,"stock.move,purchase_line",0,unknown,desconocid@,0
+field,"stock.move,purchase_currency",0,Purchase Currency,Divisa de compra,0
+field,"stock.move,purchase_exception_state",0,Exception State,Estado excepción,0
+field,"stock.move,purchase_line",0,,,0
+field,"stock.move,purchase_quantity",0,Purchase Quantity,Cantidad de compra,0
+field,"stock.move,purchase_unit",0,Purchase Unit,Unidad de compra,0
+field,"stock.move,purchase_unit_digits",0,Purchase Unit Digits,Decimales de la unidad de compra,0
+field,"stock.move,purchase_unit_price",0,Purchase Unit Price,Precio de la unidad de compra,0
 field,"stock.move,supplier",0,Supplier,Proveedor,0
+help,"purchase.handle.invoice.exception.ask,recreate_invoices",0,The selected invoices will be recreated. The other ones will be ignored.,La factura seleccionada será recreada. Las otras serán ignoradas.,0
+help,"purchase.handle.packing.exception.ask,recreate_moves",0,The selected moves will be recreated. The other ones will be ignored.,Los movimientos seleccionados se reharán. Los demás se ignorarán.,0
 help,"purchase.product_supplier,delivery_time",0,In number of days,En número de días,0
-help,"purchase.product_supplier.price,quantity",0,Minimal quantity,Cantidad Mínima,0
+help,"purchase.product_supplier.price,quantity",0,Minimal quantity,Cantidad mínima,0
 model,"ir.action,name",act_purchase_form_confirmed,Confirmed Purchases,Compras confirmadas,0
-model,"ir.action,name",act_purchase_form_draft,Draft Purchases,Compras en Borrador,0
+model,"ir.action,name",act_purchase_form_draft,Draft Purchases,Compras en borrador,0
+model,"ir.action,name",wizard_invoice_handle_exception,Handle Invoice Exception,Gestionar excepción de factura,0
+model,"ir.action,name",wizard_packing_handle_exception,Handle Shipment Exception,Gestionar excepción de envio,0
+model,"ir.action,name",act_invoice_form,Invoices,Facturas,0
+model,"ir.action,name",act_purchase_form_new,New Purchase,Nueva compra,0
+model,"ir.action,name",act_open_supplier,Parties associated to Purchases,Terceros asociados con compras,0
 model,"ir.action,name",report_purchase,Purchase,Compra,0
 model,"ir.action,name",act_purchase_form,Purchases,Compras,0
-model,"ir.action,name",act_purchase_form_quotation,Purchases in Quotation,Cotizaciones de Compras,0
-model,"ir.action,name",act_open_supplier,Suppliers,Proveedores,0
+model,"ir.action,name",act_purchase_form2,Purchases,Compras,0
+model,"ir.action,name",act_purchase_form_quotation,Purchases in Quotation,Compras en cotización,0
+model,"ir.action,name",act_packing_form,Shipments,Envíos,0
+model,"ir.sequence,name",sequence_purchase,Purchase,Compra,0
+model,"ir.sequence.type,name",sequence_type_purchase,Purchase,Compra,0
+model,"ir.ui.menu,name",menu_configuration,Configuration,Configuración,0
 model,"ir.ui.menu,name",menu_purchase_form_confirmed,Confirmed Purchases,Compras confirmadas,0
-model,"ir.ui.menu,name",menu_purchase_form_draft,Draft Purchases,Compras en Borrador,0
-model,"ir.ui.menu,name",menu_purchase,Purchase Management,Gestión de Compras,0
+model,"ir.ui.menu,name",menu_purchase_form_draft,Draft Purchases,Compras en borrador,0
+model,"ir.ui.menu,name",menu_purchase_form_new,New Purchase,Nueva compra,0
+model,"ir.ui.menu,name",menu_supplier,Parties associated to Purchases,Terceros asociados con compras,0
+model,"ir.ui.menu,name",menu_purchase,Purchase Management,Gestión de compras,0
 model,"ir.ui.menu,name",menu_purchase_form,Purchases,Compras,0
-model,"ir.ui.menu,name",menu_purchase_form_quotation,Purchases in Quotation,Cotizaciones de Compras,0
-model,"ir.ui.menu,name",menu_supplier,Suppliers,Proveedores,0
+model,"ir.ui.menu,name",menu_purchase_form_quotation,Purchases in Quotation,Compras en cotización,0
+model,"ir.ui.menu,name",menu_reporting,Reporting,Informes,0
+model,"purchase.handle.invoice.exception.ask,name",0,Invoice Exception Ask,,0
+model,"purchase.handle.packing.exception.ask,name",0,Shipment Exception Ask,,0
+model,"purchase.line-account.invoice.line,name",0,Purchase Line - Invoice Line,Línea de compra - Línea de factura,0
+model,"purchase.line-account.tax,name",0,Purchase Line - Tax,Línea de compra - Impuesto,0
+model,"purchase.line-ignored-stock.move,name",0,Purchase Line - Ignored Move,Línea de compra - Movimiento Ignorado,0
+model,"purchase.line,name",0,Purchase Line,Línea de compra,0
+model,"purchase.line-recreated-stock.move,name",0,Purchase Line - Ignored Move,Línea de compra - Movimiento ignorado,0
+model,"purchase.product_supplier,name",0,Product Supplier,Proveedor de producto,0
+model,"purchase.product_supplier.price,name",0,Product Supplier Price,Precio del proveedor del producto,0
+model,"purchase.purchase-account.invoice,name",0,Purchase - Invoice,Compra - Factura,0
+model,"purchase.purchase-ignored-account.invoice,name",0,Purchase - Ignored Invoice,Compra - Factura ignorada,0
+model,"purchase.purchase,name",0,Purchase,Compra,0
+model,"purchase.purchase-recreated-account.invoice,name",0,Purchase - Recreated Invoice,Compra - Factura recreada,0
+model,"res.group,name",group_purchase,Purchase,Compra,0
+model,"res.group,name",group_purchase_admin,Purchase Administrator,Administrador de compra,0
+model,"workflow.activity,name",purchase_activity_cancel,Canceled,Cancelado,0
+model,"workflow.activity,name",purchase_activity_confirmed,Confirmed,Confirmado,0
+model,"workflow.activity,name",purchase_activity_done,Done,Hecho,0
+model,"workflow.activity,name",purchase_activity_draft,Draft,Borrador,0
+model,"workflow.activity,name",purchase_activity_invoice_done,Invoice Done,Factura hecha,0
+model,"workflow.activity,name",purchase_activity_invoice_purchase_exception,Invoice Exception,Factura de excepción,0
+model,"workflow.activity,name",purchase_activity_invoice_method,Invoice Method,Método de facturación,0
+model,"workflow.activity,name",purchase_activity_invoice_method_done,Invoice Method Done,Método de factura hecho,0
+model,"workflow.activity,name",purchase_activity_invoice_packing,Invoice Shipment,Envío de factura,0
+model,"workflow.activity,name",purchase_activity_invoice_packing_done,Invoice Shipment Done,Envío de factura hecho,0
+model,"workflow.activity,name",purchase_activity_invoice_packing_exception,Invoice Shipment Exception,Excepción de envío de factura,0
+model,"workflow.activity,name",purchase_activity_invoice_packing_method,Invoice Shipment Method,Método de envio de factura,0
+model,"workflow.activity,name",purchase_activity_invoice_packing_method_done,Invoice Shipment Method Done,Método de envío de factura hecho,0
+model,"workflow.activity,name",purchase_activity_quotation,Quotation,Cotización,0
+model,"workflow.activity,name",purchase_activity_packing_exception,Shipment Exception,Excepción de envio,0
+model,"workflow.activity,name",purchase_activity_waiting_invoice_purchase,Waiting Invoice,Esperando factura,0
+model,"workflow.activity,name",purchase_activity_waiting_invoice_packing,Waiting Invoice Shipment,Esperando envío de factura,0
+model,"workflow.activity,name",purchase_activity_waiting_packing,Waiting Shipment,Esperando envio,0
+model,"workflow,name",purchase_workflow,Purchase workflow,Flujo de trabajo de compra,0
 odt,purchase.purchase,0,Amount,Cantidad,0
 odt,purchase.purchase,0,Date:,Fecha:,0
 odt,purchase.purchase,0,Description,Descripción,0
 odt,purchase.purchase,0,Description:,Descripción:,0
-odt,purchase.purchase,0,Draft Purchase Order,Borrador de Orden de Compra,0
+odt,purchase.purchase,0,Draft Purchase Order,Orden de compra en borrador,0
 odt,purchase.purchase,0,E-Mail:,Correo electrónico:,0
 odt,purchase.purchase,0,Phone:,Teléfono:,0
-odt,purchase.purchase,0,Purchase Order N°:,Nº de Orden de Compra:,0
+odt,purchase.purchase,0,Purchase Order N°:,Nº de orden de compra:,0
 odt,purchase.purchase,0,Quantity,Cantidad,0
-odt,purchase.purchase,0,Request for Quotation N°:,Solicitud de Factura Nº:,0
+odt,purchase.purchase,0,Request for Quotation N°:,Solicitud de presupuesto Nº:,0
 odt,purchase.purchase,0,Taxes,Impuestos,0
-odt,purchase.purchase,0,Taxes:,Impuestos,0
+odt,purchase.purchase,0,Taxes:,Impuestos:,0
 odt,purchase.purchase,0,Total:,Total:,0
-odt,purchase.purchase,0,Total (excl. taxes):,Total(excl. impuestos):,0
-odt,purchase.purchase,0,Unit Price,Precio Unitario,0
-odt,purchase.purchase,0,VAT:,VAT:,0
+odt,purchase.purchase,0,Total (excl. taxes):,Total (sin impuestos):,0
+odt,purchase.purchase,0,Unit Price,Precio unitario,0
+odt,purchase.purchase,0,VAT:,IVA:,0
+selection,"account.invoice,purchase_exception_state",0,,,0
+selection,"account.invoice,purchase_exception_state",0,Ignored,Ignorado,0
+selection,"account.invoice,purchase_exception_state",0,Recreated,Rehecho,0
+selection,"purchase.line,type",0,Comment,Comentario,0
 selection,"purchase.line,type",0,Line,Línea,0
 selection,"purchase.line,type",0,Subtotal,Subtotal,0
 selection,"purchase.line,type",0,Title,Título,0
-selection,"purchase.purchase,invoice_method",0,Based On Order,Basado en la orden,0
-selection,"purchase.purchase,invoice_method",0,Based On Packing,Basado en el empaque,0
+selection,"purchase.purchase,invoice_method",0,Based On Order,Basado en orden,0
+selection,"purchase.purchase,invoice_method",0,Based On Shipment,Basado en envio,0
 selection,"purchase.purchase,invoice_method",0,Manual,Manual,0
 selection,"purchase.purchase,invoice_state",0,Exception,Excepción,0
-selection,"purchase.purchase,invoice_state",0,None,Nada,0
-selection,"purchase.purchase,invoice_state",0,Paid,Pagad@,0
+selection,"purchase.purchase,invoice_state",0,None,Ninguno,0
+selection,"purchase.purchase,invoice_state",0,Paid,Pagado,0
 selection,"purchase.purchase,invoice_state",0,Waiting,En espera,0
 selection,"purchase.purchase,packing_state",0,Exception,Excepción,0
-selection,"purchase.purchase,packing_state",0,None,Nada,0
+selection,"purchase.purchase,packing_state",0,None,Ninguno,0
 selection,"purchase.purchase,packing_state",0,Received,Recibido,0
 selection,"purchase.purchase,packing_state",0,Waiting,En espera,0
-selection,"purchase.purchase,state",0,Cancel,Cancelar,0
+selection,"purchase.purchase,state",0,Canceled,Cancelado,0
 selection,"purchase.purchase,state",0,Confirmed,Confirmado,0
 selection,"purchase.purchase,state",0,Done,Hecho,0
 selection,"purchase.purchase,state",0,Draft,Borrador,0
-selection,"purchase.purchase,state",0,Quotation,Cotización,0
+selection,"purchase.purchase,state",0,Quotation,Presupuesto,0
+selection,"stock.move,purchase_exception_state",0,,,0
+selection,"stock.move,purchase_exception_state",0,Ignored,Ignorado,0
+selection,"stock.move,purchase_exception_state",0,Recreated,Rehecho,0
 view,product.product,0,Products,Productos,0
 view,product.product,0,Suppliers,Proveedores,0
-view,purchase.line,0,Purchase Line,Línea de Compra,0
-view,purchase.line,0,Purchase Lines,Líneas de Compra,0
-view,purchase.product_supplier,0,Product Supplier,Proveedor de Producto,0
-view,purchase.product_supplier,0,Product Suppliers,Proveedores de Producto,0
-view,purchase.product_supplier.price,0,Product Supplier Price,Precio de Proveedor de Producto,0
-view,purchase.product_supplier.price,0,Product Supplier Prices,Precios de Proveedor de Producto,0
+view,product.template,0,Product Suppliers,Proveedores de productos,0
+view,product.template,0,Suppliers,Proveedores,0
+view,purchase.handle.invoice.exception.ask,0,Choose invoices to recreate,Seleccione las facturas a recrear,0
+view,purchase.handle.invoice.exception.ask,0,Handle Invoice Exception,Manejar excepción de factura,0
+view,purchase.handle.packing.exception.ask,0,Choose moves to recreate,Elegir movimientos a recrear,0
+view,purchase.handle.packing.exception.ask,0,Handle packing Exception,Gestionar excepciones de envio,0
+view,purchase.handle.packing.exception.ask,0,Recreated Moves,Movimientos recreados,0
+view,purchase.line,0,General,General,0
+view,purchase.line,0,Notes,Notas,0
+view,purchase.line,0,Products,Productos,0
+view,purchase.line,0,Purchase Line,Línea de compra,0
+view,purchase.line,0,Purchase Lines,Líneas de compra,0
+view,purchase.product_supplier,0,Product Supplier,Proveedor del producto,0
+view,purchase.product_supplier,0,Product Suppliers,Proveedores de productos,0
+view,purchase.product_supplier.price,0,Product Supplier Price,Precio del proveedor del producto,0
+view,purchase.product_supplier.price,0,Product Supplier Prices,Precios del proveedor del producto,0
 view,purchase.purchase,0,Cancel,Cancelar,0
 view,purchase.purchase,0,Confirm,Confirmar,0
 view,purchase.purchase,0,Draft,Borrador,0
-view,purchase.purchase,0,Ignore Invoice Exception,Ignorar excepción de facturación,0
-view,purchase.purchase,0,Ignore Packing Exception,Ignorar excepción de empaque,0
+view,purchase.purchase,0,Handle Invoice Exception,Gestionar excepción de factura,0
+view,purchase.purchase,0,Handle Shipment Exception,Gestionar excepción de envios,0
 view,purchase.purchase,0,Invoices,Facturas,0
 view,purchase.purchase,0,Lines,Líneas,0
-view,purchase.purchase,0,Other Info,Otra información,0
-view,purchase.purchase,0,Packings,Empaques,0
+view,purchase.purchase,0,Moves,Movimientos,0
+view,purchase.purchase,0,Other Info,Información adicional,0
 view,purchase.purchase,0,Purchase,Compra,0
 view,purchase.purchase,0,Purchases,Compras,0
-view,purchase.purchase,0,Quotation,Cotización,0
+view,purchase.purchase,0,Quotation,Presupuesto,0
+view,purchase.purchase,0,Shipments,Envíos,0
+wizard_button,"purchase.handle.invoice.exception,init,end",0,Cancel,Cancelar,0
+wizard_button,"purchase.handle.invoice.exception,init,ok",0,Ok,Aceptar,0
+wizard_button,"purchase.handle.packing.exception,init,end",0,Cancel,Cancelar,0
+wizard_button,"purchase.handle.packing.exception,init,ok",0,Ok,Aceptar,0
diff --git a/fr_FR.csv b/fr_FR.csv
index c3133d2..9c457b4 100644
--- a/fr_FR.csv
+++ b/fr_FR.csv
@@ -1,23 +1,46 @@
 type,name,res_id,src,value,fuzzy
-error,account.invoice,0,You can not delete invoices that comes from a purchase!,Vous ne pouvez pas supprimer des factures provenant d'un achat !,0
-error,purchase.line,0,"It miss an ""account_expense"" default property!","Il manque une propriété""account_expense""",0
+error,account.invoice,0,You can not delete invoices that come from a purchase!,Vous ne pouvez pas supprimer une facture qui provient d'un achat,0
+error,account.invoice,0,You cannot reset to draft an invoice generated by a purchase.,Vous ne pouvez pas réinitialiser une facture générée par un achat.,0
+error,product.template,0,"Purchase prices are based on the purchase uom, are you sure to change it?","Les prix d'achat sont basé sur l'UDM d'achat, êtes-vous sur de vouloir la modifier ?",0
+error,purchase.line,0,"It misses an ""account expense"" default property!","il manque une propriété par défaut ""compte de dépense"" !",0
+error,purchase.line,0,"It misses an ""Account Expense"" on product ""%s""!","Il manque un compte de dépense sur le produit ""%s"" !",0
 error,purchase.line,0,The supplier location is required!,L'emplacement fournisseur est requis !,0
-error,purchase.purchase,0,Contact and Invoice addresses must be defined for the quotation.,Les adresses de contact et de facture doivent être définie pour le devis.,0
 error,purchase.purchase,0,Invoice addresses must be defined for the quotation.,L'adresse de facturation doit être définie pour le devis.,0
+error,purchase.purchase,0,"It misses an ""Account Payable"" on the party ""%s""!","Il manque un compte de paiement sur le tiers ""%s"" !",0
+error,stock.packing.in,0,You cannot reset to draft a move generated by a purchase.,Vous ne pouvez pas réinitialiser un mouvement généré par un achat.,0
+field,"account.invoice,purchase_exception_state",0,Exception State,État d'exception,0
 field,"product.template,product_suppliers",0,Suppliers,Fournisseurs,0
 field,"product.template,purchasable",0,Purchasable,Achetable,0
 field,"product.template,purchase_uom",0,Purchase UOM,UDM à l'achat,0
+field,"purchase.handle.invoice.exception.ask,domain_invoices",0,Domain Invoices,Domaine des factures,0
+field,"purchase.handle.invoice.exception.ask,recreate_invoices",0,Recreate Invoices,Recréer les factures,0
+field,"purchase.handle.packing.exception.ask,domain_moves",0,Domain Moves,Domaine des mouvements,0
+field,"purchase.handle.packing.exception.ask,recreate_moves",0,Recreate Moves,Recréer les mouvements,0
+field,"purchase.line-account.invoice.line,invoice_line",0,Invoice Line,Ligne de Facture,0
+field,"purchase.line-account.invoice.line,purchase_line",0,Purchase Line,Ligne d'achat,0
+field,"purchase.line-account.invoice.line,rec_name",0,Name,Nom,0
+field,"purchase.line-account.tax,line",0,Purchase Line,Ligne d'achat,0
+field,"purchase.line-account.tax,rec_name",0,Name,Nom,0
+field,"purchase.line-account.tax,tax",0,Tax,Taxe,0
 field,"purchase.line,amount",0,Amount,Montant,0
-field,"purchase.line,comment",0,Comment,Commentaire,0
 field,"purchase.line,description",0,Description,Description,0
+field,"purchase.line-ignored-stock.move,move",0,Move,Mouvement,0
+field,"purchase.line-ignored-stock.move,purchase_line",0,Purchase Line,Ligne d'achat,0
+field,"purchase.line-ignored-stock.move,rec_name",0,Name,Nom,0
 field,"purchase.line,invoice_lines",0,Invoice Lines,Lignes de factures,0
 field,"purchase.line,move_done",0,Moves Done,Mouvements effectués,0
 field,"purchase.line,move_exception",0,Moves Exception,Mouvements en exception,0
 field,"purchase.line,moves",0,Moves,Mouvements,0
-field,"purchase.line,moves_ignored",0,Moves Ignored,Mouvements ignorés,0
+field,"purchase.line,moves_ignored",0,Ignored Moves,Mouvements ignorés,0
+field,"purchase.line,moves_recreated",0,Recreated Moves,Mouvements recréés,0
+field,"purchase.line,note",0,Note,Note,0
 field,"purchase.line,product",0,Product,Produit,0
 field,"purchase.line,purchase",0,Purchase,Achat,0
 field,"purchase.line,quantity",0,Quantity,Quantité,0
+field,"purchase.line,rec_name",0,Name,Nom,0
+field,"purchase.line-recreated-stock.move,move",0,Move,Mouvement,0
+field,"purchase.line-recreated-stock.move,purchase_line",0,Purchase Line,Ligne d'achat,0
+field,"purchase.line-recreated-stock.move,rec_name",0,Name,Nom,0
 field,"purchase.line,sequence",0,Sequence,Séquence,0
 field,"purchase.line,taxes",0,Taxes,Taxes,0
 field,"purchase.line,type",0,Type,Type,0
@@ -25,90 +48,127 @@ field,"purchase.line,unit",0,Unit,Unité,0
 field,"purchase.line,unit_digits",0,Unit Digits,Décimales de l'unité,0
 field,"purchase.line,unit_price",0,Unit Price,Prix unitaire,0
 field,"purchase.product_supplier,code",0,Code,Code,0
-field,"purchase.product_supplier,company",0,Company,Companie,0
+field,"purchase.product_supplier,company",0,Company,Société,0
 field,"purchase.product_supplier,delivery_time",0,Delivery Time,Temps de livraison,0
 field,"purchase.product_supplier,name",0,Name,Nom,0
 field,"purchase.product_supplier,party",0,Supplier,Fournisseur,0
 field,"purchase.product_supplier.price,product_supplier",0,Supplier,Fournisseur,0
 field,"purchase.product_supplier.price,quantity",0,Quantity,Quantité,0
+field,"purchase.product_supplier.price,rec_name",0,Name,Nom,0
 field,"purchase.product_supplier,prices",0,Prices,Prix,0
 field,"purchase.product_supplier.price,unit_price",0,Unit Price,Prix unitaire,0
 field,"purchase.product_supplier,product",0,Product,Produit,0
+field,"purchase.product_supplier,rec_name",0,Name,Nom,0
 field,"purchase.product_supplier,sequence",0,Sequence,Séquence,0
+field,"purchase.purchase-account.invoice,invoice",0,Invoice,Facture,0
+field,"purchase.purchase-account.invoice,purchase",0,Purchase,Achat,0
+field,"purchase.purchase-account.invoice,rec_name",0,Name,Nom,0
 field,"purchase.purchase,comment",0,Comment,Commentaire,0
-field,"purchase.purchase,company",0,Company,Companie,0
-field,"purchase.purchase,contact_address",0,Contact Address,Adresse de contact,0
+field,"purchase.purchase,company",0,Company,Société,0
 field,"purchase.purchase,currency",0,Currency,Devise,0
 field,"purchase.purchase,currency_digits",0,Currency Digits,Décimales de la devise,0
 field,"purchase.purchase,description",0,Description,Description,0
+field,"purchase.purchase-ignored-account.invoice,invoice",0,Invoice,Facture,0
+field,"purchase.purchase-ignored-account.invoice,purchase",0,Purchase,Achat,0
+field,"purchase.purchase-ignored-account.invoice,rec_name",0,Name,Nom,0
 field,"purchase.purchase,invoice_address",0,Invoice Address,Adresse de facturation,0
 field,"purchase.purchase,invoice_exception",0,Invoices Exception,Factures en exception,0
 field,"purchase.purchase,invoice_method",0,Invoice Method,Méthode de facturation,0
 field,"purchase.purchase,invoice_paid",0,Invoices Paid,Factures payées,0
 field,"purchase.purchase,invoices",0,Invoices,Factures,0
-field,"purchase.purchase,invoices_ignored",0,Invoices Ignored,Factures ignorées,0
+field,"purchase.purchase,invoices_ignored",0,Ignored Invoices,Factures ignorées,0
+field,"purchase.purchase,invoices_recreated",0,Recreated Invoices,Factures recréées,0
 field,"purchase.purchase,invoice_state",0,Invoice State,État de la facture,0
 field,"purchase.purchase,lines",0,Lines,Lignes,0
 field,"purchase.purchase,moves",0,Moves,Mouvements,0
-field,"purchase.purchase,packing_done",0,Packing Done,Colisage effectué,0
-field,"purchase.purchase,packing_exception",0,Packings Exception,Colisages en exception,0
-field,"purchase.purchase,packings",0,Packings,Colisages,0
-field,"purchase.purchase,packing_state",0,Packing State,État du colisage,0
+field,"purchase.purchase,packing_done",0,Shipment Done,Expédition effectuée,0
+field,"purchase.purchase,packing_exception",0,Shipments Exception,Expéditions en exception,0
+field,"purchase.purchase,packings",0,Shipments,Expéditions,0
+field,"purchase.purchase,packing_state",0,Shipment State,État de l'expédition,0
 field,"purchase.purchase,party",0,Party,Tiers,0
 field,"purchase.purchase,party_lang",0,Party Language,Langue du tiers,0
-field,"purchase.purchase,payment_term",0,Payment Term,Condition de paiement,0
+field,"purchase.purchase,payment_term",0,Payment Term,Conditions de paiement,0
 field,"purchase.purchase,purchase_date",0,Purchase Date,Date d'achat,0
+field,"purchase.purchase,rec_name",0,Name,Nom,0
+field,"purchase.purchase-recreated-account.invoice,invoice",0,Invoice,Facture,0
+field,"purchase.purchase-recreated-account.invoice,purchase",0,Purchase,Achat,0
+field,"purchase.purchase-recreated-account.invoice,rec_name",0,Name,Nom,0
 field,"purchase.purchase,reference",0,Reference,Référence,0
 field,"purchase.purchase,state",0,State,État,0
+field,"purchase.purchase,supplier_reference",0,Supplier Reference,Référence fournisseur,0
 field,"purchase.purchase,tax_amount",0,Tax,Taxe,0
 field,"purchase.purchase,total_amount",0,Total,Total,0
 field,"purchase.purchase,untaxed_amount",0,Untaxed,Non-taxé,0
 field,"purchase.purchase,warehouse",0,Warehouse,Entrepôt,0
-field,"stock.move,purchase",0,Purchase,Achats,0
+field,"stock.move,purchase",0,Purchase,Achat,0
 field,"stock.move,purchase_currency",0,Purchase Currency,Devise de l'achat,0
-field,"stock.move,purchase_line",0,unknown,inconnu,0
+field,"stock.move,purchase_exception_state",0,Exception State,État d'exception,0
+field,"stock.move,purchase_line",0,,,0
 field,"stock.move,purchase_quantity",0,Purchase Quantity,Quantité d'achat,0
 field,"stock.move,purchase_unit",0,Purchase Unit,Unité d'achat,0
 field,"stock.move,purchase_unit_digits",0,Purchase Unit Digits,Décimales de l'unité d'achat,0
 field,"stock.move,purchase_unit_price",0,Purchase Unit Price,Prix unitaire d'achat,0
 field,"stock.move,supplier",0,Supplier,Fournisseur,0
+help,"purchase.handle.invoice.exception.ask,recreate_invoices",0,The selected invoices will be recreated. The other ones will be ignored.,Les factures sélectionnées seront recréés. Les autres seront ignorées.,0
+help,"purchase.handle.packing.exception.ask,recreate_moves",0,The selected moves will be recreated. The other ones will be ignored.,Les mouvements sélectionnés seront recréés. Les autres seront ignorés.,0
 help,"purchase.product_supplier,delivery_time",0,In number of days,En nombre de jours,0
 help,"purchase.product_supplier.price,quantity",0,Minimal quantity,Quantité minimale,0
 model,"ir.action,name",act_purchase_form_confirmed,Confirmed Purchases,Achats confirmés,0
 model,"ir.action,name",act_purchase_form_draft,Draft Purchases,Achats brouillons,0
+model,"ir.action,name",wizard_invoice_handle_exception,Handle Invoice Exception,Gérer l'exception de facture,0
+model,"ir.action,name",wizard_packing_handle_exception,Handle Shipment Exception,Gérer l'exception d'expédition,0
+model,"ir.action,name",act_invoice_form,Invoices,Factures,0
+model,"ir.action,name",act_purchase_form_new,New Purchase,Nouvel achat,0
+model,"ir.action,name",act_open_supplier,Parties associated to Purchases,Tiers associés à des achats,0
 model,"ir.action,name",report_purchase,Purchase,Achat,0
 model,"ir.action,name",act_purchase_form,Purchases,Achats,0
+model,"ir.action,name",act_purchase_form2,Purchases,Achats,0
 model,"ir.action,name",act_purchase_form_quotation,Purchases in Quotation,Devis,0
-model,"ir.action,name",act_open_supplier,Suppliers,Fournisseurs,0
+model,"ir.action,name",act_packing_form,Shipments,Expéditions,0
 model,"ir.sequence,name",sequence_purchase,Purchase,Achat,0
 model,"ir.sequence.type,name",sequence_type_purchase,Purchase,Achat,0
+model,"ir.ui.menu,name",menu_configuration,Configuration,Configuration,0
 model,"ir.ui.menu,name",menu_purchase_form_confirmed,Confirmed Purchases,Achats confirmé,0
 model,"ir.ui.menu,name",menu_purchase_form_draft,Draft Purchases,Achats brouillons,0
+model,"ir.ui.menu,name",menu_purchase_form_new,New Purchase,Nouvel achat,0
+model,"ir.ui.menu,name",menu_supplier,Parties associated to Purchases,Tiers associés à des achats,0
 model,"ir.ui.menu,name",menu_purchase,Purchase Management,Gestion des achats,0
 model,"ir.ui.menu,name",menu_purchase_form,Purchases,Achats,0
 model,"ir.ui.menu,name",menu_purchase_form_quotation,Purchases in Quotation,Devis,0
-model,"ir.ui.menu,name",menu_supplier,Suppliers,Fournisseurs,0
+model,"ir.ui.menu,name",menu_reporting,Reporting,Rapport,0
+model,"purchase.handle.invoice.exception.ask,name",0,Invoice Exception Ask,Exception de facture - Demande,0
+model,"purchase.handle.packing.exception.ask,name",0,Shipment Exception Ask,Exception d'expédition - Demande,0
+model,"purchase.line-account.invoice.line,name",0,Purchase Line - Invoice Line,Ligne d'achat - Ligne de facture,0
+model,"purchase.line-account.tax,name",0,Purchase Line - Tax,Ligne d'achat - Taxe,0
+model,"purchase.line-ignored-stock.move,name",0,Purchase Line - Ignored Move,Ligne d'achat - Mouvement ignoré,0
+model,"purchase.line,name",0,Purchase Line,Ligne d'achat,0
+model,"purchase.line-recreated-stock.move,name",0,Purchase Line - Ignored Move,Ligne d'achat - Mouvement ignoré,0
+model,"purchase.product_supplier,name",0,Product Supplier,Produit Fournisseur,0
+model,"purchase.product_supplier.price,name",0,Product Supplier Price,Produit Prix Fournisseur,0
+model,"purchase.purchase-account.invoice,name",0,Purchase - Invoice,Achat - Facture,0
+model,"purchase.purchase-ignored-account.invoice,name",0,Purchase - Ignored Invoice,Achat - Facture ignorée,0
+model,"purchase.purchase,name",0,Purchase,Achat,0
+model,"purchase.purchase-recreated-account.invoice,name",0,Purchase - Recreated Invoice,Achat - Facture recréée,0
 model,"res.group,name",group_purchase,Purchase,Achat,0
-model,"workflow.activity,name",purchase_activity_cancel,Cancel,Annulé,0
+model,"res.group,name",group_purchase_admin,Purchase Administrator,Administrateur d'achat,0
+model,"workflow.activity,name",purchase_activity_cancel,Canceled,Annulé,0
 model,"workflow.activity,name",purchase_activity_confirmed,Confirmed,Confirmé,0
 model,"workflow.activity,name",purchase_activity_done,Done,Fait,0
 model,"workflow.activity,name",purchase_activity_draft,Draft,Brouillon,0
-model,"workflow.activity,name",purchase_activity_invoice_purchase,Invoice,Facture,0
 model,"workflow.activity,name",purchase_activity_invoice_done,Invoice Done,Facture faite,0
 model,"workflow.activity,name",purchase_activity_invoice_purchase_exception,Invoice Exception,Facture en exception,0
 model,"workflow.activity,name",purchase_activity_invoice_method,Invoice Method,Méthode de facturation,0
 model,"workflow.activity,name",purchase_activity_invoice_method_done,Invoice Method Done,Méthode de facturation faite,0
-model,"workflow.activity,name",purchase_activity_invoice_packing,Invoice Packing,Facture colisage,0
-model,"workflow.activity,name",purchase_activity_invoice_packing_done,Invoice Packing Done,Facture Colisage fait,0
-model,"workflow.activity,name",purchase_activity_invoice_packing_exception,Invoice Packing Exception,Facture colisage en exception,0
-model,"workflow.activity,name",purchase_activity_invoice_packing_method,Invoice Packing Method,Méthode facture colisage,0
-model,"workflow.activity,name",purchase_activity_invoice_packing_method_done,Invoice Packing Method Done,Méthode facture colisage fait,0
-model,"workflow.activity,name",purchase_activity_packing,Packing,Colisage,0
-model,"workflow.activity,name",purchase_activity_packing_exception,Packing Exception,Colisage en exception,0
+model,"workflow.activity,name",purchase_activity_invoice_packing,Invoice Shipment,Facture d'expédition,0
+model,"workflow.activity,name",purchase_activity_invoice_packing_done,Invoice Shipment Done,Facture expédition faite,0
+model,"workflow.activity,name",purchase_activity_invoice_packing_exception,Invoice Shipment Exception,Facture expédition en exception,0
+model,"workflow.activity,name",purchase_activity_invoice_packing_method,Invoice Shipment Method,Méthode facture expédition,0
+model,"workflow.activity,name",purchase_activity_invoice_packing_method_done,Invoice Shipment Method Done,Méthode facture expédition faite,0
 model,"workflow.activity,name",purchase_activity_quotation,Quotation,Devis,0
+model,"workflow.activity,name",purchase_activity_packing_exception,Shipment Exception,Expédition en exception,0
 model,"workflow.activity,name",purchase_activity_waiting_invoice_purchase,Waiting Invoice,Facture en attente,0
-model,"workflow.activity,name",purchase_activity_waiting_invoice_packing,Waiting Invoice Packing,Facture colisage en attente,0
-model,"workflow.activity,name",purchase_activity_waiting_packing,Waiting Packing,Colisage en attente,0
+model,"workflow.activity,name",purchase_activity_waiting_invoice_packing,Waiting Invoice Shipment,Facture expédition en attente,0
+model,"workflow.activity,name",purchase_activity_waiting_packing,Waiting Shipment,Expédition en attente,0
 model,"workflow,name",purchase_workflow,Purchase workflow,Workflow d'achat,0
 odt,purchase.purchase,0,Amount,Montant,0
 odt,purchase.purchase,0,Date:,Date:,0
@@ -117,7 +177,7 @@ odt,purchase.purchase,0,Description:,Description:,0
 odt,purchase.purchase,0,Draft Purchase Order,Commande d'achat,0
 odt,purchase.purchase,0,E-Mail:,E-Mail:,0
 odt,purchase.purchase,0,Phone:,Téléphone,0
-odt,purchase.purchase,0,Purchase Order N°:,Commande d'achat n°:,0
+odt,purchase.purchase,0,Purchase Order N°:,Commande d'achat n° :,0
 odt,purchase.purchase,0,Quantity,Quantité,0
 odt,purchase.purchase,0,Request for Quotation N°:,Demande pour le devis n°,0
 odt,purchase.purchase,0,Taxes,Taxes,0
@@ -126,11 +186,15 @@ odt,purchase.purchase,0,Total:,Total:,0
 odt,purchase.purchase,0,Total (excl. taxes):,Total (htva),0
 odt,purchase.purchase,0,Unit Price,Prix unitaire,0
 odt,purchase.purchase,0,VAT:,TVA:,0
+selection,"account.invoice,purchase_exception_state",0,,,0
+selection,"account.invoice,purchase_exception_state",0,Ignored,Ignoré,0
+selection,"account.invoice,purchase_exception_state",0,Recreated,Recréé,0
+selection,"purchase.line,type",0,Comment,Commentaire,0
 selection,"purchase.line,type",0,Line,Ligne,0
 selection,"purchase.line,type",0,Subtotal,Sous-total,0
 selection,"purchase.line,type",0,Title,Titre,0
 selection,"purchase.purchase,invoice_method",0,Based On Order,A la commande,0
-selection,"purchase.purchase,invoice_method",0,Based On Packing,A la livraison,0
+selection,"purchase.purchase,invoice_method",0,Based On Shipment,A la livraison,0
 selection,"purchase.purchase,invoice_method",0,Manual,Manuel,0
 selection,"purchase.purchase,invoice_state",0,Exception,Exception,0
 selection,"purchase.purchase,invoice_state",0,None,Aucun,0
@@ -140,13 +204,25 @@ selection,"purchase.purchase,packing_state",0,Exception,Exception,0
 selection,"purchase.purchase,packing_state",0,None,Aucun,0
 selection,"purchase.purchase,packing_state",0,Received,Reçu,0
 selection,"purchase.purchase,packing_state",0,Waiting,En attente,0
-selection,"purchase.purchase,state",0,Cancel,Annulé,0
+selection,"purchase.purchase,state",0,Canceled,Annulé,0
 selection,"purchase.purchase,state",0,Confirmed,Confirmé,0
 selection,"purchase.purchase,state",0,Done,Fait,0
 selection,"purchase.purchase,state",0,Draft,Brouillon,0
 selection,"purchase.purchase,state",0,Quotation,Devis,0
+selection,"stock.move,purchase_exception_state",0,,,0
+selection,"stock.move,purchase_exception_state",0,Ignored,Ignoré,0
+selection,"stock.move,purchase_exception_state",0,Recreated,Recréé,0
 view,product.product,0,Product Suppliers,Fournisseurs,0
 view,product.product,0,Suppliers,Fournisseurs,0
+view,product.template,0,Product Suppliers,Produit Fournisseur,0
+view,product.template,0,Suppliers,Fournisseurs,0
+view,purchase.handle.invoice.exception.ask,0,Choose invoices to recreate,Choisir les factures à recréer,0
+view,purchase.handle.invoice.exception.ask,0,Handle Invoice Exception,Gérer l'exception de facture,0
+view,purchase.handle.packing.exception.ask,0,Choose moves to recreate,Choisir les mouvements à recréer,0
+view,purchase.handle.packing.exception.ask,0,Handle packing Exception,Gérer l'exception d'expédition,0
+view,purchase.handle.packing.exception.ask,0,Recreated Moves,Mouvements recréés,0
+view,purchase.line,0,General,Général,0
+view,purchase.line,0,Notes,Notes,0
 view,purchase.line,0,Products,Produits,0
 view,purchase.line,0,Purchase Line,Ligne d'achat,0
 view,purchase.line,0,Purchase Lines,Lignes d'achat,0
@@ -157,12 +233,19 @@ view,purchase.product_supplier.price,0,Product Supplier Prices,Prix du fournisse
 view,purchase.purchase,0,Cancel,Annuler,0
 view,purchase.purchase,0,Confirm,Confirmer,0
 view,purchase.purchase,0,Draft,Brouillon,0
+view,purchase.purchase,0,Handle Invoice Exception,Gérer l'exception de facture,0
+view,purchase.purchase,0,Handle Shipment Exception,Gérer l'exception d'expédition,0
 view,purchase.purchase,0,Ignore Invoice Exception,Ignorer l'exception de facturation,0
-view,purchase.purchase,0,Ignore Packing Exception,Ignorer l'exception de colisage,0
+view,purchase.purchase,0,Ignore Shipment Exception,Ignorer l'exception d'expédition,0
 view,purchase.purchase,0,Invoices,Factures,0
 view,purchase.purchase,0,Lines,Lignes,0
+view,purchase.purchase,0,Moves,Mouvements,0
 view,purchase.purchase,0,Other Info,Autre informations,0
-view,purchase.purchase,0,Packings,Colisages,0
 view,purchase.purchase,0,Purchase,Achat,0
 view,purchase.purchase,0,Purchases,Achats,0
 view,purchase.purchase,0,Quotation,Devis,0
+view,purchase.purchase,0,Shipments,Expéditions,0
+wizard_button,"purchase.handle.invoice.exception,init,end",0,Cancel,Annuler,0
+wizard_button,"purchase.handle.invoice.exception,init,ok",0,Ok,Ok,0
+wizard_button,"purchase.handle.packing.exception,init,end",0,Cancel,Annuler,0
+wizard_button,"purchase.handle.packing.exception,init,ok",0,Ok,Ok,0
diff --git a/party.xml b/party.xml
new file mode 100644
index 0000000..4e214d9
--- /dev/null
+++ b/party.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0"?>
+<!-- This file is part of Tryton.  The COPYRIGHT file at the top level of
+this repository contains the full copyright notices and license terms. -->
+<tryton>
+    <data>
+        <record model="ir.action.act_window" id="act_purchase_form2">
+            <field name="name">Purchases</field>
+            <field name="res_model">purchase.purchase</field>
+            <field name="view_type">form</field>
+            <field name="domain">[("party", "=", active_id)]</field>
+        </record>
+        <record model="ir.action.keyword"
+                id="act_open_purchase_keyword1">
+            <field name="keyword">form_relate</field>
+            <field name="model">party.party,0</field>
+            <field name="action" ref="act_purchase_form2"/>
+        </record>
+
+    </data>
+</tryton>
diff --git a/purchase.odt b/purchase.odt
index e73a552..8dd2c86 100644
Binary files a/purchase.odt and b/purchase.odt differ
diff --git a/purchase.py b/purchase.py
index 693b734..7a52313 100644
--- a/purchase.py
+++ b/purchase.py
@@ -1,20 +1,20 @@
 #This file is part of Tryton.  The COPYRIGHT file at the top level
 #of this repository contains the full copyright notices and license terms.
 "Purchase"
-
-from trytond.osv import fields, OSV
-from decimal import Decimal
-import datetime
-from trytond.netsvc import LocalService
+from trytond.model import ModelWorkflow, ModelView, ModelSQL, fields
 from trytond.report import CompanyReport
 from trytond.wizard import Wizard
+from trytond.backend import TableHandler
+from decimal import Decimal
+import datetime
+import copy
 
 _STATES = {
     'readonly': "state != 'draft'",
 }
 
 
-class Purchase(OSV):
+class Purchase(ModelWorkflow, ModelSQL, ModelView):
     'Purchase'
     _name = 'purchase.purchase'
     _description = __doc__
@@ -22,15 +22,16 @@ class Purchase(OSV):
     company = fields.Many2One('company.company', 'Company', required=True,
             states={
                 'readonly': "state != 'draft' or bool(lines)",
-            })
+            }, domain="[('id', '=', context.get('company', 0))]")
     reference = fields.Char('Reference', size=None, readonly=True, select=1)
+    supplier_reference = fields.Char('Supplier Reference', select=1)
     description = fields.Char('Description', size=None, states=_STATES)
     state = fields.Selection([
         ('draft', 'Draft'),
         ('quotation', 'Quotation'),
         ('confirmed', 'Confirmed'),
         ('done', 'Done'),
-        ('cancel', 'Cancel'),
+        ('cancel', 'Canceled'),
     ], 'State', readonly=True, required=True)
     purchase_date = fields.Date('Purchase Date', required=True, states=_STATES)
     payment_term = fields.Many2One('account.invoice.payment_term',
@@ -62,7 +63,7 @@ class Purchase(OSV):
     invoice_method = fields.Selection([
         ('manual', 'Manual'),
         ('order', 'Based On Order'),
-        ('packing', 'Based On Packing'),
+        ('packing', 'Based On Shipment'),
     ], 'Invoice Method', required=True, states=_STATES)
     invoice_state = fields.Selection([
         ('none', 'None'),
@@ -70,11 +71,14 @@ class Purchase(OSV):
         ('paid', 'Paid'),
         ('exception', 'Exception'),
     ], 'Invoice State', readonly=True, required=True)
-    invoices = fields.Many2Many('account.invoice', 'purchase_invoices_rel',
+    invoices = fields.Many2Many('purchase.purchase-account.invoice',
             'purchase', 'invoice', 'Invoices', readonly=True)
-    invoices_ignored = fields.Many2Many('account.invoice',
-            'purchase_invoice_ignored_rel', 'purchase', 'invoice',
-            'Invoices Ignored', readonly=True)
+    invoices_ignored = fields.Many2Many(
+            'purchase.purchase-ignored-account.invoice',
+            'purchase', 'invoice', 'Ignored Invoices', readonly=True)
+    invoices_recreated = fields.Many2Many(
+            'purchase.purchase-recreated-account.invoice',
+            'purchase', 'invoice', 'Recreated Invoices', readonly=True)
     invoice_paid = fields.Function('get_function_fields', type='boolean',
             string='Invoices Paid')
     invoice_exception = fields.Function('get_function_fields', type='boolean',
@@ -84,39 +88,41 @@ class Purchase(OSV):
         ('waiting', 'Waiting'),
         ('received', 'Received'),
         ('exception', 'Exception'),
-    ], 'Packing State', readonly=True, required=True)
+    ], 'Shipment State', readonly=True, required=True)
     packings = fields.Function('get_function_fields', type='many2many',
-            relation='stock.packing.in', string='Packings')
+            relation='stock.packing.in', string='Shipments')
     moves = fields.Function('get_function_fields', type='many2many',
             relation='stock.move', string='Moves')
     packing_done = fields.Function('get_function_fields', type='boolean',
-            string='Packing Done')
+            string='Shipment Done')
     packing_exception = fields.Function('get_function_fields', type='boolean',
-            string='Packings Exception')
+            string='Shipments Exception')
 
     def __init__(self):
         super(Purchase, self).__init__()
+        self._order.insert(0, ('purchase_date', 'DESC'))
+        self._order.insert(1, ('id', 'DESC'))
         self._error_messages.update({
                 'invoice_addresse_required': 'Invoice addresses must be '
                 'defined for the quotation.',
+                'missing_account_payable': 'It misses ' \
+                        'an "Account Payable" on the party "%s"!',
             })
 
     def default_payment_term(self, cursor, user, context=None):
         payment_term_obj = self.pool.get('account.invoice.payment_term')
         payment_term_ids = payment_term_obj.search(cursor, user,
-                self.payment_term._domain, context=context)
+                self.payment_term.domain, context=context)
         if len(payment_term_ids) == 1:
-            return payment_term_obj.name_get(cursor, user, payment_term_ids,
-                    context=context)[0]
+            return payment_term_ids[0]
         return False
 
     def default_warehouse(self, cursor, user, context=None):
         location_obj = self.pool.get('stock.location')
         location_ids = location_obj.search(cursor, user,
-                self.warehouse._domain, context=context)
+                self.warehouse.domain, context=context)
         if len(location_ids) == 1:
-            return location_obj.name_get(cursor, user, location_ids,
-                    context=context)[0]
+            return location_ids[0]
         return False
 
     def default_company(self, cursor, user, context=None):
@@ -124,8 +130,7 @@ class Purchase(OSV):
         if context is None:
             context = {}
         if context.get('company'):
-            return company_obj.name_get(cursor, user, context['company'],
-                    context=context)[0]
+            return context['company']
         return False
 
     def default_state(self, cursor, user, context=None):
@@ -144,8 +149,7 @@ class Purchase(OSV):
         if context.get('company'):
             company = company_obj.browse(cursor, user, context['company'],
                     context=context)
-            return currency_obj.name_get(cursor, user, company.currency.id,
-                    context=context)[0]
+            return company.currency.id
         return False
 
     def default_currency_digits(self, cursor, user, context=None):
@@ -185,14 +189,14 @@ class Purchase(OSV):
                 res['payment_term'] = party.supplier_payment_term.id
 
         if res['invoice_address']:
-            res['invoice_address'] = address_obj.name_get(cursor, user,
-                    res['invoice_address'], context=context)[0]
-        if res['payment_term']:
-            res['payment_term'] = payment_term_obj.name_get(cursor, user,
-                    res['payment_term'], context=context)[0]
-        else:
+            res['invoice_address.rec_name'] = address_obj.browse(cursor, user,
+                    res['invoice_address'], context=context).rec_name
+        if not res['payment_term']:
             res['payment_term'] = self.default_payment_term(cursor, user,
                     context=context)
+        if res['payment_term']:
+            res['payment_term.rec_name'] = payment_term_obj.browse(cursor, user,
+                    res['payment_term'], context=context).rec_name
         return res
 
     def on_change_with_currency_digits(self, cursor, user, ids, vals,
@@ -443,7 +447,8 @@ class Purchase(OSV):
         res = {}
         for purchase in purchases:
             val = True
-            ignored_ids = [x.id for x in purchase.invoices_ignored]
+            ignored_ids = set(x.id for x in purchase.invoices_ignored + \
+                                  purchase.invoices_recreated)
             for invoice in purchase.invoices:
                 if invoice.state != 'paid' \
                         and invoice.id not in ignored_ids:
@@ -466,10 +471,11 @@ class Purchase(OSV):
         res = {}
         for purchase in purchases:
             val = False
-            ignored_ids = [x.id for x in purchase.invoices_ignored]
+            skip_ids = set(x.id for x in purchase.invoices_ignored)
+            skip_ids.update(x.id for x in purchase.invoices_recreated)
             for invoice in purchase.invoices:
                 if invoice.state == 'cancel' \
-                        and invoice.id not in ignored_ids:
+                        and invoice.id not in skip_ids:
                     val = True
                     break
             res[purchase.id] = val
@@ -556,32 +562,31 @@ class Purchase(OSV):
             res[purchase.id] = val
         return res
 
-    def name_get(self, cursor, user, ids, context=None):
+    def get_rec_name(self, cursor, user, ids, name, arg, context=None):
         if not ids:
-            return []
-        if isinstance(ids, (int, long)):
-            ids = [ids]
-        res = []
+            return {}
+        res = {}
         for purchase in self.browse(cursor, user, ids, context=context):
-            res.append((purchase.id, purchase.reference or str(purchase.id) \
-                    + ' ' + purchase.party.name))
+            res[purchase.id] = purchase.reference or str(purchase.id) \
+                    + ' - ' + purchase.party.name
         return res
 
-    def name_search(self, cursor, user, name='', args=None, operator='ilike',
-            context=None, limit=None):
-        if args is None:
-            args = []
-        if name:
-            ids = self.search(cursor, user,
-                    [('reference', operator, name)] + args, limit=limit,
-                    context=context)
-        if not ids:
-            ids = self.search(cursor, user, [('party', operator, name)] + args,
-                    limit=limit, context=context)
-        res = self.name_get(cursor, user, ids, context=context)
-        return res
+    def search_rec_name(self, cursor, user, name, args, context=None):
+        args2 = []
+        i = 0
+        while i < len(args):
+            names = args[i][2].split(' - ', 1)
+            ids = self.search(cursor, user, ['OR',
+                ('reference', args[i][1], names[0]),
+                ('supplier_reference', args[i][1], names[0]),
+                ], context=context)
+            args2.append(('id', 'in', ids))
+            if len(names) != 1 and names[1]:
+                args2.append(('party', args[i][1], names[1]))
+            i += 1
+        return args2
 
-    def copy(self, cursor, user, purchase_id, default=None, context=None):
+    def copy(self, cursor, user, ids, default=None, context=None):
         if default is None:
             default = {}
         default = default.copy()
@@ -591,8 +596,8 @@ class Purchase(OSV):
         default['invoices'] = False
         default['invoices_ignored'] = False
         default['packing_state'] = 'none'
-        return super(Purchase, self).copy(cursor, user, purchase_id,
-                default=default, context=context)
+        return super(Purchase, self).copy(cursor, user, ids, default=default,
+                context=context)
 
     def check_for_quotation(self, cursor, user, purchase_id, context=None):
         purchase = self.browse(cursor, user, purchase_id, context=context)
@@ -608,7 +613,8 @@ class Purchase(OSV):
         if purchase.reference:
             return True
 
-        reference = sequence_obj.get(cursor, user, 'purchase.purchase')
+        reference = sequence_obj.get(cursor, user, 'purchase.purchase',
+                context=context)
         self.write(cursor, user, purchase_id, {
             'reference': reference,
             }, context=context)
@@ -644,6 +650,15 @@ class Purchase(OSV):
         return res
 
     def create_invoice(self, cursor, user, purchase_id, context=None):
+        '''
+        Create invoice for the purchase id
+
+        :param cursor: the database cursor
+        :param user: the user id
+        :param purchase_id: the id of the purchase
+        :param context: the context
+        :return: the id of the invoice or None
+        '''
         invoice_obj = self.pool.get('account.invoice')
         journal_obj = self.pool.get('account.journal')
         invoice_line_obj = self.pool.get('account.invoice.line')
@@ -654,6 +669,10 @@ class Purchase(OSV):
 
         purchase = self.browse(cursor, user, purchase_id, context=context)
 
+        if not purchase.party.account_payable:
+            self.raise_user_error(cursor, 'missing_account_payable',
+                    error_args=(purchase.party.rec_name,), context=context)
+
         invoice_lines = self._get_invoice_line_purchase_line(cursor, user,
                 purchase, context=context)
         if not invoice_lines:
@@ -695,17 +714,6 @@ class Purchase(OSV):
         }, context=context)
         return invoice_id
 
-    def ignore_invoice_exception(self, cursor, user, purchase_id, context=None):
-        purchase = self.browse(cursor, user, purchase_id, context=context)
-        invoice_ids = []
-        for invoice in purchase.invoices:
-            if invoice.state == 'cancel':
-                invoice_ids.append(invoice.id)
-        if invoice_ids:
-            self.write(cursor, user, purchase_id, {
-                'invoices_ignored': [('add', x) for x in invoice_ids],
-            }, context=context)
-
     def create_move(self, cursor, user, purchase_id, context=None):
         '''
         Create move for each purchase lines
@@ -716,17 +724,49 @@ class Purchase(OSV):
         for line in purchase.lines:
             line_obj.create_move(cursor, user, line, context=context)
 
-    def ignore_packing_exception(self, cursor, user, purchase_id, context=None):
-        line_obj = self.pool.get('purchase.line')
+Purchase()
 
-        purchase = self.browse(cursor, user, purchase_id, context=context)
-        for line in purchase.lines:
-            line_obj.ignore_move_exception(cursor, user, line, context=context)
 
-Purchase()
+class PurchaseInvoice(ModelSQL):
+    'Purchase - Invoice'
+    _name = 'purchase.purchase-account.invoice'
+    _table = 'purchase_invoices_rel'
+    _description = __doc__
+    purchase = fields.Many2One('purchase.purchase', 'Purchase',
+            ondelete='CASCADE', select=1, required=True)
+    invoice = fields.Many2One('account.invoice', 'Invoice',
+            ondelete='RESTRICT', select=1, required=True)
+
+PurchaseInvoice()
+
+
+class PuchaseIgnoredInvoice(ModelSQL):
+    'Purchase - Ignored Invoice'
+    _name = 'purchase.purchase-ignored-account.invoice'
+    _table = 'purchase_invoice_ignored_rel'
+    _description = __doc__
+    purchase = fields.Many2One('purchase.purchase', 'Purchase',
+            ondelete='CASCADE', select=1, required=True)
+    invoice = fields.Many2One('account.invoice', 'Invoice',
+            ondelete='RESTRICT', select=1, required=True)
+
+PuchaseIgnoredInvoice()
+
+
+class PurchaseRecreadtedInvoice(ModelSQL):
+    'Purchase - Recreated Invoice'
+    _name = 'purchase.purchase-recreated-account.invoice'
+    _table = 'purchase_invoice_recreated_rel'
+    _description = __doc__
+    purchase = fields.Many2One('purchase.purchase', 'Purchase',
+            ondelete='CASCADE', select=1, required=True)
+    invoice = fields.Many2One('account.invoice', 'Invoice',
+            ondelete='RESTRICT', select=1, required=True)
+
+PurchaseRecreadtedInvoice()
 
 
-class PurchaseLine(OSV):
+class PurchaseLine(ModelSQL, ModelView):
     'Purchase Line'
     _name = 'purchase.line'
     _rec_name = 'description'
@@ -739,18 +779,21 @@ class PurchaseLine(OSV):
         ('line', 'Line'),
         ('subtotal', 'Subtotal'),
         ('title', 'Title'),
+        ('comment', 'Comment'),
         ], 'Type', select=1, required=True)
     quantity = fields.Float('Quantity',
             digits="(16, unit_digits)",
             states={
                 'invisible': "type != 'line'",
                 'required': "type == 'line'",
+                'readonly': "not globals().get('_parent_purchase')",
             }, on_change=['product', 'quantity', 'unit',
                 '_parent_purchase.currency', '_parent_purchase.party'])
     unit = fields.Many2One('product.uom', 'Unit',
             states={
                 'required': "product",
                 'invisible': "type != 'line'",
+                'readonly': "not globals().get('_parent_purchase')",
             }, domain="[('category', '=', " \
                     "(product, 'product.default_uom.category'))]",
             context="{'category': (product, 'product.default_uom.category')}",
@@ -762,11 +805,15 @@ class PurchaseLine(OSV):
             domain=[('purchasable', '=', True)],
             states={
                 'invisible': "type != 'line'",
+                'readonly': "not globals().get('_parent_purchase')",
             }, on_change=['product', 'unit', 'quantity', 'description',
                 '_parent_purchase.party', '_parent_purchase.currency'],
-            context="{'locations': [_parent_purchase.warehouse], " \
+            context="{'locations': " \
+                        "_parent_purchase.warehouse and " \
+                        "[_parent_purchase.warehouse] or False, " \
                     "'stock_date_end': _parent_purchase.purchase_date, " \
-                    "'purchasable': True}")
+                    "'purchasable': True, " \
+                    "'stock_skip_warehouse': True}")
     unit_price = fields.Numeric('Unit Price', digits=(16, 4),
             states={
                 'invisible': "type != 'line'",
@@ -776,25 +823,24 @@ class PurchaseLine(OSV):
             digits="(16, _parent_purchase.currency_digits)",
             states={
                 'invisible': "type not in ('line', 'subtotal')",
+                'readonly': "not globals().get('_parent_purchase')",
             }, on_change_with=['type', 'quantity', 'unit_price',
                 '_parent_purchase.currency'])
-    description = fields.Char('Description', size=None, required=True)
-    comment = fields.Text('Comment',
-            states={
-                'invisible': "type != 'line'",
-            })
-    taxes = fields.Many2Many('account.tax', 'purchase_line_account_tax',
+    description = fields.Text('Description', size=None, required=True)
+    note = fields.Text('Note')
+    taxes = fields.Many2Many('purchase.line-account.tax',
             'line', 'tax', 'Taxes', domain=[('parent', '=', False)],
             states={
                 'invisible': "type != 'line'",
             })
-    invoice_lines = fields.Many2Many('account.invoice.line',
-            'purchase_line_invoice_lines_rel', 'purchase_line', 'invoice_line',
-            'Invoice Lines', readonly=True)
+    invoice_lines = fields.Many2Many('purchase.line-account.invoice.line',
+            'purchase_line', 'invoice_line', 'Invoice Lines', readonly=True)
     moves = fields.One2Many('stock.move', 'purchase_line', 'Moves',
             readonly=True, select=1)
-    moves_ignored = fields.Many2Many('stock.move', 'purchase_line_moves_ignored_rel',
-            'purchase_line', 'move', 'Moves Ignored', readonly=True)
+    moves_ignored = fields.Many2Many('purchase.line-ignored-stock.move',
+            'purchase_line', 'move', 'Ignored Moves', readonly=True)
+    moves_recreated = fields.Many2Many('purchase.line-recreated-stock.move',
+            'purchase_line', 'move', 'Recreated Moves', readonly=True)
     move_done = fields.Function('get_move_done', type='boolean',
             string='Moves Done')
     move_exception = fields.Function('get_move_exception', type='boolean',
@@ -805,10 +851,22 @@ class PurchaseLine(OSV):
         self._order.insert(0, ('sequence', 'ASC'))
         self._error_messages.update({
             'supplier_location_required': 'The supplier location is required!',
-            'missing_account_expense': 'It miss ' \
-                    'an "account_expense" default property!',
+            'missing_account_expense': 'It misses ' \
+                    'an "Account Expense" on product "%s"!',
+            'missing_account_expense_property': 'It misses ' \
+                    'an "account expense" default property!',
             })
 
+    def init(self, cursor, module_name):
+        super(PurchaseLine, self).init(cursor, module_name)
+        table = TableHandler(cursor, self, module_name)
+
+        # Migration from 1.0 comment change into note
+        if table.column_exist('comment'):
+            cursor.execute('UPDATE "' + self._table + '" ' \
+                    'SET note = comment')
+            table.drop_column('comment', exception=True)
+
     def default_type(self, cursor, user, context=None):
         return 'line'
 
@@ -829,11 +887,12 @@ class PurchaseLine(OSV):
             if line.product.type == 'service':
                 res[line.id] = True
                 continue
-            ignored_ids = [x.id for x in line.moves_ignored]
+            skip_ids = set(x.id for x in line.moves_recreated + \
+                                line.moves_ignored)
             quantity = line.quantity
             for move in line.moves:
                 if move.state != 'done' \
-                        and move.id not in ignored_ids:
+                        and move.id not in skip_ids:
                     val = False
                     break
                 quantity -= uom_obj.compute_qty(cursor, user, move.uom,
@@ -848,10 +907,11 @@ class PurchaseLine(OSV):
         res = {}
         for line in self.browse(cursor, user, ids, context=context):
             val = False
-            ignored_ids = [x.id for x in line.moves_ignored]
+            skip_ids = set(x.id for x in line.moves_ignored + \
+                               line.moves_recreated)
             for move in line.moves:
                 if move.state == 'cancel' \
-                        and move.id not in ignored_ids:
+                        and move.id not in skip_ids:
                     val = True
                     break
             res[line.id] = val
@@ -875,10 +935,26 @@ class PurchaseLine(OSV):
                 res[line.id] = 2
         return res
 
+    def _get_tax_rule_pattern(self, cursor, user, party, vals, context=None):
+        '''
+        Get tax rule pattern
+
+        :param cursor: the database cursor
+        :param user: the user id
+        :param party: the BrowseRecord of the party
+        :param vals: a dictionary with value from on_change
+        :param context: the context
+        :return: a dictionary to use as pattern for tax rule
+        '''
+        res = {}
+        return res
+
     def on_change_product(self, cursor, user, ids, vals, context=None):
         party_obj = self.pool.get('party.party')
         product_obj = self.pool.get('product.product')
         uom_obj = self.pool.get('product.uom')
+        tax_rule_obj = self.pool.get('account.tax.rule')
+
         if context is None:
             context = {}
         if not vals.get('product'):
@@ -908,25 +984,40 @@ class PurchaseLine(OSV):
         res['unit_price'] = product_obj.get_purchase_price(cursor, user,
                 [product.id], vals.get('quantity', 0), context=ctx2)[product.id]
         res['taxes'] = []
+        pattern = self._get_tax_rule_pattern(cursor, user, party, vals,
+                context=context)
         for tax in product.supplier_taxes_used:
-            if party:
-                if 'supplier_' + tax.group.code in party_obj._columns \
-                        and party['supplier_' + tax.group.code]:
-                    res['taxes'].append(
-                            party['supplier_' + tax.group.code].id)
-                    continue
+            if party and party.supplier_tax_rule:
+                tax_ids = tax_rule_obj.apply(cursor, user,
+                        party.supplier_tax_rule, tax, pattern,
+                        context=context)
+                if tax_ids:
+                    res['taxes'].extend(tax_ids)
+                continue
             res['taxes'].append(tax.id)
+        if party and party.supplier_tax_rule:
+            tax_ids = tax_rule_obj.apply(cursor, user,
+                    party.supplier_tax_rule, False, pattern,
+                    context=context)
+            if tax_ids:
+                res['taxes'].extend(tax_ids)
 
         if not vals.get('description'):
-            res['description'] = product_obj.name_get(cursor, user, product.id,
-                    context=ctx)[0][1]
+            res['description'] = product_obj.browse(cursor, user, product.id,
+                    context=ctx).rec_name
 
         category = product.purchase_uom.category
         if not vals.get('unit') \
                 or vals.get('unit') not in [x.id for x in category.uoms]:
-            res['unit'] = uom_obj.name_get(cursor, user, product.purchase_uom.id,
-                    context=context)[0]
+            res['unit'] = product.purchase_uom.id
+            res['unit.rec_name'] = product.purchase_uom.rec_name
             res['unit_digits'] = product.purchase_uom.digits
+
+        vals = vals.copy()
+        vals['unit_price'] = res['unit_price']
+        vals['type'] = 'line'
+        res['amount'] = self.on_change_with_amount(cursor, user, ids,
+                vals, context=context)
         return res
 
     def on_change_quantity(self, cursor, user, ids, vals, context=None):
@@ -1011,21 +1102,32 @@ class PurchaseLine(OSV):
         res['sequence'] = line.sequence
         res['type'] = line.type
         res['description'] = line.description
+        res['note'] = line.note
         if line.type != 'line':
             return [res]
         if line.purchase.invoice_method == 'order':
-            res['quantity'] = line.quantity
+            quantity = line.quantity
         else:
             quantity = 0.0
             for move in line.moves:
                 if move.state == 'done':
                     quantity += uom_obj.compute_qty(cursor, user, move.uom,
                             move.quantity, line.unit, context=context)
-            for invoice_line in line.invoice_lines:
-                quantity -= uom_obj.compute_qty(cursor, user,
-                        invoice_line.unit, invoice_line.quantity, line.unit,
-                        context=context)
-            res['quantity'] = quantity
+
+        if line.purchase.invoices_ignored:
+            ignored_ids = set(
+                l.id for i in line.purchase.invoices_ignored for l in i.lines)
+        else:
+            ignored_ids = ()
+        for invoice_line in line.invoice_lines:
+            if invoice_line.invoice.state != 'cancel' or \
+                    invoice_line.id in ignored_ids:
+                quantity -= uom_obj.compute_qty(
+                    cursor, user, invoice_line.unit, invoice_line.quantity,
+                    line.unit, context=context)
+        res['quantity'] = quantity
+
+
         if res['quantity'] <= 0.0:
             return None
         res['unit'] = line.unit.id
@@ -1034,6 +1136,9 @@ class PurchaseLine(OSV):
         res['taxes'] = [('set', [x.id for x in line.taxes])]
         if line.product:
             res['account'] = line.product.account_expense_used.id
+            if not res['account']:
+                self.raise_user_error(cursor, 'missing_account_expense',
+                        error_args=(line.product.rec_name,), context=context)
         else:
             for model in ('product.template', 'product.category'):
                 res['account'] = property_obj.get(cursor, user,
@@ -1041,18 +1146,19 @@ class PurchaseLine(OSV):
                 if res['account']:
                     break
             if not res['account']:
-                self.raise_user_error(cursor, 'missing_account_expense',
-                        context=context)
+                self.raise_user_error(cursor,
+                        'missing_account_expense_property', context=context)
         return [res]
 
-    def copy(self, cursor, user, line_id, default=None, context=None):
+    def copy(self, cursor, user, ids, default=None, context=None):
         if default is None:
             default = {}
         default = default.copy()
         default['moves'] = False
         default['moves_ignored'] = False
+        default['moves_recreated'] = False
         default['invoice_lines'] = False
-        return super(PurchaseLine, self).copy(cursor, user, line_id,
+        return super(PurchaseLine, self).copy(cursor, user, ids,
                 default=default, context=context)
 
     def create_move(self, cursor, user, line, context=None):
@@ -1073,10 +1179,12 @@ class PurchaseLine(OSV):
             return
         if line.product.type == 'service':
             return
+        skip_ids = set(x.id for x in line.moves_recreated)
         quantity = line.quantity
         for move in line.moves:
-            quantity -= uom_obj.compute_qty(cursor, user, move.uom,
-                    move.quantity, line.unit, context=context)
+            if move.id not in skip_ids:
+                quantity -= uom_obj.compute_qty(cursor, user, move.uom,
+                        move.quantity, line.unit, context=context)
         if quantity <= 0.0:
             return
         if not line.purchase.party.supplier_location:
@@ -1111,26 +1219,69 @@ class PurchaseLine(OSV):
         }, context=context)
         return move_id
 
-    def ignore_move_exception(self, cursor, user, line, context=None):
-        move_ids = []
-        for move in line.moves:
-            if move.state == 'cancel':
-                move_ids.append(move.id)
-        if move_ids:
-            self.write(cursor, user, line.id, {
-                'moves_ignored': [('add', x) for x in move_ids],
-            }, context=context)
-
 PurchaseLine()
 
 
+class PurchaseLineTax(ModelSQL):
+    'Purchase Line - Tax'
+    _name = 'purchase.line-account.tax'
+    _table = 'purchase_line_account_tax'
+    _description = __doc__
+    line = fields.Many2One('purchase.line', 'Purchase Line',
+            ondelete='CASCADE', select=1, required=True,
+            domain=[('type', '=', 'line')])
+    tax = fields.Many2One('account.tax', 'Tax', ondelete='RESTRICT',
+            select=1, required=True, domain=[('parent', '=', False)])
+
+PurchaseLineTax()
+
+
+class PurchaseLineInvoiceLine(ModelSQL):
+    'Purchase Line - Invoice Line'
+    _name = 'purchase.line-account.invoice.line'
+    _table = 'purchase_line_invoice_lines_rel'
+    _description = __doc__
+    purchase_line = fields.Many2One('purchase.line', 'Purchase Line',
+            ondelete='CASCADE', select=1, required=True)
+    invoice_line = fields.Many2One('account.invoice.line', 'Invoice Line',
+            ondelete='RESTRICT', select=1, required=True)
+
+PurchaseLineInvoiceLine()
+
+
+class PurchaseLineIgnoredMove(ModelSQL):
+    'Purchase Line - Ignored Move'
+    _name = 'purchase.line-ignored-stock.move'
+    _table = 'purchase_line_moves_ignored_rel'
+    _description = __doc__
+    purchase_line = fields.Many2One('purchase.line', 'Purchase Line',
+            ondelete='CASCADE', select=1, required=True)
+    move = fields.Many2One('stock.move', 'Move', ondelete='RESTRICT',
+            select=1, required=True)
+
+PurchaseLineIgnoredMove()
+
+
+class PurchaseLineRecreatedMove(ModelSQL):
+    'Purchase Line - Ignored Move'
+    _name = 'purchase.line-recreated-stock.move'
+    _table = 'purchase_line_moves_recreated_rel'
+    _description = __doc__
+    purchase_line = fields.Many2One('purchase.line', 'Purchase Line',
+            ondelete='CASCADE', select=1, required=True)
+    move = fields.Many2One('stock.move', 'Move', ondelete='RESTRICT',
+            select=1, required=True)
+
+PurchaseLineRecreatedMove()
+
+
 class PurchaseReport(CompanyReport):
     _name = 'purchase.purchase'
 
 PurchaseReport()
 
 
-class Template(OSV):
+class Template(ModelSQL, ModelView):
     _name = "product.template"
 
     purchasable = fields.Boolean('Purchasable', states={
@@ -1139,7 +1290,7 @@ class Template(OSV):
     product_suppliers = fields.One2Many('purchase.product_supplier',
             'product', 'Suppliers', states={
                 'readonly': "active == False",
-                'invisible': "not purchasable",
+                'invisible': "(not purchasable) or (not company)",
             })
     purchase_uom = fields.Many2One('product.uom', 'Purchase UOM', states={
         'readonly': "active == False",
@@ -1150,6 +1301,14 @@ class Template(OSV):
         context="{'category': (default_uom, 'uom.category')}",
         on_change_with=['default_uom', 'purchase_uom'])
 
+    def __init__(self):
+        super(Template, self).__init__()
+        self._error_messages.update({
+                'change_purchase_uom': 'Purchase prices are based on the purchase uom, '\
+                    'are you sure to change it?',
+            })
+
+
     def default_purchasable(self, cursor, user, context=None):
         if context is None:
             context = {}
@@ -1174,14 +1333,29 @@ class Template(OSV):
                     res = default_uom.id
             else:
                 res = default_uom.id
-        if res:
-            res = uom_obj.name_get(cursor, user, res, context=context)[0]
         return res
 
+    def write(self, cursor, user, ids, vals, context=None):
+        if vals.get("purchase_uom"):
+            templates = self.browse(cursor, user, ids, context=context)
+            for template in templates:
+                if not template.purchase_uom:
+                    continue
+                if template.purchase_uom.id == vals["purchase_uom"]:
+                    continue
+                for product in template.products:
+                    if not product.product_suppliers:
+                        continue
+                    self.raise_user_warning(
+                        cursor, user, '%s at product_template' % template.id,
+                        'change_purchase_uom')
+
+        super(Template, self).write(cursor, user, ids, vals, context=context)
+
 Template()
 
 
-class Product(OSV):
+class Product(ModelSQL, ModelView):
     _name = 'product.product'
 
     def on_change_with_purchase_uom(self, cursor, user, ids, vals, context=None):
@@ -1226,18 +1400,22 @@ class Product(OSV):
 
         for product in self.browse(cursor, user, ids, context=context):
             res[product.id] = product.cost_price
+            default_uom = product.default_uom
+            if not uom:
+                uom = default_uom
             if context.get('supplier') and product.product_suppliers:
                 supplier_id = context['supplier']
                 for product_supplier in product.product_suppliers:
                     if product_supplier.party.id == supplier_id:
                         for price in product_supplier.prices:
-                            if price.quantity <= quantity:
+                            if uom_obj.compute_qty(cursor, user,
+                                    product.purchase_uom, price.quantity, uom,
+                                    context=context) <= quantity:
                                 res[product.id] = price.unit_price
+                                default_uom = product.purchase_uom
                         break
-            if uom:
-                res[product.id] = uom_obj.compute_price(cursor,
-                        user, product.default_uom, res[product.id],
-                        uom, context=context)
+            res[product.id] = uom_obj.compute_price(cursor, user,
+                    default_uom, res[product.id], uom, context=context)
             if currency and user2.company:
                 if user2.company.currency.id != currency.id:
                     res[product.id] = currency_obj.compute(cursor, user,
@@ -1248,7 +1426,7 @@ class Product(OSV):
 Product()
 
 
-class ProductSupplier(OSV):
+class ProductSupplier(ModelSQL, ModelView):
     'Product Supplier'
     _name = 'purchase.product_supplier'
     _description = __doc__
@@ -1263,7 +1441,8 @@ class ProductSupplier(OSV):
     prices = fields.One2Many('purchase.product_supplier.price',
             'product_supplier', 'Prices')
     company = fields.Many2One('company.company', 'Company', required=True,
-            ondelete='CASCADE', select=1)
+            ondelete='CASCADE', select=1,
+            domain="[('id', '=', context.get('company', 0))]")
     delivery_time = fields.Integer('Delivery Time',
             help="In number of days")
 
@@ -1276,8 +1455,7 @@ class ProductSupplier(OSV):
         if context is None:
             context = {}
         if context.get('company'):
-            return company_obj.name_get(cursor, user, context['company'],
-                    context=context)[0]
+            return context['company']
         return False
 
     def compute_supply_date(self, cursor, user, product_supplier, date=None,
@@ -1322,9 +1500,10 @@ class ProductSupplier(OSV):
 ProductSupplier()
 
 
-class ProductSupplierPrice(OSV):
+class ProductSupplierPrice(ModelSQL, ModelView):
     'Product Supplier Price'
     _name = 'purchase.product_supplier.price'
+    _description = __doc__
 
     product_supplier = fields.Many2One('purchase.product_supplier',
             'Supplier', required=True, ondelete='CASCADE')
@@ -1344,24 +1523,31 @@ class ProductSupplierPrice(OSV):
         if context.get('company'):
             company = company_obj.browse(cursor, user, context['company'],
                     context=context)
-            return currency_obj.name_get(cursor, user, company.currency.id,
-                    context=context)[0]
+            return company.currency.id
         return False
 
 ProductSupplierPrice()
 
 
-class PackingIn(OSV):
+class PackingIn(ModelSQL, ModelView):
     _name = 'stock.packing.in'
 
     def __init__(self):
         super(PackingIn, self).__init__()
-        self.incoming_moves.add_remove = "[" + \
-                self.incoming_moves.add_remove + ", " \
-                "('supplier', '=', supplier)]"
+        self.incoming_moves = copy.copy(self.incoming_moves)
+        if "('supplier', '=', supplier)" not in self.incoming_moves.add_remove:
+            self.incoming_moves.add_remove = "[" + \
+                    self.incoming_moves.add_remove + ", " \
+                    "('supplier', '=', supplier)]"
+        self._reset_columns()
+
+        self._error_messages.update({
+                'reset_move': 'You cannot reset to draft a move generated '\
+                    'by a purchase.',
+            })
 
     def write(self, cursor, user, ids, vals, context=None):
-        workflow_service = LocalService('workflow')
+        purchase_obj = self.pool.get('purchase.purchase')
         purchase_line_obj = self.pool.get('purchase.line')
 
         res = super(PackingIn, self).write(cursor, user, ids, vals,
@@ -1384,15 +1570,23 @@ class PackingIn(OSV):
                     if purchase_line.purchase.id not in purchase_ids:
                         purchase_ids.append(purchase_line.purchase.id)
 
-            for purchase_id in purchase_ids:
-                workflow_service.trg_validate(user, 'purchase.purchase',
-                        purchase_id, 'packing_update', cursor, context=context)
+            purchase_obj.workflow_trigger_validate(cursor, user, purchase_ids,
+                    'packing_update', context=context)
         return res
 
+    def button_draft(self, cursor, user, ids, context=None):
+        for packing in self.browse(cursor, user, ids, context=context):
+            for move in packing.incoming_moves:
+                if move.state == 'cancel' and move.purchase_line:
+                    self.raise_user_error(cursor, 'reset_move')
+
+        return super(PackingIn, self).button_draft(
+            cursor, user, ids, context=context)
+
 PackingIn()
 
 
-class Move(OSV):
+class Move(ModelSQL, ModelView):
     _name = 'stock.move'
 
     purchase_line = fields.Many2One('purchase.line', select=1,
@@ -1433,25 +1627,31 @@ class Move(OSV):
             relation='party.party', string='Supplier',
             fnct_search='search_supplier', select=1)
 
-    def get_purchase(self, cursor, user, ids, name, arg, context=None):
-        purchase_obj = self.pool.get('purchase.purchase')
+    purchase_exception_state = fields.Function('get_purchase_exception_state',
+            type='selection',
+            selection=[('', ''),
+                       ('ignored', 'Ignored'),
+                       ('recreated', 'Recreated')],
+            string='Exception State')
 
+    def get_purchase(self, cursor, user, ids, name, arg, context=None):
         res = {}
         for move in self.browse(cursor, user, ids, context=context):
             res[move.id] = False
             if move.purchase_line:
                 res[move.id] = move.purchase_line.purchase.id
+        return res
 
-        purchase_names = {}
-        for purchase_id, purchase_name in purchase_obj.name_get(cursor,
-                user, [x for x in res.values() if x], context=context):
-            purchase_names[purchase_id] = purchase_name
-
-        for i in res.keys():
-            if res[i] and res[i] in purchase_names:
-                res[i] = (res[i], purchase_names[res[i]])
-            else:
-                res[i] = False
+    def get_purchase_exception_state(self, cursor, user, ids, name, arg,
+                                     context=None):
+        res = {}.fromkeys(ids, '')
+        for move in self.browse(cursor, user, ids, context=context):
+            if not move.purchase_line:
+                continue
+            if move.id in (x.id for x in move.purchase_line.moves_recreated):
+                res[move.id] = 'recreated'
+            if move.id in (x.id for x in move.purchase_line.moves_ignored):
+                res[move.id] = 'ignored'
         return res
 
     def search_purchase(self, cursor, user, name, args, context=None):
@@ -1464,9 +1664,6 @@ class Move(OSV):
         return args2
 
     def get_purchase_fields(self, cursor, user, ids, names, arg, context=None):
-        uom_obj = self.pool.get('product.uom')
-        currency_obj = self.pool.get('currency.currency')
-
         res = {}
         for name in names:
             res[name] = {}
@@ -1488,56 +1685,14 @@ class Move(OSV):
                         res[name][move.id] = move.purchase_line[name[9:]]
                     else:
                         res[name][move.id] = move.purchase_line[name[9:]].id
-
-        if 'purchase_unit' in res.keys():
-            unit_names = {}
-            for unit_id, unit_name in uom_obj.name_get(cursor, user,
-                    list(set([x for x in res['purchase_unit'].values() if x])),
-                    context=context):
-                unit_names[unit_id] = (unit_id, unit_name)
-            for i in res['purchase_unit'].keys():
-                if res['purchase_unit'][i] and \
-                        res['purchase_unit'][i] in unit_names:
-                    res['purchase_unit'][i] = unit_names[
-                            res['purchase_unit'][i]]
-                else:
-                    res['purchase_unit'][i] = False
-
-        if 'purchase_currency' in res.keys():
-            currency_names = {}
-            for currency_id, currency_name in currency_obj.name_get(cursor,
-                    user,
-                    list(set([x for x in res['purchase_currency'].values() if x])),
-                    context=context):
-                currency_names[currency_id] = (currency_id, currency_name)
-            for i in res['purchase_currency'].keys():
-                if res['purchase_currency'][i] and \
-                        res['purchase_currency'][i] in currency_names:
-                    res['purchase_currency'][i] = currency_names[
-                            res['purchase_currency'][i]]
-                else:
-                    res['purchase_currency'][i] = False
         return res
 
     def get_supplier(self, cursor, user, ids, name, arg, context=None):
-        party_obj = self.pool.get('party.party')
-
         res = {}
         for move in self.browse(cursor, user, ids, context=context):
             res[move.id] = False
             if move.purchase_line:
                 res[move.id] = move.purchase_line.purchase.party.id
-
-        party_names = {}
-        for party_id, party_name in party_obj.name_get(cursor, user,
-                [x for x in res.values() if x], context=context):
-            party_names[party_id] = party_name
-
-        for i in res.keys():
-            if res[i] and res[i] in party_names:
-                res[i] = (res[i], party_names[res[i]])
-            else:
-                res[i] = False
         return res
 
     def search_supplier(self, cursor, user, name, args, context=None):
@@ -1550,29 +1705,120 @@ class Move(OSV):
         return args2
 
     def write(self, cursor, user, ids, vals, context=None):
-        workflow_service = LocalService('workflow')
+        purchase_obj = self.pool.get('purchase.purchase')
         purchase_line_obj = self.pool.get('purchase.line')
 
         res = super(Move, self).write(cursor, user, ids, vals,
                 context=context)
         if 'state' in vals and vals['state'] in ('cancel',):
-            purchase_ids = []
+            if isinstance(ids, (int, long)):
+                ids = [ids]
+            purchase_ids = set()
             purchase_line_ids = purchase_line_obj.search(cursor, user, [
                 ('moves', 'in', ids),
                 ], context=context)
             if purchase_line_ids:
                 for purchase_line in purchase_line_obj.browse(cursor, user,
                         purchase_line_ids, context=context):
-                    if purchase_line.purchase.id not in purchase_ids:
-                        purchase_ids.append(purchase_line.purchase.id)
-            for purchase_id in purchase_ids:
-                workflow_service.trg_validate(user, 'purchase.purchase',
-                        purchase_id, 'packing_update', cursor, context=context)
+                    purchase_ids.add(purchase_line.purchase.id)
+            if purchase_ids:
+                purchase_obj.workflow_trigger_validate(cursor, user,
+                        list(purchase_ids), 'packing_update', context=context)
         return res
 
+    def delete(self, cursor, user, ids, context=None):
+        purchase_obj = self.pool.get('purchase.purchase')
+        purchase_line_obj = self.pool.get('purchase.line')
+
+        if isinstance(ids, (int, long)):
+            ids = [ids]
+
+        purchase_ids = set()
+        purchase_line_ids = purchase_line_obj.search(cursor, user, [
+            ('moves', 'in', ids),
+            ], context=context)
+
+        res = super(Move, self).delete(cursor, user, ids, context=context)
+
+        if purchase_line_ids:
+            for purchase_line in purchase_line_obj.browse(cursor, user,
+                    purchase_line_ids, context=context):
+                purchase_ids.add(purchase_line.purchase.id)
+            if purchase_ids:
+                purchase_obj.workflow_trigger_validate(cursor, user,
+                        list(purchase_ids), 'packing_update', context=context)
+        return res
 Move()
 
 
+class Invoice(ModelSQL, ModelView):
+    _name = 'account.invoice'
+
+    purchase_exception_state = fields.Function('get_purchase_exception_state',
+            type='selection',
+            selection=[('', ''),
+                       ('ignored', 'Ignored'),
+                       ('recreated', 'Recreated')],
+            string='Exception State')
+
+    def __init__(self):
+        super(Invoice, self).__init__()
+        self._error_messages.update({
+                'delete_purchase_invoice': 'You can not delete invoices ' \
+                    'that come from a purchase!',
+                'reset_invoice_purchase': 'You cannot reset to draft ' \
+                        'an invoice generated by a purchase.',
+            })
+
+    def button_draft(self, cursor, user, ids, context=None):
+        purchase_obj = self.pool.get('purchase.purchase')
+        purchase_ids = purchase_obj.search(
+            cursor, user, [('invoices', 'in', ids)], context=context)
+
+        if purchase_ids:
+            self.raise_user_error(cursor, 'reset_invoice_purchase')
+
+        return super(Invoice, self).button_draft(
+            cursor, user, ids, context=context)
+
+    def get_purchase_exception_state(self, cursor, user, ids, name, arg,
+                                     context=None):
+        purchase_obj = self.pool.get('purchase.purchase')
+        purchase_ids = purchase_obj.search(
+            cursor, user, [('invoices', 'in', ids)], context=context)
+
+        purchases = purchase_obj.browse(
+            cursor, user, purchase_ids, context=context)
+
+        recreated_ids = tuple(i.id for p in purchases for i in p.invoices_recreated)
+        ignored_ids = tuple(i.id for p in purchases for i in p.invoices_ignored)
+
+        res = {}.fromkeys(ids, '')
+        for invoice in self.browse(cursor, user, ids, context=context):
+            if invoice.id in recreated_ids:
+                res[invoice.id] = 'recreated'
+            elif invoice.id in ignored_ids:
+                res[invoice.id] = 'ignored'
+
+        return res
+
+    def delete(self, cursor, user, ids, context=None):
+        if not ids:
+            return True
+        if isinstance(ids, (int, long)):
+            ids = [ids]
+        cursor.execute('SELECT id FROM purchase_invoices_rel ' \
+                'WHERE invoice IN (' + ','.join(['%s' for x in ids]) + ')',
+                ids)
+        if cursor.rowcount:
+            self.raise_user_error(cursor, 'delete_purchase_invoice',
+                    context=context)
+        return super(Invoice, self).delete(cursor, user, ids,
+                context=context)
+
+Invoice()
+
+
 class OpenSupplier(Wizard):
     'Open Suppliers'
     _name = 'purchase.open_supplier'
@@ -1620,28 +1866,193 @@ class OpenSupplier(Wizard):
 OpenSupplier()
 
 
-class Invoice(OSV):
-    _name = 'account.invoice'
+class HandlePackingExceptionAsk(ModelView):
+    'Shipment Exception Ask'
+    _name = 'purchase.handle.packing.exception.ask'
+    _description = __doc__
 
-    def __init__(self):
-        super(Invoice, self).__init__()
-        self._error_messages.update({
-            'delete_purchase_invoice': 'You can not delete invoices ' \
-                    'that comes from a purchase!',
-            })
+    recreate_moves = fields.Many2Many(
+        'stock.move', None, None, 'Recreate Moves',
+        domain="[('id', 'in', domain_moves)]", depends=['domain_moves'],
+        help='The selected moves will be recreated. '\
+            'The other ones will be ignored.')
+    domain_moves = fields.Many2Many(
+        'stock.move', None, None, 'Domain Moves')
 
-    def delete(self, cursor, user, ids, context=None):
-        if not ids:
-            return True
-        if isinstance(ids, (int, long)):
-            ids = [ids]
-        cursor.execute('SELECT id FROM purchase_invoices_rel ' \
-                'WHERE invoice IN (' + ','.join(['%s' for x in ids]) + ')',
-                ids)
-        if cursor.rowcount:
-            self.raise_user_error(cursor, 'delete_purchase_invoice',
-                    context=context)
-        return super(Invoice, self).delete(cursor, user, ids,
+    def default_recreate_moves(self, cursor, user, context=None):
+        return self.default_domain_moves(cursor, user, context=context)
+
+    def default_domain_moves(self, cursor, user, context=None):
+        purchase_line_obj = self.pool.get('purchase.line')
+        active_id = context and context.get('active_id')
+        if not active_id:
+            return []
+
+        line_ids = purchase_line_obj.search(
+            cursor, user, [('purchase', '=', active_id)],
+            context=context)
+        lines = purchase_line_obj.browse(cursor, user, line_ids, context=context)
+
+        domain_moves = []
+        for line in lines:
+            skip_ids = set(x.id for x in line.moves_ignored + \
+                               line.moves_recreated)
+            for move in line.moves:
+                if move.state == 'cancel' and move.id not in skip_ids:
+                    domain_moves.append(move.id)
+
+        return domain_moves
+
+HandlePackingExceptionAsk()
+
+class HandlePackingException(Wizard):
+    'Handle Shipment Exception'
+    _name = 'purchase.handle.packing.exception'
+    states = {
+        'init': {
+            'actions': [],
+            'result': {
+                'type': 'form',
+                'object': 'purchase.handle.packing.exception.ask',
+                'state': [
+                    ('end', 'Cancel', 'tryton-cancel'),
+                    ('ok', 'Ok', 'tryton-ok', True),
+                ],
+            },
+        },
+        'ok': {
+            'result': {
+                'type': 'action',
+                'action': '_handle_moves',
+                'state': 'end',
+            },
+        },
+    }
+
+    def _handle_moves(self, cursor, user, data, context=None):
+        purchase_obj = self.pool.get('purchase.purchase')
+        purchase_line_obj = self.pool.get('purchase.line')
+        move_obj = self.pool.get('stock.move')
+        to_recreate = data['form']['recreate_moves'][0][1]
+        domain_moves = data['form']['domain_moves'][0][1]
+
+        line_ids = purchase_line_obj.search(
+            cursor, user, [('purchase', '=', data['id'])],
+            context=context)
+        lines = purchase_line_obj.browse(cursor, user, line_ids, context=context)
+
+        for line in lines:
+            moves_ignored = []
+            moves_recreated = []
+            skip_ids = set(x.id for x in line.moves_ignored)
+            skip_ids.update(x.id for x in line.moves_recreated)
+            for move in line.moves:
+                if move.id not in domain_moves or move.id in skip_ids:
+                    continue
+                if move.id in to_recreate:
+                    moves_recreated.append(move.id)
+                else:
+                    moves_ignored.append(move.id)
+
+            purchase_line_obj.write(
+                cursor, user, line.id,
+                {'moves_ignored': [('add', moves_ignored)],
+                 'moves_recreated': [('add', moves_recreated)]},
                 context=context)
 
-Invoice()
+        purchase_obj.workflow_trigger_validate(cursor, user, data['id'],
+                'packing_ok', context=context)
+
+HandlePackingException()
+
+
+class HandleInvoiceExceptionAsk(ModelView):
+    'Invoice Exception Ask'
+    _name = 'purchase.handle.invoice.exception.ask'
+    _description = __doc__
+
+    recreate_invoices = fields.Many2Many(
+        'account.invoice', None, None, 'Recreate Invoices',
+        domain="[('id', 'in', domain_invoices)]", depends=['domain_invoices'],
+        help='The selected invoices will be recreated. '\
+            'The other ones will be ignored.')
+    domain_invoices = fields.Many2Many(
+        'account.invoice', None, None, 'Domain Invoices')
+
+    def default_recreate_invoices(self, cursor, user, context=None):
+        return self.default_domain_invoices(cursor, user, context=context)
+
+    def default_domain_invoices(self, cursor, user, context=None):
+        purchase_obj = self.pool.get('purchase.purchase')
+        active_id = context and context.get('active_id')
+        if not active_id:
+            return []
+
+        purchase = purchase_obj.browse(
+            cursor, user, active_id, context=context)
+        skip_ids = set(x.id for x in purchase.invoices_ignored)
+        skip_ids.update(x.id for x in purchase.invoices_recreated)
+        domain_invoices = []
+        for invoice in purchase.invoices:
+            if invoice.state == 'cancel' and invoice.id not in skip_ids:
+                domain_invoices.append(invoice.id)
+
+        return domain_invoices
+
+HandleInvoiceExceptionAsk()
+
+
+class HandleInvoiceException(Wizard):
+    'Handle Invoice Exception'
+    _name = 'purchase.handle.invoice.exception'
+    states = {
+        'init': {
+            'actions': [],
+            'result': {
+                'type': 'form',
+                'object': 'purchase.handle.invoice.exception.ask',
+                'state': [
+                    ('end', 'Cancel', 'tryton-cancel'),
+                    ('ok', 'Ok', 'tryton-ok', True),
+                ],
+            },
+        },
+        'ok': {
+            'result': {
+                'type': 'action',
+                'action': '_handle_invoices',
+                'state': 'end',
+            },
+        },
+    }
+
+    def _handle_invoices(self, cursor, user, data, context=None):
+        purchase_obj = self.pool.get('purchase.purchase')
+        invoice_obj = self.pool.get('account.invoice')
+        to_recreate = data['form']['recreate_invoices'][0][1]
+        domain_invoices = data['form']['domain_invoices'][0][1]
+
+        purchase = purchase_obj.browse(cursor, user, data['id'], context=context)
+
+        skip_ids = set(x.id for x in purchase.invoices_ignored)
+        skip_ids.update(x.id for x in purchase.invoices_recreated)
+        invoices_ignored = []
+        invoices_recreated = []
+        for invoice in purchase.invoices:
+            if invoice.id not in domain_invoices or invoice.id in skip_ids:
+                continue
+            if invoice.id in to_recreate:
+                invoices_recreated.append(invoice.id)
+            else:
+                invoices_ignored.append(invoice.id)
+
+        purchase_obj.write(
+            cursor, user, purchase.id,
+            {'invoices_ignored': [('add', invoices_ignored)],
+             'invoices_recreated': [('add', invoices_recreated)],},
+            context=context)
+
+        purchase_obj.workflow_trigger_validate(cursor, user, data['id'],
+                'invoice_ok', context=context)
+
+HandleInvoiceException()
diff --git a/purchase.xml b/purchase.xml
index 9d2d4c5..487d637 100644
--- a/purchase.xml
+++ b/purchase.xml
@@ -4,11 +4,32 @@ this repository contains the full copyright notices and license terms. -->
 <tryton>
     <data>
         <menuitem name="Purchase Management" id="menu_purchase" sequence="4"/>
+
+        <record model="res.group" id="group_purchase_admin">
+            <field name="name">Purchase Administrator</field>
+        </record>
         <record model="res.group" id="group_purchase">
             <field name="name">Purchase</field>
         </record>
         <record model="res.user" id="res.user_admin">
-            <field name="groups" eval="[('add', ref('group_purchase'))]"/>
+            <field name="groups"
+                eval="[('add', ref('group_purchase')), ('add', ref('group_purchase_admin'))]"/>
+        </record>
+
+        <menuitem name="Configuration" parent="menu_purchase"
+            id="menu_configuration" groups="group_purchase_admin"
+            sequence="0" icon="tryton-preferences" active="0"/>
+
+        <record model="ir.action.wizard" id="wizard_packing_handle_exception">
+            <field name="name">Handle Shipment Exception</field>
+            <field name="wiz_name">purchase.handle.packing.exception</field>
+            <field name="model">purchase.purchase</field>
+        </record>
+
+        <record model="ir.action.wizard" id="wizard_invoice_handle_exception">
+            <field name="name">Handle Invoice Exception</field>
+            <field name="wiz_name">purchase.handle.invoice.exception</field>
+            <field name="model">purchase.purchase</field>
         </record>
 
         <record model="ir.ui.view" id="purchase_view_form">
@@ -21,13 +42,14 @@ this repository contains the full copyright notices and license terms. -->
                     <field name="party"/>
                     <label name="invoice_address"/>
                     <field name="invoice_address"/>
-                    <newline/>
+                    <label name="supplier_reference"/>
+                    <field name="supplier_reference"/>
                     <label name="description"/>
                     <field name="description" colspan="3"/>
                     <label name="reference"/>
                     <field name="reference"/>
                     <notebook colspan="6">
-                        <page string="Purchase">
+                        <page string="Purchase" id="purchase">
                             <label name="purchase_date"/>
                             <field name="purchase_date"/>
                             <label name="payment_term"/>
@@ -50,13 +72,13 @@ this repository contains the full copyright notices and license terms. -->
                                     <field name="unit_digits" tree_invisible="1"/>
                                 </tree>
                             </field>
-                            <group col="2" colspan="2">
+                            <group col="2" colspan="2" id="states">
                                 <label name="invoice_state"/>
                                 <field name="invoice_state"/>
                                 <label name="packing_state"/>
                                 <field name="packing_state"/>
                             </group>
-                            <group col="2" colspan="2">
+                            <group col="2" colspan="2" id="amount_state_buttons">
                                 <label name="untaxed_amount"/>
                                 <field name="untaxed_amount"/>
                                 <label name="tax_amount"/>
@@ -65,29 +87,33 @@ this repository contains the full copyright notices and license terms. -->
                                 <field name="total_amount"/>
                                 <label name="state"/>
                                 <field name="state"/>
-                                <group col="6" colspan="2">
+                                <group col="6" colspan="2" id="buttons">
                                     <button name="cancel" string="Cancel"
                                         states="{'invisible': '''not ((state in ('draft', 'quotation')) or (invoice_state == 'exception') or (packing_state == 'exception')) ''', 'readonly': '''%(group_purchase)d not in groups'''}"
                                         icon="tryton-cancel"/>
                                     <button name="draft" string="Draft"
                                         states="{'invisible': '''state != 'quotation' ''', 'readonly': '''%(group_purchase)d not in groups'''}"
-                                        icon="tryton-clear"/>
+                                        icon="tryton-go-previous"/>
                                     <button name="quotation" string="Quotation"
-                                        states="{'invisible': '''state != 'draft' ''', 'readonly': '''%(group_purchase)d not in groups'''}"
-                                        icon="tryton-go-next"/>
-                                    <button name="invoice_ok" string="Ignore Invoice Exception"
-                                        states="{'invisible': '''invoice_state != 'exception' or state == 'cancel' ''', 'readonly': '''%(group_purchase)d not in groups'''}"
-                                        icon="tryton-go-next"/>
-                                    <button name="packing_ok" string="Ignore Packing Exception"
-                                        states="{'invisible': '''packing_state != 'exception' or state == 'cancel' ''', 'readonly': '''%(group_purchase)d not in groups'''}"
+                                        states="{'invisible': '''state != 'draft' ''', 'readonly': '''(not bool(lines)) or %(group_purchase)d not in groups '''}"
                                         icon="tryton-go-next"/>
+                                    <button name="%(wizard_invoice_handle_exception)d"
+                                            string="Handle Invoice Exception"
+                                            type="action"
+                                            states="{'invisible': '''invoice_state != 'exception' or state == 'cancel' ''', 'readonly': '''%(group_purchase)d not in groups'''}"
+                                            icon="tryton-go-next"/>
+                                    <button name="%(wizard_packing_handle_exception)d"
+                                            string="Handle Shipment Exception"
+                                            type="action"
+                                            states="{'invisible': '''packing_state != 'exception' or state == 'cancel' ''', 'readonly': '''%(group_purchase)d not in groups'''}"
+                                            icon="tryton-go-next"/>
                                     <button name="confirm" string="Confirm"
                                         states="{'invisible': '''state != 'quotation' ''', 'readonly': '''%(group_purchase)d not in groups'''}"
                                         icon="tryton-ok"/>
                                 </group>
                             </group>
                         </page>
-                        <page string="Other Info">
+                        <page string="Other Info" id="info">
                             <label name="company"/>
                             <field name="company"/>
                             <label name="invoice_method"/>
@@ -95,16 +121,46 @@ this repository contains the full copyright notices and license terms. -->
                             <separator name="comment" colspan="4"/>
                             <field name="comment" colspan="4" spell="party_lang"/>
                         </page>
-                        <page string="Invoices">
-                            <field name="invoices" colspan="4" widget="one2many"/>
+                        <page string="Invoices" id="invoices">
+                            <separator name="invoices" colspan="4"/>
+                            <field name="invoices" colspan="4">
+                                <tree>
+                                    <field name="number" select="1"/>
+                                    <field name="reference" select="1"/>
+                                    <field name="invoice_date" select="2"/>
+                                    <field name="party" select="1"/>
+                                    <field name="currency" select="2"/>
+                                    <field name="untaxed_amount" select="2"/>
+                                    <field name="tax_amount" select="2"/>
+                                    <field name="total_amount" select="2"/>
+                                    <field name="state" select="2"/>
+                                    <field name="purchase_exception_state"/>
+                                    <field name="amount_to_pay_today"/>
+                                    <field name="description" select="2"/>
+                                    <field name="currency_digits" tree_invisible="1"/>
+                                </tree>
+                            </field>
                         </page>
-                        <page string="Packings">
-                            <field name="moves" colspan="4" widget="one2many"/>
-                            <field name="packings" colspan="4" widget="one2many"/>
+                        <page string="Shipments" id="packings">
+                            <separator name="moves" colspan="4"/>
+                            <field name="moves" colspan="4">
+                                <tree string="Moves">
+                                    <field name="product"/>
+                                    <field name="from_location"/>
+                                    <field name="to_location"/>
+                                    <field name="quantity"/>
+                                    <field name="uom"/>
+                                    <field name="state"/>
+                                    <field name="purchase_exception_state"/>
+                                    <field name="unit_digits" tree_invisible="1"/>
+                                </tree>
+                            </field>
+                            <separator name="packings" colspan="4"/>
+                            <field name="packings" colspan="4"/>
                         </page>
                     </notebook>
-                    <field name="currency_digits" invisible="1"/>
-                    <field name="party_lang" invisible="1"/>
+                    <field name="currency_digits" invisible="1" colspan="6"/>
+                    <field name="party_lang" invisible="1" colspan="6"/>
                 </form>
                 ]]>
             </field>
@@ -116,7 +172,8 @@ this repository contains the full copyright notices and license terms. -->
                 <![CDATA[
                 <tree string="Purchases">
                     <field name="reference" select="1"/>
-                    <field name="purchase_date" select="1"/>
+                    <field name="supplier_reference" select="1"/>
+                    <field name="purchase_date" select="2"/>
                     <field name="party" select="1"/>
                     <field name="warehouse"/>
                     <field name="currency" select="2"/>
@@ -132,10 +189,72 @@ this repository contains the full copyright notices and license terms. -->
             </field>
         </record>
 
+        <record model="ir.action.act_window" id="act_packing_form">
+            <field name="name">Shipments</field>
+            <field name="res_model">stock.packing.in</field>
+            <field name="view_type">form</field>
+            <field name="domain">[("id", "in", packings)]</field>
+        </record>
+        <record model="ir.action.keyword"
+                id="act_open_packing_keyword1">
+            <field name="keyword">form_relate</field>
+            <field name="model">purchase.purchase,0</field>
+            <field name="action" ref="act_packing_form"/>
+        </record>
+        <record model="ir.action.act_window" id="act_invoice_form">
+            <field name="name">Invoices</field>
+            <field name="res_model">account.invoice</field>
+            <field name="view_type">form</field>
+            <field name="domain">[("id", "in", invoices)]</field>
+            <field name="context">{'type': 'in_invoice'}</field>
+        </record>
+        <record model="ir.action.keyword"
+                id="act_open_invoice_keyword1">
+            <field name="keyword">form_relate</field>
+            <field name="model">purchase.purchase,0</field>
+            <field name="action" ref="act_invoice_form"/>
+        </record>
+
+        <record model="ir.ui.view" id="handle_packing_exception_view_form">
+            <field name="model">purchase.handle.packing.exception.ask</field>
+            <field name="type">form</field>
+            <field name="arch" type="xml">
+                <![CDATA[
+                <form string="Handle packing Exception" col="1">
+                    <separator string="Choose moves to recreate"
+                               id="choose"/>
+                    <field name="recreate_moves">
+                        <tree string="Recreated Moves" fill="1">
+                            <field name="product"/>
+                            <field name="quantity"/>
+                            <field name="uom"/>
+                            <field name="unit_digits" tree_invisible="1"/>
+                        </tree>
+                    </field>
+                </form>
+                ]]>
+            </field>
+        </record>
+
+        <record model="ir.ui.view" id="handle_invoice_exception_view_form">
+            <field name="model">purchase.handle.invoice.exception.ask</field>
+            <field name="type">form</field>
+            <field name="arch" type="xml">
+                <![CDATA[
+                <form string="Handle Invoice Exception" col="1">
+                    <separator string="Choose invoices to recreate"
+                               id="choose"/>
+                    <field name="recreate_invoices"/>
+                </form>
+                ]]>
+            </field>
+        </record>
+
         <record model="ir.action.act_window" id="act_purchase_form">
             <field name="name">Purchases</field>
             <field name="res_model">purchase.purchase</field>
             <field name="view_type">form</field>
+            <field name="search_value"></field>
         </record>
         <record model="ir.action.act_window.view" id="act_purchase_form_view1">
             <field name="sequence" eval="10"/>
@@ -148,7 +267,25 @@ this repository contains the full copyright notices and license terms. -->
             <field name="act_window" ref="act_purchase_form"/>
         </record>
         <menuitem parent="menu_purchase" action="act_purchase_form"
-            id="menu_purchase_form"/>
+            id="menu_purchase_form" sequence="10"/>
+
+        <record model="ir.action.act_window" id="act_purchase_form_new">
+            <field name="name">New Purchase</field>
+            <field name="res_model">purchase.purchase</field>
+            <field name="view_type">form</field>
+        </record>
+        <record model="ir.action.act_window.view" id="act_purchase_form_new_view1">
+            <field name="sequence" eval="20"/>
+            <field name="view" ref="purchase_view_tree"/>
+            <field name="act_window" ref="act_purchase_form_new"/>
+        </record>
+        <record model="ir.action.act_window.view" id="act_purchase_form_new_view2">
+            <field name="sequence" eval="10"/>
+            <field name="view" ref="purchase_view_form"/>
+            <field name="act_window" ref="act_purchase_form_new"/>
+        </record>
+        <menuitem parent="menu_purchase_form" action="act_purchase_form_new"
+            id="menu_purchase_form_new" sequence="10"/>
 
         <record model="ir.action.act_window" id="act_purchase_form_draft">
             <field name="name">Draft Purchases</field>
@@ -167,7 +304,7 @@ this repository contains the full copyright notices and license terms. -->
             <field name="act_window" ref="act_purchase_form_draft"/>
         </record>
         <menuitem parent="menu_purchase_form" action="act_purchase_form_draft"
-            id="menu_purchase_form_draft"/>
+            id="menu_purchase_form_draft" sequence="20"/>
 
         <record model="ir.action.act_window" id="act_purchase_form_quotation">
             <field name="name">Purchases in Quotation</field>
@@ -186,7 +323,7 @@ this repository contains the full copyright notices and license terms. -->
             <field name="act_window" ref="act_purchase_form_quotation"/>
         </record>
         <menuitem parent="menu_purchase_form" action="act_purchase_form_quotation"
-            id="menu_purchase_form_quotation"/>
+            id="menu_purchase_form_quotation" sequence="30"/>
 
         <record model="ir.action.act_window" id="act_purchase_form_confirmed">
             <field name="name">Confirmed Purchases</field>
@@ -205,7 +342,10 @@ this repository contains the full copyright notices and license terms. -->
             <field name="act_window" ref="act_purchase_form_confirmed"/>
         </record>
         <menuitem parent="menu_purchase_form" action="act_purchase_form_confirmed"
-            id="menu_purchase_form_confirmed"/>
+            id="menu_purchase_form_confirmed" sequence="40"/>
+
+        <menuitem name="Reporting" parent="menu_purchase"
+            id="menu_reporting" sequence="100" active="0"/>
 
         <record model="ir.model.access" id="access_purchase">
             <field name="model" search="[('model', '=', 'purchase.purchase')]"/>
@@ -260,17 +400,11 @@ this repository contains the full copyright notices and license terms. -->
             <field name="workflow" ref="purchase_workflow"/>
             <field name="split_mode">OR</field>
         </record>
-        <record model="workflow.activity" id="purchase_activity_invoice_purchase">
-            <field name="name">Invoice</field>
-            <field name="workflow" ref="purchase_workflow"/>
-            <field name="kind">function</field>
-            <field name="action">create_invoice()</field>
-        </record>
         <record model="workflow.activity" id="purchase_activity_waiting_invoice_purchase">
             <field name="name">Waiting Invoice</field>
             <field name="workflow" ref="purchase_workflow"/>
             <field name="kind">function</field>
-            <field name="action">write({'invoice_state': 'waiting'})
ignore_invoice_exception()</field>
+            <field name="action">create_invoice()
write({'invoice_state': 'waiting'})</field>
         </record>
         <record model="workflow.activity" id="purchase_activity_invoice_purchase_exception">
             <field name="name">Invoice Exception</field>
@@ -288,54 +422,48 @@ this repository contains the full copyright notices and license terms. -->
             <field name="name">Invoice Method Done</field>
             <field name="workflow" ref="purchase_workflow"/>
         </record>
-        <record model="workflow.activity" id="purchase_activity_packing">
-            <field name="name">Packing</field>
-            <field name="workflow" ref="purchase_workflow"/>
-            <field name="kind">function</field>
-            <field name="action">create_move()</field>
-        </record>
         <record model="workflow.activity" id="purchase_activity_waiting_packing">
-            <field name="name">Waiting Packing</field>
+            <field name="name">Waiting Shipment</field>
             <field name="workflow" ref="purchase_workflow"/>
             <field name="kind">function</field>
-            <field name="action">write({'packing_state': 'waiting'})
ignore_packing_exception()
create_move()</field>
+            <field name="action">write({'packing_state': 'waiting'})
create_move()</field>
         </record>
         <record model="workflow.activity" id="purchase_activity_packing_exception">
-            <field name="name">Packing Exception</field>
+            <field name="name">Shipment Exception</field>
             <field name="workflow" ref="purchase_workflow"/>
             <field name="kind">function</field>
             <field name="action">write({'packing_state': 'exception'})</field>
         </record>
         <record model="workflow.activity" id="purchase_activity_invoice_packing_method">
-            <field name="name">Invoice Packing Method</field>
+            <field name="name">Invoice Shipment Method</field>
             <field name="workflow" ref="purchase_workflow"/>
             <field name="split_mode">OR</field>
         </record>
         <record model="workflow.activity" id="purchase_activity_invoice_packing">
-            <field name="name">Invoice Packing</field>
+            <field name="name">Invoice Shipment</field>
             <field name="workflow" ref="purchase_workflow"/>
             <field name="kind">function</field>
             <field name="action">create_invoice()
write({'invoice_state': 'waiting'})</field>
         </record>
         <record model="workflow.activity" id="purchase_activity_waiting_invoice_packing">
-            <field name="name">Waiting Invoice Packing</field>
+            <field name="name">Waiting Invoice Shipment</field>
             <field name="workflow" ref="purchase_workflow"/>
             <field name="kind">function</field>
-            <field name="action">write({'invoice_state': 'waiting', 'packing_state': 'received'})
ignore_invoice_exception()</field>
+            <field name="action">write({'invoice_state': 'waiting', 'packing_state': 'received'})</field>
         </record>
         <record model="workflow.activity" id="purchase_activity_invoice_packing_exception">
-            <field name="name">Invoice Packing Exception</field>
+            <field name="name">Invoice Shipment Exception</field>
             <field name="workflow" ref="purchase_workflow"/>
             <field name="action">write({'invoice_state': 'exception'})</field>
         </record>
         <record model="workflow.activity" id="purchase_activity_invoice_packing_done">
-            <field name="name">Invoice Packing Done</field>
+            <field name="name">Invoice Shipment Done</field>
             <field name="workflow" ref="purchase_workflow"/>
             <field name="kind">function</field>
             <field name="action">write({'invoice_state': 'paid'})</field>
         </record>
         <record model="workflow.activity" id="purchase_activity_invoice_packing_method_done">
-            <field name="name">Invoice Packing Method Done</field>
+            <field name="name">Invoice Shipment Method Done</field>
             <field name="workflow" ref="purchase_workflow"/>
             <field name="kind">function</field>
             <field name="action">write({'packing_state': 'received'})</field>
@@ -349,7 +477,7 @@ this repository contains the full copyright notices and license terms. -->
             <field name="flow_stop" eval="True"/>
         </record>
         <record model="workflow.activity" id="purchase_activity_cancel">
-            <field name="name">Cancel</field>
+            <field name="name">Canceled</field>
             <field name="workflow" ref="purchase_workflow"/>
             <field name="kind">function</field>
             <field name="action">write({'state': 'cancel'})</field>
@@ -358,6 +486,7 @@ this repository contains the full copyright notices and license terms. -->
         <record model="workflow.transition" id="purchase_transition_draft_quotation">
             <field name="act_from" ref="purchase_activity_draft"/>
             <field name="act_to" ref="purchase_activity_quotation"/>
+            <field name="condition">bool(lines)</field>
             <field name="signal">quotation</field>
             <field name="group" ref="group_purchase"/>
         </record>
@@ -389,9 +518,9 @@ this repository contains the full copyright notices and license terms. -->
             <field name="act_from" ref="purchase_activity_confirmed"/>
             <field name="act_to" ref="purchase_activity_invoice_method"/>
         </record>
-        <record model="workflow.transition" id="purchase_transition_invoice_method_invoice_purchase">
+        <record model="workflow.transition" id="purchase_transition_invoice_method_waiting_invoice_purchase">
             <field name="act_from" ref="purchase_activity_invoice_method"/>
-            <field name="act_to" ref="purchase_activity_invoice_purchase"/>
+            <field name="act_to" ref="purchase_activity_waiting_invoice_purchase"/>
             <field name="condition">invoice_method == 'order'</field>
         </record>
         <record model="workflow.transition" id="purchase_transition_invoice_method_invoice_done">
@@ -399,10 +528,6 @@ this repository contains the full copyright notices and license terms. -->
             <field name="act_to" ref="purchase_activity_invoice_method_done"/>
             <field name="condition">invoice_method != 'order'</field>
         </record>
-        <record model="workflow.transition" id="purchase_transition_invoice_purchase_waiting_invoice_purchase">
-            <field name="act_from" ref="purchase_activity_invoice_purchase"/>
-            <field name="act_to" ref="purchase_activity_waiting_invoice_purchase"/>
-        </record>
         <record model="workflow.transition" id="purchase_transition_waiting_invoice_purchase_invoice_purchase_exception">
             <field name="act_from" ref="purchase_activity_waiting_invoice_purchase"/>
             <field name="act_to" ref="purchase_activity_invoice_purchase_exception"/>
@@ -437,12 +562,8 @@ this repository contains the full copyright notices and license terms. -->
             <field name="act_from" ref="purchase_activity_invoice_method_done"/>
             <field name="act_to" ref="purchase_activity_done"/>
         </record>
-        <record model="workflow.transition" id="purchase_transition_confirmed_packing">
+        <record model="workflow.transition" id="purchase_transition_confirmed_waiting_packing">
             <field name="act_from" ref="purchase_activity_confirmed"/>
-            <field name="act_to" ref="purchase_activity_packing"/>
-        </record>
-        <record model="workflow.transition" id="purchase_transition_packing_waiting_packing">
-            <field name="act_from" ref="purchase_activity_packing"/>
             <field name="act_to" ref="purchase_activity_waiting_packing"/>
         </record>
         <record model="workflow.transition" id="purchase_transition_waiting_packing_packing_exception">
@@ -555,39 +676,47 @@ this repository contains the full copyright notices and license terms. -->
                 <form string="Purchase Line" cursor="product">
                     <label name="purchase"/>
                     <field name="purchase" colspan="3"/>
-                    <label name="type"/>
-                    <field name="type"/>
-                    <label name="sequence"/>
-                    <field name="sequence"/>
-                    <label name="product"/>
-                    <field name="product">
-                        <tree string="Products">
-                            <field name="name" select="1"/>
-                            <field name="code" select="1"/>
-                            <field name="list_price_uom" select="2"/>
-                            <field name="cost_price_uom" select="2"/>
-                            <field name="quantity" select="2"/>
-                            <field name="forecast_quantity" select="2"/>
-                            <field name="default_uom" select="2"/>
-                            <field name="active" select="2"/>
-                        </tree>
-                    </field>
-                    <newline/>
-                    <label name="description"/>
-                    <field name="description" colspan="3"/>
-                    <label name="quantity"/>
-                    <field name="quantity"/>
-                    <label name="unit"/>
-                    <field name="unit"/>
-                    <label name="unit_price"/>
-                    <field name="unit_price"/>
-                    <label name="amount"/>
-                    <field name="amount"/>
-                    <separator name="taxes" colspan="4"/>
-                    <field name="taxes" colspan="4"/>
-                    <separator name="comment" colspan="4"/>
-                    <field name="comment" colspan="4" spell="_parent_purchase.party_lang"/>
-                    <field name="unit_digits" invisible="1"/>
+                    <notebook colspan="4">
+                        <page string="General" id="general">
+                            <label name="type"/>
+                            <field name="type"/>
+                            <label name="sequence"/>
+                            <field name="sequence"/>
+                            <label name="product"/>
+                            <field name="product">
+                                <tree string="Products">
+                                    <field name="name" select="1"/>
+                                    <field name="code" select="1"/>
+                                    <field name="list_price_uom" select="2"/>
+                                    <field name="cost_price_uom" select="2"/>
+                                    <field name="quantity" select="2"/>
+                                    <field name="forecast_quantity" select="2"/>
+                                    <field name="default_uom" select="2"/>
+                                    <field name="active" select="2"/>
+                                </tree>
+                            </field>
+                            <newline/>
+                            <label name="description"/>
+                            <field name="description" colspan="3"
+                                spell="_parent_purchase.party_lang"/>
+                            <label name="quantity"/>
+                            <field name="quantity"/>
+                            <label name="unit"/>
+                            <field name="unit"/>
+                            <label name="unit_price"/>
+                            <field name="unit_price"/>
+                            <label name="amount"/>
+                            <field name="amount"/>
+                            <separator name="taxes" colspan="4"/>
+                            <field name="taxes" colspan="4"/>
+                        </page>
+                        <page string="Notes" id="notes">
+                            <separator name="note" colspan="4"/>
+                            <field name="note" colspan="4"
+                                spell="_parent_purchase.party_lang"/>
+                        </page>
+                    </notebook>
+                    <field name="unit_digits" invisible="1" colspan="4"/>
                 </form>
                 ]]>
             </field>
@@ -708,21 +837,22 @@ this repository contains the full copyright notices and license terms. -->
             </field>
         </record>
 
-        <record model="ir.ui.view" id="product_view_form">
-            <field name="model">product.product</field>
-            <field name="inherit" ref="product.product_view_form"/>
+        <record model="ir.ui.view" id="template_view_form">
+            <field name="model">product.template</field>
+            <field name="inherit" ref="product.template_view_form"/>
             <field name="arch" type="xml">
                 <![CDATA[
                 <data>
-                    <xpath expr="/form/notebook/page/separator[@name="description"]"
-                        position="before">
+                    <xpath expr="/form/notebook/page[@id="general"]/field[@name="cost_price_method"]"
+                        position="after">
                         <label name="purchasable"/>
                         <field name="purchasable"/>
                     </xpath>
-                    <xpath expr="/form/notebook/page[@string="General"]"
+                    <xpath expr="/form/notebook/page[@id="general"]"
                         position="after">
                         <page string="Suppliers"
-                            states="{'invisible': '''not purchasable'''}">
+                            states="{'invisible': '''not purchasable'''}"
+                            id="suppliers">
                             <label name="purchasable"/>
                             <field name="purchasable"/>
                             <label name="purchase_uom"/>
@@ -741,9 +871,9 @@ this repository contains the full copyright notices and license terms. -->
                 ]]>
             </field>
         </record>
-        <record model="ir.ui.view" id="product_view_tree">
-            <field name="model">product.product</field>
-            <field name="inherit" ref="product.product_view_tree"/>
+        <record model="ir.ui.view" id="template_view_tree">
+            <field name="model">product.template</field>
+            <field name="inherit" ref="product.template_view_tree"/>
             <field name="arch" type="xml">
                 <![CDATA[
                 <data>
@@ -807,13 +937,25 @@ this repository contains the full copyright notices and license terms. -->
         </record>
 
         <record model="ir.action.wizard" id="act_open_supplier">
-            <field name="name">Suppliers</field>
+            <field name="name">Parties associated to Purchases</field>
             <field name="wiz_name">purchase.open_supplier</field>
         </record>
-        <menuitem name="Suppliers"
+        <menuitem name="Parties associated to Purchases"
             parent="party.menu_party_form"
             action="act_open_supplier"
             icon="tryton-list"
             id="menu_supplier"/>
+
+        <record model="ir.rule.group" id="rule_group_purchase">
+            <field name="model" search="[('model', '=', 'purchase.purchase')]"/>
+            <field name="global_p" eval="True"/>
+        </record>
+        <record model="ir.rule" id="rule_purchase1">
+            <field name="field" search="[('name', '=', 'company'), ('model.model', '=', 'purchase.purchase')]"/>
+            <field name="operator">=</field>
+            <field name="operand">User/Current Company</field>
+            <field name="rule_group" ref="rule_group_purchase"/>
+        </record>
+
     </data>
 </tryton>
diff --git a/trytond_purchase.egg-info/PKG-INFO b/trytond_purchase.egg-info/PKG-INFO
index 9170ec3..7c10f5e 100644
--- a/trytond_purchase.egg-info/PKG-INFO
+++ b/trytond_purchase.egg-info/PKG-INFO
@@ -1,6 +1,6 @@
 Metadata-Version: 1.0
 Name: trytond-purchase
-Version: 1.0.2
+Version: 1.2.0
 Summary: Define purchase order.
 Add product supplier and purchase informations.
 Define the purchase price as the supplier price or the cost price.
@@ -10,13 +10,13 @@ With the possibilities:
     - to define invoice method:
         - Manual
         - Based On Order
-        - Based On Packing
+        - Based On Shipment
 
 Home-page: http://www.tryton.org/
 Author: B2CK
 Author-email: info at b2ck.com
 License: GPL-3
-Download-URL: http://downloads.tryton.org/1.0/
+Download-URL: http://downloads.tryton.org/1.2/
 Description: UNKNOWN
 Platform: UNKNOWN
 Classifier: Development Status :: 5 - Production/Stable
diff --git a/trytond_purchase.egg-info/SOURCES.txt b/trytond_purchase.egg-info/SOURCES.txt
index dfabffc..c9d6c92 100644
--- a/trytond_purchase.egg-info/SOURCES.txt
+++ b/trytond_purchase.egg-info/SOURCES.txt
@@ -6,8 +6,10 @@ MANIFEST.in
 README
 TODO
 de_DE.csv
+es_CO.csv
 es_ES.csv
 fr_FR.csv
+party.xml
 purchase.odt
 purchase.xml
 setup.py
diff --git a/trytond_purchase.egg-info/requires.txt b/trytond_purchase.egg-info/requires.txt
index 3fb0c72..fbf666b 100644
--- a/trytond_purchase.egg-info/requires.txt
+++ b/trytond_purchase.egg-info/requires.txt
@@ -6,5 +6,5 @@ trytond_product
 trytond_account_invoice
 trytond_currency
 trytond_account_product
-trytond >= 1.0
-trytond < 1.1
\ No newline at end of file
+trytond >= 1.2
+trytond < 1.3
\ No newline at end of file
commit d25ca4ce7a107bce594e58173f58caca3e1d84aa
Author: Daniel Baumann <daniel at debian.org>
Date:   Mon Mar 23 07:11:50 2009 +0100

    Adding upstream version 1.0.2.

diff --git a/CHANGELOG b/CHANGELOG
index 9801fce..bf8a718 100644
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -1,3 +1,6 @@
+Version 1.0.2 - 2009-01-06
+* Some bug fixes (see mercurial logs for details)
+
 Version 1.0.1 - 2008-12-01
 * Allow egg installation
 
diff --git a/PKG-INFO b/PKG-INFO
index ea5ebf9..ff01e1a 100644
--- a/PKG-INFO
+++ b/PKG-INFO
@@ -1,6 +1,6 @@
 Metadata-Version: 1.0
 Name: trytond_purchase
-Version: 1.0.1
+Version: 1.0.2
 Summary: Define purchase order.
 Add product supplier and purchase informations.
 Define the purchase price as the supplier price or the cost price.
diff --git a/__tryton__.py b/__tryton__.py
index 7494524..021437e 100644
--- a/__tryton__.py
+++ b/__tryton__.py
@@ -5,7 +5,7 @@
     'name_de_DE': 'Einkauf',
     'name_fr_FR': 'Achat',
     'name_es_ES': 'Compras',
-    'version': '1.0.1',
+    'version': '1.0.2',
     'author': 'B2CK',
     'email': 'info at b2ck.com',
     'website': 'http://www.tryton.org/',
diff --git a/purchase.py b/purchase.py
index 57eb0c1..693b734 100644
--- a/purchase.py
+++ b/purchase.py
@@ -765,7 +765,8 @@ class PurchaseLine(OSV):
             }, on_change=['product', 'unit', 'quantity', 'description',
                 '_parent_purchase.party', '_parent_purchase.currency'],
             context="{'locations': [_parent_purchase.warehouse], " \
-                    "'stock_date_end': _parent_purchase.purchase_date}")
+                    "'stock_date_end': _parent_purchase.purchase_date, " \
+                    "'purchasable': True}")
     unit_price = fields.Numeric('Unit Price', digits=(16, 4),
             states={
                 'invisible': "type != 'line'",
@@ -1150,6 +1151,10 @@ class Template(OSV):
         on_change_with=['default_uom', 'purchase_uom'])
 
     def default_purchasable(self, cursor, user, context=None):
+        if context is None:
+            context = {}
+        if context.get('purchasable'):
+            return True
         return False
 
     def on_change_with_purchase_uom(self, cursor, user, ids, vals,
@@ -1233,7 +1238,7 @@ class Product(OSV):
                 res[product.id] = uom_obj.compute_price(cursor,
                         user, product.default_uom, res[product.id],
                         uom, context=context)
-            if currency:
+            if currency and user2.company:
                 if user2.company.currency.id != currency.id:
                     res[product.id] = currency_obj.compute(cursor, user,
                             user2.company.currency, res[product.id],
diff --git a/trytond_purchase.egg-info/PKG-INFO b/trytond_purchase.egg-info/PKG-INFO
index 2525447..9170ec3 100644
--- a/trytond_purchase.egg-info/PKG-INFO
+++ b/trytond_purchase.egg-info/PKG-INFO
@@ -1,6 +1,6 @@
 Metadata-Version: 1.0
 Name: trytond-purchase
-Version: 1.0.1
+Version: 1.0.2
 Summary: Define purchase order.
 Add product supplier and purchase informations.
 Define the purchase price as the supplier price or the cost price.
commit bc66e2efcba5406cc192c5ffc722201952ac57f7
Author: Daniel Baumann <daniel at debian.org>
Date:   Wed Jan 28 14:16:09 2009 +0100

    Adding upstream version 1.0.1.

diff --git a/CHANGELOG b/CHANGELOG
index eacaaef..9801fce 100644
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -1,2 +1,5 @@
+Version 1.0.1 - 2008-12-01
+* Allow egg installation
+
 Version 1.0.0 - 2008-11-17
 * Initial release
diff --git a/PKG-INFO b/PKG-INFO
index ede2361..ea5ebf9 100644
--- a/PKG-INFO
+++ b/PKG-INFO
@@ -1,6 +1,6 @@
 Metadata-Version: 1.0
 Name: trytond_purchase
-Version: 1.0.0
+Version: 1.0.1
 Summary: Define purchase order.
 Add product supplier and purchase informations.
 Define the purchase price as the supplier price or the cost price.
@@ -16,6 +16,7 @@ Home-page: http://www.tryton.org/
 Author: B2CK
 Author-email: info at b2ck.com
 License: GPL-3
+Download-URL: http://downloads.tryton.org/1.0/
 Description: UNKNOWN
 Platform: UNKNOWN
 Classifier: Development Status :: 5 - Production/Stable
diff --git a/__tryton__.py b/__tryton__.py
index f5476cd..7494524 100644
--- a/__tryton__.py
+++ b/__tryton__.py
@@ -5,7 +5,7 @@
     'name_de_DE': 'Einkauf',
     'name_fr_FR': 'Achat',
     'name_es_ES': 'Compras',
-    'version': '1.0.0',
+    'version': '1.0.1',
     'author': 'B2CK',
     'email': 'info at b2ck.com',
     'website': 'http://www.tryton.org/',
diff --git a/setup.py b/setup.py
index 1bbcd40..2da658d 100644
--- a/setup.py
+++ b/setup.py
@@ -27,6 +27,8 @@ setup(name='trytond_purchase',
     author=info.get('author', ''),
     author_email=info.get('email', ''),
     url=info.get('website', ''),
+    download_url="http://downloads.tryton.org/" + \
+            info.get('version', '0.0.1').rsplit('.', 1)[0] + '/',
     package_dir={'trytond.modules.purchase': '.'},
     packages=[
         'trytond.modules.purchase',
@@ -54,4 +56,9 @@ setup(name='trytond_purchase',
     ],
     license='GPL-3',
     install_requires=requires,
+    zip_safe=False,
+    entry_points="""
+    [trytond.modules]
+    purchase = trytond.modules.purchase
+    """,
 )
diff --git a/trytond_purchase.egg-info/PKG-INFO b/trytond_purchase.egg-info/PKG-INFO
index 7454a4d..2525447 100644
--- a/trytond_purchase.egg-info/PKG-INFO
+++ b/trytond_purchase.egg-info/PKG-INFO
@@ -1,6 +1,6 @@
 Metadata-Version: 1.0
 Name: trytond-purchase
-Version: 1.0.0
+Version: 1.0.1
 Summary: Define purchase order.
 Add product supplier and purchase informations.
 Define the purchase price as the supplier price or the cost price.
@@ -16,6 +16,7 @@ Home-page: http://www.tryton.org/
 Author: B2CK
 Author-email: info at b2ck.com
 License: GPL-3
+Download-URL: http://downloads.tryton.org/1.0/
 Description: UNKNOWN
 Platform: UNKNOWN
 Classifier: Development Status :: 5 - Production/Stable
diff --git a/trytond_purchase.egg-info/SOURCES.txt b/trytond_purchase.egg-info/SOURCES.txt
index cbb836e..dfabffc 100644
--- a/trytond_purchase.egg-info/SOURCES.txt
+++ b/trytond_purchase.egg-info/SOURCES.txt
@@ -17,5 +17,7 @@ setup.py
 trytond_purchase.egg-info/PKG-INFO
 trytond_purchase.egg-info/SOURCES.txt
 trytond_purchase.egg-info/dependency_links.txt
+trytond_purchase.egg-info/entry_points.txt
+trytond_purchase.egg-info/not-zip-safe
 trytond_purchase.egg-info/requires.txt
 trytond_purchase.egg-info/top_level.txt
\ No newline at end of file
diff --git a/trytond_purchase.egg-info/entry_points.txt b/trytond_purchase.egg-info/entry_points.txt
new file mode 100644
index 0000000..9200d89
--- /dev/null
+++ b/trytond_purchase.egg-info/entry_points.txt
@@ -0,0 +1,4 @@
+
+    [trytond.modules]
+    purchase = trytond.modules.purchase
+    
\ No newline at end of file
diff --git a/trytond_purchase.egg-info/not-zip-safe b/trytond_purchase.egg-info/not-zip-safe
new file mode 100644
index 0000000..8b13789
--- /dev/null
+++ b/trytond_purchase.egg-info/not-zip-safe
@@ -0,0 +1 @@
+
commit f27a9f69324ea38a063b54e4bfe7bee4bd978758
Author: Daniel Baumann <daniel at debian.org>
Date:   Tue Nov 18 13:05:55 2008 +0100

    Adding upstream version 1.0.0.

diff --git a/CHANGELOG b/CHANGELOG
new file mode 100644
index 0000000..eacaaef
--- /dev/null
+++ b/CHANGELOG
@@ -0,0 +1,2 @@
+Version 1.0.0 - 2008-11-17
+* Initial release
diff --git a/COPYRIGHT b/COPYRIGHT
new file mode 100644
index 0000000..37fef2d
--- /dev/null
+++ b/COPYRIGHT
@@ -0,0 +1,17 @@
+Copyright (C) 2004-2008 Tiny SPRL.
+Copyright (C) 2008 Cédric Krier.
+Copyright (C) 2008 Bertrand Chenal.
+Copyright (C) 2008 B2CK SPRL.
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program.  If not, see <http://www.gnu.org/licenses/>.
diff --git a/INSTALL b/INSTALL
new file mode 100644
index 0000000..fc3e707
--- /dev/null
+++ b/INSTALL
@@ -0,0 +1,37 @@
+Installing trytond_purchase
+===========================
+
+Prerequisites
+-------------
+
+ * Python 2.4 or later (http://www.python.org/)
+ * trytond 0.0.x (http://www.tryton.org/)
+ * trytond_company (http://www.tryton.org/)
+ * trytond_party (http://www.tryton.org/)
+ * trytond_stock (http://www.tryton.org/)
+ * trytond_account (http://www.tryton.org/)
+ * trytond_product (http://www.tryton.org/)
+ * trytond_account_invoice (http://www.tryton.org/)
+ * trytond_currency (http://www.tryton.org/)
+ * trytond_account_product (http://www.tryton.org/)
+
+Installation
+------------
+
+Once you've downloaded and unpacked a trytond_purchase source release, enter the
+directory where the archive was unpacked, and run:
+
+    python setup.py install
+
+Note that you may need administrator/root privileges for this step, as
+this command will by default attempt to install module to the Python
+site-packages directory on your system.
+
+For advanced options, please refer to the easy_install and/or the distutils
+documentation:
+
+  http://peak.telecommunity.com/DevCenter/EasyInstall
+  http://docs.python.org/inst/inst.html
+
+To use without installation, extract the archive into ``trytond/modules`` with
+the directory name purchase.
diff --git a/LICENSE b/LICENSE
new file mode 100644
index 0000000..94a9ed0
--- /dev/null
+++ b/LICENSE
@@ -0,0 +1,674 @@
+                    GNU GENERAL PUBLIC LICENSE
+                       Version 3, 29 June 2007
+
+ Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+                            Preamble
+
+  The GNU General Public License is a free, copyleft license for
+software and other kinds of works.
+
+  The licenses for most software and other practical works are designed
+to take away your freedom to share and change the works.  By contrast,
+the GNU General Public License is intended to guarantee your freedom to
+share and change all versions of a program--to make sure it remains free
+software for all its users.  We, the Free Software Foundation, use the
+GNU General Public License for most of our software; it applies also to
+any other work released this way by its authors.  You can apply it to
+your programs, too.
+
+  When we speak of free software, we are referring to freedom, not
+price.  Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+them if you wish), that you receive source code or can get it if you
+want it, that you can change the software or use pieces of it in new
+free programs, and that you know you can do these things.
+
+  To protect your rights, we need to prevent others from denying you
+these rights or asking you to surrender the rights.  Therefore, you have
+certain responsibilities if you distribute copies of the software, or if
+you modify it: responsibilities to respect the freedom of others.
+
+  For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must pass on to the recipients the same
+freedoms that you received.  You must make sure that they, too, receive
+or can get the source code.  And you must show them these terms so they
+know their rights.
+
+  Developers that use the GNU GPL protect your rights with two steps:
+(1) assert copyright on the software, and (2) offer you this License
+giving you legal permission to copy, distribute and/or modify it.
+
+  For the developers' and authors' protection, the GPL clearly explains
+that there is no warranty for this free software.  For both users' and
+authors' sake, the GPL requires that modified versions be marked as
+changed, so that their problems will not be attributed erroneously to
+authors of previous versions.
+
+  Some devices are designed to deny users access to install or run
+modified versions of the software inside them, although the manufacturer
+can do so.  This is fundamentally incompatible with the aim of
+protecting users' freedom to change the software.  The systematic
+pattern of such abuse occurs in the area of products for individuals to
+use, which is precisely where it is most unacceptable.  Therefore, we
+have designed this version of the GPL to prohibit the practice for those
+products.  If such problems arise substantially in other domains, we
+stand ready to extend this provision to those domains in future versions
+of the GPL, as needed to protect the freedom of users.
+
+  Finally, every program is threatened constantly by software patents.
+States should not allow patents to restrict development and use of
+software on general-purpose computers, but in those that do, we wish to
+avoid the special danger that patents applied to a free program could
+make it effectively proprietary.  To prevent this, the GPL assures that
+patents cannot be used to render the program non-free.
+
+  The precise terms and conditions for copying, distribution and
+modification follow.
+
+                       TERMS AND CONDITIONS
+
+  0. Definitions.
+
+  "This License" refers to version 3 of the GNU General Public License.
+
+  "Copyright" also means copyright-like laws that apply to other kinds of
+works, such as semiconductor masks.
+
+  "The Program" refers to any copyrightable work licensed under this
+License.  Each licensee is addressed as "you".  "Licensees" and
+"recipients" may be individuals or organizations.
+
+  To "modify" a work means to copy from or adapt all or part of the work
+in a fashion requiring copyright permission, other than the making of an
+exact copy.  The resulting work is called a "modified version" of the
+earlier work or a work "based on" the earlier work.
+
+  A "covered work" means either the unmodified Program or a work based
+on the Program.
+
+  To "propagate" a work means to do anything with it that, without
+permission, would make you directly or secondarily liable for
+infringement under applicable copyright law, except executing it on a
+computer or modifying a private copy.  Propagation includes copying,
+distribution (with or without modification), making available to the
+public, and in some countries other activities as well.
+
+  To "convey" a work means any kind of propagation that enables other
+parties to make or receive copies.  Mere interaction with a user through
+a computer network, with no transfer of a copy, is not conveying.
+
+  An interactive user interface displays "Appropriate Legal Notices"
+to the extent that it includes a convenient and prominently visible
+feature that (1) displays an appropriate copyright notice, and (2)
+tells the user that there is no warranty for the work (except to the
+extent that warranties are provided), that licensees may convey the
+work under this License, and how to view a copy of this License.  If
+the interface presents a list of user commands or options, such as a
+menu, a prominent item in the list meets this criterion.
+
+  1. Source Code.
+
+  The "source code" for a work means the preferred form of the work
+for making modifications to it.  "Object code" means any non-source
+form of a work.
+
+  A "Standard Interface" means an interface that either is an official
+standard defined by a recognized standards body, or, in the case of
+interfaces specified for a particular programming language, one that
+is widely used among developers working in that language.
+
+  The "System Libraries" of an executable work include anything, other
+than the work as a whole, that (a) is included in the normal form of
+packaging a Major Component, but which is not part of that Major
+Component, and (b) serves only to enable use of the work with that
+Major Component, or to implement a Standard Interface for which an
+implementation is available to the public in source code form.  A
+"Major Component", in this context, means a major essential component
+(kernel, window system, and so on) of the specific operating system
+(if any) on which the executable work runs, or a compiler used to
+produce the work, or an object code interpreter used to run it.
+
+  The "Corresponding Source" for a work in object code form means all
+the source code needed to generate, install, and (for an executable
+work) run the object code and to modify the work, including scripts to
+control those activities.  However, it does not include the work's
+System Libraries, or general-purpose tools or generally available free
+programs which are used unmodified in performing those activities but
+which are not part of the work.  For example, Corresponding Source
+includes interface definition files associated with source files for
+the work, and the source code for shared libraries and dynamically
+linked subprograms that the work is specifically designed to require,
+such as by intimate data communication or control flow between those
+subprograms and other parts of the work.
+
+  The Corresponding Source need not include anything that users
+can regenerate automatically from other parts of the Corresponding
+Source.
+
+  The Corresponding Source for a work in source code form is that
+same work.
+
+  2. Basic Permissions.
+
+  All rights granted under this License are granted for the term of
+copyright on the Program, and are irrevocable provided the stated
+conditions are met.  This License explicitly affirms your unlimited
+permission to run the unmodified Program.  The output from running a
+covered work is covered by this License only if the output, given its
+content, constitutes a covered work.  This License acknowledges your
+rights of fair use or other equivalent, as provided by copyright law.
+
+  You may make, run and propagate covered works that you do not
+convey, without conditions so long as your license otherwise remains
+in force.  You may convey covered works to others for the sole purpose
+of having them make modifications exclusively for you, or provide you
+with facilities for running those works, provided that you comply with
+the terms of this License in conveying all material for which you do
+not control copyright.  Those thus making or running the covered works
+for you must do so exclusively on your behalf, under your direction
+and control, on terms that prohibit them from making any copies of
+your copyrighted material outside their relationship with you.
+
+  Conveying under any other circumstances is permitted solely under
+the conditions stated below.  Sublicensing is not allowed; section 10
+makes it unnecessary.
+
+  3. Protecting Users' Legal Rights From Anti-Circumvention Law.
+
+  No covered work shall be deemed part of an effective technological
+measure under any applicable law fulfilling obligations under article
+11 of the WIPO copyright treaty adopted on 20 December 1996, or
+similar laws prohibiting or restricting circumvention of such
+measures.
+
+  When you convey a covered work, you waive any legal power to forbid
+circumvention of technological measures to the extent such circumvention
+is effected by exercising rights under this License with respect to
+the covered work, and you disclaim any intention to limit operation or
+modification of the work as a means of enforcing, against the work's
+users, your or third parties' legal rights to forbid circumvention of
+technological measures.
+
+  4. Conveying Verbatim Copies.
+
+  You may convey verbatim copies of the Program's source code as you
+receive it, in any medium, provided that you conspicuously and
+appropriately publish on each copy an appropriate copyright notice;
+keep intact all notices stating that this License and any
+non-permissive terms added in accord with section 7 apply to the code;
+keep intact all notices of the absence of any warranty; and give all
+recipients a copy of this License along with the Program.
+
+  You may charge any price or no price for each copy that you convey,
+and you may offer support or warranty protection for a fee.
+
+  5. Conveying Modified Source Versions.
+
+  You may convey a work based on the Program, or the modifications to
+produce it from the Program, in the form of source code under the
+terms of section 4, provided that you also meet all of these conditions:
+
+    a) The work must carry prominent notices stating that you modified
+    it, and giving a relevant date.
+
+    b) The work must carry prominent notices stating that it is
+    released under this License and any conditions added under section
+    7.  This requirement modifies the requirement in section 4 to
+    "keep intact all notices".
+
+    c) You must license the entire work, as a whole, under this
+    License to anyone who comes into possession of a copy.  This
+    License will therefore apply, along with any applicable section 7
+    additional terms, to the whole of the work, and all its parts,
+    regardless of how they are packaged.  This License gives no
+    permission to license the work in any other way, but it does not
+    invalidate such permission if you have separately received it.
+
+    d) If the work has interactive user interfaces, each must display
+    Appropriate Legal Notices; however, if the Program has interactive
+    interfaces that do not display Appropriate Legal Notices, your
+    work need not make them do so.
+
+  A compilation of a covered work with other separate and independent
+works, which are not by their nature extensions of the covered work,
+and which are not combined with it such as to form a larger program,
+in or on a volume of a storage or distribution medium, is called an
+"aggregate" if the compilation and its resulting copyright are not
+used to limit the access or legal rights of the compilation's users
+beyond what the individual works permit.  Inclusion of a covered work
+in an aggregate does not cause this License to apply to the other
+parts of the aggregate.
+
+  6. Conveying Non-Source Forms.
+
+  You may convey a covered work in object code form under the terms
+of sections 4 and 5, provided that you also convey the
+machine-readable Corresponding Source under the terms of this License,
+in one of these ways:
+
+    a) Convey the object code in, or embodied in, a physical product
+    (including a physical distribution medium), accompanied by the
+    Corresponding Source fixed on a durable physical medium
+    customarily used for software interchange.
+
+    b) Convey the object code in, or embodied in, a physical product
+    (including a physical distribution medium), accompanied by a
+    written offer, valid for at least three years and valid for as
+    long as you offer spare parts or customer support for that product
+    model, to give anyone who possesses the object code either (1) a
+    copy of the Corresponding Source for all the software in the
+    product that is covered by this License, on a durable physical
+    medium customarily used for software interchange, for a price no
+    more than your reasonable cost of physically performing this
+    conveying of source, or (2) access to copy the
+    Corresponding Source from a network server at no charge.
+
+    c) Convey individual copies of the object code with a copy of the
+    written offer to provide the Corresponding Source.  This
+    alternative is allowed only occasionally and noncommercially, and
+    only if you received the object code with such an offer, in accord
+    with subsection 6b.
+
+    d) Convey the object code by offering access from a designated
+    place (gratis or for a charge), and offer equivalent access to the
+    Corresponding Source in the same way through the same place at no
+    further charge.  You need not require recipients to copy the
+    Corresponding Source along with the object code.  If the place to
+    copy the object code is a network server, the Corresponding Source
+    may be on a different server (operated by you or a third party)
+    that supports equivalent copying facilities, provided you maintain
+    clear directions next to the object code saying where to find the
+    Corresponding Source.  Regardless of what server hosts the
+    Corresponding Source, you remain obligated to ensure that it is
+    available for as long as needed to satisfy these requirements.
+
+    e) Convey the object code using peer-to-peer transmission, provided
+    you inform other peers where the object code and Corresponding
+    Source of the work are being offered to the general public at no
+    charge under subsection 6d.
+
+  A separable portion of the object code, whose source code is excluded
+from the Corresponding Source as a System Library, need not be
+included in conveying the object code work.
+
+  A "User Product" is either (1) a "consumer product", which means any
+tangible personal property which is normally used for personal, family,
+or household purposes, or (2) anything designed or sold for incorporation
+into a dwelling.  In determining whether a product is a consumer product,
+doubtful cases shall be resolved in favor of coverage.  For a particular
+product received by a particular user, "normally used" refers to a
+typical or common use of that class of product, regardless of the status
+of the particular user or of the way in which the particular user
+actually uses, or expects or is expected to use, the product.  A product
+is a consumer product regardless of whether the product has substantial
+commercial, industrial or non-consumer uses, unless such uses represent
+the only significant mode of use of the product.
+
+  "Installation Information" for a User Product means any methods,
+procedures, authorization keys, or other information required to install
+and execute modified versions of a covered work in that User Product from
+a modified version of its Corresponding Source.  The information must
+suffice to ensure that the continued functioning of the modified object
+code is in no case prevented or interfered with solely because
+modification has been made.
+
+  If you convey an object code work under this section in, or with, or
+specifically for use in, a User Product, and the conveying occurs as
+part of a transaction in which the right of possession and use of the
+User Product is transferred to the recipient in perpetuity or for a
+fixed term (regardless of how the transaction is characterized), the
+Corresponding Source conveyed under this section must be accompanied
+by the Installation Information.  But this requirement does not apply
+if neither you nor any third party retains the ability to install
+modified object code on the User Product (for example, the work has
+been installed in ROM).
+
+  The requirement to provide Installation Information does not include a
+requirement to continue to provide support service, warranty, or updates
+for a work that has been modified or installed by the recipient, or for
+the User Product in which it has been modified or installed.  Access to a
+network may be denied when the modification itself materially and
+adversely affects the operation of the network or violates the rules and
+protocols for communication across the network.
+
+  Corresponding Source conveyed, and Installation Information provided,
+in accord with this section must be in a format that is publicly
+documented (and with an implementation available to the public in
+source code form), and must require no special password or key for
+unpacking, reading or copying.
+
+  7. Additional Terms.
+
+  "Additional permissions" are terms that supplement the terms of this
+License by making exceptions from one or more of its conditions.
+Additional permissions that are applicable to the entire Program shall
+be treated as though they were included in this License, to the extent
+that they are valid under applicable law.  If additional permissions
+apply only to part of the Program, that part may be used separately
+under those permissions, but the entire Program remains governed by
+this License without regard to the additional permissions.
+
+  When you convey a copy of a covered work, you may at your option
+remove any additional permissions from that copy, or from any part of
+it.  (Additional permissions may be written to require their own
+removal in certain cases when you modify the work.)  You may place
+additional permissions on material, added by you to a covered work,
+for which you have or can give appropriate copyright permission.
+
+  Notwithstanding any other provision of this License, for material you
+add to a covered work, you may (if authorized by the copyright holders of
+that material) supplement the terms of this License with terms:
+
+    a) Disclaiming warranty or limiting liability differently from the
+    terms of sections 15 and 16 of this License; or
+
+    b) Requiring preservation of specified reasonable legal notices or
+    author attributions in that material or in the Appropriate Legal
+    Notices displayed by works containing it; or
+
+    c) Prohibiting misrepresentation of the origin of that material, or
+    requiring that modified versions of such material be marked in
+    reasonable ways as different from the original version; or
+
+    d) Limiting the use for publicity purposes of names of licensors or
+    authors of the material; or
+
+    e) Declining to grant rights under trademark law for use of some
+    trade names, trademarks, or service marks; or
+
+    f) Requiring indemnification of licensors and authors of that
+    material by anyone who conveys the material (or modified versions of
+    it) with contractual assumptions of liability to the recipient, for
+    any liability that these contractual assumptions directly impose on
+    those licensors and authors.
+
+  All other non-permissive additional terms are considered "further
+restrictions" within the meaning of section 10.  If the Program as you
+received it, or any part of it, contains a notice stating that it is
+governed by this License along with a term that is a further
+restriction, you may remove that term.  If a license document contains
+a further restriction but permits relicensing or conveying under this
+License, you may add to a covered work material governed by the terms
+of that license document, provided that the further restriction does
+not survive such relicensing or conveying.
+
+  If you add terms to a covered work in accord with this section, you
+must place, in the relevant source files, a statement of the
+additional terms that apply to those files, or a notice indicating
+where to find the applicable terms.
+
+  Additional terms, permissive or non-permissive, may be stated in the
+form of a separately written license, or stated as exceptions;
+the above requirements apply either way.
+
+  8. Termination.
+
+  You may not propagate or modify a covered work except as expressly
+provided under this License.  Any attempt otherwise to propagate or
+modify it is void, and will automatically terminate your rights under
+this License (including any patent licenses granted under the third
+paragraph of section 11).
+
+  However, if you cease all violation of this License, then your
+license from a particular copyright holder is reinstated (a)
+provisionally, unless and until the copyright holder explicitly and
+finally terminates your license, and (b) permanently, if the copyright
+holder fails to notify you of the violation by some reasonable means
+prior to 60 days after the cessation.
+
+  Moreover, your license from a particular copyright holder is
+reinstated permanently if the copyright holder notifies you of the
+violation by some reasonable means, this is the first time you have
+received notice of violation of this License (for any work) from that
+copyright holder, and you cure the violation prior to 30 days after
+your receipt of the notice.
+
+  Termination of your rights under this section does not terminate the
+licenses of parties who have received copies or rights from you under
+this License.  If your rights have been terminated and not permanently
+reinstated, you do not qualify to receive new licenses for the same
+material under section 10.
+
+  9. Acceptance Not Required for Having Copies.
+
+  You are not required to accept this License in order to receive or
+run a copy of the Program.  Ancillary propagation of a covered work
+occurring solely as a consequence of using peer-to-peer transmission
+to receive a copy likewise does not require acceptance.  However,
+nothing other than this License grants you permission to propagate or
+modify any covered work.  These actions infringe copyright if you do
+not accept this License.  Therefore, by modifying or propagating a
+covered work, you indicate your acceptance of this License to do so.
+
+  10. Automatic Licensing of Downstream Recipients.
+
+  Each time you convey a covered work, the recipient automatically
+receives a license from the original licensors, to run, modify and
+propagate that work, subject to this License.  You are not responsible
+for enforcing compliance by third parties with this License.
+
+  An "entity transaction" is a transaction transferring control of an
+organization, or substantially all assets of one, or subdividing an
+organization, or merging organizations.  If propagation of a covered
+work results from an entity transaction, each party to that
+transaction who receives a copy of the work also receives whatever
+licenses to the work the party's predecessor in interest had or could
+give under the previous paragraph, plus a right to possession of the
+Corresponding Source of the work from the predecessor in interest, if
+the predecessor has it or can get it with reasonable efforts.
+
+  You may not impose any further restrictions on the exercise of the
+rights granted or affirmed under this License.  For example, you may
+not impose a license fee, royalty, or other charge for exercise of
+rights granted under this License, and you may not initiate litigation
+(including a cross-claim or counterclaim in a lawsuit) alleging that
+any patent claim is infringed by making, using, selling, offering for
+sale, or importing the Program or any portion of it.
+
+  11. Patents.
+
+  A "contributor" is a copyright holder who authorizes use under this
+License of the Program or a work on which the Program is based.  The
+work thus licensed is called the contributor's "contributor version".
+
+  A contributor's "essential patent claims" are all patent claims
+owned or controlled by the contributor, whether already acquired or
+hereafter acquired, that would be infringed by some manner, permitted
+by this License, of making, using, or selling its contributor version,
+but do not include claims that would be infringed only as a
+consequence of further modification of the contributor version.  For
+purposes of this definition, "control" includes the right to grant
+patent sublicenses in a manner consistent with the requirements of
+this License.
+
+  Each contributor grants you a non-exclusive, worldwide, royalty-free
+patent license under the contributor's essential patent claims, to
+make, use, sell, offer for sale, import and otherwise run, modify and
+propagate the contents of its contributor version.
+
+  In the following three paragraphs, a "patent license" is any express
+agreement or commitment, however denominated, not to enforce a patent
+(such as an express permission to practice a patent or covenant not to
+sue for patent infringement).  To "grant" such a patent license to a
+party means to make such an agreement or commitment not to enforce a
+patent against the party.
+
+  If you convey a covered work, knowingly relying on a patent license,
+and the Corresponding Source of the work is not available for anyone
+to copy, free of charge and under the terms of this License, through a
+publicly available network server or other readily accessible means,
+then you must either (1) cause the Corresponding Source to be so
+available, or (2) arrange to deprive yourself of the benefit of the
+patent license for this particular work, or (3) arrange, in a manner
+consistent with the requirements of this License, to extend the patent
+license to downstream recipients.  "Knowingly relying" means you have
+actual knowledge that, but for the patent license, your conveying the
+covered work in a country, or your recipient's use of the covered work
+in a country, would infringe one or more identifiable patents in that
+country that you have reason to believe are valid.
+
+  If, pursuant to or in connection with a single transaction or
+arrangement, you convey, or propagate by procuring conveyance of, a
+covered work, and grant a patent license to some of the parties
+receiving the covered work authorizing them to use, propagate, modify
+or convey a specific copy of the covered work, then the patent license
+you grant is automatically extended to all recipients of the covered
+work and works based on it.
+
+  A patent license is "discriminatory" if it does not include within
+the scope of its coverage, prohibits the exercise of, or is
+conditioned on the non-exercise of one or more of the rights that are
+specifically granted under this License.  You may not convey a covered
+work if you are a party to an arrangement with a third party that is
+in the business of distributing software, under which you make payment
+to the third party based on the extent of your activity of conveying
+the work, and under which the third party grants, to any of the
+parties who would receive the covered work from you, a discriminatory
+patent license (a) in connection with copies of the covered work
+conveyed by you (or copies made from those copies), or (b) primarily
+for and in connection with specific products or compilations that
+contain the covered work, unless you entered into that arrangement,
+or that patent license was granted, prior to 28 March 2007.
+
+  Nothing in this License shall be construed as excluding or limiting
+any implied license or other defenses to infringement that may
+otherwise be available to you under applicable patent law.
+
+  12. No Surrender of Others' Freedom.
+
+  If conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License.  If you cannot convey a
+covered work so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you may
+not convey it at all.  For example, if you agree to terms that obligate you
+to collect a royalty for further conveying from those to whom you convey
+the Program, the only way you could satisfy both those terms and this
+License would be to refrain entirely from conveying the Program.
+
+  13. Use with the GNU Affero General Public License.
+
+  Notwithstanding any other provision of this License, you have
+permission to link or combine any covered work with a work licensed
+under version 3 of the GNU Affero General Public License into a single
+combined work, and to convey the resulting work.  The terms of this
+License will continue to apply to the part which is the covered work,
+but the special requirements of the GNU Affero General Public License,
+section 13, concerning interaction through a network will apply to the
+combination as such.
+
+  14. Revised Versions of this License.
+
+  The Free Software Foundation may publish revised and/or new versions of
+the GNU General Public License from time to time.  Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+  Each version is given a distinguishing version number.  If the
+Program specifies that a certain numbered version of the GNU General
+Public License "or any later version" applies to it, you have the
+option of following the terms and conditions either of that numbered
+version or of any later version published by the Free Software
+Foundation.  If the Program does not specify a version number of the
+GNU General Public License, you may choose any version ever published
+by the Free Software Foundation.
+
+  If the Program specifies that a proxy can decide which future
+versions of the GNU General Public License can be used, that proxy's
+public statement of acceptance of a version permanently authorizes you
+to choose that version for the Program.
+
+  Later license versions may give you additional or different
+permissions.  However, no additional obligations are imposed on any
+author or copyright holder as a result of your choosing to follow a
+later version.
+
+  15. Disclaimer of Warranty.
+
+  THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
+APPLICABLE LAW.  EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
+HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
+OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
+THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
+IS WITH YOU.  SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
+ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+  16. Limitation of Liability.
+
+  IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
+THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
+GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
+USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
+DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
+PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
+EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
+SUCH DAMAGES.
+
+  17. Interpretation of Sections 15 and 16.
+
+  If the disclaimer of warranty and limitation of liability provided
+above cannot be given local legal effect according to their terms,
+reviewing courts shall apply local law that most closely approximates
+an absolute waiver of all civil liability in connection with the
+Program, unless a warranty or assumption of liability accompanies a
+copy of the Program in return for a fee.
+
+                     END OF TERMS AND CONDITIONS
+
+            How to Apply These Terms to Your New Programs
+
+  If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+  To do so, attach the following notices to the program.  It is safest
+to attach them to the start of each source file to most effectively
+state the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+    <one line to give the program's name and a brief idea of what it does.>
+    Copyright (C) <year>  <name of author>
+
+    This program is free software: you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation, either version 3 of the License, or
+    (at your option) any later version.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+Also add information on how to contact you by electronic and paper mail.
+
+  If the program does terminal interaction, make it output a short
+notice like this when it starts in an interactive mode:
+
+    <program>  Copyright (C) <year>  <name of author>
+    This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+    This is free software, and you are welcome to redistribute it
+    under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License.  Of course, your program's commands
+might be different; for a GUI interface, you would use an "about box".
+
+  You should also get your employer (if you work as a programmer) or school,
+if any, to sign a "copyright disclaimer" for the program, if necessary.
+For more information on this, and how to apply and follow the GNU GPL, see
+<http://www.gnu.org/licenses/>.
+
+  The GNU General Public License does not permit incorporating your program
+into proprietary programs.  If your program is a subroutine library, you
+may consider it more useful to permit linking proprietary applications with
+the library.  If this is what you want to do, use the GNU Lesser General
+Public License instead of this License.  But first, please read
+<http://www.gnu.org/philosophy/why-not-lgpl.html>.
diff --git a/MANIFEST.in b/MANIFEST.in
new file mode 100644
index 0000000..5343ad8
--- /dev/null
+++ b/MANIFEST.in
@@ -0,0 +1,9 @@
+include INSTALL
+include README
+include TODO
+include COPYRIGHT
+include CHANGELOG
+include LICENSE
+include *.xml
+include *.odt
+include *.csv
diff --git a/PKG-INFO b/PKG-INFO
new file mode 100644
index 0000000..ede2361
--- /dev/null
+++ b/PKG-INFO
@@ -0,0 +1,34 @@
+Metadata-Version: 1.0
+Name: trytond_purchase
+Version: 1.0.0
+Summary: Define purchase order.
+Add product supplier and purchase informations.
+Define the purchase price as the supplier price or the cost price.
+
+With the possibilities:
+    - to follow invoice and packing states from the purchase order.
+    - to define invoice method:
+        - Manual
+        - Based On Order
+        - Based On Packing
+
+Home-page: http://www.tryton.org/
+Author: B2CK
+Author-email: info at b2ck.com
+License: GPL-3
+Description: UNKNOWN
+Platform: UNKNOWN
+Classifier: Development Status :: 5 - Production/Stable
+Classifier: Environment :: Plugins
+Classifier: Intended Audience :: Developers
+Classifier: Intended Audience :: Financial and Insurance Industry
+Classifier: Intended Audience :: Legal Industry
+Classifier: License :: OSI Approved :: GNU General Public License (GPL)
+Classifier: Natural Language :: English
+Classifier: Natural Language :: French
+Classifier: Natural Language :: German
+Classifier: Natural Language :: Spanish
+Classifier: Operating System :: OS Independent
+Classifier: Programming Language :: Python
+Classifier: Topic :: Office/Business
+Classifier: Topic :: Office/Business :: Financial :: Accounting
diff --git a/README b/README
new file mode 100644
index 0000000..7e233b2
--- /dev/null
+++ b/README
@@ -0,0 +1,36 @@
+trytond_purchase
+================
+
+The purchase module of the Tryton application platform.
+See __tryton__.py
+
+Installing
+----------
+
+See INSTALL
+
+Support
+-------
+
+If you encounter any problems with Tryton, please don't hesitate to ask
+questions on the Tryton bug tracker, mailing list, wiki or IRC channel:
+
+  http://bugs.tryton.org/
+  http://groups.tryton.org/
+  http://wiki.tryton.org/
+  irc://irc.freenode.net/tryton
+
+License
+-------
+
+See LICENSE
+
+Copyright
+---------
+
+See COPYRIGHT
+
+
+For more information please visit the Tryton web site:
+
+  http://www.tryton.org/
diff --git a/TODO b/TODO
new file mode 100644
index 0000000..2a0a2cc
--- /dev/null
+++ b/TODO
@@ -0,0 +1,4 @@
+- Add button to recreate move when in exception
+- Add button to recreate invoice when in exception
+- Add form_relate from party to party's purchase
+- Add historization of quotation
diff --git a/__init__.py b/__init__.py
new file mode 100644
index 0000000..dda1fb6
--- /dev/null
+++ b/__init__.py
@@ -0,0 +1,3 @@
+#This file is part of Tryton.  The COPYRIGHT file at the top level of this repository contains the full copyright notices and license terms.
+
+from purchase import *
diff --git a/__tryton__.py b/__tryton__.py
new file mode 100644
index 0000000..f5476cd
--- /dev/null
+++ b/__tryton__.py
@@ -0,0 +1,79 @@
+#This file is part of Tryton.  The COPYRIGHT file at the top level of
+#this repository contains the full copyright notices and license terms.
+{
+    'name': 'Purchase',
+    'name_de_DE': 'Einkauf',
+    'name_fr_FR': 'Achat',
+    'name_es_ES': 'Compras',
+    'version': '1.0.0',
+    'author': 'B2CK',
+    'email': 'info at b2ck.com',
+    'website': 'http://www.tryton.org/',
+    'description': '''Define purchase order.
+Add product supplier and purchase informations.
+Define the purchase price as the supplier price or the cost price.
+
+With the possibilities:
+    - to follow invoice and packing states from the purchase order.
+    - to define invoice method:
+        - Manual
+        - Based On Order
+        - Based On Packing
+''',
+    'description_de_DE': ''' - Dient der Erstellung von Einkaufsvorgängen (Entwurf, Angebot, Auftrag).
+ - Fügt den Artikeln Lieferanten und Einkaufsinformationen hinzu.
+ - Erlaubt die Definition des Einkaufspreises als Lieferpreis oder Einkaufspreis.
+ - Fügt eine Lieferantenliste hinzu.
+
+Ermöglicht:
+    - die Verfolgung des Status von Rechnungsstellung und Versand für Einkäufe
+    - die Festlegung der Methode für die Rechnungsstellung:
+        - Manuell
+        - Nach Auftrag
+        - Nach Lieferung
+''',
+    'description_fr_FR': '''Defini l'ordre d'achat.
+Ajoute les fournisseurs et les informations d'achat sur le produit.
+Défini un prix d'achat par fournisseur et un prix de revient.
+
+Avec la possibilité:
+    - de suivre les états de la facture et du colis depuis la commande d'achat.
+    - de choisir la méthode de facturation:
+        - Manuelle
+        - Sur base de la commande
+        - Sur base du colis
+''',
+    'description_es_ES': ''' - Definición de orden de compras.
+ - Se añade información de proveedor y de compra de un producto.
+ - Se define el precio de compra con el precio de proveedor o costo.
+
+ - Con la posibilidad de:
+    - seguir el estado de facturación y empaque desde la orden de compra.
+    - elegir el método de facturación:
+        - Manual
+        - Basado en Orden
+        - Basado en Empaque
+''',
+
+    'depends': [
+        'company',
+        'party',
+        'stock',
+        'account',
+        'product',
+        'account_invoice',
+        'workflow',
+        'res',
+        'ir',
+        'currency',
+        'account_product',
+    ],
+    'xml': [
+        'purchase.xml',
+    ],
+    'translation': [
+        'de_DE.csv',
+        'es_ES.csv',
+        'fr_FR.csv',
+    ],
+}
diff --git a/de_DE.csv b/de_DE.csv
new file mode 100644
index 0000000..51863f7
--- /dev/null
+++ b/de_DE.csv
@@ -0,0 +1,168 @@
+type,name,res_id,src,value,fuzzy
+error,account.invoice,0,You can not delete invoices that comes from a purchase!,Aus einem Einkauf stammende Rechnungen können nicht gelöscht werden!,0
+error,purchase.line,0,"It miss an ""account_expense"" default property!","Es ist keine allgemeine Eigenschaft ""Konto Aufwand"" definiert",0
+error,purchase.line,0,The supplier location is required!,Der Lagerort des Lieferanten muss eingegeben werden!,0
+error,purchase.purchase,0,Contact and Invoice addresses must be defined for the quotation.,Kontakt- und Rechnungsadresse müssen für das Angebot angegeben werden.,0
+error,purchase.purchase,0,Invoice addresses must be defined for the quotation.,Die Rechnungsadresse muss für ein Angebot angegeben werden.,0
+field,"product.template,product_suppliers",0,Suppliers,Lieferanten,0
+field,"product.template,purchasable",0,Purchasable,Käuflich,0
+field,"product.template,purchase_uom",0,Purchase UOM,Einheit Einkauf,0
+field,"purchase.line,amount",0,Amount,Betrag,0
+field,"purchase.line,comment",0,Comment,Kommentar,0
+field,"purchase.line,description",0,Description,Bezeichnung,0
+field,"purchase.line,invoice_lines",0,Invoice Lines,Rechnungspositionen,0
+field,"purchase.line,move_done",0,Moves Done,Bewegungen erledigt,0
+field,"purchase.line,move_exception",0,Moves Exception,Bewegungsvorbehalt,0
+field,"purchase.line,moves",0,Moves,Bewegungen,0
+field,"purchase.line,moves_ignored",0,Moves Ignored,Ignorierte Bewegungen,0
+field,"purchase.line,product",0,Product,Artikel,0
+field,"purchase.line,purchase",0,Purchase,Einkauf,0
+field,"purchase.line,quantity",0,Quantity,Menge,0
+field,"purchase.line,sequence",0,Sequence,Sequenz,0
+field,"purchase.line,taxes",0,Taxes,Steuern,0
+field,"purchase.line,type",0,Type,Typ,0
+field,"purchase.line,unit",0,Unit,Einheit,0
+field,"purchase.line,unit_digits",0,Unit Digits,Anzahl Stellen,0
+field,"purchase.line,unit_price",0,Unit Price,Einzelpreis,0
+field,"purchase.product_supplier,code",0,Code,Artikelnummer Lieferant,0
+field,"purchase.product_supplier,company",0,Company,Lieferfirma,0
+field,"purchase.product_supplier,delivery_time",0,Delivery Time,Lieferfrist,0
+field,"purchase.product_supplier,name",0,Name,Name,0
+field,"purchase.product_supplier,party",0,Supplier,Lieferant,0
+field,"purchase.product_supplier.price,product_supplier",0,Supplier,Lieferant,0
+field,"purchase.product_supplier.price,quantity",0,Quantity,Menge,0
+field,"purchase.product_supplier,prices",0,Prices,Preise,0
+field,"purchase.product_supplier.price,unit_price",0,Unit Price,Einzelpreis,0
+field,"purchase.product_supplier,product",0,Product,Artikel,0
+field,"purchase.product_supplier,sequence",0,Sequence,Sequenz,0
+field,"purchase.purchase,comment",0,Comment,Kommentar,0
+field,"purchase.purchase,company",0,Company,Unternehmen,0
+field,"purchase.purchase,contact_address",0,Contact Address,Kontaktadresse,0
+field,"purchase.purchase,currency",0,Currency,Währung,0
+field,"purchase.purchase,currency_digits",0,Currency Digits,Währung (signifikante Stellen),0
+field,"purchase.purchase,description",0,Description,Beschreibung,0
+field,"purchase.purchase,invoice_address",0,Invoice Address,Rechnungsadresse,0
+field,"purchase.purchase,invoice_exception",0,Invoices Exception,Rechnungsvorbehalt,0
+field,"purchase.purchase,invoice_method",0,Invoice Method,Rechnungsstellung,0
+field,"purchase.purchase,invoice_paid",0,Invoices Paid,Bezahlte Rechnungen,0
+field,"purchase.purchase,invoices",0,Invoices,Rechnungen,0
+field,"purchase.purchase,invoices_ignored",0,Invoices Ignored,Ignorierte Rechnungen,0
+field,"purchase.purchase,invoice_state",0,Invoice State,Rechnungsstatus,0
+field,"purchase.purchase,lines",0,Lines,Positionen,0
+field,"purchase.purchase,moves",0,Moves,Bewegungen,0
+field,"purchase.purchase,packing_done",0,Packing Done,Lieferschein erledigt,0
+field,"purchase.purchase,packing_exception",0,Packings Exception,Lieferungsvorbehalt,0
+field,"purchase.purchase,packings",0,Packings,Lieferscheine,0
+field,"purchase.purchase,packing_state",0,Packing State,Lieferstatus,0
+field,"purchase.purchase,party",0,Party,Partei,0
+field,"purchase.purchase,party_lang",0,Party Language,Sprache Partei,0
+field,"purchase.purchase,payment_term",0,Payment Term,Zahlungsbedingung,0
+field,"purchase.purchase,purchase_date",0,Purchase Date,Kaufdatum,0
+field,"purchase.purchase,reference",0,Reference,Referenz,0
+field,"purchase.purchase,state",0,State,Status,0
+field,"purchase.purchase,tax_amount",0,Tax,Steuer,0
+field,"purchase.purchase,total_amount",0,Total,Gesamt,0
+field,"purchase.purchase,untaxed_amount",0,Untaxed,Netto,0
+field,"purchase.purchase,warehouse",0,Warehouse,Warenlager,0
+field,"stock.move,purchase",0,Purchase,Einkauf,0
+field,"stock.move,purchase_currency",0,Purchase Currency,Einkaufswährung,0
+field,"stock.move,purchase_line",0,unknown,unbekannt,0
+field,"stock.move,purchase_quantity",0,Purchase Quantity,Menge Einkauf,0
+field,"stock.move,purchase_unit",0,Purchase Unit,Einheit Einkauf,0
+field,"stock.move,purchase_unit_digits",0,Purchase Unit Digits,Anzahl Stellen Einkauf,0
+field,"stock.move,purchase_unit_price",0,Purchase Unit Price,Einzelpreis Einkauf,0
+field,"stock.move,supplier",0,Supplier,Lieferant,0
+help,"purchase.product_supplier,delivery_time",0,In number of days,In Anzahl von Tagen,0
+help,"purchase.product_supplier.price,quantity",0,Minimal quantity,Mindestmenge,0
+model,"ir.action,name",act_purchase_form_confirmed,Confirmed Purchases,Aufträge (Einkäufe),0
+model,"ir.action,name",act_purchase_form_draft,Draft Purchases,Entwürfe (Einkäufe),0
+model,"ir.action,name",report_purchase,Purchase,Einkauf drucken,0
+model,"ir.action,name",act_purchase_form,Purchases,Einkäufe,0
+model,"ir.action,name",act_purchase_form_quotation,Purchases in Quotation,Angebote (Einkäufe),0
+model,"ir.action,name",act_open_supplier,Suppliers,Lieferanten,0
+model,"ir.sequence,name",sequence_purchase,Purchase,Einkauf,0
+model,"ir.sequence.type,name",sequence_type_purchase,Purchase,Einkauf,0
+model,"ir.ui.menu,name",menu_purchase_form_confirmed,Confirmed Purchases,Aufträge (Einkäufe),0
+model,"ir.ui.menu,name",menu_purchase_form_draft,Draft Purchases,Entwürfe (Einkäufe),0
+model,"ir.ui.menu,name",menu_purchase,Purchase Management,Einkauf,0
+model,"ir.ui.menu,name",menu_purchase_form,Purchases,Einkäufe,0
+model,"ir.ui.menu,name",menu_purchase_form_quotation,Purchases in Quotation,Angebote (Einkäufe),0
+model,"ir.ui.menu,name",menu_supplier,Suppliers,Lieferanten,0
+model,"res.group,name",group_purchase,Purchase,Einkauf,0
+model,"workflow.activity,name",purchase_activity_cancel,Cancel,Abbrechen,0
+model,"workflow.activity,name",purchase_activity_confirmed,Confirmed,Beauftragt,0
+model,"workflow.activity,name",purchase_activity_done,Done,Erledigt,0
+model,"workflow.activity,name",purchase_activity_draft,Draft,Entwurf,0
+model,"workflow.activity,name",purchase_activity_invoice_purchase,Invoice,Rechnung,0
+model,"workflow.activity,name",purchase_activity_invoice_done,Invoice Done,Rechnung erledigt,0
+model,"workflow.activity,name",purchase_activity_invoice_purchase_exception,Invoice Exception,Rechnungsvorbehalt,0
+model,"workflow.activity,name",purchase_activity_invoice_method,Invoice Method,Rechnungsstellung,0
+model,"workflow.activity,name",purchase_activity_invoice_method_done,Invoice Method Done,Rechnungsstellung erledigt,0
+model,"workflow.activity,name",purchase_activity_invoice_packing,Invoice Packing,Lieferschein Rechnung,0
+model,"workflow.activity,name",purchase_activity_invoice_packing_done,Invoice Packing Done,Lieferschein Rechnung erledigt,0
+model,"workflow.activity,name",purchase_activity_invoice_packing_exception,Invoice Packing Exception,Lieferschein Rechnung Vorbehalt,0
+model,"workflow.activity,name",purchase_activity_invoice_packing_method,Invoice Packing Method,Lieferschein Rechnungsstellung,0
+model,"workflow.activity,name",purchase_activity_invoice_packing_method_done,Invoice Packing Method Done,Lieferschein Rechnungsstellung erledigt,0
+model,"workflow.activity,name",purchase_activity_packing,Packing,Lieferschein,0
+model,"workflow.activity,name",purchase_activity_packing_exception,Packing Exception,Lieferschein Vorbehalt,0
+model,"workflow.activity,name",purchase_activity_quotation,Quotation,Angebot,0
+model,"workflow.activity,name",purchase_activity_waiting_invoice_purchase,Waiting Invoice,Rechnung wartend,0
+model,"workflow.activity,name",purchase_activity_waiting_invoice_packing,Waiting Invoice Packing,Rechnung Lieferschein wartend,0
+model,"workflow.activity,name",purchase_activity_waiting_packing,Waiting Packing,Lieferschein wartend,0
+model,"workflow,name",purchase_workflow,Purchase workflow,Workflow Einkauf,0
+odt,purchase.purchase,0,Amount,Betrag,0
+odt,purchase.purchase,0,Date:,Datum:,0
+odt,purchase.purchase,0,Description,Bezeichnung,0
+odt,purchase.purchase,0,Description:,Bezeichnung:,0
+odt,purchase.purchase,0,Draft Purchase Order,Auftragsentwurf,0
+odt,purchase.purchase,0,E-Mail:,E-Mail:,0
+odt,purchase.purchase,0,Phone:,Telefon:,0
+odt,purchase.purchase,0,Purchase Order N°:,Auftrag Nr. ,0
+odt,purchase.purchase,0,Quantity,Menge,0
+odt,purchase.purchase,0,Request for Quotation N°:,Angebotsanfrage Nr.:,0
+odt,purchase.purchase,0,Taxes,Steuern,0
+odt,purchase.purchase,0,Taxes:,Steuern:,0
+odt,purchase.purchase,0,Total:,Gesamt:,0
+odt,purchase.purchase,0,Total (excl. taxes):,Netto:,0
+odt,purchase.purchase,0,Unit Price,Einzelpreis,0
+odt,purchase.purchase,0,VAT:,USt:,0
+selection,"purchase.line,type",0,Line,Position,0
+selection,"purchase.line,type",0,Subtotal,Zwischensumme,0
+selection,"purchase.line,type",0,Title,Überschrift,0
+selection,"purchase.purchase,invoice_method",0,Based On Order,Nach Auftrag,0
+selection,"purchase.purchase,invoice_method",0,Based On Packing,Nach Lieferung,0
+selection,"purchase.purchase,invoice_method",0,Manual,Manuell,0
+selection,"purchase.purchase,invoice_state",0,Exception,Vorbehalt,0
+selection,"purchase.purchase,invoice_state",0,None,Kein,0
+selection,"purchase.purchase,invoice_state",0,Paid,Bezahlt,0
+selection,"purchase.purchase,invoice_state",0,Waiting,Wartend,0
+selection,"purchase.purchase,packing_state",0,Exception,Vorbehalt,0
+selection,"purchase.purchase,packing_state",0,None,Kein,0
+selection,"purchase.purchase,packing_state",0,Received,Erhalten,0
+selection,"purchase.purchase,packing_state",0,Waiting,Wartend,0
+selection,"purchase.purchase,state",0,Cancel,Abbrechen,0
+selection,"purchase.purchase,state",0,Confirmed,Beauftragt,0
+selection,"purchase.purchase,state",0,Done,Erledigt,0
+selection,"purchase.purchase,state",0,Draft,Entwurf,0
+selection,"purchase.purchase,state",0,Quotation,Angebot,0
+view,product.product,0,Product Suppliers,Lieferanten,0
+view,product.product,0,Suppliers,Lieferanten,0
+view,purchase.line,0,Products,Artikel,0
+view,purchase.line,0,Purchase Line,Position Einkauf,0
+view,purchase.line,0,Purchase Lines,Positionen Einkauf,0
+view,purchase.product_supplier,0,Product Supplier,Lieferant,0
+view,purchase.product_supplier,0,Product Suppliers,Lieferanten,0
+view,purchase.product_supplier.price,0,Product Supplier Price,Einkaufspreis,0
+view,purchase.product_supplier.price,0,Product Supplier Prices,Einkaufspreise,0
+view,purchase.purchase,0,Cancel,Abbrechen,0
+view,purchase.purchase,0,Confirm,Beauftragen,0
+view,purchase.purchase,0,Draft,Entwurf,0
+view,purchase.purchase,0,Ignore Invoice Exception,Rechnungsvorbehalt ignorieren,0
+view,purchase.purchase,0,Ignore Packing Exception,Verpackungsvorbehalt ignorieren,0
+view,purchase.purchase,0,Invoices,Rechnungen,0
+view,purchase.purchase,0,Lines,Positionen,0
+view,purchase.purchase,0,Other Info,Sonstiges,0
+view,purchase.purchase,0,Packings,Lieferscheine,0
+view,purchase.purchase,0,Purchase,Einkauf,0
+view,purchase.purchase,0,Purchases,Einkäufe,0
+view,purchase.purchase,0,Quotation,Angebot,0
diff --git a/es_ES.csv b/es_ES.csv
new file mode 100644
index 0000000..e4c8cb6
--- /dev/null
+++ b/es_ES.csv
@@ -0,0 +1,137 @@
+type,name,res_id,src,value,fuzzy
+error,account.invoice,0,You can not delete invoices that comes from a purchase!,No puede borrar facturas que provienen de una compra!,0
+error,purchase.line,0,"It miss an ""account_expense"" default property!","Hace falta la propiedad predeterminada ""cuenta_de_gastos""!",0
+error,purchase.line,0,The supplier location is required!,El lugar del proveedor es indispensable!,0
+error,purchase.purchase,0,Contact and Invoice addresses must be defined for the quotation.,Las direcciones de contacto y facturación deben estar definidas para la cotización.,0
+field,"product.template,product_suppliers",0,Suppliers,Proveedores,0
+field,"product.template,purchasable",0,Purchasable,Comprable,0
+field,"product.template,purchase_uom",0,Purchase UOM,UdM de Compra,0
+field,"purchase.line,amount",0,Amount,Cantidad,0
+field,"purchase.line,comment",0,Comment,Comentario,0
+field,"purchase.line,description",0,Description,Descripción,0
+field,"purchase.line,invoice_lines",0,Invoice Lines,Líneas de Factura,0
+field,"purchase.line,move_done",0,Moves Done,Movimientos Hechos,0
+field,"purchase.line,move_exception",0,Moves Exception,Excepción de Movimientos,0
+field,"purchase.line,moves",0,Moves,Movimientos,0
+field,"purchase.line,moves_ignored",0,Moves Ignored,Movimientos Ignorados,0
+field,"purchase.line,product",0,Product,Producto,0
+field,"purchase.line,purchase",0,Purchase,Compra,0
+field,"purchase.line,quantity",0,Quantity,Cantidad,0
+field,"purchase.line,sequence",0,Sequence,Secuencia,0
+field,"purchase.line,taxes",0,Taxes,Impuestos,0
+field,"purchase.line,type",0,Type,Tipo,0
+field,"purchase.line,unit",0,Unit,Unidad,0
+field,"purchase.line,unit_digits",0,Unit Digits,Dígitos Unitarios,0
+field,"purchase.line,unit_price",0,Unit Price,Precio Unitario,0
+field,"purchase.product_supplier,code",0,Code,Código,0
+field,"purchase.product_supplier,company",0,Company,Compañía,0
+field,"purchase.product_supplier,delivery_time",0,Delivery Time,Hora de Envío,0
+field,"purchase.product_supplier,name",0,Name,Nombre,0
+field,"purchase.product_supplier,party",0,Supplier,Proveedor,0
+field,"purchase.product_supplier.price,product_supplier",0,Supplier,Proveedor,0
+field,"purchase.product_supplier.price,quantity",0,Quantity,Cantidad,0
+field,"purchase.product_supplier,prices",0,Prices,Precios,0
+field,"purchase.product_supplier.price,unit_price",0,Unit Price,Precio Unitario,0
+field,"purchase.product_supplier,product",0,Product,Producto,0
+field,"purchase.product_supplier,sequence",0,Sequence,Secuencia,0
+field,"purchase.purchase,comment",0,Comment,Comentario,0
+field,"purchase.purchase,company",0,Company,Compañía,0
+field,"purchase.purchase,contact_address",0,Contact Address,Dirección de contacto,0
+field,"purchase.purchase,currency",0,Currency,Moneda,0
+field,"purchase.purchase,currency_digits",0,Currency Digits,Dígitos de Moneda,0
+field,"purchase.purchase,description",0,Description,Descripción,0
+field,"purchase.purchase,invoice_address",0,Invoice Address,Dirección de facturación,0
+field,"purchase.purchase,invoice_exception",0,Invoices Exception,Excepciones de Facturas,0
+field,"purchase.purchase,invoice_method",0,Invoice Method,Método de facturación,0
+field,"purchase.purchase,invoice_paid",0,Invoices Paid,Facturas pagas,0
+field,"purchase.purchase,invoices",0,Invoices,Facturas,0
+field,"purchase.purchase,invoices_ignored",0,Invoices Ignored,Facturas Ignoradas,0
+field,"purchase.purchase,invoice_state",0,Invoice State,Estado de Factura,0
+field,"purchase.purchase,lines",0,Lines,Líneas,0
+field,"purchase.purchase,moves",0,Moves,Movimientos,0
+field,"purchase.purchase,packing_done",0,Packing Done,Empaque hecho,0
+field,"purchase.purchase,packing_exception",0,Packings Exception,Excepción de Empaques,0
+field,"purchase.purchase,packings",0,Packings,Empaques,0
+field,"purchase.purchase,packing_state",0,Packing State,Estado de Empaque,0
+field,"purchase.purchase,party",0,Party,Tercero,0
+field,"purchase.purchase,party_lang",0,Party Language,Lenguaje del Tercero,0
+field,"purchase.purchase,payment_term",0,Payment Term,Término de Pago,0
+field,"purchase.purchase,purchase_date",0,Purchase Date,Fecha de Compra,0
+field,"purchase.purchase,reference",0,Reference,Referencia,0
+field,"purchase.purchase,state",0,State,Estado,0
+field,"purchase.purchase,tax_amount",0,Tax,Impuesto,0
+field,"purchase.purchase,total_amount",0,Total,Total,0
+field,"purchase.purchase,untaxed_amount",0,Untaxed,Sin impuesto,0
+field,"purchase.purchase,warehouse",0,Warehouse,Bodega,0
+field,"stock.move,purchase",0,Purchase,Compra,0
+field,"stock.move,purchase_line",0,unknown,desconocid@,0
+field,"stock.move,supplier",0,Supplier,Proveedor,0
+help,"purchase.product_supplier,delivery_time",0,In number of days,En número de días,0
+help,"purchase.product_supplier.price,quantity",0,Minimal quantity,Cantidad Mínima,0
+model,"ir.action,name",act_purchase_form_confirmed,Confirmed Purchases,Compras confirmadas,0
+model,"ir.action,name",act_purchase_form_draft,Draft Purchases,Compras en Borrador,0
+model,"ir.action,name",report_purchase,Purchase,Compra,0
+model,"ir.action,name",act_purchase_form,Purchases,Compras,0
+model,"ir.action,name",act_purchase_form_quotation,Purchases in Quotation,Cotizaciones de Compras,0
+model,"ir.action,name",act_open_supplier,Suppliers,Proveedores,0
+model,"ir.ui.menu,name",menu_purchase_form_confirmed,Confirmed Purchases,Compras confirmadas,0
+model,"ir.ui.menu,name",menu_purchase_form_draft,Draft Purchases,Compras en Borrador,0
+model,"ir.ui.menu,name",menu_purchase,Purchase Management,Gestión de Compras,0
+model,"ir.ui.menu,name",menu_purchase_form,Purchases,Compras,0
+model,"ir.ui.menu,name",menu_purchase_form_quotation,Purchases in Quotation,Cotizaciones de Compras,0
+model,"ir.ui.menu,name",menu_supplier,Suppliers,Proveedores,0
+odt,purchase.purchase,0,Amount,Cantidad,0
+odt,purchase.purchase,0,Date:,Fecha:,0
+odt,purchase.purchase,0,Description,Descripción,0
+odt,purchase.purchase,0,Description:,Descripción:,0
+odt,purchase.purchase,0,Draft Purchase Order,Borrador de Orden de Compra,0
+odt,purchase.purchase,0,E-Mail:,Correo electrónico:,0
+odt,purchase.purchase,0,Phone:,Teléfono:,0
+odt,purchase.purchase,0,Purchase Order N°:,Nº de Orden de Compra:,0
+odt,purchase.purchase,0,Quantity,Cantidad,0
+odt,purchase.purchase,0,Request for Quotation N°:,Solicitud de Factura Nº:,0
+odt,purchase.purchase,0,Taxes,Impuestos,0
+odt,purchase.purchase,0,Taxes:,Impuestos,0
+odt,purchase.purchase,0,Total:,Total:,0
+odt,purchase.purchase,0,Total (excl. taxes):,Total(excl. impuestos):,0
+odt,purchase.purchase,0,Unit Price,Precio Unitario,0
+odt,purchase.purchase,0,VAT:,VAT:,0
+selection,"purchase.line,type",0,Line,Línea,0
+selection,"purchase.line,type",0,Subtotal,Subtotal,0
+selection,"purchase.line,type",0,Title,Título,0
+selection,"purchase.purchase,invoice_method",0,Based On Order,Basado en la orden,0
+selection,"purchase.purchase,invoice_method",0,Based On Packing,Basado en el empaque,0
+selection,"purchase.purchase,invoice_method",0,Manual,Manual,0
+selection,"purchase.purchase,invoice_state",0,Exception,Excepción,0
+selection,"purchase.purchase,invoice_state",0,None,Nada,0
+selection,"purchase.purchase,invoice_state",0,Paid,Pagad@,0
+selection,"purchase.purchase,invoice_state",0,Waiting,En espera,0
+selection,"purchase.purchase,packing_state",0,Exception,Excepción,0
+selection,"purchase.purchase,packing_state",0,None,Nada,0
+selection,"purchase.purchase,packing_state",0,Received,Recibido,0
+selection,"purchase.purchase,packing_state",0,Waiting,En espera,0
+selection,"purchase.purchase,state",0,Cancel,Cancelar,0
+selection,"purchase.purchase,state",0,Confirmed,Confirmado,0
+selection,"purchase.purchase,state",0,Done,Hecho,0
+selection,"purchase.purchase,state",0,Draft,Borrador,0
+selection,"purchase.purchase,state",0,Quotation,Cotización,0
+view,product.product,0,Products,Productos,0
+view,product.product,0,Suppliers,Proveedores,0
+view,purchase.line,0,Purchase Line,Línea de Compra,0
+view,purchase.line,0,Purchase Lines,Líneas de Compra,0
+view,purchase.product_supplier,0,Product Supplier,Proveedor de Producto,0
+view,purchase.product_supplier,0,Product Suppliers,Proveedores de Producto,0
+view,purchase.product_supplier.price,0,Product Supplier Price,Precio de Proveedor de Producto,0
+view,purchase.product_supplier.price,0,Product Supplier Prices,Precios de Proveedor de Producto,0
+view,purchase.purchase,0,Cancel,Cancelar,0
+view,purchase.purchase,0,Confirm,Confirmar,0
+view,purchase.purchase,0,Draft,Borrador,0
+view,purchase.purchase,0,Ignore Invoice Exception,Ignorar excepción de facturación,0
+view,purchase.purchase,0,Ignore Packing Exception,Ignorar excepción de empaque,0
+view,purchase.purchase,0,Invoices,Facturas,0
+view,purchase.purchase,0,Lines,Líneas,0
+view,purchase.purchase,0,Other Info,Otra información,0
+view,purchase.purchase,0,Packings,Empaques,0
+view,purchase.purchase,0,Purchase,Compra,0
+view,purchase.purchase,0,Purchases,Compras,0
+view,purchase.purchase,0,Quotation,Cotización,0
diff --git a/fr_FR.csv b/fr_FR.csv
new file mode 100644
index 0000000..c3133d2
--- /dev/null
+++ b/fr_FR.csv
@@ -0,0 +1,168 @@
+type,name,res_id,src,value,fuzzy
+error,account.invoice,0,You can not delete invoices that comes from a purchase!,Vous ne pouvez pas supprimer des factures provenant d'un achat !,0
+error,purchase.line,0,"It miss an ""account_expense"" default property!","Il manque une propriété""account_expense""",0
+error,purchase.line,0,The supplier location is required!,L'emplacement fournisseur est requis !,0
+error,purchase.purchase,0,Contact and Invoice addresses must be defined for the quotation.,Les adresses de contact et de facture doivent être définie pour le devis.,0
+error,purchase.purchase,0,Invoice addresses must be defined for the quotation.,L'adresse de facturation doit être définie pour le devis.,0
+field,"product.template,product_suppliers",0,Suppliers,Fournisseurs,0
+field,"product.template,purchasable",0,Purchasable,Achetable,0
+field,"product.template,purchase_uom",0,Purchase UOM,UDM à l'achat,0
+field,"purchase.line,amount",0,Amount,Montant,0
+field,"purchase.line,comment",0,Comment,Commentaire,0
+field,"purchase.line,description",0,Description,Description,0
+field,"purchase.line,invoice_lines",0,Invoice Lines,Lignes de factures,0
+field,"purchase.line,move_done",0,Moves Done,Mouvements effectués,0
+field,"purchase.line,move_exception",0,Moves Exception,Mouvements en exception,0
+field,"purchase.line,moves",0,Moves,Mouvements,0
+field,"purchase.line,moves_ignored",0,Moves Ignored,Mouvements ignorés,0
+field,"purchase.line,product",0,Product,Produit,0
+field,"purchase.line,purchase",0,Purchase,Achat,0
+field,"purchase.line,quantity",0,Quantity,Quantité,0
+field,"purchase.line,sequence",0,Sequence,Séquence,0
+field,"purchase.line,taxes",0,Taxes,Taxes,0
+field,"purchase.line,type",0,Type,Type,0
+field,"purchase.line,unit",0,Unit,Unité,0
+field,"purchase.line,unit_digits",0,Unit Digits,Décimales de l'unité,0
+field,"purchase.line,unit_price",0,Unit Price,Prix unitaire,0
+field,"purchase.product_supplier,code",0,Code,Code,0
+field,"purchase.product_supplier,company",0,Company,Companie,0
+field,"purchase.product_supplier,delivery_time",0,Delivery Time,Temps de livraison,0
+field,"purchase.product_supplier,name",0,Name,Nom,0
+field,"purchase.product_supplier,party",0,Supplier,Fournisseur,0
+field,"purchase.product_supplier.price,product_supplier",0,Supplier,Fournisseur,0
+field,"purchase.product_supplier.price,quantity",0,Quantity,Quantité,0
+field,"purchase.product_supplier,prices",0,Prices,Prix,0
+field,"purchase.product_supplier.price,unit_price",0,Unit Price,Prix unitaire,0
+field,"purchase.product_supplier,product",0,Product,Produit,0
+field,"purchase.product_supplier,sequence",0,Sequence,Séquence,0
+field,"purchase.purchase,comment",0,Comment,Commentaire,0
+field,"purchase.purchase,company",0,Company,Companie,0
+field,"purchase.purchase,contact_address",0,Contact Address,Adresse de contact,0
+field,"purchase.purchase,currency",0,Currency,Devise,0
+field,"purchase.purchase,currency_digits",0,Currency Digits,Décimales de la devise,0
+field,"purchase.purchase,description",0,Description,Description,0
+field,"purchase.purchase,invoice_address",0,Invoice Address,Adresse de facturation,0
+field,"purchase.purchase,invoice_exception",0,Invoices Exception,Factures en exception,0
+field,"purchase.purchase,invoice_method",0,Invoice Method,Méthode de facturation,0
+field,"purchase.purchase,invoice_paid",0,Invoices Paid,Factures payées,0
+field,"purchase.purchase,invoices",0,Invoices,Factures,0
+field,"purchase.purchase,invoices_ignored",0,Invoices Ignored,Factures ignorées,0
+field,"purchase.purchase,invoice_state",0,Invoice State,État de la facture,0
+field,"purchase.purchase,lines",0,Lines,Lignes,0
+field,"purchase.purchase,moves",0,Moves,Mouvements,0
+field,"purchase.purchase,packing_done",0,Packing Done,Colisage effectué,0
+field,"purchase.purchase,packing_exception",0,Packings Exception,Colisages en exception,0
+field,"purchase.purchase,packings",0,Packings,Colisages,0
+field,"purchase.purchase,packing_state",0,Packing State,État du colisage,0
+field,"purchase.purchase,party",0,Party,Tiers,0
+field,"purchase.purchase,party_lang",0,Party Language,Langue du tiers,0
+field,"purchase.purchase,payment_term",0,Payment Term,Condition de paiement,0
+field,"purchase.purchase,purchase_date",0,Purchase Date,Date d'achat,0
+field,"purchase.purchase,reference",0,Reference,Référence,0
+field,"purchase.purchase,state",0,State,État,0
+field,"purchase.purchase,tax_amount",0,Tax,Taxe,0
+field,"purchase.purchase,total_amount",0,Total,Total,0
+field,"purchase.purchase,untaxed_amount",0,Untaxed,Non-taxé,0
+field,"purchase.purchase,warehouse",0,Warehouse,Entrepôt,0
+field,"stock.move,purchase",0,Purchase,Achats,0
+field,"stock.move,purchase_currency",0,Purchase Currency,Devise de l'achat,0
+field,"stock.move,purchase_line",0,unknown,inconnu,0
+field,"stock.move,purchase_quantity",0,Purchase Quantity,Quantité d'achat,0
+field,"stock.move,purchase_unit",0,Purchase Unit,Unité d'achat,0
+field,"stock.move,purchase_unit_digits",0,Purchase Unit Digits,Décimales de l'unité d'achat,0
+field,"stock.move,purchase_unit_price",0,Purchase Unit Price,Prix unitaire d'achat,0
+field,"stock.move,supplier",0,Supplier,Fournisseur,0
+help,"purchase.product_supplier,delivery_time",0,In number of days,En nombre de jours,0
+help,"purchase.product_supplier.price,quantity",0,Minimal quantity,Quantité minimale,0
+model,"ir.action,name",act_purchase_form_confirmed,Confirmed Purchases,Achats confirmés,0
+model,"ir.action,name",act_purchase_form_draft,Draft Purchases,Achats brouillons,0
+model,"ir.action,name",report_purchase,Purchase,Achat,0
+model,"ir.action,name",act_purchase_form,Purchases,Achats,0
+model,"ir.action,name",act_purchase_form_quotation,Purchases in Quotation,Devis,0
+model,"ir.action,name",act_open_supplier,Suppliers,Fournisseurs,0
+model,"ir.sequence,name",sequence_purchase,Purchase,Achat,0
+model,"ir.sequence.type,name",sequence_type_purchase,Purchase,Achat,0
+model,"ir.ui.menu,name",menu_purchase_form_confirmed,Confirmed Purchases,Achats confirmé,0
+model,"ir.ui.menu,name",menu_purchase_form_draft,Draft Purchases,Achats brouillons,0
+model,"ir.ui.menu,name",menu_purchase,Purchase Management,Gestion des achats,0
+model,"ir.ui.menu,name",menu_purchase_form,Purchases,Achats,0
+model,"ir.ui.menu,name",menu_purchase_form_quotation,Purchases in Quotation,Devis,0
+model,"ir.ui.menu,name",menu_supplier,Suppliers,Fournisseurs,0
+model,"res.group,name",group_purchase,Purchase,Achat,0
+model,"workflow.activity,name",purchase_activity_cancel,Cancel,Annulé,0
+model,"workflow.activity,name",purchase_activity_confirmed,Confirmed,Confirmé,0
+model,"workflow.activity,name",purchase_activity_done,Done,Fait,0
+model,"workflow.activity,name",purchase_activity_draft,Draft,Brouillon,0
+model,"workflow.activity,name",purchase_activity_invoice_purchase,Invoice,Facture,0
+model,"workflow.activity,name",purchase_activity_invoice_done,Invoice Done,Facture faite,0
+model,"workflow.activity,name",purchase_activity_invoice_purchase_exception,Invoice Exception,Facture en exception,0
+model,"workflow.activity,name",purchase_activity_invoice_method,Invoice Method,Méthode de facturation,0
+model,"workflow.activity,name",purchase_activity_invoice_method_done,Invoice Method Done,Méthode de facturation faite,0
+model,"workflow.activity,name",purchase_activity_invoice_packing,Invoice Packing,Facture colisage,0
+model,"workflow.activity,name",purchase_activity_invoice_packing_done,Invoice Packing Done,Facture Colisage fait,0
+model,"workflow.activity,name",purchase_activity_invoice_packing_exception,Invoice Packing Exception,Facture colisage en exception,0
+model,"workflow.activity,name",purchase_activity_invoice_packing_method,Invoice Packing Method,Méthode facture colisage,0
+model,"workflow.activity,name",purchase_activity_invoice_packing_method_done,Invoice Packing Method Done,Méthode facture colisage fait,0
+model,"workflow.activity,name",purchase_activity_packing,Packing,Colisage,0
+model,"workflow.activity,name",purchase_activity_packing_exception,Packing Exception,Colisage en exception,0
+model,"workflow.activity,name",purchase_activity_quotation,Quotation,Devis,0
+model,"workflow.activity,name",purchase_activity_waiting_invoice_purchase,Waiting Invoice,Facture en attente,0
+model,"workflow.activity,name",purchase_activity_waiting_invoice_packing,Waiting Invoice Packing,Facture colisage en attente,0
+model,"workflow.activity,name",purchase_activity_waiting_packing,Waiting Packing,Colisage en attente,0
+model,"workflow,name",purchase_workflow,Purchase workflow,Workflow d'achat,0
+odt,purchase.purchase,0,Amount,Montant,0
+odt,purchase.purchase,0,Date:,Date:,0
+odt,purchase.purchase,0,Description,Description,0
+odt,purchase.purchase,0,Description:,Description:,0
+odt,purchase.purchase,0,Draft Purchase Order,Commande d'achat,0
+odt,purchase.purchase,0,E-Mail:,E-Mail:,0
+odt,purchase.purchase,0,Phone:,Téléphone,0
+odt,purchase.purchase,0,Purchase Order N°:,Commande d'achat n°:,0
+odt,purchase.purchase,0,Quantity,Quantité,0
+odt,purchase.purchase,0,Request for Quotation N°:,Demande pour le devis n°,0
+odt,purchase.purchase,0,Taxes,Taxes,0
+odt,purchase.purchase,0,Taxes:,Taxes:,0
+odt,purchase.purchase,0,Total:,Total:,0
+odt,purchase.purchase,0,Total (excl. taxes):,Total (htva),0
+odt,purchase.purchase,0,Unit Price,Prix unitaire,0
+odt,purchase.purchase,0,VAT:,TVA:,0
+selection,"purchase.line,type",0,Line,Ligne,0
+selection,"purchase.line,type",0,Subtotal,Sous-total,0
+selection,"purchase.line,type",0,Title,Titre,0
+selection,"purchase.purchase,invoice_method",0,Based On Order,A la commande,0
+selection,"purchase.purchase,invoice_method",0,Based On Packing,A la livraison,0
+selection,"purchase.purchase,invoice_method",0,Manual,Manuel,0
+selection,"purchase.purchase,invoice_state",0,Exception,Exception,0
+selection,"purchase.purchase,invoice_state",0,None,Aucun,0
+selection,"purchase.purchase,invoice_state",0,Paid,Payé,0
+selection,"purchase.purchase,invoice_state",0,Waiting,En attente,0
+selection,"purchase.purchase,packing_state",0,Exception,Exception,0
+selection,"purchase.purchase,packing_state",0,None,Aucun,0
+selection,"purchase.purchase,packing_state",0,Received,Reçu,0
+selection,"purchase.purchase,packing_state",0,Waiting,En attente,0
+selection,"purchase.purchase,state",0,Cancel,Annulé,0
+selection,"purchase.purchase,state",0,Confirmed,Confirmé,0
+selection,"purchase.purchase,state",0,Done,Fait,0
+selection,"purchase.purchase,state",0,Draft,Brouillon,0
+selection,"purchase.purchase,state",0,Quotation,Devis,0
+view,product.product,0,Product Suppliers,Fournisseurs,0
+view,product.product,0,Suppliers,Fournisseurs,0
+view,purchase.line,0,Products,Produits,0
+view,purchase.line,0,Purchase Line,Ligne d'achat,0
+view,purchase.line,0,Purchase Lines,Lignes d'achat,0
+view,purchase.product_supplier,0,Product Supplier,Fournisseur du produit,0
+view,purchase.product_supplier,0,Product Suppliers,Fournisseurs du produit,0
+view,purchase.product_supplier.price,0,Product Supplier Price,Prix du fournisseur du produit,0
+view,purchase.product_supplier.price,0,Product Supplier Prices,Prix du fournisseur du produit,0
+view,purchase.purchase,0,Cancel,Annuler,0
+view,purchase.purchase,0,Confirm,Confirmer,0
+view,purchase.purchase,0,Draft,Brouillon,0
+view,purchase.purchase,0,Ignore Invoice Exception,Ignorer l'exception de facturation,0
+view,purchase.purchase,0,Ignore Packing Exception,Ignorer l'exception de colisage,0
+view,purchase.purchase,0,Invoices,Factures,0
+view,purchase.purchase,0,Lines,Lignes,0
+view,purchase.purchase,0,Other Info,Autre informations,0
+view,purchase.purchase,0,Packings,Colisages,0
+view,purchase.purchase,0,Purchase,Achat,0
+view,purchase.purchase,0,Purchases,Achats,0
+view,purchase.purchase,0,Quotation,Devis,0
diff --git a/purchase.odt b/purchase.odt
new file mode 100644
index 0000000..e73a552
Binary files /dev/null and b/purchase.odt differ
diff --git a/purchase.py b/purchase.py
new file mode 100644
index 0000000..57eb0c1
--- /dev/null
+++ b/purchase.py
@@ -0,0 +1,1642 @@
+#This file is part of Tryton.  The COPYRIGHT file at the top level
+#of this repository contains the full copyright notices and license terms.
+"Purchase"
+
+from trytond.osv import fields, OSV
+from decimal import Decimal
+import datetime
+from trytond.netsvc import LocalService
+from trytond.report import CompanyReport
+from trytond.wizard import Wizard
+
+_STATES = {
+    'readonly': "state != 'draft'",
+}
+
+
+class Purchase(OSV):
+    'Purchase'
+    _name = 'purchase.purchase'
+    _description = __doc__
+
+    company = fields.Many2One('company.company', 'Company', required=True,
+            states={
+                'readonly': "state != 'draft' or bool(lines)",
+            })
+    reference = fields.Char('Reference', size=None, readonly=True, select=1)
+    description = fields.Char('Description', size=None, states=_STATES)
+    state = fields.Selection([
+        ('draft', 'Draft'),
+        ('quotation', 'Quotation'),
+        ('confirmed', 'Confirmed'),
+        ('done', 'Done'),
+        ('cancel', 'Cancel'),
+    ], 'State', readonly=True, required=True)
+    purchase_date = fields.Date('Purchase Date', required=True, states=_STATES)
+    payment_term = fields.Many2One('account.invoice.payment_term',
+        'Payment Term', required=True, states=_STATES)
+    party = fields.Many2One('party.party', 'Party', change_default=True,
+            required=True, states=_STATES, on_change=['party', 'payment_term'],
+            select=1)
+    party_lang = fields.Function('get_function_fields', type='char',
+            string='Party Language', on_change_with=['party'])
+    invoice_address = fields.Many2One('party.address', 'Invoice Address',
+            domain="[('party', '=', party)]", states=_STATES)
+    warehouse = fields.Many2One('stock.location', 'Warehouse',
+            domain=[('type', '=', 'warehouse')], required=True, states=_STATES)
+    currency = fields.Many2One('currency.currency', 'Currency', required=True,
+        states={
+            'readonly': "state != 'draft' or (bool(lines) and bool(currency))",
+        })
+    currency_digits = fields.Function('get_function_fields', type='integer',
+            string='Currency Digits', on_change_with=['currency'])
+    lines = fields.One2Many('purchase.line', 'purchase', 'Lines',
+            states=_STATES, on_change=['lines', 'currency', 'party'])
+    comment = fields.Text('Comment')
+    untaxed_amount = fields.Function('get_function_fields', type='numeric',
+            digits="(16, currency_digits)", string='Untaxed')
+    tax_amount = fields.Function('get_function_fields', type='numeric',
+            digits="(16, currency_digits)", string='Tax')
+    total_amount = fields.Function('get_function_fields', type='numeric',
+            digits="(16, currency_digits)", string='Total')
+    invoice_method = fields.Selection([
+        ('manual', 'Manual'),
+        ('order', 'Based On Order'),
+        ('packing', 'Based On Packing'),
+    ], 'Invoice Method', required=True, states=_STATES)
+    invoice_state = fields.Selection([
+        ('none', 'None'),
+        ('waiting', 'Waiting'),
+        ('paid', 'Paid'),
+        ('exception', 'Exception'),
+    ], 'Invoice State', readonly=True, required=True)
+    invoices = fields.Many2Many('account.invoice', 'purchase_invoices_rel',
+            'purchase', 'invoice', 'Invoices', readonly=True)
+    invoices_ignored = fields.Many2Many('account.invoice',
+            'purchase_invoice_ignored_rel', 'purchase', 'invoice',
+            'Invoices Ignored', readonly=True)
+    invoice_paid = fields.Function('get_function_fields', type='boolean',
+            string='Invoices Paid')
+    invoice_exception = fields.Function('get_function_fields', type='boolean',
+            string='Invoices Exception')
+    packing_state = fields.Selection([
+        ('none', 'None'),
+        ('waiting', 'Waiting'),
+        ('received', 'Received'),
+        ('exception', 'Exception'),
+    ], 'Packing State', readonly=True, required=True)
+    packings = fields.Function('get_function_fields', type='many2many',
+            relation='stock.packing.in', string='Packings')
+    moves = fields.Function('get_function_fields', type='many2many',
+            relation='stock.move', string='Moves')
+    packing_done = fields.Function('get_function_fields', type='boolean',
+            string='Packing Done')
+    packing_exception = fields.Function('get_function_fields', type='boolean',
+            string='Packings Exception')
+
+    def __init__(self):
+        super(Purchase, self).__init__()
+        self._error_messages.update({
+                'invoice_addresse_required': 'Invoice addresses must be '
+                'defined for the quotation.',
+            })
+
+    def default_payment_term(self, cursor, user, context=None):
+        payment_term_obj = self.pool.get('account.invoice.payment_term')
+        payment_term_ids = payment_term_obj.search(cursor, user,
+                self.payment_term._domain, context=context)
+        if len(payment_term_ids) == 1:
+            return payment_term_obj.name_get(cursor, user, payment_term_ids,
+                    context=context)[0]
+        return False
+
+    def default_warehouse(self, cursor, user, context=None):
+        location_obj = self.pool.get('stock.location')
+        location_ids = location_obj.search(cursor, user,
+                self.warehouse._domain, context=context)
+        if len(location_ids) == 1:
+            return location_obj.name_get(cursor, user, location_ids,
+                    context=context)[0]
+        return False
+
+    def default_company(self, cursor, user, context=None):
+        company_obj = self.pool.get('company.company')
+        if context is None:
+            context = {}
+        if context.get('company'):
+            return company_obj.name_get(cursor, user, context['company'],
+                    context=context)[0]
+        return False
+
+    def default_state(self, cursor, user, context=None):
+        return 'draft'
+
+    def default_purchase_date(self, cursor, user, context=None):
+        date_obj = self.pool.get('ir.date')
+        return date_obj.today(cursor, user, context=context)
+
+    def default_currency(self, cursor, user, context=None):
+        company_obj = self.pool.get('company.company')
+        currency_obj = self.pool.get('currency.currency')
+        if context is None:
+            context = {}
+        company = None
+        if context.get('company'):
+            company = company_obj.browse(cursor, user, context['company'],
+                    context=context)
+            return currency_obj.name_get(cursor, user, company.currency.id,
+                    context=context)[0]
+        return False
+
+    def default_currency_digits(self, cursor, user, context=None):
+        company_obj = self.pool.get('company.company')
+        if context is None:
+            context = {}
+        company = None
+        if context.get('company'):
+            company = company_obj.browse(cursor, user, context['company'],
+                    context=context)
+            return company.currency.digits
+        return 2
+
+    def default_invoice_method(self, cursor, user, context=None):
+        return 'order'
+
+    def default_invoice_state(self, cursor, user, context=None):
+        return 'none'
+
+    def default_packing_state(self, cursor, user, context=None):
+        return 'none'
+
+    def on_change_party(self, cursor, user, ids, vals, context=None):
+        party_obj = self.pool.get('party.party')
+        address_obj = self.pool.get('party.address')
+        payment_term_obj = self.pool.get('account.invoice.payment_term')
+        res = {
+            'invoice_address': False,
+            'payment_term': False,
+        }
+        if vals.get('party'):
+            party = party_obj.browse(cursor, user, vals['party'],
+                    context=context)
+            res['invoice_address'] = party_obj.address_get(cursor, user,
+                    party.id, type='invoice', context=context)
+            if party.supplier_payment_term:
+                res['payment_term'] = party.supplier_payment_term.id
+
+        if res['invoice_address']:
+            res['invoice_address'] = address_obj.name_get(cursor, user,
+                    res['invoice_address'], context=context)[0]
+        if res['payment_term']:
+            res['payment_term'] = payment_term_obj.name_get(cursor, user,
+                    res['payment_term'], context=context)[0]
+        else:
+            res['payment_term'] = self.default_payment_term(cursor, user,
+                    context=context)
+        return res
+
+    def on_change_with_currency_digits(self, cursor, user, ids, vals,
+            context=None):
+        currency_obj = self.pool.get('currency.currency')
+        if vals.get('currency'):
+            currency = currency_obj.browse(cursor, user, vals['currency'],
+                    context=context)
+            return currency.digits
+        return 2
+
+    def get_currency_digits(self, cursor, user, purchases, context=None):
+        '''
+        Return the number of digits of the currency for each purchases
+
+        :param cursor: the database cursor
+        :param user: the user id
+        :param purchases: a BrowseRecordList of purchases
+        :param context: the context
+        :return: a dictionary with purchase id as key and
+            number of digits as value
+        '''
+        res = {}
+        for purchase in purchases:
+            res[purchase.id] = purchase.currency.digits
+        return res
+
+    def on_change_with_party_lang(self, cursor, user, ids, vals,
+            context=None):
+        party_obj = self.pool.get('party.party')
+        if vals.get('party'):
+            party = party_obj.browse(cursor, user, vals['party'],
+                    context=context)
+            if party.lang:
+                return party.lang.code
+        return 'en_US'
+
+    def get_tax_context(self, cursor, user, purchase, context=None):
+        party_obj = self.pool.get('party.party')
+        res = {}
+        if isinstance(purchase, dict):
+            if purchase.get('party'):
+                party = party_obj.browse(cursor, user, purchase['party'],
+                        context=context)
+                if party.lang:
+                    res['language'] = party.lang.code
+        else:
+            if purchase.party.lang:
+                res['language'] = purchase.party.lang.code
+        return res
+
+    def on_change_lines(self, cursor, user, ids, vals, context=None):
+        currency_obj = self.pool.get('currency.currency')
+        tax_obj = self.pool.get('account.tax')
+        if context is None:
+            context = {}
+        res = {
+            'untaxed_amount': Decimal('0.0'),
+            'tax_amount': Decimal('0.0'),
+            'total_amount': Decimal('0.0'),
+        }
+        currency = None
+        if vals.get('currency'):
+            currency = currency_obj.browse(cursor, user, vals['currency'],
+                    context=context)
+        if vals.get('lines'):
+            ctx = context.copy()
+            ctx.update(self.get_tax_context(cursor, user, vals,
+                context=context))
+            for line in vals['lines']:
+                if line.get('type', 'line') != 'line':
+                    continue
+                res['untaxed_amount'] += line.get('amount', Decimal('0.0'))
+
+                for tax in tax_obj.compute(cursor, user, line.get('taxes', []),
+                        line.get('unit_price', Decimal('0.0')),
+                        line.get('quantity', 0.0), context=context):
+                    res['tax_amount'] += tax['amount']
+        if currency:
+            res['untaxed_amount'] = currency_obj.round(cursor, user, currency,
+                    res['untaxed_amount'])
+            res['tax_amount'] = currency_obj.round(cursor, user, currency,
+                    res['tax_amount'])
+        res['total_amount'] = res['untaxed_amount'] + res['tax_amount']
+        if currency:
+            res['total_amount'] = currency_obj.round(cursor, user, currency,
+                    res['total_amount'])
+        return res
+
+    def get_function_fields(self, cursor, user, ids, names, args, context=None):
+        '''
+        Function to compute function fields for purchase ids.
+
+        :param cursor: the database cursor
+        :param user: the user id
+        :param ids: the ids of the purchases
+        :param names: the list of field name to compute
+        :param args: optional argument
+        :param context: the context
+        :return: a dictionary with all field names as key and
+            a dictionary as value with id as key
+        '''
+        res = {}
+        purchases = self.browse(cursor, user, ids, context=context)
+        if 'currency_digits' in names:
+            res['currency_digits'] = self.get_currency_digits(cursor, user,
+                    purchases, context=context)
+        if 'party_lang' in names:
+            res['party_lang'] = self.get_party_lang(cursor, user, purchases,
+                    context=context)
+        if 'untaxed_amount' in names:
+            res['untaxed_amount'] = self.get_untaxed_amount(cursor, user,
+                    purchases, context=context)
+        if 'tax_amount' in names:
+            res['tax_amount'] = self.get_tax_amount(cursor, user, purchases,
+                    context=context)
+        if 'total_amount' in names:
+            res['total_amount'] = self.get_total_amount(cursor, user,
+                    purchases, context=context)
+        if 'invoice_paid' in names:
+            res['invoice_paid'] = self.get_invoice_paid(cursor, user,
+                    purchases, context=context)
+        if 'invoice_exception' in names:
+            res['invoice_exception'] = self.get_invoice_exception(cursor, user,
+                    purchases, context=context)
+        if 'packings' in names:
+            res['packings'] = self.get_packings(cursor, user, purchases,
+                    context=context)
+        if 'moves' in names:
+            res['moves'] = self.get_moves(cursor, user, purchases,
+                    context=context)
+        if 'packing_done' in names:
+            res['packing_done'] = self.get_packing_done(cursor, user,
+                    purchases, context=context)
+        if 'packing_exception' in names:
+            res['packing_exception'] = self.get_packing_exception(cursor,
+                    user, purchases, context=context)
+        return res
+
+    def get_party_lang(self, cursor, user, purchases, context=None):
+        '''
+        Return the language code of the party of each purchases
+
+        :param cursor: the database cursor
+        :param user: the user id
+        :param purchases: a BrowseRecordList of purchases
+        :param context: the context
+        :return: a dictionary with purchase id as key and
+            a language code as value
+        '''
+        res = {}
+        for purchase in purchases:
+            if purchase.party.lang:
+                res[purchase.id] = purchase.party.lang.code
+            else:
+                res[purchase.id] = 'en_US'
+        return res
+
+    def get_untaxed_amount(self, cursor, user, purchases, context=None):
+        '''
+        Return the untaxed amount for each purchases
+
+        :param cursor: the database cursor
+        :param user: the user id
+        :param purchases: a BrowseRecordList of purchases
+        :param context: the context
+        :return: a dictionary with purchase id as key and
+            the untaxed amount as value
+        '''
+        currency_obj = self.pool.get('currency.currency')
+        res = {}
+        for purchase in purchases:
+            res.setdefault(purchase.id, Decimal('0.0'))
+            for line in purchase.lines:
+                if line.type != 'line':
+                    continue
+                res[purchase.id] += line.amount
+            res[purchase.id] = currency_obj.round(cursor, user, purchase.currency,
+                    res[purchase.id])
+        return res
+
+    def get_tax_amount(self, cursor, user, purchases, context=None):
+        '''
+        Return the tax amount for each purchases
+
+        :param cursor: the database cursor
+        :param user: the user id
+        :param purchases: a BrowseRecordList of purchases
+        :param context: the context
+        :return: a dictionary with purchase id as key and
+            the tax amount as value
+        '''
+        currency_obj = self.pool.get('currency.currency')
+        tax_obj = self.pool.get('account.tax')
+        if context is None:
+            context = {}
+        res = {}
+        for purchase in purchases:
+            ctx = context.copy()
+            ctx.update(self.get_tax_context(cursor, user,
+                purchase, context=context))
+            res.setdefault(purchase.id, Decimal('0.0'))
+            for line in purchase.lines:
+                if line.type != 'line':
+                    continue
+                # Don't round on each line to handle rounding error
+                for tax in tax_obj.compute(
+                    cursor, user, [t.id for t in line.taxes], line.unit_price,
+                    line.quantity, context=ctx):
+                    res[purchase.id] += tax['amount']
+            res[purchase.id] = currency_obj.round(cursor, user, purchase.currency,
+                    res[purchase.id])
+        return res
+
+    def get_total_amount(self, cursor, user, purchases, context=None):
+        '''
+        Return the total amount of each purchases
+
+        :param cursor: the database cursor
+        :param user: the user id
+        :param purchases: a BrowseRecordList of purchases
+        :param context: the context
+        :return: a dictionary with purchase id as key and
+            total amount as value
+        '''
+        currency_obj = self.pool.get('currency.currency')
+        res = {}
+        untaxed_amounts = self.get_untaxed_amount(cursor, user, purchases,
+                context=context)
+        tax_amounts = self.get_tax_amount(cursor, user, purchases,
+                context=context)
+        for purchase in purchases:
+            res[purchase.id] = currency_obj.round(cursor, user, purchase.currency,
+                    untaxed_amounts[purchase.id] + tax_amounts[purchase.id])
+        return res
+
+    def get_invoice_paid(self, cursor, user, purchases, context=None):
+        '''
+        Return if all invoices have been paid for each purchases
+
+        :param cursor: the database cursor
+        :param user: the user id
+        :param purchases: a BrowseRecordList of purchases
+        :param context: the context
+        :return: a dictionary with purchase id as key and
+            a boolean as value
+        '''
+        res = {}
+        for purchase in purchases:
+            val = True
+            ignored_ids = [x.id for x in purchase.invoices_ignored]
+            for invoice in purchase.invoices:
+                if invoice.state != 'paid' \
+                        and invoice.id not in ignored_ids:
+                    val = False
+                    break
+            res[purchase.id] = val
+        return res
+
+    def get_invoice_exception(self, cursor, user, purchases, context=None):
+        '''
+        Return if there is an invoice exception for each purchases
+
+        :param cursor: the database cursor
+        :param user: the user id
+        :param purchases: a BrowseRecordList of purchases
+        :param context: the context
+        :return: a dictionary with purchase id as key and
+            a boolean as value
+        '''
+        res = {}
+        for purchase in purchases:
+            val = False
+            ignored_ids = [x.id for x in purchase.invoices_ignored]
+            for invoice in purchase.invoices:
+                if invoice.state == 'cancel' \
+                        and invoice.id not in ignored_ids:
+                    val = True
+                    break
+            res[purchase.id] = val
+        return res
+
+    def get_packings(self, cursor, user, purchases, context=None):
+        '''
+        Return the packings for the purchases.
+
+        :param cursor: the database cursor
+        :param user: the user id
+        :param purchases: a BrowseRecordList of purchases
+        :param context: the context
+        :return: a dictionary with purchase id as key and
+            a list of packing_in id as value
+        '''
+        res = {}
+        for purchase in purchases:
+            res[purchase.id] = []
+            for line in purchase.lines:
+                for move in line.moves:
+                    if move.packing_in:
+                        if move.packing_in.id not in res[purchase.id]:
+                            res[purchase.id].append(move.packing_in.id)
+        return res
+
+    def get_moves(self, cursor, user, purchases, context=None):
+        '''
+        Return the moves for the purchases.
+
+        :param cursor: the database cursor
+        :param user: the user id
+        :param purchases: a BrowseRecordList of purchases
+        :param context: the context
+        :return: a dictionary with purchase id as key and
+            a list of moves id as value
+        '''
+        res = {}
+        for purchase in purchases:
+            res[purchase.id] = []
+            for line in purchase.lines:
+                res[purchase.id].extend([x.id for x in line.moves])
+        return res
+
+    def get_packing_done(self, cursor, user, purchases, context=None):
+        '''
+        Return if all the move have been done for the purchases
+
+        :param cursor: the database cursor
+        :param user: the user id
+        :param purchases: a BrowseRecordList of purchases
+        :param context: the context
+        :return: a dictionary with purchase id as key and
+            a boolean as value
+        '''
+        res = {}
+        for purchase in purchases:
+            val = True
+            for line in purchase.lines:
+                if not line.move_done:
+                    val = False
+                    break
+            res[purchase.id] = val
+        return res
+
+    def get_packing_exception(self, cursor, user, purchases, context=None):
+        '''
+        Return if there is a packing in exception for the purchases
+
+        :param cursor: the database cursor
+        :param user: the user id
+        :param purchases: a BrowseRecordList of purchases
+        :param context: the context
+        :return: a dictionary with purchase id as key and
+            a boolean as value
+        '''
+        res = {}
+        for purchase in purchases:
+            val = False
+            for line in purchase.lines:
+                if line.move_exception:
+                    val = True
+                    break
+            res[purchase.id] = val
+        return res
+
+    def name_get(self, cursor, user, ids, context=None):
+        if not ids:
+            return []
+        if isinstance(ids, (int, long)):
+            ids = [ids]
+        res = []
+        for purchase in self.browse(cursor, user, ids, context=context):
+            res.append((purchase.id, purchase.reference or str(purchase.id) \
+                    + ' ' + purchase.party.name))
+        return res
+
+    def name_search(self, cursor, user, name='', args=None, operator='ilike',
+            context=None, limit=None):
+        if args is None:
+            args = []
+        if name:
+            ids = self.search(cursor, user,
+                    [('reference', operator, name)] + args, limit=limit,
+                    context=context)
+        if not ids:
+            ids = self.search(cursor, user, [('party', operator, name)] + args,
+                    limit=limit, context=context)
+        res = self.name_get(cursor, user, ids, context=context)
+        return res
+
+    def copy(self, cursor, user, purchase_id, default=None, context=None):
+        if default is None:
+            default = {}
+        default = default.copy()
+        default['state'] = 'draft'
+        default['reference'] = False
+        default['invoice_state'] = 'none'
+        default['invoices'] = False
+        default['invoices_ignored'] = False
+        default['packing_state'] = 'none'
+        return super(Purchase, self).copy(cursor, user, purchase_id,
+                default=default, context=context)
+
+    def check_for_quotation(self, cursor, user, purchase_id, context=None):
+        purchase = self.browse(cursor, user, purchase_id, context=context)
+        if not purchase.invoice_address:
+            self.raise_user_error(cursor, 'invoice_addresse_required', context=context)
+        return True
+
+    def set_reference(self, cursor, user, purchase_id, context=None):
+        sequence_obj = self.pool.get('ir.sequence')
+
+        purchase = self.browse(cursor, user, purchase_id, context=context)
+
+        if purchase.reference:
+            return True
+
+        reference = sequence_obj.get(cursor, user, 'purchase.purchase')
+        self.write(cursor, user, purchase_id, {
+            'reference': reference,
+            }, context=context)
+        return True
+
+    def set_purchase_date(self, cursor, user, purchase_id, context=None):
+        date_obj = self.pool.get('ir.date')
+
+        self.write(cursor, user, purchase_id, {
+            'purchase_date': date_obj.today(cursor, user, context=context),
+            }, context=context)
+        return True
+
+    def _get_invoice_line_purchase_line(self, cursor, user, purchase,
+            context=None):
+        '''
+        Return invoice line values for each purchase lines
+
+        :param cursor: the database cursor
+        :param user: the user id
+        :param purchase: a BrowseRecord of the purchase
+        :param context: the context
+        :return: a dictionary with line id as key and a list
+            of invoice line values as value
+        '''
+        line_obj = self.pool.get('purchase.line')
+        res = {}
+        for line in purchase.lines:
+            val = line_obj.get_invoice_line(cursor, user, line,
+                    context=context)
+            if val:
+                res[line.id] = val
+        return res
+
+    def create_invoice(self, cursor, user, purchase_id, context=None):
+        invoice_obj = self.pool.get('account.invoice')
+        journal_obj = self.pool.get('account.journal')
+        invoice_line_obj = self.pool.get('account.invoice.line')
+        purchase_line_obj = self.pool.get('purchase.line')
+
+        if context is None:
+            context = {}
+
+        purchase = self.browse(cursor, user, purchase_id, context=context)
+
+        invoice_lines = self._get_invoice_line_purchase_line(cursor, user,
+                purchase, context=context)
+        if not invoice_lines:
+            return
+
+        journal_id = journal_obj.search(cursor, user, [
+            ('type', '=', 'expense'),
+            ], limit=1, context=context)
+        if journal_id:
+            journal_id = journal_id[0]
+
+        ctx = context.copy()
+        ctx['user'] = user
+        invoice_id = invoice_obj.create(cursor, 0, {
+            'company': purchase.company.id,
+            'type': 'in_invoice',
+            'reference': purchase.reference,
+            'journal': journal_id,
+            'party': purchase.party.id,
+            'invoice_address': purchase.invoice_address.id,
+            'currency': purchase.currency.id,
+            'account': purchase.party.account_payable.id,
+            'payment_term': purchase.payment_term.id,
+        }, context=ctx)
+
+        for line_id in invoice_lines:
+            for vals in invoice_lines[line_id]:
+                vals['invoice'] = invoice_id
+                invoice_line_id = invoice_line_obj.create(cursor, 0, vals,
+                        context=ctx)
+                purchase_line_obj.write(cursor, user, line_id, {
+                    'invoice_lines': [('add', invoice_line_id)],
+                    }, context=context)
+
+        invoice_obj.update_taxes(cursor, 0, [invoice_id], context=ctx)
+
+        self.write(cursor, user, purchase_id, {
+            'invoices': [('add', invoice_id)],
+        }, context=context)
+        return invoice_id
+
+    def ignore_invoice_exception(self, cursor, user, purchase_id, context=None):
+        purchase = self.browse(cursor, user, purchase_id, context=context)
+        invoice_ids = []
+        for invoice in purchase.invoices:
+            if invoice.state == 'cancel':
+                invoice_ids.append(invoice.id)
+        if invoice_ids:
+            self.write(cursor, user, purchase_id, {
+                'invoices_ignored': [('add', x) for x in invoice_ids],
+            }, context=context)
+
+    def create_move(self, cursor, user, purchase_id, context=None):
+        '''
+        Create move for each purchase lines
+        '''
+        line_obj = self.pool.get('purchase.line')
+
+        purchase = self.browse(cursor, user, purchase_id, context=context)
+        for line in purchase.lines:
+            line_obj.create_move(cursor, user, line, context=context)
+
+    def ignore_packing_exception(self, cursor, user, purchase_id, context=None):
+        line_obj = self.pool.get('purchase.line')
+
+        purchase = self.browse(cursor, user, purchase_id, context=context)
+        for line in purchase.lines:
+            line_obj.ignore_move_exception(cursor, user, line, context=context)
+
+Purchase()
+
+
+class PurchaseLine(OSV):
+    'Purchase Line'
+    _name = 'purchase.line'
+    _rec_name = 'description'
+    _description = __doc__
+
+    purchase = fields.Many2One('purchase.purchase', 'Purchase', ondelete='CASCADE',
+            select=1, required=True)
+    sequence = fields.Integer('Sequence')
+    type = fields.Selection([
+        ('line', 'Line'),
+        ('subtotal', 'Subtotal'),
+        ('title', 'Title'),
+        ], 'Type', select=1, required=True)
+    quantity = fields.Float('Quantity',
+            digits="(16, unit_digits)",
+            states={
+                'invisible': "type != 'line'",
+                'required': "type == 'line'",
+            }, on_change=['product', 'quantity', 'unit',
+                '_parent_purchase.currency', '_parent_purchase.party'])
+    unit = fields.Many2One('product.uom', 'Unit',
+            states={
+                'required': "product",
+                'invisible': "type != 'line'",
+            }, domain="[('category', '=', " \
+                    "(product, 'product.default_uom.category'))]",
+            context="{'category': (product, 'product.default_uom.category')}",
+            on_change=['product', 'quantity', 'unit', '_parent_purchase.currency',
+                '_parent_purchase.party'])
+    unit_digits = fields.Function('get_unit_digits', type='integer',
+            string='Unit Digits', on_change_with=['unit'])
+    product = fields.Many2One('product.product', 'Product',
+            domain=[('purchasable', '=', True)],
+            states={
+                'invisible': "type != 'line'",
+            }, on_change=['product', 'unit', 'quantity', 'description',
+                '_parent_purchase.party', '_parent_purchase.currency'],
+            context="{'locations': [_parent_purchase.warehouse], " \
+                    "'stock_date_end': _parent_purchase.purchase_date}")
+    unit_price = fields.Numeric('Unit Price', digits=(16, 4),
+            states={
+                'invisible': "type != 'line'",
+                'required': "type == 'line'",
+            })
+    amount = fields.Function('get_amount', type='numeric', string='Amount',
+            digits="(16, _parent_purchase.currency_digits)",
+            states={
+                'invisible': "type not in ('line', 'subtotal')",
+            }, on_change_with=['type', 'quantity', 'unit_price',
+                '_parent_purchase.currency'])
+    description = fields.Char('Description', size=None, required=True)
+    comment = fields.Text('Comment',
+            states={
+                'invisible': "type != 'line'",
+            })
+    taxes = fields.Many2Many('account.tax', 'purchase_line_account_tax',
+            'line', 'tax', 'Taxes', domain=[('parent', '=', False)],
+            states={
+                'invisible': "type != 'line'",
+            })
+    invoice_lines = fields.Many2Many('account.invoice.line',
+            'purchase_line_invoice_lines_rel', 'purchase_line', 'invoice_line',
+            'Invoice Lines', readonly=True)
+    moves = fields.One2Many('stock.move', 'purchase_line', 'Moves',
+            readonly=True, select=1)
+    moves_ignored = fields.Many2Many('stock.move', 'purchase_line_moves_ignored_rel',
+            'purchase_line', 'move', 'Moves Ignored', readonly=True)
+    move_done = fields.Function('get_move_done', type='boolean',
+            string='Moves Done')
+    move_exception = fields.Function('get_move_exception', type='boolean',
+            string='Moves Exception')
+
+    def __init__(self):
+        super(PurchaseLine, self).__init__()
+        self._order.insert(0, ('sequence', 'ASC'))
+        self._error_messages.update({
+            'supplier_location_required': 'The supplier location is required!',
+            'missing_account_expense': 'It miss ' \
+                    'an "account_expense" default property!',
+            })
+
+    def default_type(self, cursor, user, context=None):
+        return 'line'
+
+    def default_quantity(self, cursor, user, context=None):
+        return 0.0
+
+    def default_unit_price(self, cursor, user, context=None):
+        return Decimal('0.0')
+
+    def get_move_done(self, cursor, user, ids, name, args, context=None):
+        uom_obj = self.pool.get('product.uom')
+        res = {}
+        for line in self.browse(cursor, user, ids, context=context):
+            val = True
+            if not line.product:
+                res[line.id] = True
+                continue
+            if line.product.type == 'service':
+                res[line.id] = True
+                continue
+            ignored_ids = [x.id for x in line.moves_ignored]
+            quantity = line.quantity
+            for move in line.moves:
+                if move.state != 'done' \
+                        and move.id not in ignored_ids:
+                    val = False
+                    break
+                quantity -= uom_obj.compute_qty(cursor, user, move.uom,
+                     move.quantity, line.unit, context=context)
+            if val:
+                if quantity > 0.0:
+                    val = False
+            res[line.id] = val
+        return res
+
+    def get_move_exception(self, cursor, user, ids, name, args, context=None):
+        res = {}
+        for line in self.browse(cursor, user, ids, context=context):
+            val = False
+            ignored_ids = [x.id for x in line.moves_ignored]
+            for move in line.moves:
+                if move.state == 'cancel' \
+                        and move.id not in ignored_ids:
+                    val = True
+                    break
+            res[line.id] = val
+        return res
+
+    def on_change_with_unit_digits(self, cursor, user, ids, vals,
+            context=None):
+        uom_obj = self.pool.get('product.uom')
+        if vals.get('unit'):
+            uom = uom_obj.browse(cursor, user, vals['unit'],
+                    context=context)
+            return uom.digits
+        return 2
+
+    def get_unit_digits(self, cursor, user, ids, name, arg, context=None):
+        res = {}
+        for line in self.browse(cursor, user, ids, context=context):
+            if line.unit:
+                res[line.id] = line.unit.digits
+            else:
+                res[line.id] = 2
+        return res
+
+    def on_change_product(self, cursor, user, ids, vals, context=None):
+        party_obj = self.pool.get('party.party')
+        product_obj = self.pool.get('product.product')
+        uom_obj = self.pool.get('product.uom')
+        if context is None:
+            context = {}
+        if not vals.get('product'):
+            return {}
+        res = {}
+
+        ctx = context.copy()
+        party = None
+        if vals.get('_parent_purchase.party'):
+            party = party_obj.browse(cursor, user, vals['_parent_purchase.party'],
+                    context=context)
+            if party.lang:
+                ctx['language'] = party.lang.code
+
+        product = product_obj.browse(cursor, user, vals['product'],
+                context=context)
+
+        ctx2 = context.copy()
+        if vals.get('_parent_purchase.currency'):
+            ctx2['currency'] = vals['_parent_purchase.currency']
+        if vals.get('_parent_purchase.party'):
+            ctx2['supplier'] = vals['_parent_purchase.party']
+        if vals.get('unit'):
+            ctx2['uom'] = vals['unit']
+        else:
+            ctx2['uom'] = product.purchase_uom.id
+        res['unit_price'] = product_obj.get_purchase_price(cursor, user,
+                [product.id], vals.get('quantity', 0), context=ctx2)[product.id]
+        res['taxes'] = []
+        for tax in product.supplier_taxes_used:
+            if party:
+                if 'supplier_' + tax.group.code in party_obj._columns \
+                        and party['supplier_' + tax.group.code]:
+                    res['taxes'].append(
+                            party['supplier_' + tax.group.code].id)
+                    continue
+            res['taxes'].append(tax.id)
+
+        if not vals.get('description'):
+            res['description'] = product_obj.name_get(cursor, user, product.id,
+                    context=ctx)[0][1]
+
+        category = product.purchase_uom.category
+        if not vals.get('unit') \
+                or vals.get('unit') not in [x.id for x in category.uoms]:
+            res['unit'] = uom_obj.name_get(cursor, user, product.purchase_uom.id,
+                    context=context)[0]
+            res['unit_digits'] = product.purchase_uom.digits
+        return res
+
+    def on_change_quantity(self, cursor, user, ids, vals, context=None):
+        product_obj = self.pool.get('product.product')
+
+        if context is None:
+            context = {}
+        if not vals.get('product'):
+            return {}
+        res = {}
+
+        product = product_obj.browse(cursor, user, vals['product'],
+                context=context)
+
+        ctx2 = context.copy()
+        if vals.get('_parent_purchase.currency'):
+            ctx2['currency'] = vals['_parent_purchase.currency']
+        if vals.get('_parent_purchase.party'):
+            ctx2['supplier'] = vals['_parent_purchase.party']
+        if vals.get('unit'):
+            ctx2['uom'] = vals['unit']
+        res['unit_price'] = product_obj.get_purchase_price(cursor, user,
+                [vals['product']], vals.get('quantity', 0),
+                context=ctx2)[vals['product']]
+        return res
+
+    def on_change_unit(self, cursor, user, ids, vals, context=None):
+        return self.on_change_quantity(cursor, user, ids, vals, context=context)
+
+    def on_change_with_amount(self, cursor, user, ids, vals, context=None):
+        currency_obj = self.pool.get('currency.currency')
+        if vals.get('type') == 'line':
+            if isinstance(vals.get('_parent_purchase.currency'), (int, long)):
+                currency = currency_obj.browse(cursor, user,
+                        vals['_parent_purchase.currency'], context=context)
+            else:
+                currency = vals['_parent_purchase.currency']
+            amount = Decimal(str(vals.get('quantity') or '0.0')) * \
+                    (vals.get('unit_price') or Decimal('0.0'))
+            if currency:
+                return currency_obj.round(cursor, user, currency, amount)
+            return amount
+        return Decimal('0.0')
+
+    def get_amount(self, cursor, user, ids, name, arg, context=None):
+        currency_obj = self.pool.get('currency.currency')
+        res = {}
+        for line in self.browse(cursor, user, ids, context=context):
+            if line.type == 'line':
+                res[line.id] = currency_obj.round(cursor, user,
+                        line.purchase.currency,
+                        Decimal(str(line.quantity)) * line.unit_price)
+            elif line.type == 'subtotal':
+                res[line.id] = Decimal('0.0')
+                for line2 in line.purchase.lines:
+                    if line2.type == 'line':
+                        res[line.id] += currency_obj.round(cursor, user,
+                                line2.purchase.currency,
+                                Decimal(str(line2.quantity)) * line2.unit_price)
+                    elif line2.type == 'subtotal':
+                        if line.id == line2.id:
+                            break
+                        res[line.id] = Decimal('0.0')
+            else:
+                res[line.id] = Decimal('0.0')
+        return res
+
+    def get_invoice_line(self, cursor, user, line, context=None):
+        '''
+        Return invoice line values for purchase line
+
+        :param cursor: the database cursor
+        :param user: the user id
+        :param line: a BrowseRecord of the purchase line
+        :param context: the context
+        :return: a list of invoice line values
+        '''
+        uom_obj = self.pool.get('product.uom')
+        property_obj = self.pool.get('ir.property')
+
+        res = {}
+        res['sequence'] = line.sequence
+        res['type'] = line.type
+        res['description'] = line.description
+        if line.type != 'line':
+            return [res]
+        if line.purchase.invoice_method == 'order':
+            res['quantity'] = line.quantity
+        else:
+            quantity = 0.0
+            for move in line.moves:
+                if move.state == 'done':
+                    quantity += uom_obj.compute_qty(cursor, user, move.uom,
+                            move.quantity, line.unit, context=context)
+            for invoice_line in line.invoice_lines:
+                quantity -= uom_obj.compute_qty(cursor, user,
+                        invoice_line.unit, invoice_line.quantity, line.unit,
+                        context=context)
+            res['quantity'] = quantity
+        if res['quantity'] <= 0.0:
+            return None
+        res['unit'] = line.unit.id
+        res['product'] = line.product.id
+        res['unit_price'] = line.unit_price
+        res['taxes'] = [('set', [x.id for x in line.taxes])]
+        if line.product:
+            res['account'] = line.product.account_expense_used.id
+        else:
+            for model in ('product.template', 'product.category'):
+                res['account'] = property_obj.get(cursor, user,
+                        'account_expense', model, context=context)
+                if res['account']:
+                    break
+            if not res['account']:
+                self.raise_user_error(cursor, 'missing_account_expense',
+                        context=context)
+        return [res]
+
+    def copy(self, cursor, user, line_id, default=None, context=None):
+        if default is None:
+            default = {}
+        default = default.copy()
+        default['moves'] = False
+        default['moves_ignored'] = False
+        default['invoice_lines'] = False
+        return super(PurchaseLine, self).copy(cursor, user, line_id,
+                default=default, context=context)
+
+    def create_move(self, cursor, user, line, context=None):
+        '''
+        Create move line
+        '''
+        move_obj = self.pool.get('stock.move')
+        uom_obj = self.pool.get('product.uom')
+        product_supplier_obj = self.pool.get('purchase.product_supplier')
+
+        if context is None:
+            context = {}
+
+        vals = {}
+        if line.type != 'line':
+            return
+        if not line.product:
+            return
+        if line.product.type == 'service':
+            return
+        quantity = line.quantity
+        for move in line.moves:
+            quantity -= uom_obj.compute_qty(cursor, user, move.uom,
+                    move.quantity, line.unit, context=context)
+        if quantity <= 0.0:
+            return
+        if not line.purchase.party.supplier_location:
+            self.raise_user_error(cursor, 'supplier_location_required',
+                    context=context)
+        vals['quantity'] = quantity
+        vals['uom'] = line.unit.id
+        vals['product'] = line.product.id
+        vals['from_location'] = line.purchase.party.supplier_location.id
+        vals['to_location'] = line.purchase.warehouse.input_location.id
+        vals['state'] = 'draft'
+        vals['company'] = line.purchase.company.id
+        vals['unit_price'] = line.unit_price
+        vals['currency'] = line.purchase.currency.id
+
+        if line.product.product_suppliers:
+            for product_supplier in line.product.product_suppliers:
+                if product_supplier.party.id == line.purchase.party.id:
+                    vals['planned_date'] = \
+                            product_supplier_obj.compute_supply_date(
+                                    cursor, user, product_supplier,
+                                    date=line.purchase.purchase_date,
+                                    context=context)[0]
+                    break
+
+        ctx = context.copy()
+        ctx['user'] = user
+        move_id = move_obj.create(cursor, 0, vals, context=ctx)
+
+        self.write(cursor, user, line.id, {
+            'moves': [('add', move_id)],
+        }, context=context)
+        return move_id
+
+    def ignore_move_exception(self, cursor, user, line, context=None):
+        move_ids = []
+        for move in line.moves:
+            if move.state == 'cancel':
+                move_ids.append(move.id)
+        if move_ids:
+            self.write(cursor, user, line.id, {
+                'moves_ignored': [('add', x) for x in move_ids],
+            }, context=context)
+
+PurchaseLine()
+
+
+class PurchaseReport(CompanyReport):
+    _name = 'purchase.purchase'
+
+PurchaseReport()
+
+
+class Template(OSV):
+    _name = "product.template"
+
+    purchasable = fields.Boolean('Purchasable', states={
+        'readonly': "active == False",
+        })
+    product_suppliers = fields.One2Many('purchase.product_supplier',
+            'product', 'Suppliers', states={
+                'readonly': "active == False",
+                'invisible': "not purchasable",
+            })
+    purchase_uom = fields.Many2One('product.uom', 'Purchase UOM', states={
+        'readonly': "active == False",
+        'invisible': "not purchasable",
+        'required': "purchasable",
+        }, domain="[('category', '=', " \
+                "(default_uom, 'uom.category'))]",
+        context="{'category': (default_uom, 'uom.category')}",
+        on_change_with=['default_uom', 'purchase_uom'])
+
+    def default_purchasable(self, cursor, user, context=None):
+        return False
+
+    def on_change_with_purchase_uom(self, cursor, user, ids, vals,
+            context=None):
+        uom_obj = self.pool.get('product.uom')
+        res = False
+
+        if vals.get('default_uom'):
+            default_uom = uom_obj.browse(cursor, user, vals['default_uom'],
+                    context=context)
+            if vals.get('purchase_uom'):
+                purchase_uom = uom_obj.browse(cursor, user, vals['purchase_uom'],
+                        context=context)
+                if default_uom.category.id == purchase_uom.category.id:
+                    res = purchase_uom.id
+                else:
+                    res = default_uom.id
+            else:
+                res = default_uom.id
+        if res:
+            res = uom_obj.name_get(cursor, user, res, context=context)[0]
+        return res
+
+Template()
+
+
+class Product(OSV):
+    _name = 'product.product'
+
+    def on_change_with_purchase_uom(self, cursor, user, ids, vals, context=None):
+        template_obj = self.pool.get('product.template')
+        return template_obj.on_change_with_purchase_uom(cursor, user, ids, vals,
+                context=context)
+
+    def get_purchase_price(self, cursor, user, ids, quantity=0, context=None):
+        '''
+        Return purchase price for product ids.
+
+        :param cursor: the database cursor
+        :param user: the user id
+        :param ids: the product ids
+        :param quantity: the quantity of products
+        :param context: the context that can have as keys:
+            uom: the unit of measure
+            supplier: the supplier party id
+            currency: the currency id for the returned price
+        :return: a dictionary with for each product ids keys the computed price
+        '''
+        uom_obj = self.pool.get('product.uom')
+        user_obj = self.pool.get('res.user')
+        currency_obj = self.pool.get('currency.currency')
+
+        if context is None:
+            context = {}
+
+        res = {}
+
+        uom = None
+        if context.get('uom'):
+            uom = uom_obj.browse(cursor, user, context['uom'],
+                    context=context)
+
+        currency = None
+        if context.get('currency'):
+            currency = currency_obj.browse(cursor, user, context['currency'],
+                    context=context)
+
+        user2 = user_obj.browse(cursor, user, user, context=context)
+
+        for product in self.browse(cursor, user, ids, context=context):
+            res[product.id] = product.cost_price
+            if context.get('supplier') and product.product_suppliers:
+                supplier_id = context['supplier']
+                for product_supplier in product.product_suppliers:
+                    if product_supplier.party.id == supplier_id:
+                        for price in product_supplier.prices:
+                            if price.quantity <= quantity:
+                                res[product.id] = price.unit_price
+                        break
+            if uom:
+                res[product.id] = uom_obj.compute_price(cursor,
+                        user, product.default_uom, res[product.id],
+                        uom, context=context)
+            if currency:
+                if user2.company.currency.id != currency.id:
+                    res[product.id] = currency_obj.compute(cursor, user,
+                            user2.company.currency, res[product.id],
+                            currency, context=context)
+        return res
+
+Product()
+
+
+class ProductSupplier(OSV):
+    'Product Supplier'
+    _name = 'purchase.product_supplier'
+    _description = __doc__
+
+    product = fields.Many2One('product.template', 'Product', required=True,
+            ondelete='CASCADE', select=1)
+    party = fields.Many2One('party.party', 'Supplier', required=True,
+            ondelete='CASCADE', select=1)
+    name = fields.Char('Name', size=None, translate=True, select=1)
+    code = fields.Char('Code', size=None, select=1)
+    sequence = fields.Integer('Sequence')
+    prices = fields.One2Many('purchase.product_supplier.price',
+            'product_supplier', 'Prices')
+    company = fields.Many2One('company.company', 'Company', required=True,
+            ondelete='CASCADE', select=1)
+    delivery_time = fields.Integer('Delivery Time',
+            help="In number of days")
+
+    def __init__(self):
+        super(ProductSupplier, self).__init__()
+        self._order.insert(0, ('sequence', 'ASC'))
+
+    def default_company(self, cursor, user, context=None):
+        company_obj = self.pool.get('company.company')
+        if context is None:
+            context = {}
+        if context.get('company'):
+            return company_obj.name_get(cursor, user, context['company'],
+                    context=context)[0]
+        return False
+
+    def compute_supply_date(self, cursor, user, product_supplier, date=None,
+            context=None):
+        '''
+        Compute the supply date for the Product Supplier at the given date
+            and the next supply date
+
+        :param cursor: the database cursor
+        :param user: the user id
+        :param product_supplier: a BrowseRecord of the Product Supplier
+        :param date: the date of the purchase if None the current date
+        :param context: the context
+        :return: a tuple with the supply date and the next one
+        '''
+        date_obj = self.pool.get('ir.date')
+
+        if not date:
+            date = date_obj.today(cursor, user, context=context)
+        next_date = date + datetime.timedelta(1)
+        return (date + datetime.timedelta(product_supplier.delivery_time),
+                next_date + datetime.timedelta(product_supplier.delivery_time))
+
+    def compute_purchase_date(self, cursor, user, product_supplier, date,
+            context=None):
+        '''
+        Compute the purchase date for the Product Supplier at the given date
+
+        :param cursor: the database cursor
+        :param user: the user id
+        :param product_supplier: a BrowseRecord of the Product Supplier
+        :param date: the date of the supply
+        :param context: the context
+        :return: the purchase date
+        '''
+        date_obj = self.pool.get('ir.date')
+
+        if not product_supplier.delivery_time:
+            return date_obj.today(cursor, user, context=context)
+        return date - datetime.timedelta(product_supplier.delivery_time)
+
+ProductSupplier()
+
+
+class ProductSupplierPrice(OSV):
+    'Product Supplier Price'
+    _name = 'purchase.product_supplier.price'
+
+    product_supplier = fields.Many2One('purchase.product_supplier',
+            'Supplier', required=True, ondelete='CASCADE')
+    quantity = fields.Float('Quantity', required=True, help='Minimal quantity')
+    unit_price = fields.Numeric('Unit Price', required=True, digits=(16, 4))
+
+    def __init__(self):
+        super(ProductSupplierPrice, self).__init__()
+        self._order.insert(0, ('quantity', 'ASC'))
+
+    def default_currency(self, cursor, user, context=None):
+        company_obj = self.pool.get('company.company')
+        currency_obj = self.pool.get('currency.currency')
+        if context is None:
+            context = {}
+        company = None
+        if context.get('company'):
+            company = company_obj.browse(cursor, user, context['company'],
+                    context=context)
+            return currency_obj.name_get(cursor, user, company.currency.id,
+                    context=context)[0]
+        return False
+
+ProductSupplierPrice()
+
+
+class PackingIn(OSV):
+    _name = 'stock.packing.in'
+
+    def __init__(self):
+        super(PackingIn, self).__init__()
+        self.incoming_moves.add_remove = "[" + \
+                self.incoming_moves.add_remove + ", " \
+                "('supplier', '=', supplier)]"
+
+    def write(self, cursor, user, ids, vals, context=None):
+        workflow_service = LocalService('workflow')
+        purchase_line_obj = self.pool.get('purchase.line')
+
+        res = super(PackingIn, self).write(cursor, user, ids, vals,
+                context=context)
+
+        if 'state' in vals and vals['state'] in ('received', 'cancel'):
+            purchase_ids = []
+            move_ids = []
+            if isinstance(ids, (int, long)):
+                ids = [ids]
+            for packing in self.browse(cursor, user, ids, context=context):
+                move_ids.extend([x.id for x in packing.incoming_moves])
+
+            purchase_line_ids = purchase_line_obj.search(cursor, user, [
+                ('moves', 'in', move_ids),
+                ], context=context)
+            if purchase_line_ids:
+                for purchase_line in purchase_line_obj.browse(cursor, user,
+                        purchase_line_ids, context=context):
+                    if purchase_line.purchase.id not in purchase_ids:
+                        purchase_ids.append(purchase_line.purchase.id)
+
+            for purchase_id in purchase_ids:
+                workflow_service.trg_validate(user, 'purchase.purchase',
+                        purchase_id, 'packing_update', cursor, context=context)
+        return res
+
+PackingIn()
+
+
+class Move(OSV):
+    _name = 'stock.move'
+
+    purchase_line = fields.Many2One('purchase.line', select=1,
+            states={
+                'readonly': "state != 'draft'",
+            })
+    purchase = fields.Function('get_purchase', type='many2one',
+            relation='purchase.purchase', string='Purchase',
+            fnct_search='search_purchase', select=1, states={
+                'invisible': "type != 'input'",
+            })
+    purchase_quantity = fields.Function('get_purchase_fields',
+            type='float', digits="(16, unit_digits)",
+            string='Purchase Quantity',
+            states={
+                'invisible': "type != 'input'",
+            })
+    purchase_unit = fields.Function('get_purchase_fields',
+            type='many2one', relation='product.uom',
+            string='Purchase Unit',
+            states={
+                'invisible': "type != 'input'",
+            })
+    purchase_unit_digits = fields.Function('get_purchase_fields',
+            type='integer', string='Purchase Unit Digits')
+    purchase_unit_price = fields.Function('get_purchase_fields',
+            type='numeric', digits=(16, 4), string='Purchase Unit Price',
+            states={
+                'invisible': "type != 'input'",
+            })
+    purchase_currency = fields.Function('get_purchase_fields',
+            type='many2one', relation='currency.currency',
+            string='Purchase Currency',
+            states={
+                'invisible': "type != 'input'",
+            })
+    supplier = fields.Function('get_supplier', type='many2one',
+            relation='party.party', string='Supplier',
+            fnct_search='search_supplier', select=1)
+
+    def get_purchase(self, cursor, user, ids, name, arg, context=None):
+        purchase_obj = self.pool.get('purchase.purchase')
+
+        res = {}
+        for move in self.browse(cursor, user, ids, context=context):
+            res[move.id] = False
+            if move.purchase_line:
+                res[move.id] = move.purchase_line.purchase.id
+
+        purchase_names = {}
+        for purchase_id, purchase_name in purchase_obj.name_get(cursor,
+                user, [x for x in res.values() if x], context=context):
+            purchase_names[purchase_id] = purchase_name
+
+        for i in res.keys():
+            if res[i] and res[i] in purchase_names:
+                res[i] = (res[i], purchase_names[res[i]])
+            else:
+                res[i] = False
+        return res
+
+    def search_purchase(self, cursor, user, name, args, context=None):
+        args2 = []
+        i = 0
+        while i < len(args):
+            field = args[i][0]
+            args2.append(('purchase_line.' + field, args[i][1], args[i][2]))
+            i += 1
+        return args2
+
+    def get_purchase_fields(self, cursor, user, ids, names, arg, context=None):
+        uom_obj = self.pool.get('product.uom')
+        currency_obj = self.pool.get('currency.currency')
+
+        res = {}
+        for name in names:
+            res[name] = {}
+
+        for move in self.browse(cursor, user, ids, context=context):
+            for name in res.keys():
+                if name[9:] == 'quantity':
+                    res[name][move.id] = 0.0
+                elif name[9:] == 'unit_digits':
+                    res[name][move.id] = 2
+                else:
+                    res[name][move.id] = False
+            if move.purchase_line:
+                for name in res.keys():
+                    if name[9:] == 'currency':
+                        res[name][move.id] = move.purchase_line.\
+                                purchase.currency.id
+                    elif name[9:] in ('quantity', 'unit_digits', 'unit_price'):
+                        res[name][move.id] = move.purchase_line[name[9:]]
+                    else:
+                        res[name][move.id] = move.purchase_line[name[9:]].id
+
+        if 'purchase_unit' in res.keys():
+            unit_names = {}
+            for unit_id, unit_name in uom_obj.name_get(cursor, user,
+                    list(set([x for x in res['purchase_unit'].values() if x])),
+                    context=context):
+                unit_names[unit_id] = (unit_id, unit_name)
+            for i in res['purchase_unit'].keys():
+                if res['purchase_unit'][i] and \
+                        res['purchase_unit'][i] in unit_names:
+                    res['purchase_unit'][i] = unit_names[
+                            res['purchase_unit'][i]]
+                else:
+                    res['purchase_unit'][i] = False
+
+        if 'purchase_currency' in res.keys():
+            currency_names = {}
+            for currency_id, currency_name in currency_obj.name_get(cursor,
+                    user,
+                    list(set([x for x in res['purchase_currency'].values() if x])),
+                    context=context):
+                currency_names[currency_id] = (currency_id, currency_name)
+            for i in res['purchase_currency'].keys():
+                if res['purchase_currency'][i] and \
+                        res['purchase_currency'][i] in currency_names:
+                    res['purchase_currency'][i] = currency_names[
+                            res['purchase_currency'][i]]
+                else:
+                    res['purchase_currency'][i] = False
+        return res
+
+    def get_supplier(self, cursor, user, ids, name, arg, context=None):
+        party_obj = self.pool.get('party.party')
+
+        res = {}
+        for move in self.browse(cursor, user, ids, context=context):
+            res[move.id] = False
+            if move.purchase_line:
+                res[move.id] = move.purchase_line.purchase.party.id
+
+        party_names = {}
+        for party_id, party_name in party_obj.name_get(cursor, user,
+                [x for x in res.values() if x], context=context):
+            party_names[party_id] = party_name
+
+        for i in res.keys():
+            if res[i] and res[i] in party_names:
+                res[i] = (res[i], party_names[res[i]])
+            else:
+                res[i] = False
+        return res
+
+    def search_supplier(self, cursor, user, name, args, context=None):
+        args2 = []
+        i = 0
+        while i < len(args):
+            args2.append(('purchase_line.purchase.party', args[i][1],
+                args[i][2]))
+            i += 1
+        return args2
+
+    def write(self, cursor, user, ids, vals, context=None):
+        workflow_service = LocalService('workflow')
+        purchase_line_obj = self.pool.get('purchase.line')
+
+        res = super(Move, self).write(cursor, user, ids, vals,
+                context=context)
+        if 'state' in vals and vals['state'] in ('cancel',):
+            purchase_ids = []
+            purchase_line_ids = purchase_line_obj.search(cursor, user, [
+                ('moves', 'in', ids),
+                ], context=context)
+            if purchase_line_ids:
+                for purchase_line in purchase_line_obj.browse(cursor, user,
+                        purchase_line_ids, context=context):
+                    if purchase_line.purchase.id not in purchase_ids:
+                        purchase_ids.append(purchase_line.purchase.id)
+            for purchase_id in purchase_ids:
+                workflow_service.trg_validate(user, 'purchase.purchase',
+                        purchase_id, 'packing_update', cursor, context=context)
+        return res
+
+Move()
+
+
+class OpenSupplier(Wizard):
+    'Open Suppliers'
+    _name = 'purchase.open_supplier'
+    states = {
+        'init': {
+            'result': {
+                'type': 'action',
+                'action': '_action_open',
+                'state': 'end',
+            },
+        },
+    }
+
+    def _action_open(self, cursor, user, datas, context=None):
+        model_data_obj = self.pool.get('ir.model.data')
+        act_window_obj = self.pool.get('ir.action.act_window')
+        wizard_obj = self.pool.get('ir.action.wizard')
+
+        model_data_ids = model_data_obj.search(cursor, user, [
+            ('fs_id', '=', 'act_party_form'),
+            ('module', '=', 'party'),
+            ('inherit', '=', False),
+            ], limit=1, context=context)
+        model_data = model_data_obj.browse(cursor, user, model_data_ids[0],
+                context=context)
+        res = act_window_obj.read(cursor, user, model_data.db_id,
+                context=context)
+        cursor.execute("SELECT DISTINCT(party) FROM purchase_purchase")
+        supplier_ids = [line[0] for line in cursor.fetchall()]
+        res['domain'] = str([('id', 'in', supplier_ids)])
+
+        model_data_ids = model_data_obj.search(cursor, user, [
+            ('fs_id', '=', 'act_open_supplier'),
+            ('module', '=', 'purchase'),
+            ('inherit', '=', False),
+            ], limit=1, context=context)
+        model_data = model_data_obj.browse(cursor, user, model_data_ids[0],
+                context=context)
+        wizard = wizard_obj.browse(cursor, user, model_data.db_id,
+                context=context)
+
+        res['name'] = wizard.name
+        return res
+
+OpenSupplier()
+
+
+class Invoice(OSV):
+    _name = 'account.invoice'
+
+    def __init__(self):
+        super(Invoice, self).__init__()
+        self._error_messages.update({
+            'delete_purchase_invoice': 'You can not delete invoices ' \
+                    'that comes from a purchase!',
+            })
+
+    def delete(self, cursor, user, ids, context=None):
+        if not ids:
+            return True
+        if isinstance(ids, (int, long)):
+            ids = [ids]
+        cursor.execute('SELECT id FROM purchase_invoices_rel ' \
+                'WHERE invoice IN (' + ','.join(['%s' for x in ids]) + ')',
+                ids)
+        if cursor.rowcount:
+            self.raise_user_error(cursor, 'delete_purchase_invoice',
+                    context=context)
+        return super(Invoice, self).delete(cursor, user, ids,
+                context=context)
+
+Invoice()
diff --git a/purchase.xml b/purchase.xml
new file mode 100644
index 0000000..9d2d4c5
--- /dev/null
+++ b/purchase.xml
@@ -0,0 +1,819 @@
+<?xml version="1.0"?>
+<!-- This file is part of Tryton.  The COPYRIGHT file at the top level of
+this repository contains the full copyright notices and license terms. -->
+<tryton>
+    <data>
+        <menuitem name="Purchase Management" id="menu_purchase" sequence="4"/>
+        <record model="res.group" id="group_purchase">
+            <field name="name">Purchase</field>
+        </record>
+        <record model="res.user" id="res.user_admin">
+            <field name="groups" eval="[('add', ref('group_purchase'))]"/>
+        </record>
+
+        <record model="ir.ui.view" id="purchase_view_form">
+            <field name="model">purchase.purchase</field>
+            <field name="type">form</field>
+            <field name="arch" type="xml">
+                <![CDATA[
+                <form string="Purchase" col="6">
+                    <label name="party"/>
+                    <field name="party"/>
+                    <label name="invoice_address"/>
+                    <field name="invoice_address"/>
+                    <newline/>
+                    <label name="description"/>
+                    <field name="description" colspan="3"/>
+                    <label name="reference"/>
+                    <field name="reference"/>
+                    <notebook colspan="6">
+                        <page string="Purchase">
+                            <label name="purchase_date"/>
+                            <field name="purchase_date"/>
+                            <label name="payment_term"/>
+                            <field name="payment_term"/>
+                            <label name="warehouse"/>
+                            <field name="warehouse"/>
+                            <label name="currency"/>
+                            <field name="currency"/>
+                            <field name="lines" colspan="4">
+                                <tree string="Lines" sequence="sequence" fill="1">
+                                    <field name="type"/>
+                                    <field name="product"/>
+                                    <field name="description"/>
+                                    <field name="quantity"/>
+                                    <field name="unit"/>
+                                    <field name="unit_price"/>
+                                    <field name="taxes"/>
+                                    <field name="amount"/>
+                                    <field name="sequence" tree_invisible="1"/>
+                                    <field name="unit_digits" tree_invisible="1"/>
+                                </tree>
+                            </field>
+                            <group col="2" colspan="2">
+                                <label name="invoice_state"/>
+                                <field name="invoice_state"/>
+                                <label name="packing_state"/>
+                                <field name="packing_state"/>
+                            </group>
+                            <group col="2" colspan="2">
+                                <label name="untaxed_amount"/>
+                                <field name="untaxed_amount"/>
+                                <label name="tax_amount"/>
+                                <field name="tax_amount"/>
+                                <label name="total_amount"/>
+                                <field name="total_amount"/>
+                                <label name="state"/>
+                                <field name="state"/>
+                                <group col="6" colspan="2">
+                                    <button name="cancel" string="Cancel"
+                                        states="{'invisible': '''not ((state in ('draft', 'quotation')) or (invoice_state == 'exception') or (packing_state == 'exception')) ''', 'readonly': '''%(group_purchase)d not in groups'''}"
+                                        icon="tryton-cancel"/>
+                                    <button name="draft" string="Draft"
+                                        states="{'invisible': '''state != 'quotation' ''', 'readonly': '''%(group_purchase)d not in groups'''}"
+                                        icon="tryton-clear"/>
+                                    <button name="quotation" string="Quotation"
+                                        states="{'invisible': '''state != 'draft' ''', 'readonly': '''%(group_purchase)d not in groups'''}"
+                                        icon="tryton-go-next"/>
+                                    <button name="invoice_ok" string="Ignore Invoice Exception"
+                                        states="{'invisible': '''invoice_state != 'exception' or state == 'cancel' ''', 'readonly': '''%(group_purchase)d not in groups'''}"
+                                        icon="tryton-go-next"/>
+                                    <button name="packing_ok" string="Ignore Packing Exception"
+                                        states="{'invisible': '''packing_state != 'exception' or state == 'cancel' ''', 'readonly': '''%(group_purchase)d not in groups'''}"
+                                        icon="tryton-go-next"/>
+                                    <button name="confirm" string="Confirm"
+                                        states="{'invisible': '''state != 'quotation' ''', 'readonly': '''%(group_purchase)d not in groups'''}"
+                                        icon="tryton-ok"/>
+                                </group>
+                            </group>
+                        </page>
+                        <page string="Other Info">
+                            <label name="company"/>
+                            <field name="company"/>
+                            <label name="invoice_method"/>
+                            <field name="invoice_method"/>
+                            <separator name="comment" colspan="4"/>
+                            <field name="comment" colspan="4" spell="party_lang"/>
+                        </page>
+                        <page string="Invoices">
+                            <field name="invoices" colspan="4" widget="one2many"/>
+                        </page>
+                        <page string="Packings">
+                            <field name="moves" colspan="4" widget="one2many"/>
+                            <field name="packings" colspan="4" widget="one2many"/>
+                        </page>
+                    </notebook>
+                    <field name="currency_digits" invisible="1"/>
+                    <field name="party_lang" invisible="1"/>
+                </form>
+                ]]>
+            </field>
+        </record>
+        <record model="ir.ui.view" id="purchase_view_tree">
+            <field name="model">purchase.purchase</field>
+            <field name="type">tree</field>
+            <field name="arch" type="xml">
+                <![CDATA[
+                <tree string="Purchases">
+                    <field name="reference" select="1"/>
+                    <field name="purchase_date" select="1"/>
+                    <field name="party" select="1"/>
+                    <field name="warehouse"/>
+                    <field name="currency" select="2"/>
+                    <field name="untaxed_amount" select="2"/>
+                    <field name="total_amount" select="2"/>
+                    <field name="state" select="2"/>
+                    <field name="invoice_state" select="2"/>
+                    <field name="packing_state" select="2"/>
+                    <field name="description" select="2"/>
+                    <field name="currency_digits" tree_invisible="1"/>
+                </tree>
+                ]]>
+            </field>
+        </record>
+
+        <record model="ir.action.act_window" id="act_purchase_form">
+            <field name="name">Purchases</field>
+            <field name="res_model">purchase.purchase</field>
+            <field name="view_type">form</field>
+        </record>
+        <record model="ir.action.act_window.view" id="act_purchase_form_view1">
+            <field name="sequence" eval="10"/>
+            <field name="view" ref="purchase_view_tree"/>
+            <field name="act_window" ref="act_purchase_form"/>
+        </record>
+        <record model="ir.action.act_window.view" id="act_purchase_form_view2">
+            <field name="sequence" eval="20"/>
+            <field name="view" ref="purchase_view_form"/>
+            <field name="act_window" ref="act_purchase_form"/>
+        </record>
+        <menuitem parent="menu_purchase" action="act_purchase_form"
+            id="menu_purchase_form"/>
+
+        <record model="ir.action.act_window" id="act_purchase_form_draft">
+            <field name="name">Draft Purchases</field>
+            <field name="res_model">purchase.purchase</field>
+            <field name="view_type">form</field>
+            <field name="domain">[('state', '=', 'draft')]</field>
+        </record>
+        <record model="ir.action.act_window.view" id="act_purchase_form_draft_view1">
+            <field name="sequence" eval="10"/>
+            <field name="view" ref="purchase_view_tree"/>
+            <field name="act_window" ref="act_purchase_form_draft"/>
+        </record>
+        <record model="ir.action.act_window.view" id="act_purchase_form_draft_view2">
+            <field name="sequence" eval="20"/>
+            <field name="view" ref="purchase_view_form"/>
+            <field name="act_window" ref="act_purchase_form_draft"/>
+        </record>
+        <menuitem parent="menu_purchase_form" action="act_purchase_form_draft"
+            id="menu_purchase_form_draft"/>
+
+        <record model="ir.action.act_window" id="act_purchase_form_quotation">
+            <field name="name">Purchases in Quotation</field>
+            <field name="res_model">purchase.purchase</field>
+            <field name="view_type">form</field>
+            <field name="domain">[('state', '=', 'quotation')]</field>
+        </record>
+        <record model="ir.action.act_window.view" id="act_purchase_form_quotation_view1">
+            <field name="sequence" eval="10"/>
+            <field name="view" ref="purchase_view_tree"/>
+            <field name="act_window" ref="act_purchase_form_quotation"/>
+        </record>
+        <record model="ir.action.act_window.view" id="act_purchase_form_quotation_view2">
+            <field name="sequence" eval="20"/>
+            <field name="view" ref="purchase_view_form"/>
+            <field name="act_window" ref="act_purchase_form_quotation"/>
+        </record>
+        <menuitem parent="menu_purchase_form" action="act_purchase_form_quotation"
+            id="menu_purchase_form_quotation"/>
+
+        <record model="ir.action.act_window" id="act_purchase_form_confirmed">
+            <field name="name">Confirmed Purchases</field>
+            <field name="res_model">purchase.purchase</field>
+            <field name="view_type">form</field>
+            <field name="domain">[('state', '=', 'confirmed')]</field>
+        </record>
+        <record model="ir.action.act_window.view" id="act_purchase_form_confirmed_view1">
+            <field name="sequence" eval="10"/>
+            <field name="view" ref="purchase_view_tree"/>
+            <field name="act_window" ref="act_purchase_form_confirmed"/>
+        </record>
+        <record model="ir.action.act_window.view" id="act_purchase_form_confirmed_view2">
+            <field name="sequence" eval="20"/>
+            <field name="view" ref="purchase_view_form"/>
+            <field name="act_window" ref="act_purchase_form_confirmed"/>
+        </record>
+        <menuitem parent="menu_purchase_form" action="act_purchase_form_confirmed"
+            id="menu_purchase_form_confirmed"/>
+
+        <record model="ir.model.access" id="access_purchase">
+            <field name="model" search="[('model', '=', 'purchase.purchase')]"/>
+            <field name="perm_read" eval="True"/>
+            <field name="perm_write" eval="False"/>
+            <field name="perm_create" eval="False"/>
+            <field name="perm_delete" eval="False"/>
+        </record>
+        <record model="ir.model.access" id="access_purchase_purchase">
+            <field name="model" search="[('model', '=', 'purchase.purchase')]"/>
+            <field name="group" ref="group_purchase"/>
+            <field name="perm_read" eval="True"/>
+            <field name="perm_write" eval="True"/>
+            <field name="perm_create" eval="True"/>
+            <field name="perm_delete" eval="True"/>
+        </record>
+        <record model="ir.sequence.type" id="sequence_type_purchase">
+            <field name="name">Purchase</field>
+            <field name="code">purchase.purchase</field>
+        </record>
+        <record model="ir.sequence" id="sequence_purchase">
+            <field name="name">Purchase</field>
+            <field name="code">purchase.purchase</field>
+        </record>
+        <record model="workflow" id="purchase_workflow">
+            <field name="name">Purchase workflow</field>
+            <field name="osv">purchase.purchase</field>
+            <field name="on_create" eval="True"/>
+        </record>
+        <record model="workflow.activity" id="purchase_activity_draft">
+            <field name="name">Draft</field>
+            <field name="workflow" ref="purchase_workflow"/>
+            <field name="kind">function</field>
+            <field name="action">write({'state': 'draft'})</field>
+            <field name="flow_start" eval="True"/>
+        </record>
+        <record model="workflow.activity" id="purchase_activity_quotation">
+            <field name="name">Quotation</field>
+            <field name="workflow" ref="purchase_workflow"/>
+            <field name="kind">function</field>
+            <field name="action">check_for_quotation()
set_reference()
write({'state': 'quotation'})</field>
+        </record>
+        <record model="workflow.activity" id="purchase_activity_confirmed">
+            <field name="name">Confirmed</field>
+            <field name="workflow" ref="purchase_workflow"/>
+            <field name="split_mode">AND</field>
+            <field name="kind">function</field>
+            <field name="action">set_purchase_date()
write({'state': 'confirmed'})</field>
+        </record>
+        <record model="workflow.activity" id="purchase_activity_invoice_method">
+            <field name="name">Invoice Method</field>
+            <field name="workflow" ref="purchase_workflow"/>
+            <field name="split_mode">OR</field>
+        </record>
+        <record model="workflow.activity" id="purchase_activity_invoice_purchase">
+            <field name="name">Invoice</field>
+            <field name="workflow" ref="purchase_workflow"/>
+            <field name="kind">function</field>
+            <field name="action">create_invoice()</field>
+        </record>
+        <record model="workflow.activity" id="purchase_activity_waiting_invoice_purchase">
+            <field name="name">Waiting Invoice</field>
+            <field name="workflow" ref="purchase_workflow"/>
+            <field name="kind">function</field>
+            <field name="action">write({'invoice_state': 'waiting'})
ignore_invoice_exception()</field>
+        </record>
+        <record model="workflow.activity" id="purchase_activity_invoice_purchase_exception">
+            <field name="name">Invoice Exception</field>
+            <field name="workflow" ref="purchase_workflow"/>
+            <field name="kind">function</field>
+            <field name="action">write({'invoice_state': 'exception'})</field>
+        </record>
+        <record model="workflow.activity" id="purchase_activity_invoice_done">
+            <field name="name">Invoice Done</field>
+            <field name="workflow" ref="purchase_workflow"/>
+            <field name="kind">function</field>
+            <field name="action">write({'invoice_state': 'paid'})</field>
+        </record>
+        <record model="workflow.activity" id="purchase_activity_invoice_method_done">
+            <field name="name">Invoice Method Done</field>
+            <field name="workflow" ref="purchase_workflow"/>
+        </record>
+        <record model="workflow.activity" id="purchase_activity_packing">
+            <field name="name">Packing</field>
+            <field name="workflow" ref="purchase_workflow"/>
+            <field name="kind">function</field>
+            <field name="action">create_move()</field>
+        </record>
+        <record model="workflow.activity" id="purchase_activity_waiting_packing">
+            <field name="name">Waiting Packing</field>
+            <field name="workflow" ref="purchase_workflow"/>
+            <field name="kind">function</field>
+            <field name="action">write({'packing_state': 'waiting'})
ignore_packing_exception()
create_move()</field>
+        </record>
+        <record model="workflow.activity" id="purchase_activity_packing_exception">
+            <field name="name">Packing Exception</field>
+            <field name="workflow" ref="purchase_workflow"/>
+            <field name="kind">function</field>
+            <field name="action">write({'packing_state': 'exception'})</field>
+        </record>
+        <record model="workflow.activity" id="purchase_activity_invoice_packing_method">
+            <field name="name">Invoice Packing Method</field>
+            <field name="workflow" ref="purchase_workflow"/>
+            <field name="split_mode">OR</field>
+        </record>
+        <record model="workflow.activity" id="purchase_activity_invoice_packing">
+            <field name="name">Invoice Packing</field>
+            <field name="workflow" ref="purchase_workflow"/>
+            <field name="kind">function</field>
+            <field name="action">create_invoice()
write({'invoice_state': 'waiting'})</field>
+        </record>
+        <record model="workflow.activity" id="purchase_activity_waiting_invoice_packing">
+            <field name="name">Waiting Invoice Packing</field>
+            <field name="workflow" ref="purchase_workflow"/>
+            <field name="kind">function</field>
+            <field name="action">write({'invoice_state': 'waiting', 'packing_state': 'received'})
ignore_invoice_exception()</field>
+        </record>
+        <record model="workflow.activity" id="purchase_activity_invoice_packing_exception">
+            <field name="name">Invoice Packing Exception</field>
+            <field name="workflow" ref="purchase_workflow"/>
+            <field name="action">write({'invoice_state': 'exception'})</field>
+        </record>
+        <record model="workflow.activity" id="purchase_activity_invoice_packing_done">
+            <field name="name">Invoice Packing Done</field>
+            <field name="workflow" ref="purchase_workflow"/>
+            <field name="kind">function</field>
+            <field name="action">write({'invoice_state': 'paid'})</field>
+        </record>
+        <record model="workflow.activity" id="purchase_activity_invoice_packing_method_done">
+            <field name="name">Invoice Packing Method Done</field>
+            <field name="workflow" ref="purchase_workflow"/>
+            <field name="kind">function</field>
+            <field name="action">write({'packing_state': 'received'})</field>
+        </record>
+        <record model="workflow.activity" id="purchase_activity_done">
+            <field name="name">Done</field>
+            <field name="workflow" ref="purchase_workflow"/>
+            <field name="join_mode">AND</field>
+            <field name="kind">function</field>
+            <field name="action">write({'state': 'done'})</field>
+            <field name="flow_stop" eval="True"/>
+        </record>
+        <record model="workflow.activity" id="purchase_activity_cancel">
+            <field name="name">Cancel</field>
+            <field name="workflow" ref="purchase_workflow"/>
+            <field name="kind">function</field>
+            <field name="action">write({'state': 'cancel'})</field>
+            <field name="flow_stop" eval="True"/>
+        </record>
+        <record model="workflow.transition" id="purchase_transition_draft_quotation">
+            <field name="act_from" ref="purchase_activity_draft"/>
+            <field name="act_to" ref="purchase_activity_quotation"/>
+            <field name="signal">quotation</field>
+            <field name="group" ref="group_purchase"/>
+        </record>
+        <record model="workflow.transition" id="purchase_transition_draft_cancel">
+            <field name="act_from" ref="purchase_activity_draft"/>
+            <field name="act_to" ref="purchase_activity_cancel"/>
+            <field name="signal">cancel</field>
+            <field name="group" ref="group_purchase"/>
+        </record>
+        <record model="workflow.transition" id="purchase_transition_quotation_draft">
+            <field name="act_from" ref="purchase_activity_quotation"/>
+            <field name="act_to" ref="purchase_activity_draft"/>
+            <field name="signal">draft</field>
+            <field name="group" ref="group_purchase"/>
+        </record>
+        <record model="workflow.transition" id="purchase_transition_quotation_confirmed">
+            <field name="act_from" ref="purchase_activity_quotation"/>
+            <field name="act_to" ref="purchase_activity_confirmed"/>
+            <field name="signal">confirm</field>
+            <field name="group" ref="group_purchase"/>
+        </record>
+        <record model="workflow.transition" id="purchase_transition_quotation_cancel">
+            <field name="act_from" ref="purchase_activity_quotation"/>
+            <field name="act_to" ref="purchase_activity_cancel"/>
+            <field name="signal">cancel</field>
+            <field name="group" ref="group_purchase"/>
+        </record>
+        <record model="workflow.transition" id="purchase_transition_confirmed_invoice_method">
+            <field name="act_from" ref="purchase_activity_confirmed"/>
+            <field name="act_to" ref="purchase_activity_invoice_method"/>
+        </record>
+        <record model="workflow.transition" id="purchase_transition_invoice_method_invoice_purchase">
+            <field name="act_from" ref="purchase_activity_invoice_method"/>
+            <field name="act_to" ref="purchase_activity_invoice_purchase"/>
+            <field name="condition">invoice_method == 'order'</field>
+        </record>
+        <record model="workflow.transition" id="purchase_transition_invoice_method_invoice_done">
+            <field name="act_from" ref="purchase_activity_invoice_method"/>
+            <field name="act_to" ref="purchase_activity_invoice_method_done"/>
+            <field name="condition">invoice_method != 'order'</field>
+        </record>
+        <record model="workflow.transition" id="purchase_transition_invoice_purchase_waiting_invoice_purchase">
+            <field name="act_from" ref="purchase_activity_invoice_purchase"/>
+            <field name="act_to" ref="purchase_activity_waiting_invoice_purchase"/>
+        </record>
+        <record model="workflow.transition" id="purchase_transition_waiting_invoice_purchase_invoice_purchase_exception">
+            <field name="act_from" ref="purchase_activity_waiting_invoice_purchase"/>
+            <field name="act_to" ref="purchase_activity_invoice_purchase_exception"/>
+            <field name="trigger_model">account.invoice</field>
+            <field name="trigger_expr_id">[x.id for x in invoices]</field>
+            <field name="condition">invoice_exception</field>
+        </record>
+        <record model="workflow.transition" id="purchase_transition_invoice_purchase_exception_invoice_purchase">
+            <field name="act_from" ref="purchase_activity_invoice_purchase_exception"/>
+            <field name="act_to" ref="purchase_activity_waiting_invoice_purchase"/>
+            <field name="signal">invoice_ok</field>
+            <field name="group" ref="group_purchase"/>
+        </record>
+        <record model="workflow.transition" id="purchase_transition_invoice_purchase_exception_cancel">
+            <field name="act_from" ref="purchase_activity_invoice_purchase_exception"/>
+            <field name="act_to" ref="purchase_activity_cancel"/>
+            <field name="signal">cancel</field>
+            <field name="group" ref="group_purchase"/>
+        </record>
+        <record model="workflow.transition" id="purchase_transition_waiting_invoice_purchase_invoice_done">
+            <field name="act_from" ref="purchase_activity_waiting_invoice_purchase"/>
+            <field name="act_to" ref="purchase_activity_invoice_done"/>
+            <field name="trigger_model">account.invoice</field>
+            <field name="trigger_expr_id">[x.id for x in invoices]</field>
+            <field name="condition">invoice_paid</field>
+        </record>
+        <record model="workflow.transition" id="purchase_transition_invoice_done_invoice_method_done">
+            <field name="act_from" ref="purchase_activity_invoice_done"/>
+            <field name="act_to" ref="purchase_activity_invoice_method_done"/>
+        </record>
+        <record model="workflow.transition" id="purchase_transition_invoice_method_done_done">
+            <field name="act_from" ref="purchase_activity_invoice_method_done"/>
+            <field name="act_to" ref="purchase_activity_done"/>
+        </record>
+        <record model="workflow.transition" id="purchase_transition_confirmed_packing">
+            <field name="act_from" ref="purchase_activity_confirmed"/>
+            <field name="act_to" ref="purchase_activity_packing"/>
+        </record>
+        <record model="workflow.transition" id="purchase_transition_packing_waiting_packing">
+            <field name="act_from" ref="purchase_activity_packing"/>
+            <field name="act_to" ref="purchase_activity_waiting_packing"/>
+        </record>
+        <record model="workflow.transition" id="purchase_transition_waiting_packing_packing_exception">
+            <field name="act_from" ref="purchase_activity_waiting_packing"/>
+            <field name="act_to" ref="purchase_activity_packing_exception"/>
+            <field name="signal">packing_update</field>
+            <field name="condition">packing_exception</field>
+        </record>
+        <record model="workflow.transition" id="purchase_transition_packing_exception_cancel">
+            <field name="act_from" ref="purchase_activity_packing_exception"/>
+            <field name="act_to" ref="purchase_activity_cancel"/>
+            <field name="signal">cancel</field>
+            <field name="group" ref="group_purchase"/>
+        </record>
+        <record model="workflow.transition" id="purchase_transition_packing_exception_waiting_packing">
+            <field name="act_from" ref="purchase_activity_packing_exception"/>
+            <field name="act_to" ref="purchase_activity_waiting_packing"/>
+            <field name="signal">packing_ok</field>
+            <field name="group" ref="group_purchase"/>
+        </record>
+        <record model="workflow.transition" id="purchase_transition_waiting_packing_invoice_packing_method">
+            <field name="act_from" ref="purchase_activity_waiting_packing"/>
+            <field name="act_to" ref="purchase_activity_invoice_packing_method"/>
+            <field name="signal">packing_update</field>
+            <field name="condition">not packing_exception</field>
+        </record>
+        <record model="workflow.transition" id="purchase_transition_waiting_packing_invoice_packing_method2">
+            <field name="act_from" ref="purchase_activity_waiting_packing"/>
+            <field name="act_to" ref="purchase_activity_invoice_packing_method"/>
+            <field name="condition">packing_done</field>
+        </record>
+        <record model="workflow.transition" id="purchase_transition_invoice_packing_method_invoice_packing">
+            <field name="act_from" ref="purchase_activity_invoice_packing_method"/>
+            <field name="act_to" ref="purchase_activity_invoice_packing"/>
+            <field name="condition">invoice_method == 'packing'</field>
+        </record>
+        <record model="workflow.transition" id="purchase_transition_invoice_packing_method_invoice_packing_method_done">
+            <field name="act_from" ref="purchase_activity_invoice_packing_method"/>
+            <field name="act_to" ref="purchase_activity_invoice_packing_method_done"/>
+            <field name="condition">invoice_method != 'packing' and packing_done</field>
+        </record>
+        <record model="workflow.transition" id="purchase_transition_invoice_packing_method_waiting_packing">
+            <field name="act_from" ref="purchase_activity_invoice_packing_method"/>
+            <field name="act_to" ref="purchase_activity_waiting_packing"/>
+            <field name="condition">invoice_method != 'packing' and not packing_done</field>
+        </record>
+        <record model="workflow.transition" id="purchase_transition_invoice_packing_waiting_packing">
+            <field name="act_from" ref="purchase_activity_invoice_packing"/>
+            <field name="act_to" ref="purchase_activity_waiting_packing"/>
+            <field name="condition">not packing_done</field>
+        </record>
+        <record model="workflow.transition" id="purchase_transition_invoice_packing_waiting_invoice_packing">
+            <field name="act_from" ref="purchase_activity_invoice_packing"/>
+            <field name="act_to" ref="purchase_activity_waiting_invoice_packing"/>
+            <field name="condition">packing_done</field>
+        </record>
+        <record model="workflow.transition" id="purchase_transition_waiting_invoice_packing_invoice_packing_exception">
+            <field name="act_from" ref="purchase_activity_waiting_invoice_packing"/>
+            <field name="act_to" ref="purchase_activity_invoice_packing_exception"/>
+            <field name="trigger_model">account.invoice</field>
+            <field name="trigger_expr_id">[x.id for x in invoices]</field>
+            <field name="condition">invoice_exception</field>
+        </record>
+        <record model="workflow.transition" id="purchase_transition_invoice_packing_exception_cancel">
+            <field name="act_from" ref="purchase_activity_invoice_packing_exception"/>
+            <field name="act_to" ref="purchase_activity_cancel"/>
+            <field name="signal">cancel</field>
+            <field name="group" ref="group_purchase"/>
+        </record>
+        <record model="workflow.transition" id="purchase_transition_invoice_packing_exception_waiting_invoice_packing">
+            <field name="act_from" ref="purchase_activity_invoice_packing_exception"/>
+            <field name="act_to" ref="purchase_activity_waiting_invoice_packing"/>
+            <field name="signal">invoice_ok</field>
+            <field name="group" ref="group_purchase"/>
+        </record>
+        <record model="workflow.transition" id="purchase_transition_waiting_invoice_packing_invoice_packing_done">
+            <field name="act_from" ref="purchase_activity_waiting_invoice_packing"/>
+            <field name="act_to" ref="purchase_activity_invoice_packing_done"/>
+            <field name="trigger_model">account.invoice</field>
+            <field name="trigger_expr_id">[x.id for x in invoices]</field>
+            <field name="condition">invoice_paid</field>
+        </record>
+        <record model="workflow.transition" id="purchase_transition_invoice_packing_done_invoice_packing_method_done">
+            <field name="act_from" ref="purchase_activity_invoice_packing_done"/>
+            <field name="act_to" ref="purchase_activity_invoice_packing_method_done"/>
+        </record>
+        <record model="workflow.transition" id="purchase_transition_invoice_packing_done_done">
+            <field name="act_from" ref="purchase_activity_invoice_packing_method_done"/>
+            <field name="act_to" ref="purchase_activity_done"/>
+        </record>
+
+        <record model="ir.action.report" id="report_purchase">
+            <field name="name">Purchase</field>
+            <field name="model">purchase.purchase</field>
+            <field name="report_name">purchase.purchase</field>
+            <field name="report">purchase/purchase.odt</field>
+            <field name="style">company/header_A4.odt</field>
+        </record>
+        <record model="ir.action.keyword" id="report_purchase_keyword">
+            <field name="keyword">form_print</field>
+            <field name="model">purchase.purchase,0</field>
+            <field name="action" ref="report_purchase"/>
+        </record>
+
+        <record model="ir.ui.view" id="purchase_line_view_form">
+            <field name="model">purchase.line</field>
+            <field name="type">form</field>
+            <field name="arch" type="xml">
+                <![CDATA[
+                <form string="Purchase Line" cursor="product">
+                    <label name="purchase"/>
+                    <field name="purchase" colspan="3"/>
+                    <label name="type"/>
+                    <field name="type"/>
+                    <label name="sequence"/>
+                    <field name="sequence"/>
+                    <label name="product"/>
+                    <field name="product">
+                        <tree string="Products">
+                            <field name="name" select="1"/>
+                            <field name="code" select="1"/>
+                            <field name="list_price_uom" select="2"/>
+                            <field name="cost_price_uom" select="2"/>
+                            <field name="quantity" select="2"/>
+                            <field name="forecast_quantity" select="2"/>
+                            <field name="default_uom" select="2"/>
+                            <field name="active" select="2"/>
+                        </tree>
+                    </field>
+                    <newline/>
+                    <label name="description"/>
+                    <field name="description" colspan="3"/>
+                    <label name="quantity"/>
+                    <field name="quantity"/>
+                    <label name="unit"/>
+                    <field name="unit"/>
+                    <label name="unit_price"/>
+                    <field name="unit_price"/>
+                    <label name="amount"/>
+                    <field name="amount"/>
+                    <separator name="taxes" colspan="4"/>
+                    <field name="taxes" colspan="4"/>
+                    <separator name="comment" colspan="4"/>
+                    <field name="comment" colspan="4" spell="_parent_purchase.party_lang"/>
+                    <field name="unit_digits" invisible="1"/>
+                </form>
+                ]]>
+            </field>
+        </record>
+
+        <record model="ir.ui.view" id="purchase_line_view_tree">
+            <field name="model">purchase.line</field>
+            <field name="type">tree</field>
+            <field name="arch" type="xml">
+                <![CDATA[
+                <tree string="Purchase Lines">
+                    <field name="purchase" select="1"/>
+                    <field name="type" select="1"/>
+                    <field name="product" select="1"/>
+                    <field name="description" select="1"/>
+                    <field name="quantity" select="1"/>
+                    <field name="unit" select="2"/>
+                    <field name="unit_price" select="2"/>
+                    <field name="taxes"/>
+                    <field name="amount"/>
+                    <field name="unit_digits" tree_invisible="1"/>
+                </tree>
+                ]]>
+            </field>
+        </record>
+        <record model="ir.model.access" id="access_purchase_line">
+            <field name="model" search="[('model', '=', 'purchase.line')]"/>
+            <field name="perm_read" eval="True"/>
+            <field name="perm_write" eval="True"/>
+            <field name="perm_create" eval="True"/>
+            <field name="perm_delete" eval="True"/>
+        </record>
+        <record model="ir.model.access" id="access_purchase_line_purchase">
+            <field name="model" search="[('model', '=', 'purchase.line')]"/>
+            <field name="group" ref="group_purchase"/>
+            <field name="perm_read" eval="True"/>
+            <field name="perm_write" eval="True"/>
+            <field name="perm_create" eval="True"/>
+            <field name="perm_delete" eval="True"/>
+        </record>
+
+        <record model="ir.ui.view" id="product_supplier_view_form">
+            <field name="model">purchase.product_supplier</field>
+            <field name="type">form</field>
+            <field name="arch" type="xml">
+                <![CDATA[
+                <form string="Product Supplier">
+                    <label name="product"/>
+                    <field name="product" colspan="4"/>
+                    <label name="party"/>
+                    <field name="party"/>
+                    <label name="sequence"/>
+                    <field name="sequence"/>
+                    <label name="name"/>
+                    <field name="name"/>
+                    <label name="code"/>
+                    <field name="code"/>
+                    <label name="delivery_time"/>
+                    <field name="delivery_time"/>
+                    <field name="prices" colspan="4"/>
+                </form>
+                ]]>
+            </field>
+        </record>
+        <record model="ir.ui.view" id="product_supplier_view_tree">
+            <field name="model">purchase.product_supplier</field>
+            <field name="type">tree</field>
+            <field name="arch" type="xml">
+                <![CDATA[
+                <tree string="Product Suppliers">
+                    <field name="product" select="1"/>
+                    <field name="party" select="1"/>
+                    <field name="name" select="1"/>
+                    <field name="code" select="1"/>
+                    <field name="sequence" select="2"/>
+                </tree>
+                ]]>
+            </field>
+        </record>
+        <record model="ir.rule.group" id="rule_group_product_supplier">
+            <field name="model" search="[('model', '=', 'purchase.product_supplier')]"/>
+            <field name="global_p" eval="True"/>
+        </record>
+        <record model="ir.rule" id="rule_product_supplier">
+            <field name="field" search="[('name', '=', 'company'), ('model.model', '=', 'purchase.product_supplier')]"/>
+            <field name="operator">=</field>
+            <field name="operand">User/Current Company</field>
+            <field name="rule_group" ref="rule_group_product_supplier"/>
+        </record>
+
+        <record model="ir.ui.view" id="product_supplier_price_view_form">
+            <field name="model">purchase.product_supplier.price</field>
+            <field name="type">form</field>
+            <field name="arch" type="xml">
+                <![CDATA[
+                <form string="Product Supplier Price" col="6">
+                    <label name="product_supplier"/>
+                    <field name="product_supplier" colspan="5"/>
+                    <label name="quantity"/>
+                    <field name="quantity"/>
+                    <label name="unit_price"/>
+                    <field name="unit_price"/>
+                </form>
+                ]]>
+            </field>
+        </record>
+        <record model="ir.ui.view" id="product_supplier_price_view_tree">
+            <field name="model">purchase.product_supplier.price</field>
+            <field name="type">tree</field>
+            <field name="arch" type="xml">
+                <![CDATA[
+                <tree string="Product Supplier Prices">
+                    <field name="product_supplier"/>
+                    <field name="quantity"/>
+                    <field name="unit_price"/>
+                </tree>
+                ]]>
+            </field>
+        </record>
+
+        <record model="ir.ui.view" id="product_view_form">
+            <field name="model">product.product</field>
+            <field name="inherit" ref="product.product_view_form"/>
+            <field name="arch" type="xml">
+                <![CDATA[
+                <data>
+                    <xpath expr="/form/notebook/page/separator[@name="description"]"
+                        position="before">
+                        <label name="purchasable"/>
+                        <field name="purchasable"/>
+                    </xpath>
+                    <xpath expr="/form/notebook/page[@string="General"]"
+                        position="after">
+                        <page string="Suppliers"
+                            states="{'invisible': '''not purchasable'''}">
+                            <label name="purchasable"/>
+                            <field name="purchasable"/>
+                            <label name="purchase_uom"/>
+                            <field name="purchase_uom"/>
+                            <field name="product_suppliers" colspan="4">
+                                <tree string="Product Suppliers" sequence="sequence">
+                                    <field name="party"/>
+                                    <field name="name"/>
+                                    <field name="code"/>
+                                    <field name="sequence" tree_invisible="1"/>
+                                </tree>
+                            </field>
+                        </page>
+                    </xpath>
+                </data>
+                ]]>
+            </field>
+        </record>
+        <record model="ir.ui.view" id="product_view_tree">
+            <field name="model">product.product</field>
+            <field name="inherit" ref="product.product_view_tree"/>
+            <field name="arch" type="xml">
+                <![CDATA[
+                <data>
+                    <xpath expr="/tree/field[@name="default_uom"]"
+                        position="after">
+                        <field name="purchasable" select="2"/>
+                    </xpath>
+                </data>
+                ]]>
+            </field>
+        </record>
+
+        <record model="ir.ui.view" id="packing_in_view_form">
+            <field name="model">stock.packing.in</field>
+            <field name="inherit" ref="stock.packing_in_view_form"/>
+            <field name="arch" type="xml">
+                <![CDATA[
+                <data>
+                    <xpath expr="/form/notebook/page/field[@name="incoming_moves"]/tree/field[@name="uom"]"
+                        position="after">
+                        <field name="purchase" select="1"/>
+                    </xpath>
+                </data>
+                ]]>
+            </field>
+        </record>
+
+        <record model="ir.ui.view" id="move_view_form">
+            <field name="model">stock.move</field>
+            <field name="inherit" ref="stock.move_view_form"/>
+            <field name="arch" type="xml">
+                <![CDATA[
+                <data>
+                    <xpath expr="/form/field[@name="uom"]"
+                        position="after">
+                        <label name="purchase_quantity"/>
+                        <field name="purchase_quantity"/>
+                        <label name="purchase_unit"/>
+                        <field name="purchase_unit"/>
+                    </xpath>
+                    <xpath expr="/form/field[@name="currency"]"
+                        position="after">
+                        <label name="purchase_unit_price"/>
+                        <field name="purchase_unit_price"/>
+                        <label name="purchase_currency"/>
+                        <field name="purchase_currency"/>
+                    </xpath>
+                    <xpath expr="/form/field[@name="effective_date"]"
+                        position="after">
+                        <label name="purchase"/>
+                        <field name="purchase"/>
+                        <newline/>
+                    </xpath>
+                    <xpath expr="/form/field[@name="unit_digits"]"
+                        position="after">
+                        <field name="purchase_unit_digits" invisible="1" colspan="4"/>
+                    </xpath>
+                </data>
+                ]]>
+            </field>
+        </record>
+
+        <record model="ir.action.wizard" id="act_open_supplier">
+            <field name="name">Suppliers</field>
+            <field name="wiz_name">purchase.open_supplier</field>
+        </record>
+        <menuitem name="Suppliers"
+            parent="party.menu_party_form"
+            action="act_open_supplier"
+            icon="tryton-list"
+            id="menu_supplier"/>
+    </data>
+</tryton>
diff --git a/setup.cfg b/setup.cfg
new file mode 100644
index 0000000..861a9f5
--- /dev/null
+++ b/setup.cfg
@@ -0,0 +1,5 @@
+[egg_info]
+tag_build = 
+tag_date = 0
+tag_svn_revision = 0
+
diff --git a/setup.py b/setup.py
new file mode 100644
index 0000000..1bbcd40
--- /dev/null
+++ b/setup.py
@@ -0,0 +1,57 @@
+#!/usr/bin/env python
+#This file is part of Tryton.  The COPYRIGHT file at the top level of
+#this repository contains the full copyright notices and license terms.
+
+from setuptools import setup, find_packages
+import re
+
+info = eval(file('__tryton__.py').read())
+
+requires = []
+for dep in info.get('depends', []):
+    match = re.compile(
+            '(ir|res|workflow|webdav)((\s|$|<|>|<=|>=|==|!=).*?$)').match(dep)
+    if match:
+        continue
+    else:
+        dep = 'trytond_' + dep
+    requires.append(dep)
+
+major_version, minor_version, _ = info.get('version', '0.0.1').split('.', 2)
+requires.append('trytond >= %s.%s' % (major_version, minor_version))
+requires.append('trytond < %s.%s' % (major_version, str(int(minor_version) + 1)))
+
+setup(name='trytond_purchase',
+    version=info.get('version', '0.0.1'),
+    description=info.get('description', ''),
+    author=info.get('author', ''),
+    author_email=info.get('email', ''),
+    url=info.get('website', ''),
+    package_dir={'trytond.modules.purchase': '.'},
+    packages=[
+        'trytond.modules.purchase',
+    ],
+    package_data={
+        'trytond.modules.purchase': info.get('xml', []) \
+                + info.get('translation', []) \
+                + ['purchase.odt'],
+    },
+    classifiers=[
+        'Development Status :: 5 - Production/Stable',
+        'Environment :: Plugins',
+        'Intended Audience :: Developers',
+        'Intended Audience :: Financial and Insurance Industry',
+        'Intended Audience :: Legal Industry',
+        'License :: OSI Approved :: GNU General Public License (GPL)',
+        'Natural Language :: English',
+        'Natural Language :: French',
+        'Natural Language :: German',
+        'Natural Language :: Spanish',
+        'Operating System :: OS Independent',
+        'Programming Language :: Python',
+        'Topic :: Office/Business',
+        'Topic :: Office/Business :: Financial :: Accounting',
+    ],
+    license='GPL-3',
+    install_requires=requires,
+)
diff --git a/trytond_purchase.egg-info/PKG-INFO b/trytond_purchase.egg-info/PKG-INFO
new file mode 100644
index 0000000..7454a4d
--- /dev/null
+++ b/trytond_purchase.egg-info/PKG-INFO
@@ -0,0 +1,34 @@
+Metadata-Version: 1.0
+Name: trytond-purchase
+Version: 1.0.0
+Summary: Define purchase order.
+Add product supplier and purchase informations.
+Define the purchase price as the supplier price or the cost price.
+
+With the possibilities:
+    - to follow invoice and packing states from the purchase order.
+    - to define invoice method:
+        - Manual
+        - Based On Order
+        - Based On Packing
+
+Home-page: http://www.tryton.org/
+Author: B2CK
+Author-email: info at b2ck.com
+License: GPL-3
+Description: UNKNOWN
+Platform: UNKNOWN
+Classifier: Development Status :: 5 - Production/Stable
+Classifier: Environment :: Plugins
+Classifier: Intended Audience :: Developers
+Classifier: Intended Audience :: Financial and Insurance Industry
+Classifier: Intended Audience :: Legal Industry
+Classifier: License :: OSI Approved :: GNU General Public License (GPL)
+Classifier: Natural Language :: English
+Classifier: Natural Language :: French
+Classifier: Natural Language :: German
+Classifier: Natural Language :: Spanish
+Classifier: Operating System :: OS Independent
+Classifier: Programming Language :: Python
+Classifier: Topic :: Office/Business
+Classifier: Topic :: Office/Business :: Financial :: Accounting
diff --git a/trytond_purchase.egg-info/SOURCES.txt b/trytond_purchase.egg-info/SOURCES.txt
new file mode 100644
index 0000000..cbb836e
--- /dev/null
+++ b/trytond_purchase.egg-info/SOURCES.txt
@@ -0,0 +1,21 @@
+CHANGELOG
+COPYRIGHT
+INSTALL
+LICENSE
+MANIFEST.in
+README
+TODO
+de_DE.csv
+es_ES.csv
+fr_FR.csv
+purchase.odt
+purchase.xml
+setup.py
+./__init__.py
+./__tryton__.py
+./purchase.py
+trytond_purchase.egg-info/PKG-INFO
+trytond_purchase.egg-info/SOURCES.txt
+trytond_purchase.egg-info/dependency_links.txt
+trytond_purchase.egg-info/requires.txt
+trytond_purchase.egg-info/top_level.txt
\ No newline at end of file
diff --git a/trytond_purchase.egg-info/dependency_links.txt b/trytond_purchase.egg-info/dependency_links.txt
new file mode 100644
index 0000000..8b13789
--- /dev/null
+++ b/trytond_purchase.egg-info/dependency_links.txt
@@ -0,0 +1 @@
+
diff --git a/trytond_purchase.egg-info/requires.txt b/trytond_purchase.egg-info/requires.txt
new file mode 100644
index 0000000..3fb0c72
--- /dev/null
+++ b/trytond_purchase.egg-info/requires.txt
@@ -0,0 +1,10 @@
+trytond_company
+trytond_party
+trytond_stock
+trytond_account
+trytond_product
+trytond_account_invoice
+trytond_currency
+trytond_account_product
+trytond >= 1.0
+trytond < 1.1
\ No newline at end of file
diff --git a/trytond_purchase.egg-info/top_level.txt b/trytond_purchase.egg-info/top_level.txt
new file mode 100644
index 0000000..93df119
--- /dev/null
+++ b/trytond_purchase.egg-info/top_level.txt
@@ -0,0 +1 @@
+trytond
-- 
tryton-modules-purchase



More information about the tryton-debian-vcs mailing list