feat: enable custom field search on POS (#25421)
* feat: multi lingual item search in POS * fix: limit the options for selection and broken down funtion for geting condition
This commit is contained in:
parent
7f1b2de74d
commit
df06e49e0c
@ -0,0 +1,37 @@
|
|||||||
|
{
|
||||||
|
"actions": [],
|
||||||
|
"creation": "2021-04-19 14:56:06.652327",
|
||||||
|
"doctype": "DocType",
|
||||||
|
"editable_grid": 1,
|
||||||
|
"engine": "InnoDB",
|
||||||
|
"field_order": [
|
||||||
|
"field",
|
||||||
|
"fieldname"
|
||||||
|
],
|
||||||
|
"fields": [
|
||||||
|
{
|
||||||
|
"fieldname": "fieldname",
|
||||||
|
"fieldtype": "Data",
|
||||||
|
"hidden": 1,
|
||||||
|
"label": "Fieldname"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"fieldname": "field",
|
||||||
|
"fieldtype": "Select",
|
||||||
|
"in_list_view": 1,
|
||||||
|
"label": "Field"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"index_web_pages_for_search": 1,
|
||||||
|
"istable": 1,
|
||||||
|
"links": [],
|
||||||
|
"modified": "2021-04-21 11:12:54.632093",
|
||||||
|
"modified_by": "Administrator",
|
||||||
|
"module": "Accounts",
|
||||||
|
"name": "POS Search Fields",
|
||||||
|
"owner": "Administrator",
|
||||||
|
"permissions": [],
|
||||||
|
"sort_field": "modified",
|
||||||
|
"sort_order": "DESC",
|
||||||
|
"track_changes": 1
|
||||||
|
}
|
@ -0,0 +1,10 @@
|
|||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
# Copyright (c) 2021, Frappe Technologies Pvt. Ltd. and contributors
|
||||||
|
# For license information, please see license.txt
|
||||||
|
|
||||||
|
from __future__ import unicode_literals
|
||||||
|
# import frappe
|
||||||
|
from frappe.model.document import Document
|
||||||
|
|
||||||
|
class POSSearchFields(Document):
|
||||||
|
pass
|
@ -1,9 +1,17 @@
|
|||||||
// Copyright (c) 2017, Frappe Technologies Pvt. Ltd. and contributors
|
// Copyright (c) 2017, Frappe Technologies Pvt. Ltd. and contributors
|
||||||
// For license information, please see license.txt
|
// For license information, please see license.txt
|
||||||
|
|
||||||
|
let search_fields_datatypes = ['Data', 'Link', 'Dynamic Link', 'Long Text', 'Select', 'Small Text', 'Text', 'Text Editor'];
|
||||||
|
let do_not_include_fields = ["naming_series", "item_code", "item_name", "stock_uom", "hub_sync_id", "asset_naming_series",
|
||||||
|
"default_material_request_type", "valuation_method", "warranty_period", "weight_uom", "batch_number_series",
|
||||||
|
"serial_no_series", "purchase_uom", "customs_tariff_number", "sales_uom", "deferred_revenue_account",
|
||||||
|
"deferred_expense_account", "quality_inspection_template", "route", "slideshow", "website_image_alt", "thumbnail",
|
||||||
|
"web_long_description", "hub_sync_id"]
|
||||||
|
|
||||||
frappe.ui.form.on('POS Settings', {
|
frappe.ui.form.on('POS Settings', {
|
||||||
onload: function(frm) {
|
onload: function(frm) {
|
||||||
frm.trigger("get_invoice_fields");
|
frm.trigger("get_invoice_fields");
|
||||||
|
frm.trigger("add_search_options");
|
||||||
},
|
},
|
||||||
|
|
||||||
get_invoice_fields: function(frm) {
|
get_invoice_fields: function(frm) {
|
||||||
@ -21,6 +29,38 @@ frappe.ui.form.on('POS Settings', {
|
|||||||
);
|
);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
},
|
||||||
|
|
||||||
|
add_search_options: function(frm) {
|
||||||
|
frappe.model.with_doctype("Item", () => {
|
||||||
|
var fields = $.map(frappe.get_doc("DocType", "Item").fields, function(d) {
|
||||||
|
if (search_fields_datatypes.includes(d.fieldtype) && !(do_not_include_fields.includes(d.fieldname))) {
|
||||||
|
return [d.label];
|
||||||
|
} else {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
fields.unshift('');
|
||||||
|
frm.fields_dict.pos_search_fields.grid.update_docfield_property('field', 'options', fields);
|
||||||
|
});
|
||||||
|
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
frappe.ui.form.on("POS Search Fields", {
|
||||||
|
field: function(frm, doctype, name) {
|
||||||
|
var doc = frappe.get_doc(doctype, name);
|
||||||
|
var df = $.map(frappe.get_doc("DocType", "Item").fields, function(d) {
|
||||||
|
if (doc.field == d.label && search_fields_datatypes.includes(d.fieldtype)) {
|
||||||
|
return d;
|
||||||
|
} else {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
})[0];
|
||||||
|
|
||||||
|
doc.fieldname = df.fieldname;
|
||||||
|
frm.refresh_field("fields");
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
@ -5,7 +5,8 @@
|
|||||||
"editable_grid": 1,
|
"editable_grid": 1,
|
||||||
"engine": "InnoDB",
|
"engine": "InnoDB",
|
||||||
"field_order": [
|
"field_order": [
|
||||||
"invoice_fields"
|
"invoice_fields",
|
||||||
|
"pos_search_fields"
|
||||||
],
|
],
|
||||||
"fields": [
|
"fields": [
|
||||||
{
|
{
|
||||||
@ -13,11 +14,17 @@
|
|||||||
"fieldtype": "Table",
|
"fieldtype": "Table",
|
||||||
"label": "POS Field",
|
"label": "POS Field",
|
||||||
"options": "POS Field"
|
"options": "POS Field"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"fieldname": "pos_search_fields",
|
||||||
|
"fieldtype": "Table",
|
||||||
|
"label": "POS Search Fields",
|
||||||
|
"options": "POS Search Fields"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"issingle": 1,
|
"issingle": 1,
|
||||||
"links": [],
|
"links": [],
|
||||||
"modified": "2020-06-01 15:46:41.478928",
|
"modified": "2021-04-19 14:56:24.465218",
|
||||||
"modified_by": "Administrator",
|
"modified_by": "Administrator",
|
||||||
"module": "Accounts",
|
"module": "Accounts",
|
||||||
"name": "POS Settings",
|
"name": "POS Settings",
|
||||||
|
@ -23,7 +23,7 @@ def get_items(start, page_length, price_list, item_group, pos_profile, search_va
|
|||||||
|
|
||||||
if search_value:
|
if search_value:
|
||||||
data = search_serial_or_batch_or_barcode_number(search_value)
|
data = search_serial_or_batch_or_barcode_number(search_value)
|
||||||
|
|
||||||
item_code = data.get("item_code") if data.get("item_code") else search_value
|
item_code = data.get("item_code") if data.get("item_code") else search_value
|
||||||
serial_no = data.get("serial_no") if data.get("serial_no") else ""
|
serial_no = data.get("serial_no") if data.get("serial_no") else ""
|
||||||
batch_no = data.get("batch_no") if data.get("batch_no") else ""
|
batch_no = data.get("batch_no") if data.get("batch_no") else ""
|
||||||
@ -31,7 +31,7 @@ def get_items(start, page_length, price_list, item_group, pos_profile, search_va
|
|||||||
|
|
||||||
if data:
|
if data:
|
||||||
item_info = frappe.db.get_value(
|
item_info = frappe.db.get_value(
|
||||||
"Item", data.get("item_code"),
|
"Item", data.get("item_code"),
|
||||||
["name as item_code", "item_name", "description", "stock_uom", "image as item_image", "is_stock_item"]
|
["name as item_code", "item_name", "description", "stock_uom", "image as item_image", "is_stock_item"]
|
||||||
, as_dict=1)
|
, as_dict=1)
|
||||||
item_info.setdefault('serial_no', serial_no)
|
item_info.setdefault('serial_no', serial_no)
|
||||||
@ -139,8 +139,24 @@ def get_conditions(item_code, serial_no, batch_no, barcode):
|
|||||||
if serial_no or batch_no or barcode:
|
if serial_no or batch_no or barcode:
|
||||||
return "item.name = {0}".format(frappe.db.escape(item_code))
|
return "item.name = {0}".format(frappe.db.escape(item_code))
|
||||||
|
|
||||||
return """(item.name like {item_code}
|
return make_condition(item_code)
|
||||||
or item.item_name like {item_code})""".format(item_code = frappe.db.escape('%' + item_code + '%'))
|
|
||||||
|
def make_condition(item_code):
|
||||||
|
condition = "("
|
||||||
|
condition += """item.name like {item_code}
|
||||||
|
or item.item_name like {item_code}""".format(item_code = frappe.db.escape('%' + item_code + '%'))
|
||||||
|
condition += add_search_fields_condition(item_code)
|
||||||
|
condition += ")"
|
||||||
|
|
||||||
|
return condition
|
||||||
|
|
||||||
|
def add_search_fields_condition(item_code):
|
||||||
|
condition = ''
|
||||||
|
search_fields = frappe.get_all('POS Search Fields', fields = ['fieldname'])
|
||||||
|
if search_fields:
|
||||||
|
for field in search_fields:
|
||||||
|
condition += " or item.{0} like {1}".format(field['fieldname'], frappe.db.escape('%' + item_code + '%'))
|
||||||
|
return condition
|
||||||
|
|
||||||
def get_item_group_condition(pos_profile):
|
def get_item_group_condition(pos_profile):
|
||||||
cond = "and 1=1"
|
cond = "and 1=1"
|
||||||
@ -257,4 +273,4 @@ def set_customer_info(fieldname, customer, value=""):
|
|||||||
elif fieldname == 'mobile_no':
|
elif fieldname == 'mobile_no':
|
||||||
contact_doc.set('phone_nos', [{ 'phone': value, 'is_primary_mobile_no': 1}])
|
contact_doc.set('phone_nos', [{ 'phone': value, 'is_primary_mobile_no': 1}])
|
||||||
frappe.db.set_value('Customer', customer, 'mobile_no', value)
|
frappe.db.set_value('Customer', customer, 'mobile_no', value)
|
||||||
contact_doc.save()
|
contact_doc.save()
|
||||||
|
Loading…
Reference in New Issue
Block a user