Browse Source

Merge pull request #4 from grap/7.0-pos_order_pricelist_change

[ADD] 7.0 'pos_order_pricelist_change'
pull/14/head
Sylvain LE GAL 10 years ago
parent
commit
ef6b4ae257
  1. 23
      pos_order_pricelist_change/__init__.py
  2. 56
      pos_order_pricelist_change/__openerp__.py
  3. 47
      pos_order_pricelist_change/demo/demo.xml
  4. 33
      pos_order_pricelist_change/i18n/fr.po
  5. 56
      pos_order_pricelist_change/i18n/pos_order_pricelist_change.pot
  6. 23
      pos_order_pricelist_change/model/__init__.py
  7. 52
      pos_order_pricelist_change/model/pos_order.py
  8. BIN
      pos_order_pricelist_change/static/src/img/icon.png
  9. 27
      pos_order_pricelist_change/tests/__init__.py
  10. 188
      pos_order_pricelist_change/tests/test_pos_order_pricelist_change.py
  11. 38
      pos_order_pricelist_change/view/view.xml

23
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 <http://www.gnu.org/licenses/>.
#
##############################################################################
from . import model

56
pos_order_pricelist_change/__openerp__.py

@ -0,0 +1,56 @@
# -*- 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 <http://www.gnu.org/licenses/>.
#
##############################################################################
{
'name': 'Point Of Sale - Order Pricelist Change',
'summary': """Fix an incorrect behaviour when changing pricelist on"""
""" pos order""",
'version': '1.0',
'category': 'Point Of Sale',
'description': """
Fix an incorrect behaviour when changing pricelist on pos order
===============================================================
Features:
---------
* 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;
Copyright, Authors and Licence:
-------------------------------
* Copyright: 2014, GRAP: Groupement Régional Alimentaire de Proximité;
* Author:
* Sylvain LE GAL (https://twitter.com/legalsylvain);""",
'author': 'GRAP',
'website': 'http://www.grap.coop',
'license': 'AGPL-3',
'depends': [
'point_of_sale',
],
'data': [
'view/view.xml',
],
'demo': [
'demo/demo.xml',
],
}

47
pos_order_pricelist_change/demo/demo.xml

@ -0,0 +1,47 @@
<?xml version="1.0" 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 <http://www.gnu.org/licenses/>. -->
<!-- ********************************************************************** -->
<openerp>
<data noupdate="1">
<!-- Price List -->
<record id="pricelist_surcharge" model="product.pricelist">
<field name="name">Surcharge Pricelist</field>
<field name="type">sale</field>
</record>
<record id="pricelist_version_surcharge" model="product.pricelist.version">
<field name="pricelist_id" ref="pricelist_surcharge"/>
<field name="name">Surcharge Pricelist Version</field>
</record>
<record id="pricelist_item_surcharge" model="product.pricelist.item">
<field name="price_version_id" ref="pricelist_version_surcharge"/>
<field name="base" ref="product.list_price"/>
<field name="price_surcharge">10</field>
<field name="name">Surcharge Pricelist Line</field>
</record>
<!-- Partner -->
<record id="partner_surcharge" model="res.partner">
<field name="name">Surcharge Customer</field>
<field name="customer" eval="True" />
<field name="property_product_pricelist" eval="ref('pricelist_surcharge')" />
</record>
</data>
</openerp>

33
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"

56
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 ""

23
pos_order_pricelist_change/model/__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 <http://www.gnu.org/licenses/>.
#
##############################################################################
from . import pos_order

52
pos_order_pricelist_change/model/pos_order.py

