[IMP] point_of_sale: debug window

bzr revid: fva@openerp.com-20120912161229-4lgcgt4xt2cdzceo
This commit is contained in:
Frédéric van der Essen
2012-09-12 18:12:29 +02:00
parent 6bbc6a9068
commit a5bed8994c
6 changed files with 270 additions and 70 deletions
@@ -1102,6 +1102,81 @@
.point-of-sale .pos-actionbar .button.rightalign{
float:right;
}
/* ********* The Debug Widget ********* */
.point-of-sale .debug-widget{
z-index:100000;
position: absolute;
right: 10px;
top: 10px;
width: 200px;
font-size: 10px;
background: rgba(0,0,0,0.82);
color: white;
text-shadow: none;
padding-bottom: 10px;
box-shadow: 0px 3px 20px rgba(0,0,0,0.3);
cursor:move;
}
.point-of-sale .debug-widget .toggle{
position: absolute;
font-size: 16px;
cursor:pointer;
top:0px;
right:0px;
padding:10px;
padding-right:15px;
}
.point-of-sale .debug-widget .content{
overflow: hidden;
}
.point-of-sale .debug-widget h1{
background:black;
padding-top: 10px;
padding-left: 10px;
margin-top:0;
margin-bottom:0;
}
.point-of-sale .debug-widget .category{
background: black;
padding-left: 10px;
margin: 0px;
font-weight: bold;
padding-top:3px;
padding-bottom:3px;
}
.point-of-sale .debug-widget .button{
padding: 5px;
padding-left: 15px;
display: block;
cursor:pointer;
}
.point-of-sale .debug-widget .button:hover{
background: rgba(96,21,177,0.45);
}
.point-of-sale .debug-widget input{
margin-left:10px;
margin-top:7px;
}
.point-of-sale .debug-widget .status{
padding: 5px;
padding-left: 15px;
display: block;
cursor:default;
}
.point-of-sale .debug-widget .status.on{
padding: 5px;
padding-left: 15px;
display: block;
background-color: green;
}
.point-of-sale .debug-widget .status.on{
padding: 5px;
padding-left: 15px;
display: block;
background-color: #6cd11d;
}
/* ********* The PopupWidgets ********* */
+48 -51
View File
@@ -1,26 +1,6 @@
function openerp_pos_devices(instance,module){ //module is instance.point_of_sale
var debug_devices = new (instance.web.Class.extend({
active: false,
payment_status: 'waiting_for_payment',
weight: 0,
activate: function(){
this.active = true;
},
deactivate: function(){
this.active = false;
},
set_weight: function(weight){ this.activate(); this.weight = weight; },
accept_payment: function(){ this.activate(); this.payment_status = 'payment_accepted'; },
reject_payment: function(){ this.activate(); this.payment_status = 'payment_rejected'; },
delay_payment: function(){ this.activate(); this.payment_status = 'waiting_for_payment'; },
}))();
if(jQuery.deparam(jQuery.param.querystring()).debug !== undefined){
window.debug_devices = debug_devices;
}
// this object interfaces with the local proxy to communicate to the various hardware devices
// connected to the Point of Sale. As the communication only goes from the POS to the proxy,
// methods are used both to signal an event, and to fetch information.
@@ -38,20 +18,34 @@ function openerp_pos_devices(instance,module){ //module is instance.point_of_sal
this.connection = new instance.web.JsonRPC();
this.connection.setup(url);
this.bypass_proxy = false;
this.notifications = {};
},
message : function(name,params,success_callback, error_callback){
success_callback = success_callback || function(){};
error_callback = error_callback || function(){};
if(jQuery.deparam(jQuery.param.querystring()).debug !== undefined){
console.log('PROXY:',name,params);
}
if(!(debug_devices && debug_devices.active)){
this.connection.rpc('/pos/'+name, params || {}, success_callback, error_callback);
var callbacks = this.notifications[name] || [];
for(var i = 0; i < callbacks.length; i++){
callbacks[i](params);
}
this.connection.rpc('/pos/'+name, params || {}, success_callback, error_callback);
},
// this allows the client to be notified when a proxy call is made. The notification
// callback will be executed with the same arguments as the proxy call
add_notification: function(name, callback){
if(!this.notifications[name]){
this.notifications[name] = [];
}
this.notifications[name].push(callback);
},
//a product has been scanned and recognized with success
@@ -78,12 +72,12 @@ function openerp_pos_devices(instance,module){ //module is instance.point_of_sal
//the client is starting to weight
weighting_start: function(){
this.weight = 0;
if(debug_devices){
debug_devices.weigth = 0;
if(!this.weighting){
this.weight = 0;
this.weighting = true;
this.bypass_proxy = false;
this.message('weighting_start');
}
this.weighting = true;
this.message('weighting_start');
},
//returns the weight on the scale.
@@ -91,22 +85,29 @@ function openerp_pos_devices(instance,module){ //module is instance.point_of_sal
// and a weighting_end()
weighting_read_kg: function(){
var self = this;
if(debug_devices && debug_devices.active){
return debug_devices.weight;
if(this.bypass_proxy){
return this.weight;
}else{
this.message('weighting_read_kg',{},function(weight){
if(self.weighting){
if(self.weighting && !self.bypass_proxy){
self.weight = weight;
}
});
return self.weight;
return this.weight;
}
},
// sets a custom weight, ignoring the proxy returned value until the next weighting_end
debug_set_weight: function(kg){
this.bypass_proxy = true;
this.weight = kg;
},
// the client has finished weighting products
weighting_end: function(){
this.weight = 0;
this.weighting = false;
this.bypass_proxy = false;
this.message('weighting_end');
},
@@ -116,9 +117,6 @@ function openerp_pos_devices(instance,module){ //module is instance.point_of_sal
payment_request: function(price, method, info){
this.paying = true;
this.payment_status = 'waiting_for_payment';
if(debug_devices){
debug_devices.payment_status = 'waiting_for_payment';
}
this.message('payment_request',{'price':price,'method':method,'info':info});
},
@@ -127,18 +125,30 @@ function openerp_pos_devices(instance,module){ //module is instance.point_of_sal
// returns 'waiting_for_payment' | 'payment_accepted' | 'payment_rejected'
is_payment_accepted: function(){
var self = this;
if(debug_devices.active){
return debug_devices.payment_status;
if(this.bypass_proxy){
this.bypass_proxy = false;
return this.payment_status;
}else{
this.message('is_payment_accepted', {}, function(payment_status){
if(self.paying){
self.payment_status = payment_status;
}
});
return self.payment_status;
return this.payment_status;
}
},
// override what the proxy says and accept the payment
debug_accept_payment: function(){
this.bypass_proxy = true;
this.payment_status = 'payment_accepted';
},
// override what the proxy says and reject the payment
debug_reject_payment: function(){
this.bypass_proxy = true;
this.payment_status = 'payment_rejected';
},
// the client cancels his payment
payment_canceled: function(){
this.paying = false;
@@ -241,18 +251,6 @@ function openerp_pos_devices(instance,module){ //module is instance.point_of_sal
this.price_prefix_set = attributes.price_prefix_set || {'23':''};
this.cashier_prefix_set = attributes.cashier_prefix_set || {'041':''};
this.client_prefix_set = attributes.client_prefix_set || {'042':''};
if(jQuery.deparam(jQuery.param.querystring()).debug !== undefined){
var self = this;
window.simulate_ean = function(ean,strict){
ean = ean.toString();
if(!strict){
ean = self.sanitize_ean(ean);
}
console.log('SIMULATE EAN: ',ean);
self.on_ean(ean);
}
}
},
save_callbacks: function(){
@@ -356,7 +354,6 @@ function openerp_pos_devices(instance,module){ //module is instance.point_of_sal
value: 0,
unit: 'none',
};
console.log('ean',ean);
function match_prefix(prefix_set, type){
for(prefix in prefix_set){
@@ -24,6 +24,8 @@ function openerp_pos_models(instance, module){ //module is instance.point_of_sal
this.proxy = new module.ProxyDevice(); // used to communicate to the hardware devices via a local proxy
this.db = new module.PosLS(); // a database used to store the products and categories
this.db.clear('products','categories');
this.debug = jQuery.deparam(jQuery.param.querystring()).debug !== undefined; //debug mode
// default attributes values. If null, it will be loaded below.
this.set({
@@ -560,21 +560,21 @@ function openerp_pos_screens(instance, module){ //module is instance.point_of_sa
//we get the first cashregister marked as self-checkout
var selfCheckoutRegisters = [];
for(var i = 0; i < this.pos.get('cashRegisters').models.length; i++){
var cashregister = this.pos.get('cashRegisters').models[i];
for(var i = 0; i < self.pos.get('cashRegisters').models.length; i++){
var cashregister = self.pos.get('cashRegisters').models[i];
if(cashregister.self_checkout_payment_method){
selfCheckoutRegisters.push(cashregister);
}
}
var cashregister = selfCheckoutRegisters[0] || this.pos.get('cashRegisters').models[0];
var cashregister = selfCheckoutRegisters[0] || self.pos.get('cashRegisters').models[0];
currentOrder.addPaymentLine(cashregister);
self.pos.push_order(currentOrder.exportAsJSON())
currentOrder.destroy();
self.pos.proxy.transaction_end();
self.pos_widget.screen_selector.set_current_screen(self.next_screen);
}else if(payment === 'payment_rejected'){
clearInterval(this.intervalID);
clearInterval(self.intervalID);
//TODO show a tryagain thingie ?
}
},500);
@@ -603,13 +603,14 @@ function openerp_pos_screens(instance, module){ //module is instance.point_of_sa
show_numpad: false,
show_leftpane: false,
barcode_product_action: function(ean){
self.pos.proxy.transaction_start();
this.pos.proxy.transaction_start();
this._super(ean);
},
barcode_client_action: function(ean){
self.pos.proxy.transaction_start();
this.pos.proxy.transaction_start();
this._super(ean);
$('.goodbye-message').hide();
this.pos_widget.screen_selector.show_popup('choose-receipt');
},
+89 -13
View File
@@ -694,6 +694,91 @@ function openerp_pos_widgets(instance, module){ //module is instance.point_of_sa
},
});
module.DebugWidget = module.PosBaseWidget.extend({
template: "DebugWidget",
eans:{
admin_badge: '0410300000004',
client_badge: '0420100000005',
invalid_ean: '1232456',
soda_33cl: '5449000000996',
oranges_kg: '2100002031410',
lemon_price: '2301000001560',
unknown_product: '9900000000004',
},
events:[
'scan_item_success',
'scan_item_error_unrecognized',
'payment_request',
'open_cashbox',
'print_receipt',
'print_pdf_invoice',
],
minimized: false,
start: function(){
var self = this;
this.$el.draggable();
this.$('.toggle').click(function(){
var content = self.$('.content');
var bg = self.$el;
if(!self.minimized){
content.animate({'height':'0'},200);
}else{
content.css({'height':'auto'});
}
self.minimized = !self.minimized;
});
this.$('.button.accept_payment').click(function(){
self.pos.proxy.debug_accept_payment();
});
this.$('.button.reject_payment').click(function(){
self.pos.proxy.debug_reject_payment();
});
this.$('.button.set_weight').click(function(){
var kg = Number(self.$('input.weight').val());
if(!Number.isNaN(kg)){
self.pos.proxy.debug_set_weight(kg);
}
});
this.$('.button.custom_ean').click(function(){
var ean = self.pos.barcode_reader.sanitize_ean(self.$('input.ean').val() || '0');
self.$('input.ean').val(ean);
self.pos.barcode_reader.on_ean(ean);
});
_.each(this.eans, function(ean, name){
self.$('.button.'+name).click(function(){
self.$('input.ean').val(ean);
self.pos.barcode_reader.on_ean(ean);
});
});
_.each(this.events, function(name){
self.pos.proxy.add_notification(name,function(){
console.log('Notification:',name);
self.$('.status.'+name).stop().clearQueue().css({'background-color':'#6CD11D'});
self.$('.status.'+name).animate({'background-color':'black'},2000);
});
});
self.pos.proxy.add_notification('help_needed',function(){
self.$('.status.help_needed').addClass('on');
});
self.pos.proxy.add_notification('help_canceled',function(){
self.$('.status.help_needed').removeClass('on');
});
self.pos.proxy.add_notification('transaction_start',function(){
self.$('.status.transaction').addClass('on');
});
self.pos.proxy.add_notification('transaction_end',function(){
self.$('.status.transaction').removeClass('on');
});
self.pos.proxy.add_notification('weighting_start',function(){
self.$('.status.weighting').addClass('on');
});
self.pos.proxy.add_notification('weighting_end',function(){
self.$('.status.weighting').removeClass('on');
});
},
});
// The PosWidget is the main widget that contains all other widgets in the PointOfSale.
// It is mainly composed of :
// - a header, containing the list of orders
@@ -718,14 +803,6 @@ function openerp_pos_widgets(instance, module){ //module is instance.point_of_sa
this.leftpane_width = '440px';
this.cashier_controls_visible = true;
this.image_cache = new module.ImageCache(); // for faster products image display
/*
//Epileptic mode
setInterval(function(){
$('body').css({'-webkit-filter':'hue-rotate('+Math.random()*360+'deg)' });
},100);
*/
},
start: function() {
@@ -769,11 +846,6 @@ function openerp_pos_widgets(instance, module){ //module is instance.point_of_sa
self.$('.loader').animate({opacity:0},1500,'swing',function(){self.$('.loader').hide();});
self.$('.loader img').hide();
if(jQuery.deparam(jQuery.param.querystring()).debug !== undefined){
window.pos = self.pos;
window.pos_widget = self.pos_widget;
}
},function(){ // error when loading models data from the backend
self.$('.loader img').hide();
return new instance.web.Model("ir.model.data").get_func("search_read")([['name', '=', 'action_pos_session_opening']], ['res_id'])
@@ -898,6 +970,10 @@ function openerp_pos_widgets(instance, module){ //module is instance.point_of_sa
default_mode: this.pos.iface_self_checkout ? 'client' : 'cashier',
});
if(this.pos.debug){
this.debug_widget = new module.DebugWidget(this);
this.debug_widget.appendTo(this.$('#content'));
}
},
changed_pending_operations: function () {
@@ -414,6 +414,55 @@
</div>
</t>
<t t-name="DebugWidget">
<div class="debug-widget">
<h1>Debug Window</h1>
<div class="toggle">▾</div>
<div class="content">
<p class="category">Payment Terminal</p>
<ul>
<li class="button accept_payment">Accept Payment</li>
<li class="button reject_payment">Reject Payment</li>
</ul>
<p class="category">Electronic Scale</p>
<ul>
<li><input type="text" class="weight"></input></li>
<li class="button set_weight">Set Weight</li>
</ul>
<p class="category">Barcode Scanner</p>
<ul>
<li><input type="text" class="ean"></input></li>
<li class="button custom_ean">Custom Ean13</li>
<li class="button admin_badge">Admin Badge</li>
<li class="button client_badge">Client Badge</li>
<li class="button soda_33cl">Soda 33cl</li>
<li class="button oranges_kg">3.141Kg Oranges</li>
<li class="button lemon_price">1.54€ Lemon</li>
<li class="button unknown_product">Unknown Product</li>
<li class="button invalid_ean">Invalid Ean</li>
</ul>
<p class="category">Hardware Status</p>
<ul>
<li class="status help_needed">Help needed</li>
<li class="status weighting">Weighting</li>
<li class="status transaction">In Transaction</li>
</ul>
<p class="category">Hardware Events</p>
<ul>
<li class="status scan_item_success">Scan Item Success</li>
<li class="status scan_item_error_unrecognized">Scan Item Unrecognized</li>
<li class="status payment_request">Payment Request</li>
<li class="status open_cashbox">Open Cashbox</li>
<li class="status print_receipt">Print Receipt</li>
<li class="status print_pdf_invoice">Print Invoice</li>
</ul>
</div>
</div>
</t>
<t t-name="OrderlineWidget">
<li class="orderline">
<span class="product-name">