From 2fbf539564c6217f0f160411d546e5e8393556a9 Mon Sep 17 00:00:00 2001 From: PabloCM Date: Wed, 22 Jul 2015 14:43:46 +0200 Subject: [PATCH] [FIX] The backend now handles properly the fiscal position conversion of taxes applied on the frontend --- pos_pricelist/__init__.py | 11 ++ pos_pricelist/__openerp__.py | 4 +- .../migrations/8.0.1.1.0/post-migration.py | 30 +++++ pos_pricelist/models/__init__.py | 1 + pos_pricelist/models/point_of_sale.py | 62 ++++++++++ pos_pricelist/static/src/js/models.js | 14 +++ pos_pricelist/views/point_of_sale_view.xml | 108 ++++++++++++++++++ 7 files changed, 229 insertions(+), 1 deletion(-) create mode 100644 pos_pricelist/migrations/8.0.1.1.0/post-migration.py create mode 100644 pos_pricelist/models/point_of_sale.py create mode 100644 pos_pricelist/views/point_of_sale_view.xml diff --git a/pos_pricelist/__init__.py b/pos_pricelist/__init__.py index 8b20599f..9e2b95da 100644 --- a/pos_pricelist/__init__.py +++ b/pos_pricelist/__init__.py @@ -17,3 +17,14 @@ # ############################################################################## from . import models + + +def set_pos_line_taxes(cr, registry): + """Copy the product taxes to the pos.line""" + cr.execute("""insert into pline_tax_rel + select l.id, t.id + from pos_order_line l + join pos_order o on l.order_id = o.id + join product_taxes_rel rel on rel.prod_id = l.product_id + join account_tax t on rel.tax_id = t.id + where t.company_id = o.company_id""") diff --git a/pos_pricelist/__openerp__.py b/pos_pricelist/__openerp__.py index c4654eed..c5106d42 100644 --- a/pos_pricelist/__openerp__.py +++ b/pos_pricelist/__openerp__.py @@ -18,7 +18,7 @@ ############################################################################## { 'name': 'POS Pricelist', - 'version': '1.0.0', + 'version': '1.1.0', 'category': 'Point Of Sale', 'sequence': 1, 'author': "Adil Houmadi @Taktik,Odoo Community Association (OCA)", @@ -34,6 +34,7 @@ New feature for the Point Of Sale: 'data': [ "views/pos_pricelist_template.xml", "views/pos_pricelist_views.xml", + "views/point_of_sale_view.xml" ], 'demo': [ 'demo/pos_pricelist_demo.yml', @@ -41,6 +42,7 @@ New feature for the Point Of Sale: 'qweb': [ 'static/src/xml/pos.xml' ], + 'post_init_hook': "set_pos_line_taxes", 'installable': True, 'application': False, 'auto_install': False, diff --git a/pos_pricelist/migrations/8.0.1.1.0/post-migration.py b/pos_pricelist/migrations/8.0.1.1.0/post-migration.py new file mode 100644 index 00000000..d2a888f9 --- /dev/null +++ b/pos_pricelist/migrations/8.0.1.1.0/post-migration.py @@ -0,0 +1,30 @@ +# -*- coding: utf-8 -*- +############################################################################## +# +# Copyright (C) 2015 Aserti Global Solutions (http://www.aserti.es/). +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as published +# by the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see . +# +############################################################################## +__name__ = ("Copy the product taxes to the pos.line") + + +def migrate(cr, version): + cr.execute("""insert into pline_tax_rel + select l.id, t.id + from pos_order_line l + join pos_order o on l.order_id = o.id + join product_taxes_rel rel on rel.prod_id = l.product_id + join account_tax t on rel.tax_id = t.id + where t.company_id = o.company_id""") diff --git a/pos_pricelist/models/__init__.py b/pos_pricelist/models/__init__.py index 6edd473a..e139cc36 100644 --- a/pos_pricelist/models/__init__.py +++ b/pos_pricelist/models/__init__.py @@ -17,3 +17,4 @@ # ############################################################################## from . import pos_pricelist +from . import point_of_sale diff --git a/pos_pricelist/models/point_of_sale.py b/pos_pricelist/models/point_of_sale.py new file mode 100644 index 00000000..494622ca --- /dev/null +++ b/pos_pricelist/models/point_of_sale.py @@ -0,0 +1,62 @@ +# -*- coding: utf-8 -*- +############################################################################## +# +# Copyright (C) 2015 Aserti Global Solutions (http://www.aserti.es/). +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as published +# by the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see . +# +############################################################################## + + +from openerp import models, fields, api +# import logging +# _logger = logging.getLogger(__name__) + + +class PosOrderLine(models.Model): + _inherit = "pos.order.line" + + @api.one + @api.depends('tax_ids', 'qty', 'price_unit', + 'product_id', 'discount', 'order_id.partner_id') + def _amount_line_all(self): + price = self.price_unit * (1 - (self.discount or 0.0) / 100.0) + taxes = self.tax_ids.compute_all( + price, self.qty, product=self.product_id, + partner=self.order_id.partner_id) + self.price_subtotal = taxes['total'] + self.price_subtotal_incl = taxes['total_included'] + + tax_ids = fields.Many2many( + 'account.tax', 'pline_tax_rel', 'pos_line_id', 'tax_id', + "Taxes", domain=[('type_tax_use', '=', 'sale')]) + price_subtotal = fields.Float(compute="_amount_line_all", store=True) + price_subtotal_incl = fields.Float(compute="_amount_line_all", store=True) + + +class PosOrder(models.Model): + _inherit = "pos.order" + + @api.model + def _amount_line_tax(self, line): + price = line.price_unit * (1 - (line.discount or 0.0) / 100.0) + taxes = line.tax_ids.compute_all( + price, line.qty, product=line.product_id, + partner=line.order_id.partner_id)['taxes'] + val = 0.0 + for c in taxes: + val += c.get('amount', 0.0) + return val + +# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: diff --git a/pos_pricelist/static/src/js/models.js b/pos_pricelist/static/src/js/models.js index 35f59be5..cebe78f0 100644 --- a/pos_pricelist/static/src/js/models.js +++ b/pos_pricelist/static/src/js/models.js @@ -295,6 +295,20 @@ function pos_pricelist_models(instance, module) { return OrderlineParent.prototype.get_display_price.apply( this, arguments ); + }, + + export_as_JSON: function() { + var res = OrderlineParent.prototype.export_as_JSON.apply(this, arguments); + var product_tax_ids = this.get_product().taxes_id || []; + var partner = this.order ? this.order.get_client() : null; + if (partner && partner.property_account_position) { + product_tax_ids = + this.pos.db.find_taxes_by_fiscal_position_id( + partner.property_account_position[0], product_tax_ids + ); + } + res["tax_ids"] = [[6, false, product_tax_ids]]; + return res; } }); diff --git a/pos_pricelist/views/point_of_sale_view.xml b/pos_pricelist/views/point_of_sale_view.xml new file mode 100644 index 00000000..7590eff6 --- /dev/null +++ b/pos_pricelist/views/point_of_sale_view.xml @@ -0,0 +1,108 @@ + + + + + + pos.order + pos.order + + + + + + + + + +