@ -0,0 +1,52 @@
# -*- 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 <http://www.gnu.org/licenses/>.
#
##############################################################################
from openerp.osv.orm import Model
from openerp.tools.translate import _
class pos_order(Model):
_inherit = 'pos.order'
def action_recompute_pricelist(self, cr, uid, ids, context=None):
pol_obj = self.pool.get('pos.order.line')
for po in self.browse(cr, uid, ids, context=context):
for pol in po.lines:
res = pol_obj.onchange_product_id(
cr, uid, [pol.id], po.pricelist_id.id, pol.product_id.id,
pol.qty, po.partner_id.id)
if res['value']['price_unit'] != pol.price_unit:
pol_obj.write(
cr, uid, [pol.id], res['value'], context=context)
def onchange_pricelist_id(
self, cr, uid, ids, pricelist_id, lines, context=None):
if not pricelist_id or not 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}

BIN
pos_order_pricelist_change/static/src/img/icon.png

After

Width: 128  |  Height: 128  |  Size: 8.6 KiB

27
pos_order_pricelist_change/tests/__init__.py

@ -0,0 +1,27 @@
# -*- 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 <http://www.gnu.org/licenses/>.
#
##############################################################################
from . import test_pos_order_pricelist_change
fast_suite = [
test_pos_order_pricelist_change,
]

188
pos_order_pricelist_change/tests/test_pos_order_pricelist_change.py

