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.
186 lines
6.9 KiB
186 lines
6.9 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_balance_ticketing.screens', 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 screen_vrac = require('vracoop_pos_free_balance_v2.container_balance');
|
|
|
|
var core = require('web.core');
|
|
var rpc = require('web.rpc');
|
|
var utils = require('web.utils');
|
|
var QWeb = core.qweb;
|
|
var _t = core._t;
|
|
|
|
// Screen confirmation de la pesée
|
|
screen_vrac.ConfirmationScreen.include({
|
|
|
|
show: function(){
|
|
this._super();
|
|
var self = this;
|
|
|
|
this.render_change();
|
|
this.render_receipt();
|
|
this.handle_auto_print();
|
|
},
|
|
|
|
handle_auto_print: function() {
|
|
if (this.should_auto_print()) {
|
|
this.print();
|
|
this.click_next();
|
|
// }
|
|
} else {
|
|
this.lock_screen(false);
|
|
}
|
|
},
|
|
|
|
get_barcode_data: function () {
|
|
var transaction = this.gui.get_current_screen_param('transaction');
|
|
var num_ean13 = this.pos.config.prefix + transaction.ean13.slice(2)
|
|
return num_ean13;
|
|
},
|
|
|
|
should_auto_print: function() {
|
|
return this.pos.config.is_ticket_print_auto && !this.pos.get_order()._printed;
|
|
},
|
|
|
|
lock_screen: function(locked) {
|
|
this._locked = locked;
|
|
if (locked) {
|
|
this.$('.next').removeClass('highlight');
|
|
} else {
|
|
this.$('.next').addClass('highlight');
|
|
}
|
|
},
|
|
get_receipt_render_env: function() {
|
|
var order = this.pos.get_order();
|
|
var transaction = this.gui.get_current_screen_param('transaction');
|
|
var num_ean13 = this.pos.config.prefix + transaction.ean13.slice(2)
|
|
var width_pix = (Math.round(this.pos.config.page_width * 3.78)).toString() + "px";
|
|
|
|
return {
|
|
widget: this,
|
|
pos: this.pos,
|
|
order: order,
|
|
transaction: transaction,
|
|
num_ean13: num_ean13,
|
|
width: width_pix,
|
|
};
|
|
},
|
|
print_web: function() {
|
|
if ($.browser.safari) {
|
|
document.execCommand('print', false, null);
|
|
} else {
|
|
try {
|
|
window.print();
|
|
} catch(err) {
|
|
if (navigator.userAgent.toLowerCase().indexOf("android") > -1) {
|
|
this.gui.show_popup('error',{
|
|
'title':_t('Printing is not supported on some android browsers'),
|
|
'body': _t('Printing is not supported on some android browsers due to no default printing protocol is available. It is possible to print your tickets by making use of an IoT Box.'),
|
|
});
|
|
} else {
|
|
throw err;
|
|
}
|
|
}
|
|
}
|
|
this.pos.get_order()._printed = true;
|
|
},
|
|
print_xml: function() {
|
|
var receipt = QWeb.render('XmlReceiptBls', this.get_receipt_render_env());
|
|
|
|
this.pos.proxy.print_receipt(receipt);
|
|
this.pos.get_order()._printed = true;
|
|
},
|
|
print: function() {
|
|
var self = this;
|
|
|
|
if (!this.pos.config.is_ticket_print_via_proxy) { // browser (html) printing
|
|
|
|
// The problem is that in chrome the print() is asynchronous and doesn't
|
|
// execute until all rpc are finished. So it conflicts with the rpc used
|
|
// to send the orders to the backend, and the user is able to go to the next
|
|
// screen before the printing dialog is opened. The problem is that what's
|
|
// printed is whatever is in the page when the dialog is opened and not when it's called,
|
|
// and so you end up printing the product list instead of the receipt...
|
|
//
|
|
// Fixing this would need a re-architecturing
|
|
// of the code to postpone sending of orders after printing.
|
|
//
|
|
// But since the print dialog also blocks the other asynchronous calls, the
|
|
// button enabling in the setTimeout() is blocked until the printing dialog is
|
|
// closed. But the timeout has to be big enough or else it doesn't work
|
|
// 1 seconds is the same as the default timeout for sending orders and so the dialog
|
|
// should have appeared before the timeout... so yeah that's not ultra reliable.
|
|
|
|
this.lock_screen(true);
|
|
|
|
setTimeout(function(){
|
|
self.lock_screen(false);
|
|
}, 1000);
|
|
|
|
this.print_web();
|
|
} else { // proxy (xml) printing
|
|
this.print_xml();
|
|
this.lock_screen(false);
|
|
}
|
|
},
|
|
click_next: function() {
|
|
this.set_price(0);
|
|
this.pos.proxy.reset_tare();
|
|
this.gui.show_screen('presentation');
|
|
},
|
|
click_back: function() {
|
|
// Placeholder method for ReceiptScreen extensions that
|
|
// can go back ...
|
|
},
|
|
renderElement: function() {
|
|
var self = this;
|
|
this._super();
|
|
this.$('.next').click(function(){
|
|
if (!self._locked) {
|
|
self.click_next();
|
|
}
|
|
});
|
|
this.$('.back').click(function(){
|
|
if (!self._locked) {
|
|
self.click_back();
|
|
}
|
|
});
|
|
this.$('.button.print').click(function(){
|
|
if (!self._locked) {
|
|
self.print();
|
|
}
|
|
});
|
|
|
|
},
|
|
render_change: function() {
|
|
var self = this;
|
|
this.$('.change-value').html(this.format_currency(this.pos.get_order().get_change()));
|
|
var order = this.pos.get_order();
|
|
var order_screen_params = order.get_screen_data('params');
|
|
var button_print_invoice = this.$('h2.print_invoice');
|
|
if (order_screen_params && order_screen_params.button_print_invoice) {
|
|
button_print_invoice.show();
|
|
} else {
|
|
button_print_invoice.hide();
|
|
}
|
|
},
|
|
render_receipt: function() {
|
|
this.$('.pos-ticket-container').html(QWeb.render('PosTicketBls', this.get_receipt_render_env()));
|
|
},
|
|
});
|
|
|
|
});
|