Skip to content

Commit

Permalink
[ADD] module pos_price_to_weight (OCA#171)
Browse files Browse the repository at this point in the history
* [ADD] module pos_price_to_weight

* [FIX] jslint / pylint / flake8 issues
  • Loading branch information
legalsylvain committed Jan 2, 2018
1 parent e5e751d commit 9986d9f
Show file tree
Hide file tree
Showing 15 changed files with 293 additions and 0 deletions.
105 changes: 105 additions & 0 deletions pos_price_to_weight/README.rst
Original file line number Diff line number Diff line change
@@ -0,0 +1,105 @@
.. 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

===============================
Point of Sale - Price to Weight
===============================

This module extends Odoo Point Of Sale features, to allow to scan barcode
with price and to compute according quantity.

In Odoo by default, there are three types of barcode rules for products.

* 'Unit Product' (type='product'). Scanning a product will add a unit of this
product to the current order.
* 'Priced product' (type='price'). A price is extracted from the barcode, and
a new line with the given price and a quantity = 1 is added to the current
order.
* 'Weighted product' (type='weight). A weight is extracted from the barcode,
and a new line with the given weight, and a computed price
(quantity * Unit price) is added to the current order.

This module add a new option:

* 'Priced Product (Computed Weight)' (type='price_to_weight'). A price is
extracted from the barcode, and a new line with the given price, and a
computed quantity (Price / Unit Price) is added to the current order.

.. image:: /pos_price_to_weight/static/description/barcode_rule.png
:width: 800 px

This module is usefull in shops with products scaled, to manage correctly
stock quantities.

Samples

* Given a product with a unit price of 1,50€ / kg
* The barcode is 0212345{NNNDD}x where:
* 02 is the prefix of the barcode rule
* 12345 is the product number
* {NNNDD} is the price of the scaled product
* x is the control digit

if {NNNDD} is 00265, the price is so 2,65€ and the according quantity is
2,65€ / 1,5 €/kg = 1,767 kg

.. image:: /pos_price_to_weight/static/description/pos_test_1.png
:width: 800 px

if {NNNDD} is 00810, the price is so 8,10€ and the according quantity is
8,10€ / 1,5 €/kg = 5,400 kg

.. image:: /pos_price_to_weight/static/description/pos_test_2.png
:width: 800 px


Configuration
=============

* Go to 'Point of Sale' / 'Configuration' / 'Barcode Nomenclatures'
* Edit your barcode rules, according to your barcodes settings

Usage
=====

.. 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/9.0

Bug Tracker
===========

Bugs are tracked on `GitHub Issues
<https://github.com/OCA/pos/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
=======

Images
------

Icon parts come from http://icons8.com

Contributors
------------

* Sylvain LE GAL <https://twitter.com/legalsylvain>


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.
2 changes: 2 additions & 0 deletions pos_price_to_weight/__init__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
# -*- coding: utf-8 -*-
from . import models
25 changes: 25 additions & 0 deletions pos_price_to_weight/__openerp__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
# -*- coding: utf-8 -*-
# Copyright (C) 2017-Today: La Louve (<http://www.lalouve.net/>)
# @author: Sylvain LE GAL (https://twitter.com/legalsylvain)
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html).

{
'name': 'Point of Sale - Price to Weight',
'version': '9.0.1.0.0',
'category': 'Point Of Sale',
'summary': 'Compute weight based on barcodes with prices',
'author': 'La Louve, GRAP, Odoo Community Association (OCA)',
'website': 'http://www.lalouve.net/',
'license': 'AGPL-3',
'depends': [
'point_of_sale',
],
'data': [
'data/barcode_rule.xml',
'static/src/xml/templates.xml',
],
'demo': [
'demo/product_product.xml',
],
'installable': True,
}
19 changes: 19 additions & 0 deletions pos_price_to_weight/data/barcode_rule.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
<?xml version="1.0" encoding="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).
-->

<openerp><data>

<record id="rule_price_to_weight" model="barcode.rule">
<field name="name">Price Barcodes (Computed Weight) 2 Decimals</field>
<field name="barcode_nomenclature_id" ref="barcodes.default_barcode_nomenclature"/>
<field name="type">price_to_weight</field>
<field name="pattern">02.....{NNNDD}</field>
<field name="sequence">15</field>
<field name="encoding">ean13</field>
</record>

</data></openerp>
18 changes: 18 additions & 0 deletions pos_price_to_weight/demo/product_product.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
<?xml version="1.0" encoding="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).
-->

<odoo>

<record id="product_price_to_weight_barcode" model="product.product">
<field name="name">Apples (with Price To Weight Barcode)</field>
<field name="barcode">0212345000007</field>
<field name="list_price">1.50</field>
<field name="uom_id" ref="product.product_uom_kgm"/>
<field name="uom_po_id" ref="product.product_uom_kgm"/>
</record>

</odoo>
28 changes: 28 additions & 0 deletions pos_price_to_weight/i18n/fr.po
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * pos_price_to_weight
#
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 9.0c\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2017-05-10 01:40+0000\n"
"PO-Revision-Date: 2017-05-10 01:40+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_price_to_weight
#: model:product.product,name:pos_price_to_weight.product_price_to_weight_barcode
#: model:product.template,name:pos_price_to_weight.product_price_to_weight_barcode_product_template
msgid "Apples (with Price To Weight Barcode)"
msgstr "Pommes (Avec un code barre Prix vers Pois)"

#. module: pos_price_to_weight
#: code:addons/pos_price_to_weight/models/barcode_rule.py:17
#, python-format
msgid "Priced Product (Computed Weight)"
msgstr "Code Barre Prix (Poid calculé)"
2 changes: 2 additions & 0 deletions pos_price_to_weight/models/__init__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
# -*- coding: utf-8 -*-
from . import barcode_rule
17 changes: 17 additions & 0 deletions pos_price_to_weight/models/barcode_rule.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
# -*- coding: utf-8 -*-
# Copyright (C) 2017-Today: La Louve (<http://www.lalouve.net/>)
# @author: Sylvain LE GAL (https://twitter.com/legalsylvain)
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html).

from openerp import _, api, models


class BarcodeRule(models.Model):
_inherit = 'barcode.rule'

@api.model
def _get_type_selection(self):
res = super(BarcodeRule, self)._get_type_selection()
res.append(
('price_to_weight', _('Priced Product (Computed Weight)')))
return res
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added pos_price_to_weight/static/description/icon.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
38 changes: 38 additions & 0 deletions pos_price_to_weight/static/src/js/models.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
///*
// Copyright (C) 2017-Today: La Louve (<http://www.lalouve.net/>)
// @author: Sylvain LE GAL (https://twitter.com/legalsylvain)
// License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html).
//*/


odoo.define('pos_price_to_weight.models', function (require) {
"use strict";

var models = require('point_of_sale.models');

var _super_PosModel = models.PosModel.prototype;

models.PosModel = models.PosModel.extend({

scan_product: function(parsed_code) {
if (! (parsed_code.type === 'price_to_weight')){
// Normal behaviour
return _super_PosModel.scan_product.apply(this, [parsed_code]);
}
// Compute quantity, based on price and unit price
var selectedOrder = this.get_order();
var product = this.db.get_product_by_barcode(parsed_code.base_code);
if(!product){
return false;
}
var quantity = 0;
var price = parseFloat(parsed_code.value) || 0;
if (price !== 0 && product.price !== 0){
quantity = price / product.price;
}
selectedOrder.add_product(product, {quantity: quantity, merge: false});
return true;
},

});
});
22 changes: 22 additions & 0 deletions pos_price_to_weight/static/src/js/screens.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
/*
Copyright (C) 2017-Today: La Louve (<http://www.lalouve.net/>)
@author: Sylvain LE GAL (https://twitter.com/legalsylvain)
License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html).
*/


odoo.define('pos_price_to_weight.screens', function (require) {
"use strict";

var screens = require('point_of_sale.screens');

screens.ScreenWidget.include({
show: function(){
this._super();
var self = this;
this.pos.barcode_reader.set_action_callback({
'price_to_weight': _.bind(self.barcode_product_action, self),
});
},
});
});
17 changes: 17 additions & 0 deletions pos_price_to_weight/static/src/xml/templates.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
Copyright (C) 2017-Today: La Louve (<http://www.lalouve.net/>)
@author: Sylvain LE GAL (https://twitter.com/legalsylvain)
License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html).
-->

<odoo>
<template id="assets_frontend" inherit_id="point_of_sale.assets">
<xpath expr="." position="inside">
<script type="text/javascript" src="/pos_price_to_weight/static/src/js/screens.js"/>
<script type="text/javascript" src="/pos_price_to_weight/static/src/js/models.js"/>
</xpath>
</template>
</odoo>


0 comments on commit 9986d9f

Please sign in to comment.