194 lines
7.0 KiB
JavaScript
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');
|
|
}
|
|
},
|
|
});
|
|
}
|