[BACKPORT] point_of_sale: backporting the payment screen
Conflicts: addons/point_of_sale/static/src/css/pos.css addons/point_of_sale/static/src/js/screens.js addons/point_of_sale/static/src/js/widget_base.js Conflicts: addons/point_of_sale/static/src/css/pos.css addons/point_of_sale/static/src/js/models.js addons/point_of_sale/static/src/js/screens.js addons/point_of_sale/static/src/js/widgets.js addons/point_of_sale/static/src/xml/pos.xml
This commit is contained in:
committed by
Frédéric van der Essen
parent
6d0a4a9211
commit
44307816fb
@@ -37,6 +37,7 @@ div.modal.in {
|
||||
top: 50%;
|
||||
left: 50%;
|
||||
}
|
||||
|
||||
/* --- Generic Restyling and Resets --- */
|
||||
|
||||
html {
|
||||
@@ -545,7 +546,7 @@ td {
|
||||
|
||||
/* ********* The actionpad (payment, set customer) ********* */
|
||||
|
||||
.pos .actionpad{
|
||||
.pos .actionpad {
|
||||
padding: 8px 3px 8px 19px;
|
||||
display: inline-block;
|
||||
text-align: center;
|
||||
@@ -981,7 +982,7 @@ td {
|
||||
overflow-y: auto;
|
||||
}
|
||||
.screen .right-content.pc60{
|
||||
left:34%
|
||||
left:34%;
|
||||
}
|
||||
.screen .centered-content{
|
||||
position: absolute;
|
||||
@@ -1044,7 +1045,6 @@ td {
|
||||
width: 66px;
|
||||
height: 66px;
|
||||
}
|
||||
|
||||
.pos .paymentlines-container {
|
||||
padding: 16px;
|
||||
padding-top: 0;
|
||||
@@ -1082,7 +1082,6 @@ td {
|
||||
position: relative;
|
||||
border-radius: 3px;
|
||||
}
|
||||
|
||||
.pos .paymentline > *{
|
||||
padding: 8px 12px;
|
||||
}
|
||||
@@ -1108,29 +1107,29 @@ td {
|
||||
padding: 16px;
|
||||
float: right;
|
||||
}
|
||||
|
||||
.payment-screen .payment-buttons .button {
|
||||
background: rgb(221, 221, 221);
|
||||
.payment-screen .payment-buttons .button {
|
||||
background: rgb(220,220,220);
|
||||
line-height: 48px;
|
||||
margin-bottom: 4px;
|
||||
border-radius: 3px;
|
||||
font-size: 16px;
|
||||
padding: 0px 8px;
|
||||
border: solid 1px rgb(202, 202, 202);
|
||||
border: solid 1px rgb(200,200,200);
|
||||
cursor: pointer;
|
||||
text-align: center;
|
||||
}
|
||||
.payment-screen .paymentlines-empty .total {
|
||||
.payment-screen .paymentlines-empty .total {
|
||||
text-align: center;
|
||||
padding: 24px 0px 18px;
|
||||
font-size: 64px;
|
||||
color: #43996E;
|
||||
text-shadow: 0px 2px white, 0px 2px 2px rgba(0, 0, 0, 0.27);
|
||||
}
|
||||
.payment-screen .paymentlines-empty .message {
|
||||
.payment-screen .paymentlines-empty .message {
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
|
||||
/* c) The receipt screen */
|
||||
|
||||
.pos .receipt-screen .centered-content .button {
|
||||
@@ -1145,6 +1144,7 @@ td {
|
||||
border: solid 1px rgb(209, 209, 209);
|
||||
cursor: pointer;
|
||||
}
|
||||
|
||||
.pos .pos-receipt-container {
|
||||
font-size: 0.75em;
|
||||
text-align: center;
|
||||
@@ -1195,7 +1195,7 @@ td {
|
||||
.oe_leftbar,
|
||||
.pos .pos-topheader,
|
||||
.pos .pos-leftpane,
|
||||
.pos .keyboard_frame,
|
||||
.pos .keyboard_frame,
|
||||
.pos .receipt-screen header,
|
||||
.pos .receipt-screen .top-content,
|
||||
.pos .receipt-screen .centered-content .button {
|
||||
@@ -1225,7 +1225,6 @@ td {
|
||||
.pos .receipt-screen .centered-content{
|
||||
position: static;
|
||||
border: none;
|
||||
margin: none;
|
||||
}
|
||||
.pos .pos-receipt-container {
|
||||
text-align: left;
|
||||
@@ -1631,11 +1630,11 @@ td {
|
||||
vertical-align: top;
|
||||
}
|
||||
.splitbill-screen .paymentmethods,
|
||||
.payment-screen .paymentmethods {
|
||||
.payment-screen .paymentmethods {
|
||||
margin: 16px;
|
||||
}
|
||||
.splitbill-screen .paymentmethod,
|
||||
.payment-screen .paymentmethod {
|
||||
.payment-screen .paymentmethod {
|
||||
background: rgb(221, 221, 221);
|
||||
line-height: 40px;
|
||||
margin-bottom: 4px;
|
||||
@@ -1646,7 +1645,7 @@ td {
|
||||
text-align: center;
|
||||
}
|
||||
.splitbill-screen .paymentmethod.active,
|
||||
.payment-screen .paymentmethod.active {
|
||||
.payment-screen .paymentmethod.active {
|
||||
background: #6EC89B;
|
||||
color: white;
|
||||
border-color: #6EC89B;
|
||||
|
||||
@@ -619,8 +619,8 @@ function openerp_pos_models(instance, module){ //module is instance.point_of_sal
|
||||
return server_ids;
|
||||
}).fail(function (error, event){
|
||||
if(error.code === 200 ){ // Business Logic Error, not a connection problem
|
||||
//if warning do not need to dispaly traceback!!
|
||||
if(error.data.exception_type == 'warning'){
|
||||
//if warning do not need to display traceback!!
|
||||
if (error.data.exception_type == 'warning') {
|
||||
delete error.data.debug;
|
||||
}
|
||||
self.pos_widget.screen_selector.show_popup('error-traceback',{
|
||||
@@ -974,7 +974,6 @@ function openerp_pos_models(instance, module){ //module is instance.point_of_sal
|
||||
this.selected_orderline = undefined;
|
||||
this.selected_paymentline = undefined;
|
||||
this.screen_data = {}; // see ScreenSelector
|
||||
this.receipt_type = 'receipt'; // 'receipt' || 'invoice'
|
||||
this.temporary = attributes.temporary || false;
|
||||
this.to_invoice = false;
|
||||
return this;
|
||||
@@ -982,6 +981,7 @@ function openerp_pos_models(instance, module){ //module is instance.point_of_sal
|
||||
is_empty: function(){
|
||||
return (this.get('orderLines').models.length === 0);
|
||||
},
|
||||
|
||||
// Generates a public identification number for the order.
|
||||
// The generated number must be unique and sequential. They are made 12 digit long
|
||||
// to fit into EAN-13 barcodes, should it be needed
|
||||
@@ -1163,12 +1163,24 @@ function openerp_pos_models(instance, module){ //module is instance.point_of_sal
|
||||
finalize: function(){
|
||||
this.destroy();
|
||||
},
|
||||
// sets the type of receipt 'receipt'(default) or 'invoice'
|
||||
set_receipt_type: function(type){
|
||||
this.receipt_type = type;
|
||||
set_to_invoice: function(to_invoice) {
|
||||
this.to_invoice = to_invoice;
|
||||
},
|
||||
get_receipt_type: function(){
|
||||
return this.receipt_type;
|
||||
is_to_invoice: function(){
|
||||
return this.to_invoice;
|
||||
},
|
||||
// remove all the paymentlines with zero money in it
|
||||
clean_empty_paymentlines: function() {
|
||||
var lines = this.get('paymentLines').models;
|
||||
var empty = [];
|
||||
for ( var i = 0; i < lines.length; i++) {
|
||||
if (!lines[i].get_amount()) {
|
||||
empty.push(lines[i]);
|
||||
}
|
||||
}
|
||||
for ( var i = 0; i < empty.length; i++) {
|
||||
this.removePaymentline(empty[i]);
|
||||
}
|
||||
},
|
||||
// the client related to the current order.
|
||||
set_client: function(client){
|
||||
|
||||
@@ -975,9 +975,9 @@ function openerp_pos_screens(instance, module){ //module is instance.point_of_sa
|
||||
// 2 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);
|
||||
this.lock_screen(true);
|
||||
setTimeout(function(){
|
||||
self.lock_screen(false);
|
||||
self.lock_screen(false);
|
||||
}, 2000);
|
||||
},
|
||||
lock_screen: function(locked) {
|
||||
@@ -1156,6 +1156,10 @@ function openerp_pos_screens(instance, module){ //module is instance.point_of_sa
|
||||
render_paymentlines: function() {
|
||||
var self = this;
|
||||
var order = this.pos.get_order();
|
||||
if (!order) {
|
||||
return;
|
||||
}
|
||||
|
||||
var lines = order.get('paymentLines').models;
|
||||
|
||||
this.$('.paymentlines-container').empty();
|
||||
@@ -1245,6 +1249,9 @@ function openerp_pos_screens(instance, module){ //module is instance.point_of_sa
|
||||
watch_order_changes: function() {
|
||||
var self = this;
|
||||
var order = this.pos.get_order();
|
||||
if (!order) {
|
||||
return;
|
||||
}
|
||||
if(this.old_order){
|
||||
this.old_order.unbind(null,null,this);
|
||||
}
|
||||
@@ -1258,7 +1265,9 @@ function openerp_pos_screens(instance, module){ //module is instance.point_of_sa
|
||||
order_changes: function(){
|
||||
var self = this;
|
||||
var order = this.pos.get_order();
|
||||
if (order.isPaid()) {
|
||||
if (!order) {
|
||||
return;
|
||||
} else if (order.isPaid()) {
|
||||
self.$('.next').addClass('highlight');
|
||||
}else{
|
||||
self.$('.next').removeClass('highlight');
|
||||
@@ -1271,7 +1280,9 @@ function openerp_pos_screens(instance, module){ //module is instance.point_of_sa
|
||||
|
||||
var order = this.pos.get_order();
|
||||
|
||||
if(order.get('orderLines').models.length === 0){
|
||||
// FIXME: this check is there because the backend is unable to
|
||||
// process empty orders. This is not the right place to fix it.
|
||||
if(order.get_orderlines().length === 0){
|
||||
this.pos_widget.screen_selector.show_popup('error',{
|
||||
'message': _t('Empty Order'),
|
||||
'comment': _t('There must be at least one product in your order before it can be validated'),
|
||||
@@ -1344,3 +1355,4 @@ function openerp_pos_screens(instance, module){ //module is instance.point_of_sa
|
||||
});
|
||||
|
||||
}
|
||||
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
function openerp_pos_basewidget(instance, module){ //module is instance.point_of_sale
|
||||
|
||||
var round_di = instance.web.round_decimals;
|
||||
var round_pr = instance.web.round_precision
|
||||
var round_pr = instance.web.round_precision;
|
||||
|
||||
// This is a base class for all Widgets in the POS. It exposes relevant data to the
|
||||
// templates :
|
||||
@@ -21,6 +21,17 @@ function openerp_pos_basewidget(instance, module){ //module is instance.point_of
|
||||
},
|
||||
format_currency: function(amount,precision){
|
||||
var currency = (this.pos && this.pos.currency) ? this.pos.currency : {symbol:'$', position: 'after', rounding: 0.01, decimals: 2};
|
||||
|
||||
amount = this.format_currency_no_symbol(amount,precision);
|
||||
|
||||
if (currency.position === 'after') {
|
||||
return amount + ' ' + (currency.symbol || '');
|
||||
} else {
|
||||
return (currency.symbol || '') + ' ' + amount;
|
||||
}
|
||||
},
|
||||
format_currency_no_symbol: function(amount, precision) {
|
||||
var currency = (this.pos && this.pos.currency) ? this.pos.currency : {symbol:'$', position: 'after', rounding: 0.01, decimals: 2};
|
||||
var decimals = currency.decimals;
|
||||
|
||||
if (precision && (typeof this.pos.dp[precision]) !== undefined) {
|
||||
@@ -28,7 +39,7 @@ function openerp_pos_basewidget(instance, module){ //module is instance.point_of
|
||||
}
|
||||
|
||||
this.format_currency_no_symbol = function(amount){
|
||||
amount = round_pr(amount,this.currency.rounding);
|
||||
amount = round_pr(amount,currency.rounding);
|
||||
amount = amount.toFixed(decimals);
|
||||
return amount;
|
||||
};
|
||||
@@ -37,11 +48,7 @@ function openerp_pos_basewidget(instance, module){ //module is instance.point_of
|
||||
amount = round_di(amount,decimals).toFixed(decimals);
|
||||
}
|
||||
|
||||
if (currency.position === 'after') {
|
||||
return amount + ' ' + (currency.symbol || '');
|
||||
} else {
|
||||
return (currency.symbol || '') + ' ' + amount;
|
||||
}
|
||||
return amount;
|
||||
},
|
||||
show: function(){
|
||||
this.$el.removeClass('oe_hidden');
|
||||
|
||||
@@ -83,7 +83,7 @@ function openerp_pos_widgets(instance, module){ //module is instance.point_of_sa
|
||||
},
|
||||
});
|
||||
|
||||
// The action pads contains the payment button and the customer selection button.
|
||||
// The action pad contains the payment button and the customer selection button
|
||||
module.ActionpadWidget = module.PosBaseWidget.extend({
|
||||
template: 'ActionpadWidget',
|
||||
renderElement: function() {
|
||||
@@ -317,48 +317,6 @@ function openerp_pos_widgets(instance, module){ //module is instance.point_of_sa
|
||||
},
|
||||
});
|
||||
|
||||
module.OrderButtonWidget = module.PosBaseWidget.extend({
|
||||
template:'OrderButtonWidget',
|
||||
init: function(parent, options) {
|
||||
this._super(parent,options);
|
||||
var self = this;
|
||||
|
||||
this.order = options.order;
|
||||
this.order.bind('destroy',this.destroy, this );
|
||||
this.order.bind('change', this.renderElement, this );
|
||||
this.pos.bind('change:selectedOrder', this.renderElement,this );
|
||||
},
|
||||
renderElement:function(){
|
||||
this.selected = ( this.pos.get_order() === this.order )
|
||||
this._super();
|
||||
var self = this;
|
||||
this.$el.click(function(){
|
||||
if( self.pos.get_order() === self.order ){
|
||||
var ss = self.pos.pos_widget.screen_selector;
|
||||
if(ss.get_current_screen() === 'clientlist'){
|
||||
ss.back();
|
||||
}else if (ss.get_current_screen() !== 'receipt'){
|
||||
ss.set_current_screen('clientlist');
|
||||
}
|
||||
}else{
|
||||
self.selectOrder();
|
||||
}
|
||||
});
|
||||
if( this.selected){
|
||||
this.$el.addClass('selected');
|
||||
}
|
||||
},
|
||||
selectOrder: function(event) {
|
||||
this.pos.set_order(this.order);
|
||||
},
|
||||
destroy: function(){
|
||||
this.order.unbind('destroy', this.destroy, this);
|
||||
this.order.unbind('change', this.renderElement, this);
|
||||
this.pos.unbind('change:selectedOrder', this.renderElement, this);
|
||||
this._super();
|
||||
},
|
||||
});
|
||||
|
||||
module.ProductCategoriesWidget = module.PosBaseWidget.extend({
|
||||
template: 'ProductCategoriesWidget',
|
||||
init: function(parent, options){
|
||||
|
||||
@@ -126,11 +126,11 @@
|
||||
</t>
|
||||
|
||||
<t t-name="ActionpadWidget">
|
||||
<div class='actionpad'>
|
||||
<div class="actionpad">
|
||||
<button class='button set-customer'>
|
||||
<i class='fa fa-user' /> Set Customer
|
||||
</button>
|
||||
<button class="button pay">
|
||||
<button class='button pay'>
|
||||
<i class='fa fa-chevron-right' /> Payment
|
||||
</button>
|
||||
</div>
|
||||
@@ -557,8 +557,9 @@
|
||||
</div>
|
||||
</t>
|
||||
</div>
|
||||
|
||||
</t>
|
||||
|
||||
|
||||
<t t-name="PaymentScreenWidget">
|
||||
<div class='payment-screen screen'>
|
||||
<div class='screen-content'>
|
||||
@@ -589,24 +590,23 @@
|
||||
|
||||
<div class='payment-buttons'>
|
||||
<t t-if='widget.pos.config.iface_invoicing'>
|
||||
<div t-attf-class='button js_invoice #{ widget.pos.get_order().is_to_invoice() ? "highlight" : ""} '>
|
||||
<i class='fa fa-file-text-o' /> Invoice
|
||||
</div>
|
||||
<t t-if='widget.pos.get_order()'>
|
||||
<div t-attf-class='button js_invoice #{ widget.pos.get_order().is_to_invoice() ? "highlight" : ""} '>
|
||||
<i class='fa fa-file-text-o' /> Invoice
|
||||
</div>
|
||||
</t>
|
||||
</t>
|
||||
<t t-if='widget.pos.config.iface_cashdrawer'>
|
||||
<div class='button js_invoice'>
|
||||
<i class='fa fa-archive' /> Open Cashbox
|
||||
</div>
|
||||
</t>
|
||||
</div>
|
||||
|
||||
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</t>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</t>
|
||||
|
||||
<t t-name="ReceiptScreenWidget">
|
||||
<div class='receipt-screen screen'>
|
||||
<div class='screen-content'>
|
||||
|
||||
Reference in New Issue
Block a user