/* © 2020 Le Filament () 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; 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 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 (self.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, }); 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(){ var self = this; var queue = this.pos.proxy_queue; 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 scale_screen = this.gui.screen_instances['balancescale']; var price = scale_screen.format_price(scale_screen.get_product_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.set_weight(0); } }); }, {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(); 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'); }); // Ajout pour le pb de tare var container = this.gui.get_current_screen_param('container'); if (container) { this.pos.proxy.reset_tare(); } // Ajout pour le pb de tare $("#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, }; });