brotherton-erpnext/erpnext/patches/v11_0/create_salary_structure_assignments.py
2022-03-28 18:52:46 +05:30

92 lines
2.8 KiB
Python

# Copyright (c) 2017, Frappe and Contributors
# License: GNU General Public License v3. See license.txt
from datetime import datetime
import frappe
from frappe.utils import getdate
from erpnext.payroll.doctype.salary_structure_assignment.salary_structure_assignment import (
DuplicateAssignment,
)
def execute():
frappe.reload_doc("Payroll", "doctype", "Salary Structure")
frappe.reload_doc("Payroll", "doctype", "Salary Structure Assignment")
frappe.db.sql(
"""
delete from `tabSalary Structure Assignment`
where salary_structure in (select name from `tabSalary Structure` where is_active='No' or docstatus!=1)
"""
)
if frappe.db.table_exists("Salary Structure Employee"):
ss_details = frappe.db.sql(
"""
select sse.employee, sse.employee_name, sse.from_date, sse.to_date,
sse.base, sse.variable, sse.parent as salary_structure, ss.company
from `tabSalary Structure Employee` sse, `tabSalary Structure` ss
where ss.name = sse.parent AND ss.is_active='Yes'
AND sse.employee in (select name from `tabEmployee` where ifNull(status, '') != 'Left')""",
as_dict=1,
)
else:
cols = ""
if "base" in frappe.db.get_table_columns("Salary Structure"):
cols = ", base, variable"
ss_details = frappe.db.sql(
"""
select name as salary_structure, employee, employee_name, from_date, to_date, company {0}
from `tabSalary Structure`
where is_active='Yes'
AND employee in (select name from `tabEmployee` where ifNull(status, '') != 'Left')
""".format(
cols
),
as_dict=1,
)
all_companies = frappe.db.get_all("Company", fields=["name", "default_currency"])
for d in all_companies:
company = d.name
company_currency = d.default_currency
frappe.db.sql(
"""update `tabSalary Structure` set currency = %s where company=%s""",
(company_currency, company),
)
for d in ss_details:
try:
joining_date, relieving_date = frappe.db.get_value(
"Employee", d.employee, ["date_of_joining", "relieving_date"]
)
from_date = d.from_date
if joining_date and getdate(from_date) < joining_date:
from_date = joining_date
elif relieving_date and getdate(from_date) > relieving_date:
continue
company_currency = frappe.db.get_value("Company", d.company, "default_currency")
s = frappe.new_doc("Salary Structure Assignment")
s.employee = d.employee
s.employee_name = d.employee_name
s.salary_structure = d.salary_structure
s.from_date = from_date
s.to_date = d.to_date if isinstance(d.to_date, datetime) else None
s.base = d.get("base")
s.variable = d.get("variable")
s.company = d.company
s.currency = company_currency
# to migrate the data of the old employees
s.flags.old_employee = True
s.save()
s.submit()
except DuplicateAssignment:
pass
frappe.db.sql("update `tabSalary Structure` set docstatus=1")