55 lines
1.6 KiB
Python
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)
|