From a790ba05f4523b8da1f8f8a3b33fe8dfd7f68180 Mon Sep 17 00:00:00 2001 From: Nabin Hait Date: Mon, 8 Jun 2015 18:05:40 +0530 Subject: [PATCH 1/9] [fix] Item name, description should not be overwritten on saving of stock entry --- erpnext/stock/doctype/stock_entry/stock_entry.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/erpnext/stock/doctype/stock_entry/stock_entry.py b/erpnext/stock/doctype/stock_entry/stock_entry.py index e374b3b8623..da86432388a 100644 --- a/erpnext/stock/doctype/stock_entry/stock_entry.py +++ b/erpnext/stock/doctype/stock_entry/stock_entry.py @@ -112,7 +112,7 @@ class StockEntry(StockController): for f in ("uom", "stock_uom", "description", "item_name", "expense_account", "cost_center", "conversion_factor"): - if f not in ["expense_account", "cost_center"] or not item.get(f): + if f in ["stock_uom", "conversion_factor"] or not item.get(f): item.set(f, item_details.get(f)) if self.difference_account: From 909f0c38f180e097bdb529d6ca2704547a5e1fcf Mon Sep 17 00:00:00 2001 From: Nabin Hait Date: Tue, 9 Jun 2015 18:42:46 +0530 Subject: [PATCH 2/9] [report][enhancement] Payment period based on invoice date: show party columns and filter based on party --- .../doctype/journal_entry/journal_entry.py | 4 +- .../payment_period_based_on_invoice_date.js | 41 +++++++++------ .../payment_period_based_on_invoice_date.py | 50 +++++++++---------- 3 files changed, 51 insertions(+), 44 deletions(-) diff --git a/erpnext/accounts/doctype/journal_entry/journal_entry.py b/erpnext/accounts/doctype/journal_entry/journal_entry.py index efbd1e9cd90..3ba05963868 100644 --- a/erpnext/accounts/doctype/journal_entry/journal_entry.py +++ b/erpnext/accounts/doctype/journal_entry/journal_entry.py @@ -458,11 +458,11 @@ def get_default_bank_cash_account(company, voucher_type, mode_of_payment=None): if voucher_type=="Bank Entry": account = frappe.db.get_value("Company", company, "default_bank_account") if not account: - account = frappe.db.get_value("Account", {"company": company, "account_type": "Bank"}) + account = frappe.db.get_value("Account", {"company": company, "account_type": "Bank", "is_group": 0}) elif voucher_type=="Cash Entry": account = frappe.db.get_value("Company", company, "default_cash_account") if not account: - account = frappe.db.get_value("Account", {"company": company, "account_type": "Cash"}) + account = frappe.db.get_value("Account", {"company": company, "account_type": "Cash", "is_group": 0}) if account: return { diff --git a/erpnext/accounts/report/payment_period_based_on_invoice_date/payment_period_based_on_invoice_date.js b/erpnext/accounts/report/payment_period_based_on_invoice_date/payment_period_based_on_invoice_date.js index fd03cc35cae..952540ca2b9 100644 --- a/erpnext/accounts/report/payment_period_based_on_invoice_date/payment_period_based_on_invoice_date.js +++ b/erpnext/accounts/report/payment_period_based_on_invoice_date/payment_period_based_on_invoice_date.js @@ -3,6 +3,14 @@ frappe.query_reports["Payment Period Based On Invoice Date"] = { "filters": [ + { + fieldname:"company", + label: __("Company"), + fieldtype: "Link", + options: "Company", + reqd: 1, + default: frappe.defaults.get_user_default("company") + }, { fieldname: "from_date", label: __("From Date"), @@ -23,27 +31,28 @@ frappe.query_reports["Payment Period Based On Invoice Date"] = { default: "Incoming" }, { - fieldname:"account", - label: __("Account"), - fieldtype: "Link", - options: "Account", - get_query: function() { + "fieldname":"party_type", + "label": __("Party Type"), + "fieldtype": "Link", + "options": "DocType", + "get_query": function() { return { - query: "erpnext.controllers.queries.get_account_list", - filters: { - "report_type": "Balance Sheet", - company: frappe.query_report.filters_by_name.company.get_value() - } + filters: {"name": ["in", ["Customer", "Supplier"]]} } } }, { - fieldname:"company", - label: __("Company"), - fieldtype: "Link", - options: "Company", - reqd: 1, - default: frappe.defaults.get_user_default("company") + "fieldname":"party", + "label": __("Party"), + "fieldtype": "Dynamic Link", + "get_options": function() { + var party_type = frappe.query_report.filters_by_name.party_type.get_value(); + var party = frappe.query_report.filters_by_name.party.get_value(); + if(party && !party_type) { + frappe.throw(__("Please select Party Type first")); + } + return party_type; + } }, ] } diff --git a/erpnext/accounts/report/payment_period_based_on_invoice_date/payment_period_based_on_invoice_date.py b/erpnext/accounts/report/payment_period_based_on_invoice_date/payment_period_based_on_invoice_date.py index fdd6e1a27d9..bf5c4e5799c 100644 --- a/erpnext/accounts/report/payment_period_based_on_invoice_date/payment_period_based_on_invoice_date.py +++ b/erpnext/accounts/report/payment_period_based_on_invoice_date/payment_period_based_on_invoice_date.py @@ -20,16 +20,16 @@ def execute(filters=None): for d in entries: if d.against_voucher: against_date = d.against_voucher and invoice_posting_date_map[d.against_voucher] or "" - outstanding_amount = flt(d.debit) or -1 * flt(d.credit) + payment_amount = flt(d.debit) or -1 * flt(d.credit) else: against_date = d.against_invoice and invoice_posting_date_map[d.against_invoice] or "" - outstanding_amount = flt(d.credit) or -1 * flt(d.debit) + payment_amount = flt(d.credit) or -1 * flt(d.debit) - row = [d.name, d.account, d.posting_date, d.against_voucher or d.against_invoice, + row = [d.name, d.party_type, d.party, d.posting_date, d.against_voucher or d.against_invoice, against_date, d.debit, d.credit, d.cheque_no, d.cheque_date, d.remark] if d.against_voucher or d.against_invoice: - row += get_ageing_data(30, 60, 90, d.posting_date, against_date, outstanding_amount) + row += get_ageing_data(30, 60, 90, d.posting_date, against_date, payment_amount) else: row += ["", "", "", "", ""] @@ -38,7 +38,8 @@ def execute(filters=None): return columns, data def get_columns(): - return [_("Journal Entry") + ":Link/Journal Entry:140", _("Account") + ":Link/Account:140", + return [_("Journal Entry") + ":Link/Journal Entry:140", + _("Party Type") + ":Link/DocType:100", _("Party") + ":Dynamic Link/party_type:140", _("Posting Date") + ":Date:100", _("Against Invoice") + ":Link/Purchase Invoice:130", _("Against Invoice Posting Date") + ":Date:130", _("Debit") + ":Currency:120", _("Credit") + ":Currency:120", _("Reference No") + "::100", _("Reference Date") + ":Date:100", _("Remarks") + "::150", _("Age") +":Int:40", @@ -46,41 +47,38 @@ def get_columns(): ] def get_conditions(filters): - conditions = "" - party = None + conditions = [] - if filters.get("account"): - party = filters["account"] - else: - conditions += " and company = '%s'" % frappe.db.escape(filters["company"]) + if not filters.get("party_type"): + if filters.get("payment_type") == "Outgoing": + filters["party_type"] = "Supplier" + else: + filters["party_type"] = "Customer" + + if filters.get("party_type"): + conditions.append("jvd.party_type=%(party_type)s") - account_type = "Receivable" if filters.get("payment_type") == "Incoming" else "Payable" + if filters.get("party"): + conditions.append("jvd.party=%(party)s") - conditions += """ and account in - (select name from tabAccount - where account_type = '{0}' - and company='{1}')""".format(account_type, frappe.db.escape(filters["company"])) - - if party: - conditions += " and jvd.party = '%s'" % frappe.db.escape(party) - else: - conditions += " and ifnull(jvd.party, '') != ''" + if filters.get("company"): + conditions.append("jv.company=%(company)s") if filters.get("from_date"): - conditions += " and jv.posting_date >= '%s'" % filters["from_date"] + conditions.append("jv.posting_date >= %(from_date)s") if filters.get("to_date"): - conditions += " and jv.posting_date <= '%s'" % filters["to_date"] + conditions.append("jv.posting_date <= %(to_date)s") - return conditions + return "and {}".format(" and ".join(conditions)) if conditions else "" def get_entries(filters): conditions = get_conditions(filters) - entries = frappe.db.sql("""select jv.name, jvd.account, jv.posting_date, + entries = frappe.db.sql("""select jv.name, jvd.party_type, jvd.party, jv.posting_date, jvd.against_voucher, jvd.against_invoice, jvd.debit, jvd.credit, jv.cheque_no, jv.cheque_date, jv.remark from `tabJournal Entry Account` jvd, `tabJournal Entry` jv where jvd.parent = jv.name and jv.docstatus=1 %s order by jv.name DESC""" % - conditions, as_dict=1, debug=1) + conditions, filters, as_dict=1) return entries From bb429745c0f901044a28954e9a886612fa5a9a38 Mon Sep 17 00:00:00 2001 From: Nabin Hait Date: Tue, 9 Jun 2015 18:59:51 +0530 Subject: [PATCH 3/9] [fix] Blank option in naming series --- erpnext/setup/doctype/naming_series/naming_series.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/erpnext/setup/doctype/naming_series/naming_series.py b/erpnext/setup/doctype/naming_series/naming_series.py index 5105fcd795f..dc7a90cbb0b 100644 --- a/erpnext/setup/doctype/naming_series/naming_series.py +++ b/erpnext/setup/doctype/naming_series/naming_series.py @@ -49,7 +49,7 @@ class NamingSeries(Document): self.set_series_for(self.select_doc_for_series, series_list) # create series - map(self.insert_series, [d.split('.')[0] for d in series_list]) + map(self.insert_series, [d.split('.')[0] for d in series_list if d.strip()]) msgprint(_("Series Updated")) From 26f6752c1e1431d0258f7682887c89b8e93d24a5 Mon Sep 17 00:00:00 2001 From: Anand Doshi Date: Tue, 9 Jun 2015 16:33:46 -0400 Subject: [PATCH 4/9] POS - search by Item Group --- erpnext/accounts/doctype/sales_invoice/pos.py | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/erpnext/accounts/doctype/sales_invoice/pos.py b/erpnext/accounts/doctype/sales_invoice/pos.py index 60473781977..7d5613de273 100644 --- a/erpnext/accounts/doctype/sales_invoice/pos.py +++ b/erpnext/accounts/doctype/sales_invoice/pos.py @@ -7,6 +7,7 @@ import frappe @frappe.whitelist() def get_items(price_list, sales_or_purchase, item=None): condition = "" + order_by = "" args = {"price_list": price_list} if sales_or_purchase == "Sales": @@ -30,16 +31,25 @@ def get_items(price_list, sales_or_purchase, item=None): item_code[0]["barcode"] = item return item_code - condition += " and (CONCAT(i.name, i.item_name) like %(name)s or (i.variant_of like %(name)s))" + condition += " and ((CONCAT(i.name, i.item_name) like %(name)s) or (i.variant_of like %(name)s) or (i.item_group like %(name)s))" + order_by = """if(locate(%(_name)s, i.name), locate(%(_name)s, i.name), 99999), + if(locate(%(_name)s, i.item_name), locate(%(_name)s, i.item_name), 99999), + if(locate(%(_name)s, i.variant_of), locate(%(_name)s, i.variant_of), 99999), + if(locate(%(_name)s, i.item_group), locate(%(_name)s, i.item_group), 99999),""" args["name"] = "%%%s%%" % item + args["_name"] = item.replace("%", "") + # locate function is used to sort by closest match from the beginning of the value return frappe.db.sql("""select i.name, i.item_name, i.image, item_det.price_list_rate, item_det.currency from `tabItem` i LEFT JOIN (select item_code, price_list_rate, currency from - `tabItem Price` where price_list=%s) item_det + `tabItem Price` where price_list=%(price_list)s) item_det ON (item_det.item_code=i.name or item_det.item_code=i.variant_of) where ifnull(i.has_variants, 0) = 0 and - %s""" % ('%(price_list)s', condition), args, as_dict=1) + {condition} + order by + {order_by} + i.name""".format(condition=condition, order_by=order_by), args, as_dict=1) From 53d94996ad2744f695ba66334e482bf5bfbfba24 Mon Sep 17 00:00:00 2001 From: Nabin Hait Date: Wed, 10 Jun 2015 18:20:18 +0530 Subject: [PATCH 5/9] [fix] Query for Against Journal Entry --- erpnext/accounts/doctype/journal_entry/journal_entry.py | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/erpnext/accounts/doctype/journal_entry/journal_entry.py b/erpnext/accounts/doctype/journal_entry/journal_entry.py index 3ba05963868..831fcd74a62 100644 --- a/erpnext/accounts/doctype/journal_entry/journal_entry.py +++ b/erpnext/accounts/doctype/journal_entry/journal_entry.py @@ -538,15 +538,13 @@ def get_opening_accounts(company): def get_against_jv(doctype, txt, searchfield, start, page_len, filters): - if not filters.get("party"): - return [] return frappe.db.sql("""select jv.name, jv.posting_date, jv.user_remark from `tabJournal Entry` jv, `tabJournal Entry Account` jv_detail - where jv_detail.parent = jv.name and jv_detail.account = %s and jv_detail.party = %s + where jv_detail.parent = jv.name and jv_detail.account = %s and ifnull(jv_detail.party, '') = %s and (ifnull(jv_detail.against_invoice, '') = '' and ifnull(jv_detail.against_voucher, '') = '' and ifnull(jv_detail.against_jv, '') = '' ) and jv.docstatus = 1 and jv.{0} like %s order by jv.name desc limit %s, %s""".format(searchfield), - (filters["account"], filters["party"], "%{0}%".format(txt), start, page_len)) + (filters["account"], cstr(filters["party"]), "%{0}%".format(txt), start, page_len)) @frappe.whitelist() def get_outstanding(args): From b937fac3ce839d0349d793a68b6713706972d016 Mon Sep 17 00:00:00 2001 From: Nabin Hait Date: Wed, 10 Jun 2015 18:21:57 +0530 Subject: [PATCH 6/9] [report] Warehouse column added in 'Ordered Items to be Delivered' report --- .../ordered_items_to_be_delivered.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/erpnext/stock/report/ordered_items_to_be_delivered/ordered_items_to_be_delivered.json b/erpnext/stock/report/ordered_items_to_be_delivered/ordered_items_to_be_delivered.json index a32e3639ad4..3a18dafd8ea 100644 --- a/erpnext/stock/report/ordered_items_to_be_delivered/ordered_items_to_be_delivered.json +++ b/erpnext/stock/report/ordered_items_to_be_delivered/ordered_items_to_be_delivered.json @@ -5,12 +5,12 @@ "doctype": "Report", "idx": 1, "is_standard": "Yes", - "modified": "2015-04-07 08:18:14.440193", + "modified": "2015-06-10 15:52:49.492144", "modified_by": "Administrator", "module": "Stock", "name": "Ordered Items To Be Delivered", "owner": "Administrator", - "query": "select \n `tabSales Order`.`name` as \"Sales Order:Link/Sales Order:120\",\n `tabSales Order`.`customer` as \"Customer:Link/Customer:120\",\n `tabSales Order`.`transaction_date` as \"Date:Date\",\n `tabSales Order`.`project_name` as \"Project\",\n `tabSales Order Item`.item_code as \"Item:Link/Item:120\",\n `tabSales Order Item`.qty as \"Qty:Float:140\",\n `tabSales Order Item`.delivered_qty as \"Delivered Qty:Float:140\",\n (`tabSales Order Item`.qty - ifnull(`tabSales Order Item`.delivered_qty, 0)) as \"Qty to Deliver:Float:140\",\n `tabSales Order Item`.base_rate as \"Rate:Float:140\",\n `tabSales Order Item`.base_amount as \"Amount:Float:140\",\n ((`tabSales Order Item`.qty - ifnull(`tabSales Order Item`.delivered_qty, 0))*`tabSales Order Item`.base_rate) as \"Amount to Deliver:Float:140\",\n `tabBin`.actual_qty as \"Available Qty:Float:120\",\n `tabBin`.projected_qty as \"Projected Qty:Float:120\",\n `tabSales Order`.`delivery_date` as \"Expected Delivery Date:Date:120\",\n `tabSales Order Item`.item_name as \"Item Name::150\",\n `tabSales Order Item`.description as \"Description::200\",\n `tabSales Order Item`.item_group as \"Item Group:Link/Item Group:120\"\nfrom\n `tabSales Order`, `tabSales Order Item`, `tabBin`\nwhere\n `tabSales Order Item`.`parent` = `tabSales Order`.`name`\n and `tabSales Order`.docstatus = 1\n and `tabSales Order`.status != \"Stopped\"\n and ifnull(`tabSales Order Item`.delivered_qty,0) < ifnull(`tabSales Order Item`.qty,0)\n and `tabBin`.item_code = `tabSales Order Item`.item_code\n and `tabBin`.warehouse = `tabSales Order Item`.warehouse\norder by `tabSales Order`.transaction_date asc", + "query": "select \n `tabSales Order`.`name` as \"Sales Order:Link/Sales Order:120\",\n `tabSales Order`.`customer` as \"Customer:Link/Customer:120\",\n `tabSales Order`.`transaction_date` as \"Date:Date\",\n `tabSales Order`.`project_name` as \"Project\",\n `tabSales Order Item`.item_code as \"Item:Link/Item:120\",\n `tabSales Order Item`.qty as \"Qty:Float:140\",\n `tabSales Order Item`.delivered_qty as \"Delivered Qty:Float:140\",\n (`tabSales Order Item`.qty - ifnull(`tabSales Order Item`.delivered_qty, 0)) as \"Qty to Deliver:Float:140\",\n `tabSales Order Item`.base_rate as \"Rate:Float:140\",\n `tabSales Order Item`.base_amount as \"Amount:Float:140\",\n ((`tabSales Order Item`.qty - ifnull(`tabSales Order Item`.delivered_qty, 0))*`tabSales Order Item`.base_rate) as \"Amount to Deliver:Float:140\",\n `tabBin`.actual_qty as \"Available Qty:Float:120\",\n `tabBin`.projected_qty as \"Projected Qty:Float:120\",\n `tabSales Order`.`delivery_date` as \"Expected Delivery Date:Date:120\",\n `tabSales Order Item`.item_name as \"Item Name::150\",\n `tabSales Order Item`.description as \"Description::200\",\n `tabSales Order Item`.item_group as \"Item Group:Link/Item Group:120\",\n `tabSales Order Item`.warehouse as \"Warehouse:Link/Warehouse:200\"\nfrom\n `tabSales Order`, `tabSales Order Item`, `tabBin`\nwhere\n `tabSales Order Item`.`parent` = `tabSales Order`.`name`\n and `tabSales Order`.docstatus = 1\n and `tabSales Order`.status != \"Stopped\"\n and ifnull(`tabSales Order Item`.delivered_qty,0) < ifnull(`tabSales Order Item`.qty,0)\n and `tabBin`.item_code = `tabSales Order Item`.item_code\n and `tabBin`.warehouse = `tabSales Order Item`.warehouse\norder by `tabSales Order`.transaction_date asc", "ref_doctype": "Delivery Note", "report_name": "Ordered Items To Be Delivered", "report_type": "Query Report" From 43c1a9b50254d32320910f015b67465a05a5723c Mon Sep 17 00:00:00 2001 From: Nabin Hait Date: Wed, 10 Jun 2015 18:23:17 +0530 Subject: [PATCH 7/9] [fix] Quote url for item image in product listing page --- erpnext/setup/doctype/item_group/item_group.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/erpnext/setup/doctype/item_group/item_group.py b/erpnext/setup/doctype/item_group/item_group.py index 831095d6523..279ff0a264f 100644 --- a/erpnext/setup/doctype/item_group/item_group.py +++ b/erpnext/setup/doctype/item_group/item_group.py @@ -3,7 +3,7 @@ from __future__ import unicode_literals import frappe - +import urllib from frappe.utils.nestedset import NestedSet from frappe.website.website_generator import WebsiteGenerator from frappe.website.render import clear_cache @@ -91,7 +91,7 @@ def get_item_for_list_in_html(context): # add missing absolute link in files # user may forget it during upload if (context.get("website_image") or "").startswith("files/"): - context["website_image"] = "/" + context["website_image"] + context["website_image"] = "/" + urllib.quote(context["website_image"]) return frappe.get_template("templates/includes/product_in_grid.html").render(context) def get_group_item_count(item_group): From 1966225450e36921c283e46dfb896e86a8d41c94 Mon Sep 17 00:00:00 2001 From: Nabin Hait Date: Thu, 11 Jun 2015 15:31:23 +0530 Subject: [PATCH 8/9] [fix] load tasks in project via __setup__ instead of onload function, to return tasks via get_doc --- erpnext/projects/doctype/project/project.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/erpnext/projects/doctype/project/project.py b/erpnext/projects/doctype/project/project.py index c914f2285ac..37a8b1b967b 100644 --- a/erpnext/projects/doctype/project/project.py +++ b/erpnext/projects/doctype/project/project.py @@ -13,8 +13,9 @@ class Project(Document): def get_feed(self): return '{0}: {1}'.format(_(self.status), self.project_name) - def onload(self): + def __setup__(self): """Load project tasks for quick view""" + self.tasks = [] for task in frappe.get_all("Task", "*", {"project": self.name}, order_by="exp_start_date asc"): self.append("tasks", { "title": task.subject, From 9bdd1aa1ede6d6a2cdcd983d4ae19a5898f4c9d0 Mon Sep 17 00:00:00 2001 From: Nabin Hait Date: Thu, 11 Jun 2015 16:44:48 +0600 Subject: [PATCH 9/9] bumped to version 5.0.21 --- erpnext/__version__.py | 2 +- erpnext/hooks.py | 2 +- setup.py | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/erpnext/__version__.py b/erpnext/__version__.py index 82881782e64..af58b16bb6f 100644 --- a/erpnext/__version__.py +++ b/erpnext/__version__.py @@ -1,2 +1,2 @@ from __future__ import unicode_literals -__version__ = '5.0.20' +__version__ = '5.0.21' diff --git a/erpnext/hooks.py b/erpnext/hooks.py index 98e3a3bfb4d..1684645ea17 100644 --- a/erpnext/hooks.py +++ b/erpnext/hooks.py @@ -5,7 +5,7 @@ app_publisher = "Frappe Technologies Pvt. Ltd. and Contributors" app_description = "Open Source Enterprise Resource Planning for Small and Midsized Organizations" app_icon = "icon-th" app_color = "#e74c3c" -app_version = "5.0.20" +app_version = "5.0.21" error_report_email = "support@erpnext.com" diff --git a/setup.py b/setup.py index 01425c2e899..9fe6e2f2c44 100644 --- a/setup.py +++ b/setup.py @@ -1,6 +1,6 @@ from setuptools import setup, find_packages -version = "5.0.20" +version = "5.0.21" with open("requirements.txt", "r") as f: install_requires = f.readlines()