From eebce41039260116d93396c836971f441b57992d Mon Sep 17 00:00:00 2001 From: Sylvain LE GAL Date: Mon, 10 Apr 2017 11:04:14 +0200 Subject: [PATCH 01/11] new module pos_margin --- pos_margin/README.rst | 79 ++++++++++++++++++ pos_margin/__init__.py | 2 + pos_margin/__manifest__.py | 22 +++++ pos_margin/i18n/es.po | 50 +++++++++++ pos_margin/i18n/fr.po | 49 +++++++++++ pos_margin/i18n/it.po | 47 +++++++++++ pos_margin/i18n/nl_NL.po | 48 +++++++++++ pos_margin/i18n/pos_margin.pot | 41 +++++++++ pos_margin/models/__init__.py | 3 + pos_margin/models/pos_order.py | 25 ++++++ pos_margin/models/pos_order_line.py | 33 ++++++++ .../static/description/pos_order_form.png | Bin 0 -> 28285 bytes pos_margin/views/view_pos_order.xml | 25 ++++++ 13 files changed, 424 insertions(+) create mode 100644 pos_margin/README.rst create mode 100644 pos_margin/__init__.py create mode 100644 pos_margin/__manifest__.py create mode 100644 pos_margin/i18n/es.po create mode 100644 pos_margin/i18n/fr.po create mode 100644 pos_margin/i18n/it.po create mode 100644 pos_margin/i18n/nl_NL.po create mode 100644 pos_margin/i18n/pos_margin.pot create mode 100644 pos_margin/models/__init__.py create mode 100644 pos_margin/models/pos_order.py create mode 100644 pos_margin/models/pos_order_line.py create mode 100644 pos_margin/static/description/pos_order_form.png create mode 100644 pos_margin/views/view_pos_order.xml diff --git a/pos_margin/README.rst b/pos_margin/README.rst new file mode 100644 index 00000000..4554966c --- /dev/null +++ b/pos_margin/README.rst @@ -0,0 +1,79 @@ +.. 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 + +=================== +Margin on PoS order +=================== + +This module extends the functionality of point of sale to support margin on +pos orders. + +This gives the profitability by calculating the difference between the Unit +Price and Cost Price. + + +Usage +===== + +To use this module, you need to: + +#. Go to 'Point Of Sale' / 'Daily Operations' / 'Orders' +#. Open an order + +.. figure:: ./pos_margin/static/description/pos_order_form.png + :width: 800px + +.. image:: https://odoo-community.org/website/image/ir.attachment/5784_f2813bd/datas + :alt: Try me on Runbot + :target: https://runbot.odoo-community.org/runbot/184/8.0 + + +Technical information +===================== + +This module is highly inspired from the module 'Sale Order Margin', by Odoo SA. + +Known issues / Roadmap +====================== + +* include extra reporting, using the new margin field. + +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 smash it by providing detailed and welcomed feedback. + +Credits +======= + +Contributors +------------ + +* Sylvain LE GAL (https://twitter.com/legalsylvain) + +Funders +------- + +The development of this module has been financially supported by: + +* GRAP, Groupement Régional Alimentaire de Proximité (www.grap.coop) + +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 https://odoo-community.org. + diff --git a/pos_margin/__init__.py b/pos_margin/__init__.py new file mode 100644 index 00000000..402ac47e --- /dev/null +++ b/pos_margin/__init__.py @@ -0,0 +1,2 @@ +# -#- coding: utf-8 -#- +from . import models diff --git a/pos_margin/__manifest__.py b/pos_margin/__manifest__.py new file mode 100644 index 00000000..7569aaa5 --- /dev/null +++ b/pos_margin/__manifest__.py @@ -0,0 +1,22 @@ +# -*- coding: utf-8 -*- +# Copyright (C) 2017 - Today: GRAP (http://www.grap.coop) +# @author: Sylvain LE GAL (https://twitter.com/legalsylvain) +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). + +{ + 'name': 'POS Margin', + 'version': '10.0.1.0.0', + 'category': 'Point Of Sale', + 'sequence': 1, + 'author': "GRAP," + "Odoo Community Association (OCA)", + 'summary': 'Margin on PoS Order', + 'license': 'AGPL-3', + 'depends': [ + 'point_of_sale', + ], + 'data': [ + 'views/view_pos_order.xml', + ], + 'installable': True, +} diff --git a/pos_margin/i18n/es.po b/pos_margin/i18n/es.po new file mode 100644 index 00000000..8ab92724 --- /dev/null +++ b/pos_margin/i18n/es.po @@ -0,0 +1,50 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * pos_margin +# +# Translators: +# OCA Transbot , 2017 +# enjolras , 2018 +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 10.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2018-03-01 02:01+0000\n" +"PO-Revision-Date: 2018-03-01 02:01+0000\n" +"Last-Translator: enjolras , 2018\n" +"Language-Team: Spanish (https://www.transifex.com/oca/teams/23907/es/)\n" +"Language: es\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#. module: pos_margin +#: model:ir.model.fields,field_description:pos_margin.field_pos_order_line_purchase_price +msgid "Cost Price" +msgstr "Precio de coste" + +#. module: pos_margin +#: model:ir.model.fields,help:pos_margin.field_pos_order_margin +msgid "" +"It gives profitability by calculating the difference between the Unit Price " +"and the cost price." +msgstr "" +"Indica el beneficio calculando la diferencia entre el precio unitario y el " +"precio de coste." + +#. module: pos_margin +#: model:ir.model,name:pos_margin.model_pos_order_line +msgid "Lines of Point of Sale" +msgstr "Líneas del punto de venta" + +#. module: pos_margin +#: model:ir.model.fields,field_description:pos_margin.field_pos_order_line_margin +#: model:ir.model.fields,field_description:pos_margin.field_pos_order_margin +msgid "Margin" +msgstr "Margen" + +#. module: pos_margin +#: model:ir.model,name:pos_margin.model_pos_order +msgid "Point of Sale Orders" +msgstr "Pedidos del TPV" diff --git a/pos_margin/i18n/fr.po b/pos_margin/i18n/fr.po new file mode 100644 index 00000000..b982c082 --- /dev/null +++ b/pos_margin/i18n/fr.po @@ -0,0 +1,49 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * pos_margin +# +# Translators: +# OCA Transbot , 2017 +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 10.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2017-04-25 02:39+0000\n" +"PO-Revision-Date: 2017-04-25 02:39+0000\n" +"Last-Translator: OCA Transbot , 2017\n" +"Language-Team: French (https://www.transifex.com/oca/teams/23907/fr/)\n" +"Language: fr\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: nplurals=2; plural=(n > 1);\n" + +#. module: pos_margin +#: model:ir.model.fields,field_description:pos_margin.field_pos_order_line_purchase_price +msgid "Cost Price" +msgstr "Prix de revient" + +#. module: pos_margin +#: model:ir.model.fields,help:pos_margin.field_pos_order_margin +msgid "" +"It gives profitability by calculating the difference between the Unit Price " +"and the cost price." +msgstr "" +"Il donne la rentabilité en calculant la différence entre le prix unitaire et " +"le prix de revient." + +#. module: pos_margin +#: model:ir.model,name:pos_margin.model_pos_order_line +msgid "Lines of Point of Sale" +msgstr "Lignes de Points de Vente" + +#. module: pos_margin +#: model:ir.model.fields,field_description:pos_margin.field_pos_order_line_margin +#: model:ir.model.fields,field_description:pos_margin.field_pos_order_margin +msgid "Margin" +msgstr "Marge" + +#. module: pos_margin +#: model:ir.model,name:pos_margin.model_pos_order +msgid "Point of Sale Orders" +msgstr "" diff --git a/pos_margin/i18n/it.po b/pos_margin/i18n/it.po new file mode 100644 index 00000000..69a4ed67 --- /dev/null +++ b/pos_margin/i18n/it.po @@ -0,0 +1,47 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * pos_margin +# +# Translators: +# Francesco Fresta , 2018 +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 10.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2018-03-01 02:01+0000\n" +"PO-Revision-Date: 2018-03-01 02:01+0000\n" +"Last-Translator: Francesco Fresta , 2018\n" +"Language-Team: Italian (https://www.transifex.com/oca/teams/23907/it/)\n" +"Language: it\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#. module: pos_margin +#: model:ir.model.fields,field_description:pos_margin.field_pos_order_line_purchase_price +msgid "Cost Price" +msgstr "" + +#. module: pos_margin +#: model:ir.model.fields,help:pos_margin.field_pos_order_margin +msgid "" +"It gives profitability by calculating the difference between the Unit Price " +"and the cost price." +msgstr "" + +#. module: pos_margin +#: model:ir.model,name:pos_margin.model_pos_order_line +msgid "Lines of Point of Sale" +msgstr "" + +#. module: pos_margin +#: model:ir.model.fields,field_description:pos_margin.field_pos_order_line_margin +#: model:ir.model.fields,field_description:pos_margin.field_pos_order_margin +msgid "Margin" +msgstr "Margine" + +#. module: pos_margin +#: model:ir.model,name:pos_margin.model_pos_order +msgid "Point of Sale Orders" +msgstr "Punto di riordino" diff --git a/pos_margin/i18n/nl_NL.po b/pos_margin/i18n/nl_NL.po new file mode 100644 index 00000000..6d8cd895 --- /dev/null +++ b/pos_margin/i18n/nl_NL.po @@ -0,0 +1,48 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * pos_margin +# +# Translators: +# Peter Hageman , 2017 +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 10.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2017-05-30 02:44+0000\n" +"PO-Revision-Date: 2017-05-30 02:44+0000\n" +"Last-Translator: Peter Hageman , 2017\n" +"Language-Team: Dutch (Netherlands) (https://www.transifex.com/oca/" +"teams/23907/nl_NL/)\n" +"Language: nl_NL\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#. module: pos_margin +#: model:ir.model.fields,field_description:pos_margin.field_pos_order_line_purchase_price +msgid "Cost Price" +msgstr "Kostprijs" + +#. module: pos_margin +#: model:ir.model.fields,help:pos_margin.field_pos_order_margin +msgid "" +"It gives profitability by calculating the difference between the Unit Price " +"and the cost price." +msgstr "" + +#. module: pos_margin +#: model:ir.model,name:pos_margin.model_pos_order_line +msgid "Lines of Point of Sale" +msgstr "" + +#. module: pos_margin +#: model:ir.model.fields,field_description:pos_margin.field_pos_order_line_margin +#: model:ir.model.fields,field_description:pos_margin.field_pos_order_margin +msgid "Margin" +msgstr "Marge" + +#. module: pos_margin +#: model:ir.model,name:pos_margin.model_pos_order +msgid "Point of Sale Orders" +msgstr "Kassaorders" diff --git a/pos_margin/i18n/pos_margin.pot b/pos_margin/i18n/pos_margin.pot new file mode 100644 index 00000000..b91d0ddb --- /dev/null +++ b/pos_margin/i18n/pos_margin.pot @@ -0,0 +1,41 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * pos_margin +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 10.0\n" +"Report-Msgid-Bugs-To: \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: pos_margin +#: model:ir.model.fields,field_description:pos_margin.field_pos_order_line_purchase_price +msgid "Cost Price" +msgstr "" + +#. module: pos_margin +#: model:ir.model.fields,help:pos_margin.field_pos_order_margin +msgid "It gives profitability by calculating the difference between the Unit Price and the cost price." +msgstr "" + +#. module: pos_margin +#: model:ir.model,name:pos_margin.model_pos_order_line +msgid "Lines of Point of Sale" +msgstr "" + +#. module: pos_margin +#: model:ir.model.fields,field_description:pos_margin.field_pos_order_line_margin +#: model:ir.model.fields,field_description:pos_margin.field_pos_order_margin +msgid "Margin" +msgstr "" + +#. module: pos_margin +#: model:ir.model,name:pos_margin.model_pos_order +msgid "Point of Sale Orders" +msgstr "" + diff --git a/pos_margin/models/__init__.py b/pos_margin/models/__init__.py new file mode 100644 index 00000000..83e74821 --- /dev/null +++ b/pos_margin/models/__init__.py @@ -0,0 +1,3 @@ +# -*- coding: utf-8 -*- +from . import pos_order +from . import pos_order_line diff --git a/pos_margin/models/pos_order.py b/pos_margin/models/pos_order.py new file mode 100644 index 00000000..824da0b2 --- /dev/null +++ b/pos_margin/models/pos_order.py @@ -0,0 +1,25 @@ +# -*- coding: utf-8 -*- +# Copyright (C) 2017 - Today: GRAP (http://www.grap.coop) +# @author: Sylvain LE GAL (https://twitter.com/legalsylvain) +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). + +from odoo import api, fields, models +import openerp.addons.decimal_precision as dp + + +class PosOrder(models.Model): + _inherit = 'pos.order' + + # Columns Section + margin = fields.Float( + 'Margin', compute='_compute_margin', store=True, + digits=dp.get_precision('Product Price'), + help="It gives profitability by calculating the difference between" + " the Unit Price and the cost price.") + + # Compute Section + @api.multi + @api.depends('lines.margin') + def _compute_margin(self): + for order in self: + order.margin = sum(order.mapped('lines.margin')) diff --git a/pos_margin/models/pos_order_line.py b/pos_margin/models/pos_order_line.py new file mode 100644 index 00000000..ac18dece --- /dev/null +++ b/pos_margin/models/pos_order_line.py @@ -0,0 +1,33 @@ +# -*- coding: utf-8 -*- +# Copyright (C) 2017 - Today: GRAP (http://www.grap.coop) +# @author: Sylvain LE GAL (https://twitter.com/legalsylvain) +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). + +from odoo import api, fields, models +import openerp.addons.decimal_precision as dp + + +class PosOrderLine(models.Model): + _inherit = 'pos.order.line' + + # Columns Section + margin = fields.Float( + 'Margin', compute='_compute_multi_margin', store=True, + multi='multi_margin', digits=dp.get_precision('Product Price')) + + purchase_price = fields.Float( + 'Cost Price', compute='_compute_multi_margin', store=True, + multi='multi_margin', digits=dp.get_precision('Product Price')) + + # Compute Section + @api.multi + @api.depends('product_id', 'qty', 'price_subtotal') + def _compute_multi_margin(self): + for line in self: + if not line.product_id: + line.purchase_price = 0 + line.margin = 0 + else: + line.purchase_price = line.product_id.standard_price + line.margin = line.price_subtotal - ( + line.product_id.standard_price * line.qty) diff --git a/pos_margin/static/description/pos_order_form.png b/pos_margin/static/description/pos_order_form.png new file mode 100644 index 0000000000000000000000000000000000000000..392b816a6e3800f6ab2e4f18e3e619f0d4380519 GIT binary patch literal 28285 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 Mb^ZH + + + + + + pos.order + + + + + + + + + + + + + + From f7ee1f90a0e2eb9f4391511e6cf6bdb07d21afeb Mon Sep 17 00:00:00 2001 From: Invitu Date: Thu, 25 Oct 2018 21:30:33 -1000 Subject: [PATCH 02/11] [MIG] pos_margin:Migration to 11.0 --- pos_margin/__init__.py | 1 - pos_margin/__manifest__.py | 3 +-- pos_margin/models/__init__.py | 1 - pos_margin/models/pos_order.py | 1 - pos_margin/models/pos_order_line.py | 1 - 5 files changed, 1 insertion(+), 6 deletions(-) diff --git a/pos_margin/__init__.py b/pos_margin/__init__.py index 402ac47e..0650744f 100644 --- a/pos_margin/__init__.py +++ b/pos_margin/__init__.py @@ -1,2 +1 @@ -# -#- coding: utf-8 -#- from . import models diff --git a/pos_margin/__manifest__.py b/pos_margin/__manifest__.py index 7569aaa5..0ad87fba 100644 --- a/pos_margin/__manifest__.py +++ b/pos_margin/__manifest__.py @@ -1,11 +1,10 @@ -# -*- coding: utf-8 -*- # Copyright (C) 2017 - Today: GRAP (http://www.grap.coop) # @author: Sylvain LE GAL (https://twitter.com/legalsylvain) # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). { 'name': 'POS Margin', - 'version': '10.0.1.0.0', + 'version': '11.0.1.0.0', 'category': 'Point Of Sale', 'sequence': 1, 'author': "GRAP," diff --git a/pos_margin/models/__init__.py b/pos_margin/models/__init__.py index 83e74821..64f952d5 100644 --- a/pos_margin/models/__init__.py +++ b/pos_margin/models/__init__.py @@ -1,3 +1,2 @@ -# -*- coding: utf-8 -*- from . import pos_order from . import pos_order_line diff --git a/pos_margin/models/pos_order.py b/pos_margin/models/pos_order.py index 824da0b2..63f570cc 100644 --- a/pos_margin/models/pos_order.py +++ b/pos_margin/models/pos_order.py @@ -1,4 +1,3 @@ -# -*- coding: utf-8 -*- # Copyright (C) 2017 - Today: GRAP (http://www.grap.coop) # @author: Sylvain LE GAL (https://twitter.com/legalsylvain) # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). diff --git a/pos_margin/models/pos_order_line.py b/pos_margin/models/pos_order_line.py index ac18dece..8510d6f3 100644 --- a/pos_margin/models/pos_order_line.py +++ b/pos_margin/models/pos_order_line.py @@ -1,4 +1,3 @@ -# -*- coding: utf-8 -*- # Copyright (C) 2017 - Today: GRAP (http://www.grap.coop) # @author: Sylvain LE GAL (https://twitter.com/legalsylvain) # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). From 57ae4edbf7647dd81b11063636260a46a8836281 Mon Sep 17 00:00:00 2001 From: Invitu Date: Wed, 14 Nov 2018 00:39:47 -1000 Subject: [PATCH 03/11] [IMP] Add pos margin in pos order report --- pos_margin/__init__.py | 1 + pos_margin/report/__init__.py | 2 ++ pos_margin/report/pos_order_report.py | 15 +++++++++++++++ 3 files changed, 18 insertions(+) create mode 100644 pos_margin/report/__init__.py create mode 100644 pos_margin/report/pos_order_report.py diff --git a/pos_margin/__init__.py b/pos_margin/__init__.py index 0650744f..bf588bc8 100644 --- a/pos_margin/__init__.py +++ b/pos_margin/__init__.py @@ -1 +1,2 @@ from . import models +from . import report diff --git a/pos_margin/report/__init__.py b/pos_margin/report/__init__.py new file mode 100644 index 00000000..225fc1d2 --- /dev/null +++ b/pos_margin/report/__init__.py @@ -0,0 +1,2 @@ +from . import pos_order_report + diff --git a/pos_margin/report/pos_order_report.py b/pos_margin/report/pos_order_report.py new file mode 100644 index 00000000..ae826b40 --- /dev/null +++ b/pos_margin/report/pos_order_report.py @@ -0,0 +1,15 @@ +from odoo import fields, models + + +class PosOrderReport(models.Model): + _inherit = 'report.pos.order' + + margin_total = fields.Float(string='Margin Total') + margin_rate = fields.Float(string='Margin Rate', group_operator='avg') + + def _select(self): + return super(PosOrderReport, self)._select() + """, + SUM(l.margin) as margin_total, + (SUM(l.margin / nullif(l.qty,0)) * 100 / + SUM(nullif(l.purchase_price,0)))::decimal as margin_rate + """ From 962d78c4594aff12336287168fd43d5443653295 Mon Sep 17 00:00:00 2001 From: oca-travis Date: Wed, 16 Jan 2019 17:31:03 +0000 Subject: [PATCH 04/11] [UPD] Update pos_margin.pot --- pos_margin/i18n/pos_margin.pot | 19 +++++++++++++++++-- 1 file changed, 17 insertions(+), 2 deletions(-) diff --git a/pos_margin/i18n/pos_margin.pot b/pos_margin/i18n/pos_margin.pot index b91d0ddb..2f5b529a 100644 --- a/pos_margin/i18n/pos_margin.pot +++ b/pos_margin/i18n/pos_margin.pot @@ -4,7 +4,7 @@ # msgid "" msgstr "" -"Project-Id-Version: Odoo Server 10.0\n" +"Project-Id-Version: Odoo Server 11.0\n" "Report-Msgid-Bugs-To: \n" "Last-Translator: <>\n" "Language-Team: \n" @@ -25,7 +25,7 @@ msgstr "" #. module: pos_margin #: model:ir.model,name:pos_margin.model_pos_order_line -msgid "Lines of Point of Sale" +msgid "Lines of Point of Sale Orders" msgstr "" #. module: pos_margin @@ -34,8 +34,23 @@ msgstr "" msgid "Margin" msgstr "" +#. module: pos_margin +#: model:ir.model.fields,field_description:pos_margin.field_report_pos_order_margin_rate +msgid "Margin Rate" +msgstr "" + +#. module: pos_margin +#: model:ir.model.fields,field_description:pos_margin.field_report_pos_order_margin_total +msgid "Margin Total" +msgstr "" + #. module: pos_margin #: model:ir.model,name:pos_margin.model_pos_order msgid "Point of Sale Orders" msgstr "" +#. module: pos_margin +#: model:ir.model,name:pos_margin.model_report_pos_order +msgid "Point of Sale Orders Statistics" +msgstr "" + From 6491f88bff80783476029771d6fe0dfec2a88721 Mon Sep 17 00:00:00 2001 From: OCA Transbot Date: Sun, 27 Jan 2019 10:53:55 +0000 Subject: [PATCH 05/11] Update translation files Updated by "Update PO files to match POT (msgmerge)" hook in Weblate. Translation: pos-11.0/pos-11.0-pos_margin Translate-URL: https://translation.odoo-community.org/projects/pos-11-0/pos-11-0-pos_margin/ --- pos_margin/i18n/es.po | 21 ++++++++++++++++++++- pos_margin/i18n/fr.po | 20 +++++++++++++++++++- pos_margin/i18n/it.po | 23 +++++++++++++++++++++-- pos_margin/i18n/nl_NL.po | 23 +++++++++++++++++++++-- 4 files changed, 81 insertions(+), 6 deletions(-) diff --git a/pos_margin/i18n/es.po b/pos_margin/i18n/es.po index 8ab92724..b6116868 100644 --- a/pos_margin/i18n/es.po +++ b/pos_margin/i18n/es.po @@ -35,7 +35,8 @@ msgstr "" #. module: pos_margin #: model:ir.model,name:pos_margin.model_pos_order_line -msgid "Lines of Point of Sale" +#, fuzzy +msgid "Lines of Point of Sale Orders" msgstr "Líneas del punto de venta" #. module: pos_margin @@ -44,7 +45,25 @@ msgstr "Líneas del punto de venta" msgid "Margin" msgstr "Margen" +#. module: pos_margin +#: model:ir.model.fields,field_description:pos_margin.field_report_pos_order_margin_rate +#, fuzzy +msgid "Margin Rate" +msgstr "Margen" + +#. module: pos_margin +#: model:ir.model.fields,field_description:pos_margin.field_report_pos_order_margin_total +#, fuzzy +msgid "Margin Total" +msgstr "Margen" + #. module: pos_margin #: model:ir.model,name:pos_margin.model_pos_order msgid "Point of Sale Orders" msgstr "Pedidos del TPV" + +#. module: pos_margin +#: model:ir.model,name:pos_margin.model_report_pos_order +#, fuzzy +msgid "Point of Sale Orders Statistics" +msgstr "Pedidos del TPV" diff --git a/pos_margin/i18n/fr.po b/pos_margin/i18n/fr.po index b982c082..33b5016d 100644 --- a/pos_margin/i18n/fr.po +++ b/pos_margin/i18n/fr.po @@ -34,7 +34,8 @@ msgstr "" #. module: pos_margin #: model:ir.model,name:pos_margin.model_pos_order_line -msgid "Lines of Point of Sale" +#, fuzzy +msgid "Lines of Point of Sale Orders" msgstr "Lignes de Points de Vente" #. module: pos_margin @@ -43,7 +44,24 @@ msgstr "Lignes de Points de Vente" msgid "Margin" msgstr "Marge" +#. module: pos_margin +#: model:ir.model.fields,field_description:pos_margin.field_report_pos_order_margin_rate +#, fuzzy +msgid "Margin Rate" +msgstr "Marge" + +#. module: pos_margin +#: model:ir.model.fields,field_description:pos_margin.field_report_pos_order_margin_total +#, fuzzy +msgid "Margin Total" +msgstr "Marge" + #. module: pos_margin #: model:ir.model,name:pos_margin.model_pos_order msgid "Point of Sale Orders" msgstr "" + +#. module: pos_margin +#: model:ir.model,name:pos_margin.model_report_pos_order +msgid "Point of Sale Orders Statistics" +msgstr "" diff --git a/pos_margin/i18n/it.po b/pos_margin/i18n/it.po index 69a4ed67..019547b7 100644 --- a/pos_margin/i18n/it.po +++ b/pos_margin/i18n/it.po @@ -32,8 +32,9 @@ msgstr "" #. module: pos_margin #: model:ir.model,name:pos_margin.model_pos_order_line -msgid "Lines of Point of Sale" -msgstr "" +#, fuzzy +msgid "Lines of Point of Sale Orders" +msgstr "Punto di riordino" #. module: pos_margin #: model:ir.model.fields,field_description:pos_margin.field_pos_order_line_margin @@ -41,7 +42,25 @@ msgstr "" msgid "Margin" msgstr "Margine" +#. module: pos_margin +#: model:ir.model.fields,field_description:pos_margin.field_report_pos_order_margin_rate +#, fuzzy +msgid "Margin Rate" +msgstr "Margine" + +#. module: pos_margin +#: model:ir.model.fields,field_description:pos_margin.field_report_pos_order_margin_total +#, fuzzy +msgid "Margin Total" +msgstr "Margine" + #. module: pos_margin #: model:ir.model,name:pos_margin.model_pos_order msgid "Point of Sale Orders" msgstr "Punto di riordino" + +#. module: pos_margin +#: model:ir.model,name:pos_margin.model_report_pos_order +#, fuzzy +msgid "Point of Sale Orders Statistics" +msgstr "Punto di riordino" diff --git a/pos_margin/i18n/nl_NL.po b/pos_margin/i18n/nl_NL.po index 6d8cd895..b560206c 100644 --- a/pos_margin/i18n/nl_NL.po +++ b/pos_margin/i18n/nl_NL.po @@ -33,8 +33,9 @@ msgstr "" #. module: pos_margin #: model:ir.model,name:pos_margin.model_pos_order_line -msgid "Lines of Point of Sale" -msgstr "" +#, fuzzy +msgid "Lines of Point of Sale Orders" +msgstr "Kassaorders" #. module: pos_margin #: model:ir.model.fields,field_description:pos_margin.field_pos_order_line_margin @@ -42,7 +43,25 @@ msgstr "" msgid "Margin" msgstr "Marge" +#. module: pos_margin +#: model:ir.model.fields,field_description:pos_margin.field_report_pos_order_margin_rate +#, fuzzy +msgid "Margin Rate" +msgstr "Marge" + +#. module: pos_margin +#: model:ir.model.fields,field_description:pos_margin.field_report_pos_order_margin_total +#, fuzzy +msgid "Margin Total" +msgstr "Marge" + #. module: pos_margin #: model:ir.model,name:pos_margin.model_pos_order msgid "Point of Sale Orders" msgstr "Kassaorders" + +#. module: pos_margin +#: model:ir.model,name:pos_margin.model_report_pos_order +#, fuzzy +msgid "Point of Sale Orders Statistics" +msgstr "Kassaorders" From 9cc3e3d9f003018c336c9567efc44886c38c98db Mon Sep 17 00:00:00 2001 From: OCA-git-bot Date: Wed, 3 Apr 2019 03:12:32 +0000 Subject: [PATCH 06/11] [ADD] icon.png --- pos_margin/static/description/icon.png | Bin 0 -> 9455 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 pos_margin/static/description/icon.png diff --git a/pos_margin/static/description/icon.png b/pos_margin/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 From 72a0f536e7330dd5a06cecdad4a792209fc8c0ca Mon Sep 17 00:00:00 2001 From: Sylvain LE GAL Date: Thu, 15 Aug 2019 11:48:26 +0200 Subject: [PATCH 07/11] [MIG] pos_margin: Migration to 12.0 --- pos_margin/README.rst | 83 +----------------- pos_margin/__manifest__.py | 9 +- pos_margin/i18n/fr.po | 56 ++++++------ pos_margin/i18n/pos_margin.pot | 31 ++++--- pos_margin/models/pos_order.py | 2 +- pos_margin/models/pos_order_line.py | 28 ++++-- pos_margin/readme/CONTRIBUTORS.rst | 2 + pos_margin/readme/DESCRIPTION.rst | 5 ++ pos_margin/readme/HISTORY.rst | 8 ++ pos_margin/readme/ROADMAP.rst | 7 ++ pos_margin/readme/USAGE.rst | 7 ++ .../static/description/pos_order_form.png | Bin 28285 -> 30651 bytes pos_margin/tests/__init__.py | 1 + pos_margin/tests/test_module.py | 68 ++++++++++++++ pos_margin/views/view_pos_order.xml | 20 +++-- 15 files changed, 183 insertions(+), 144 deletions(-) create mode 100644 pos_margin/readme/CONTRIBUTORS.rst create mode 100644 pos_margin/readme/DESCRIPTION.rst create mode 100644 pos_margin/readme/HISTORY.rst create mode 100644 pos_margin/readme/ROADMAP.rst create mode 100644 pos_margin/readme/USAGE.rst create mode 100644 pos_margin/tests/__init__.py create mode 100644 pos_margin/tests/test_module.py diff --git a/pos_margin/README.rst b/pos_margin/README.rst index 4554966c..b97c0917 100644 --- a/pos_margin/README.rst +++ b/pos_margin/README.rst @@ -1,79 +1,4 @@ -.. 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 - -=================== -Margin on PoS order -=================== - -This module extends the functionality of point of sale to support margin on -pos orders. - -This gives the profitability by calculating the difference between the Unit -Price and Cost Price. - - -Usage -===== - -To use this module, you need to: - -#. Go to 'Point Of Sale' / 'Daily Operations' / 'Orders' -#. Open an order - -.. figure:: ./pos_margin/static/description/pos_order_form.png - :width: 800px - -.. image:: https://odoo-community.org/website/image/ir.attachment/5784_f2813bd/datas - :alt: Try me on Runbot - :target: https://runbot.odoo-community.org/runbot/184/8.0 - - -Technical information -===================== - -This module is highly inspired from the module 'Sale Order Margin', by Odoo SA. - -Known issues / Roadmap -====================== - -* include extra reporting, using the new margin field. - -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 smash it by providing detailed and welcomed feedback. - -Credits -======= - -Contributors ------------- - -* Sylvain LE GAL (https://twitter.com/legalsylvain) - -Funders -------- - -The development of this module has been financially supported by: - -* GRAP, Groupement Régional Alimentaire de Proximité (www.grap.coop) - -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 https://odoo-community.org. - +.. !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !! This file is generated by oca-gen-addon-readme !! + !! changes will be overwritten. !! + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! diff --git a/pos_margin/__manifest__.py b/pos_margin/__manifest__.py index 0ad87fba..38502c1b 100644 --- a/pos_margin/__manifest__.py +++ b/pos_margin/__manifest__.py @@ -3,16 +3,17 @@ # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). { - 'name': 'POS Margin', - 'version': '11.0.1.0.0', + 'name': 'PoS Order Margin', + 'summary': 'Margin on PoS Order', + 'version': '12.0.1.0.0', 'category': 'Point Of Sale', - 'sequence': 1, 'author': "GRAP," "Odoo Community Association (OCA)", - 'summary': 'Margin on PoS Order', + 'website': 'https://github.com/OCA/pos', 'license': 'AGPL-3', 'depends': [ 'point_of_sale', + 'sale_margin', ], 'data': [ 'views/view_pos_order.xml', diff --git a/pos_margin/i18n/fr.po b/pos_margin/i18n/fr.po index 33b5016d..d86a037a 100644 --- a/pos_margin/i18n/fr.po +++ b/pos_margin/i18n/fr.po @@ -1,67 +1,61 @@ # Translation of Odoo Server. # This file contains the translation of the following modules: -# * pos_margin +# * pos_margin # -# Translators: -# OCA Transbot , 2017 msgid "" msgstr "" -"Project-Id-Version: Odoo Server 10.0\n" +"Project-Id-Version: Odoo Server 12.0\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2017-04-25 02:39+0000\n" -"PO-Revision-Date: 2017-04-25 02:39+0000\n" -"Last-Translator: OCA Transbot , 2017\n" -"Language-Team: French (https://www.transifex.com/oca/teams/23907/fr/)\n" -"Language: fr\n" +"POT-Creation-Date: 2019-08-15 11:05+0000\n" +"PO-Revision-Date: 2019-08-15 11:05+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: nplurals=2; plural=(n > 1);\n" +"Plural-Forms: \n" #. module: pos_margin -#: model:ir.model.fields,field_description:pos_margin.field_pos_order_line_purchase_price +#: model:ir.model.fields,field_description:pos_margin.field_pos_order_line__purchase_price msgid "Cost Price" msgstr "Prix de revient" #. module: pos_margin -#: model:ir.model.fields,help:pos_margin.field_pos_order_margin -msgid "" -"It gives profitability by calculating the difference between the Unit Price " -"and the cost price." +#: model:ir.model.fields,help:pos_margin.field_pos_order__margin +msgid "It gives profitability by calculating the difference between the Unit Price and the cost price." msgstr "" "Il donne la rentabilité en calculant la différence entre le prix unitaire et " "le prix de revient." #. module: pos_margin -#: model:ir.model,name:pos_margin.model_pos_order_line -#, fuzzy -msgid "Lines of Point of Sale Orders" -msgstr "Lignes de Points de Vente" - -#. module: pos_margin -#: model:ir.model.fields,field_description:pos_margin.field_pos_order_line_margin -#: model:ir.model.fields,field_description:pos_margin.field_pos_order_margin +#: model:ir.model.fields,field_description:pos_margin.field_pos_order__margin +#: model:ir.model.fields,field_description:pos_margin.field_pos_order_line__margin msgid "Margin" msgstr "Marge" #. module: pos_margin -#: model:ir.model.fields,field_description:pos_margin.field_report_pos_order_margin_rate -#, fuzzy +#: model:ir.model.fields,field_description:pos_margin.field_report_pos_order__margin_rate msgid "Margin Rate" -msgstr "Marge" +msgstr "Taux de marque" #. module: pos_margin -#: model:ir.model.fields,field_description:pos_margin.field_report_pos_order_margin_total -#, fuzzy +#: model:ir.model.fields,field_description:pos_margin.field_report_pos_order__margin_total +#: model_terms:ir.ui.view,arch_db:pos_margin.view_pos_order_tree msgid "Margin Total" -msgstr "Marge" +msgstr "Marge Totale" + +#. module: pos_margin +#: model:ir.model,name:pos_margin.model_pos_order_line +msgid "Point of Sale Order Lines" +msgstr "" #. module: pos_margin #: model:ir.model,name:pos_margin.model_pos_order msgid "Point of Sale Orders" -msgstr "" +msgstr "Commandes du point de vente" #. module: pos_margin #: model:ir.model,name:pos_margin.model_report_pos_order -msgid "Point of Sale Orders Statistics" +msgid "Point of Sale Orders Report" msgstr "" + diff --git a/pos_margin/i18n/pos_margin.pot b/pos_margin/i18n/pos_margin.pot index 2f5b529a..2e6bb4fa 100644 --- a/pos_margin/i18n/pos_margin.pot +++ b/pos_margin/i18n/pos_margin.pot @@ -1,11 +1,13 @@ # Translation of Odoo Server. # This file contains the translation of the following modules: -# * pos_margin +# * pos_margin # msgid "" msgstr "" -"Project-Id-Version: Odoo Server 11.0\n" +"Project-Id-Version: Odoo Server 12.0\n" "Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2019-08-15 11:04+0000\n" +"PO-Revision-Date: 2019-08-15 11:04+0000\n" "Last-Translator: <>\n" "Language-Team: \n" "MIME-Version: 1.0\n" @@ -14,36 +16,37 @@ msgstr "" "Plural-Forms: \n" #. module: pos_margin -#: model:ir.model.fields,field_description:pos_margin.field_pos_order_line_purchase_price +#: model:ir.model.fields,field_description:pos_margin.field_pos_order_line__purchase_price msgid "Cost Price" msgstr "" #. module: pos_margin -#: model:ir.model.fields,help:pos_margin.field_pos_order_margin +#: model:ir.model.fields,help:pos_margin.field_pos_order__margin msgid "It gives profitability by calculating the difference between the Unit Price and the cost price." msgstr "" #. module: pos_margin -#: model:ir.model,name:pos_margin.model_pos_order_line -msgid "Lines of Point of Sale Orders" -msgstr "" - -#. module: pos_margin -#: model:ir.model.fields,field_description:pos_margin.field_pos_order_line_margin -#: model:ir.model.fields,field_description:pos_margin.field_pos_order_margin +#: model:ir.model.fields,field_description:pos_margin.field_pos_order__margin +#: model:ir.model.fields,field_description:pos_margin.field_pos_order_line__margin msgid "Margin" msgstr "" #. module: pos_margin -#: model:ir.model.fields,field_description:pos_margin.field_report_pos_order_margin_rate +#: model:ir.model.fields,field_description:pos_margin.field_report_pos_order__margin_rate msgid "Margin Rate" msgstr "" #. module: pos_margin -#: model:ir.model.fields,field_description:pos_margin.field_report_pos_order_margin_total +#: model:ir.model.fields,field_description:pos_margin.field_report_pos_order__margin_total +#: model_terms:ir.ui.view,arch_db:pos_margin.view_pos_order_tree msgid "Margin Total" msgstr "" +#. module: pos_margin +#: model:ir.model,name:pos_margin.model_pos_order_line +msgid "Point of Sale Order Lines" +msgstr "" + #. module: pos_margin #: model:ir.model,name:pos_margin.model_pos_order msgid "Point of Sale Orders" @@ -51,6 +54,6 @@ msgstr "" #. module: pos_margin #: model:ir.model,name:pos_margin.model_report_pos_order -msgid "Point of Sale Orders Statistics" +msgid "Point of Sale Orders Report" msgstr "" diff --git a/pos_margin/models/pos_order.py b/pos_margin/models/pos_order.py index 63f570cc..e3f306bc 100644 --- a/pos_margin/models/pos_order.py +++ b/pos_margin/models/pos_order.py @@ -3,7 +3,7 @@ # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). from odoo import api, fields, models -import openerp.addons.decimal_precision as dp +import odoo.addons.decimal_precision as dp class PosOrder(models.Model): diff --git a/pos_margin/models/pos_order_line.py b/pos_margin/models/pos_order_line.py index 8510d6f3..ad83d80b 100644 --- a/pos_margin/models/pos_order_line.py +++ b/pos_margin/models/pos_order_line.py @@ -3,7 +3,7 @@ # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). from odoo import api, fields, models -import openerp.addons.decimal_precision as dp +import odoo.addons.decimal_precision as dp class PosOrderLine(models.Model): @@ -22,11 +22,21 @@ class PosOrderLine(models.Model): @api.multi @api.depends('product_id', 'qty', 'price_subtotal') def _compute_multi_margin(self): - for line in self: - if not line.product_id: - line.purchase_price = 0 - line.margin = 0 - else: - line.purchase_price = line.product_id.standard_price - line.margin = line.price_subtotal - ( - line.product_id.standard_price * line.qty) + for line in self.filtered(lambda x: x.product_id): + purchase_price = self._get_purchase_price(line) + line.purchase_price = purchase_price + line.margin = line.price_subtotal - (purchase_price * line.qty) + + @api.model + def _get_purchase_price(self, line): + # We call _get_purchase_price from sale_margin module, to reuse + # computation that handles multi currencies context and UoM + SaleOrderLine = self.env['sale.order.line'] + + # if used in combination with module which does add the uom_id to line + uom = hasattr(line, 'uom_id') and line.uom_id\ + or line.product_id.uom_id + + return SaleOrderLine._get_purchase_price( + line.order_id.pricelist_id, line.product_id, uom, + line.order_id.date_order)['purchase_price'] diff --git a/pos_margin/readme/CONTRIBUTORS.rst b/pos_margin/readme/CONTRIBUTORS.rst new file mode 100644 index 00000000..3b5f0996 --- /dev/null +++ b/pos_margin/readme/CONTRIBUTORS.rst @@ -0,0 +1,2 @@ +* Sylvain LE GAL (https://twitter.com/legalsylvain) +* Wolfgang Pichler diff --git a/pos_margin/readme/DESCRIPTION.rst b/pos_margin/readme/DESCRIPTION.rst new file mode 100644 index 00000000..48bcde4b --- /dev/null +++ b/pos_margin/readme/DESCRIPTION.rst @@ -0,0 +1,5 @@ +This module extends the functionality of point of sale to support margin on +pos orders. + +This gives the profitability by calculating the difference between the Unit +Price and Cost Price. diff --git a/pos_margin/readme/HISTORY.rst b/pos_margin/readme/HISTORY.rst new file mode 100644 index 00000000..04bbd269 --- /dev/null +++ b/pos_margin/readme/HISTORY.rst @@ -0,0 +1,8 @@ +12.0.1.0.0 +~~~~~~~~~~ + +* Migrate to V12.0 +* Reuse ``sale_margin`` computation to handle multi currency context. +* Correct computation of margin, if a module that adds ``uom_id`` on + ``pos.order.line`` is installed. +* Add test diff --git a/pos_margin/readme/ROADMAP.rst b/pos_margin/readme/ROADMAP.rst new file mode 100644 index 00000000..c01e849e --- /dev/null +++ b/pos_margin/readme/ROADMAP.rst @@ -0,0 +1,7 @@ +This module depends on ``sale_margin`` module to reuse algorithm present in the +function ``_get_purchase_price`` of the model ``sale.order.line`` to +compute correctly purchase price, in a multicurrency context. + +This dependency can be removed, when Odoo Core will be correctly refactored, +moving this ``@api.model`` function in a more generic module (``account`` +for exemple). diff --git a/pos_margin/readme/USAGE.rst b/pos_margin/readme/USAGE.rst new file mode 100644 index 00000000..e719a37a --- /dev/null +++ b/pos_margin/readme/USAGE.rst @@ -0,0 +1,7 @@ +To use this module, you need to: + +* Go to 'Point Of Sale' / 'Orders' / 'Orders' +* Open an order + +.. figure:: ../static/description/pos_order_form.png + :width: 800px diff --git a/pos_margin/static/description/pos_order_form.png b/pos_margin/static/description/pos_order_form.png index 392b816a6e3800f6ab2e4f18e3e619f0d4380519..22601768290cbc5d364db1d5b5b7397e3f5b7246 100644 GIT binary patch literal 30651 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 Mb^ZHpos.order - - - - - + + + - + + + pos.order + + + + + + + + From 72e65e914e4a214b4ca0e39e8a00860fea9dcf7a Mon Sep 17 00:00:00 2001 From: Sylvain LE GAL Date: Tue, 1 Oct 2019 10:44:37 +0200 Subject: [PATCH 08/11] fixup! [MIG] pos_margin: Migration to 12.0 --- pos_margin/models/pos_order_line.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pos_margin/models/pos_order_line.py b/pos_margin/models/pos_order_line.py index ad83d80b..9cb14f33 100644 --- a/pos_margin/models/pos_order_line.py +++ b/pos_margin/models/pos_order_line.py @@ -22,7 +22,7 @@ class PosOrderLine(models.Model): @api.multi @api.depends('product_id', 'qty', 'price_subtotal') def _compute_multi_margin(self): - for line in self.filtered(lambda x: x.product_id): + for line in self.filtered('product_id'): purchase_price = self._get_purchase_price(line) line.purchase_price = purchase_price line.margin = line.price_subtotal - (purchase_price * line.qty) From 9255faa9db9173b2fc05bcaf631eac8af7d28229 Mon Sep 17 00:00:00 2001 From: oca-travis Date: Tue, 1 Oct 2019 10:44:41 +0000 Subject: [PATCH 09/11] [UPD] Update pos_margin.pot --- pos_margin/i18n/pos_margin.pot | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/pos_margin/i18n/pos_margin.pot b/pos_margin/i18n/pos_margin.pot index 2e6bb4fa..db529121 100644 --- a/pos_margin/i18n/pos_margin.pot +++ b/pos_margin/i18n/pos_margin.pot @@ -1,13 +1,11 @@ # Translation of Odoo Server. # This file contains the translation of the following modules: -# * pos_margin +# * pos_margin # msgid "" msgstr "" "Project-Id-Version: Odoo Server 12.0\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-08-15 11:04+0000\n" -"PO-Revision-Date: 2019-08-15 11:04+0000\n" "Last-Translator: <>\n" "Language-Team: \n" "MIME-Version: 1.0\n" From 6d16a0047e438c248123a64c7c2457e391a70c96 Mon Sep 17 00:00:00 2001 From: OCA-git-bot Date: Tue, 1 Oct 2019 13:38:58 +0000 Subject: [PATCH 10/11] [UPD] README.rst --- pos_margin/README.rst | 108 ++++++ pos_margin/static/description/index.html | 462 +++++++++++++++++++++++ 2 files changed, 570 insertions(+) create mode 100644 pos_margin/static/description/index.html diff --git a/pos_margin/README.rst b/pos_margin/README.rst index b97c0917..6263379a 100644 --- a/pos_margin/README.rst +++ b/pos_margin/README.rst @@ -1,4 +1,112 @@ +================ +PoS Order Margin +================ + .. !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !! This file is generated by oca-gen-addon-readme !! !! changes will be overwritten. !! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + +.. |badge1| image:: https://img.shields.io/badge/maturity-Beta-yellow.png + :target: https://odoo-community.org/page/development-status + :alt: Beta +.. |badge2| image:: https://img.shields.io/badge/licence-AGPL--3-blue.png + :target: http://www.gnu.org/licenses/agpl-3.0-standalone.html + :alt: License: AGPL-3 +.. |badge3| image:: https://img.shields.io/badge/github-OCA%2Fpos-lightgray.png?logo=github + :target: https://github.com/OCA/pos/tree/12.0/pos_margin + :alt: OCA/pos +.. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png + :target: https://translation.odoo-community.org/projects/pos-12-0/pos-12-0-pos_margin + :alt: Translate me on Weblate +.. |badge5| image:: https://img.shields.io/badge/runbot-Try%20me-875A7B.png + :target: https://runbot.odoo-community.org/runbot/184/12.0 + :alt: Try me on Runbot + +|badge1| |badge2| |badge3| |badge4| |badge5| + +This module extends the functionality of point of sale to support margin on +pos orders. + +This gives the profitability by calculating the difference between the Unit +Price and Cost Price. + +**Table of contents** + +.. contents:: + :local: + +Usage +===== + +To use this module, you need to: + +* Go to 'Point Of Sale' / 'Orders' / 'Orders' +* Open an order + +.. figure:: https://raw.githubusercontent.com/OCA/pos/12.0/pos_margin/static/description/pos_order_form.png + :width: 800px + +Known issues / Roadmap +====================== + +This module depends on ``sale_margin`` module to reuse algorithm present in the +function ``_get_purchase_price`` of the model ``sale.order.line`` to +compute correctly purchase price, in a multicurrency context. + +This dependency can be removed, when Odoo Core will be correctly refactored, +moving this ``@api.model`` function in a more generic module (``account`` +for exemple). + +Changelog +========= + +12.0.1.0.0 +~~~~~~~~~~ + +* Migrate to V12.0 +* Reuse ``sale_margin`` computation to handle multi currency context. +* Correct computation of margin, if a module that adds ``uom_id`` on + ``pos.order.line`` is installed. +* Add test + +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 `_. + +Do not contact contributors directly about support or help with technical issues. + +Credits +======= + +Authors +~~~~~~~ + +* GRAP + +Contributors +~~~~~~~~~~~~ + +* Sylvain LE GAL (https://twitter.com/legalsylvain) +* Wolfgang Pichler + +Maintainers +~~~~~~~~~~~ + +This module is maintained by the OCA. + +.. image:: https://odoo-community.org/logo.png + :alt: Odoo Community Association + :target: https://odoo-community.org + +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. + +This module is part of the `OCA/pos `_ project on GitHub. + +You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute. diff --git a/pos_margin/static/description/index.html b/pos_margin/static/description/index.html new file mode 100644 index 00000000..f0091af0 --- /dev/null +++ b/pos_margin/static/description/index.html @@ -0,0 +1,462 @@ + + + + + + +PoS Order Margin + + + +
+

