JS: set_query - ashish-greycube/help GitHub Wiki
Note :
- filter from direct doctype and filter from coding(set query from js file) are not working together.
Case 1 :
filter conditions are from only one doctype
i.e doctype: Stock Entry field : item_code conditions: is_stock_item = 1 & is_customer_provided_item = 1
Solution 1 :
stock_entry.js
frappe.ui.form.on("Stock Entry", {
onload: function(frm){
frm.set_query("item_code","items", function (doc,cdt,cdn){
if (frm.doc.stock_entry_type=="Handling Loss" || frm.doc.stock_entry_type=="Audit Shortage" || frm.doc.stock_entry_type=="Cargo Received") {
return {
filters: {
is_stock_item: 1,
is_customer_provided_item: 1
}
};
}else{
return {
filters: {
is_stock_item: 1
}
}
}
})
}
})
Solution 2 :
refresh: function(frm) {
frm.fields_dict['boq_items_cf'].grid.get_field('item_code').get_query = function(doc, cdt, cdn) {
var child = locals[cdt][cdn];
return {
filters:[
['Item', 'item_group', '=', child.item_group]
]
};
};
},
Case 2 :
filter conditions are from different doctype
i.e doctype : Rake Dispatch field : grade condition: show list of commidity which is mentioned in vessel's child table
Solution 1 :
rake_dispatch.js
frappe.ui.form.on("Rake Dispatch", {
setup(frm) {
frm.set_query("grade", "rake_prelim_entry", function (doc, cdt, cdn) {
let row = locals[cdt][cdn];
if (row.vcn_no) {
return {
query: "kict.kict.doctype.rake_dispatch.rake_dispatch.get_unique_grade_list",
filters: {
vessel_name: row.vcn_no
},
};
}
});
},
});
rake_dispatch.py
@frappe.whitelist()
@frappe.validate_and_sanitize_search_inputs
def get_unique_grade_list(doctype, txt, searchfield, start, page_len, filters):
vcn_no = filters.get("vessel_name")
return frappe.get_all(
"Vessel Details",
parent_doctype="Vessel",
filters={"parent": vcn_no,"grade": ("like", f"{txt}%")},
fields=["distinct grade"],
as_list=1,
)
or
@frappe.whitelist()
@frappe.validate_and_sanitize_search_inputs
def get_civil_employee(doctype, txt, searchfield, start, page_len, filters):
employee = frappe.db.get_all("Employee", filters={"status":"Active","name": ("like", f"{txt}%")}, fields=["name", "custom_contract_type"])
civil_employees = []
for emp in employee:
contract_type = frappe.db.get_value("Contract Type ST", emp.custom_contract_type, "contract")
if contract_type == "Civil":
employee_name = (emp.get('name'),)
civil_employees.append(employee_name)
else:
continue
return civil_employees
Solution 2 :
after set query, if do not able to filter values then..
journal_entry.js
frappe.ui.form.on("Journal Entry", {
onload: function (frm) {
frm.set_query("party", "accounts", function (doc, cdt, cdn) {
let query = "",
party_type = locals[cdt][cdn]["party_type"];
if (party_type == "Customer")
query = "happay.api.customer_query";
else if (party_type == "Supplier")
query = "happay.api.supplier_query";
return {
query: query,
filters: {
company: frm.doc.company,
},
};
});
},
});
journal_entry.py
@frappe.whitelist()
@frappe.validate_and_sanitize_search_inputs
def supplier_query(doctype, txt, searchfield, start, page_len, filters, as_dict=False):
doctype = "Supplier"
supp_master_name = frappe.defaults.get_user_default("supp_master_name")
fields = ["name"]
if supp_master_name != "Supplier Name":
fields.append("supplier_name")
fields = get_fields(doctype, fields)
return frappe.db.sql(
"""select {field} from `tabSupplier`
where docstatus < 2
and ({key} like %(txt)s
or supplier_name like %(txt)s) and disabled=0
and (on_hold = 0 or (on_hold = 1 and CURRENT_DATE > release_date))
{mcond}
order by
(case when locate(%(_txt)s, name) > 0 then locate(%(_txt)s, name) else 99999 end),
(case when locate(%(_txt)s, supplier_name) > 0 then locate(%(_txt)s, supplier_name) else 99999 end),
idx desc,
name, supplier_name
limit %(page_len)s offset %(start)s""".format(
**{"field": ", ".join(fields), "key": searchfield, "mcond": get_match_cond(doctype)}
),
{"txt": "%%%s%%" % txt, "_txt": txt.replace("%", ""), "start": start, "page_len": page_len},
as_dict=as_dict,
)
@frappe.whitelist()
@frappe.validate_and_sanitize_search_inputs
def customer_query(doctype, txt, searchfield, start, page_len, filters, as_dict=False):
doctype = "Customer"
conditions = []
cust_master_name = frappe.defaults.get_user_default("cust_master_name")
fields = ["name"]
if cust_master_name != "Customer Name":
fields.append("customer_name")
fields = get_fields(doctype, fields)
searchfields = frappe.get_meta(doctype).get_search_fields()
searchfields = " or ".join(field + " like %(txt)s" for field in searchfields)
return frappe.db.sql(
"""select {fields} from `tabCustomer`
where docstatus < 2
and ({scond}) and disabled=0
{fcond} {mcond}
order by
(case when locate(%(_txt)s, name) > 0 then locate(%(_txt)s, name) else 99999 end),
(case when locate(%(_txt)s, customer_name) > 0 then locate(%(_txt)s, customer_name) else 99999 end),
idx desc,
name, customer_name
limit %(page_len)s offset %(start)s""".format(
**{
"fields": ", ".join(fields),
"scond": searchfields,
"mcond": get_match_cond(doctype),
"fcond": get_filters_cond(doctype, filters, conditions).replace("%", "%%"),
}
),
{"txt": "%%%s%%" % txt, "_txt": txt.replace("%", ""), "start": start, "page_len": page_len},
as_dict=as_dict,
)