@ -0,0 +1,188 @@
# -*- 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 <http://www.gnu.org/licenses/>.
#
##############################################################################
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.registry('ir.model.data')
self.pp_obj = self.registry('product.product')
self.ppl_obj = self.registry('product.pricelist')
self.po_obj = self.registry('pos.order')
self.pol_obj = self.registry('pos.order.line')
self.pc_obj = self.registry('pos.config')
self.ps_obj = self.registry('pos.session')
# Test Section
def test_01_default_price_list(self):
"""[Regression Test] Sale with default Pricelist"""
cr, uid = self.cr, self.uid
# Getting object
pc_id = self.imd_obj.get_object_reference(
cr, uid, 'point_of_sale', 'pos_config_main')[1]
rp_c2c_id = self.imd_obj.get_object_reference(
cr, uid, 'base', 'res_partner_12')[1]
ppl_c2c_id = self.imd_obj.get_object_reference(
cr, uid, 'product', 'list0')[1]
pp_usb_id = self.imd_obj.get_object_reference(
cr, uid, 'product', 'product_product_48')[1]
# Opening Session
self.ps_obj.create(cr, uid, {
'config_id': pc_id,
})
# create Pos Order
po_id = self.po_obj.create(cr, uid, {
'partner_id': rp_c2c_id,
'pricelist_id': ppl_c2c_id,
'lines': [[0, False, {
'product_id': pp_usb_id,
'qty': 1,
}]],
})
pp_usb = self.pp_obj.browse(cr, uid, pp_usb_id)
po = self.po_obj.browse(cr, uid, po_id)
res = self.pol_obj.onchange_product_id(
cr, uid, po.lines[0].id, po.pricelist_id.id,
po.lines[0].product_id.id, po.lines[0].qty)
self.assertEquals(
res['value']['price_subtotal'], pp_usb.list_price,
"Incorrect price for default pricelist!")
def test_02_partner_with_price_list_before(self):
"""[Regression Test] Sale with specific Pricelist"""
cr, uid = self.cr, self.uid
# Getting object
pc_id = self.imd_obj.get_object_reference(
cr, uid, 'point_of_sale', 'pos_config_main')[1]
rp_spe_id = self.imd_obj.get_object_reference(
cr, uid, 'pos_order_pricelist_change', 'partner_surcharge')[1]
ppl_spe_id = self.imd_obj.get_object_reference(
cr, uid, 'pos_order_pricelist_change', 'pricelist_surcharge')[1]
pp_usb_id = self.imd_obj.get_object_reference(
cr, uid, 'product', 'product_product_48')[1]
# Opening Session
self.ps_obj.create(cr, uid, {
'config_id': pc_id,
})
# create Pos Order
po_id = self.po_obj.create(cr, uid, {
'partner_id': rp_spe_id,
'pricelist_id': ppl_spe_id,
'lines': [[0, False, {
'product_id': pp_usb_id,
'qty': 1,
}]],
})
pp_usb = self.pp_obj.browse(cr, uid, pp_usb_id)
po = self.po_obj.browse(cr, uid, po_id)
res = self.pol_obj.onchange_product_id(
cr, uid, po.lines[0].id, po.pricelist_id.id,
po.lines[0].product_id.id, po.lines[0].qty)
self.assertEquals(
res['value']['price_subtotal'], 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."""
cr, uid = self.cr, self.uid
# Getting object
pc_id = self.imd_obj.get_object_reference(
cr, uid, 'point_of_sale', 'pos_config_main')[1]
ppl_spe_id = self.imd_obj.get_object_reference(
cr, uid, 'pos_order_pricelist_change', 'pricelist_surcharge')[1]
ppl_c2c_id = self.imd_obj.get_object_reference(
cr, uid, 'product', 'list0')[1]
pp_usb_id = self.imd_obj.get_object_reference(
cr, uid, 'product', 'product_product_48')[1]
# Opening Session
self.ps_obj.create(cr, uid, {
'config_id': pc_id,
})
# create Pos Order
po_id = self.po_obj.create(cr, uid, {
'pricelist_id': ppl_c2c_id,
'lines': [[0, False, {
'product_id': pp_usb_id,
'qty': 1,
}]],
})
po = self.po_obj.browse(cr, uid, po_id)
res = self.po_obj.onchange_pricelist_id(
cr, uid, po.id, ppl_spe_id, po.lines)
self.assertNotEquals(
res.get('warning', False), False,
"Need warning!")
pp_usb = self.pp_obj.browse(cr, uid, pp_usb_id)
# Change now pricelist
self.po_obj.write(cr, uid, [po_id], {'pricelist_id': ppl_spe_id})
self.po_obj.action_recompute_pricelist(cr, uid, [po.id])
po = self.po_obj.browse(cr, uid, po_id)
self.assertEquals(
po.amount_total, pp_usb.list_price + 10,
"Recompute with pricelist error")
def test_04_partner_without_price_list_after(self):
"""[Functional Test] Unset pricelist after have set lines."""
cr, uid = self.cr, self.uid
# Getting object
pc_id = self.imd_obj.get_object_reference(
cr, uid, 'point_of_sale', 'pos_config_main')[1]
pp_usb_id = self.imd_obj.get_object_reference(
cr, uid, 'product', 'product_product_48')[1]
ppl_c2c_id = self.imd_obj.get_object_reference(
cr, uid, 'product', 'list0')[1]
# Opening Session
self.ps_obj.create(cr, uid, {
'config_id': pc_id,
})
# create Pos Order
po_id = self.po_obj.create(cr, uid, {
'pricelist_id': ppl_c2c_id,
'lines': [[0, False, {
'product_id': pp_usb_id,
'qty': 1,
}]],
})
po = self.po_obj.browse(cr, uid, po_id)
res = self.po_obj.onchange_pricelist_id(
cr, uid, po.id, False, po.lines)
self.assertEquals(
res.get('warning', False), False,
"Doesn't need warning!")

38
pos_order_pricelist_change/view/view.xml

@ -0,0 +1,38 @@
<?xml version="1.0" 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 <http://www.gnu.org/licenses/>. -->
<!-- ********************************************************************** -->
<openerp>
<data>
<!-- View : pos.order -->
<record id="view_pos_order_form" model="ir.ui.view">
<field name="name">pos.order.form</field>
<field name="model">pos.order</field>
<field name="inherit_id" ref="point_of_sale.view_pos_pos_form" />
<field name="arch" type="xml">
<header position="inside">
<button name="action_recompute_pricelist" string="Recompute With Pricelist" type="object" states="draft"/>
</header>
<field name="pricelist_id" position="attributes">
<attribute name="on_change">onchange_pricelist_id(pricelist_id, lines)</attribute>
</field>
</field>
</record>
</data>
</openerp>
Loading…
Cancel
Save