174 lines
4.4 KiB
Python
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
|