From 27650a37ee3b08b34e363999522ef146463b00ec Mon Sep 17 00:00:00 2001 From: sergio-incaser Date: Thu, 8 Oct 2015 13:02:48 +0200 Subject: [PATCH 1/7] [ADD] sale_packaging_price: New module to assign a package price. --- sale_packaging_price/README.rst | 75 +++++++++++++ sale_packaging_price/__init__.py | 7 ++ sale_packaging_price/__openerp__.py | 22 ++++ sale_packaging_price/i18n/es.po | 100 ++++++++++++++++++ .../i18n/sale_packaging_price.pot | 98 +++++++++++++++++ sale_packaging_price/models/__init__.py | 7 ++ sale_packaging_price/models/product.py | 16 +++ sale_packaging_price/models/sale_stock.py | 46 ++++++++ sale_packaging_price/report/__init__.py | 6 ++ sale_packaging_price/report/sale_report.py | 29 +++++ .../static/description/icon.png | Bin 0 -> 9455 bytes sale_packaging_price/tests/__init__.py | 6 ++ .../tests/test_sale_packaging_price.py | 82 ++++++++++++++ sale_packaging_price/views/product_view.xml | 81 ++++++++++++++ .../views/sale_packaging_price_menu.xml | 12 +++ .../views/sale_stock_view.xml | 30 ++++++ 16 files changed, 617 insertions(+) create mode 100644 sale_packaging_price/README.rst create mode 100644 sale_packaging_price/__init__.py create mode 100644 sale_packaging_price/__openerp__.py create mode 100644 sale_packaging_price/i18n/es.po create mode 100644 sale_packaging_price/i18n/sale_packaging_price.pot create mode 100644 sale_packaging_price/models/__init__.py create mode 100644 sale_packaging_price/models/product.py create mode 100644 sale_packaging_price/models/sale_stock.py create mode 100644 sale_packaging_price/report/__init__.py create mode 100644 sale_packaging_price/report/sale_report.py create mode 100644 sale_packaging_price/static/description/icon.png create mode 100644 sale_packaging_price/tests/__init__.py create mode 100644 sale_packaging_price/tests/test_sale_packaging_price.py create mode 100644 sale_packaging_price/views/product_view.xml create mode 100644 sale_packaging_price/views/sale_packaging_price_menu.xml create mode 100644 sale_packaging_price/views/sale_stock_view.xml diff --git a/sale_packaging_price/README.rst b/sale_packaging_price/README.rst new file mode 100644 index 00000000000..42a3fd87892 --- /dev/null +++ b/sale_packaging_price/README.rst @@ -0,0 +1,75 @@ +.. image:: https://img.shields.io/badge/licence-AGPL--3-blue.svg + :target: http://www.gnu.org/licenses/agpl-3.0-standalone.html + :alt: License: AGPL-3 + +==================== +Sale Packaging Price +==================== + +This module was written to extends the functionality of sale workflow +and allow you to assign a selling price of a complete package. + +Configuration +============= + +To configure this module, you need to: + +* go to warehouse config and check 'Use packages: pallets, boxes, ...' and +'Allow to define several packaging methods on products' + +Usage +===== + +To use this module, you need to: + +* go to product and into procurement tab you can add new packages with a +sale price + +* This module also adds a new entry into product menu called 'Packaging' to +add quickly combinations packages + +.. image:: https://odoo-community.org/website/image/ir.attachment/5784_f2813bd/datas + :alt: Try me on Runbot + :target: https://runbot.odoo-community.org/runbot/167/8.0 + +For further information, please visit: + +* https://www.odoo.com/forum/help-1 + +Known issues / Roadmap +====================== + + +Bug Tracker +=========== + +Bugs are tracked on `GitHub Issues `_. +In case of trouble, please check there if your issue has already been reported. +If you spotted it first, help us smashing it by providing a detailed and welcomed feedback +`here `_. + +Credits +======= + +Contributors +------------ + +* Rafael Blasco +* Pedro M. Baeza +* Carlos Dauden +* Sergio Teruel + +Maintainer +---------- + +.. image:: https://odoo-community.org/logo.png + :alt: Odoo Community Association + :target: https://odoo-community.org + +This module is maintained by the OCA. + +OCA, or the Odoo Community Association, is a nonprofit organization whose +mission is to support the collaborative development of Odoo features and +promote its widespread use. + +To contribute to this module, please visit http://odoo-community.org. diff --git a/sale_packaging_price/__init__.py b/sale_packaging_price/__init__.py new file mode 100644 index 00000000000..38e796ced1b --- /dev/null +++ b/sale_packaging_price/__init__.py @@ -0,0 +1,7 @@ +# -*- coding: utf-8 -*- +# (c) 2015 Antiun Ingeniería S.L. - Sergio Teruel +# (c) 2015 Antiun Ingeniería S.L. - Carlos Dauden +# License AGPL-3 - See http://www.gnu.org/licenses/agpl-3.0.html + +from . import models +from . import report diff --git a/sale_packaging_price/__openerp__.py b/sale_packaging_price/__openerp__.py new file mode 100644 index 00000000000..4a503a6638b --- /dev/null +++ b/sale_packaging_price/__openerp__.py @@ -0,0 +1,22 @@ +# -*- coding: utf-8 -*- +# (c) 2015 Antiun Ingeniería S.L. - Sergio Teruel +# (c) 2015 Antiun Ingeniería S.L. - Carlos Dauden +# License AGPL-3 - See http://www.gnu.org/licenses/agpl-3.0.html + +{ + 'name': "Sale Packaging Price", + 'category': 'Sales Management', + 'version': '8.0.1.0.0', + 'depends': ['sale_stock'], + 'data': [ + 'views/product_view.xml', + 'views/sale_stock_view.xml', + 'views/sale_packaging_price_menu.xml', + ], + 'author': 'Incaser Informatica S.L., ' + 'Antiun Ingeniería S.L., ' + 'Odoo Community Association (OCA)', + 'website': 'http://www.incaser.es', + 'license': 'AGPL-3', + 'installable': True, +} diff --git a/sale_packaging_price/i18n/es.po b/sale_packaging_price/i18n/es.po new file mode 100644 index 00000000000..c4dade95bff --- /dev/null +++ b/sale_packaging_price/i18n/es.po @@ -0,0 +1,100 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * sale_packaging_price +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 8.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2015-10-09 10:03+0000\n" +"PO-Revision-Date: 2015-10-09 12:07+0100\n" +"Last-Translator: Sergio Teruel \n" +"Language-Team: \n" +"Language: es-ES\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: Poedit 1.5.4\n" + +#. module: sale_packaging_price +#: model:ir.actions.act_window,help:sale_packaging_price.action_product_packaging_form +msgid "" +"

