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