queries to server side

This commit is contained in:
Saurabh 2013-07-10 13:07:49 +05:30
parent 2e3c06e66d
commit f52dc07a58
10 changed files with 125 additions and 54 deletions

View File

@ -15,8 +15,11 @@
// along with this program. If not, see <http://www.gnu.org/licenses/>. // along with this program. If not, see <http://www.gnu.org/licenses/>.
cur_frm.set_query("default_account", function(doc) { cur_frm.set_query("default_account", function(doc) {
return erpnext.queries.account({ return{
account_type: "Bank or Cash", query: "controllers.queries.account_query",
company: doc.company filters: {
}); 'account_type': "Bank or Cash",
'company': doc.company
}
}
}); });

View File

@ -313,14 +313,16 @@ cur_frm.fields_dict['territory'].get_query = function(doc,cdt,cdn) {
// Income Account in Details Table // Income Account in Details Table
// -------------------------------- // --------------------------------
cur_frm.set_query("income_account", "entries", function(doc) { cur_frm.set_query("income_account", "entries", function(doc) {
return 'SELECT tabAccount.name FROM tabAccount WHERE (tabAccount.debit_or_credit="Credit" OR tabAccount.account_type = "Income Account") AND tabAccount.group_or_ledger="Ledger" AND tabAccount.docstatus!=2 AND tabAccount.company="'+doc.company+'" AND tabAccount.%(key)s LIKE "%s"'; return{
}) query: "accounts.doctype.sales_invoice.sales_invoice.get_income_account",
filters: {'company': doc.company}
}
});
// expense account // expense account
if (sys_defaults.auto_inventory_accounting) { if (sys_defaults.auto_inventory_accounting) {
cur_frm.fields_dict['entries'].grid.get_field('expense_account').get_query = function(doc) { cur_frm.fields_dict['entries'].grid.get_field('expense_account').get_query = function(doc) {
return { return {
// "query": "accounts.utils.get_account_list",
filters: { filters: {
'is_pl_account': 'Yes', 'is_pl_account': 'Yes',
'debit_or_credit': 'Debit', 'debit_or_credit': 'Debit',

View File

@ -984,3 +984,14 @@ def get_bank_cash_account(mode_of_payment):
return { return {
"cash_bank_account": val "cash_bank_account": val
} }
def get_income_account(doctype, txt, searchfield, start, page_len, filters):
from controllers.queries import get_match_cond
return webnotes.conn.sql("""select tabAccount.name from `tabAccount`
where (tabAccount.debit_or_credit="Credit"
or tabAccount.account_type = "Income Account")
and tabAccount.group_or_ledger="Ledger" and tabAccount.docstatus!=2
and tabAccount.company = '%(company)s' and tabAccount.%(key)s LIKE '%(txt)s'
%(mcond)s""" % {'company': filters['company'], 'key': searchfield,
'txt': "%%%s%%" % txt, 'mcond':get_match_cond(doctype, searchfield)})

View File

@ -28,27 +28,37 @@ erpnext.buying.BuyingController = erpnext.TransactionController.extend({
if(this.frm.fields_dict.price_list_name) { if(this.frm.fields_dict.price_list_name) {
this.frm.set_query("price_list_name", function() { this.frm.set_query("price_list_name", function() {
return repl("select name, currency from `tabPrice List` \ return{
where buying_or_selling = 'Buying' and name like \"%s%%\""); filters: { 'buying_or_selling': "Buying" }
}
}); });
this.frm.set_query("price_list_currency", function() { this.frm.set_query("price_list_currency", function() {
return repl("select distinct ref_currency from `tabItem Price` \ return{
where price_list_name=\"%(price_list_name)s\" and buying_or_selling = 'Buying' \ filters: {
and ref_currency like \"%s%%\"", 'price_list_name': me.frm.doc.price_list_name,
{price_list_name: me.frm.doc.price_list_name}); 'buying_or_selling': "Buying"
}
}
}); });
} }
if(this.frm.fields_dict.supplier) { if(this.frm.fields_dict.supplier) {
this.frm.set_query("supplier", erpnext.utils.supplier_query); this.frm.set_query("supplier", function() {
return{ query:"controllers.queries.supplier_query" }});
} }
this.frm.set_query("item_code", this.frm.cscript.fname, function() { this.frm.set_query("item_code", this.frm.cscript.fname, function() {
if(me.frm.doc.is_subcontracted == "Yes") { if(me.frm.doc.is_subcontracted == "Yes") {
return erpnext.queries.item({'ifnull(tabItem.is_sub_contracted_item, "No")': "Yes"}); return{
query:"controllers.queries.item_query",
filters:{ 'is_sub_contracted_item': 'Yes' }
}
} else { } else {
return erpnext.queries.item({'ifnull(tabItem.is_purchase_item, "No")': "Yes"}); return{
query:"controllers.queries.item_query",
filters:{ 'is_purchase_item': 'Yes' }
}
} }
}); });
}, },

View File

@ -20,7 +20,13 @@ import webnotes
def get_filters_cond(doctype, filters, conditions): def get_filters_cond(doctype, filters, conditions):
if filters: if filters:
if isinstance(filters, dict): if isinstance(filters, dict):
filters = map(lambda f: [doctype, f[0], "=", f[1]], filters.items()) filters = filters.items()
flt = []
for f in filters:
if f[1][0] == '!':
flt.append([doctype, f[0], '!=', f[1][1:]])
else:
flt.append([doctype, f[0], '=', f[1]])
from webnotes.widgets.reportview import build_filter_conditions from webnotes.widgets.reportview import build_filter_conditions
build_filter_conditions(filters, conditions) build_filter_conditions(filters, conditions)
@ -36,6 +42,7 @@ def get_match_cond(doctype, searchfield = 'name'):
from webnotes.widgets.reportview import build_match_conditions from webnotes.widgets.reportview import build_match_conditions
cond = build_match_conditions(doctype, fields) cond = build_match_conditions(doctype, fields)
if cond: if cond:
cond = ' and ' + cond cond = ' and ' + cond
else: else:
@ -81,10 +88,12 @@ def lead_query(doctype, txt, searchfield, start, page_len, filters):
# searches for customer # searches for customer
def customer_query(doctype, txt, searchfield, start, page_len, filters): def customer_query(doctype, txt, searchfield, start, page_len, filters):
cust_master_name = webnotes.defaults.get_user_default("cust_master_name") cust_master_name = webnotes.defaults.get_user_default("cust_master_name")
if cust_master_name == "Customer Name": if cust_master_name == "Customer Name":
fields = ["name", "customer_group", "territory"] fields = ["name", "customer_group", "territory"]
else: else:
fields = ["name", "customer_name", "customer_group", "territory"] fields = ["name", "customer_name", "customer_group", "territory"]
fields = ", ".join(fields) fields = ", ".join(fields)
return webnotes.conn.sql("""select %(field)s from `tabCustomer` where docstatus < 2 and return webnotes.conn.sql("""select %(field)s from `tabCustomer` where docstatus < 2 and
@ -142,6 +151,7 @@ def account_query(doctype, txt, searchfield, start, page_len, filters):
def item_query(doctype, txt, searchfield, start, page_len, filters): def item_query(doctype, txt, searchfield, start, page_len, filters):
conditions = [] conditions = []
return webnotes.conn.sql("""select tabItem.name, return webnotes.conn.sql("""select tabItem.name,
if(length(tabItem.item_name) > 40, if(length(tabItem.item_name) > 40,
concat(substr(tabItem.item_name, 1, 40), "..."), item_name) as item_name, concat(substr(tabItem.item_name, 1, 40), "..."), item_name) as item_name,
@ -158,6 +168,7 @@ def item_query(doctype, txt, searchfield, start, page_len, filters):
def bom(doctype, txt, searchfield, start, page_len, filters): def bom(doctype, txt, searchfield, start, page_len, filters):
conditions = [] conditions = []
return webnotes.conn.sql("""select tabBOM.name, tabBOM.item return webnotes.conn.sql("""select tabBOM.name, tabBOM.item
from tabBOM from tabBOM
where tabBOM.docstatus=1 and tabBOM.is_active=1 where tabBOM.docstatus=1 and tabBOM.is_active=1
@ -166,10 +177,6 @@ def bom(doctype, txt, searchfield, start, page_len, filters):
'fcond': get_filters_cond(doctype, filters, conditions), 'mcond':get_match_cond(doctype, searchfield), 'fcond': get_filters_cond(doctype, filters, conditions), 'mcond':get_match_cond(doctype, searchfield),
'start': start, 'page_len': page_len}) 'start': start, 'page_len': page_len})
# erpnext.queries.task = function() {
# return { query: "projects.utils.query_task" };
# };
def get_project_name(doctype, txt, searchfield, start, page_len, filters): def get_project_name(doctype, txt, searchfield, start, page_len, filters):
cond = '' cond = ''
if filters['customer']: if filters['customer']:

View File

@ -20,10 +20,16 @@ cur_frm.cscript.refresh = function(doc) {
} }
cur_frm.set_query("current_bom", function(doc) { cur_frm.set_query("current_bom", function(doc) {
return erpnext.queries.bom({name: "!" + doc.new_bom}); return{
query:"controllers.queries.bom",
filters: {name: "!" + doc.new_bom}
}
}); });
cur_frm.set_query("new_bom", function(doc) { cur_frm.set_query("new_bom", function(doc) {
return erpnext.queries.bom({name: "!" + doc.current_bom}); return{
query:"controllers.queries.bom",
filters: {name: "!" + doc.current_bom}
}
}); });

View File

@ -117,6 +117,9 @@ cur_frm.fields_dict['project_name'].get_query = function(doc, dt, dn) {
cur_frm.set_query("bom_no", function(doc) { cur_frm.set_query("bom_no", function(doc) {
if (doc.production_item) { if (doc.production_item) {
return erpnext.queries.bom({item: cstr(doc.production_item)}); return{
query:"controllers.queries.bom",
filters: {item: cstr(doc.production_item)}
}
} else msgprint(" Please enter Production Item first"); } else msgprint(" Please enter Production Item first");
}); });

View File

@ -2,8 +2,8 @@ wn.provide("erpnext.projects");
erpnext.projects.TimeLog = wn.ui.form.Controller.extend({ erpnext.projects.TimeLog = wn.ui.form.Controller.extend({
setup: function() { setup: function() {
this.frm.set_query("task", erpnext.queries.task); this.frm.set_query("task", function() {
} return { query: "projects.utils.query_task" }
}); });
cur_frm.cscript = new erpnext.projects.TimeLog({frm: cur_frm}); cur_frm.cscript = new erpnext.projects.TimeLog({frm: cur_frm});

View File

@ -36,33 +36,34 @@ erpnext.selling.SellingController = erpnext.TransactionController.extend({
} }
this.frm.set_query("customer_address", function() { this.frm.set_query("customer_address", function() {
return 'SELECT name, address_line1, city FROM tabAddress \ return {
WHERE customer = "'+ me.frm.doc.customer +'" AND docstatus != 2 AND \ filters: {'customer': me.frm.doc.customer }
%(key)s LIKE "%s" ORDER BY name ASC LIMIT 50'; }
}); });
this.frm.set_query("contact_person", function() { this.frm.set_query("contact_person", function() {
return 'SELECT name, CONCAT(first_name," ",ifnull(last_name,"")) As FullName, \ return {
department, designation FROM tabContact WHERE customer = "'+ me.frm.doc.customer + filters: {'customer': me.frm.doc.customer }
'" AND docstatus != 2 AND %(key)s LIKE "%s" ORDER BY name ASC LIMIT 50'; }
}); });
if(this.frm.fields_dict.charge) { if(this.frm.fields_dict.charge) {
this.frm.set_query("charge", function() { this.frm.set_query("charge", function() {
return 'SELECT DISTINCT `tabSales Taxes and Charges Master`.name FROM \ return {
`tabSales Taxes and Charges Master` \ filters: [
WHERE `tabSales Taxes and Charges Master`.company = "' + me.frm.doc.company + ['Sales Taxes and Charges Master', 'company', '=', me.frm.doc.company],
'" AND `tabSales Taxes and Charges Master`.company is not NULL \ ['Sales Taxes and Charges Master', 'company', 'is not', 'NULL'],
AND `tabSales Taxes and Charges Master`.docstatus != 2 \ ['Sales Taxes and Charges Master', 'docstatus', '!=', 2]
AND `tabSales Taxes and Charges Master`.%(key)s LIKE "%s" \ ]
ORDER BY `tabSales Taxes and Charges Master`.name LIMIT 50'; }
}); });
} }
this.frm.fields_dict.customer.get_query = function(doc,cdt,cdn) { this.frm.fields_dict.customer.get_query = function(doc,cdt,cdn) {
return{ query:"controllers.queries.customer_query" } } return{ query:"controllers.queries.customer_query" } }
this.frm.fields_dict.lead && this.frm.set_query("lead", erpnext.utils.lead_query); this.frm.fields_dict.lead && this.frm.set_query("lead", function(doc,cdt,cdn) {
return{ query:"controllers.queries.lead_query" } });
if(!this.fname) { if(!this.fname) {
return; return;
@ -71,8 +72,10 @@ erpnext.selling.SellingController = erpnext.TransactionController.extend({
if(this.frm.fields_dict[this.fname].grid.get_field('item_code')) { if(this.frm.fields_dict[this.fname].grid.get_field('item_code')) {
this.frm.set_query("item_code", this.fname, function() { this.frm.set_query("item_code", this.fname, function() {
return me.frm.doc.order_type === "Maintenance" ? return me.frm.doc.order_type === "Maintenance" ?
erpnext.queries.item({'ifnull(tabItem.is_service_item, "No")': "Yes"}) : { query:"controllers.queries.item_query",
erpnext.queries.item({'ifnull(tabItem.is_sales_item, "No")': "Yes"}); filters:{'is_service_item': 'Yes'}} :
{ query:"controllers.queries.item_query",
filters:{'is_sales_item': 'Yes' }} ;
}); });
} }
@ -83,18 +86,22 @@ erpnext.selling.SellingController = erpnext.TransactionController.extend({
wn.throw("Please enter Item Code to get batch no"); wn.throw("Please enter Item Code to get batch no");
} else { } else {
if(item.warehouse) { if(item.warehouse) {
return "select batch_no from `tabStock Ledger Entry` sle \ return {
where item_code = '" + item.item_code + query : "selling.doctype.sales_common.sales_common.get_batch_no",
"' and warehouse = '" + item.warehouse + filters: {
"' and ifnull(is_cancelled, 'No') = 'No' and batch_no like '%s' \ 'item_code': item.item_code,
and exists(select * from `tabBatch` where \ 'warehouse': item.warehouse,
name = sle.batch_no and expiry_date >= '" + me.frm.doc.posting_date + 'posting_date': me.frm.doc.posting_date
"' and docstatus != 2) group by batch_no having sum(actual_qty) > 0 \ }
order by batch_no desc limit 50"; }
} else { } else {
return "SELECT name FROM tabBatch WHERE docstatus != 2 AND item = '" + return{
item.item_code + "' and expiry_date >= '" + me.frm.doc.posting_date + query : "selling.doctype.sales_common.sales_common.get_batch_no",
"' AND name like '%s' ORDER BY name DESC LIMIT 50"; filters: {
'item': item.item_code,
'posting_date': me.frm.doc.posting_date
}
}
} }
} }
}); });

View File

@ -365,3 +365,25 @@ class DocType(TransactionBase):
dt = webnotes.conn.sql("select transaction_date from `tab%s` where name = '%s'" % (d.prevdoc_doctype, d.prevdoc_docname)) dt = webnotes.conn.sql("select transaction_date from `tab%s` where name = '%s'" % (d.prevdoc_doctype, d.prevdoc_docname))
d.prevdoc_date = (dt and dt[0][0]) and dt[0][0].strftime('%Y-%m-%d') or '' d.prevdoc_date = (dt and dt[0][0]) and dt[0][0].strftime('%Y-%m-%d') or ''
def get_batch_no(doctype, txt, searchfield, start, page_len, filters):
from controllers.queries import get_match_cond
if filters.has_key('warehouse'):
return webnotes.conn.sql("""select batch_no from `tabStock Ledger Entry` sle
where item_code = '%(item_code)s' and warehouse = '%(warehouse)s'
and ifnull(is_cancelled, 'No') = 'No' and batch_no like '%(txt)s'
and exists(select * from `tabBatch` where
name = sle.batch_no and expiry_date >= '%(posting_date)s'
and docstatus != 2) %(mcond)s
group by batch_no having sum(actual_qty) > 0
order by batch_no desc limit %(start)s, %(page_len)s
""" % {'item_code': filters['item_code'], 'warehouse': filters['warehouse'],
'posting_date': filters['posting_date'], 'txt': 'txt': "%%%s%%" % txt,
'mcond':get_match_cond(doctype, searchfield),'start': start, 'page_len': page_len})
else:
return webnotes.conn.sql("""select name from tabBatch where docstatus != 2
and item = '%(item_code)s' and expiry_date >= '%(posting_date)s'
and name like '%(txt)s' %(mcond)s ORDER BY name DESC LIMIT 50""" %
{'item_code': filters['item_code'], 'posting_date': filters['posting_date'],
'txt': 'txt': "%%%s%%" % txt, 'mcond':get_match_cond(doctype, searchfield),
'start': start, 'page_len': page_len})