diff --git a/pos_tare/__manifest__.py b/pos_tare/__manifest__.py index 4b744476..7c7ca29d 100644 --- a/pos_tare/__manifest__.py +++ b/pos_tare/__manifest__.py @@ -3,21 +3,21 @@ { "name": "Point Of Sale - Tare", "summary": "Manage Tare in Point Of Sale module", - 'version': '12.0.1.0.0', - 'category': 'Point of Sale', - 'author': "GRAP, Le Nid, Odoo Community Association (OCA)", - 'website': "https://github.com/OCA/pos", - 'license': 'AGPL-3', - 'maintainers': ['fkawala'], - 'depends': ['point_of_sale'], - 'demo': ['demo/pos_tare_demo.xml'], - 'data': [ - 'pos_tare.xml', - 'views/pos_config_view.xml', - 'data/barcode_rule.xml', + "version": "12.0.1.0.0", + "category": "Point of Sale", + "author": "GRAP, Le Nid, Odoo Community Association (OCA)", + "website": "https://github.com/OCA/pos", + "license": "AGPL-3", + "maintainers": ["fkawala"], + "depends": ["point_of_sale"], + "data": [ + "views/templates.xml", + "views/view_pos_config.xml", + "views/view_pos_order.xml", + "data/barcode_rule.xml", ], - 'qweb': [ - 'static/src/xml/pos_tare.xml', + "qweb": [ + "static/src/xml/pos_tare.xml", ], - 'installable': True, + "installable": True, } diff --git a/pos_tare/demo/pos_tare_demo.xml b/pos_tare/demo/pos_tare_demo.xml deleted file mode 100644 index da5fe482..00000000 --- a/pos_tare/demo/pos_tare_demo.xml +++ /dev/null @@ -1,10 +0,0 @@ - - - - - Kg - - - bigger - - diff --git a/pos_tare/models/__init__.py b/pos_tare/models/__init__.py index c81866fd..c6acc897 100644 --- a/pos_tare/models/__init__.py +++ b/pos_tare/models/__init__.py @@ -1,2 +1,3 @@ from . import pos_config +from . import pos_order_line from . import barcode_rule diff --git a/pos_tare/models/barcode_rule.py b/pos_tare/models/barcode_rule.py index fcdf3609..f48c1147 100644 --- a/pos_tare/models/barcode_rule.py +++ b/pos_tare/models/barcode_rule.py @@ -1,9 +1,9 @@ -from odoo import _, models, fields +from odoo import models, fields class BarcodeRule(models.Model): _inherit = 'barcode.rule' type = fields.Selection(selection_add=[ - ('tare', _('Tare')) + ('tare', 'Tare') ]) diff --git a/pos_tare/models/pos_config.py b/pos_tare/models/pos_config.py index 4ea1217e..68e9bf56 100644 --- a/pos_tare/models/pos_config.py +++ b/pos_tare/models/pos_config.py @@ -1,18 +1,39 @@ -from odoo import models, fields +from odoo import api, models, fields class PosConfig(models.Model): - _inherit = 'pos.config' + _inherit = "pos.config" iface_tare_method = fields.Selection([ - ('Manual', 'Input the tare manually'), - ('Barcode', 'Scan a barcode to set the tare'), - ('Both', 'Manual input and barcode'), + ("manual", "Input the tare manually"), + ("barcode", "Scan a barcode to set the tare"), + ("both", "Manual input and barcode"), ], - string='Tare input method', - default='Both', + string="Tare Input Method", + default="both", + required=True, help="Select tare method:\n" - "* 'Manual (the scale screen has an extra tare input field)';\n" - "* 'Barecode (scan a barcode to tare the selected order line)';\n" - "* 'Both manual input and barcode methods are enabled';", + "* 'manual' : the scale screen has an extra tare input field;\n" + "* 'barecode' : (scan a barcode to tare the selected order line;\n" + "* 'both' : manual input and barcode methods are enabled;", ) + + iface_gross_weight_method = fields.Selection([ + ("manual", "Input the Gross Weight manually"), + ("scale", "Input Gross Weight via Scale") + ], + string="Gross Weight Input Method", + default="scale", + required=True, + ) + + iface_tare_uom_id = fields.Many2one( + string="Unit of Measure of the tare", + comodel_name="uom.uom", + default=lambda s: s._default_iface_tare_uom_id(), + required=True, + ) + + @api.model + def _default_iface_tare_uom_id(self): + return self.env.ref("uom.product_uom_kgm") diff --git a/pos_tare/models/pos_order_line.py b/pos_tare/models/pos_order_line.py new file mode 100644 index 00000000..c86e6260 --- /dev/null +++ b/pos_tare/models/pos_order_line.py @@ -0,0 +1,15 @@ +# Copyright (C) 2020-Today: GRAP () +# @author: Sylvain LE GAL (https://twitter.com/legalsylvain) +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). + +from odoo import models, fields +from odoo.addons import decimal_precision as dp + + +class PosOrderLine(models.Model): + _inherit = "pos.order.line" + + tare = fields.Float( + string="Tare", + digits=dp.get_precision("Product Unit of Measure") + ) diff --git a/pos_tare/pos_tare.xml b/pos_tare/pos_tare.xml deleted file mode 100644 index 062f2a94..00000000 --- a/pos_tare/pos_tare.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - diff --git a/pos_tare/readme/CONTRIBUTORS.rst b/pos_tare/readme/CONTRIBUTORS.rst index d75c661f..1434c95d 100644 --- a/pos_tare/readme/CONTRIBUTORS.rst +++ b/pos_tare/readme/CONTRIBUTORS.rst @@ -1,4 +1,3 @@ - Sylvain LE GAL (https://www.twitter.com/legalsylvain) - Le Nid - CoopITEasy - diff --git a/pos_tare/readme/ROADMAP.rst b/pos_tare/readme/ROADMAP.rst deleted file mode 100644 index 4e2021e0..00000000 --- a/pos_tare/readme/ROADMAP.rst +++ /dev/null @@ -1 +0,0 @@ -- Print tare value on customer receipt. diff --git a/pos_tare/static/description/pos_ticket.png b/pos_tare/static/description/pos_ticket.png new file mode 100644 index 00000000..bf753d40 Binary files /dev/null and b/pos_tare/static/description/pos_ticket.png differ diff --git a/pos_tare/static/src/js/models.js b/pos_tare/static/src/js/models.js new file mode 100644 index 00000000..1a839967 --- /dev/null +++ b/pos_tare/static/src/js/models.js @@ -0,0 +1,114 @@ +odoo.define('pos_tare.models', function (require) { + + "use strict"; + var core = require('web.core'); + var models = require('point_of_sale.models'); + var pos_tare_tools = require('pos_tare.tools'); + + var _t = core._t; + + var _super_ = models.Orderline.prototype; + var OrderLineWithTare = models.Orderline.extend({ + + // ///////////////////////////// + // Overload Section + // ///////////////////////////// + initialize: function (session, attributes) { + this.tare = 0; + return _super_.initialize.call(this, session, attributes); + }, + + init_from_JSON: function (json) { + _super_.init_from_JSON.call(this, json); + this.tare = json.tare ||0; + }, + + clone: function () { + var orderline = _super_.clone.call(this); + orderline.tare = this.tare; + return orderline; + }, + + export_as_JSON: function () { + var json = _super_.export_as_JSON.call(this); + json.tare = this.get_tare(); + return json; + }, + + export_for_printing: function () { + var result = _super_.export_for_printing.call(this); + result.tare_quantity = this.get_tare(); + return result; + }, + + // ///////////////////////////// + // Custom Section + // ///////////////////////////// + set_tare: function (quantity, update_net_weight) { + this.order.assert_editable(); + + // Prevent to apply multiple times a tare to the same product. + if (this.get_tare() > 0) { + throw new RangeError(_.str.sprintf( + _t("The tare (%s) is already set for the " + + "product \"%s\". We can not re-apply a tare to this " + + "product."), + this.get_tare_str_with_unit(), this.product.display_name)); + } + + // We convert the tare that is always measured in the same UoM into + // the unit of measure for this order line. + var tare_unit = this.pos.units_by_id[this.pos.config.iface_tare_uom_id[0]]; + var tare = parseFloat(quantity) || 0; + var line_unit = this.get_unit(); + var tare_in_product_uom = pos_tare_tools.convert_mass(tare, tare_unit, line_unit); + var tare_in_product_uom_string = pos_tare_tools.format_tare(this.pos, + tare_in_product_uom, line_unit); + if (update_net_weight) { + var net_quantity = this.get_quantity() - tare_in_product_uom; + // This method fails when the net weight is negative. + if (net_quantity <= 0) { + throw new RangeError(_.str.sprintf( + _t("The tare weight is %s %s, it's greater or equal to " + + "the product weight %s. We can not apply this tare."), + tare_in_product_uom_string, line_unit.name, + this.get_quantity_str_with_unit())); + } + // Update the quantity with the new weight net of tare quantity. + this.set_quantity(net_quantity); + } + // Update tare value. + this.tare = tare_in_product_uom; + this.trigger('change', this); + + }, + + get_tare: function () { + return this.tare; + }, + + get_tare_str_with_unit: function () { + var unit = this.get_unit(); + var tare_str = pos_tare_tools.format_tare( + this.pos, + this.tare, + this.get_unit(), + ); + return tare_str + ' ' + unit.name; + }, + + get_gross_weight_str_with_unit: function () { + var unit = this.get_unit(); + var gross_weight_str = pos_tare_tools.format_tare( + this.pos, + this.get_tare() + this.get_quantity(), + this.get_unit(), + ); + return gross_weight_str + ' ' + unit.name; + }, + + }); + + models.Orderline = OrderLineWithTare; + +}); diff --git a/pos_tare/static/src/js/pos_tare.js b/pos_tare/static/src/js/pos_tare.js deleted file mode 100644 index 7b6af6da..00000000 --- a/pos_tare/static/src/js/pos_tare.js +++ /dev/null @@ -1,269 +0,0 @@ -odoo.define('pos_barcode_tare.screens', function (require) { - - "use strict"; - var core = require('web.core'); - var models = require('point_of_sale.models'); - var screens = require('point_of_sale.screens'); - var utils = require('web.utils'); - var field_utils = require('web.field_utils'); - - var _t = core._t; - var round_pr = utils.round_precision; - var round_di = utils.round_decimals; - - // Define functions used to do unit operation. - // Get unit search for unit based on unit name. - var get_unit = function (pos, unit_name) { - return pos.units.filter( - function (u) { - return u.name === unit_name; - })[0]; - }; - - // Convert mass using the reference UOM as pivot unit. - var convert_mass = function (mass, from_unit, to_unit) { - // There is no conversion from one category to another. - if (from_unit.category_id[0] !== to_unit.category_id[0]) { - throw new Error(_.str.sprintf( - _t("We can not cast a weight in %s into %s."), - from_unit.name, to_unit.name)); - } - // No need to convert as weights are measured in same unit. - if (from_unit.id === to_unit.id) { - return mass; - } - // Converts "from_unit" to reference unit of measure. - var result = mass; - if (from_unit.uom_type === "bigger") { - result /= from_unit.factor; - } else { - result *= from_unit.factor_inv; - } - // Converts reference unit of measure to "to_unit". - if (to_unit.uom_type === "bigger") { - result *= to_unit.factor; - } else { - result /= to_unit.factor_inv; - } - - if (to_unit.rounding) { - // Return the rounded result if needed. - return round_pr(result || 0, to_unit.rounding); - } - - return result || 0; - }; - - // Format the tare value. - var format_tare = function (pos, qty, unit) { - if (unit.rounding) { - var q = round_pr(qty, unit.rounding); - var decimals = pos.dp['Product Unit of Measure']; - return field_utils.format.float( - round_di(q, decimals), - {type: 'float', digits: [69, decimals]}); - } - return qty.toFixed(0); - }; - - // This configures read action for tare barcode. A tare barcode contains a - // fake product ID and the weight to be subtracted from the product in the - // latest order line. - screens.ScreenWidget.include( - { - barcode_tare_action: function (code) { - try { - var order = this.pos.get_order(); - var selected_order_line = order.get_selected_orderline(); - var tare_weight = code.value; - selected_order_line.set_tare(tare_weight); - } catch (error) { - var title = _t("We can not apply this tare barcode."); - var popup = {title: title, body: error.message}; - this.gui.show_popup('error', popup); - } - }, - // Setup the callback action for the "weight" barcodes. - show: function () { - - console.log("okok"); - this._super(); - if (this.pos.config.iface_tare_method !== 'Manual') { - - console.log("okokokok"); - this.pos.barcode_reader.set_action_callback( - 'tare', - _.bind(this.barcode_tare_action, this)); - } - }, - }); - - screens.ScaleScreenWidget.include({ - - // ///////////////////////////// - // Overload Section - // ///////////////////////////// - - // Overload show function - // add an handler on the - show: function () { - this._super(); - this.tare = 0.0; - var self = this; - this.$('#input_weight_tare').keyup(function (event) { - self.onchange_tare(event); - }); - this.$('#input_weight_tare').focus(); - }, - - // Overload set_weight function - // We assume that the argument is now the gross weight - // we compute the net weight, depending on the tare and the gross weight - // then we call super, with the net weight - set_weight: function (gross_weight) { - this.gross_weight = gross_weight; - var net_weight = gross_weight - (this.tare || 0); - this.$('#container_weight_gross').text( - this.get_product_gross_weight_string()); - this._super(net_weight); - }, - - order_product: function () { - // TODO Set a warning, if the value is incorrect; - if (this.tare === undefined) { - this.gui.show_popup('error', { - 'title': _t('Incorrect Tare Value'), - 'body': _t('Please set a numeric value' + - ' in the tare field, or let empty.'), - }); - } else { - this._super(); - if (this.tare > 0.0) { - var order = this.pos.get_order(); - var orderline = order.get_last_orderline(); - orderline.set_tare(this.tare); - } - } - }, - - // ///////////////////////////// - // Custom Section - // ///////////////////////////// - get_product_gross_weight_string: function () { - var product = this.get_product(); - var defaultstr = (this.gross_weight || 0).toFixed(3) + ' Kg'; - if (!product || !this.pos) { - return defaultstr; - } - var unit_id = product.uom_id; - if (!unit_id) { - return defaultstr; - } - var unit = this.pos.units_by_id[unit_id[0]]; - var weight = round_pr(this.gross_weight || 0, unit.rounding); - var weightstr = weight.toFixed( - Math.ceil(Math.log(1.0/unit.rounding) / Math.log(10) )); - weightstr += ' ' + unit.name; - return weightstr; - }, - - onchange_tare: function () { - this.tare = this.check_sanitize_value('#input_weight_tare'); - this.set_weight(this.gross_weight); - }, - - check_sanitize_value: function (input_name) { - var res = this.$(input_name)[0].value.replace(',', '.').trim(); - if (isNaN(res)) { - this.$(input_name).css("background-color", "#F66"); - return undefined; - } - this.$(input_name).css("background-color", "#FFF"); - return parseFloat(res, 10); - }, - - }); - - // Update Orderline model - var _super_ = models.Orderline.prototype; - var OrderLineWithTare = models.Orderline.extend({ - initialize: function (session, attributes) { - this.tareQuantity = 0; - this.tareQuantityStr = '0'; - return _super_.initialize.call(this, session, attributes); - }, - init_from_JSON: function (json) { - _super_.init_from_JSON.call(this, json); - this.tareQuantity = json.tareQuantity ||0; - this.tareQuantityStr = json.tareQuantityStr ||'0'; - }, - set_tare: function (quantity) { - this.order.assert_editable(); - - // Prevent to apply multiple times a tare to the same product. - if (this.get_tare() > 0) { - throw new RangeError(_.str.sprintf( - _t("The tare (%s) is already set for the " + - "product \"%s\". We can not re-apply a tare to this " + - "product."), - this.get_tare_str_with_unit(), this.product.display_name)); - } - - // We convert the tare that is always measured in kilogrammes into - // the unit of measure for this order line. - var kg = get_unit(this.pos, "kg"); - var tare = parseFloat(quantity) || 0; - var unit = this.get_unit(); - var tare_in_product_uom = convert_mass(tare, kg, unit); - var tare_in_product_uom_string = format_tare(this.pos, - tare_in_product_uom, unit); - var net_quantity = this.get_quantity() - tare_in_product_uom; - // This method fails when the net weight is negative. - if (net_quantity <= 0) { - throw new RangeError(_.str.sprintf( - _t("The tare weight is %s %s, it's greater or equal to " + - "the product weight %s. We can not apply this tare."), - tare_in_product_uom_string, unit.name, - this.get_quantity_str_with_unit())); - } - // Update tare value. - this.tareQuantity = tare_in_product_uom; - this.tareQuantityStr = tare_in_product_uom_string; - // Update the quantity with the new weight net of tare quantity. - this.set_quantity(net_quantity); - this.trigger('change', this); - }, - get_tare: function () { - return this.tareQuantity; - }, - get_tare_str: function () { - return this.tareQuantityStr; - }, - get_tare_str_with_unit: function () { - var unit = this.get_unit(); - return this.tareQuantityStr + ' ' + unit.name; - }, - export_as_JSON: function () { - var json = _super_.export_as_JSON.call(this); - json.tareQuantity = this.get_tare(); - json.tareQuantityStr = this.get_tare_str(); - return json; - }, - clone: function () { - var orderline = _super_.clone.call(this); - orderline.tareQuantity = this.tareQuantity; - orderline.tareQuantityStr = this.tareQuantityStr; - return orderline; - }, - export_for_printing: function () { - var result = _super_.export_for_printing.call(this); - result.tare_quantity = this.get_tare(); - return result; - }, - }); - - models.Orderline = OrderLineWithTare; - - return {OrderLineWithTare: OrderLineWithTare, - get_unit: get_unit}; -}); diff --git a/pos_tare/static/src/js/screens.js b/pos_tare/static/src/js/screens.js new file mode 100644 index 00000000..e948c14b --- /dev/null +++ b/pos_tare/static/src/js/screens.js @@ -0,0 +1,137 @@ +odoo.define('pos_tare.screens', function (require) { + + "use strict"; + var core = require('web.core'); + var screens = require('point_of_sale.screens'); + var utils = require('web.utils'); + + var _t = core._t; + var round_pr = utils.round_precision; + + // This configures read action for tare barcode. A tare barcode contains a + // fake product ID and the weight to be subtracted from the product in the + // latest order line. + screens.ScreenWidget.include( + { + barcode_tare_action: function (code) { + try { + var order = this.pos.get_order(); + var selected_order_line = order.get_selected_orderline(); + var tare_weight = code.value; + selected_order_line.set_tare(tare_weight, true); + } catch (error) { + var title = _t("We can not apply this tare barcode."); + var popup = {title: title, body: error.message}; + this.gui.show_popup('error', popup); + } + }, + // Setup the callback action for the "weight" barcodes. + show: function () { + this._super(); + if (this.pos.config.iface_tare_method !== 'manual') { + this.pos.barcode_reader.set_action_callback( + 'tare', + _.bind(this.barcode_tare_action, this)); + } + }, + }); + + screens.ScaleScreenWidget.include({ + + // ///////////////////////////// + // Overload Section + // ///////////////////////////// + + show: function () { + this.tare = 0.0; + this.gross_weight = 0.0; + this._super(); + var self = this; + this.$('#input_weight_tare').keyup(function (event) { + self.onchange_tare(event); + }); + this.$('#input_gross_weight').keyup(function (event) { + self.onchange_gross_weight(event); + }); + if (this.pos.config.iface_gross_weight_method === 'scale') { + this.$('#input_weight_tare').focus(); + } else{ + this.pos.proxy_queue.clear(); + this.$('#input_gross_weight').focus(); + } + }, + + // Overload set_weight function + // We assume that the argument is now the gross weight + // we compute the net weight, depending on the tare and the gross weight + // then we call super, with the net weight + set_weight: function (gross_weight) { + this.gross_weight = gross_weight; + var net_weight = gross_weight - (this.tare || 0); + this.$('#container_weight_gross').text( + this.get_product_gross_weight_string()); + this._super(net_weight); + }, + + order_product: function () { + // TODO Set a warning, if the value is incorrect; + if (this.tare === undefined) { + this.gui.show_popup('error', { + 'title': _t('Incorrect Tare Value'), + 'body': _t('Please set a numeric value' + + ' in the tare field, or let empty.'), + }); + } else { + this._super(); + if (this.tare > 0.0) { + var order = this.pos.get_order(); + var orderline = order.get_last_orderline(); + orderline.set_tare(this.tare, false); + } + } + }, + + // ///////////////////////////// + // Custom Section + // ///////////////////////////// + get_product_gross_weight_string: function () { + var product = this.get_product(); + var defaultstr = (this.gross_weight || 0).toFixed(3) + ' Kg'; + if (!product || !this.pos) { + return defaultstr; + } + var unit_id = product.uom_id; + if (!unit_id) { + return defaultstr; + } + var unit = this.pos.units_by_id[unit_id[0]]; + var weight = round_pr(this.gross_weight || 0, unit.rounding); + var weightstr = weight.toFixed( + Math.ceil(Math.log(1.0/unit.rounding) / Math.log(10) )); + weightstr += ' ' + unit.name; + return weightstr; + }, + + onchange_tare: function () { + this.tare = this.check_sanitize_value('#input_weight_tare'); + this.set_weight(this.gross_weight); + }, + + onchange_gross_weight: function () { + var gross_weight = this.check_sanitize_value('#input_gross_weight'); + this.set_weight(gross_weight); + }, + + check_sanitize_value: function (input_name) { + var res = this.$(input_name)[0].value.replace(',', '.').trim(); + if (isNaN(res)) { + this.$(input_name).css("background-color", "#F66"); + return undefined; + } + this.$(input_name).css("background-color", "#FFF"); + return parseFloat(res, 10); + }, + + }); + +}); diff --git a/pos_tare/static/src/js/tools.js b/pos_tare/static/src/js/tools.js new file mode 100644 index 00000000..e1c349d9 --- /dev/null +++ b/pos_tare/static/src/js/tools.js @@ -0,0 +1,62 @@ +odoo.define('pos_tare.tools', function (require) { + + "use strict"; + var core = require('web.core'); + var utils = require('web.utils'); + var field_utils = require('web.field_utils'); + + var _t = core._t; + var round_pr = utils.round_precision; + var round_di = utils.round_decimals; + + // Convert mass using the reference UOM as pivot unit. + var convert_mass = function (mass, from_unit, to_unit) { + // There is no conversion from one category to another. + if (from_unit.category_id[0] !== to_unit.category_id[0]) { + throw new Error(_.str.sprintf( + _t("We can not cast a weight in %s into %s."), + from_unit.name, to_unit.name)); + } + // No need to convert as weights are measured in same unit. + if (from_unit.id === to_unit.id) { + return mass; + } + // Converts "from_unit" to reference unit of measure. + var result = mass; + if (from_unit.uom_type === "bigger") { + result /= from_unit.factor; + } else { + result *= from_unit.factor_inv; + } + // Converts reference unit of measure to "to_unit". + if (to_unit.uom_type === "bigger") { + result *= to_unit.factor; + } else { + result /= to_unit.factor_inv; + } + + if (to_unit.rounding) { + // Return the rounded result if needed. + return round_pr(result || 0, to_unit.rounding); + } + + return result || 0; + }; + + // Format the tare value. + var format_tare = function (pos, qty, unit) { + if (unit.rounding) { + var q = round_pr(qty, unit.rounding); + var decimals = pos.dp['Product Unit of Measure']; + return field_utils.format.float( + round_di(q, decimals), + {type: 'float', digits: [69, decimals]}); + } + return qty.toFixed(0); + }; + + return { + convert_mass: convert_mass, + format_tare: format_tare, + }; +}); diff --git a/pos_tare/static/src/xml/pos_tare.xml b/pos_tare/static/src/xml/pos_tare.xml index eaf21f56..49436af9 100644 --- a/pos_tare/static/src/xml/pos_tare.xml +++ b/pos_tare/static/src/xml/pos_tare.xml @@ -1,60 +1,59 @@ - + - +
Gross Weight
-
+ +
+ + +
+ + +
+
Tare
- Kg + +
- -
  • - - - - - - -
      - -
    • - - - - - at - - / - -
    • -
      - -
    • - With a - - % - - discount -
    • -
      - -
    • - tare = -
    • -
      -
    -
  • + + + + +
  • + + Tare : +
  • +
    +
    + + + +
    + Gross Weight :
    + Tare :
    +
    +
    +
    +
    + + + + diff --git a/pos_tare/views/pos_config_view.xml b/pos_tare/views/pos_config_view.xml deleted file mode 100644 index 35f9df29..00000000 --- a/pos_tare/views/pos_config_view.xml +++ /dev/null @@ -1,28 +0,0 @@ - - - - - - view.pos.config.form - pos.config - - - - -
    -
    -
    -
    -
    -
    -
    -
    diff --git a/pos_tare/views/templates.xml b/pos_tare/views/templates.xml new file mode 100644 index 00000000..a8e0bc73 --- /dev/null +++ b/pos_tare/views/templates.xml @@ -0,0 +1,10 @@ + + + diff --git a/pos_tare/views/view_pos_config.xml b/pos_tare/views/view_pos_config.xml new file mode 100644 index 00000000..11ca9424 --- /dev/null +++ b/pos_tare/views/view_pos_config.xml @@ -0,0 +1,54 @@ + + + + + + + pos.config + + + + +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    diff --git a/pos_tare/views/view_pos_order.xml b/pos_tare/views/view_pos_order.xml new file mode 100644 index 00000000..7df2e933 --- /dev/null +++ b/pos_tare/views/view_pos_order.xml @@ -0,0 +1,16 @@ + + + + + + + pos.order + + + + + + + + +