|
|
/* © 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); 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);
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.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.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, };
});
|