diff --git a/pos_order_pricelist_change/README.rst b/pos_order_pricelist_change/README.rst
new file mode 100644
index 00000000..4df4e9bb
--- /dev/null
+++ b/pos_order_pricelist_change/README.rst
@@ -0,0 +1,43 @@
+Improve pricelist changes for POS Order in back office
+======================================================
+
+* On a POS order, when changing a pricelist, warn the user as in sale
+ module, when doing a quotation;
+* On a POS order, provide a 'Recompute With pricelist' button to update
+ when pricelist has changed;
+
+Installation
+============
+
+Regular installation.
+
+Configuration
+=============
+
+No configuration needed.
+
+Usage
+=====
+
+.. image:: ./static/src/img/screenshot_warning.png
+
+Credits
+=======
+
+Contributors
+------------
+
+* Sylvain LE GAL (https://twitter.com/legalsylvain);
+
+Maintainer
+----------
+
+.. image:: http://odoo-community.org/logo.png
+ :alt: Odoo Community Association
+ :target: http://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/pos_order_pricelist_change/__init__.py b/pos_order_pricelist_change/__init__.py
new file mode 100644
index 00000000..8c9eb1df
--- /dev/null
+++ b/pos_order_pricelist_change/__init__.py
@@ -0,0 +1,23 @@
+# -*- encoding: utf-8 -*-
+##############################################################################
+#
+# Point Of Sale - Order Pricelist Change for Odoo
+# Copyright (C) 2014 GRAP (http://www.grap.coop)
+# @author Sylvain LE GAL (https://twitter.com/legalsylvain)
+#
+# 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 . import models
diff --git a/pos_order_pricelist_change/__openerp__.py b/pos_order_pricelist_change/__openerp__.py
new file mode 100644
index 00000000..216cb514
--- /dev/null
+++ b/pos_order_pricelist_change/__openerp__.py
@@ -0,0 +1,40 @@
+# -*- encoding: utf-8 -*-
+##############################################################################
+#
+# Point Of Sale - Order Pricelist Change for Odoo
+# Copyright (C) 2014 GRAP (http://www.grap.coop)
+# @author Sylvain LE GAL (https://twitter.com/legalsylvain)
+#
+# 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': 'Point Of Sale - Order Pricelist Change',
+ 'summary': 'Improve pricelist changes for POS Order in back office',
+ 'version': '1.0',
+ 'category': 'Point Of Sale',
+ 'author': 'GRAP,Odoo Community Association (OCA)',
+ 'website': 'http://www.grap.coop',
+ 'license': 'AGPL-3',
+ 'depends': [
+ 'point_of_sale',
+ ],
+ 'data': [
+ 'views/view.xml',
+ ],
+ 'demo': [
+ 'demo/demo.xml',
+ 'demo/res_groups.yml',
+ ],
+}
diff --git a/pos_order_pricelist_change/demo/demo.xml b/pos_order_pricelist_change/demo/demo.xml
new file mode 100644
index 00000000..8d838ced
--- /dev/null
+++ b/pos_order_pricelist_change/demo/demo.xml
@@ -0,0 +1,47 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Surcharge Pricelist
+ sale
+
+
+
+ Surcharge Pricelist Version
+
+
+
+
+ 10
+ Surcharge Pricelist Line
+
+
+
+
+ Surcharge Customer
+
+
+
+
+
+
diff --git a/pos_order_pricelist_change/demo/res_groups.yml b/pos_order_pricelist_change/demo/res_groups.yml
new file mode 100644
index 00000000..9545d146
--- /dev/null
+++ b/pos_order_pricelist_change/demo/res_groups.yml
@@ -0,0 +1,29 @@
+# -*- encoding: utf-8 -*-
+###############################################################################
+#
+# Point Of Sale - Order Pricelist Change for Odoo
+# Copyright (C) 2014-Today GRAP (http://www.grap.coop)
+# @author Sylvain LE GAL (https://twitter.com/legalsylvain)
+#
+# 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 .
+#
+###############################################################################
+
+- !record {model: res.groups, id: base.group_no_one}:
+ users:
+ - base.user_root
+
+- !record {model: res.groups, id: product.group_sale_pricelist}:
+ users:
+ - base.user_root
diff --git a/pos_order_pricelist_change/i18n/fr.po b/pos_order_pricelist_change/i18n/fr.po
new file mode 100644
index 00000000..790c4980
--- /dev/null
+++ b/pos_order_pricelist_change/i18n/fr.po
@@ -0,0 +1,33 @@
+# Translation of OpenERP Server.
+# This file contains the translation of the following modules:
+# * pos_order_pricelist_change
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: OpenERP Server 7.0\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2014-07-16 13:01+0000\n"
+"PO-Revision-Date: 2014-07-16 13:01+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: pos_order_pricelist_change
+#: code:addons/pos_order_pricelist_change/model/pos_order.py:47
+#, python-format
+msgid "If you change the pricelist of this order, prices of existing order lines will not be updated. Please click on the 'Recompute With Pricelist'."
+msgstr "Si vous changez la liste de prix de cette vente, les prix des lignes existantes ne seront pas mis à jour. Merci de cliquer sur le bouton 'Recalculer avec la liste de prix."
+
+#. module: pos_order_pricelist_change
+#: code:addons/pos_order_pricelist_change/model/pos_order.py:46
+#, python-format
+msgid "Pricelist Warning!"
+msgstr "Attention à la liste de Prix !"
+
+#. module: pos_order_pricelist_change
+#: view:pos.order:0
+msgid "Recompute With Pricelist"
+msgstr "Recalculer avec la Liste de Prix"
diff --git a/pos_order_pricelist_change/i18n/pos_order_pricelist_change.pot b/pos_order_pricelist_change/i18n/pos_order_pricelist_change.pot
new file mode 100644
index 00000000..b4f31842
--- /dev/null
+++ b/pos_order_pricelist_change/i18n/pos_order_pricelist_change.pot
@@ -0,0 +1,56 @@
+# Translation of OpenERP Server.
+# This file contains the translation of the following modules:
+# * pos_order_pricelist_change
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: OpenERP Server 7.0\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2014-11-16 02:05+0000\n"
+"PO-Revision-Date: 2014-11-16 02: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: \n"
+
+#. module: pos_order_pricelist_change
+#: code:addons/pos_order_pricelist_change/model/pos_order.py:47
+#, python-format
+msgid "If you change the pricelist of this order, prices of existing order lines will not be updated. Please click on the 'Recompute With Pricelist'."
+msgstr ""
+
+#. module: pos_order_pricelist_change
+#: code:_description:0
+#: model:ir.model,name:pos_order_pricelist_change.model_pos_order
+#, python-format
+msgid "Point of Sale"
+msgstr ""
+
+#. module: pos_order_pricelist_change
+#: code:addons/pos_order_pricelist_change/model/pos_order.py:46
+#, python-format
+msgid "Pricelist Warning!"
+msgstr ""
+
+#. module: pos_order_pricelist_change
+#: view:pos.order:0
+msgid "Recompute With Pricelist"
+msgstr ""
+
+#. module: pos_order_pricelist_change
+#: model:product.pricelist,name:pos_order_pricelist_change.pricelist_surcharge
+msgid "Surcharge Pricelist"
+msgstr ""
+
+#. module: pos_order_pricelist_change
+#: model:product.pricelist.version,name:pos_order_pricelist_change.pricelist_version_surcharge
+msgid "Surcharge Pricelist Version"
+msgstr ""
+
+#. module: pos_order_pricelist_change
+#: view:pos.order:0
+msgid "onchange_pricelist_id(pricelist_id, lines)"
+msgstr ""
+
diff --git a/pos_order_pricelist_change/models/__init__.py b/pos_order_pricelist_change/models/__init__.py
new file mode 100644
index 00000000..eefc4be8
--- /dev/null
+++ b/pos_order_pricelist_change/models/__init__.py
@@ -0,0 +1,23 @@
+# -*- encoding: utf-8 -*-
+##############################################################################
+#
+# Point Of Sale - Order Pricelist Change for Odoo
+# Copyright (C) 2014-Today GRAP (http://www.grap.coop)
+# @author Sylvain LE GAL (https://twitter.com/legalsylvain)
+#
+# 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 . import pos_order
diff --git a/pos_order_pricelist_change/models/pos_order.py b/pos_order_pricelist_change/models/pos_order.py
new file mode 100644
index 00000000..c4bee235
--- /dev/null
+++ b/pos_order_pricelist_change/models/pos_order.py
@@ -0,0 +1,50 @@
+# -*- encoding: utf-8 -*-
+##############################################################################
+#
+# Point Of Sale - Order Pricelist Change for Odoo
+# Copyright (C) 2014 GRAP (http://www.grap.coop)
+# @author Sylvain LE GAL (https://twitter.com/legalsylvain)
+#
+# 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.models import Model
+from openerp import api, _
+
+
+class PosOrder(Model):
+ _inherit = 'pos.order'
+
+ @api.multi
+ def action_recompute_pricelist(self):
+ for po in self:
+ for pol in po.lines:
+ res = pol.onchange_product_id(
+ po.pricelist_id.id, pol.product_id.id, qty=pol.qty,
+ partner_id=po.partner_id.id)
+ pol.write(res['value'])
+
+ @api.onchange('pricelist_id')
+ def onchange_pricelist_id(self):
+ if not self.pricelist_id or not self.lines:
+ return {}
+ warning = {
+ 'title': _('Pricelist Warning!'),
+ 'message': _(
+ """If you change the pricelist of this order,"""
+ """ prices of existing order lines will not be updated."""
+ """ Please click on the 'Recompute With Pricelist'.""")
+ }
+ return {'warning': warning}
diff --git a/pos_order_pricelist_change/static/description/icon.png b/pos_order_pricelist_change/static/description/icon.png
new file mode 100644
index 00000000..d337c24c
Binary files /dev/null and b/pos_order_pricelist_change/static/description/icon.png differ
diff --git a/pos_order_pricelist_change/static/src/img/screenshot_warning.png b/pos_order_pricelist_change/static/src/img/screenshot_warning.png
new file mode 100644
index 00000000..410f1c4d
Binary files /dev/null and b/pos_order_pricelist_change/static/src/img/screenshot_warning.png differ
diff --git a/pos_order_pricelist_change/tests/__init__.py b/pos_order_pricelist_change/tests/__init__.py
new file mode 100644
index 00000000..02e498ba
--- /dev/null
+++ b/pos_order_pricelist_change/tests/__init__.py
@@ -0,0 +1,23 @@
+# -*- encoding: utf-8 -*-
+##############################################################################
+#
+# Point Of Sale - Order Pricelist Change for Odoo
+# Copyright (C) 2013-2014 GRAP (http://www.grap.coop)
+# @author Sylvain LE GAL (https://twitter.com/legalsylvain)
+#
+# 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 . import test_pos_order_pricelist_change
diff --git a/pos_order_pricelist_change/tests/test_pos_order_pricelist_change.py b/pos_order_pricelist_change/tests/test_pos_order_pricelist_change.py
new file mode 100644
index 00000000..c8eb0ce2
--- /dev/null
+++ b/pos_order_pricelist_change/tests/test_pos_order_pricelist_change.py
@@ -0,0 +1,117 @@
+# -*- encoding: utf-8 -*-
+##############################################################################
+#
+# Point Of Sale - Order Pricelist Change for Odoo
+# Copyright (C) 2014 GRAP (http://www.grap.coop)
+# @author Sylvain LE GAL (https://twitter.com/legalsylvain)
+#
+# 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.tests.common import TransactionCase
+
+
+class TestPosOrderPricelistChange(TransactionCase):
+ """Tests for Point Of Sale - Order Pricelist Change Module"""
+
+ def setUp(self):
+ super(TestPosOrderPricelistChange, self).setUp()
+ self.imd_obj = self.env['ir.model.data']
+ self.pp_obj = self.env['product.product']
+ self.ppl_obj = self.env['product.pricelist']
+ self.po_obj = self.env['pos.order']
+ self.pol_obj = self.env['pos.order.line']
+ self.pc_obj = self.env['pos.config']
+ self.ps_obj = self.env['pos.session']
+
+ self.pc = self.env.ref('point_of_sale.pos_config_main')
+ self.rp_c2c = self.env.ref('base.res_partner_12')
+ self.ppl_c2c = self.env.ref('product.list0')
+ self.pp_usb = self.env.ref('product.product_product_48')
+
+ self.rp_spe = self.env.ref(
+ 'pos_order_pricelist_change.partner_surcharge')
+ self.ppl_spe = self.env.ref(
+ 'pos_order_pricelist_change.pricelist_surcharge')
+
+ # Test Section
+ def test_01_default_price_list(self):
+ """[Regression Test] Sale with default Pricelist"""
+ # Opening Session
+ self.ps_obj.create({'config_id': self.pc.id})
+
+ # create Pos Order
+ po = self.po_obj.create({
+ 'partner_id': self.rp_c2c.id,
+ 'pricelist_id': self.ppl_c2c.id,
+ 'lines': [[0, False, {
+ 'product_id': self.pp_usb.id,
+ 'qty': 1,
+ }]],
+ })
+ res = po.lines[0].onchange_product_id(
+ po.pricelist_id.id, po.lines[0].product_id.id, po.lines[0].qty)
+
+ self.assertEquals(
+ res['value']['price_subtotal'], self.pp_usb.list_price,
+ "Incorrect price for default pricelist!")
+
+ def test_02_partner_with_price_list_before(self):
+ """[Regression Test] Sale with specific Pricelist"""
+ # Opening Session
+ self.ps_obj.create({'config_id': self.pc.id})
+
+ # create Pos Order
+ po = self.po_obj.create({
+ 'partner_id': self.rp_spe.id,
+ 'pricelist_id': self.ppl_spe.id,
+ 'lines': [[0, False, {
+ 'product_id': self.pp_usb.id,
+ 'qty': 1,
+ }]],
+ })
+
+ res = po.lines[0].onchange_product_id(
+ po.pricelist_id.id, po.lines[0].product_id.id, po.lines[0].qty)
+ self.assertEquals(
+ res['value']['price_subtotal'], self.pp_usb.list_price + 10,
+ "Incorrect price for specific pricelist!")
+
+ def test_03_partner_with_price_list_after(self):
+ """[Functional Test] Change pricelist after have set lines."""
+ # Opening Session
+ self.ps_obj.create({'config_id': self.pc.id})
+
+ # create Pos Order
+ po = self.po_obj.create({
+ 'pricelist_id': self.ppl_c2c.id,
+ 'lines': [[0, False, {
+ 'product_id': self.pp_usb.id,
+ 'qty': 1,
+ }]],
+ })
+
+ res = po.onchange_pricelist_id()
+ self.assertNotEquals(
+ res.get('warning', False), False,
+ "Need warning!")
+
+ # Change now pricelist
+ po.write({'pricelist_id': self.ppl_spe.id})
+ po.action_recompute_pricelist()
+ po = self.po_obj.browse(po.id)
+ self.assertEquals(
+ po.amount_total, self.pp_usb.list_price + 10,
+ "Recompute with pricelist error.")
diff --git a/pos_order_pricelist_change/views/view.xml b/pos_order_pricelist_change/views/view.xml
new file mode 100644
index 00000000..c192b4c2
--- /dev/null
+++ b/pos_order_pricelist_change/views/view.xml
@@ -0,0 +1,34 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ pos.order.form
+ pos.order
+
+
+
+
+
+
+
+
+