11 changed files with 405 additions and 0 deletions
@ -0,0 +1,23 @@ |
|||||
|
# -*- coding: utf-8 -*- |
||||
|
############################################################################## |
||||
|
# |
||||
|
# Cybrosys Technologies Pvt. Ltd. |
||||
|
# Copyright (C) 2017-TODAY Cybrosys Technologies(<https://www.cybrosys.com>). |
||||
|
# Author: Cybrosys Techno Solutions(<https://www.cybrosys.com>) |
||||
|
# you can modify it under the terms of the GNU LESSER |
||||
|
# GENERAL PUBLIC LICENSE (LGPL v3), Version 3. |
||||
|
# |
||||
|
# It is forbidden to publish, distribute, sublicense, or sell copies |
||||
|
# of the Software or modified copies of the Software. |
||||
|
# |
||||
|
# This program is distributed in the hope that it will be useful, |
||||
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of |
||||
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
||||
|
# GNU LESSER GENERAL PUBLIC LICENSE (LGPL v3) for more details. |
||||
|
# |
||||
|
# You should have received a copy of the GNU LESSER GENERAL PUBLIC LICENSE |
||||
|
# GENERAL PUBLIC LICENSE (LGPL v3) along with this program. |
||||
|
# If not, see <http://www.gnu.org/licenses/>. |
||||
|
# |
||||
|
############################################################################## |
||||
|
import models |
@ -0,0 +1,43 @@ |
|||||
|
# -*- coding: utf-8 -*- |
||||
|
############################################################################## |
||||
|
# |
||||
|
# Cybrosys Technologies Pvt. Ltd. |
||||
|
# Copyright (C) 2017-TODAY Cybrosys Technologies(<https://www.cybrosys.com>). |
||||
|
# Author: Cybrosys Techno Solutions(<https://www.cybrosys.com>) |
||||
|
# you can modify it under the terms of the GNU LESSER |
||||
|
# GENERAL PUBLIC LICENSE (LGPL v3), Version 3. |
||||
|
# |
||||
|
# It is forbidden to publish, distribute, sublicense, or sell copies |
||||
|
# of the Software or modified copies of the Software. |
||||
|
# |
||||
|
# This program is distributed in the hope that it will be useful, |
||||
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of |
||||
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
||||
|
# GNU LESSER GENERAL PUBLIC LICENSE (LGPL v3) for more details. |
||||
|
# |
||||
|
# You should have received a copy of the GNU LESSER GENERAL PUBLIC LICENSE |
||||
|
# GENERAL PUBLIC LICENSE (LGPL v3) along with this program. |
||||
|
# If not, see <http://www.gnu.org/licenses/>. |
||||
|
# |
||||
|
############################################################################## |
||||
|
{ |
||||
|
'name': 'POS Product Category Filter', |
||||
|
'version': '10.0.1.0.0', |
||||
|
'category': 'Point of Sale', |
||||
|
'author': 'Cybrosys Techno Solutions', |
||||
|
'company': 'Cybrosys Techno Solutions', |
||||
|
'website': 'http://www.cybrosys.com', |
||||
|
'sequence': 6, |
||||
|
'summary': 'Show Only Specified Categories of Product in Point of Sale ', |
||||
|
'description': """ |
||||
|
|
||||
|
======================= |
||||
|
|
||||
|
""", |
||||
|
'depends': ['point_of_sale'], |
||||
|
'images': ['static/description/banner.jpg'], |
||||
|
'data': ['views/category.xml', |
||||
|
'views/template.xml'], |
||||
|
'installable': True, |
||||
|
'auto_install': False, |
||||
|
} |
@ -0,0 +1,23 @@ |
|||||
|
# -*- coding: utf-8 -*- |
||||
|
############################################################################## |
||||
|
# |
||||
|
# Cybrosys Technologies Pvt. Ltd. |
||||
|
# Copyright (C) 2017-TODAY Cybrosys Technologies(<https://www.cybrosys.com>). |
||||
|
# Author: Cybrosys Techno Solutions(<https://www.cybrosys.com>) |
||||
|
# you can modify it under the terms of the GNU LESSER |
||||
|
# GENERAL PUBLIC LICENSE (LGPL v3), Version 3. |
||||
|
# |
||||
|
# It is forbidden to publish, distribute, sublicense, or sell copies |
||||
|
# of the Software or modified copies of the Software. |
||||
|
# |
||||
|
# This program is distributed in the hope that it will be useful, |
||||
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of |
||||
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
||||
|
# GNU LESSER GENERAL PUBLIC LICENSE (LGPL v3) for more details. |
||||
|
# |
||||
|
# You should have received a copy of the GNU LESSER GENERAL PUBLIC LICENSE |
||||
|
# GENERAL PUBLIC LICENSE (LGPL v3) along with this program. |
||||
|
# If not, see <http://www.gnu.org/licenses/>. |
||||
|
# |
||||
|
############################################################################## |
||||
|
import category |
@ -0,0 +1,29 @@ |
|||||
|
# -*- coding: utf-8 -*- |
||||
|
############################################################################## |
||||
|
# |
||||
|
# Cybrosys Technologies Pvt. Ltd. |
||||
|
# Copyright (C) 2017-TODAY Cybrosys Technologies(<https://www.cybrosys.com>). |
||||
|
# Author: Cybrosys Techno Solutions(<https://www.cybrosys.com>) |
||||
|
# you can modify it under the terms of the GNU LESSER |
||||
|
# GENERAL PUBLIC LICENSE (LGPL v3), Version 3. |
||||
|
# |
||||
|
# It is forbidden to publish, distribute, sublicense, or sell copies |
||||
|
# of the Software or modified copies of the Software. |
||||
|
# |
||||
|
# This program is distributed in the hope that it will be useful, |
||||
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of |
||||
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
||||
|
# GNU LESSER GENERAL PUBLIC LICENSE (LGPL v3) for more details. |
||||
|
# |
||||
|
# You should have received a copy of the GNU LESSER GENERAL PUBLIC LICENSE |
||||
|
# GENERAL PUBLIC LICENSE (LGPL v3) along with this program. |
||||
|
# If not, see <http://www.gnu.org/licenses/>. |
||||
|
# |
||||
|
############################################################################## |
||||
|
from odoo import models, fields |
||||
|
|
||||
|
|
||||
|
class PosProductCateg(models.Model): |
||||
|
_inherit = 'pos.config' |
||||
|
|
||||
|
available_categ = fields.Many2many('pos.category', string='Available Product Categories') |
After Width: | Height: | Size: 70 KiB |
After Width: | Height: | Size: 10 KiB |
@ -0,0 +1,57 @@ |
|||||
|
<section class="oe_container"> |
||||
|
<div class="oe_row oe_spaced"> |
||||
|
<h2 class="oe_slogan">Point of Sale : Setting Product Categories for POS</h2> |
||||
|
<h4 class="oe_slogan"><a href="https://www.cybrosys.com">Cybrosys Technologies</a> </h4> |
||||
|
<div> |
||||
|
<p class='oe_mt32'> |
||||
|
By installing this module, we can set available product categories for each POS in our system. |
||||
|
Only those categories set in the POS will be available in that particular POS. |
||||
|
</p> |
||||
|
</div> |
||||
|
</div> |
||||
|
</section> |
||||
|
|
||||
|
<section class="oe_container oe_dark"> |
||||
|
<div class="oe_row"> |
||||
|
<h4 class="oe_slogan">You can set it in POS form as: </h4> |
||||
|
<div> |
||||
|
<p class='oe_mt32'> |
||||
|
Point of sale > Configuration > Point of Sale > Available Product Categories. |
||||
|
</p> |
||||
|
</div> |
||||
|
<div> |
||||
|
<div class="oe_bg_img"> |
||||
|
<img class="oe_picture oe_screenshot" src="pos.png"> |
||||
|
</div> |
||||
|
</div> |
||||
|
</div> |
||||
|
</section> |
||||
|
|
||||
|
|
||||
|
<section class="oe_container oe_dark"> |
||||
|
<h2 class="oe_slogan" style="margin-top:20px;" >Need Any Help?</h2> |
||||
|
<div class="oe_slogan" style="margin-top:10px !important;"> |
||||
|
<div> |
||||
|
<a class="btn btn-primary btn-lg mt8" |
||||
|
style="color: #FFFFFF !important;border-radius: 0;" href="https://www.cybrosys.com"><i |
||||
|
class="fa fa-envelope"></i> Email </a> <a |
||||
|
class="btn btn-primary btn-lg mt8" style="color: #FFFFFF !important;border-radius: 0;" |
||||
|
href="https://www.cybrosys.com/contact/"><i |
||||
|
class="fa fa-phone"></i> Contact Us </a> <a |
||||
|
class="btn btn-primary btn-lg mt8" style="color: #FFFFFF !important;border-radius: 0;" |
||||
|
href="https://www.cybrosys.com/odoo-customization-and-installation/"><i |
||||
|
class="fa fa-check-square"></i> Request Customization </a> |
||||
|
</div> |
||||
|
<br> |
||||
|
<img src="cybro_logo.png" style="width: 190px; margin-bottom: 20px;" class="center-block"> |
||||
|
<div> |
||||
|
<a href="https://twitter.com/cybrosys" target="_blank"><i class="fa fa-2x fa-twitter" style="color:white;background: #00a0d1;width:35px;"></i></a></td> |
||||
|
<a href="https://www.linkedin.com/company/cybrosys-technologies-pvt-ltd" target="_blank"><i class="fa fa-2x fa-linkedin" style="color:white;background: #31a3d6;width:35px;padding-left: 3px;"></i></a></td> |
||||
|
<a href="https://www.facebook.com/cybrosystechnologies" target="_blank"><i class="fa fa-2x fa-facebook" style="color:white;background: #3b5998;width:35px;padding-left: 8px;"></i></a></td> |
||||
|
<a href="https://plus.google.com/106641282743045431892/about" target="_blank"><i class="fa fa-2x fa-google-plus" style="color:white;background: #c53c2c;width:35px;padding-left: 3px;"></i></a></td> |
||||
|
<a href="https://in.pinterest.com/cybrosys" target="_blank"><i class="fa fa-2x fa-pinterest" style="color:white;background: #ac0f18;width:35px;padding-left: 3px;"></i></a></td> |
||||
|
</div> |
||||
|
</div> |
||||
|
</section> |
||||
|
|
||||
|
|
After Width: | Height: | Size: 22 KiB |
@ -0,0 +1,203 @@ |
|||||
|
odoo.define('pos_product_category_filter.pos_product_category_filter', function (require) { |
||||
|
"use strict"; |
||||
|
var models = require('point_of_sale.models'); |
||||
|
var screens = require('point_of_sale.screens'); |
||||
|
var PosBaseWidget = require('point_of_sale.BaseWidget'); |
||||
|
var PosDB = require('point_of_sale.DB'); |
||||
|
var core = require('web.core'); |
||||
|
var gui = require('point_of_sale.gui'); |
||||
|
var Widget = require('web.Widget'); |
||||
|
var QWeb = core.qweb; |
||||
|
|
||||
|
var model1 = { |
||||
|
model: 'pos.category', |
||||
|
fields: ['id','name','parent_id','child_id','image'], |
||||
|
domain: null, |
||||
|
loaded: function(self, categories){ |
||||
|
for(var i = 0, len = categories.length; i < len; i++){ |
||||
|
categories[i].available = false; |
||||
|
for(var j = 0, jlen = self.config.available_categ.length; j < jlen; j++){ |
||||
|
if(categories[i].id == self.config.available_categ[j]){ |
||||
|
categories[i].available = true; |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
self.db.add_categories(categories); |
||||
|
}, |
||||
|
} |
||||
|
|
||||
|
for(var i=0; i< models.PosModel.prototype.models.length; i++){ |
||||
|
var model = models.PosModel.prototype.models[i]; |
||||
|
if(model.model === 'pos.category'){ |
||||
|
models.PosModel.prototype.models[i] = model1; |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
PosDB.include({ |
||||
|
add_categories: function(categories){ |
||||
|
var self = this; |
||||
|
if(!this.category_by_id[this.root_category_id]){ |
||||
|
this.category_by_id[this.root_category_id] = { |
||||
|
id : this.root_category_id, |
||||
|
name : 'Root', |
||||
|
}; |
||||
|
} |
||||
|
for(var i=0, len = categories.length; i < len; i++){ |
||||
|
if(categories[i].available === true){ |
||||
|
categories[i].parent_id = 0; |
||||
|
} |
||||
|
} |
||||
|
for(var i=0, len = categories.length; i < len; i++){ |
||||
|
this.category_by_id[categories[i].id] = categories[i]; |
||||
|
} |
||||
|
for(var i=0, len = categories.length; i < len; i++){ |
||||
|
|
||||
|
var cat = categories[i]; |
||||
|
var parent_id = cat.parent_id[0] || this.root_category_id; |
||||
|
this.category_parent[cat.id] = cat.parent_id[0]; |
||||
|
if(!this.category_childs[parent_id]){ |
||||
|
this.category_childs[parent_id] = []; |
||||
|
} |
||||
|
this.category_childs[parent_id].push(cat.id); |
||||
|
} |
||||
|
function make_ancestors(cat_id, ancestors){ |
||||
|
self.category_ancestors[cat_id] = ancestors; |
||||
|
ancestors = ancestors.slice(0); |
||||
|
ancestors.push(cat_id); |
||||
|
var childs = self.category_childs[cat_id] || []; |
||||
|
for(var i=0, len = childs.length; i < len; i++){ |
||||
|
make_ancestors(childs[i], ancestors); |
||||
|
} |
||||
|
} |
||||
|
make_ancestors(this.root_category_id, []); |
||||
|
|
||||
|
}, |
||||
|
|
||||
|
add_products: function(products){ |
||||
|
console.log(this.category_by_id); |
||||
|
var stored_categories = this.product_by_category_id; |
||||
|
for(var i = 0, len = products.length; i < len; i++){ |
||||
|
var ancestor_ids = this.get_category_ancestors_ids(products[i].pos_categ_id[0]); |
||||
|
products[i].pos_categ_ancestors = ancestor_ids; |
||||
|
} |
||||
|
for(var i = 0, len = products.length; i < len; i++){ |
||||
|
products[i].available = false; |
||||
|
var category = this.get_category_by_id(products[i].pos_categ_id[0]); |
||||
|
if(category && category.available == true){ |
||||
|
products[i].available = true; |
||||
|
}else{ |
||||
|
if(products[i].pos_categ_ancestors){ |
||||
|
for(var j = 0, jlen = products[i].pos_categ_ancestors.length; j < jlen; j++){ |
||||
|
var temp_categ = this.get_category_by_id(products[i].pos_categ_ancestors[j]) |
||||
|
if(temp_categ != 0 && temp_categ.available == true){ |
||||
|
products[i].available = true; |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
if(!products instanceof Array){ |
||||
|
products = [products]; |
||||
|
} |
||||
|
for(var i = 0, len = products.length; i < len; i++){ |
||||
|
var product = products[i]; |
||||
|
var search_string = 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; |
||||
|
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); |
||||
|
|
||||
|
if( this.category_search_string[ancestor] === undefined){ |
||||
|
this.category_search_string[ancestor] = ''; |
||||
|
} |
||||
|
this.category_search_string[ancestor] += search_string; |
||||
|
} |
||||
|
this.product_by_id[product.id] = product; |
||||
|
if(product.barcode){ |
||||
|
this.product_by_barcode[product.barcode] = product; |
||||
|
} |
||||
|
} |
||||
|
}, |
||||
|
}); |
||||
|
|
||||
|
screens.ProductCategoriesWidget.include({ |
||||
|
renderElement: function(){ |
||||
|
var db = this.pos.db; |
||||
|
var self = this; |
||||
|
var el_str = QWeb.render(this.template, {widget: this}); |
||||
|
var el_node = document.createElement('div'); |
||||
|
|
||||
|
el_node.innerHTML = el_str; |
||||
|
el_node = el_node.childNodes[1]; |
||||
|
|
||||
|
if(this.el && this.el.parentNode){ |
||||
|
this.el.parentNode.replaceChild(el_node,this.el); |
||||
|
} |
||||
|
|
||||
|
this.el = el_node; |
||||
|
|
||||
|
var withpics = this.pos.config.iface_display_categ_images; |
||||
|
|
||||
|
var list_container = el_node.querySelector('.category-list'); |
||||
|
if (list_container) { |
||||
|
if (!withpics) { |
||||
|
list_container.classList.add('simple'); |
||||
|
} else { |
||||
|
list_container.classList.remove('simple'); |
||||
|
} |
||||
|
for(var i = 0, len = this.subcategories.length; i < len; i++){ |
||||
|
if(this.subcategories[i].available == true){ |
||||
|
list_container.appendChild(this.render_category(this.subcategories[i],withpics)); |
||||
|
}else{ |
||||
|
var ancestor_ids = db.get_category_ancestors_ids(this.subcategories[i].id) |
||||
|
for(var j = 0, jlen = ancestor_ids.length; j < jlen; j++){ |
||||
|
if(ancestor_ids[j] != 0){ |
||||
|
var ancestor = db.get_category_by_id(ancestor_ids[j]) |
||||
|
if(ancestor.available == true){ |
||||
|
list_container.appendChild(this.render_category(this.subcategories[i],withpics)); |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
} |
||||
|
} |
||||
|
var buttons = el_node.querySelectorAll('.js-category-switch'); |
||||
|
for(var i = 0; i < buttons.length; i++){ |
||||
|
buttons[i].addEventListener('click',this.switch_category_handler); |
||||
|
} |
||||
|
var products = this.pos.db.get_product_by_category(this.category.id); |
||||
|
var available_products = []; |
||||
|
for(var i = 0, len = products.length; i < len; i++){ |
||||
|
if(products[i].available == true){ |
||||
|
available_products.push(products[i]); |
||||
|
} |
||||
|
} |
||||
|
this.product_list_widget.set_product_list(available_products); |
||||
|
|
||||
|
this.el.querySelector('.searchbox input').addEventListener('keypress',this.search_handler); |
||||
|
|
||||
|
this.el.querySelector('.searchbox input').addEventListener('keydown',this.search_handler); |
||||
|
|
||||
|
this.el.querySelector('.search-clear').addEventListener('click',this.clear_search_handler); |
||||
|
|
||||
|
if(this.pos.config.iface_vkeyboard && this.chrome.widget.keyboard){ |
||||
|
this.chrome.widget.keyboard.connect($(this.el.querySelector('.searchbox input'))); |
||||
|
} |
||||
|
}, |
||||
|
|
||||
|
}); |
||||
|
}); |
@ -0,0 +1,16 @@ |
|||||
|
<?xml version="1.0" encoding="utf-8"?> |
||||
|
<odoo> |
||||
|
<data> |
||||
|
<record id="pos_config_main_form_view2" model="ir.ui.view"> |
||||
|
<field name="name">pos.config.form.view.inherit</field> |
||||
|
<field name="model">pos.config</field> |
||||
|
<field name="inherit_id" ref="point_of_sale.view_pos_config_form"/> |
||||
|
<field name="arch" type="xml"> |
||||
|
<xpath expr="///field[@name='cash_control']" position="after"> |
||||
|
<field name="available_categ" widget="many2many_tags"></field> |
||||
|
</xpath> |
||||
|
|
||||
|
</field> |
||||
|
</record> |
||||
|
</data> |
||||
|
</odoo> |
@ -0,0 +1,11 @@ |
|||||
|
<?xml version="1.0" encoding="utf-8"?> |
||||
|
<odoo> |
||||
|
<data> |
||||
|
<template id="assets" inherit_id="point_of_sale.assets"> |
||||
|
<xpath expr="." position="inside"> |
||||
|
<script type="text/javascript" src="/pos_product_category_filter/static/src/js/category.js"></script> |
||||
|
</xpath> |
||||
|
</template> |
||||
|
|
||||
|
</data> |
||||
|
</odoo> |
Loading…
Reference in new issue