You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 

890 lines
31 KiB

/*
© 2020 Le Filament (<http://www.le-filament.com>)
License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html).
*/
odoo.define('vracoop_pos_free_balance_v2.container_balance', function (require) {
"use strict";
var chrome = require('point_of_sale.chrome');
var gui = require('point_of_sale.gui');
var models = require('point_of_sale.models');
var screens = require('point_of_sale.screens');
var popups = require('point_of_sale.popups');
var container = require('pos_container.container');
var models_and_db = require('pos_container.models_and_db');
var core = require('web.core');
var rpc = require('web.rpc');
var utils = require('web.utils');
var QWeb = core.qweb;
var _t = core._t;
var round_pr = utils.round_precision;
var BalanceScaleScreenWidget = screens.ScaleScreenWidget.extend({
template: 'BalanceScaleScreenWidget',
next_screen: 'confirmation',
previous_screen: 'products',
init: function(parent, options){
this._super(parent, options);
this.weight_container = 0;
this.weight_brut = 0;
this.weight = 0;
},
set_weight: function(weight){
var container = this.get_container();
this.weight = weight;
this.weight_container = container.weight;
this.weight_brut = container.weight + this.weight;
this.$('.weight').text(this.get_product_weight_string());
this.$('.computed-price').text(this.get_computed_price_string());
this.$('.weight-brut').text(this.get_product_weight_string_brut());
},
show: function(){
var self = this;
var queue = this.pos.proxy_queue;
this.set_weight(0);
this.renderElement();
var container = this.gui.get_current_screen_param('container');
queue.schedule(function () {
return self.pos.proxy.reset_weight().then(function () {
self.set_weight(0);
self.set_price(0);
});
}, {duration: 500});
// format price
var price = this.format_price(this.get_product_price());
if (container) {
// format tare
var tare = this.format_tare(container);
queue.schedule(function () {
return self.pos.proxy.scale_read_data_price_tare(price, tare).then(function (scale_answer) {
self.set_weight(scale_answer.weight);
self.set_price(scale_answer.price);
if ((scale_answer.error === '30' || scale_answer.error === '31') && scale_answer.weight !== 0) {
self.gui.show_screen(self.next_screen);
// add product *after* switching screen to scroll properly
self.order_product();
self.pos.proxy.reset_tare();
}
});
}, {duration: 500, repeat: true});
} else {
queue.schedule(function () {
return self.pos.proxy.scale_read_data_price(price).then(function (scale_answer) {
self.set_weight(scale_answer.weight);
self.set_price(scale_answer.price);
if ((scale_answer.error === '30' || scale_answer.error === '31') && scale_answer.weight !== 0) {
self.gui.show_screen(self.next_screen);
self.create_transaction();
self.order_product();
}
});
}, {duration: 500, repeat: true});
}
// this._super();
var self = this;
this.$('.next,.add-transaction').click(function(){
self.create_transaction();
});
$("#pos-header-text-peser").removeClass('oe_hidden');
},
get_container: function(){
return this.gui.get_current_screen_param('container');
},
//////////////////////////////
// Ajout fonction Toledo?
set_price: function (price) {
if (!price) {
this.$('.computed-price').text(this.get_computed_price_string());
} else {
this.price = price;
//this.$('.price').text(this.format_currency(price));
this.$('.computed-price').text(this.format_currency(price));
}
},
get_price: function () {
return this.price;
},
format_tare: function (container) {
var tare = (Math.abs(container.weight) * 1000).toString();
tare = ("0000" + tare).slice(-4);
return tare;
},
format_price: function (product_price) {
var price = (product_price * 1000).toString();
price = ("000000" + price).slice(-6);
return price;
},
// FIN
//////////////////////////////
get_current_container_weight: function(){
var container = this.get_container();
if (container){
return (this.weight_container || 0).toFixed(3) + ' kg';
}
else{
''
}
},
get_current_container_name: function(){
var container = this.get_container();
if (container){
return container.name;
}
else{
''
}
},
get_product_weight_string: function(){
var product = this.get_product();
var defaultstr = (this.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.weight || 0, unit.rounding);
var weightstr = weight.toFixed(Math.ceil(Math.log(1.0/unit.rounding) / Math.log(10) ));
weightstr += ' ' + unit.name;
return weightstr;
},
get_product_weight_string_brut: function(){
var product = this.get_product();
var defaultstr = (this.weight + this.weight_container || 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.weight + this.weight_container || 0, unit.rounding);
var weightstr = weight.toFixed(Math.ceil(Math.log(1.0/unit.rounding) / Math.log(10) ));
weightstr += ' ' + unit.name;
return weightstr;
},
hide: function(){
this._super();
$("#pos-header-text-peser").addClass('oe_hidden');
},
create_transaction: function(){
var self = this;
var fields = {};
var container = this.get_container();
var product = this.get_product();
var qrcode = '';
var ean13 = '';
var ean13_verif = '';
fields['qrcode'] = qrcode.concat('https://qr.mayam.fr/', container.barcode);
fields['container_ean13'] = container.barcode;
fields['product_id'] = this.get_product().id;
// var product_id = (this.get_product().id).toString();
var product_id = ("00000" + product.default_code.toString()).slice(-5);
var weight_str = (this.weight * 1000).toString();
weight_str = ("00000" + weight_str).slice(-5);
ean13 = ean13.concat(26,product_id,weight_str,4);
var weight_brut_str = (this.weight_brut * 1000).toString();
weight_brut_str = ("00000" + weight_brut_str).slice(-5);
ean13_verif = ean13_verif.concat(26,'00999',weight_brut_str,4);
var ean13_digit = this.pos.barcode_reader.barcode_parser.sanitize_ean(ean13);
var ean13_verif_digit = this.pos.barcode_reader.barcode_parser.sanitize_ean(ean13_verif);
fields['ean13'] = ean13_digit;
fields['ean13_verif'] = ean13_verif_digit;
fields['balance_id'] = this.pos.get_balance_id();
var today = new Date();
var date = today.getFullYear() + '-' + (today.getMonth()+1) + '-' + today.getDate();
var time = today.getHours() + ":" + today.getMinutes() + ":" + today.getSeconds();
var date_time = date + ' ' + time;
fields['write_date'] = date_time;
fields['weight_net'] = this.weight;
var pricelist = this._get_active_pricelist();
fields['price_product'] = (product ? product.get_price(pricelist, this.weight) : 0) || 0;
fields['price_net'] = fields['weight_net'] * fields['price_product'];
fields.name = product.display_name;
this.pos.push_transaction(fields).then(
this.pushed_transaction(fields["ean13"])
);
},
pushed_transaction: function(barcode){
var self = this;
// Remise à zero du poids à l'écran
// this.set_weight(0);
// this.renderElement();
var product = this.get_product();
this.gui.show_screen('confirmation',{product: product});
},
});
gui.define_screen({
name:'balancescale',
widget: BalanceScaleScreenWidget,
});
/*--------------------------------------*\
| THE SCALE SCREEN FREE |
| BALANCE CONTAINER |
\*======================================*/
// The free balance container scale screen
// displays the weight of
// a new container on the electronic scale.
var BalanceContainerScaleScreenWidget = screens.ScaleScreenWidget.extend({
template: 'BalanceContainerScaleScreenWidget',
next_screen: 'presentation',
previous_screen: 'presentation',
init: function(parent, options){
this._super(parent, options);
},
show: function(){
var self = this;
var queue = this.pos.proxy_queue;
var priceStr = '001000'; // bizerba doesn't accept '000000' as unit price
this.renderElement();
queue.schedule(function () {
return self.pos.proxy.reset_weight().then(function () {
self.set_weight(0);
});
}, {duration: 500});
queue.schedule(function () {
return self.pos.proxy.scale_read_data_price(priceStr).then(function (scale_answer) {
self.set_weight(scale_answer.weight);
if ((scale_answer.error === '30' || scale_answer.error === '31') && scale_answer.weight !== 0) {
self.gui.show_screen(self.next_screen);
if (this.pos.config.is_comptoir) {
self.create_container();
}
}
});
}, {duration: 500, repeat: true});
this._super();
var self = this;
this.$('.next,.add-container').click(function(){
self.create_container();
});
if(this.pos.config.iface_vkeyboard && this.chrome.widget.keyboard){
this.chrome.widget.keyboard.connect($(this.el.querySelector('.container-name input')));
}
$("#pos-header-text-peser").removeClass('oe_hidden');
$("#pos-topheader-scale-cont").removeClass('oe_hidden');
},
hide: function(){
this._super();
$("#pos-header-text-peser").addClass('oe_hidden');
$("#pos-topheader-scale-cont").addClass('oe_hidden');
},
get_product: function(){
return this.pos.get_container_product();
},
create_container: function(){
if (this.weight != 0) {
var self = this;
var fields = {};
fields['weight'] = this.weight;
fields.barcode = this.gui.get_current_screen_param('barcode') || false;
fields.name = fields.name || _t('Container');
this.pos.push_container(fields).then(
this.pushed_container(fields["barcode"],fields)
);
}
},
pushed_container: function(barcode,container){
var self = this;
var selected_order = this.pos.get_order();
selected_order.add_container(container);
if (this.pos.config.is_comptoir) {
self.gui.show_screen(self.next_screen);
}
else{
self.gui.show_popup('confirm-pesee',{
'title': _t('Merci'),
'body': _t('Contenant ajouté, vous pouvez vous servir'),
confirm: function(){
self.gui.show_screen(self.next_screen);
},
});
}
},
close: function(){
this._super();
if (this.pos.config.iface_vkeyboard && this.chrome.widget.keyboard) {
this.chrome.widget.keyboard.hide();
}
},
});
gui.define_screen({
name:'balancecontainerscale',
widget: BalanceContainerScaleScreenWidget,
});
screens.ScreenWidget.include({
show: function(){
var self = this;
var queue = this.pos.proxy_queue;
var container = this.gui.get_current_screen_param('container');
// format price
var scale_screen = this.gui.screen_instances['balancescale'];
var price = scale_screen.format_price(scale_screen.get_product_price());
if (container) {
// format tare
var tare = this.format_tare(container);
queue.schedule(function () {
return self.pos.proxy.scale_read_data_price_tare(price, tare).then(function (scale_answer) {
self.set_weight(scale_answer.weight);
if ((scale_answer.error === '30' || scale_answer.error === '31') && scale_answer.weight !== 0) {
self.set_weight(0);
self.pos.proxy.reset_tare();
}
});
}, {duration: 500, repeat: true});
} else {
queue.schedule(function () {
return self.pos.proxy.scale_read_data_price(price).then(function (scale_answer) {
self.set_weight(scale_answer.weight);
// self.set_price(scale_answer.price);
if ((scale_answer.error === '30' || scale_answer.error === '31') && scale_answer.weight !== 0) {
self.set_weight(0);
}
});
}, {duration: 500, repeat: true});
}
this._super();
},
format_tare: function (container) {
var tare = (Math.abs(container.weight) * 1000).toString();
tare = ("0000" + tare).slice(-4);
return tare;
},
set_weight: function(weight){
var scale_screen = this.gui.screen_instances['balancescale'];
scale_screen.weight = weight;
scale_screen.$('.weight').text(scale_screen.get_product_weight_string());
scale_screen.$('.computed-price').text(scale_screen.format_currency(scale_screen.get_product_price() * 0));
scale_screen.$('.weight-brut').text('0.000 kg');
var container_text = '0.000 kg'
scale_screen.$('.tare-container').text(container_text);
},
set_price: function (price) {
var scale_screen = this.gui.screen_instances['balancescale'];
scale_screen.price = price;
scale_screen.$('.computed-price').text(scale_screen.format_currency(0));
},
barcode_container_action: function(code){
var self = this;
if (self.pos.scan_container(code)) {
var order = this.pos.get_order();
var selected_orderline = order.get_selected_orderline();
var container = selected_orderline.get_container();
// Vérfification: est-ce qu'un container vient d'être utilisé dans l'heure
if (self.pos.scan_container_check(code)){
var transaction = self.pos.scan_container_check(code);
this.gui.show_popup('doublon-barcode',{
title: _t('Contenu déjà enregistré récemment:'),
transaction: transaction,
confirm: function(){
var transaction = self.pos.scan_container_check(code)
self.delete_selected_transaction(transaction, code);
self.gui.show_screen('products', {container: container});
},
});
} else {
self.gui.show_screen('products', {container: container});
}
} else {
self.gui.show_screen('balancecontainerscale', {barcode: code.base_code});
}
},
delete_selected_transaction: function(transaction, barcode){
var self = this;
if (!transaction.id){
self.deleted_transaction(transaction.container_ean13)
}
else {
rpc.query({
model: 'pos.transaction',
method: 'unlink',
args: [transaction.id],
}).then(function(){
self.deleted_transaction(transaction.container_ean13);
},function(err,ev){
ev.preventDefault();
var error_body = _t('Your Internet connection is probably down.');
if (err.data) {
var except = err.data;
error_body = except.arguments && except.arguments[0] || except.message || error_body;
}
self.gui.show_popup('error',{
'title': _t('Error: Could not Save Changes'),
'body': error_body,
});
}
);
}
},
deleted_transaction: function(barcode){
var self = this;
this.pos.db.remove_transactions([barcode]);
},
close: function(){
this._super();
this.pos.proxy_queue.clear();
},
});
var ConfirmPopupWidgetPesee = popups.extend({
template: 'ConfirmPopupWidgetPesee',
});
gui.define_popup({name:'confirm-pesee', widget: ConfirmPopupWidgetPesee});
// The initial screen that allows you to scan container
var PresentationScreenWidget = screens.ScreenWidget.extend({
template: 'PresentationScreenWidget',
next_screen: 'products',
// Ignore products, discounts, and client barcodes
// barcode_product_action: function(code){},
barcode_discount_action: function(code){},
barcode_client_action: function(code){},
init: function(parent, options) {
this._super(parent, options);
this.transactions = [];
this.editing = false;
},
// this method shows the screen and sets up all the widget related to this screen. Extend this method
// if you want to alter the behavior of the screen.
show: function(){
this._super();
var self = this;
var scale_screen = this.gui.screen_instances['balancescale'];
scale_screen.$el.removeClass('oe_hidden');
var screen = this.gui.screen_instances['products'];
screen.$el.removeClass('oe_hidden');
$("#pos-header-text-selec").removeClass('oe_hidden');
$("#pos-header-text-confirm").addClass('oe_hidden');
},
// this methods hides the screen. It's not a good place to put your cleanup stuff as it is called on the
// POS initialization.
hide: function(){
this._super();
var screen = this.gui.screen_instances['products'];
screen.$el.addClass('oe_hidden');
$("#pos-header-text-selec").addClass('oe_hidden');
},
});
gui.define_screen({
'name': 'presentation',
'widget': PresentationScreenWidget,
'condition': function(){
return this.pos.config.balance_id;
},
});
// Screen confirmation de la pesée
var ConfirmationScreen = screens.ScreenWidget.extend({
template: 'ConfirmationScreen',
next_screen: 'presentation',
// previous_screen: 'presentation',
show: function(){
this._super();
var self = this;
this.renderElement();
var scale_screen = this.gui.screen_instances['balancescale'];
scale_screen.$el.removeClass('oe_hidden');
this.$('.next,.back-presentation').click(function(){
// self.set_weight(0);
self.set_price(0);
self.pos.proxy.reset_tare();
self.gui.show_screen('presentation');
});
$("#pos-header-text-confirm").removeClass('oe_hidden');
var container = this.gui.get_current_screen_param('container');
if (container) {
this.pos.proxy.reset_tare();
}
setTimeout(function(){
self.set_price(0);
self.pos.proxy.reset_tare();
self.gui.show_screen('presentation');
}, 5000);
},
set_weight: function(weight){
var scale_screen = this.gui.screen_instances['balancescale'];
var container = this.gui.get_current_screen_param('container');
scale_screen.weight_container = container.weight;
scale_screen.weight = weight;
scale_screen.weight_brut = container.weight + scale_screen.weight;
scale_screen.$('.weight').text(scale_screen.get_product_weight_string());
scale_screen.$('.computed-price').text(scale_screen.get_computed_price_string());
scale_screen.$('.weight-brut').text(scale_screen.get_product_weight_string_brut());
if (container){
var container_text = (container.weight || 0).toFixed(3) + ' kg';
}
else{
var container_text = ''
}
scale_screen.$('.tare-container').text(container_text);
},
_get_active_pricelist: function(){
var current_order = this.pos.get_order();
var current_pricelist = this.pos.default_pricelist;
if (current_order) {
current_pricelist = current_order.pricelist;
}
return current_pricelist;
},
get_product_name: function(){
var product = this.gui.get_current_screen_param('product');
return (product ? product.display_name : undefined) || 'Unnamed Product';
},
get_product_price: function(){
var product = this.gui.get_current_screen_param('product');
var pricelist = this._get_active_pricelist();
return (product ? product.get_price(pricelist, 1) : 0) || 0;
},
get_product_uom: function(){
var product = this.gui.get_current_screen_param('product');
if(product){
return this.pos.units_by_id[product.uom_id[0]].name;
}else{
return '';
}
},
});
gui.define_screen({
'name': 'confirmation',
'widget': ConfirmationScreen,
});
// Add the Presentation to the GUI, and set it as the default screen
chrome.Chrome.include({
build_widgets: function(){
this._super();
if (this.pos.config.balance_id) {
this.gui.set_startup_screen('presentation');
}
},
});
gui.Gui.include({
show_saved_screen: function(order,options) {
this._super();
options = options || {};
this.close_popup();
this.show_screen(this.startup_screen);
},
});
// We need to modify the OrderSelector to hide itself when we're on
// the floor plan ?
chrome.OrderSelectorWidget.include({
hide: function(){
this.$el.addClass('oe_invisible');
},
show: function(){
this.$el.removeClass('oe_invisible');
},
renderElement: function(){
var self = this;
this._super();
if (this.pos.config.balance_id) {
if (this.pos.get_order()) {
this.$el.removeClass('oe_invisible');
} else {
this.$el.addClass('oe_invisible');
}
}
},
});
screens.ProductScreenWidget.include({
previous_screen: 'presentation',
show: function(){
this._super();
var self = this;
var scale_screen = this.gui.screen_instances['balancescale'];
scale_screen.$el.removeClass('oe_hidden');
this.product_categories_widget.reset_category();
this.numpad.state.reset();
this.$('.back').click(function(){
self.gui.show_screen('presentation');
});
$("#pos-header-text-prod").removeClass('oe_hidden');
},
hide: function(){
this._super();
$("#pos-header-text-prod").addClass('oe_hidden');
var screen = this.gui.screen_instances['products'];
},
// Ajout fonction scale
set_weight: function(weight){
var scale_screen = this.gui.screen_instances['balancescale'];
var container = this.gui.get_current_screen_param('container');
scale_screen.weight_container = container.weight;
scale_screen.weight = weight;
scale_screen.weight_brut = container.weight + scale_screen.weight;
scale_screen.$('.weight').text(scale_screen.get_product_weight_string());
scale_screen.$('.computed-price').text(scale_screen.format_currency(scale_screen.get_product_price() * 0));
scale_screen.$('.weight-brut').text(scale_screen.get_product_weight_string_brut());
if (container){
var container_text = (container.weight || 0).toFixed(3) + ' kg';
}
else{
var container_text = ''
}
scale_screen.$('.tare-container').text(container_text);
},
click_product: function(product) {
var scale_screen = this.gui.screen_instances['balancescale'];
if (scale_screen.weight != 0) {
this.create_transaction(product);
}
},
create_transaction: function(product){
var self = this;
var fields = {};
var container = this.gui.get_current_screen_param('container');
var scale_screen = this.gui.screen_instances['balancescale'];
var qrcode = '';
var ean13 = '';
var ean13_verif = '';
fields['qrcode'] = qrcode.concat('https://qr.mayam.fr/', container.barcode);
fields['container_ean13'] = container.barcode;
fields['product_id'] = product.id;
// var product_id = (this.get_product().id).toString();
var product_id = ("00000" + product.default_code.toString()).slice(-5);
var weight_str = (scale_screen.weight * 1000).toString();
weight_str = ("00000" + weight_str).slice(-5);
ean13 = ean13.concat(26,product_id,weight_str,4);
var weight_brut_str = (scale_screen.weight_brut * 1000).toString();
weight_brut_str = ("00000" + weight_brut_str).slice(-5);
ean13_verif = ean13_verif.concat(26,'00999',weight_brut_str,4);
var ean13_digit = this.pos.barcode_reader.barcode_parser.sanitize_ean(ean13);
var ean13_verif_digit = this.pos.barcode_reader.barcode_parser.sanitize_ean(ean13_verif);
fields['ean13'] = ean13_digit;
fields['ean13_verif'] = ean13_verif_digit;
fields['balance_id'] = this.pos.get_balance_id();
var today = new Date();
var date = today.getFullYear() + '-' + (today.getMonth()+1) + '-' + today.getDate();
var time = today.getHours() + ":" + today.getMinutes() + ":" + today.getSeconds();
var date_time = date + ' ' + time;
fields['write_date'] = date_time;
fields['weight_net'] = scale_screen.weight;
fields['weight_tare'] = container.weight;
var pricelist = scale_screen._get_active_pricelist();
fields['price_product'] = (product ? product.get_price(pricelist, scale_screen.weight) : 0) || 0;
fields['price_net'] = fields['weight_net'] * fields['price_product'];
fields.name = product.display_name;
this.pos.push_transaction(fields).then(
this.pushed_transaction(fields["ean13"], product, container)
);
},
pushed_transaction: function(barcode, product, container){
var self = this;
this.gui.show_screen('confirmation',{product: product, container: container});
},
close: function(){
this._super();
this.pos.proxy_queue.clear();
},
});
var CheckBarcodePopupDoublon = popups.extend({
template:'CheckBarcodePopupDoublon',
show: function(options){
var self = this;
options = options || {};
this.name = options.transaction.name ;
this.weight_net = options.transaction.weight_net.toFixed(3) ;
this.price_product = options.transaction.price_product.toFixed(2);
this.price_net = options.transaction.price_net.toFixed(2);
this._super(options);
this.renderElement();
},
});
gui.define_popup({name:'doublon-barcode', widget: CheckBarcodePopupDoublon});
return {
BalanceContainerScaleScreenWidget: BalanceContainerScaleScreenWidget,
PresentationScreenWidget: PresentationScreenWidget,
BalanceScaleScreenWidget: BalanceScaleScreenWidget,
CheckBarcodePopupDoublon: CheckBarcodePopupDoublon,
ConfirmPopupWidgetPesee: ConfirmPopupWidgetPesee,
ConfirmationScreen: ConfirmationScreen,
};
});