\n" +" Click to add a packaging for your products.\n" +"

\n" +" " +msgstr "Pinche aquí crear empaquetados de productos" + +#. module: sale_packaging_price +#: view:product.packaging:sale_packaging_price.view_sale_packaging_price_product_packaging_filter +msgid "Group By..." +msgstr "Agrupar por..." + +#. module: sale_packaging_price +#: view:product.packaging:sale_packaging_price.view_sale_packaging_price_product_packaging_filter +msgid "Logistic Unit" +msgstr "Unidad logística" + +#. module: sale_packaging_price +#: field:product.packaging,list_price:0 +#: view:sale.order:sale_packaging_price.sale_packaging_price_view_order_form_inherit +msgid "Package Price" +msgstr "Precio paquete" + +#. module: sale_packaging_price +#: view:sale.order:sale_packaging_price.sale_packaging_price_view_order_form_inherit +#: field:sale.order.line,packaging_weight:0 +msgid "Package Weight" +msgstr "Peso empaquetado" + +#. module: sale_packaging_price +#: model:ir.model,name:sale_packaging_price.model_product_packaging +msgid "Packaging" +msgstr "Empaquetado" + +#. module: sale_packaging_price +#: view:product.packaging:sale_packaging_price.view_sale_packaging_price_product_packaging_filter +msgid "Product" +msgstr "Producto" + +#. module: sale_packaging_price +#: field:sale.report,product_packaging:0 +msgid "Product Package" +msgstr "Empaquetado" + +#. module: sale_packaging_price +#: model:ir.actions.act_window,name:sale_packaging_price.action_product_packaging_form +#: model:ir.ui.menu,name:sale_packaging_price.menu_product_packaging_action +msgid "Product Packaging" +msgstr "Empaquetado" + +#. module: sale_packaging_price +#: field:sale.report,qty_packaging:0 +msgid "Qty Package" +msgstr "Núm. paquetes" + +#. module: sale_packaging_price +#: model:ir.model,name:sale_packaging_price.model_sale_order_line +msgid "Sales Order Line" +msgstr "Línea pedido de venta" + +#. module: sale_packaging_price +#: model:ir.model,name:sale_packaging_price.model_sale_report +msgid "Sales Orders Statistics" +msgstr "Estadísticas pedidos de venta" + +#. module: sale_packaging_price +#: view:product.packaging:sale_packaging_price.view_sale_packaging_price_product_packaging_filter +msgid "Search Product Packaging" +msgstr "Buscar empaquetado" + +#. module: sale_packaging_price +#: help:product.packaging,list_price:0 +msgid "This price will be considered as a price for complete package" +msgstr "Precio del paquete completo" + +#. module: sale_packaging_price +#: view:product.packaging:sale_packaging_price.sale_packaging_price_product_packaging_tree_inherit +#, fuzzy +msgid "top" +msgstr "Lo más de lo más" diff --git a/sale_packaging_price/i18n/sale_packaging_price.pot b/sale_packaging_price/i18n/sale_packaging_price.pot new file mode 100644 index 00000000000..28d8b81f579 --- /dev/null +++ b/sale_packaging_price/i18n/sale_packaging_price.pot @@ -0,0 +1,98 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * sale_packaging_price +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 8.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2015-10-09 10:03+0000\n" +"PO-Revision-Date: 2015-10-09 10:03+0000\n" +"Last-Translator: <>\n" +"Language-Team: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: \n" + +#. module: sale_packaging_price +#: model:ir.actions.act_window,help:sale_packaging_price.action_product_packaging_form +msgid "

\n" +" Click to add a packaging for your products.\n" +"