PoS Order Margin

+ + +

Beta License: AGPL-3 OCA/pos Translate me on Weblate Try me on Runbot

+

This module extends the functionality of point of sale to support margin on +pos orders.

+

This gives the profitability by calculating the difference between the Unit +Price and Cost Price.

+

Table of contents

+ +
+

Usage

+

To use this module, you need to:

+
    +
  • Go to ‘Point Of Sale’ / ‘Orders’ / ‘Orders’
  • +
  • Open an order
  • +
+
+https://raw.githubusercontent.com/OCA/pos/12.0/pos_margin/static/description/pos_order_form.png +
+
+
+

Known issues / Roadmap

+

This module depends on sale_margin module to reuse algorithm present in the +function _get_purchase_price of the model sale.order.line to +compute correctly purchase price, in a multicurrency context.

+

This dependency can be removed, when Odoo Core will be correctly refactored, +moving this @api.model function in a more generic module (account +for exemple).

+
+
+

Changelog

+
+

12.0.1.0.0

+
    +
  • Migrate to V12.0
  • +
  • Reuse sale_margin computation to handle multi currency context.
  • +
  • Correct computation of margin, if a module that adds uom_id on +pos.order.line is installed.
  • +
  • Add test
  • +
+
+
+
+

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.

+

Do not contact contributors directly about support or help with technical issues.

