From 753936af58e7b5132b8c8aef0dcc2ffef295570a Mon Sep 17 00:00:00 2001 From: Rucha Mahabal Date: Wed, 27 Dec 2023 13:18:15 +0530 Subject: [PATCH 1/3] fix(Payroll): accrual entry creation fails if any employee has no earnings (#1214) (cherry picked from commit 271fc92cb68ba70c8cf86a49d41988a2b94bb3d9) # Conflicts: # hrms/payroll/doctype/payroll_entry/payroll_entry.py --- .../doctype/payroll_entry/payroll_entry.py | 131 +++++++++++++++++- 1 file changed, 129 insertions(+), 2 deletions(-) diff --git a/hrms/payroll/doctype/payroll_entry/payroll_entry.py b/hrms/payroll/doctype/payroll_entry/payroll_entry.py index 5a74891000..23692b2587 100644 --- a/hrms/payroll/doctype/payroll_entry/payroll_entry.py +++ b/hrms/payroll/doctype/payroll_entry/payroll_entry.py @@ -563,6 +563,7 @@ def make_accrual_jv_entry(self): for employee, employee_details in self.employee_based_payroll_payable_entries.items(): payable_amount = employee_details.get("earnings") - (employee_details.get("deductions") or 0) +<<<<<<< HEAD payable_amount = self.get_accounting_entries_and_payable_amount( payroll_payable_account, self.cost_center, @@ -576,6 +577,132 @@ def make_accrual_jv_entry(self): party=employee, accounts=accounts, ) +======= + self.make_journal_entry( + accounts, + currencies, + self.payroll_payable_account, + voucher_type="Journal Entry", + user_remark=_("Accrual Journal Entry for salaries from {0} to {1}").format( + self.start_date, self.end_date + ), + submit_journal_entry=True, + submitted_salary_slips=submitted_salary_slips, + ) + + def make_journal_entry( + self, + accounts, + currencies, + payroll_payable_account=None, + voucher_type="Journal Entry", + user_remark="", + submitted_salary_slips: list = None, + submit_journal_entry=False, + ): + multi_currency = 0 + if len(currencies) > 1: + multi_currency = 1 + + journal_entry = frappe.new_doc("Journal Entry") + journal_entry.voucher_type = voucher_type + journal_entry.user_remark = user_remark + journal_entry.company = self.company + journal_entry.posting_date = self.posting_date + + journal_entry.set("accounts", accounts) + journal_entry.multi_currency = multi_currency + + if voucher_type == "Journal Entry": + journal_entry.title = payroll_payable_account + + journal_entry.save(ignore_permissions=True) + + try: + if submit_journal_entry: + journal_entry.submit() + + if submitted_salary_slips: + self.update_salary_slip_status(submitted_salary_slips, jv_name=journal_entry.name) + + except Exception as e: + if type(e) in (str, list, tuple): + frappe.msgprint(e) + + self.log_error("Journal Entry creation against Salary Slip failed") + raise + + def get_payable_amount_for_earnings_and_deductions( + self, + accounts, + earnings, + deductions, + currencies, + company_currency, + accounting_dimensions, + precision, + payable_amount, + ): + # Earnings + for acc_cc, amount in earnings.items(): + payable_amount = self.get_accounting_entries_and_payable_amount( + acc_cc[0], + acc_cc[1] or self.cost_center, + amount, + currencies, + company_currency, + payable_amount, + accounting_dimensions, + precision, + entry_type="debit", + accounts=accounts, + ) + + # Deductions + for acc_cc, amount in deductions.items(): + payable_amount = self.get_accounting_entries_and_payable_amount( + acc_cc[0], + acc_cc[1] or self.cost_center, + amount, + currencies, + company_currency, + payable_amount, + accounting_dimensions, + precision, + entry_type="credit", + accounts=accounts, + ) + + return payable_amount + + def set_payable_amount_against_payroll_payable_account( + self, + accounts, + currencies, + company_currency, + accounting_dimensions, + precision, + payable_amount, + payroll_payable_account, + employee_wise_accounting_enabled, + ): + # Payable amount + if employee_wise_accounting_enabled: + """ + employee_based_payroll_payable_entries = { + 'HREMP00004': { + 'earnings': 83332.0, + 'deductions': 2000.0 + }, + 'HREMP00005': { + 'earnings': 50000.0, + 'deductions': 2000.0 + } + } + """ + for employee, employee_details in self.employee_based_payroll_payable_entries.items(): + payable_amount = employee_details.get("earnings", 0) - employee_details.get("deductions", 0) +>>>>>>> 271fc92cb (fix(Payroll): accrual entry creation fails if any employee has no earnings (#1214)) else: payable_amount = self.get_accounting_entries_and_payable_amount( @@ -804,8 +931,8 @@ def create_journal_entry(self, je_payment_amount, user_remark): if self.employee_based_payroll_payable_entries: for employee, employee_details in self.employee_based_payroll_payable_entries.items(): - je_payment_amount = employee_details.get("earnings") - ( - employee_details.get("deductions") or 0 + je_payment_amount = employee_details.get("earnings", 0) - ( + employee_details.get("deductions", 0) ) exchange_rate, amount = self.get_amount_and_exchange_rate_for_journal_entry( self.payment_account, je_payment_amount, company_currency, currencies From 87f2cd0bd1d10883a52272e24dffca515ae4dd59 Mon Sep 17 00:00:00 2001 From: Rucha Mahabal Date: Wed, 27 Dec 2023 13:40:44 +0530 Subject: [PATCH 2/3] chore: fix conflicts --- .../doctype/payroll_entry/payroll_entry.py | 127 ------------------ 1 file changed, 127 deletions(-) diff --git a/hrms/payroll/doctype/payroll_entry/payroll_entry.py b/hrms/payroll/doctype/payroll_entry/payroll_entry.py index 23692b2587..8fb882c8c0 100644 --- a/hrms/payroll/doctype/payroll_entry/payroll_entry.py +++ b/hrms/payroll/doctype/payroll_entry/payroll_entry.py @@ -563,7 +563,6 @@ def make_accrual_jv_entry(self): for employee, employee_details in self.employee_based_payroll_payable_entries.items(): payable_amount = employee_details.get("earnings") - (employee_details.get("deductions") or 0) -<<<<<<< HEAD payable_amount = self.get_accounting_entries_and_payable_amount( payroll_payable_account, self.cost_center, @@ -577,132 +576,6 @@ def make_accrual_jv_entry(self): party=employee, accounts=accounts, ) -======= - self.make_journal_entry( - accounts, - currencies, - self.payroll_payable_account, - voucher_type="Journal Entry", - user_remark=_("Accrual Journal Entry for salaries from {0} to {1}").format( - self.start_date, self.end_date - ), - submit_journal_entry=True, - submitted_salary_slips=submitted_salary_slips, - ) - - def make_journal_entry( - self, - accounts, - currencies, - payroll_payable_account=None, - voucher_type="Journal Entry", - user_remark="", - submitted_salary_slips: list = None, - submit_journal_entry=False, - ): - multi_currency = 0 - if len(currencies) > 1: - multi_currency = 1 - - journal_entry = frappe.new_doc("Journal Entry") - journal_entry.voucher_type = voucher_type - journal_entry.user_remark = user_remark - journal_entry.company = self.company - journal_entry.posting_date = self.posting_date - - journal_entry.set("accounts", accounts) - journal_entry.multi_currency = multi_currency - - if voucher_type == "Journal Entry": - journal_entry.title = payroll_payable_account - - journal_entry.save(ignore_permissions=True) - - try: - if submit_journal_entry: - journal_entry.submit() - - if submitted_salary_slips: - self.update_salary_slip_status(submitted_salary_slips, jv_name=journal_entry.name) - - except Exception as e: - if type(e) in (str, list, tuple): - frappe.msgprint(e) - - self.log_error("Journal Entry creation against Salary Slip failed") - raise - - def get_payable_amount_for_earnings_and_deductions( - self, - accounts, - earnings, - deductions, - currencies, - company_currency, - accounting_dimensions, - precision, - payable_amount, - ): - # Earnings - for acc_cc, amount in earnings.items(): - payable_amount = self.get_accounting_entries_and_payable_amount( - acc_cc[0], - acc_cc[1] or self.cost_center, - amount, - currencies, - company_currency, - payable_amount, - accounting_dimensions, - precision, - entry_type="debit", - accounts=accounts, - ) - - # Deductions - for acc_cc, amount in deductions.items(): - payable_amount = self.get_accounting_entries_and_payable_amount( - acc_cc[0], - acc_cc[1] or self.cost_center, - amount, - currencies, - company_currency, - payable_amount, - accounting_dimensions, - precision, - entry_type="credit", - accounts=accounts, - ) - - return payable_amount - - def set_payable_amount_against_payroll_payable_account( - self, - accounts, - currencies, - company_currency, - accounting_dimensions, - precision, - payable_amount, - payroll_payable_account, - employee_wise_accounting_enabled, - ): - # Payable amount - if employee_wise_accounting_enabled: - """ - employee_based_payroll_payable_entries = { - 'HREMP00004': { - 'earnings': 83332.0, - 'deductions': 2000.0 - }, - 'HREMP00005': { - 'earnings': 50000.0, - 'deductions': 2000.0 - } - } - """ - for employee, employee_details in self.employee_based_payroll_payable_entries.items(): - payable_amount = employee_details.get("earnings", 0) - employee_details.get("deductions", 0) ->>>>>>> 271fc92cb (fix(Payroll): accrual entry creation fails if any employee has no earnings (#1214)) else: payable_amount = self.get_accounting_entries_and_payable_amount( From 127bc9a322c573e2818c58e5fef1515cd684e7fa Mon Sep 17 00:00:00 2001 From: Rucha Mahabal Date: Wed, 27 Dec 2023 13:42:10 +0530 Subject: [PATCH 3/3] fix: fallback for missing earnings --- hrms/payroll/doctype/payroll_entry/payroll_entry.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/hrms/payroll/doctype/payroll_entry/payroll_entry.py b/hrms/payroll/doctype/payroll_entry/payroll_entry.py index 8fb882c8c0..158b7ec261 100644 --- a/hrms/payroll/doctype/payroll_entry/payroll_entry.py +++ b/hrms/payroll/doctype/payroll_entry/payroll_entry.py @@ -561,7 +561,7 @@ def make_accrual_jv_entry(self): } """ for employee, employee_details in self.employee_based_payroll_payable_entries.items(): - payable_amount = employee_details.get("earnings") - (employee_details.get("deductions") or 0) + payable_amount = employee_details.get("earnings", 0) - employee_details.get("deductions", 0) payable_amount = self.get_accounting_entries_and_payable_amount( payroll_payable_account,