\n" +" " +msgstr "" + +#. module: sale_packaging_price +#: view:product.packaging:sale_packaging_price.view_sale_packaging_price_product_packaging_filter +msgid "Group By..." +msgstr "" + +#. module: sale_packaging_price +#: view:product.packaging:sale_packaging_price.view_sale_packaging_price_product_packaging_filter +msgid "Logistic Unit" +msgstr "" + +#. module: sale_packaging_price +#: field:product.packaging,list_price:0 +#: view:sale.order:sale_packaging_price.sale_packaging_price_view_order_form_inherit +msgid "Package Price" +msgstr "" + +#. module: sale_packaging_price +#: view:sale.order:sale_packaging_price.sale_packaging_price_view_order_form_inherit +#: field:sale.order.line,packaging_weight:0 +msgid "Package Weight" +msgstr "" + +#. module: sale_packaging_price +#: model:ir.model,name:sale_packaging_price.model_product_packaging +msgid "Packaging" +msgstr "" + +#. module: sale_packaging_price +#: view:product.packaging:sale_packaging_price.view_sale_packaging_price_product_packaging_filter +msgid "Product" +msgstr "" + +#. module: sale_packaging_price +#: field:sale.report,product_packaging:0 +msgid "Product Package" +msgstr "" + +#. module: sale_packaging_price +#: model:ir.actions.act_window,name:sale_packaging_price.action_product_packaging_form +#: model:ir.ui.menu,name:sale_packaging_price.menu_product_packaging_action +msgid "Product Packaging" +msgstr "" + +#. module: sale_packaging_price +#: field:sale.report,qty_packaging:0 +msgid "Qty Package" +msgstr "" + +#. module: sale_packaging_price +#: model:ir.model,name:sale_packaging_price.model_sale_order_line +msgid "Sales Order Line" +msgstr "" + +#. module: sale_packaging_price +#: model:ir.model,name:sale_packaging_price.model_sale_report +msgid "Sales Orders Statistics" +msgstr "" + +#. module: sale_packaging_price +#: view:product.packaging:sale_packaging_price.view_sale_packaging_price_product_packaging_filter +msgid "Search Product Packaging" +msgstr "" + +#. module: sale_packaging_price +#: help:product.packaging,list_price:0 +msgid "This price will be considered as a price for complete package" +msgstr "" + +#. module: sale_packaging_price +#: view:product.packaging:sale_packaging_price.sale_packaging_price_product_packaging_tree_inherit +msgid "top" +msgstr "" + diff --git a/sale_packaging_price/models/__init__.py b/sale_packaging_price/models/__init__.py new file mode 100644 index 00000000000..72c71be42ab --- /dev/null +++ b/sale_packaging_price/models/__init__.py @@ -0,0 +1,7 @@ +# -*- coding: utf-8 -*- +# (c) 2015 Antiun Ingeniería S.L. - Sergio Teruel +# (c) 2015 Antiun Ingeniería S.L. - Carlos Dauden +# License AGPL-3 - See http://www.gnu.org/licenses/agpl-3.0.html + +from . import product +from . import sale_stock diff --git a/sale_packaging_price/models/product.py b/sale_packaging_price/models/product.py new file mode 100644 index 00000000000..b5b75a96b42 --- /dev/null +++ b/sale_packaging_price/models/product.py @@ -0,0 +1,16 @@ +# -*- coding: utf-8 -*- +# (c) 2015 Antiun Ingeniería S.L. - Sergio Teruel +# (c) 2015 Antiun Ingeniería S.L. - Carlos Dauden +# License AGPL-3 - See http://www.gnu.org/licenses/agpl-3.0.html + +from openerp import models, fields +from openerp.addons.decimal_precision import decimal_precision as dp + + +class ProductPackaging(models.Model): + _inherit = 'product.packaging' + + list_price = fields.Float( + string='Package Price', + digits_compute=dp.get_precision('Product Price'), + help="This price will be considered as a price for complete package") diff --git a/sale_packaging_price/models/sale_stock.py b/sale_packaging_price/models/sale_stock.py new file mode 100644 index 00000000000..755c51092d2 --- /dev/null +++ b/sale_packaging_price/models/sale_stock.py @@ -0,0 +1,46 @@ +# -*- coding: utf-8 -*- +# (c) 2015 Antiun Ingeniería S.L. - Sergio Teruel +# (c) 2015 Antiun Ingeniería S.L. - Carlos Dauden +# License AGPL-3 - See http://www.gnu.org/licenses/agpl-3.0.html + +import math + +from openerp import models, fields, api +from openerp.addons.decimal_precision import decimal_precision as dp + +class SaleOrderLine(models.Model): + _inherit = 'sale.order.line' + + packaging_price = fields.Float( + related='product_packaging.list_price', string='Package Price', + readonly=True) + product_packaging = fields.Many2one(ondelete='restrict') + packaging_weight = fields.Float( + string='Package Weight', + digits_compute=dp.get_precision('Stock Weight')) + + @api.multi + def product_packaging_change( + self, pricelist, product, qty=0, uom=False, partner_id=False, + packaging=False, flag=False): + res = super(SaleOrderLine, self).product_packaging_change( + pricelist, product, qty, uom, partner_id, packaging, flag) + if packaging: + product_packaging = self.env['product.packaging'].browse(packaging) + product_prec = self.env['decimal.precision'].precision_get( + 'Product Price') + res['value']['price_unit'] = round( + product_packaging.list_price / product_packaging.qty, + product_prec) + package_weight = math.ceil( + qty / product_packaging.qty) * product_packaging.ul.weight + res['value']['packaging_weight'] = package_weight + else: + res = self.product_id_change(pricelist=pricelist, + product=product, qty=qty, uom=uom, partner_id=partner_id, + packaging=packaging, flag=False) + price_unit = res['value'].get('price_unit', 0.0) + package_weight = res['value'].get('packaging_weight', 0.0) + res['value'] = {'price_unit': price_unit, + 'packaging_weight': package_weight} + return res diff --git a/sale_packaging_price/report/__init__.py b/sale_packaging_price/report/__init__.py new file mode 100644 index 00000000000..d71e24753ae --- /dev/null +++ b/sale_packaging_price/report/__init__.py @@ -0,0 +1,6 @@ +# -*- coding: utf-8 -*- +# (c) 2015 Antiun Ingeniería S.L. - Sergio Teruel +# (c) 2015 Antiun Ingeniería S.L. - Carlos Dauden +# License AGPL-3 - See http://www.gnu.org/licenses/agpl-3.0.html + +from . import sale_report diff --git a/sale_packaging_price/report/sale_report.py b/sale_packaging_price/report/sale_report.py new file mode 100644 index 00000000000..8927f4dd6fe --- /dev/null +++ b/sale_packaging_price/report/sale_report.py @@ -0,0 +1,29 @@ +# -*- coding: utf-8 -*- +# (c) 2015 Antiun Ingeniería S.L. - Sergio Teruel +# (c) 2015 Antiun Ingeniería S.L. - Carlos Dauden +# License AGPL-3 - See http://www.gnu.org/licenses/agpl-3.0.html + +from openerp import models, fields + + +class SaleReport(models.Model): + _inherit = 'sale.report' + + product_packaging = fields.Many2one( + comodel_name='product.packaging', string='Product Package', + readonly=True) + qty_packaging = fields.Integer(string='Qty Package', readonly=True) + + def _select(self): + res = super(SaleReport, self)._select() + return res + ', l.product_packaging as product_packaging' \ + ', sum(l.product_uom_qty / pk.qty) as qty_packaging' + + def _from(self): + res = super(SaleReport, self)._from() + return res + ' left join product_packaging pk on (' \ + 'pk.id = l.product_packaging)' + + def _group_by(self): + res = super(SaleReport, self)._group_by() + return res + ', l.product_packaging' diff --git a/sale_packaging_price/static/description/icon.png b/sale_packaging_price/static/description/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..3a0328b516c4980e8e44cdb63fd945757ddd132d GIT binary patch literal 9455 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 z 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 Xviia!U7SGha1wx#SCgwmn*{w2TRX*I literal 0 HcmV?d00001 diff --git a/sale_packaging_price/tests/__init__.py b/sale_packaging_price/tests/__init__.py new file mode 100644 index 00000000000..9b4449fc79d --- /dev/null +++ b/sale_packaging_price/tests/__init__.py @@ -0,0 +1,6 @@ +# -*- coding: utf-8 -*- +# (c) 2015 Antiun Ingeniería S.L. - Sergio Teruel +# (c) 2015 Antiun Ingeniería S.L. - Carlos Dauden +# License AGPL-3 - See http://www.gnu.org/licenses/agpl-3.0.html + +from . import test_sale_packaging_price diff --git a/sale_packaging_price/tests/test_sale_packaging_price.py b/sale_packaging_price/tests/test_sale_packaging_price.py new file mode 100644 index 00000000000..dafb0ee4043 --- /dev/null +++ b/sale_packaging_price/tests/test_sale_packaging_price.py @@ -0,0 +1,82 @@ +# -*- coding: utf-8 -*- +# (c) 2015 Antiun Ingeniería S.L. - Sergio Teruel +# (c) 2015 Antiun Ingeniería S.L. - Carlos Dauden +# License AGPL-3 - See http://www.gnu.org/licenses/agpl-3.0.html + +from openerp.tests.common import TransactionCase + + +class TestSalePackagingPrice(TransactionCase): + # Use case : Prepare some data for current test case + def setUp(self): + super(TestSalePackagingPrice, self).setUp() + self.product = self.env.ref('product.product_product_6') + self.product.product_tmpl_id.lst_price = 10.0 + + # Create logistic units + product_ul_obj = self.env['product.ul'] + self.pack_3 = product_ul_obj.create({'name': 'pack 3 units', + 'type': 'box', + 'weight': 25.50}) + self.pack_6 = product_ul_obj.create({'name': 'pack 6 units', + 'type': 'box'}) + + # Assign logistic units to product packaging + product_packaging_obj = self.env['product.packaging'] + self.product_pack_3 = product_packaging_obj.create( + {'name': 'product pack 3 units', + 'product_tmpl_id': self.product.product_tmpl_id.id, + 'ul': self.pack_3.id, + 'qty': 3.0, + 'list_price': 60.0, + }) + self.product_pack_6 = product_packaging_obj.create( + {'name': 'product pack 6 units', + 'product_tmpl_id': self.product.product_tmpl_id.id, + 'ul': self.pack_6.id, + 'qty': 6.0, + 'list_price': 90.0, + }) + + self.sale_order_model = self.env['sale.order'] + self.partner_model = self.env['res.partner'] + self.partner1 = self.partner_model.create({'name': 'Partner1'}) + self.sale_order = self.sale_order_model.create({ + 'partner_id': self.partner1.id, + 'order_policy': 'manual', + 'order_line': [(0, 0, {'product_id': self.product.id, })], + }) + + def test_sale_packaging_price(self): + res = self.sale_order.order_line.product_packaging_change( + 1, self.product.id, qty=3, uom=False, + partner_id=self.sale_order.partner_id.id, + packaging=self.product_pack_3.id, flag=False) + price_unit = res['value']['price_unit'] + self.assertAlmostEqual(price_unit, 20.0) + + # Check package weight + res = self.sale_order.order_line.product_packaging_change( + 1, self.product.id, qty=2, uom=False, + partner_id=self.sale_order.partner_id.id, + packaging=self.product_pack_3.id, flag=False) + package_weight = res['value']['packaging_weight'] + self.assertAlmostEqual(package_weight, 25.5) + + res = self.sale_order.order_line.product_packaging_change( + 1, self.product.id, qty=6, uom=False, + partner_id=self.sale_order.partner_id.id, + packaging=self.product_pack_6.id, flag=False) + price_unit = res['value']['price_unit'] + self.assertAlmostEqual(price_unit, 15.0) + + # Check values when delete package assigned + res = self.sale_order.order_line.product_packaging_change( + 1, self.product.id, qty=6, uom=False, + partner_id=self.sale_order.partner_id.id, + packaging=False, flag=False) + price_unit = res['value']['price_unit'] + package_weight = res['value']['packaging_weight'] + self.assertAlmostEqual( + price_unit, self.product.product_tmpl_id.lst_price) + self.assertAlmostEqual(package_weight, 0.0) diff --git a/sale_packaging_price/views/product_view.xml b/sale_packaging_price/views/product_view.xml new file mode 100644 index 00000000000..a9d8d04b0aa --- /dev/null +++ b/sale_packaging_price/views/product_view.xml @@ -0,0 +1,81 @@ + + + + + + sale.packaging.price.product.tree.inherit + product.packaging + + + + + + + + + + sale.packaging.price.product.packaging.tree.inherit + product.packaging + + + + + + + top + + + + + + sale.packaging.price.product.packaging.form.inherit + product.packaging + + + + + + + + + + sale.packaging.price.no.product.packaging.form.inherit + product.packaging + + + + + + + + + + sale.packaging.price.product.packaging.filter + product.packaging + + + + + + + + + + + + + Product Packaging + ir.actions.act_window + product.packaging + form + tree,form + +

