From 921b4be3481af9745811ca197b08dded8296da95 Mon Sep 17 00:00:00 2001 From: pateljannat Date: Thu, 7 Oct 2021 17:10:45 +0530 Subject: [PATCH 01/12] fix: exclude inactive employees from auto attendance --- erpnext/hr/doctype/shift_type/shift_type.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/erpnext/hr/doctype/shift_type/shift_type.py b/erpnext/hr/doctype/shift_type/shift_type.py index e53373df279..7a35b28ac43 100644 --- a/erpnext/hr/doctype/shift_type/shift_type.py +++ b/erpnext/hr/doctype/shift_type/shift_type.py @@ -97,7 +97,7 @@ class ShiftType(Document): assigned_employees = [x[0] for x in assigned_employees] if consider_default_shift: - filters = {'default_shift': self.name} + filters = {'default_shift': self.name, 'status': ['!=', 'Inactive']} default_shift_employees = frappe.get_all('Employee', 'name', filters, as_list=True) default_shift_employees = [x[0] for x in default_shift_employees] return list(set(assigned_employees+default_shift_employees)) From 646acb6b467fcaa20c1f2c80c33d4aaf84e723f8 Mon Sep 17 00:00:00 2001 From: marination Date: Wed, 13 Oct 2021 16:33:19 +0530 Subject: [PATCH 02/12] fix: Improve error message for Serial No mismatch between SI and DN --- .../doctype/sales_invoice/sales_invoice.py | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/erpnext/accounts/doctype/sales_invoice/sales_invoice.py b/erpnext/accounts/doctype/sales_invoice/sales_invoice.py index d9098149210..9b702f58e4d 100644 --- a/erpnext/accounts/doctype/sales_invoice/sales_invoice.py +++ b/erpnext/accounts/doctype/sales_invoice/sales_invoice.py @@ -1284,12 +1284,20 @@ class SalesInvoice(SellingController): serial_nos = item.serial_no or "" si_serial_nos = set(get_serial_nos(serial_nos)) + serial_no_diff = si_serial_nos - dn_serial_nos - if si_serial_nos - dn_serial_nos: - frappe.throw(_("Serial Numbers in row {0} does not match with Delivery Note").format(item.idx)) + if serial_no_diff: + dn_link = frappe.utils.get_link_to_form("Delivery Note", item.delivery_note) + serial_no_msg = ", ".join(frappe.bold(d) for d in serial_no_diff) + + msg = _("Row #{0}: The following Serial Nos are not present in \ + Delivery Note {1}: ").format(item.idx, dn_link) + msg += serial_no_msg + + frappe.throw(msg=msg, title=_("Serial Nos Mismatch")) if item.serial_no and cint(item.qty) != len(si_serial_nos): - frappe.throw(_("Row {0}: {1} Serial numbers required for Item {2}. You have provided {3}.").format( + frappe.throw(_("Row #{0}: {1} Serial numbers required for Item {2}. You have provided {3}.").format( item.idx, item.qty, item.item_code, len(si_serial_nos))) def update_project(self): From 60f35ad8a2d5f7af0a2f5b52a2beb6f559f12dc0 Mon Sep 17 00:00:00 2001 From: marination Date: Wed, 13 Oct 2021 16:50:10 +0530 Subject: [PATCH 03/12] fix: Remove trailing space and line break in translatable string --- erpnext/accounts/doctype/sales_invoice/sales_invoice.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/erpnext/accounts/doctype/sales_invoice/sales_invoice.py b/erpnext/accounts/doctype/sales_invoice/sales_invoice.py index 9b702f58e4d..dafae3128a1 100644 --- a/erpnext/accounts/doctype/sales_invoice/sales_invoice.py +++ b/erpnext/accounts/doctype/sales_invoice/sales_invoice.py @@ -1290,9 +1290,9 @@ class SalesInvoice(SellingController): dn_link = frappe.utils.get_link_to_form("Delivery Note", item.delivery_note) serial_no_msg = ", ".join(frappe.bold(d) for d in serial_no_diff) - msg = _("Row #{0}: The following Serial Nos are not present in \ - Delivery Note {1}: ").format(item.idx, dn_link) - msg += serial_no_msg + msg = _("Row #{0}: The following Serial Nos are not present in Delivery Note {1}:").format( + item.idx, dn_link) + msg += " " + serial_no_msg frappe.throw(msg=msg, title=_("Serial Nos Mismatch")) From efc60ec2b5d4019560599ba56ffcf5eb7612347b Mon Sep 17 00:00:00 2001 From: Rohit Waghchaure Date: Thu, 14 Oct 2021 16:01:08 +0530 Subject: [PATCH 04/12] fix: patch to enable scheduled job for reposting --- erpnext/patches.txt | 1 + .../v13_0/enable_scheduler_job_for_item_reposting.py | 7 +++++++ 2 files changed, 8 insertions(+) create mode 100644 erpnext/patches/v13_0/enable_scheduler_job_for_item_reposting.py diff --git a/erpnext/patches.txt b/erpnext/patches.txt index 1228b66fbfd..bd166928bce 100644 --- a/erpnext/patches.txt +++ b/erpnext/patches.txt @@ -305,4 +305,5 @@ erpnext.patches.v13_0.modify_invalid_gain_loss_gl_entries #2 erpnext.patches.v13_0.fix_additional_cost_in_mfg_stock_entry erpnext.patches.v13_0.set_status_in_maintenance_schedule_table erpnext.patches.v13_0.add_default_interview_notification_templates +erpnext.patches.v13_0.enable_scheduler_job_for_item_reposting erpnext.patches.v13_0.requeue_failed_reposts diff --git a/erpnext/patches/v13_0/enable_scheduler_job_for_item_reposting.py b/erpnext/patches/v13_0/enable_scheduler_job_for_item_reposting.py new file mode 100644 index 00000000000..d18bcd7b224 --- /dev/null +++ b/erpnext/patches/v13_0/enable_scheduler_job_for_item_reposting.py @@ -0,0 +1,7 @@ +import frappe + +def execute(): + frappe.reload_doc('core', 'doctype', 'scheduled_job_type') + if frappe.db.exists('Scheduled Job Type', 'repost_item_valuation.repost_entries'): + frappe.db.set_value('Scheduled Job Type', + 'repost_item_valuation.repost_entries', 'stopped', 0) \ No newline at end of file From 1f70dd6e9865604d9f16b91cddcf989729898ccb Mon Sep 17 00:00:00 2001 From: Saqib Date: Thu, 14 Oct 2021 16:23:12 +0530 Subject: [PATCH 05/12] fix: value_after_depreciation calculation (#27954) --- erpnext/assets/doctype/asset/asset.py | 2 +- erpnext/assets/doctype/asset/test_asset.py | 21 +++++++++++++++++++ .../doctype/asset_repair/test_asset_repair.py | 10 ++++----- 3 files changed, 27 insertions(+), 6 deletions(-) diff --git a/erpnext/assets/doctype/asset/asset.py b/erpnext/assets/doctype/asset/asset.py index 7e135be30b7..99a6cc35dbb 100644 --- a/erpnext/assets/doctype/asset/asset.py +++ b/erpnext/assets/doctype/asset/asset.py @@ -194,7 +194,7 @@ class Asset(AccountsController): start = self.clear_depreciation_schedule() # value_after_depreciation - current Asset value - if d.value_after_depreciation: + if self.docstatus == 1 and d.value_after_depreciation: value_after_depreciation = (flt(d.value_after_depreciation) - flt(self.opening_accumulated_depreciation)) else: diff --git a/erpnext/assets/doctype/asset/test_asset.py b/erpnext/assets/doctype/asset/test_asset.py index 7183ee7e369..cf4581b4a16 100644 --- a/erpnext/assets/doctype/asset/test_asset.py +++ b/erpnext/assets/doctype/asset/test_asset.py @@ -682,6 +682,27 @@ class TestAsset(unittest.TestCase): # reset indian company frappe.flags.company = company_flag + def test_expected_value_change(self): + """ + tests if changing `expected_value_after_useful_life` + affects `value_after_depreciation` + """ + + asset = create_asset(calculate_depreciation=1) + asset.opening_accumulated_depreciation = 2000 + asset.number_of_depreciations_booked = 1 + + asset.finance_books[0].expected_value_after_useful_life = 100 + asset.save() + asset.reload() + self.assertEquals(asset.finance_books[0].value_after_depreciation, 98000.0) + + # changing expected_value_after_useful_life shouldn't affect value_after_depreciation + asset.finance_books[0].expected_value_after_useful_life = 200 + asset.save() + asset.reload() + self.assertEquals(asset.finance_books[0].value_after_depreciation, 98000.0) + def create_asset_data(): if not frappe.db.exists("Asset Category", "Computers"): create_asset_category() diff --git a/erpnext/assets/doctype/asset_repair/test_asset_repair.py b/erpnext/assets/doctype/asset_repair/test_asset_repair.py index 9945a328cfc..30e3a5296e0 100644 --- a/erpnext/assets/doctype/asset_repair/test_asset_repair.py +++ b/erpnext/assets/doctype/asset_repair/test_asset_repair.py @@ -22,7 +22,7 @@ class TestAssetRepair(unittest.TestCase): frappe.db.sql("delete from `tabTax Rule`") def test_update_status(self): - asset = create_asset() + asset = create_asset(submit=1) initial_status = asset.status asset_repair = create_asset_repair(asset = asset) @@ -76,7 +76,7 @@ class TestAssetRepair(unittest.TestCase): self.assertEqual(stock_entry.items[0].qty, asset_repair.stock_items[0].consumed_quantity) def test_increase_in_asset_value_due_to_stock_consumption(self): - asset = create_asset(calculate_depreciation = 1) + asset = create_asset(calculate_depreciation = 1, submit=1) initial_asset_value = get_asset_value(asset) asset_repair = create_asset_repair(asset= asset, stock_consumption = 1, submit = 1) asset.reload() @@ -85,7 +85,7 @@ class TestAssetRepair(unittest.TestCase): self.assertEqual(asset_repair.stock_items[0].total_value, increase_in_asset_value) def test_increase_in_asset_value_due_to_repair_cost_capitalisation(self): - asset = create_asset(calculate_depreciation = 1) + asset = create_asset(calculate_depreciation = 1, submit=1) initial_asset_value = get_asset_value(asset) asset_repair = create_asset_repair(asset= asset, capitalize_repair_cost = 1, submit = 1) asset.reload() @@ -103,7 +103,7 @@ class TestAssetRepair(unittest.TestCase): self.assertEqual(asset_repair.name, gl_entry.voucher_no) def test_increase_in_asset_life(self): - asset = create_asset(calculate_depreciation = 1) + asset = create_asset(calculate_depreciation = 1, submit=1) initial_num_of_depreciations = num_of_depreciations(asset) create_asset_repair(asset= asset, capitalize_repair_cost = 1, submit = 1) asset.reload() @@ -126,7 +126,7 @@ def create_asset_repair(**args): if args.asset: asset = args.asset else: - asset = create_asset(is_existing_asset = 1) + asset = create_asset(is_existing_asset = 1, submit=1) asset_repair = frappe.new_doc("Asset Repair") asset_repair.update({ "asset": asset.name, From 3f97413814aca3815273a51b2abca84180806b99 Mon Sep 17 00:00:00 2001 From: Ankush Menat Date: Thu, 14 Oct 2021 16:45:27 +0530 Subject: [PATCH 06/12] chore: formatting --- erpnext/patches/v13_0/enable_scheduler_job_for_item_reposting.py | 1 + 1 file changed, 1 insertion(+) diff --git a/erpnext/patches/v13_0/enable_scheduler_job_for_item_reposting.py b/erpnext/patches/v13_0/enable_scheduler_job_for_item_reposting.py index d18bcd7b224..cc10413183e 100644 --- a/erpnext/patches/v13_0/enable_scheduler_job_for_item_reposting.py +++ b/erpnext/patches/v13_0/enable_scheduler_job_for_item_reposting.py @@ -1,5 +1,6 @@ import frappe + def execute(): frappe.reload_doc('core', 'doctype', 'scheduled_job_type') if frappe.db.exists('Scheduled Job Type', 'repost_item_valuation.repost_entries'): From 230a5d4b399a127bd6cb33315f410900d1553b9c Mon Sep 17 00:00:00 2001 From: rohitwaghchaure Date: Thu, 14 Oct 2021 16:57:54 +0530 Subject: [PATCH 07/12] Update enable_scheduler_job_for_item_reposting.py --- .../patches/v13_0/enable_scheduler_job_for_item_reposting.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/erpnext/patches/v13_0/enable_scheduler_job_for_item_reposting.py b/erpnext/patches/v13_0/enable_scheduler_job_for_item_reposting.py index cc10413183e..e1fae8428f3 100644 --- a/erpnext/patches/v13_0/enable_scheduler_job_for_item_reposting.py +++ b/erpnext/patches/v13_0/enable_scheduler_job_for_item_reposting.py @@ -1,8 +1,7 @@ import frappe - def execute(): frappe.reload_doc('core', 'doctype', 'scheduled_job_type') if frappe.db.exists('Scheduled Job Type', 'repost_item_valuation.repost_entries'): frappe.db.set_value('Scheduled Job Type', - 'repost_item_valuation.repost_entries', 'stopped', 0) \ No newline at end of file + 'repost_item_valuation.repost_entries', 'stopped', 0) From 9c1d828b1b6c93abdb0208c41824aacbe88e9f12 Mon Sep 17 00:00:00 2001 From: Ankush Menat Date: Thu, 14 Oct 2021 17:18:24 +0530 Subject: [PATCH 08/12] chore: formatting --- erpnext/patches/v13_0/enable_scheduler_job_for_item_reposting.py | 1 + 1 file changed, 1 insertion(+) diff --git a/erpnext/patches/v13_0/enable_scheduler_job_for_item_reposting.py b/erpnext/patches/v13_0/enable_scheduler_job_for_item_reposting.py index e1fae8428f3..7a51b432117 100644 --- a/erpnext/patches/v13_0/enable_scheduler_job_for_item_reposting.py +++ b/erpnext/patches/v13_0/enable_scheduler_job_for_item_reposting.py @@ -1,5 +1,6 @@ import frappe + def execute(): frappe.reload_doc('core', 'doctype', 'scheduled_job_type') if frappe.db.exists('Scheduled Job Type', 'repost_item_valuation.repost_entries'): From 41035b033047dfe00a4a881a7255fd677e78fd90 Mon Sep 17 00:00:00 2001 From: marination Date: Thu, 14 Oct 2021 18:29:46 +0530 Subject: [PATCH 09/12] fix: Retain space inside Serial no string while cleaning serial nos --- erpnext/controllers/stock_controller.py | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/erpnext/controllers/stock_controller.py b/erpnext/controllers/stock_controller.py index 4697205d72d..dfb53c7543c 100644 --- a/erpnext/controllers/stock_controller.py +++ b/erpnext/controllers/stock_controller.py @@ -79,8 +79,15 @@ class StockController(AccountsController): def clean_serial_nos(self): for row in self.get("items"): if hasattr(row, "serial_no") and row.serial_no: - # replace commas by linefeed and remove all spaces in string - row.serial_no = row.serial_no.replace(",", "\n").replace(" ", "") + # replace commas by linefeed + row.serial_no = row.serial_no.replace(",", "\n") + + # strip preceeding and succeeding spaces for each SN + # (SN could have valid spaces in between e.g. SN - 123 - 2021) + serial_no_list = row.serial_no.split("\n") + serial_no_list = [sn.lstrip().rstrip() for sn in serial_no_list] + + row.serial_no = "\n".join(serial_no_list) def get_gl_entries(self, warehouse_account=None, default_expense_account=None, default_cost_center=None): From 8cf188d9c0f195d9caca5caa698ebc9b675e5906 Mon Sep 17 00:00:00 2001 From: Marica Date: Thu, 14 Oct 2021 19:21:41 +0530 Subject: [PATCH 10/12] fix: Use strip instead of lstrip and rstrip Co-authored-by: Ankush Menat --- erpnext/controllers/stock_controller.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/erpnext/controllers/stock_controller.py b/erpnext/controllers/stock_controller.py index dfb53c7543c..08d422d3bcd 100644 --- a/erpnext/controllers/stock_controller.py +++ b/erpnext/controllers/stock_controller.py @@ -85,7 +85,7 @@ class StockController(AccountsController): # strip preceeding and succeeding spaces for each SN # (SN could have valid spaces in between e.g. SN - 123 - 2021) serial_no_list = row.serial_no.split("\n") - serial_no_list = [sn.lstrip().rstrip() for sn in serial_no_list] + serial_no_list = [sn.strip() for sn in serial_no_list] row.serial_no = "\n".join(serial_no_list) From a9341672cf6c33d0d7df67dfe828dc8a7a26a940 Mon Sep 17 00:00:00 2001 From: marination Date: Thu, 14 Oct 2021 19:25:14 +0530 Subject: [PATCH 11/12] test: Include serial no with spaces in it in sanitation test --- erpnext/stock/doctype/serial_no/test_serial_no.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/erpnext/stock/doctype/serial_no/test_serial_no.py b/erpnext/stock/doctype/serial_no/test_serial_no.py index 546e21bde04..570f22e6af3 100644 --- a/erpnext/stock/doctype/serial_no/test_serial_no.py +++ b/erpnext/stock/doctype/serial_no/test_serial_no.py @@ -184,14 +184,14 @@ class TestSerialNo(ERPNextTestCase): se = frappe.copy_doc(test_records[0]) se.get("items")[0].item_code = item_code - se.get("items")[0].qty = 3 - se.get("items")[0].serial_no = " _TS1, _TS2 , _TS3 " - se.get("items")[0].transfer_qty = 3 + se.get("items")[0].qty = 4 + se.get("items")[0].serial_no = " _TS1, _TS2 , _TS3 , _TS4 - 2021" + se.get("items")[0].transfer_qty = 4 se.set_stock_entry_type() se.insert() se.submit() - self.assertEqual(se.get("items")[0].serial_no, "_TS1\n_TS2\n_TS3") + self.assertEqual(se.get("items")[0].serial_no, "_TS1\n_TS2\n_TS3\n_TS4 - 2021") frappe.db.rollback() From 4437eb0c4b0bdacb6569d5067e2e3c1aba1191ac Mon Sep 17 00:00:00 2001 From: Ankush Menat Date: Thu, 14 Oct 2021 20:03:37 +0530 Subject: [PATCH 12/12] fix: remove bad description (#27963) --- .../support/doctype/support_settings/support_settings.json | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/erpnext/support/doctype/support_settings/support_settings.json b/erpnext/support/doctype/support_settings/support_settings.json index 5d3d3ace59d..bf1daa16f86 100644 --- a/erpnext/support/doctype/support_settings/support_settings.json +++ b/erpnext/support/doctype/support_settings/support_settings.json @@ -37,7 +37,6 @@ }, { "default": "7", - "description": "Auto close Issue after 7 days", "fieldname": "close_issue_after_days", "fieldtype": "Int", "label": "Close Issue After Days" @@ -164,7 +163,7 @@ ], "issingle": 1, "links": [], - "modified": "2020-06-11 13:08:38.473616", + "modified": "2021-10-14 13:08:38.473616", "modified_by": "Administrator", "module": "Support", "name": "Support Settings", @@ -185,4 +184,4 @@ "sort_field": "modified", "sort_order": "DESC", "track_changes": 1 -} \ No newline at end of file +}