192 lines
4.4 KiB
Python
192 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
|