jey_erp/jey_erp/custom/bulk_salary_structure_assig...

55 lines
1.6 KiB
Python

import frappe
from frappe.query_builder.custom import ConstantColumn
from frappe.query_builder.functions import Coalesce
from frappe.query_builder.terms import SubQuery
from hrms.payroll.doctype.bulk_salary_structure_assignment.bulk_salary_structure_assignment import (
BulkSalaryStructureAssignment,
)
class CustomBulkSalaryStructureAssignment(BulkSalaryStructureAssignment):
@frappe.whitelist()
def get_employees(self, advanced_filters: list) -> list:
quick_filter_fields = [
"company",
"employment_type",
"branch",
"department",
"designation",
"grade",
]
filters = [[d, "=", self.get(d)] for d in quick_filter_fields if self.get(d)]
filters += advanced_filters
Assignment = frappe.qb.DocType("Salary Structure Assignment")
employees_with_assignments = SubQuery(
frappe.qb.from_(Assignment)
.select(Assignment.employee)
.distinct()
.where((Assignment.from_date == self.from_date) & (Assignment.docstatus == 1))
)
Employee = frappe.qb.DocType("Employee")
Grade = frappe.qb.DocType("Employee Grade")
query = (
frappe.qb.get_query(
Employee,
fields=[Employee.employee, Employee.employee_name, Employee.grade],
filters=filters,
)
.where(
(Employee.status == "Active")
& (Employee.date_of_joining <= self.from_date)
& ((Employee.relieving_date > self.from_date) | (Employee.relieving_date.isnull()))
& (Employee.employee.notin(employees_with_assignments))
)
.left_join(Grade)
.on(Employee.grade == Grade.name)
.select(
Coalesce(Employee.ctc, Grade.default_base_pay, 0).as_("base"),
ConstantColumn(0).as_("variable"),
)
)
return query.run(as_dict=True)