brotherton-erpnext/erpnext/payroll/report/bank_remittance/bank_remittance.py
2022-03-28 18:52:46 +05:30

174 lines
4.4 KiB
Python

# Copyright (c) 2013, Frappe Technologies Pvt. Ltd. and contributors
# For license information, please see license.txt
import frappe
from frappe import _, get_all
def execute(filters=None):
columns = [
{
"label": _("Payroll Number"),
"fieldtype": "Link",
"fieldname": "payroll_no",
"options": "Payroll Entry",
"width": 150,
},
{
"label": _("Debit A/C Number"),
"fieldtype": "Int",
"fieldname": "debit_account",
"hidden": 1,
"width": 200,
},
{"label": _("Payment Date"), "fieldtype": "Data", "fieldname": "payment_date", "width": 100},
{
"label": _("Employee Name"),
"fieldtype": "Link",
"fieldname": "employee_name",
"options": "Employee",
"width": 200,
},
{"label": _("Bank Name"), "fieldtype": "Data", "fieldname": "bank_name", "width": 50},
{
"label": _("Employee A/C Number"),
"fieldtype": "Int",
"fieldname": "employee_account_no",
"width": 50,
},
]
if frappe.db.has_column("Employee", "ifsc_code"):
columns.append(
{"label": _("IFSC Code"), "fieldtype": "Data", "fieldname": "bank_code", "width": 100}
)
columns += [
{"label": _("Currency"), "fieldtype": "Data", "fieldname": "currency", "width": 50},
{
"label": _("Net Salary Amount"),
"fieldtype": "Currency",
"options": "currency",
"fieldname": "amount",
"width": 100,
},
]
data = []
accounts = get_bank_accounts()
payroll_entries = get_payroll_entries(accounts, filters)
salary_slips = get_salary_slips(payroll_entries)
if frappe.db.has_column("Employee", "ifsc_code"):
get_emp_bank_ifsc_code(salary_slips)
for salary in salary_slips:
if (
salary.bank_name
and salary.bank_account_no
and salary.debit_acc_no
and salary.status in ["Submitted", "Paid"]
):
row = {
"payroll_no": salary.payroll_entry,
"debit_account": salary.debit_acc_no,
"payment_date": frappe.utils.formatdate(salary.modified.strftime("%Y-%m-%d")),
"bank_name": salary.bank_name,
"employee_account_no": salary.bank_account_no,
"bank_code": salary.ifsc_code,
"employee_name": salary.employee + ": " + salary.employee_name,
"currency": frappe.get_cached_value("Company", filters.company, "default_currency"),
"amount": salary.net_pay,
}
data.append(row)
return columns, data
def get_bank_accounts():
accounts = [d.name for d in get_all("Account", filters={"account_type": "Bank"})]
return accounts
def get_payroll_entries(accounts, filters):
payroll_filter = [
("payment_account", "IN", accounts),
("number_of_employees", ">", 0),
("Company", "=", filters.company),
]
if filters.to_date:
payroll_filter.append(("posting_date", "<", filters.to_date))
if filters.from_date:
payroll_filter.append(("posting_date", ">", filters.from_date))
entries = get_all("Payroll Entry", payroll_filter, ["name", "payment_account"])
payment_accounts = [d.payment_account for d in entries]
entries = set_company_account(payment_accounts, entries)
return entries
def get_salary_slips(payroll_entries):
payroll = [d.name for d in payroll_entries]
salary_slips = get_all(
"Salary Slip",
filters=[("payroll_entry", "IN", payroll)],
fields=[
"modified",
"net_pay",
"bank_name",
"bank_account_no",
"payroll_entry",
"employee",
"employee_name",
"status",
],
)
payroll_entry_map = {}
for entry in payroll_entries:
payroll_entry_map[entry.name] = entry
# appending company debit accounts
for slip in salary_slips:
if slip.payroll_entry:
slip["debit_acc_no"] = payroll_entry_map[slip.payroll_entry]["company_account"]
else:
slip["debit_acc_no"] = None
return salary_slips
def get_emp_bank_ifsc_code(salary_slips):
emp_names = [d.employee for d in salary_slips]
ifsc_codes = get_all("Employee", [("name", "IN", emp_names)], ["ifsc_code", "name"])
ifsc_codes_map = {}
for code in ifsc_codes:
ifsc_codes_map[code.name] = code
for slip in salary_slips:
slip["ifsc_code"] = ifsc_codes_map[code.name]["ifsc_code"]
return salary_slips
def set_company_account(payment_accounts, payroll_entries):
company_accounts = get_all(
"Bank Account", [("account", "in", payment_accounts)], ["account", "bank_account_no"]
)
company_accounts_map = {}
for acc in company_accounts:
company_accounts_map[acc.account] = acc
for entry in payroll_entries:
company_account = ""
if entry.payment_account in company_accounts_map:
company_account = company_accounts_map[entry.payment_account]["bank_account_no"]
entry["company_account"] = company_account
return payroll_entries