From f62e97d285324f22447fa3a9ede4d0c0701ce0e4 Mon Sep 17 00:00:00 2001 From: krantheman Date: Mon, 27 Nov 2023 17:40:49 +0530 Subject: [PATCH 1/9] feat: add Amount Based on Formula to list_view (cherry picked from commit d951b66f2d32ab66f1873e0f51a2d7d58d65b363) --- hrms/payroll/doctype/salary_detail/salary_detail.json | 1 + 1 file changed, 1 insertion(+) diff --git a/hrms/payroll/doctype/salary_detail/salary_detail.json b/hrms/payroll/doctype/salary_detail/salary_detail.json index a134a3b033..1789f65ae5 100644 --- a/hrms/payroll/doctype/salary_detail/salary_detail.json +++ b/hrms/payroll/doctype/salary_detail/salary_detail.json @@ -135,6 +135,7 @@ "depends_on": "eval:doc.parenttype=='Salary Structure'", "fieldname": "amount_based_on_formula", "fieldtype": "Check", + "in_list_view": 1, "label": "Amount based on formula" }, { From b47cea8487e1b10c15a74d7a09a7d134f5a12aa3 Mon Sep 17 00:00:00 2001 From: krantheman Date: Tue, 28 Nov 2023 13:23:12 +0530 Subject: [PATCH 2/9] feat: add server-side validation for Amount Based on Salary (cherry picked from commit ed468591e969d390e62a335ced19918f36012630) --- .../salary_structure/salary_structure.py | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/hrms/payroll/doctype/salary_structure/salary_structure.py b/hrms/payroll/doctype/salary_structure/salary_structure.py index a4644752be..5428018955 100644 --- a/hrms/payroll/doctype/salary_structure/salary_structure.py +++ b/hrms/payroll/doctype/salary_structure/salary_structure.py @@ -22,6 +22,23 @@ def validate(self): self.validate_payment_days_based_dependent_component() self.validate_timesheet_component() + def before_save(self): + for detail in self.earnings: + if not detail.amount_based_on_formula and detail.formula: + frappe.msgprint( + _( + "Earning Row #{0}: Formula entered for Salary Component {1} even though 'Amount Based on Formula' has been disabled" + ).format(detail.idx, detail.salary_component) + ) + + for detail in self.deductions: + if not detail.amount_based_on_formula and detail.formula: + frappe.msgprint( + _( + "Deduction Row #{0}: Formula entered for Salary Component {1} even though 'Amount Based on Formula' has been disabled" + ).format(detail.idx, detail.salary_component) + ) + def set_missing_values(self): overwritten_fields = [ "depends_on_payment_days", From ef8476d38c4b65eb3f6b8df8ebed4638823cbb3e Mon Sep 17 00:00:00 2001 From: krantheman Date: Tue, 28 Nov 2023 14:01:07 +0530 Subject: [PATCH 3/9] feat: add client-side validation for Amount Based on Salary (cherry picked from commit 93335af719a6edd266ec6b5cdc7a575adaa09b22) --- .../doctype/salary_structure/salary_structure.js | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/hrms/payroll/doctype/salary_structure/salary_structure.js b/hrms/payroll/doctype/salary_structure/salary_structure.js index a5d1b7b2d6..958503b20e 100755 --- a/hrms/payroll/doctype/salary_structure/salary_structure.js +++ b/hrms/payroll/doctype/salary_structure/salary_structure.js @@ -14,6 +14,7 @@ cur_frm.cscript.onload = function(doc, dt, dn){ frappe.ui.form.on('Salary Structure', { onload: function(frm) { + frm.alerted_rows = [] let help_button = $(` ${__("Condition and Formula Help")} @@ -305,6 +306,13 @@ frappe.ui.form.on('Salary Detail', { calculate_totals(frm.doc); }, + formula: function(frm, cdt, cdn) { + if (!locals[cdt][cdn].amount_based_on_formula && !frm.alerted_rows.includes(cdn)) { + frappe.msgprint(__("Warning: 'Amount Based on Formula' has been disabled for this row.")); + frm.alerted_rows.push(cdn) + } + }, + salary_component: function(frm, cdt, cdn) { var child = locals[cdt][cdn]; if(child.salary_component){ @@ -343,6 +351,8 @@ frappe.ui.form.on('Salary Detail', { var child = locals[cdt][cdn]; if(child.amount_based_on_formula == 1){ frappe.model.set_value(cdt, cdn, 'amount', null); + const index = frm.alerted_rows.indexOf(cdn); + if (index > -1) frm.alerted_rows.splice(index, 1); } else{ frappe.model.set_value(cdt, cdn, 'formula', null); From 9e490800943ac832ea612fe2a888b153cdf9152a Mon Sep 17 00:00:00 2001 From: krantheman Date: Wed, 6 Dec 2023 17:35:30 +0530 Subject: [PATCH 4/9] chore: improve readability (cherry picked from commit 75ed9f75f568a00865092dae06a33b9f72671106) --- .../salary_structure/salary_structure.py | 23 +++++++------------ 1 file changed, 8 insertions(+), 15 deletions(-) diff --git a/hrms/payroll/doctype/salary_structure/salary_structure.py b/hrms/payroll/doctype/salary_structure/salary_structure.py index 5428018955..49d12e695f 100644 --- a/hrms/payroll/doctype/salary_structure/salary_structure.py +++ b/hrms/payroll/doctype/salary_structure/salary_structure.py @@ -23,21 +23,14 @@ def validate(self): self.validate_timesheet_component() def before_save(self): - for detail in self.earnings: - if not detail.amount_based_on_formula and detail.formula: - frappe.msgprint( - _( - "Earning Row #{0}: Formula entered for Salary Component {1} even though 'Amount Based on Formula' has been disabled" - ).format(detail.idx, detail.salary_component) - ) - - for detail in self.deductions: - if not detail.amount_based_on_formula and detail.formula: - frappe.msgprint( - _( - "Deduction Row #{0}: Formula entered for Salary Component {1} even though 'Amount Based on Formula' has been disabled" - ).format(detail.idx, detail.salary_component) - ) + for table in ["earnings", "deductions"]: + for detail in self.get(table): + if not detail.amount_based_on_formula and detail.formula: + frappe.msgprint( + _( + "{0} Row #{1}: Formula entered for Salary Component {2} even though 'Amount Based on Formula' has been disabled" + ).format(table[:-1].capitalize(), detail.idx, detail.salary_component) + ) def set_missing_values(self): overwritten_fields = [ From bc20f173041664f69d6815a23a92b80420a48b4b Mon Sep 17 00:00:00 2001 From: krantheman Date: Wed, 6 Dec 2023 18:08:35 +0530 Subject: [PATCH 5/9] fix: warning message (cherry picked from commit d601846f422cd715b0cc5997b57943c7a54f483b) --- .../payroll/doctype/salary_structure/salary_structure.py | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/hrms/payroll/doctype/salary_structure/salary_structure.py b/hrms/payroll/doctype/salary_structure/salary_structure.py index 49d12e695f..0cfbf461df 100644 --- a/hrms/payroll/doctype/salary_structure/salary_structure.py +++ b/hrms/payroll/doctype/salary_structure/salary_structure.py @@ -28,8 +28,13 @@ def before_save(self): if not detail.amount_based_on_formula and detail.formula: frappe.msgprint( _( - "{0} Row #{1}: Formula entered for Salary Component {2} even though 'Amount Based on Formula' has been disabled" - ).format(table[:-1].capitalize(), detail.idx, detail.salary_component) + "{0} Row #{1}: Formula entered for Salary Component {2} even though {3} has been disabled." + ).format( + table[:-1].capitalize(), + detail.idx, + detail.salary_component, + frappe.bold("Amount Based on Formula"), + ) ) def set_missing_values(self): From d39abf6b3fa9a81129c6ed9fc52e9089b9781c49 Mon Sep 17 00:00:00 2001 From: Rucha Mahabal Date: Tue, 12 Dec 2023 11:53:47 +0530 Subject: [PATCH 6/9] fix: salary structure warning message (cherry picked from commit b1e6b6be49e60aa636a76ef2ba8e4aff8aa2effb) --- .../doctype/salary_structure/salary_structure.js | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/hrms/payroll/doctype/salary_structure/salary_structure.js b/hrms/payroll/doctype/salary_structure/salary_structure.js index 958503b20e..0e4d913e2c 100755 --- a/hrms/payroll/doctype/salary_structure/salary_structure.js +++ b/hrms/payroll/doctype/salary_structure/salary_structure.js @@ -307,8 +307,12 @@ frappe.ui.form.on('Salary Detail', { }, formula: function(frm, cdt, cdn) { - if (!locals[cdt][cdn].amount_based_on_formula && !frm.alerted_rows.includes(cdn)) { - frappe.msgprint(__("Warning: 'Amount Based on Formula' has been disabled for this row.")); + const row = locals[cdt][cdn]; + if (row.formula && !row?.amount_based_on_formula && !frm.alerted_rows.includes(cdn)) { + frappe.msgprint( + __("Row #{0}: {1} needs to be enabled for the formula to be considered.", + [row.idx, __("Amount based on formula").bold()]) + ); frm.alerted_rows.push(cdn) } }, @@ -349,12 +353,11 @@ frappe.ui.form.on('Salary Detail', { amount_based_on_formula: function(frm, cdt, cdn) { var child = locals[cdt][cdn]; - if(child.amount_based_on_formula == 1){ + if (child.amount_based_on_formula == 1) { frappe.model.set_value(cdt, cdn, 'amount', null); const index = frm.alerted_rows.indexOf(cdn); if (index > -1) frm.alerted_rows.splice(index, 1); - } - else{ + } else { frappe.model.set_value(cdt, cdn, 'formula', null); } } From d0eebe21b7f40c1c47b9774d9351a95589b8b3c4 Mon Sep 17 00:00:00 2001 From: Rucha Mahabal Date: Tue, 12 Dec 2023 14:16:40 +0530 Subject: [PATCH 7/9] fix: remove statistical component from list view display - refactor deprecated code (cherry picked from commit 35fd55ea81079f053e0f17b0c67ca5f94ce89f3b) # Conflicts: # hrms/payroll/doctype/salary_detail/salary_detail.json # hrms/payroll/doctype/salary_structure/salary_structure.json --- .../payroll/doctype/salary_detail/salary_detail.json | 6 +++++- .../doctype/salary_structure/salary_structure.js | 12 +----------- .../doctype/salary_structure/salary_structure.json | 5 +++++ 3 files changed, 11 insertions(+), 12 deletions(-) diff --git a/hrms/payroll/doctype/salary_detail/salary_detail.json b/hrms/payroll/doctype/salary_detail/salary_detail.json index 1789f65ae5..681f4c7b7b 100644 --- a/hrms/payroll/doctype/salary_detail/salary_detail.json +++ b/hrms/payroll/doctype/salary_detail/salary_detail.json @@ -36,6 +36,7 @@ ], "fields": [ { + "columns": 2, "fieldname": "salary_component", "fieldtype": "Link", "in_list_view": 1, @@ -64,7 +65,6 @@ "fetch_from": "salary_component.statistical_component", "fieldname": "statistical_component", "fieldtype": "Check", - "in_list_view": 1, "label": "Statistical Component" }, { @@ -251,7 +251,11 @@ ], "istable": 1, "links": [], +<<<<<<< HEAD "modified": "2023-01-17 13:04:44.167515", +======= + "modified": "2023-12-12 13:52:30.726505", +>>>>>>> 35fd55ea8 (fix: remove statistical component from list view display) "modified_by": "Administrator", "module": "Payroll", "name": "Salary Detail", diff --git a/hrms/payroll/doctype/salary_structure/salary_structure.js b/hrms/payroll/doctype/salary_structure/salary_structure.js index 0e4d913e2c..b0e52c8083 100755 --- a/hrms/payroll/doctype/salary_structure/salary_structure.js +++ b/hrms/payroll/doctype/salary_structure/salary_structure.js @@ -2,17 +2,7 @@ // License: GNU General Public License v3. See license.txt {% include "erpnext/public/js/controllers/accounts.js" %} -cur_frm.add_fetch('company', 'default_letter_head', 'letter_head'); - - -cur_frm.cscript.onload = function(doc, dt, dn){ - var e_tbl = doc.earnings || []; - var d_tbl = doc.deductions || []; - if (e_tbl.length == 0 && d_tbl.length == 0) - return function(r, rt) { refresh_many(['earnings', 'deductions']);}; -} - -frappe.ui.form.on('Salary Structure', { +frappe.ui.form.on("Salary Structure", { onload: function(frm) { frm.alerted_rows = [] diff --git a/hrms/payroll/doctype/salary_structure/salary_structure.json b/hrms/payroll/doctype/salary_structure/salary_structure.json index 23ea3725f6..79057a5469 100644 --- a/hrms/payroll/doctype/salary_structure/salary_structure.json +++ b/hrms/payroll/doctype/salary_structure/salary_structure.json @@ -47,6 +47,7 @@ "reqd": 1 }, { + "fetch_from": "company.default_letter_head", "fieldname": "letter_head", "fieldtype": "Link", "label": "Letter Head", @@ -235,7 +236,11 @@ "idx": 1, "is_submittable": 1, "links": [], +<<<<<<< HEAD "modified": "2023-06-13 18:02:31.779947", +======= + "modified": "2023-12-12 14:11:22.774017", +>>>>>>> 35fd55ea8 (fix: remove statistical component from list view display) "modified_by": "Administrator", "module": "Payroll", "name": "Salary Structure", From 7e8092b891517162685b19deffeaa9b229ad6db4 Mon Sep 17 00:00:00 2001 From: Rucha Mahabal Date: Tue, 12 Dec 2023 14:54:37 +0530 Subject: [PATCH 8/9] fix: salary structure warning message (cherry picked from commit 43af99efe915fbc6500479938b12ef056e6b522b) --- .../salary_structure/salary_structure.js | 10 ++++---- .../salary_structure/salary_structure.py | 23 ++++++++++--------- 2 files changed, 18 insertions(+), 15 deletions(-) diff --git a/hrms/payroll/doctype/salary_structure/salary_structure.js b/hrms/payroll/doctype/salary_structure/salary_structure.js index b0e52c8083..3a182ad962 100755 --- a/hrms/payroll/doctype/salary_structure/salary_structure.js +++ b/hrms/payroll/doctype/salary_structure/salary_structure.js @@ -299,10 +299,12 @@ frappe.ui.form.on('Salary Detail', { formula: function(frm, cdt, cdn) { const row = locals[cdt][cdn]; if (row.formula && !row?.amount_based_on_formula && !frm.alerted_rows.includes(cdn)) { - frappe.msgprint( - __("Row #{0}: {1} needs to be enabled for the formula to be considered.", - [row.idx, __("Amount based on formula").bold()]) - ); + frappe.msgprint({ + message: __("{0} Row #{1}: {2} needs to be enabled for the formula to be considered.", + [toTitle(row.parentfield), row.idx, __("Amount based on formula").bold()]), + title: __("Warning"), + indicator: "orange", + }); frm.alerted_rows.push(cdn) } }, diff --git a/hrms/payroll/doctype/salary_structure/salary_structure.py b/hrms/payroll/doctype/salary_structure/salary_structure.py index 0cfbf461df..c73717a47b 100644 --- a/hrms/payroll/doctype/salary_structure/salary_structure.py +++ b/hrms/payroll/doctype/salary_structure/salary_structure.py @@ -21,20 +21,21 @@ def validate(self): self.validate_component_based_on_tax_slab() self.validate_payment_days_based_dependent_component() self.validate_timesheet_component() + self.validate_formula_setup() - def before_save(self): + def validate_formula_setup(self): for table in ["earnings", "deductions"]: - for detail in self.get(table): - if not detail.amount_based_on_formula and detail.formula: + for row in self.get(table): + if not row.amount_based_on_formula and row.formula: frappe.msgprint( - _( - "{0} Row #{1}: Formula entered for Salary Component {2} even though {3} has been disabled." - ).format( - table[:-1].capitalize(), - detail.idx, - detail.salary_component, - frappe.bold("Amount Based on Formula"), - ) + _("{0} Row #{1}: Formula is set but {2} is disabled for the Salary Component {3}.").format( + table.capitalize(), + row.idx, + frappe.bold(_("Amount Based on Formula")), + frappe.bold(row.salary_component), + ), + title=_("Warning"), + indicator="orange", ) def set_missing_values(self): From 4b9120e629439ca9adb5a51ebc5fa543a185d97b Mon Sep 17 00:00:00 2001 From: Rucha Mahabal Date: Tue, 12 Dec 2023 15:27:56 +0530 Subject: [PATCH 9/9] chore: fix conflicts --- hrms/payroll/doctype/salary_detail/salary_detail.json | 4 ---- hrms/payroll/doctype/salary_structure/salary_structure.json | 4 ---- 2 files changed, 8 deletions(-) diff --git a/hrms/payroll/doctype/salary_detail/salary_detail.json b/hrms/payroll/doctype/salary_detail/salary_detail.json index 681f4c7b7b..b8cd6f6dc7 100644 --- a/hrms/payroll/doctype/salary_detail/salary_detail.json +++ b/hrms/payroll/doctype/salary_detail/salary_detail.json @@ -251,11 +251,7 @@ ], "istable": 1, "links": [], -<<<<<<< HEAD - "modified": "2023-01-17 13:04:44.167515", -======= "modified": "2023-12-12 13:52:30.726505", ->>>>>>> 35fd55ea8 (fix: remove statistical component from list view display) "modified_by": "Administrator", "module": "Payroll", "name": "Salary Detail", diff --git a/hrms/payroll/doctype/salary_structure/salary_structure.json b/hrms/payroll/doctype/salary_structure/salary_structure.json index 79057a5469..5d9df18fd7 100644 --- a/hrms/payroll/doctype/salary_structure/salary_structure.json +++ b/hrms/payroll/doctype/salary_structure/salary_structure.json @@ -236,11 +236,7 @@ "idx": 1, "is_submittable": 1, "links": [], -<<<<<<< HEAD - "modified": "2023-06-13 18:02:31.779947", -======= "modified": "2023-12-12 14:11:22.774017", ->>>>>>> 35fd55ea8 (fix: remove statistical component from list view display) "modified_by": "Administrator", "module": "Payroll", "name": "Salary Structure",