+ Click to add a packaging for your products. +

+
+
+ +
+
diff --git a/sale_packaging_price/views/sale_packaging_price_menu.xml b/sale_packaging_price/views/sale_packaging_price_menu.xml new file mode 100644 index 00000000000..3e6d42feda3 --- /dev/null +++ b/sale_packaging_price/views/sale_packaging_price_menu.xml @@ -0,0 +1,12 @@ + + + + + + + + diff --git a/sale_packaging_price/views/sale_stock_view.xml b/sale_packaging_price/views/sale_stock_view.xml new file mode 100644 index 00000000000..70faed8c579 --- /dev/null +++ b/sale_packaging_price/views/sale_stock_view.xml @@ -0,0 +1,30 @@ + + + + + + sale.packaging.price.view.order.form.inherit + sale.order + form + + + + + + + + + + + + + + + + + + From 9bbd90d502ca19af759b02e3a5125163012b49c0 Mon Sep 17 00:00:00 2001 From: sergio-incaser Date: Thu, 22 Oct 2015 19:36:50 +0200 Subject: [PATCH 2/7] [FIX] sale_packaging_price: Changes suggested by @yajo and @pedrobaeza. --- sale_packaging_price/README.rst | 12 +++++------ sale_packaging_price/i18n/es.po | 19 +++++++++--------- .../i18n/sale_packaging_price.pot | 19 +++++++++--------- sale_packaging_price/views/product_view.xml | 20 +++++++++---------- .../views/sale_packaging_price_menu.xml | 6 ++++++ .../views/sale_stock_view.xml | 4 ++-- 6 files changed, 44 insertions(+), 36 deletions(-) diff --git a/sale_packaging_price/README.rst b/sale_packaging_price/README.rst index 42a3fd87892..15ff99a4dcc 100644 --- a/sale_packaging_price/README.rst +++ b/sale_packaging_price/README.rst @@ -15,18 +15,18 @@ Configuration To configure this module, you need to: * go to warehouse config and check 'Use packages: pallets, boxes, ...' and -'Allow to define several packaging methods on products' + 'Allow to define several packaging methods on products' Usage ===== To use this module, you need to: -* go to product and into procurement tab you can add new packages with a -sale price +* go to product and into inventory tab you can add new packages with a + sale price * This module also adds a new entry into product menu called 'Packaging' to -add quickly combinations packages + add quickly combinations packages .. image:: https://odoo-community.org/website/image/ir.attachment/5784_f2813bd/datas :alt: Try me on Runbot @@ -43,10 +43,10 @@ Known issues / Roadmap Bug Tracker =========== -Bugs are tracked on `GitHub Issues `_. +Bugs are tracked on `GitHub Issues `_. In case of trouble, please check there if your issue has already been reported. If you spotted it first, help us smashing it by providing a detailed and welcomed feedback -`here `_. +`here `_. Credits ======= diff --git a/sale_packaging_price/i18n/es.po b/sale_packaging_price/i18n/es.po index c4dade95bff..7a006d84f1c 100644 --- a/sale_packaging_price/i18n/es.po +++ b/sale_packaging_price/i18n/es.po @@ -6,8 +6,8 @@ msgid "" msgstr "" "Project-Id-Version: Odoo Server 8.0\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-10-09 10:03+0000\n" -"PO-Revision-Date: 2015-10-09 12:07+0100\n" +"POT-Creation-Date: 2015-10-22 17:33+0000\n" +"PO-Revision-Date: 2015-10-22 19:34+0100\n" "Last-Translator: Sergio Teruel \n" "Language-Team: \n" "Language: es-ES\n" @@ -26,23 +26,23 @@ msgid "" msgstr "Pinche aquí crear empaquetados de productos" #. module: sale_packaging_price -#: view:product.packaging:sale_packaging_price.view_sale_packaging_price_product_packaging_filter +#: view:product.packaging:sale_packaging_price.product_packaging_filter msgid "Group By..." msgstr "Agrupar por..." #. module: sale_packaging_price -#: view:product.packaging:sale_packaging_price.view_sale_packaging_price_product_packaging_filter +#: view:product.packaging:sale_packaging_price.product_packaging_filter msgid "Logistic Unit" msgstr "Unidad logística" #. module: sale_packaging_price #: field:product.packaging,list_price:0 -#: view:sale.order:sale_packaging_price.sale_packaging_price_view_order_form_inherit +#: view:sale.order:sale_packaging_price.view_order_form_inherit msgid "Package Price" msgstr "Precio paquete" #. module: sale_packaging_price -#: view:sale.order:sale_packaging_price.sale_packaging_price_view_order_form_inherit +#: view:sale.order:sale_packaging_price.view_order_form_inherit #: field:sale.order.line,packaging_weight:0 msgid "Package Weight" msgstr "Peso empaquetado" @@ -53,7 +53,7 @@ msgid "Packaging" msgstr "Empaquetado" #. module: sale_packaging_price -#: view:product.packaging:sale_packaging_price.view_sale_packaging_price_product_packaging_filter +#: view:product.packaging:sale_packaging_price.product_packaging_filter msgid "Product" msgstr "Producto" @@ -65,6 +65,7 @@ msgstr "Empaquetado" #. module: sale_packaging_price #: model:ir.actions.act_window,name:sale_packaging_price.action_product_packaging_form #: model:ir.ui.menu,name:sale_packaging_price.menu_product_packaging_action +#: model:ir.ui.menu,name:sale_packaging_price.menu_product_packaging_wh_action msgid "Product Packaging" msgstr "Empaquetado" @@ -84,7 +85,7 @@ msgid "Sales Orders Statistics" msgstr "Estadísticas pedidos de venta" #. module: sale_packaging_price -#: view:product.packaging:sale_packaging_price.view_sale_packaging_price_product_packaging_filter +#: view:product.packaging:sale_packaging_price.product_packaging_filter msgid "Search Product Packaging" msgstr "Buscar empaquetado" @@ -94,7 +95,7 @@ msgid "This price will be considered as a price for complete package" msgstr "Precio del paquete completo" #. module: sale_packaging_price -#: view:product.packaging:sale_packaging_price.sale_packaging_price_product_packaging_tree_inherit +#: view:product.packaging:sale_packaging_price.product_packaging_tree_inherit #, fuzzy msgid "top" msgstr "Lo más de lo más" diff --git a/sale_packaging_price/i18n/sale_packaging_price.pot b/sale_packaging_price/i18n/sale_packaging_price.pot index 28d8b81f579..9cee7aaa203 100644 --- a/sale_packaging_price/i18n/sale_packaging_price.pot +++ b/sale_packaging_price/i18n/sale_packaging_price.pot @@ -6,8 +6,8 @@ msgid "" msgstr "" "Project-Id-Version: Odoo Server 8.0\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-10-09 10:03+0000\n" -"PO-Revision-Date: 2015-10-09 10:03+0000\n" +"POT-Creation-Date: 2015-10-22 17:33+0000\n" +"PO-Revision-Date: 2015-10-22 17:33+0000\n" "Last-Translator: <>\n" "Language-Team: \n" "MIME-Version: 1.0\n" @@ -24,23 +24,23 @@ msgid "

