From 507c435dee78ca14e641665a90818a0eea4f4843 Mon Sep 17 00:00:00 2001 From: Nabin Hait Date: Mon, 21 Oct 2019 16:01:51 +0530 Subject: [PATCH 01/10] Reorder level report fix v11 (#19367) * fix: Fixed consumed qty based on Stock Ledger Entry * Update itemwise_recommended_reorder_level.py --- .../itemwise_recommended_reorder_level.py | 24 ++++++++++--------- 1 file changed, 13 insertions(+), 11 deletions(-) diff --git a/erpnext/stock/report/itemwise_recommended_reorder_level/itemwise_recommended_reorder_level.py b/erpnext/stock/report/itemwise_recommended_reorder_level/itemwise_recommended_reorder_level.py index 618fd152ff0..9a972104a27 100644 --- a/erpnext/stock/report/itemwise_recommended_reorder_level/itemwise_recommended_reorder_level.py +++ b/erpnext/stock/report/itemwise_recommended_reorder_level/itemwise_recommended_reorder_level.py @@ -24,7 +24,7 @@ def execute(filters=None): data = [] for item in items: - total_outgoing = consumed_item_map.get(item.name, 0) + delivered_item_map.get(item.name,0) + total_outgoing = flt(consumed_item_map.get(item.name, 0)) + flt(delivered_item_map.get(item.name,0)) avg_daily_outgoing = flt(total_outgoing / diff, float_preceision) reorder_level = (avg_daily_outgoing * flt(item.lead_time_days)) + flt(item.safety_stock) @@ -55,18 +55,20 @@ def get_item_info(filters): def get_consumed_items(condition): - cn_items = frappe.db.sql("""select se_item.item_code, - sum(se_item.transfer_qty) as 'consume_qty' - from `tabStock Entry` se, `tabStock Entry Detail` se_item - where se.name = se_item.parent and se.docstatus = 1 - and (ifnull(se_item.t_warehouse, '') = '' or se.purpose = 'Subcontract') %s - group by se_item.item_code""" % (condition), as_dict=1) + consumed_items = frappe.db.sql(""" + select item_code, abs(sum(actual_qty)) as consumed_qty + from `tabStock Ledger Entry` + where actual_qty < 0 + and voucher_type not in ('Delivery Note', 'Sales Invoice') + %s + group by item_code + """ % condition, as_dict=1) - cn_items_map = {} - for item in cn_items: - cn_items_map.setdefault(item.item_code, item.consume_qty) + consumed_items_map = {} + for item in consumed_items: + consumed_items_map.setdefault(item.item_code, item.consumed_qty) - return cn_items_map + return consumed_items_map def get_delivered_items(condition): dn_items = frappe.db.sql("""select dn_item.item_code, sum(dn_item.stock_qty) as dn_qty From 89570934394c63e5551fe11d4dedd841532a3d13 Mon Sep 17 00:00:00 2001 From: Saurabh Date: Mon, 21 Oct 2019 16:02:47 +0530 Subject: [PATCH 02/10] fix: Don't show make jv button if equity or liability account and asset account not specified (#19349) --- erpnext/accounts/doctype/share_transfer/share_transfer.js | 3 ++- erpnext/accounts/doctype/share_transfer/share_transfer.py | 3 +++ 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/erpnext/accounts/doctype/share_transfer/share_transfer.js b/erpnext/accounts/doctype/share_transfer/share_transfer.js index af23b2656de..7ef47de9dfc 100644 --- a/erpnext/accounts/doctype/share_transfer/share_transfer.js +++ b/erpnext/accounts/doctype/share_transfer/share_transfer.js @@ -16,7 +16,7 @@ frappe.ui.form.on('Share Transfer', { }; }; }); - if (frm.doc.docstatus == 1) { + if (frm.doc.docstatus == 1 && frm.doc.equity_or_liability_account && frm.doc.asset_account ) { frm.add_custom_button(__('Make Journal Entry'), function () { erpnext.share_transfer.make_jv(frm); }); @@ -92,6 +92,7 @@ erpnext.share_transfer.make_jv = function (frm) { debit_applicant_type = "Shareholder"; debit_applicant = frm.doc.from_shareholder; } + frappe.call({ args: { "company": frm.doc.company, diff --git a/erpnext/accounts/doctype/share_transfer/share_transfer.py b/erpnext/accounts/doctype/share_transfer/share_transfer.py index 1a1f036278d..45de30c68b4 100644 --- a/erpnext/accounts/doctype/share_transfer/share_transfer.py +++ b/erpnext/accounts/doctype/share_transfer/share_transfer.py @@ -292,11 +292,14 @@ def make_jv_entry( company, account, amount, payment_account,\ "party_type": debit_applicant_type, "party": debit_applicant, }) + account_amt_list.append({ "account": payment_account, "credit_in_account_currency": amount, "party_type": credit_applicant_type, "party": credit_applicant, }) + journal_entry.set("accounts", account_amt_list) + return journal_entry.as_dict() \ No newline at end of file From 5a2ea528e8fac6c2ef3ca8e97215807eaacdfb1c Mon Sep 17 00:00:00 2001 From: Anurag Mishra <32095923+Anurag810@users.noreply.github.com> Date: Tue, 22 Oct 2019 11:46:42 +0530 Subject: [PATCH 03/10] fix: if naming if item-code and index both are same (#19372) --- erpnext/manufacturing/doctype/bom/bom.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/erpnext/manufacturing/doctype/bom/bom.py b/erpnext/manufacturing/doctype/bom/bom.py index 3ad16e5b65d..437f1694b91 100644 --- a/erpnext/manufacturing/doctype/bom/bom.py +++ b/erpnext/manufacturing/doctype/bom/bom.py @@ -34,7 +34,8 @@ class BOM(WebsiteGenerator): # name can be BOM/ITEM/001, BOM/ITEM/001-1, BOM-ITEM-001, BOM-ITEM-001-1 # split by item - names = [name.split(self.item)[-1][1:] for name in names] + names = [name.split(self.item, 1) for name in names] + names = [d[-1][1:] for d in filter(lambda x: len(x) > 1 and x[-1], names)] # split by (-) if cancelled names = [cint(name.split('-')[-1]) for name in names] From 15432c76a40b66f59da441f786bc7d4b0011c4a3 Mon Sep 17 00:00:00 2001 From: Shivam Mishra Date: Wed, 23 Oct 2019 11:07:33 +0530 Subject: [PATCH 04/10] fix: icon for opportunity (#19381) --- erpnext/crm/doctype/opportunity/opportunity.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/erpnext/crm/doctype/opportunity/opportunity.json b/erpnext/crm/doctype/opportunity/opportunity.json index d679d16079c..c1457db025c 100644 --- a/erpnext/crm/doctype/opportunity/opportunity.json +++ b/erpnext/crm/doctype/opportunity/opportunity.json @@ -1468,7 +1468,7 @@ "issingle": 0, "istable": 0, "max_attachments": 0, - "modified": "2019-05-17 19:03:32.740910", + "modified": "2019-10-22 11:11:32.740910", "modified_by": "Administrator", "module": "CRM", "name": "Opportunity", From b52d81ef6a75a23a7acfb98d71cb0eacce7c4979 Mon Sep 17 00:00:00 2001 From: Pranav Nachnekar Date: Wed, 23 Oct 2019 15:50:00 +0000 Subject: [PATCH 05/10] fix: setting incorrect field for party bank account --- erpnext/accounts/doctype/payment_entry/payment_entry.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/erpnext/accounts/doctype/payment_entry/payment_entry.js b/erpnext/accounts/doctype/payment_entry/payment_entry.js index 5707d154c19..491ae506986 100644 --- a/erpnext/accounts/doctype/payment_entry/payment_entry.js +++ b/erpnext/accounts/doctype/payment_entry/payment_entry.js @@ -294,7 +294,7 @@ frappe.ui.form.on('Payment Entry', { () => { frm.set_party_account_based_on_party = false; if (r.message.bank_account) { - frm.set_value("bank_account", r.message.bank_account); + frm.set_value("party_bank_account", r.message.bank_account); } } ]); From bd4e296336226f38067c5822d70580b35de3539e Mon Sep 17 00:00:00 2001 From: Mangesh-Khairnar Date: Thu, 24 Oct 2019 15:45:32 +0530 Subject: [PATCH 06/10] fix: sync delivery note status in both list view and form view --- erpnext/stock/doctype/delivery_note/delivery_note_list.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/erpnext/stock/doctype/delivery_note/delivery_note_list.js b/erpnext/stock/doctype/delivery_note/delivery_note_list.js index 6fc51ecdd9d..0ae7c37b3f8 100644 --- a/erpnext/stock/doctype/delivery_note/delivery_note_list.js +++ b/erpnext/stock/doctype/delivery_note/delivery_note_list.js @@ -6,9 +6,9 @@ frappe.listview_settings['Delivery Note'] = { return [__("Return"), "darkgrey", "is_return,=,Yes"]; } else if (doc.status === "Closed") { return [__("Closed"), "green", "status,=,Closed"]; - } else if (doc.grand_total !== 0 && flt(doc.per_billed, 2) < 100) { + } else if (flt(doc.per_billed, 2) < 100) { return [__("To Bill"), "orange", "per_billed,<,100"]; - } else if (doc.grand_total === 0 || flt(doc.per_billed, 2) == 100) { + } else if (flt(doc.per_billed, 2) == 100) { return [__("Completed"), "green", "per_billed,=,100"]; } }, From a1f5c22da78aba0b899a46a0d2948bdaf3b44385 Mon Sep 17 00:00:00 2001 From: Suraj Shetty <13928957+surajshetty3416@users.noreply.github.com> Date: Mon, 28 Oct 2019 12:03:58 +0530 Subject: [PATCH 07/10] fix: Overwrite default cost center if item has default cost center set. (#19406) --- erpnext/selling/doctype/sales_order/sales_order.py | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/erpnext/selling/doctype/sales_order/sales_order.py b/erpnext/selling/doctype/sales_order/sales_order.py index fb683a36324..d3ab2ac5a7d 100755 --- a/erpnext/selling/doctype/sales_order/sales_order.py +++ b/erpnext/selling/doctype/sales_order/sales_order.py @@ -645,12 +645,15 @@ def make_sales_invoice(source_name, target_doc=None, ignore_permissions=False): if source_parent.project: target.cost_center = frappe.db.get_value("Project", source_parent.project, "cost_center") - if not target.cost_center and target.item_code: + if target.item_code: item = get_item_defaults(target.item_code, source_parent.company) item_group = get_item_group_defaults(target.item_code, source_parent.company) - target.cost_center = item.get("selling_cost_center") \ + cost_center = item.get("selling_cost_center") \ or item_group.get("selling_cost_center") + if cost_center: + target.cost_center = cost_center + doclist = get_mapped_doc("Sales Order", source_name, { "Sales Order": { "doctype": "Sales Invoice", From 115887a886bd8997fd3714a0a70e5919de57515b Mon Sep 17 00:00:00 2001 From: Deepesh Garg <42651287+deepeshgarg007@users.noreply.github.com> Date: Mon, 28 Oct 2019 12:07:57 +0530 Subject: [PATCH 08/10] fix: Better validation msg for difference account in Stock Entry (#19401) * fix: Better validation msg for difference account * fix: Make primary info bold --- erpnext/stock/doctype/stock_entry/stock_entry.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/erpnext/stock/doctype/stock_entry/stock_entry.py b/erpnext/stock/doctype/stock_entry/stock_entry.py index e6806784cda..b27c92d609e 100644 --- a/erpnext/stock/doctype/stock_entry/stock_entry.py +++ b/erpnext/stock/doctype/stock_entry/stock_entry.py @@ -227,7 +227,9 @@ class StockEntry(StockController): for d in self.get("items"): if not d.expense_account: - frappe.throw(_("Please enter Difference Account")) + frappe.throw(_("Please enter Difference Account or set default Stock Adjustment Account for company {0}") + .format(frappe.bold(self.company))) + elif self.is_opening == "Yes" and frappe.db.get_value("Account", d.expense_account, "report_type") == "Profit and Loss": frappe.throw(_("Difference Account must be a Asset/Liability type account, since this Stock Entry is an Opening Entry"), OpeningEntryAccountError) From 91f81b07d9391abc2e7a5739540b93096f08c9fa Mon Sep 17 00:00:00 2001 From: rohitwaghchaure Date: Wed, 30 Oct 2019 13:30:28 +0530 Subject: [PATCH 09/10] fix: not able to select the zero qty batch while making the sales return entry (#19436) --- erpnext/controllers/queries.py | 39 ++++++++++++-------- erpnext/public/js/controllers/transaction.js | 5 +++ 2 files changed, 29 insertions(+), 15 deletions(-) diff --git a/erpnext/controllers/queries.py b/erpnext/controllers/queries.py index 241d3ab7c98..f21ce78d71f 100644 --- a/erpnext/controllers/queries.py +++ b/erpnext/controllers/queries.py @@ -280,22 +280,31 @@ def get_batch_no(doctype, txt, searchfield, start, page_len, filters): "page_len": page_len } + having_clause = "having sum(sle.actual_qty) > 0" + if filters.get("is_return"): + having_clause = "" + if args.get('warehouse'): - batch_nos = frappe.db.sql("""select sle.batch_no, round(sum(sle.actual_qty),2), sle.stock_uom, concat('MFG-',batch.manufacturing_date), concat('EXP-',batch.expiry_date) - from `tabStock Ledger Entry` sle - INNER JOIN `tabBatch` batch on sle.batch_no = batch.name - where - batch.disabled = 0 - and sle.item_code = %(item_code)s - and sle.warehouse = %(warehouse)s - and (sle.batch_no like %(txt)s - or batch.manufacturing_date like %(txt)s) - and batch.docstatus < 2 - {0} - {match_conditions} - group by batch_no having sum(sle.actual_qty) > 0 - order by batch.expiry_date, sle.batch_no desc - limit %(start)s, %(page_len)s""".format(cond, match_conditions=get_match_cond(doctype)), args) + batch_nos = frappe.db.sql("""select sle.batch_no, round(sum(sle.actual_qty),2), sle.stock_uom, + concat('MFG-',batch.manufacturing_date), concat('EXP-',batch.expiry_date) + from `tabStock Ledger Entry` sle + INNER JOIN `tabBatch` batch on sle.batch_no = batch.name + where + batch.disabled = 0 + and sle.item_code = %(item_code)s + and sle.warehouse = %(warehouse)s + and (sle.batch_no like %(txt)s + or batch.manufacturing_date like %(txt)s) + and batch.docstatus < 2 + {cond} + {match_conditions} + group by batch_no {having_clause} + order by batch.expiry_date, sle.batch_no desc + limit %(start)s, %(page_len)s""".format( + cond=cond, + match_conditions=get_match_cond(doctype), + having_clause = having_clause + ), args) return batch_nos else: diff --git a/erpnext/public/js/controllers/transaction.js b/erpnext/public/js/controllers/transaction.js index 17fad54453b..d29750950d7 100644 --- a/erpnext/public/js/controllers/transaction.js +++ b/erpnext/public/js/controllers/transaction.js @@ -1422,6 +1422,11 @@ erpnext.TransactionController = erpnext.taxes_and_totals.extend({ 'item_code': item.item_code, 'posting_date': me.frm.doc.posting_date || frappe.datetime.nowdate(), } + + if (doc.is_return) { + filters["is_return"] = 1; + } + if (item.warehouse) filters["warehouse"] = item.warehouse; return { From 3f4cdcc7a4e0dd7dea1d6b1e11bfd544f73de13e Mon Sep 17 00:00:00 2001 From: Anurag Mishra <32095923+Anurag810@users.noreply.github.com> Date: Wed, 30 Oct 2019 14:18:20 +0530 Subject: [PATCH 10/10] fix: On Specific case if no item code in name (#19420) --- erpnext/manufacturing/doctype/bom/bom.py | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/erpnext/manufacturing/doctype/bom/bom.py b/erpnext/manufacturing/doctype/bom/bom.py index 437f1694b91..0ed2c86b4c4 100644 --- a/erpnext/manufacturing/doctype/bom/bom.py +++ b/erpnext/manufacturing/doctype/bom/bom.py @@ -38,9 +38,11 @@ class BOM(WebsiteGenerator): names = [d[-1][1:] for d in filter(lambda x: len(x) > 1 and x[-1], names)] # split by (-) if cancelled - names = [cint(name.split('-')[-1]) for name in names] - - idx = max(names) + 1 + if names: + names = [cint(name.split('-')[-1]) for name in names] + idx = max(names) + 1 + else: + idx = 1 else: idx = 1