[FIX] stock: barcode scanner GUI somewhat functionally working
bzr revid: qdp-launchpad@openerp.com-20140211155157-gu86q7it150u33tp
This commit is contained in:
parent
e0362bf34c
commit
ef8e1fc31f
|
@ -107,9 +107,6 @@ Dashboard / Reports for Warehouse Management will include:
|
||||||
'static/src/css/stock.css',
|
'static/src/css/stock.css',
|
||||||
],
|
],
|
||||||
'js': [
|
'js': [
|
||||||
'static/lib/sparkline/jquery.sparkline.js',
|
|
||||||
'static/lib/justgage.js',
|
|
||||||
'static/src/js/stock_picking_type.js',
|
|
||||||
'static/src/js/widgets.js',
|
'static/src/js/widgets.js',
|
||||||
],
|
],
|
||||||
'qweb': ['static/src/xml/picking.xml'],
|
'qweb': ['static/src/xml/picking.xml'],
|
||||||
|
|
|
@ -223,7 +223,7 @@
|
||||||
* ----------------------- */
|
* ----------------------- */
|
||||||
|
|
||||||
.oe_pick_widget .oe_searchbox{
|
.oe_pick_widget .oe_searchbox{
|
||||||
float: right;
|
margin-top: 13px;
|
||||||
}
|
}
|
||||||
.oe_pick_widget .oe_searchbox input{
|
.oe_pick_widget .oe_searchbox input{
|
||||||
padding: 8px;
|
padding: 8px;
|
||||||
|
|
|
@ -54,6 +54,9 @@ function openerp_picking_widgets(instance){
|
||||||
console.log('Id:',id);
|
console.log('Id:',id);
|
||||||
self.getParent().scan_product_id(id);
|
self.getParent().scan_product_id(id);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
//remove navigtion bar from default openerp GUI
|
||||||
|
$('td.navbar').html('<div></div>');
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
|
||||||
|
@ -159,7 +162,7 @@ function openerp_picking_widgets(instance){
|
||||||
}
|
}
|
||||||
self.pickings_by_type[0] = [];
|
self.pickings_by_type[0] = [];
|
||||||
|
|
||||||
return new instance.web.Model('stock.picking').call('search_read',[ [['state','in',['confirmed','assigned']]], [] ], {context: new instance.web.CompoundContext()});
|
return new instance.web.Model('stock.picking').call('search_read',[ [['state','in', ['assigned', 'partially_available']]], [] ], {context: new instance.web.CompoundContext()});
|
||||||
|
|
||||||
}).then(function(pickings){
|
}).then(function(pickings){
|
||||||
self.pickings = pickings;
|
self.pickings = pickings;
|
||||||
|
@ -182,6 +185,8 @@ function openerp_picking_widgets(instance){
|
||||||
this.$('.oe_searchbox input').keyup(function(event){
|
this.$('.oe_searchbox input').keyup(function(event){
|
||||||
self.on_searchbox($(this).val());
|
self.on_searchbox($(this).val());
|
||||||
});
|
});
|
||||||
|
//remove navigtion bar from default openerp GUI
|
||||||
|
$('td.navbar').html('<div></div>');
|
||||||
},
|
},
|
||||||
start: function(){
|
start: function(){
|
||||||
this._super();
|
this._super();
|
||||||
|
@ -294,7 +299,6 @@ function openerp_picking_widgets(instance){
|
||||||
this.packages = null;
|
this.packages = null;
|
||||||
this.barcode_scanner = new module.BarcodeScanner();
|
this.barcode_scanner = new module.BarcodeScanner();
|
||||||
this.picking_type_id = params.context.active_id || 0;
|
this.picking_type_id = params.context.active_id || 0;
|
||||||
|
|
||||||
|
|
||||||
if(params.context.picking_id){
|
if(params.context.picking_id){
|
||||||
this.loaded = this.load(params.context.picking_id);
|
this.loaded = this.load(params.context.picking_id);
|
||||||
|
@ -312,7 +316,6 @@ function openerp_picking_widgets(instance){
|
||||||
|
|
||||||
function load_picking_list(type_id){
|
function load_picking_list(type_id){
|
||||||
var pickings = new $.Deferred();
|
var pickings = new $.Deferred();
|
||||||
|
|
||||||
new instance.web.Model('stock.picking')
|
new instance.web.Model('stock.picking')
|
||||||
.call('get_next_picking_for_ui',[{'default_picking_type_id':type_id}])
|
.call('get_next_picking_for_ui',[{'default_picking_type_id':type_id}])
|
||||||
.then(function(picking_ids){
|
.then(function(picking_ids){
|
||||||
|
@ -322,7 +325,7 @@ function openerp_picking_widgets(instance){
|
||||||
buttons: [{
|
buttons: [{
|
||||||
text:_t('Ok'),
|
text:_t('Ok'),
|
||||||
click: function(){
|
click: function(){
|
||||||
self.quit();
|
self.menu();
|
||||||
}
|
}
|
||||||
}]
|
}]
|
||||||
}, _t('<p>We could not find a picking to display.</p>'))).open();
|
}, _t('<p>We could not find a picking to display.</p>'))).open();
|
||||||
|
@ -356,6 +359,7 @@ function openerp_picking_widgets(instance){
|
||||||
})
|
})
|
||||||
.then(function(picking){
|
.then(function(picking){
|
||||||
self.picking = picking;
|
self.picking = picking;
|
||||||
|
self.picking_type_id = picking.picking_type_id[0];
|
||||||
loaded_picking.resolve();
|
loaded_picking.resolve();
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
@ -395,10 +399,12 @@ function openerp_picking_widgets(instance){
|
||||||
this.barcode_scanner.connect(function(ean){
|
this.barcode_scanner.connect(function(ean){
|
||||||
self.scan(ean);
|
self.scan(ean);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
||||||
this.$('.js_pick_quit').click(function(){ self.quit(); });
|
this.$('.js_pick_quit').click(function(){ self.quit(); });
|
||||||
this.$('.js_pick_pack').click(function(){ self.pack(); });
|
this.$('.js_pick_pack').click(function(){ self.pack(); });
|
||||||
this.$('.js_pick_done').click(function(){ self.done(); });
|
this.$('.js_pick_done').click(function(){ self.done(); });
|
||||||
|
this.$('.js_pick_print').click(function(){ self.print_picking(); });
|
||||||
this.$('.js_pick_prev').click(function(){ self.picking_prev(); });
|
this.$('.js_pick_prev').click(function(){ self.picking_prev(); });
|
||||||
this.$('.js_pick_next').click(function(){ self.picking_next(); });
|
this.$('.js_pick_next').click(function(){ self.picking_next(); });
|
||||||
this.$('.js_pick_menu').click(function(){ self.menu(); });
|
this.$('.js_pick_menu').click(function(){ self.menu(); });
|
||||||
|
@ -439,8 +445,6 @@ function openerp_picking_widgets(instance){
|
||||||
|
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
||||||
return this._super();
|
|
||||||
},
|
},
|
||||||
// reloads the data from the provided picking and refresh the ui.
|
// reloads the data from the provided picking and refresh the ui.
|
||||||
// (if no picking_id is provided, gets the first picking in the db)
|
// (if no picking_id is provided, gets the first picking in the db)
|
||||||
|
@ -463,15 +467,14 @@ function openerp_picking_widgets(instance){
|
||||||
}else{
|
}else{
|
||||||
self.$('.js_pick_next').removeClass('oe_disabled');
|
self.$('.js_pick_next').removeClass('oe_disabled');
|
||||||
}
|
}
|
||||||
|
|
||||||
self.$('.oe_pick_app_header').text(self.get_header());
|
self.$('.oe_pick_app_header').text(self.get_header());
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
get_header: function(){
|
get_header: function(){
|
||||||
if(this.picking){
|
if(this.picking){
|
||||||
return _t('Picking:') +' '+this.picking.name;
|
return this.picking.name;
|
||||||
}else{
|
}else{
|
||||||
return _t('Picking:');
|
return '';
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
menu: function(){
|
menu: function(){
|
||||||
|
@ -515,9 +518,14 @@ function openerp_picking_widgets(instance){
|
||||||
done: function(){
|
done: function(){
|
||||||
var self = this;
|
var self = this;
|
||||||
new instance.web.Model('stock.picking')
|
new instance.web.Model('stock.picking')
|
||||||
.call('action_done_from_ui',[self.picking.id])
|
.call('action_done_from_ui',[self.picking.id, {'default_picking_type_id': self.picking_type_id}])
|
||||||
.then(function(new_picking_id){
|
.then(function(new_picking_ids){
|
||||||
return self.refresh_ui(new_picking_id);
|
if (new_picking_ids){
|
||||||
|
return self.refresh_ui(new_picking_ids[0]);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
print_package: function(package_id){
|
print_package: function(package_id){
|
||||||
|
@ -528,6 +536,26 @@ function openerp_picking_widgets(instance){
|
||||||
return self.do_action(action);
|
return self.do_action(action);
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
|
print_picking: function(){
|
||||||
|
var self = this;
|
||||||
|
new instance.web.Model('stock.picking.type').call('read', [[self.picking_type_id], ['code'], new instance.web.CompoundContext()])
|
||||||
|
.then(function(pick_type){
|
||||||
|
console.log('self.picking_type_id.code '+pick_type[0]['code']);
|
||||||
|
if (pick_type[0]['code'] == 'outgoing'){
|
||||||
|
new instance.web.Model('stock.picking').call('do_print_delivery',[[self.picking.id]])
|
||||||
|
.then(function(action){
|
||||||
|
return self.do_action(action);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
console.log('self.picking_id '+picking_id);
|
||||||
|
new instance.web.Model('stock.picking').call('do_print_picking',[[self.picking.id]])
|
||||||
|
.then(function(action){
|
||||||
|
return self.do_action(action);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
});
|
||||||
|
},
|
||||||
picking_next: function(){
|
picking_next: function(){
|
||||||
for(var i = 0; i < this.pickings.length; i++){
|
for(var i = 0; i < this.pickings.length; i++){
|
||||||
if(this.pickings[i] === this.picking.id){
|
if(this.pickings[i] === this.picking.id){
|
||||||
|
@ -734,3 +762,11 @@ function openerp_picking_widgets(instance){
|
||||||
});
|
});
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
openerp.stock = function(openerp) {
|
||||||
|
openerp.stock = openerp.stock || {};
|
||||||
|
openerp_picking_widgets(openerp);
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
|
@ -175,11 +175,14 @@
|
||||||
<table class='oe_pick_layout'>
|
<table class='oe_pick_layout'>
|
||||||
<tr class='oe_pick_header_row'>
|
<tr class='oe_pick_header_row'>
|
||||||
<td class='oe_pick_header'>
|
<td class='oe_pick_header'>
|
||||||
|
|
||||||
<div class='oe_pick_right_toolbar'>
|
<div class='oe_pick_right_toolbar'>
|
||||||
<div class='oe_pick_button js_pick_quit'> Quit </div>
|
<div class='oe_pick_button js_pick_quit'> Quit </div>
|
||||||
</div>
|
</div>
|
||||||
|
<div class='oe_pick_toolbar'>
|
||||||
|
<div class='oe_searchbox oe_left'>
|
||||||
|
<input type='text' placeholder='Search'/>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
</td>
|
</td>
|
||||||
</tr>
|
</tr>
|
||||||
<tr class='oe_pick_body_row'>
|
<tr class='oe_pick_body_row'>
|
||||||
|
@ -187,10 +190,6 @@
|
||||||
<div class='oe_pick_body'>
|
<div class='oe_pick_body'>
|
||||||
<div class='oe_pick_app'>
|
<div class='oe_pick_app'>
|
||||||
|
|
||||||
<div class='oe_searchbox'>
|
|
||||||
<input type='text' placeholder='Search'/>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<h3 class='oe_pick_app_title'>Pickings</h3>
|
<h3 class='oe_pick_app_title'>Pickings</h3>
|
||||||
|
|
||||||
<div class='oe_picking_not_found oe_hidden'>
|
<div class='oe_picking_not_found oe_hidden'>
|
||||||
|
@ -208,7 +207,7 @@
|
||||||
<div t-att-class="'oe_picking ' + (widget.pickings_by_type[type.id].length === 0 ? 'oe_empty':'js_pick_last') "
|
<div t-att-class="'oe_picking ' + (widget.pickings_by_type[type.id].length === 0 ? 'oe_empty':'js_pick_last') "
|
||||||
t-att-data-id="type.id">
|
t-att-data-id="type.id">
|
||||||
|
|
||||||
<span class='oe_picking_name'><t t-esc="type.name" /></span>
|
<span class='oe_picking_name'><t t-esc="type.complete_name" /></span>
|
||||||
<t t-if="widget.pickings_by_type[type.id].length === 0">
|
<t t-if="widget.pickings_by_type[type.id].length === 0">
|
||||||
<span class='oe_pick_app_info'>Nothing to do</span>
|
<span class='oe_pick_app_info'>Nothing to do</span>
|
||||||
</t>
|
</t>
|
||||||
|
@ -229,22 +228,19 @@
|
||||||
</div>
|
</div>
|
||||||
</t>
|
</t>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
<t t-name="PickingMainWidget">
|
<t t-name="PickingMainWidget">
|
||||||
<div class='oe_pick_widget'>
|
<div class='oe_pick_widget'>
|
||||||
<table class='oe_pick_layout'>
|
<table class='oe_pick_layout'>
|
||||||
<tr class='oe_pick_header_row'>
|
<tr class='oe_pick_header_row'>
|
||||||
<td class='oe_pick_header'>
|
<td class='oe_pick_header'>
|
||||||
|
|
||||||
<div class='oe_pick_right_toolbar'>
|
<div class='oe_pick_right_toolbar'>
|
||||||
<div class='oe_pick_button js_pick_menu'> Menu </div>
|
<div class='oe_pick_button js_pick_menu'> Menu </div>
|
||||||
<div class='oe_pick_button js_pick_quit'> Quit </div>
|
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class='oe_pick_toolbar'>
|
<div class='oe_pick_toolbar'>
|
||||||
<div class='oe_pick_button oe_small oe_disabled oe_left js_pick_prev'><</div>
|
<div class='oe_pick_button oe_disabled js_pick_prev'>< Previous</div>
|
||||||
<div class='oe_pick_button js_pick_pack'> Pack </div>
|
<div class='oe_pick_button oe_disabled js_pick_next'>Next ></div>
|
||||||
<div class='oe_pick_button js_pick_done'> Done </div>
|
|
||||||
<div class='oe_pick_button oe_small oe_disabled oe_right js_pick_next'>></div>
|
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
</td>
|
</td>
|
||||||
|
@ -253,10 +249,13 @@
|
||||||
<td class='oe_pick_body_cont'>
|
<td class='oe_pick_body_cont'>
|
||||||
<div class='oe_pick_body'>
|
<div class='oe_pick_body'>
|
||||||
<div class='oe_pick_app'>
|
<div class='oe_pick_app'>
|
||||||
|
<div class='oe_pick_button js_pick_done'> Done </div>
|
||||||
|
<div class='oe_pick_button js_pick_print'> Print </div>
|
||||||
<div class='oe_pick_app_header'>
|
<div class='oe_pick_app_header'>
|
||||||
<t t-esc='widget.get_header()' />
|
<t t-esc='widget.get_header()' />
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
<div class='oe_pick_button js_pick_pack'> Put in Pack </div>
|
||||||
<div class='oe_placeholder_picking_editor'></div>
|
<div class='oe_placeholder_picking_editor'></div>
|
||||||
<div class='oe_placeholder_package_editor'></div>
|
<div class='oe_placeholder_package_editor'></div>
|
||||||
<div class='oe_placeholder_package_selector'></div>
|
<div class='oe_placeholder_package_selector'></div>
|
||||||
|
|
|
@ -596,7 +596,7 @@ class stock_picking(osv.osv):
|
||||||
_name = "stock.picking"
|
_name = "stock.picking"
|
||||||
_inherit = ['mail.thread']
|
_inherit = ['mail.thread']
|
||||||
_description = "Picking List"
|
_description = "Picking List"
|
||||||
_order = "priority desc, date desc, id desc"
|
_order = "priority desc, date asc, id desc"
|
||||||
|
|
||||||
def _set_min_date(self, cr, uid, id, field, value, arg, context=None):
|
def _set_min_date(self, cr, uid, id, field, value, arg, context=None):
|
||||||
move_obj = self.pool.get("stock.move")
|
move_obj = self.pool.get("stock.move")
|
||||||
|
@ -1129,13 +1129,13 @@ class stock_picking(osv.osv):
|
||||||
""" returns the next pickings to process. Used in the barcode scanner UI"""
|
""" returns the next pickings to process. Used in the barcode scanner UI"""
|
||||||
if context is None:
|
if context is None:
|
||||||
context = {}
|
context = {}
|
||||||
domain = [('state', 'in', ('confirmed', 'assigned'))]
|
domain = [('state', 'in', ('assigned', 'partially_available'))]
|
||||||
if context.get('default_picking_type_id'):
|
if context.get('default_picking_type_id'):
|
||||||
domain.append(('picking_type_id', '=', context['default_picking_type_id']))
|
domain.append(('picking_type_id', '=', context['default_picking_type_id']))
|
||||||
return self.search(cr, uid, domain, context=context)
|
return self.search(cr, uid, domain, context=context)
|
||||||
|
|
||||||
def action_done_from_ui(self, cr, uid, picking_id, context=None):
|
def action_done_from_ui(self, cr, uid, picking_id, context=None):
|
||||||
""" called when button 'done' in pused in the barcode scanner UI """
|
""" called when button 'done' is pushed in the barcode scanner UI """
|
||||||
self.do_transfer(cr, uid, [picking_id], context=context)
|
self.do_transfer(cr, uid, [picking_id], context=context)
|
||||||
#return id of next picking to work on
|
#return id of next picking to work on
|
||||||
return self.get_next_picking_for_ui(cr, uid, context=context)
|
return self.get_next_picking_for_ui(cr, uid, context=context)
|
||||||
|
@ -3622,39 +3622,6 @@ class stock_picking_type(osv.osv):
|
||||||
_description = "The picking type determines the picking view"
|
_description = "The picking type determines the picking view"
|
||||||
_order = 'sequence'
|
_order = 'sequence'
|
||||||
|
|
||||||
def __get_bar_values(self, cr, uid, obj, domain, read_fields, value_field, groupby_field, context=None):
|
|
||||||
""" Generic method to generate data for bar chart values using SparklineBarWidget.
|
|
||||||
This method performs obj.read_group(cr, uid, domain, read_fields, groupby_field).
|
|
||||||
|
|
||||||
:param obj: the target model (i.e. crm_lead)
|
|
||||||
:param domain: the domain applied to the read_group
|
|
||||||
:param list read_fields: the list of fields to read in the read_group
|
|
||||||
:param str value_field: the field used to compute the value of the bar slice
|
|
||||||
:param str groupby_field: the fields used to group
|
|
||||||
|
|
||||||
:return list section_result: a list of dicts: [
|
|
||||||
{ 'value': (int) bar_column_value,
|
|
||||||
'tootip': (str) bar_column_tooltip,
|
|
||||||
}
|
|
||||||
]
|
|
||||||
"""
|
|
||||||
month_begin = date.today().replace(day=1)
|
|
||||||
section_result = [{
|
|
||||||
'value': 0,
|
|
||||||
'tooltip': (month_begin + relativedelta.relativedelta(months=i)).strftime('%B'),
|
|
||||||
} for i in range(-2, 2, 1)]
|
|
||||||
group_obj = obj.read_group(cr, uid, domain, read_fields, groupby_field, context=context)
|
|
||||||
for group in group_obj:
|
|
||||||
group_begin_date = datetime.strptime(group['__domain'][0][2], DEFAULT_SERVER_DATE_FORMAT)
|
|
||||||
month_delta = relativedelta.relativedelta(month_begin, group_begin_date)
|
|
||||||
section_result[-month_delta.months + 2] = {'value': group.get(value_field, 0), 'tooltip': group_begin_date.strftime('%B')}
|
|
||||||
inner_groupby = (group.get('__context', {})).get('group_by',[])
|
|
||||||
if inner_groupby:
|
|
||||||
groupby_picking = obj.read_group(cr, uid, group.get('__domain'), read_fields, inner_groupby, context=context)
|
|
||||||
for groupby in groupby_picking:
|
|
||||||
section_result[-month_delta.months + 2]['value'] = groupby.get(value_field, 0)
|
|
||||||
return section_result
|
|
||||||
|
|
||||||
def _get_tristate_values(self, cr, uid, ids, field_name, arg, context=None):
|
def _get_tristate_values(self, cr, uid, ids, field_name, arg, context=None):
|
||||||
picking_obj = self.pool.get('stock.picking')
|
picking_obj = self.pool.get('stock.picking')
|
||||||
res = dict.fromkeys(ids, [])
|
res = dict.fromkeys(ids, [])
|
||||||
|
@ -3672,24 +3639,6 @@ class stock_picking_type(osv.osv):
|
||||||
res[picking_type_id] = tristates
|
res[picking_type_id] = tristates
|
||||||
return res
|
return res
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
def _get_monthly_pickings(self, cr, uid, ids, field_name, arg, context=None):
|
|
||||||
obj = self.pool.get('stock.picking')
|
|
||||||
res = dict.fromkeys(ids, False)
|
|
||||||
month_begin = date.today().replace(day=1)
|
|
||||||
groupby_begin = (month_begin + relativedelta.relativedelta(months=-2)).strftime(DEFAULT_SERVER_DATE_FORMAT)
|
|
||||||
groupby_end = (month_begin + relativedelta.relativedelta(months=2)).strftime(DEFAULT_SERVER_DATE_FORMAT)
|
|
||||||
for id in ids:
|
|
||||||
created_domain = [
|
|
||||||
('picking_type_id', '=', id),
|
|
||||||
('state', '=', 'done'),
|
|
||||||
('date', '>=', groupby_begin),
|
|
||||||
('date', '<', groupby_end),
|
|
||||||
]
|
|
||||||
res[id] = self.__get_bar_values(cr, uid, obj, created_domain, ['date', 'picking_type_id'], 'picking_type_id_count', ['date', 'picking_type_id'], context=context)
|
|
||||||
return res
|
|
||||||
|
|
||||||
def _get_picking_count(self, cr, uid, ids, field_names, arg, context=None):
|
def _get_picking_count(self, cr, uid, ids, field_names, arg, context=None):
|
||||||
obj = self.pool.get('stock.picking')
|
obj = self.pool.get('stock.picking')
|
||||||
domains = {
|
domains = {
|
||||||
|
@ -3799,9 +3748,6 @@ class stock_picking_type(osv.osv):
|
||||||
'active': fields.boolean('Active'),
|
'active': fields.boolean('Active'),
|
||||||
|
|
||||||
# Statistics for the kanban view
|
# Statistics for the kanban view
|
||||||
'monthly_picking': fields.function(_get_monthly_pickings,
|
|
||||||
type='string',
|
|
||||||
string='Done Pickings per Month'),
|
|
||||||
'last_done_picking': fields.function(_get_tristate_values,
|
'last_done_picking': fields.function(_get_tristate_values,
|
||||||
type='string',
|
type='string',
|
||||||
string='Last 10 Done Pickings'),
|
string='Last 10 Done Pickings'),
|
||||||
|
|
|
@ -1494,9 +1494,6 @@
|
||||||
</div>
|
</div>
|
||||||
<div>
|
<div>
|
||||||
<a name="%(action_picking_tree)d" type="action">All Operations</a>
|
<a name="%(action_picking_tree)d" type="action">All Operations</a>
|
||||||
<!--<a name="%(action_picking_tree_done_grouped)d" type="action" class="oe_sparkline_bar_link">
|
|
||||||
<field name="monthly_picking" widget="sparkline_bar">Monthly Done Operations</field>
|
|
||||||
</a>-->
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="oe_picking_type_gauge">
|
<div class="oe_picking_type_gauge">
|
||||||
|
|
Loading…
Reference in New Issue