\n" msgstr "" #. module: sale_packaging_price -#: view:product.packaging:sale_packaging_price.view_sale_packaging_price_product_packaging_filter +#: view:product.packaging:sale_packaging_price.product_packaging_filter msgid "Group By..." msgstr "" #. module: sale_packaging_price -#: view:product.packaging:sale_packaging_price.view_sale_packaging_price_product_packaging_filter +#: view:product.packaging:sale_packaging_price.product_packaging_filter msgid "Logistic Unit" msgstr "" #. module: sale_packaging_price #: field:product.packaging,list_price:0 -#: view:sale.order:sale_packaging_price.sale_packaging_price_view_order_form_inherit +#: view:sale.order:sale_packaging_price.view_order_form_inherit msgid "Package Price" msgstr "" #. module: sale_packaging_price -#: view:sale.order:sale_packaging_price.sale_packaging_price_view_order_form_inherit +#: view:sale.order:sale_packaging_price.view_order_form_inherit #: field:sale.order.line,packaging_weight:0 msgid "Package Weight" msgstr "" @@ -51,7 +51,7 @@ msgid "Packaging" msgstr "" #. module: sale_packaging_price -#: view:product.packaging:sale_packaging_price.view_sale_packaging_price_product_packaging_filter +#: view:product.packaging:sale_packaging_price.product_packaging_filter msgid "Product" msgstr "" @@ -63,6 +63,7 @@ msgstr "" #. module: sale_packaging_price #: model:ir.actions.act_window,name:sale_packaging_price.action_product_packaging_form #: model:ir.ui.menu,name:sale_packaging_price.menu_product_packaging_action +#: model:ir.ui.menu,name:sale_packaging_price.menu_product_packaging_wh_action msgid "Product Packaging" msgstr "" @@ -82,7 +83,7 @@ msgid "Sales Orders Statistics" msgstr "" #. module: sale_packaging_price -#: view:product.packaging:sale_packaging_price.view_sale_packaging_price_product_packaging_filter +#: view:product.packaging:sale_packaging_price.product_packaging_filter msgid "Search Product Packaging" msgstr "" @@ -92,7 +93,7 @@ msgid "This price will be considered as a price for complete package" msgstr "" #. module: sale_packaging_price -#: view:product.packaging:sale_packaging_price.sale_packaging_price_product_packaging_tree_inherit +#: view:product.packaging:sale_packaging_price.product_packaging_tree_inherit msgid "top" msgstr "" diff --git a/sale_packaging_price/views/product_view.xml b/sale_packaging_price/views/product_view.xml index a9d8d04b0aa..3489556fe2c 100644 --- a/sale_packaging_price/views/product_view.xml +++ b/sale_packaging_price/views/product_view.xml @@ -2,8 +2,8 @@ - - sale.packaging.price.product.tree.inherit + + product.tree.inherit product.packaging @@ -13,8 +13,8 @@ - - sale.packaging.price.product.packaging.tree.inherit + + product.packaging.tree.inherit product.packaging @@ -28,8 +28,8 @@ - - sale.packaging.price.product.packaging.form.inherit + + product.packaging.form.inherit product.packaging @@ -39,8 +39,8 @@ - - sale.packaging.price.no.product.packaging.form.inherit + + no.product.packaging.form.inherit product.packaging @@ -50,8 +50,8 @@ - - sale.packaging.price.product.packaging.filter + + product.packaging.filter product.packaging diff --git a/sale_packaging_price/views/sale_packaging_price_menu.xml b/sale_packaging_price/views/sale_packaging_price_menu.xml index 3e6d42feda3..7404426c95e 100644 --- a/sale_packaging_price/views/sale_packaging_price_menu.xml +++ b/sale_packaging_price/views/sale_packaging_price_menu.xml @@ -8,5 +8,11 @@ groups="product.group_stock_packaging" /> + + diff --git a/sale_packaging_price/views/sale_stock_view.xml b/sale_packaging_price/views/sale_stock_view.xml index 70faed8c579..ee043aa5951 100644 --- a/sale_packaging_price/views/sale_stock_view.xml +++ b/sale_packaging_price/views/sale_stock_view.xml @@ -2,8 +2,8 @@ - - sale.packaging.price.view.order.form.inherit + + view.order.form.inherit sale.order form From caa2f0164ae105a7f2a39803d3b31319140fa352 Mon Sep 17 00:00:00 2001 From: sergio-incaser Date: Fri, 23 Oct 2015 08:53:49 +0200 Subject: [PATCH 3/7] [FIX] sale_packaging_price: Fix flake8. --- sale_packaging_price/models/sale_stock.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/sale_packaging_price/models/sale_stock.py b/sale_packaging_price/models/sale_stock.py index 755c51092d2..dfdcab2da36 100644 --- a/sale_packaging_price/models/sale_stock.py +++ b/sale_packaging_price/models/sale_stock.py @@ -8,6 +8,7 @@ from openerp import models, fields, api from openerp.addons.decimal_precision import decimal_precision as dp + class SaleOrderLine(models.Model): _inherit = 'sale.order.line' @@ -36,9 +37,9 @@ def product_packaging_change( qty / product_packaging.qty) * product_packaging.ul.weight res['value']['packaging_weight'] = package_weight else: - res = self.product_id_change(pricelist=pricelist, - product=product, qty=qty, uom=uom, partner_id=partner_id, - packaging=packaging, flag=False) + res = self.product_id_change( + pricelist=pricelist, product=product, qty=qty, uom=uom, + partner_id=partner_id, packaging=packaging, flag=False) price_unit = res['value'].get('price_unit', 0.0) package_weight = res['value'].get('packaging_weight', 0.0) res['value'] = {'price_unit': price_unit, From 600d210ba30eb0a139c84c74262a26fc08d8f94c Mon Sep 17 00:00:00 2001 From: Carlos Incaser Date: Fri, 6 Nov 2015 14:47:44 +0100 Subject: [PATCH 4/7] [IMP][8.0] sale_packaging_price: Check list price differences with decimal precision unit price --- sale_packaging_price/models/product.py | 20 ++++++++++++++++++- sale_packaging_price/models/sale_stock.py | 4 ++-- .../tests/test_sale_packaging_price.py | 6 +++++- 3 files changed, 26 insertions(+), 4 deletions(-) diff --git a/sale_packaging_price/models/product.py b/sale_packaging_price/models/product.py index b5b75a96b42..6a59cfc26ce 100644 --- a/sale_packaging_price/models/product.py +++ b/sale_packaging_price/models/product.py @@ -3,7 +3,7 @@ # (c) 2015 Antiun Ingeniería S.L. - Carlos Dauden # License AGPL-3 - See http://www.gnu.org/licenses/agpl-3.0.html -from openerp import models, fields +from openerp import api, fields, models, _ from openerp.addons.decimal_precision import decimal_precision as dp @@ -14,3 +14,21 @@ class ProductPackaging(models.Model): string='Package Price', digits_compute=dp.get_precision('Product Price'), help="This price will be considered as a price for complete package") + + @api.onchange('list_price') + def _onchange_list_price(self): + price_precision = self.env['decimal.precision'].precision_get( + 'Product Price') + price_computed = ( + round(self.list_price / self.qty, price_precision) * + self.qty) + if str(self.list_price) != str(price_computed): + return { + 'warning': { + 'title': _('Problem with price'), + 'message': _( + "With the actual decimal precision, can't get this " + "price. (Approx. price suggested: %s)" + ) % str(price_computed) + } + } diff --git a/sale_packaging_price/models/sale_stock.py b/sale_packaging_price/models/sale_stock.py index dfdcab2da36..c21464d950b 100644 --- a/sale_packaging_price/models/sale_stock.py +++ b/sale_packaging_price/models/sale_stock.py @@ -28,11 +28,11 @@ def product_packaging_change( pricelist, product, qty, uom, partner_id, packaging, flag) if packaging: product_packaging = self.env['product.packaging'].browse(packaging) - product_prec = self.env['decimal.precision'].precision_get( + price_precision = self.env['decimal.precision'].precision_get( 'Product Price') res['value']['price_unit'] = round( product_packaging.list_price / product_packaging.qty, - product_prec) + price_precision) package_weight = math.ceil( qty / product_packaging.qty) * product_packaging.ul.weight res['value']['packaging_weight'] = package_weight diff --git a/sale_packaging_price/tests/test_sale_packaging_price.py b/sale_packaging_price/tests/test_sale_packaging_price.py index dafb0ee4043..623e726115f 100644 --- a/sale_packaging_price/tests/test_sale_packaging_price.py +++ b/sale_packaging_price/tests/test_sale_packaging_price.py @@ -2,7 +2,6 @@ # (c) 2015 Antiun Ingeniería S.L. - Sergio Teruel # (c) 2015 Antiun Ingeniería S.L. - Carlos Dauden # License AGPL-3 - See http://www.gnu.org/licenses/agpl-3.0.html - from openerp.tests.common import TransactionCase @@ -80,3 +79,8 @@ def test_sale_packaging_price(self): self.assertAlmostEqual( price_unit, self.product.product_tmpl_id.lst_price) self.assertAlmostEqual(package_weight, 0.0) + + def test_onchange_price_list(self): + self.product_pack_6.list_price = 100 + res = self.product_pack_6._onchange_list_price() + self.assertIn('warning', res) From bd055f5797752112664af6b5d65c8bceb055dafa Mon Sep 17 00:00:00 2001 From: Carlos Incaser Date: Fri, 6 Nov 2015 17:23:36 +0100 Subject: [PATCH 5/7] [IMP][8.0] sale_packaging_price: Rename sale_stock to sale_order --- sale_packaging_price/__openerp__.py | 4 ++-- sale_packaging_price/models/__init__.py | 2 +- sale_packaging_price/models/{sale_stock.py => sale_order.py} | 0 3 files changed, 3 insertions(+), 3 deletions(-) rename sale_packaging_price/models/{sale_stock.py => sale_order.py} (100%) diff --git a/sale_packaging_price/__openerp__.py b/sale_packaging_price/__openerp__.py index 4a503a6638b..30588e2aabd 100644 --- a/sale_packaging_price/__openerp__.py +++ b/sale_packaging_price/__openerp__.py @@ -13,8 +13,8 @@ 'views/sale_stock_view.xml', 'views/sale_packaging_price_menu.xml', ], - 'author': 'Incaser Informatica S.L., ' - 'Antiun Ingeniería S.L., ' + 'author': 'Antiun Ingeniería S.L., ' + 'Incaser Informatica S.L., ' 'Odoo Community Association (OCA)', 'website': 'http://www.incaser.es', 'license': 'AGPL-3', diff --git a/sale_packaging_price/models/__init__.py b/sale_packaging_price/models/__init__.py index 72c71be42ab..aab6bed811c 100644 --- a/sale_packaging_price/models/__init__.py +++ b/sale_packaging_price/models/__init__.py @@ -4,4 +4,4 @@ # License AGPL-3 - See http://www.gnu.org/licenses/agpl-3.0.html from . import product -from . import sale_stock +from . import sale_order diff --git a/sale_packaging_price/models/sale_stock.py b/sale_packaging_price/models/sale_order.py similarity index 100% rename from sale_packaging_price/models/sale_stock.py rename to sale_packaging_price/models/sale_order.py From 23efc329257307261cc14f04d1a5718c2aea7865 Mon Sep 17 00:00:00 2001 From: Carlos Incaser Date: Wed, 11 Nov 2015 13:30:23 +0100 Subject: [PATCH 6/7] [FIX][8.0] sale_packaging_price: ZeroDivisionError, Translate --- sale_packaging_price/README.rst | 3 +++ sale_packaging_price/i18n/es.po | 27 ++++++++++++++----- .../i18n/sale_packaging_price.pot | 16 +++++++++-- sale_packaging_price/models/product.py | 15 ++++++----- sale_packaging_price/models/sale_order.py | 17 +++++++----- 5 files changed, 58 insertions(+), 20 deletions(-) diff --git a/sale_packaging_price/README.rst b/sale_packaging_price/README.rst index 15ff99a4dcc..0c32f312b32 100644 --- a/sale_packaging_price/README.rst +++ b/sale_packaging_price/README.rst @@ -8,6 +8,9 @@ Sale Packaging Price This module was written to extends the functionality of sale workflow and allow you to assign a selling price of a complete package. +This price is split for having the price unit according the number of pieces +that fits in that packaging, so there can be rounding issues to get the exact +price that are warned if happens. Configuration ============= diff --git a/sale_packaging_price/i18n/es.po b/sale_packaging_price/i18n/es.po index 7a006d84f1c..d820faad47c 100644 --- a/sale_packaging_price/i18n/es.po +++ b/sale_packaging_price/i18n/es.po @@ -6,9 +6,9 @@ msgid "" msgstr "" "Project-Id-Version: Odoo Server 8.0\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-10-22 17:33+0000\n" -"PO-Revision-Date: 2015-10-22 19:34+0100\n" -"Last-Translator: Sergio Teruel \n" +"POT-Creation-Date: 2015-11-11 11:17+0000\n" +"PO-Revision-Date: 2015-11-11 12:30+0100\n" +"Last-Translator: Carlos Incaser \n" "Language-Team: \n" "Language: es-ES\n" "MIME-Version: 1.0\n" @@ -52,6 +52,12 @@ msgstr "Peso empaquetado" msgid "Packaging" msgstr "Empaquetado" +#. module: sale_packaging_price +#: code:addons/sale_packaging_price/models/product.py:31 +#, python-format +msgid "Problem with price" +msgstr "Problema con el precio" + #. module: sale_packaging_price #: view:product.packaging:sale_packaging_price.product_packaging_filter msgid "Product" @@ -92,10 +98,19 @@ msgstr "Buscar empaquetado" #. module: sale_packaging_price #: help:product.packaging,list_price:0 msgid "This price will be considered as a price for complete package" -msgstr "Precio del paquete completo" +msgstr "Este precio sera considerado como precio para el paquete completo" + +#. module: sale_packaging_price +#: code:addons/sale_packaging_price/models/product.py:32 +#, python-format +msgid "" +"With the configured decimal precision, can't get this price. (Approx. price " +"suggested: %s)" +msgstr "" +"Con la precisión decimal configurada no se puede obtener este precio. " +"(Precio sugerido aproximado: %s)" #. module: sale_packaging_price #: view:product.packaging:sale_packaging_price.product_packaging_tree_inherit -#, fuzzy msgid "top" -msgstr "Lo más de lo más" +msgstr "Arriba" diff --git a/sale_packaging_price/i18n/sale_packaging_price.pot b/sale_packaging_price/i18n/sale_packaging_price.pot index 9cee7aaa203..06ad56e9a86 100644 --- a/sale_packaging_price/i18n/sale_packaging_price.pot +++ b/sale_packaging_price/i18n/sale_packaging_price.pot @@ -6,8 +6,8 @@ msgid "" msgstr "" "Project-Id-Version: Odoo Server 8.0\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-10-22 17:33+0000\n" -"PO-Revision-Date: 2015-10-22 17:33+0000\n" +"POT-Creation-Date: 2015-11-11 11:17+0000\n" +"PO-Revision-Date: 2015-11-11 11:17+0000\n" "Last-Translator: <>\n" "Language-Team: \n" "MIME-Version: 1.0\n" @@ -50,6 +50,12 @@ msgstr "" msgid "Packaging" msgstr "" +#. module: sale_packaging_price +#: code:addons/sale_packaging_price/models/product.py:31 +#, python-format +msgid "Problem with price" +msgstr "" + #. module: sale_packaging_price #: view:product.packaging:sale_packaging_price.product_packaging_filter msgid "Product" @@ -92,6 +98,12 @@ msgstr "" msgid "This price will be considered as a price for complete package" msgstr "" +#. module: sale_packaging_price +#: code:addons/sale_packaging_price/models/product.py:32 +#, python-format +msgid "With the configured decimal precision, can't get this price. (Approx. price suggested: %s)" +msgstr "" + #. module: sale_packaging_price #: view:product.packaging:sale_packaging_price.product_packaging_tree_inherit msgid "top" diff --git a/sale_packaging_price/models/product.py b/sale_packaging_price/models/product.py index 6a59cfc26ce..42dcd8576b8 100644 --- a/sale_packaging_price/models/product.py +++ b/sale_packaging_price/models/product.py @@ -15,20 +15,23 @@ class ProductPackaging(models.Model): digits_compute=dp.get_precision('Product Price'), help="This price will be considered as a price for complete package") - @api.onchange('list_price') + @api.onchange('list_price', 'qty') def _onchange_list_price(self): price_precision = self.env['decimal.precision'].precision_get( 'Product Price') - price_computed = ( - round(self.list_price / self.qty, price_precision) * - self.qty) + if self.qty: + price_computed = ( + round(self.list_price / self.qty, price_precision) * + self.qty) + else: + price_computed = 0.0 if str(self.list_price) != str(price_computed): return { 'warning': { 'title': _('Problem with price'), 'message': _( - "With the actual decimal precision, can't get this " - "price. (Approx. price suggested: %s)" + "With the configured decimal precision, can't get this" + " price. (Approx. price suggested: %s)" ) % str(price_computed) } } diff --git a/sale_packaging_price/models/sale_order.py b/sale_packaging_price/models/sale_order.py index c21464d950b..e60872f452e 100644 --- a/sale_packaging_price/models/sale_order.py +++ b/sale_packaging_price/models/sale_order.py @@ -30,12 +30,17 @@ def product_packaging_change( product_packaging = self.env['product.packaging'].browse(packaging) price_precision = self.env['decimal.precision'].precision_get( 'Product Price') - res['value']['price_unit'] = round( - product_packaging.list_price / product_packaging.qty, - price_precision) - package_weight = math.ceil( - qty / product_packaging.qty) * product_packaging.ul.weight - res['value']['packaging_weight'] = package_weight + if product_packaging.qty: + price_unit = round( + product_packaging.list_price / product_packaging.qty, + price_precision) + package_weight = math.ceil( + qty / product_packaging.qty) * product_packaging.ul.weight + else: + price_unit = 0.0 + package_weight = 0.0 + res['value'] = {'price_unit': price_unit, + 'packaging_weight': package_weight} else: res = self.product_id_change( pricelist=pricelist, product=product, qty=qty, uom=uom, From 473b536e5c97d9c9132d4ba1873b5d1ec55d3278 Mon Sep 17 00:00:00 2001 From: Carlos Incaser Date: Fri, 13 Nov 2015 09:50:19 +0100 Subject: [PATCH 7/7] [FIX][8.0] sale_packaging_price: Better message description --- sale_packaging_price/i18n/es.po | 10 +++++----- sale_packaging_price/i18n/sale_packaging_price.pot | 6 +++--- sale_packaging_price/models/product.py | 4 ++-- 3 files changed, 10 insertions(+), 10 deletions(-) diff --git a/sale_packaging_price/i18n/es.po b/sale_packaging_price/i18n/es.po index d820faad47c..ef8f27b52c7 100644 --- a/sale_packaging_price/i18n/es.po +++ b/sale_packaging_price/i18n/es.po @@ -6,8 +6,8 @@ msgid "" msgstr "" "Project-Id-Version: Odoo Server 8.0\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-11-11 11:17+0000\n" -"PO-Revision-Date: 2015-11-11 12:30+0100\n" +"POT-Creation-Date: 2015-11-13 08:28+0000\n" +"PO-Revision-Date: 2015-11-13 09:30+0100\n" "Last-Translator: Carlos Incaser \n" "Language-Team: \n" "Language: es-ES\n" @@ -104,11 +104,11 @@ msgstr "Este precio sera considerado como precio para el paquete completo" #: code:addons/sale_packaging_price/models/product.py:32 #, python-format msgid "" -"With the configured decimal precision, can't get this price. (Approx. price " +"With the current decimal precision, you can't get this price. (Approx. price " "suggested: %s)" msgstr "" -"Con la precisión decimal configurada no se puede obtener este precio. " -"(Precio sugerido aproximado: %s)" +"Con la precisión decimal actual no puedes obtener este precio. (Precio " +"sugerido aproximado: %s)" #. module: sale_packaging_price #: view:product.packaging:sale_packaging_price.product_packaging_tree_inherit diff --git a/sale_packaging_price/i18n/sale_packaging_price.pot b/sale_packaging_price/i18n/sale_packaging_price.pot index 06ad56e9a86..9173c0448b0 100644 --- a/sale_packaging_price/i18n/sale_packaging_price.pot +++ b/sale_packaging_price/i18n/sale_packaging_price.pot @@ -6,8 +6,8 @@ msgid "" msgstr "" "Project-Id-Version: Odoo Server 8.0\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-11-11 11:17+0000\n" -"PO-Revision-Date: 2015-11-11 11:17+0000\n" +"POT-Creation-Date: 2015-11-13 08:28+0000\n" +"PO-Revision-Date: 2015-11-13 08:28+0000\n" "Last-Translator: <>\n" "Language-Team: \n" "MIME-Version: 1.0\n" @@ -101,7 +101,7 @@ msgstr "" #. module: sale_packaging_price #: code:addons/sale_packaging_price/models/product.py:32 #, python-format -msgid "With the configured decimal precision, can't get this price. (Approx. price suggested: %s)" +msgid "With the current decimal precision, you can't get this price. (Approx. price suggested: %s)" msgstr "" #. module: sale_packaging_price diff --git a/sale_packaging_price/models/product.py b/sale_packaging_price/models/product.py index 42dcd8576b8..bcf054d9ff6 100644 --- a/sale_packaging_price/models/product.py +++ b/sale_packaging_price/models/product.py @@ -30,8 +30,8 @@ def _onchange_list_price(self): 'warning': { 'title': _('Problem with price'), 'message': _( - "With the configured decimal precision, can't get this" - " price. (Approx. price suggested: %s)" + "With the current decimal precision, you can't get " + "this price. (Approx. price suggested: %s)" ) % str(price_computed) } }