+
+
+

Credits

+
+

Authors

+
    +
  • GRAP
  • +
+
+
+

Contributors

+ +
+
+

Maintainers

+

This module is maintained by the OCA.

+Odoo Community Association +

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.

+

This module is part of the OCA/pos project on GitHub.

+

You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute.

+
+
+
+ + From 016a37386732bf85fd31a3ab8cb59baf035d2b2d Mon Sep 17 00:00:00 2001 From: MurtazaMithaiwala Date: Fri, 11 Oct 2019 00:43:36 +0530 Subject: [PATCH 11/11] [MIG] pos_margin: Migration to 13.0 --- pos_margin/README.rst | 1 + pos_margin/__manifest__.py | 2 +- pos_margin/models/pos_order.py | 1 - pos_margin/models/pos_order_line.py | 1 - pos_margin/readme/CONTRIBUTORS.rst | 1 + pos_margin/readme/HISTORY.rst | 4 ++-- pos_margin/static/description/index.html | 7 ++++--- pos_margin/tests/test_module.py | 9 ++++----- 8 files changed, 13 insertions(+), 13 deletions(-) diff --git a/pos_margin/README.rst b/pos_margin/README.rst index 6263379a..8b8d1eb9 100644 --- a/pos_margin/README.rst +++ b/pos_margin/README.rst @@ -93,6 +93,7 @@ Contributors * Sylvain LE GAL (https://twitter.com/legalsylvain) * Wolfgang Pichler +* Murtaza Mithaiwala (https://twitter.com/MurtazaMithaiw4) Maintainers ~~~~~~~~~~~ diff --git a/pos_margin/__manifest__.py b/pos_margin/__manifest__.py index 38502c1b..1038394f 100644 --- a/pos_margin/__manifest__.py +++ b/pos_margin/__manifest__.py @@ -5,7 +5,7 @@ { 'name': 'PoS Order Margin', 'summary': 'Margin on PoS Order', - 'version': '12.0.1.0.0', + 'version': '13.0.1.0.0', 'category': 'Point Of Sale', 'author': "GRAP," "Odoo Community Association (OCA)", diff --git a/pos_margin/models/pos_order.py b/pos_margin/models/pos_order.py index e3f306bc..f1125192 100644 --- a/pos_margin/models/pos_order.py +++ b/pos_margin/models/pos_order.py @@ -17,7 +17,6 @@ class PosOrder(models.Model): " the Unit Price and the cost price.") # Compute Section - @api.multi @api.depends('lines.margin') def _compute_margin(self): for order in self: diff --git a/pos_margin/models/pos_order_line.py b/pos_margin/models/pos_order_line.py index 9cb14f33..84609db6 100644 --- a/pos_margin/models/pos_order_line.py +++ b/pos_margin/models/pos_order_line.py @@ -19,7 +19,6 @@ class PosOrderLine(models.Model): multi='multi_margin', digits=dp.get_precision('Product Price')) # Compute Section - @api.multi @api.depends('product_id', 'qty', 'price_subtotal') def _compute_multi_margin(self): for line in self.filtered('product_id'): diff --git a/pos_margin/readme/CONTRIBUTORS.rst b/pos_margin/readme/CONTRIBUTORS.rst index 3b5f0996..947fc880 100644 --- a/pos_margin/readme/CONTRIBUTORS.rst +++ b/pos_margin/readme/CONTRIBUTORS.rst @@ -1,2 +1,3 @@ * Sylvain LE GAL (https://twitter.com/legalsylvain) * Wolfgang Pichler +* Murtaza Mithaiwala (https://twitter.com/MurtazaMithaiw4) diff --git a/pos_margin/readme/HISTORY.rst b/pos_margin/readme/HISTORY.rst index 04bbd269..f3639e85 100644 --- a/pos_margin/readme/HISTORY.rst +++ b/pos_margin/readme/HISTORY.rst @@ -1,7 +1,7 @@ -12.0.1.0.0 +13.0.1.0.0 ~~~~~~~~~~ -* Migrate to V12.0 +* Migrate to V13.0 * Reuse ``sale_margin`` computation to handle multi currency context. * Correct computation of margin, if a module that adds ``uom_id`` on ``pos.order.line`` is installed. diff --git a/pos_margin/static/description/index.html b/pos_margin/static/description/index.html index f0091af0..dfa337b1 100644 --- a/pos_margin/static/description/index.html +++ b/pos_margin/static/description/index.html @@ -413,9 +413,9 @@ for exemple).

Changelog

-

12.0.1.0.0

+

13.0.1.0.0

    -
  • Migrate to V12.0
  • +
  • Migrate to V13.0
  • Reuse sale_margin computation to handle multi currency context.
  • Correct computation of margin, if a module that adds uom_id on pos.order.line is installed.
  • @@ -444,6 +444,7 @@ If you spotted it first, help us smashing it by providing a detailed and welcome
@@ -453,7 +454,7 @@ If you spotted it first, help us smashing it by providing a detailed and welcome

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.

-

This module is part of the OCA/pos project on GitHub.

+

This module is part of the OCA/pos project on GitHub.

You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute.

diff --git a/pos_margin/tests/test_module.py b/pos_margin/tests/test_module.py index 174a2681..c53e194c 100644 --- a/pos_margin/tests/test_module.py +++ b/pos_margin/tests/test_module.py @@ -46,13 +46,13 @@ class TestModule(TransactionCase): 'price_subtotal_incl': 18.0, }]], 'statement_ids': [[0, 0, { - 'journal_id': self.pos_config.journal_ids[0].id, + 'payment_method_id': + self.pos_config.payment_method_ids[0].id, 'amount': 18.0, 'name': fields.Datetime.now(), 'account_id': self.env.user.partner_id.property_account_receivable_id.id, - 'statement_id': - self.pos_config.current_session_id.statement_ids[0].id, + 'session_id' : self.pos_config.current_session_id.id, }]], 'creation_date': u'2018-09-27 15:51:03', 'amount_tax': 0, @@ -62,7 +62,6 @@ class TestModule(TransactionCase): 'sequence_number': 1, 'amount_total': 18.0, }} - result = self.PosOrder.create_from_ui([order_data]) - order = self.PosOrder.browse(result[0]) + order = self.PosOrder.browse(result[0].get('id')) return order