brotherton-erpnext/erpnext/hr/report/recruitment_analytics/recruitment_analytics.py
2022-03-28 18:52:46 +05:30

199 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 _
def execute(filters=None):
if not filters:
filters = {}
filters = frappe._dict(filters)
columns = get_columns()
data = get_data(filters)
return columns, data
def get_columns():
return [
{
"label": _("Staffing Plan"),
"fieldtype": "Link",
"fieldname": "staffing_plan",
"options": "Staffing Plan",
"width": 150,
},
{
"label": _("Job Opening"),
"fieldtype": "Link",
"fieldname": "job_opening",
"options": "Job Opening",
"width": 105,
},
{
"label": _("Job Applicant"),
"fieldtype": "Link",
"fieldname": "job_applicant",
"options": "Job Applicant",
"width": 150,
},
{"label": _("Applicant name"), "fieldtype": "data", "fieldname": "applicant_name", "width": 130},
{
"label": _("Application Status"),
"fieldtype": "Data",
"fieldname": "application_status",
"width": 150,
},
{
"label": _("Job Offer"),
"fieldtype": "Link",
"fieldname": "job_offer",
"options": "job Offer",
"width": 150,
},
{"label": _("Designation"), "fieldtype": "Data", "fieldname": "designation", "width": 100},
{"label": _("Offer Date"), "fieldtype": "date", "fieldname": "offer_date", "width": 100},
{
"label": _("Job Offer status"),
"fieldtype": "Data",
"fieldname": "job_offer_status",
"width": 150,
},
]
def get_data(filters):
data = []
staffing_plan_details = get_staffing_plan(filters)
staffing_plan_list = list(set([details["name"] for details in staffing_plan_details]))
sp_jo_map, jo_list = get_job_opening(staffing_plan_list)
jo_ja_map, ja_list = get_job_applicant(jo_list)
ja_joff_map = get_job_offer(ja_list)
for sp in sp_jo_map.keys():
parent_row = get_parent_row(sp_jo_map, sp, jo_ja_map, ja_joff_map)
data += parent_row
return data
def get_parent_row(sp_jo_map, sp, jo_ja_map, ja_joff_map):
data = []
if sp in sp_jo_map.keys():
for jo in sp_jo_map[sp]:
row = {
"staffing_plan": sp,
"job_opening": jo["name"],
}
data.append(row)
child_row = get_child_row(jo["name"], jo_ja_map, ja_joff_map)
data += child_row
return data
def get_child_row(jo, jo_ja_map, ja_joff_map):
data = []
if jo in jo_ja_map.keys():
for ja in jo_ja_map[jo]:
row = {
"indent": 1,
"job_applicant": ja.name,
"applicant_name": ja.applicant_name,
"application_status": ja.status,
}
if ja.name in ja_joff_map.keys():
jo_detail = ja_joff_map[ja.name][0]
row["job_offer"] = jo_detail.name
row["job_offer_status"] = jo_detail.status
row["offer_date"] = jo_detail.offer_date.strftime("%d-%m-%Y")
row["designation"] = jo_detail.designation
data.append(row)
return data
def get_staffing_plan(filters):
staffing_plan = frappe.db.sql(
"""
select
sp.name, sp.department, spd.designation, spd.vacancies, spd.current_count, spd.parent, sp.to_date
from
`tabStaffing Plan Detail` spd , `tabStaffing Plan` sp
where
spd.parent = sp.name
And
sp.to_date > '{0}'
""".format(
filters.on_date
),
as_dict=1,
)
return staffing_plan
def get_job_opening(sp_list):
job_openings = frappe.get_all(
"Job Opening", filters=[["staffing_plan", "IN", sp_list]], fields=["name", "staffing_plan"]
)
sp_jo_map = {}
jo_list = []
for openings in job_openings:
if openings.staffing_plan not in sp_jo_map.keys():
sp_jo_map[openings.staffing_plan] = [openings]
else:
sp_jo_map[openings.staffing_plan].append(openings)
jo_list.append(openings.name)
return sp_jo_map, jo_list
def get_job_applicant(jo_list):
jo_ja_map = {}
ja_list = []
applicants = frappe.get_all(
"Job Applicant",
filters=[["job_title", "IN", jo_list]],
fields=["name", "job_title", "applicant_name", "status"],
)
for applicant in applicants:
if applicant.job_title not in jo_ja_map.keys():
jo_ja_map[applicant.job_title] = [applicant]
else:
jo_ja_map[applicant.job_title].append(applicant)
ja_list.append(applicant.name)
return jo_ja_map, ja_list
def get_job_offer(ja_list):
ja_joff_map = {}
offers = frappe.get_all(
"Job Offer",
filters=[["job_applicant", "IN", ja_list]],
fields=["name", "job_applicant", "status", "offer_date", "designation"],
)
for offer in offers:
if offer.job_applicant not in ja_joff_map.keys():
ja_joff_map[offer.job_applicant] = [offer]
else:
ja_joff_map[offer.job_applicant].append(offer)
return ja_joff_map