|
|
@ -1,26 +1,34 @@ |
|
|
|
odoo.define('pos_barcode_tare.screens', function (require) { |
|
|
|
"use strict"; |
|
|
|
var screens = require('point_of_sale.screens'); |
|
|
|
var gui = require('point_of_sale.gui'); |
|
|
|
var chrome = require('point_of_sale.chrome'); |
|
|
|
var core = require('web.core'); |
|
|
|
var _t = core._t; |
|
|
|
var devices = require('point_of_sale.devices'); |
|
|
|
var gui = require('point_of_sale.gui'); |
|
|
|
var models = require('point_of_sale.models'); |
|
|
|
var screens = require('point_of_sale.screens'); |
|
|
|
var QWeb = core.qweb; |
|
|
|
|
|
|
|
// 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_weight_action: function (code) { |
|
|
|
var self = this; |
|
|
|
var order = this.pos.get_order(); |
|
|
|
// Computes the paid weight
|
|
|
|
var last_order_line = order.get_last_orderline(); |
|
|
|
var total_weight = last_order_line.get_quantity(); |
|
|
|
var tare = code.value; |
|
|
|
var paid_weight = total_weight - tare; |
|
|
|
|
|
|
|
// Throws a warning popup if the price is negative
|
|
|
|
if (paid_weight <= 0) { |
|
|
|
self.gui.show_popup('confirm', |
|
|
|
{'title': _t('Negative weight'), |
|
|
|
'body': _t('The calculated weight is negative. ' + |
|
|
|
'Did you scan the correct tare label?'), |
|
|
|
confirm: function () { |
|
|
|
// Operator can choose to ignore the warning.
|
|
|
|
last_order_line.set_quantity(paid_weight); |
|
|
|
}}); |
|
|
|
} else { |
|
|
@ -28,6 +36,7 @@ odoo.define('pos_barcode_tare.screens', function (require) { |
|
|
|
} |
|
|
|
}, |
|
|
|
|
|
|
|
// Setup the callback action for the "weight" barcodes.
|
|
|
|
show: function () { |
|
|
|
var self = this; |
|
|
|
this._super(); |
|
|
@ -36,14 +45,9 @@ odoo.define('pos_barcode_tare.screens', function (require) { |
|
|
|
_.bind(self.barcode_weight_action, self)); |
|
|
|
}, |
|
|
|
}); |
|
|
|
}); |
|
|
|
|
|
|
|
odoo.define('tare-screen-button.button', function (require) { |
|
|
|
"use strict"; |
|
|
|
var core = require('web.core'); |
|
|
|
var screens = require('point_of_sale.screens'); |
|
|
|
var gui = require('point_of_sale.gui'); |
|
|
|
|
|
|
|
// This create a new button on top of action widget. This button links to
|
|
|
|
// the barcode label printing screen defined below.
|
|
|
|
var TareScreenButton = screens.ActionButtonWidget.extend({ |
|
|
|
template: 'TareScreenButton', |
|
|
|
|
|
|
@ -57,18 +61,12 @@ odoo.define('tare-screen-button.button', function (require) { |
|
|
|
'name': 'tareScreenButton', |
|
|
|
'widget': TareScreenButton, |
|
|
|
}); |
|
|
|
}); |
|
|
|
|
|
|
|
odoo.define('tare-screen.screen', function (require) { |
|
|
|
"use strict"; |
|
|
|
var chrome = require('point_of_sale.chrome'); |
|
|
|
var core = require('web.core'); |
|
|
|
var devices = require('point_of_sale.devices'); |
|
|
|
var gui = require('point_of_sale.gui'); |
|
|
|
var models = require('point_of_sale.models'); |
|
|
|
var screens = require('point_of_sale.screens'); |
|
|
|
var QWeb = core.qweb; |
|
|
|
|
|
|
|
// This is a new screen that reads weight from the electronic scale and
|
|
|
|
// create a barcode label encoding the weight. The screen shows a preview
|
|
|
|
// of the label. The user is expected to check if the preview matches what's
|
|
|
|
// measured on the scale. The barcode image is generated by the report
|
|
|
|
// module.
|
|
|
|
var TareScreenWidget = screens.ScreenWidget.extend({ |
|
|
|
template: 'TareScreenWidget', |
|
|
|
next_screen: 'products', |
|
|
@ -79,13 +77,14 @@ odoo.define('tare-screen.screen', function (require) { |
|
|
|
this._super(); |
|
|
|
var self = this; |
|
|
|
var queue = this.pos.proxy_queue; |
|
|
|
|
|
|
|
// The pooling of the scale starts here.
|
|
|
|
queue.schedule(function () { |
|
|
|
return self.pos.proxy.scale_read().then(function (weight) { |
|
|
|
self.set_weight(weight.weight); |
|
|
|
}); |
|
|
|
}, {duration:150, repeat: true}); |
|
|
|
|
|
|
|
// Shows a barcode whose weight might be zero, but this is preferred
|
|
|
|
// for UI/UX reasons.
|
|
|
|
this.render_receipt(); |
|
|
|
this.lock_screen(true); |
|
|
|
}, |
|
|
@ -115,15 +114,26 @@ odoo.define('tare-screen.screen', function (require) { |
|
|
|
return checksum % 10; |
|
|
|
}, |
|
|
|
barcode_data: function (weight) { |
|
|
|
// We use EAN13 barcode, it looks like 21 00000 12345 x. First there
|
|
|
|
// is the prefix, here 21, that is used to decide which type of
|
|
|
|
// barcode we're dealing with. A weight barcode has then two groups
|
|
|
|
// of five digits. The first group encodes the product id. Here the
|
|
|
|
// product id is 00000. The second group encodes the weight in
|
|
|
|
// grams. Here the weight is 12.345kg. The last digit of the barcode
|
|
|
|
// is a checksum, here symbolized by x.
|
|
|
|
var padding_size = 5; |
|
|
|
var default_weight_prefix_id = "21"; |
|
|
|
var void_product_id = '0'.repeat(padding_size); |
|
|
|
var weight_in_gram = weight * 10e2; |
|
|
|
// Weight has to be padded with zeros.
|
|
|
|
var weight_with_padding = '0'.repeat(padding_size) + weight_in_gram; |
|
|
|
var padded_weight = weight_with_padding.substr( |
|
|
|
weight_with_padding.length - padding_size); |
|
|
|
// Builds the barcode data (ie. all but the checksum).
|
|
|
|
var barcode_data = default_weight_prefix_id.concat(void_product_id, |
|
|
|
padded_weight); |
|
|
|
// Compute checksum and concat with barcode data to get the actual
|
|
|
|
// barcode.
|
|
|
|
var checksum = this.ean13_checksum(barcode_data); |
|
|
|
var barcode = barcode_data.concat(checksum); |
|
|
|
|
|
|
@ -153,10 +163,8 @@ odoo.define('tare-screen.screen', function (require) { |
|
|
|
this.pos.get_order()._printed = true; |
|
|
|
}, |
|
|
|
print: function () { |
|
|
|
var self = this; |
|
|
|
|
|
|
|
// See comment in print function of ReceiptScreenWidget
|
|
|
|
|
|
|
|
var self = this; |
|
|
|
this.lock_screen(true); |
|
|
|
|
|
|
|
setTimeout(function () { |
|
|
|