Fixed rounding issue in Process Payroll, fixes #9300 (#10586)
diff --git a/erpnext/hr/doctype/process_payroll/process_payroll.py b/erpnext/hr/doctype/process_payroll/process_payroll.py
index 7575ee4..55c0cce 100644
--- a/erpnext/hr/doctype/process_payroll/process_payroll.py
+++ b/erpnext/hr/doctype/process_payroll/process_payroll.py
@@ -4,7 +4,7 @@
from __future__ import unicode_literals
import frappe
from dateutil.relativedelta import relativedelta
-from frappe.utils import cint, nowdate, add_days, getdate, fmt_money, add_to_date, DATE_FORMAT
+from frappe.utils import cint, flt, nowdate, add_days, getdate, fmt_money, add_to_date, DATE_FORMAT
from frappe import _
from erpnext.accounts.utils import get_fiscal_year
@@ -260,85 +260,97 @@
loan_amounts = self.get_total_salary_and_loan_amounts()
loan_accounts = self.get_loan_accounts()
jv_name = ""
+ precision = frappe.get_precision("Journal Entry Account", "debit_in_account_currency")
if earnings or deductions:
journal_entry = frappe.new_doc('Journal Entry')
journal_entry.voucher_type = 'Journal Entry'
- journal_entry.user_remark = _('Accural Journal Entry for salaries from {0} to {1}').format(self.start_date,
- self.end_date)
+ journal_entry.user_remark = _('Accural Journal Entry for salaries from {0} to {1}')\
+ .format(self.start_date, self.end_date)
journal_entry.company = self.company
journal_entry.posting_date = nowdate()
- account_amt_list = []
- adjustment_amt = 0
- for acc, amt in earnings.items():
- adjustment_amt = adjustment_amt+amt
- account_amt_list.append({
+ accounts = []
+ payable_amount = 0
+
+ # Earnings
+ for acc, amount in earnings.items():
+ payable_amount += flt(amount, precision)
+ accounts.append({
"account": acc,
- "debit_in_account_currency": amt,
+ "debit_in_account_currency": flt(amount, precision),
"cost_center": self.cost_center,
"project": self.project
})
+
+ # Deductions
for acc, amt in deductions.items():
- adjustment_amt = adjustment_amt-amt
- account_amt_list.append({
+ payable_amount -= flt(amount, precision)
+ accounts.append({
"account": acc,
- "credit_in_account_currency": amt,
+ "credit_in_account_currency": flt(amount, precision),
"cost_center": self.cost_center,
"project": self.project
})
- #employee loan
+
+ # Employee loan
if loan_amounts.total_loan_repayment:
- account_amt_list.append({
+ accounts.append({
"account": loan_accounts.employee_loan_account,
"credit_in_account_currency": loan_amounts.total_principal_amount
})
- account_amt_list.append({
+ accounts.append({
"account": loan_accounts.interest_income_account,
"credit_in_account_currency": loan_amounts.total_interest_amount,
"cost_center": self.cost_center,
"project": self.project
})
- adjustment_amt = adjustment_amt-(loan_amounts.total_loan_repayment)
-
- account_amt_list.append({
- "account": default_payroll_payable_account,
- "credit_in_account_currency": adjustment_amt
- })
- journal_entry.set("accounts", account_amt_list)
+ payable_amount -= flt(loan_amounts.total_loan_repayment, precision)
+
+ # Payable amount
+ accounts.append({
+ "account": default_payroll_payable_account,
+ "credit_in_account_currency": flt(payable_amount, precision)
+ })
+
+ journal_entry.set("accounts", accounts)
journal_entry.save()
+
try:
journal_entry.submit()
jv_name = journal_entry.name
self.update_salary_slip_status(jv_name = jv_name)
except Exception as e:
frappe.msgprint(e)
+
return jv_name
def make_payment_entry(self):
self.check_permission('write')
total_salary_amount = self.get_total_salary_and_loan_amounts()
default_payroll_payable_account = self.get_default_payroll_payable_account()
+ precision = frappe.get_precision("Journal Entry Account", "debit_in_account_currency")
if total_salary_amount.rounded_total:
journal_entry = frappe.new_doc('Journal Entry')
journal_entry.voucher_type = 'Bank Entry'
- journal_entry.user_remark = _('Payment of salary from {0} to {1}').format(self.start_date,
- self.end_date)
+ journal_entry.user_remark = _('Payment of salary from {0} to {1}')\
+ .format(self.start_date, self.end_date)
journal_entry.company = self.company
journal_entry.posting_date = nowdate()
- account_amt_list = []
-
- account_amt_list.append({
+ payment_amount = flt(total_salary_amount.rounded_total, precision)
+
+ journal_entry.set("accounts", [
+ {
"account": self.payment_account,
- "credit_in_account_currency": total_salary_amount.rounded_total
- })
- account_amt_list.append({
+ "credit_in_account_currency": payment_amount
+ },
+ {
"account": default_payroll_payable_account,
- "debit_in_account_currency": total_salary_amount.rounded_total
- })
- journal_entry.set("accounts", account_amt_list)
+ "debit_in_account_currency": payment_amount
+ }
+ ])
return journal_entry.as_dict()
else:
frappe.msgprint(
diff --git a/erpnext/hr/doctype/process_payroll/test_process_payroll.py b/erpnext/hr/doctype/process_payroll/test_process_payroll.py
index 1f9ba26..cac43c4 100644
--- a/erpnext/hr/doctype/process_payroll/test_process_payroll.py
+++ b/erpnext/hr/doctype/process_payroll/test_process_payroll.py
@@ -16,10 +16,13 @@
fiscal_year = "_Test Fiscal Year 2016"
for data in frappe.get_all('Salary Component', fields = ["name"]):
- if not frappe.db.get_value('Salary Component Account', {'parent': data.name, 'company': erpnext.get_default_company()}, 'name'):
+ if not frappe.db.get_value('Salary Component Account',
+ {'parent': data.name, 'company': erpnext.get_default_company()}, 'name'):
get_salary_component_account(data.name)
- payment_account = frappe.get_value('Account', {'account_type': 'Cash', 'company': erpnext.get_default_company(),'is_group':0}, "name")
+ payment_account = frappe.get_value('Account',
+ {'account_type': 'Cash', 'company': erpnext.get_default_company(),'is_group':0}, "name")
+
if not frappe.db.get_value("Salary Slip", {"start_date": "2016-11-01", "end_date": "2016-11-30"}):
process_payroll = frappe.get_doc("Process Payroll", "Process Payroll")
process_payroll.company = erpnext.get_default_company()