odoo/addons/pos_restaurant/static/src/js/splitbill.js

194 lines
7.0 KiB
JavaScript

function openerp_restaurant_splitbill(instance, module){
var QWeb = instance.web.qweb;
var _t = instance.web._t;
module.SplitbillScreenWidget = module.ScreenWidget.extend({
template: 'SplitbillScreenWidget',
show_leftpane: false,
previous_screen: 'products',
renderElement: function(){
var self = this;
this._super();
var order = this.pos.get('selectedOrder');
if(!order){
return;
}
var orderlines = order.get('orderLines').models;
for(var i = 0; i < orderlines.length; i++){
var line = orderlines[i];
linewidget = $(QWeb.render('SplitOrderline',{
widget:this,
line:line,
selected: false,
quantity: 0,
id: line.id,
}));
linewidget.data('id',line.id);
this.$('.orderlines').append(linewidget);
}
this.$('.back').click(function(){
self.pos_widget.screen_selector.set_current_screen(self.previous_screen);
});
},
lineselect: function($el,order,neworder,splitlines,line_id){
var split = splitlines[line_id] || {'quantity': 0, line: null};
var line = order.getOrderline(line_id);
if( !line.get_unit().groupable ){
if( split.quantity !== line.get_quantity()){
split.quantity = line.get_quantity();
}else{
split.quantity = 0;
}
}else{
if( split.quantity < line.get_quantity()){
split.quantity += line.get_unit().is_unit ? 1 : line.get_unit().rounding;
if(split.quantity > line.get_quantity()){
split.quantity = line.get_quantity();
}
}else{
split.quantity = 0;
}
}
if( split.quantity ){
if ( !split.line ){
split.line = line.clone();
neworder.addOrderline(split.line);
}
split.line.set_quantity(split.quantity);
}else if( split.line ) {
neworder.removeOrderline(split.line);
split.line = null;
}
splitlines[line_id] = split;
$el.replaceWith($(QWeb.render('SplitOrderline',{
widget: this,
line: line,
selected: split.quantity !== 0,
quantity: split.quantity,
id: line_id,
})));
this.$('.order-info .subtotal').text(this.format_currency(neworder.getSubtotal()));
},
pay: function($el,order,neworder,splitlines,cashregister_id){
var orderlines = order.get('orderLines').models;
var empty = true;
var full = true;
for(var i = 0; i < orderlines.length; i++){
var id = orderlines[i].id;
var split = splitlines[id];
if(!split){
full = false;
}else{
if(split.quantity){
empty = false;
if(split.quantity !== orderlines[i].get_quantity()){
full = false;
}
}
}
}
if(empty){
return;
}
for(var i = 0; i < this.pos.cashregisters.length; i++){
if(this.pos.cashregisters[i].id === cashregister_id){
var cashregister = this.pos.cashregisters[i];
break;
}
}
if(full){
order.addPaymentline(cashregister);
this.pos_widget.screen_selector.set_current_screen('payment');
}else{
for(var id in splitlines){
var split = splitlines[id];
var line = order.getOrderline(parseInt(id));
line.set_quantity(line.get_quantity() - split.quantity);
if(Math.abs(line.get_quantity()) < 0.00001){
order.removeOrderline(line);
}
delete splitlines[id];
}
neworder.addPaymentline(cashregister);
neworder.set_screen_data('screen','payment');
// for the kitchen printer we assume that everything
// has already been sent to the kitchen before splitting
// the bill. So we save all changes both for the old
// order and for the new one. This is not entirely correct
// but avoids flooding the kitchen with unnecessary orders.
// Not sure what to do in this case.
if ( neworder.saveChanges ) {
order.saveChanges();
neworder.saveChanges();
}
this.pos.get('orders').add(neworder);
this.pos.set('selectedOrder',neworder);
}
},
show: function(){
var self = this;
this._super();
this.renderElement();
var order = this.pos.get('selectedOrder');
var neworder = new module.Order({
pos: this.pos,
temporary: true,
});
neworder.set('client',order.get('client'));
var splitlines = {};
this.$('.orderlines').on('click','.orderline',function(){
var id = parseInt($(this).data('id'));
var $el = $(this);
self.lineselect($el,order,neworder,splitlines,id);
});
this.$('.paymentmethod').click(function(){
var id = parseInt($(this).data('id'));
var $el = $(this);
self.pay($el,order,neworder,splitlines,id);
});
},
});
module.PosWidget.include({
build_widgets: function(){
var self = this;
this._super();
if(this.pos.config.iface_splitbill){
this.splitbill_screen = new module.SplitbillScreenWidget(this,{});
this.splitbill_screen.appendTo(this.$('.screens'));
this.screen_selector.add_screen('splitbill',this.splitbill_screen);
var splitbill = $(QWeb.render('SplitbillButton'));
splitbill.click(function(){
if(self.pos.get('selectedOrder').get('orderLines').models.length > 0){
self.pos_widget.screen_selector.set_current_screen('splitbill');
}
});
splitbill.appendTo(this.$('.control-buttons'));
this.$('.control-buttons').removeClass('oe_hidden');
}
},
});
}