diff --git a/multi_barcodes_pos/__manifest__.py b/multi_barcodes_pos/__manifest__.py index 58e7e8f44..43f89875b 100644 --- a/multi_barcodes_pos/__manifest__.py +++ b/multi_barcodes_pos/__manifest__.py @@ -25,7 +25,7 @@ 'name': 'POS Product Multi Barcode', 'summary': """Allows to create multiple barcode for a single product""", 'description': """Allows to create multiple barcode for a single product""", - 'version': '16.0.1.0.1', + 'version': '16.0.1.0.2', 'author': 'Cybrosys Techno Solutions', 'company': 'Cybrosys Techno Solutions', 'maintainer': 'Cybrosys Techno Solutions', @@ -39,10 +39,12 @@ ], 'assets': { 'point_of_sale.assets': [ - 'multi_barcodes_pos/static/src/js/pos_scan.js' + 'multi_barcodes_pos/static/src/js/pos_scan.js', + 'multi_barcodes_pos/static/src/js/GlobalState.js', + 'multi_barcodes_pos/static/src/js/ProductsWidget.js', ], }, 'images': ['static/description/banner.png'], 'installable': True, 'auto_install': False, -} +} \ No newline at end of file diff --git a/multi_barcodes_pos/models/product_product.py b/multi_barcodes_pos/models/product_product.py index 66914ba52..036a1d0fa 100644 --- a/multi_barcodes_pos/models/product_product.py +++ b/multi_barcodes_pos/models/product_product.py @@ -80,10 +80,12 @@ class ProductMultiBarcode(models.Model): product_multi = fields.Many2one('product.product') template_multi = fields.Many2one('product.template') - _sql_constraints = [('field_unique', 'unique(multi_barcode)', 'Existing barcode is not allowed !'), ] + _sql_constraints = [('field_unique', 'unique(multi_barcode)', + 'Existing barcode is not allowed !'), ] def get_barcode_val(self, product): """returns barcode of record in self and product id""" + print(self.multi_barcode, product) return self.multi_barcode, product @@ -93,25 +95,31 @@ class PosSessions(models.Model): def _pos_ui_models_to_load(self): result = super()._pos_ui_models_to_load() new_model = 'multi.barcode.products' - result.append(new_model) + if new_model not in result: + result.append(new_model) return result + def _loader_params_multi_barcode_products(self): + record = { + 'search_params': { + 'fields': ['product_multi', 'multi_barcode'] + } + } + return record + def _loader_params_product_product(self): result = super()._loader_params_product_product() result['search_params']['fields'].append('product_multi_barcodes') return result def _get_pos_ui_multi_barcode_products(self, params): - return self.env['multi.barcode.products'].with_context( - **params['context']).search_read(**params['search_params']) - - def _loader_params_multi_barcode_products(self): - return { - 'search_params': { - - 'fields': [ - 'multi_barcode' - ], - }, - 'context': {'display_default_code': False}, - } + record = self.env['multi.barcode.products'].search_read( + **params['search_params']) + return record + + def _pos_data_process(self, loaded_data): + super()._pos_data_process(loaded_data) + context = {} + for rec in loaded_data['multi.barcode.products']: + context[rec['multi_barcode']] = rec['product_multi'][0] + loaded_data['multi_barcode'] = context \ No newline at end of file diff --git a/multi_barcodes_pos/static/src/js/GlobalState.js b/multi_barcodes_pos/static/src/js/GlobalState.js new file mode 100644 index 000000000..6cceb152f --- /dev/null +++ b/multi_barcodes_pos/static/src/js/GlobalState.js @@ -0,0 +1,11 @@ +//@odoo-module +import { PosGlobalState} from 'point_of_sale.models'; +import Registries from 'point_of_sale.Registries'; +const StockLotGlobalState = (PosGlobalState) => class StockLotGlobalState extends PosGlobalState { + async _processData(loadedData) { + await super._processData(...arguments); + this.db.product_by_lot = loadedData['multi.barcode.products']; + this.db.product_by_lot_id = loadedData['multi_barcode'] + } +} +Registries.Model.extend(PosGlobalState, StockLotGlobalState); \ No newline at end of file diff --git a/multi_barcodes_pos/static/src/js/ProductsWidget.js b/multi_barcodes_pos/static/src/js/ProductsWidget.js new file mode 100644 index 000000000..73dcb153b --- /dev/null +++ b/multi_barcodes_pos/static/src/js/ProductsWidget.js @@ -0,0 +1,38 @@ +odoo.define('pos_product_search_by_ref.product_product', function (require) { + 'use strict'; + const DB = require('point_of_sale.DB'); + var core = require('web.core'); + var utils = require('web.utils'); + DB.include({ + search_product_in_category: function(category_id, query){ + var old_query = query + try { + query = query.replace(/[\[\]\(\)\+\*\?\.\-\!\&\^\$\|\~\_\{\}\:\,\\\/]/g,'.'); + query = query.replace(/ /g,'.+'); + var re = RegExp("([0-9]+):.*?"+utils.unaccent(query),"gi"); + }catch(_e){ + return []; + } + var results = []; + for(var i = 0; i < this.limit; i++){ + var r = re.exec(this.category_search_string[category_id]); + if(r){ + var id = Number(r[1]); + const product = this.get_product_by_id(id); + if (!(product.active && product.available_in_pos)) continue; + results.push(product); + }else if(this.product_by_lot_id[old_query]){ + const product = this.get_product_by_id(this.product_by_lot_id[old_query]); + if (!(product.active && product.available_in_pos)) continue; + if(!results.includes(product)){ + results.push(product); + } + }else{ + break; + } + } + return results; + } + }) + return DB; +}); \ No newline at end of file diff --git a/multi_barcodes_pos/static/src/js/pos_scan.js b/multi_barcodes_pos/static/src/js/pos_scan.js index 8c60cf5ea..3bb981177 100644 --- a/multi_barcodes_pos/static/src/js/pos_scan.js +++ b/multi_barcodes_pos/static/src/js/pos_scan.js @@ -1,73 +1,73 @@ -odoo.define('multi_barcodes_pos.product', function (require) { +odoo.define('multi_barcodes_pos.product', function(require) { "use strict"; -var rpc = require('web.rpc'); -var models = require('point_of_sale.models'); -var DB = require('point_of_sale.DB'); -var utils = require('web.utils'); + var rpc = require('web.rpc'); + var models = require('point_of_sale.models'); + var DB = require('point_of_sale.DB'); + var utils = require('web.utils'); -const Registries = require('point_of_sale.Registries'); + const Registries = require('point_of_sale.Registries'); -DB.include({ + DB.include({ - init: function(options){ - this._super.apply(this, arguments); - }, - add_products: function(products){ - var stored_categories = this.product_by_category_id; - if(!products instanceof Array){ - products = [products]; - } - for(var i = 0, len = products.length; i < len; i++){ - var product = products[i]; - if (product.id in this.product_by_id) continue; - if (product.available_in_pos){ - var search_string = utils.unaccent(this._product_search_string(product)); - var categ_id = product.pos_categ_id ? product.pos_categ_id[0] : this.root_category_id; - product.product_tmpl_id = product.product_tmpl_id[0]; - if(!stored_categories[categ_id]){ - stored_categories[categ_id] = []; - } - stored_categories[categ_id].push(product.id); + init: function(options) { + this._super.apply(this, arguments); + }, + add_products: function(products) { + var stored_categories = this.product_by_category_id; + if (!products instanceof Array) { + products = [products]; + } +// console.log(products.length) + for (var i = 0, len = products.length; i < len; i++) { + var product = products[i]; +// console.log(product) + if (product.id in this.product_by_id) continue; + if (product.available_in_pos) { + var search_string = utils.unaccent(this._product_search_string(product)); + var categ_id = product.pos_categ_id ? product.pos_categ_id[0] : this.root_category_id; + product.product_tmpl_id = product.product_tmpl_id[0]; + if (!stored_categories[categ_id]) { + stored_categories[categ_id] = []; + } + stored_categories[categ_id].push(product.id); - if(this.category_search_string[categ_id] === undefined){ - this.category_search_string[categ_id] = ''; - } - this.category_search_string[categ_id] += search_string; + if (this.category_search_string[categ_id] === undefined) { + this.category_search_string[categ_id] = ''; + } + this.category_search_string[categ_id] += search_string; - var ancestors = this.get_category_ancestors_ids(categ_id) || []; + var ancestors = this.get_category_ancestors_ids(categ_id) || []; - for(var j = 0, jlen = ancestors.length; j < jlen; j++){ - var ancestor = ancestors[j]; - if(! stored_categories[ancestor]){ - stored_categories[ancestor] = []; - } - stored_categories[ancestor].push(product.id); + for (var j = 0, jlen = ancestors.length; j < jlen; j++) { + var ancestor = ancestors[j]; + if (!stored_categories[ancestor]) { + stored_categories[ancestor] = []; + } + stored_categories[ancestor].push(product.id); - if( this.category_search_string[ancestor] === undefined){ - this.category_search_string[ancestor] = ''; + if (this.category_search_string[ancestor] === undefined) { + this.category_search_string[ancestor] = ''; + } + this.category_search_string[ancestor] += search_string; } - this.category_search_string[ancestor] += search_string; } - } - this.product_by_id[product.id] = product; - if(product.barcode){ - this.product_by_barcode[product.barcode] = product; - } - - for(var t=0;t < product.product_multi_barcodes.length;t++){ - var self = this; - rpc.query({ - model: 'multi.barcode.products', - method: 'get_barcode_val', - args: [product.product_multi_barcodes[t], product.id], - }).then(function (barcode_val) { + this.product_by_id[product.id] = product; + if (product.barcode) { + this.product_by_barcode[product.barcode] = product; + } + for (var t = 0; t < product.product_multi_barcodes.length; t++) { + var self = this; + rpc.query({ + model: 'multi.barcode.products', + method: 'get_barcode_val', + args: [product.product_multi_barcodes[t], product.id], + }).then(function(barcode_val) { + self.product_by_barcode[barcode_val[0]] = self.product_by_id[barcode_val[1]]; + }); + } - self.product_by_barcode[barcode_val[0]] = self.product_by_id[barcode_val[1]]; - }); } - - } - }, + }, }); - }); \ No newline at end of file +}); \ No newline at end of file