107 lines
4.0 KiB
Python
107 lines
4.0 KiB
Python
# Copyright (c) 2013, Web Notes Technologies Pvt. Ltd. and Contributors
|
|
# License: GNU General Public License v3. See license.txt
|
|
|
|
from __future__ import unicode_literals
|
|
import webnotes
|
|
from webnotes.utils import flt, cstr
|
|
from webnotes import msgprint, _
|
|
|
|
def execute(filters=None):
|
|
if not filters: filters = {}
|
|
|
|
salary_slips = get_salary_slips(filters)
|
|
columns, earning_types, ded_types = get_columns(salary_slips)
|
|
ss_earning_map = get_ss_earning_map(salary_slips)
|
|
ss_ded_map = get_ss_ded_map(salary_slips)
|
|
|
|
|
|
data = []
|
|
for ss in salary_slips:
|
|
row = [ss.employee, ss.employee_name, ss.branch, ss.department, ss.designation,
|
|
ss.company, ss.month, ss.leave_withut_pay, ss.payment_days]
|
|
|
|
for e in earning_types:
|
|
row.append(ss_earning_map.get(ss.name, {}).get(e))
|
|
|
|
row += [ss.arrear_amount, ss.leave_encashment_amount, ss.gross_pay]
|
|
|
|
for d in ded_types:
|
|
row.append(ss_ded_map.get(ss.name, {}).get(d))
|
|
|
|
row += [ss.total_deduction, ss.net_pay]
|
|
|
|
data.append(row)
|
|
|
|
return columns, data
|
|
|
|
def get_columns(salary_slips):
|
|
columns = [
|
|
"Employee:Link/Employee:120", "Employee Name::140", "Branch:Link/Branch:120",
|
|
"Department:Link/Department:120", "Designation:Link/Designation:120",
|
|
"Company:Link/Company:120", "Month::80", "Leave Without pay:Float:130",
|
|
"Payment Days:Float:120"
|
|
]
|
|
|
|
earning_types = webnotes.conn.sql_list("""select distinct e_type from `tabSalary Slip Earning`
|
|
where ifnull(e_modified_amount, 0) != 0 and parent in (%s)""" %
|
|
(', '.join(['%s']*len(salary_slips))), tuple([d.name for d in salary_slips]))
|
|
|
|
ded_types = webnotes.conn.sql_list("""select distinct d_type from `tabSalary Slip Deduction`
|
|
where ifnull(d_modified_amount, 0) != 0 and parent in (%s)""" %
|
|
(', '.join(['%s']*len(salary_slips))), tuple([d.name for d in salary_slips]))
|
|
|
|
columns = columns + [(e + ":Link/Earning Type:120") for e in earning_types] + \
|
|
["Arrear Amount:Currency:120", "Leave Encashment Amount:Currency:150",
|
|
"Gross Pay:Currency:120"] + [(d + ":Link/Deduction Type:120") for d in ded_types] + \
|
|
["Total Deduction:Currency:120", "Net Pay:Currency:120"]
|
|
|
|
return columns, earning_types, ded_types
|
|
|
|
def get_salary_slips(filters):
|
|
conditions, filters = get_conditions(filters)
|
|
salary_slips = webnotes.conn.sql("""select * from `tabSalary Slip` where docstatus = 1 %s
|
|
order by employee, month""" % conditions, filters, as_dict=1)
|
|
|
|
if not salary_slips:
|
|
msgprint(_("No salary slip found for month: ") + cstr(filters.get("month")) +
|
|
_(" and year: ") + cstr(filters.get("fiscal_year")), raise_exception=1)
|
|
|
|
return salary_slips
|
|
|
|
def get_conditions(filters):
|
|
conditions = ""
|
|
if filters.get("month"):
|
|
month = ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov",
|
|
"Dec"].index(filters["month"]) + 1
|
|
filters["month"] = month
|
|
conditions += " and month = %(month)s"
|
|
|
|
if filters.get("fiscal_year"): conditions += " and fiscal_year = %(fiscal_year)s"
|
|
if filters.get("company"): conditions += " and company = %(company)s"
|
|
if filters.get("employee"): conditions += " and employee = %(employee)s"
|
|
|
|
return conditions, filters
|
|
|
|
def get_ss_earning_map(salary_slips):
|
|
ss_earnings = webnotes.conn.sql("""select parent, e_type, e_modified_amount
|
|
from `tabSalary Slip Earning` where parent in (%s)""" %
|
|
(', '.join(['%s']*len(salary_slips))), tuple([d.name for d in salary_slips]), as_dict=1)
|
|
|
|
ss_earning_map = {}
|
|
for d in ss_earnings:
|
|
ss_earning_map.setdefault(d.parent, webnotes._dict()).setdefault(d.e_type, [])
|
|
ss_earning_map[d.parent][d.e_type] = flt(d.e_modified_amount)
|
|
|
|
return ss_earning_map
|
|
|
|
def get_ss_ded_map(salary_slips):
|
|
ss_deductions = webnotes.conn.sql("""select parent, d_type, d_modified_amount
|
|
from `tabSalary Slip Deduction` where parent in (%s)""" %
|
|
(', '.join(['%s']*len(salary_slips))), tuple([d.name for d in salary_slips]), as_dict=1)
|
|
|
|
ss_ded_map = {}
|
|
for d in ss_deductions:
|
|
ss_ded_map.setdefault(d.parent, webnotes._dict()).setdefault(d.d_type, [])
|
|
ss_ded_map[d.parent][d.e_type] = flt(d.d_modified_amount)
|
|
|
|
return ss_ded_map |