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.
431 lines
15 KiB
431 lines
15 KiB
/*
|
|
Copyright 2019 Coop IT Easy SCRLfs
|
|
Robin Keunen <robin@coopiteasy.be>
|
|
Pierrick Brun <pierrick.brun@akretion.com>
|
|
License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html).
|
|
*/
|
|
|
|
|
|
odoo.define('pos_container.container', function (require) {
|
|
"use strict";
|
|
|
|
var models_and_db = require('pos_container.models_and_db');
|
|
|
|
var screens = require('point_of_sale.screens');
|
|
var gui = require('point_of_sale.gui');
|
|
var models = require('point_of_sale.models');
|
|
|
|
var core = require('web.core');
|
|
var rpc = require('web.rpc');
|
|
var QWeb = core.qweb;
|
|
var _t = core._t;
|
|
|
|
|
|
var TareButton = screens.ActionButtonWidget.extend({
|
|
template: 'TareButton',
|
|
});
|
|
|
|
screens.define_action_button({
|
|
'name': 'tare',
|
|
'widget': TareButton,
|
|
});
|
|
|
|
screens.NumpadWidget.include({
|
|
// to put selected-mode on tare button outside the numpadwidget
|
|
changedMode: function() {
|
|
this._super();
|
|
if (this.state.get('mode') === 'tare'){
|
|
$('.mode-button[data-mode="tare"]').addClass('selected-mode');
|
|
}
|
|
},
|
|
});
|
|
|
|
var ContainerButton = screens.ActionButtonWidget.extend({
|
|
template: 'ContainerButton',
|
|
button_click: function(){
|
|
this.gui.show_screen('containerlist');
|
|
}
|
|
});
|
|
|
|
screens.define_action_button({
|
|
'name': 'container',
|
|
'widget': ContainerButton,
|
|
});
|
|
|
|
var ContainerListScreenWidget = screens.ScreenWidget.extend({
|
|
template: 'ContainerListScreenWidget',
|
|
|
|
init: function(parent, options){
|
|
this._super(parent, options);
|
|
this.container_cache = new screens.DomCache();
|
|
},
|
|
|
|
show: function(){
|
|
var self = this;
|
|
this._super();
|
|
|
|
this.renderElement();
|
|
this.$('.back').click(function(){
|
|
self.gui.back();
|
|
});
|
|
|
|
this.$('.next').click(function(){
|
|
self.save_changes();
|
|
self.gui.show_screen('products');
|
|
});
|
|
|
|
this.$('.delete-container').click(function(){
|
|
if (self.container){
|
|
self.gui.show_popup('confirm', {
|
|
'title': _t('Container deletion'),
|
|
'body': _t(
|
|
'Do you want to delete this container ?\n').concat(
|
|
self.container.name),
|
|
confirm: function(){
|
|
self.delete_selected_container();
|
|
},
|
|
});
|
|
}
|
|
});
|
|
|
|
var containers = this.pos.db.get_containers_sorted(1000);
|
|
this.render_list(containers);
|
|
|
|
this.reload_containers();
|
|
|
|
this.$('.container-list-contents').delegate('.container-line',
|
|
'click', function(event){
|
|
self.line_select(event,$(this),$(this).data('id'));
|
|
});
|
|
|
|
var search_timeout = null;
|
|
|
|
if(this.pos.config.iface_vkeyboard && this.chrome.widget.keyboard){
|
|
this.chrome.widget.keyboard.connect(
|
|
this.$('.searchbox input')
|
|
);
|
|
}
|
|
|
|
this.$('.searchbox input').on('keyup',function(event){
|
|
clearTimeout(search_timeout);
|
|
|
|
var query = this.value;
|
|
|
|
search_timeout = setTimeout(function(){
|
|
self.perform_search(query,event.which === 13);
|
|
},70);
|
|
});
|
|
|
|
this.$('.searchbox .search-clear').click(function(){
|
|
self.clear_search();
|
|
});
|
|
},
|
|
delete_selected_container: function(){
|
|
var self = this;
|
|
|
|
if (!self.container.id){
|
|
self.deleted_container(self.container.barcode)
|
|
}
|
|
else {
|
|
rpc.query({
|
|
model: 'pos.container',
|
|
method: 'unlink',
|
|
args: [self.container.id],
|
|
}).then(function(){
|
|
self.deleted_container(self.container.barcode);
|
|
},function(err,ev){
|
|
ev.preventDefault();
|
|
var error_body = _t('Your Internet connection is probably down.');
|
|
if (err.data) {
|
|
var except = err.data;
|
|
error_body = except.arguments && except.arguments[0] || except.message || error_body;
|
|
}
|
|
self.gui.show_popup('error',{
|
|
'title': _t('Error: Could not Save Changes'),
|
|
'body': error_body,
|
|
});
|
|
}
|
|
);
|
|
}
|
|
},
|
|
deleted_container: function(barcode){
|
|
var self = this;
|
|
this.pos.db.remove_containers([barcode]);
|
|
this.$('.container-list .highlight').remove();
|
|
this.container = null;
|
|
},
|
|
perform_search: function(query, associate_result){
|
|
if(query){
|
|
var containers = this.pos.db.search_container(query);
|
|
if ( associate_result && containers.length === 1){
|
|
this.container = containers[0];
|
|
this.save_changes();
|
|
this.gui.back();
|
|
}
|
|
this.render_list(containers);
|
|
}else{
|
|
var containers = this.pos.db.get_containers_sorted();
|
|
this.render_list(containers);
|
|
}
|
|
},
|
|
clear_search: function(){
|
|
var containers = this.pos.db.get_containers_sorted(1000);
|
|
this.render_list(containers);
|
|
this.$('.searchbox input')[0].value = '';
|
|
this.$('.searchbox input').focus();
|
|
},
|
|
render_list: function(containers) {
|
|
var contents = this.$el[0].querySelector('.container-list-contents');
|
|
contents.innerHTML = "";
|
|
for(var i = 0, len = Math.min(containers.length,1000); i < len; i++){
|
|
var container = containers[i];
|
|
var containerline_html = QWeb.render('ContainerLine',{widget: this, container:containers[i]});
|
|
var containerline = document.createElement('tbody');
|
|
containerline.innerHTML = containerline_html;
|
|
containerline = containerline.childNodes[1];
|
|
|
|
if(containers === this.container) {
|
|
containerline.classList.add('highlight');
|
|
} else {
|
|
containerline.classList.remove('highlight');
|
|
}
|
|
|
|
contents.appendChild(containerline);
|
|
}
|
|
},
|
|
save_changes: function(){
|
|
this.pos.get_order().add_container(this.container);
|
|
},
|
|
toggle_delete_button: function(){
|
|
var $button = this.$('.button.delete-container');
|
|
$button.toggleClass('oe_hidden', !this.container);
|
|
},
|
|
toggle_save_button: function(){
|
|
var $button = this.$('.button.next');
|
|
if (this.container) {
|
|
$button.text('Set Container');
|
|
}
|
|
$button.toggleClass('oe_hidden', !this.container);
|
|
},
|
|
line_select: function(event,$line,barcode){
|
|
var container = this.pos.db.get_container_by_barcode(barcode);
|
|
this.$('.container-list .lowlight').removeClass('lowlight');
|
|
if ( $line.hasClass('highlight') ){
|
|
$line.removeClass('highlight');
|
|
$line.addClass('lowlight');
|
|
this.toggle_delete_button();
|
|
this.toggle_save_button();
|
|
}else{
|
|
this.$('.container-list .highlight').removeClass('highlight');
|
|
$line.addClass('highlight');
|
|
var y = event.pageY - $line.parent().offset().top;
|
|
this.container = container;
|
|
this.toggle_delete_button();
|
|
this.toggle_save_button();
|
|
}
|
|
},
|
|
|
|
// This fetches container changes on the server, and in case of changes,
|
|
// rerenders the affected views
|
|
reload_containers: function(){
|
|
var self = this;
|
|
return this.pos.load_new_containers().then(function(){
|
|
// containers may have changed in the backend
|
|
self.container_cache = new screens.DomCache();
|
|
|
|
self.render_list(self.pos.db.get_containers_sorted(1000));
|
|
|
|
var last_orderline = self.pos.get_order().get_last_orderline();
|
|
|
|
if(last_orderline) {
|
|
// update the currently assigned container if it has been changed in db.
|
|
var curr_container = last_orderline.get_container();
|
|
}
|
|
|
|
if (curr_container) {
|
|
last_orderline.set_container(
|
|
self.pos.db.get_container_by_barcode(curr_container.barcode));
|
|
}
|
|
});
|
|
},
|
|
|
|
close: function(){
|
|
this._super();
|
|
if (this.pos.config.iface_vkeyboard && this.chrome.widget.keyboard) {
|
|
this.chrome.widget.keyboard.hide();
|
|
}
|
|
},
|
|
|
|
auto_back: true,
|
|
});
|
|
|
|
gui.define_screen({
|
|
name:'containerlist',
|
|
widget: ContainerListScreenWidget
|
|
});
|
|
|
|
// add container barcode scan
|
|
screens.ScreenWidget.include({
|
|
barcode_container_action: function(code){
|
|
var self = this;
|
|
if (self.pos.scan_container(code)) {
|
|
// nothing to do now, the container is added
|
|
// as an orderline if found.
|
|
} else {
|
|
self.gui.show_screen('containerscale', {barcode: code.base_code});
|
|
}
|
|
},
|
|
show: function(){
|
|
var self = this;
|
|
this._super();
|
|
this.pos.barcode_reader.set_action_callback({
|
|
'container': _.bind(self.barcode_container_action, self),
|
|
});
|
|
},
|
|
});
|
|
|
|
screens.ProductScreenWidget.include({
|
|
// to use Tare Button from outside the NumpadWidget
|
|
start: function(){
|
|
this._super();
|
|
var tare_button = $('.mode-button[data-mode="tare"]');
|
|
tare_button.click(_.bind(this.numpad.clickChangeMode, this.numpad));
|
|
},
|
|
// to add a product to a container orderline
|
|
click_product: function(product) {
|
|
var order = this.pos.get_order();
|
|
var selected_orderline = order.get_selected_orderline();
|
|
if (product.to_weight && selected_orderline &&
|
|
selected_orderline.product === this.pos.get_container_product()){
|
|
var container = selected_orderline.get_container();
|
|
this.gui.show_screen(
|
|
'scale',
|
|
{product: product,
|
|
container: container,
|
|
old_orderline: selected_orderline});
|
|
} else {
|
|
this._super(product);
|
|
}
|
|
},
|
|
});
|
|
|
|
screens.ScaleScreenWidget.include({
|
|
order_product: function(){
|
|
// Replace the orderline if the product is the placeholder
|
|
// container product.
|
|
var container = this.gui.get_current_screen_param('container');
|
|
if (container){
|
|
var order = this.pos.get_order();
|
|
order.add_product(this.get_product(),{ quantity: this.weight, price: this.price });
|
|
var orderline = order.get_selected_orderline();
|
|
orderline.set_container(container);
|
|
var old_orderline = this.gui.get_current_screen_param(
|
|
'old_orderline');
|
|
if (old_orderline){
|
|
order.remove_orderline(old_orderline);
|
|
}
|
|
orderline.set_quantity(this.weight);
|
|
orderline.set_gross_weight(this.weight + container.weight);
|
|
orderline.set_tare_mode('AUTO');
|
|
orderline.trigger('change', orderline);
|
|
} else {
|
|
this._super();
|
|
var orderline = this.pos.get_order().get_selected_orderline();
|
|
orderline.set_tare_mode('AUTO');
|
|
}
|
|
},
|
|
});
|
|
|
|
var ContainerScaleScreenWidget = screens.ScaleScreenWidget.extend({
|
|
template: 'ContainerScaleScreenWidget',
|
|
|
|
next_screen: 'products',
|
|
previous_screen: 'products',
|
|
|
|
init: function(parent, options){
|
|
this._super(parent, options);
|
|
},
|
|
|
|
show: function(){
|
|
this._super();
|
|
var self = this;
|
|
|
|
this.$('.next,.add-container').click(function(){
|
|
self.create_container();
|
|
});
|
|
|
|
if(this.pos.config.iface_vkeyboard && this.chrome.widget.keyboard){
|
|
this.chrome.widget.keyboard.connect($(this.el.querySelector('.container-name input')));
|
|
}
|
|
},
|
|
get_product: function(){
|
|
return this.pos.get_container_product();
|
|
},
|
|
create_container: function(){
|
|
var self = this;
|
|
var fields = {};
|
|
|
|
fields['weight'] = this.weight;
|
|
|
|
this.$('.container-name .detail').each(function(idx,el){
|
|
fields['name'] = el.value;
|
|
|
|
});
|
|
|
|
fields.barcode = this.gui.get_current_screen_param('barcode') || false;
|
|
fields.name = fields.name || _t('Container');
|
|
|
|
this.pos.push_container(fields).then(
|
|
this.pushed_container(fields["barcode"])
|
|
);
|
|
},
|
|
pushed_container: function(barcode){
|
|
var self = this;
|
|
self.gui.show_screen(self.next_screen);
|
|
},
|
|
close: function(){
|
|
this._super();
|
|
if (this.pos.config.iface_vkeyboard && this.chrome.widget.keyboard) {
|
|
this.chrome.widget.keyboard.hide();
|
|
}
|
|
},
|
|
});
|
|
|
|
gui.define_screen({
|
|
name:'containerscale',
|
|
widget: ContainerScaleScreenWidget,
|
|
});
|
|
|
|
screens.ProductListWidget.include({
|
|
render_product: function(product){
|
|
if(product.barcode != 'CONTAINER'){
|
|
return this._super(product);
|
|
} else {
|
|
return document.createElement('div');
|
|
}
|
|
}
|
|
});
|
|
|
|
screens.OrderWidget.include({
|
|
set_value: function(val) {
|
|
this._super(val);
|
|
var order = this.pos.get_order();
|
|
if (order.get_selected_orderline()) {
|
|
var oline = order.get_selected_orderline();
|
|
var mode = this.numpad_state.get('mode');
|
|
if( mode === 'tare'){
|
|
oline.set_tare(val);
|
|
}
|
|
if( mode === 'quantity' && oline.container) {
|
|
oline.set_gross_weight(parseFloat(val) + oline.container.weight);
|
|
}
|
|
oline.set_tare_mode('MAN');
|
|
}
|
|
},
|
|
});
|
|
|
|
return {
|
|
ContainerScaleScreenWidget: ContainerScaleScreenWidget,
|
|
};
|
|
|
|
});
|