[Tests] Staffing Plan (#14585)
* Add test case for Staffing Plan * Fix codacy
This commit is contained in:
parent
f972e7b259
commit
0cb0c0b642
@ -8,6 +8,9 @@ from frappe.model.document import Document
|
|||||||
from frappe import _
|
from frappe import _
|
||||||
from frappe.utils import getdate, nowdate, cint, flt
|
from frappe.utils import getdate, nowdate, cint, flt
|
||||||
|
|
||||||
|
class SubsidiaryCompanyError(frappe.ValidationError): pass
|
||||||
|
class ParentCompanyError(frappe.ValidationError): pass
|
||||||
|
|
||||||
class StaffingPlan(Document):
|
class StaffingPlan(Document):
|
||||||
def validate(self):
|
def validate(self):
|
||||||
# Validate Dates
|
# Validate Dates
|
||||||
@ -55,23 +58,22 @@ class StaffingPlan(Document):
|
|||||||
# Get staffing plan applicable for the company (Parent Company)
|
# Get staffing plan applicable for the company (Parent Company)
|
||||||
parent_plan_details = get_active_staffing_plan_details(self.company, staffing_plan_detail.designation, self.from_date, self.to_date)
|
parent_plan_details = get_active_staffing_plan_details(self.company, staffing_plan_detail.designation, self.from_date, self.to_date)
|
||||||
if not parent_plan_details:
|
if not parent_plan_details:
|
||||||
return #no staffing plan for any parent Company in herarchy
|
return #no staffing plan for any parent Company in hierarchy
|
||||||
|
|
||||||
# Fetch parent company which owns the staffing plan. NOTE: Parent could be higher up in the heirarchy
|
# Fetch parent company which owns the staffing plan. NOTE: Parent could be higher up in the hierarchy
|
||||||
parent_company = frappe.db.get_value("Staffing Plan", parent_plan_details[0].name, "company")
|
parent_company = frappe.db.get_value("Staffing Plan", parent_plan_details[0].name, "company")
|
||||||
|
|
||||||
# Parent plan available, validate with parent, siblings as well as children of staffing plan Company
|
# Parent plan available, validate with parent, siblings as well as children of staffing plan Company
|
||||||
if staffing_plan_detail.vacancies > cint(parent_plan_details[0].vacancies) or \
|
if cint(staffing_plan_detail.vacancies) > cint(parent_plan_details[0].vacancies) or \
|
||||||
staffing_plan_detail.total_estimated_cost > flt(parent_plan_details[0].total_estimated_cost):
|
flt(staffing_plan_detail.total_estimated_cost) > flt(parent_plan_details[0].total_estimated_cost):
|
||||||
frappe.throw(_("You can only plan for upto {0} vacancies and budget {1} \
|
frappe.throw(_("You can only plan for upto {0} vacancies and budget {1} \
|
||||||
for {2} as per staffing plan {3} for parent company {4}"
|
for {2} as per staffing plan {3} for parent company {4}."
|
||||||
.format(cint(parent_plan_details[0].vacancies),
|
.format(cint(parent_plan_details[0].vacancies),
|
||||||
parent_plan_details[0].total_estimated_cost,
|
parent_plan_details[0].total_estimated_cost,
|
||||||
frappe.bold(staffing_plan_detail.designation),
|
frappe.bold(staffing_plan_detail.designation),
|
||||||
parent_plan_details[0].name,
|
parent_plan_details[0].name,
|
||||||
parent_company)))
|
parent_company)), ParentCompanyError)
|
||||||
|
|
||||||
#Get vacanices already planned for all companies down the herarchy of Parent Company
|
#Get vacanices already planned for all companies down the hierarchy of Parent Company
|
||||||
lft, rgt = frappe.db.get_value("Company", parent_company, ["lft", "rgt"])
|
lft, rgt = frappe.db.get_value("Company", parent_company, ["lft", "rgt"])
|
||||||
all_sibling_details = frappe.db.sql("""select sum(spd.vacancies) as vacancies,
|
all_sibling_details = frappe.db.sql("""select sum(spd.vacancies) as vacancies,
|
||||||
sum(spd.total_estimated_cost) as total_estimated_cost
|
sum(spd.total_estimated_cost) as total_estimated_cost
|
||||||
@ -82,11 +84,11 @@ class StaffingPlan(Document):
|
|||||||
""", (staffing_plan_detail.designation, self.from_date, self.to_date, lft, rgt), as_dict = 1)[0]
|
""", (staffing_plan_detail.designation, self.from_date, self.to_date, lft, rgt), as_dict = 1)[0]
|
||||||
|
|
||||||
if (cint(parent_plan_details[0].vacancies) < \
|
if (cint(parent_plan_details[0].vacancies) < \
|
||||||
(staffing_plan_detail.vacancies + cint(all_sibling_details.vacancies))) or \
|
(cint(staffing_plan_detail.vacancies) + cint(all_sibling_details.vacancies))) or \
|
||||||
(flt(parent_plan_details[0].total_estimated_cost) < \
|
(flt(parent_plan_details[0].total_estimated_cost) < \
|
||||||
(staffing_plan_detail.total_estimated_cost + flt(all_sibling_details.total_estimated_cost))):
|
(flt(staffing_plan_detail.total_estimated_cost) + flt(all_sibling_details.total_estimated_cost))):
|
||||||
frappe.throw(_("{0} vacancies and {1} budget for {2} already planned for subsidiary companies of {3}. \
|
frappe.throw(_("{0} vacancies and {1} budget for {2} already planned for subsidiary companies of {3}. \
|
||||||
You can only plan for upto {4} vacancies and and budget {5} as per staffing plan {6} for parent company {3}"
|
You can only plan for upto {4} vacancies and and budget {5} as per staffing plan {6} for parent company {3}."
|
||||||
.format(cint(all_sibling_details.vacancies),
|
.format(cint(all_sibling_details.vacancies),
|
||||||
all_sibling_details.total_estimated_cost,
|
all_sibling_details.total_estimated_cost,
|
||||||
frappe.bold(staffing_plan_detail.designation),
|
frappe.bold(staffing_plan_detail.designation),
|
||||||
@ -106,14 +108,14 @@ class StaffingPlan(Document):
|
|||||||
""", (staffing_plan_detail.designation, self.from_date, self.to_date, self.company), as_dict = 1)[0]
|
""", (staffing_plan_detail.designation, self.from_date, self.to_date, self.company), as_dict = 1)[0]
|
||||||
|
|
||||||
if children_details and \
|
if children_details and \
|
||||||
staffing_plan_detail.vacancies < cint(children_details.vacancies) or \
|
cint(staffing_plan_detail.vacancies) < cint(children_details.vacancies) or \
|
||||||
staffing_plan_detail.total_estimated_cost < flt(children_details.total_estimated_cost):
|
flt(staffing_plan_detail.total_estimated_cost) < flt(children_details.total_estimated_cost):
|
||||||
frappe.throw(_("Subsidiary companies have already planned for {1} vacancies at a budget of {2}. \
|
frappe.throw(_("Subsidiary companies have already planned for {1} vacancies at a budget of {2}. \
|
||||||
Staffing Plan for {0} should allocate more vacancies and budget for {3} than planned for its subsidiary companies"
|
Staffing Plan for {0} should allocate more vacancies and budget for {3} than planned for its subsidiary companies"
|
||||||
.format(self.company,
|
.format(self.company,
|
||||||
cint(children_details.vacancies),
|
cint(children_details.vacancies),
|
||||||
children_details.total_estimated_cost,
|
children_details.total_estimated_cost,
|
||||||
frappe.bold(staffing_plan_detail.designation))))
|
frappe.bold(staffing_plan_detail.designation))), SubsidiaryCompanyError)
|
||||||
|
|
||||||
@frappe.whitelist()
|
@frappe.whitelist()
|
||||||
def get_designation_counts(designation, company):
|
def get_designation_counts(designation, company):
|
||||||
|
@ -5,6 +5,98 @@ from __future__ import unicode_literals
|
|||||||
|
|
||||||
import frappe
|
import frappe
|
||||||
import unittest
|
import unittest
|
||||||
|
from erpnext.hr.doctype.staffing_plan.staffing_plan import SubsidiaryCompanyError
|
||||||
|
from erpnext.hr.doctype.staffing_plan.staffing_plan import ParentCompanyError
|
||||||
|
from frappe.utils import nowdate, add_days
|
||||||
|
|
||||||
|
test_dependencies = ["Designation"]
|
||||||
|
|
||||||
class TestStaffingPlan(unittest.TestCase):
|
class TestStaffingPlan(unittest.TestCase):
|
||||||
pass
|
def test_staffing_plan(self):
|
||||||
|
_set_up()
|
||||||
|
frappe.db.set_value("Company", "_Test Company", "is_group", 1)
|
||||||
|
make_company()
|
||||||
|
set_employees()
|
||||||
|
if frappe.db.exists("Staffing Plan", "Test"):
|
||||||
|
return
|
||||||
|
staffing_plan = frappe.new_doc("Staffing Plan")
|
||||||
|
staffing_plan.company = "_Test Company 3"
|
||||||
|
staffing_plan.name = "Test"
|
||||||
|
staffing_plan.from_date = nowdate()
|
||||||
|
staffing_plan.to_date = add_days(nowdate(), 10)
|
||||||
|
staffing_plan.append("staffing_details", {
|
||||||
|
"designation": "Researcher",
|
||||||
|
"number_of_positions": 6,
|
||||||
|
"estimated_cost_per_position": 50000
|
||||||
|
})
|
||||||
|
staffing_plan.insert()
|
||||||
|
staffing_plan.submit()
|
||||||
|
self.assertEqual(staffing_plan.total_estimated_budget, 250000.00)
|
||||||
|
|
||||||
|
def test_staffing_plan_subsidiary_company(self):
|
||||||
|
if frappe.db.exists("Staffing Plan", "Test 1"):
|
||||||
|
return
|
||||||
|
staffing_plan = frappe.new_doc("Staffing Plan")
|
||||||
|
staffing_plan.company = "_Test Company"
|
||||||
|
staffing_plan.name = "Test 1"
|
||||||
|
staffing_plan.from_date = nowdate()
|
||||||
|
staffing_plan.to_date = add_days(nowdate(), 10)
|
||||||
|
staffing_plan.append("staffing_details", {
|
||||||
|
"designation": "Researcher",
|
||||||
|
"number_of_positions": 3,
|
||||||
|
"estimated_cost_per_position": 45000
|
||||||
|
})
|
||||||
|
self.assertRaises(SubsidiaryCompanyError, staffing_plan.insert)
|
||||||
|
|
||||||
|
def test_staffing_plan_parent_company(self):
|
||||||
|
_set_up()
|
||||||
|
if frappe.db.exists("Staffing Plan", "Test"):
|
||||||
|
return
|
||||||
|
staffing_plan = frappe.new_doc("Staffing Plan")
|
||||||
|
staffing_plan.company = "_Test Company"
|
||||||
|
staffing_plan.name = "Test"
|
||||||
|
staffing_plan.from_date = nowdate()
|
||||||
|
staffing_plan.to_date = add_days(nowdate(), 10)
|
||||||
|
staffing_plan.append("staffing_details", {
|
||||||
|
"designation": "Researcher",
|
||||||
|
"number_of_positions": 7,
|
||||||
|
"estimated_cost_per_position": 50000
|
||||||
|
})
|
||||||
|
staffing_plan.insert()
|
||||||
|
staffing_plan.submit()
|
||||||
|
self.assertEqual(staffing_plan.total_estimated_budget, 250000.00)
|
||||||
|
if frappe.db.exists("Staffing Plan", "Test 1"):
|
||||||
|
return
|
||||||
|
staffing_plan = frappe.new_doc("Staffing Plan")
|
||||||
|
staffing_plan.company = "_Test Company 3"
|
||||||
|
staffing_plan.name = "Test 1"
|
||||||
|
staffing_plan.from_date = nowdate()
|
||||||
|
staffing_plan.to_date = add_days(nowdate(), 10)
|
||||||
|
staffing_plan.append("staffing_details", {
|
||||||
|
"designation": "Researcher",
|
||||||
|
"number_of_positions": 7,
|
||||||
|
"estimated_cost_per_position": 60000
|
||||||
|
})
|
||||||
|
staffing_plan.insert()
|
||||||
|
self.assertRaises(ParentCompanyError, staffing_plan.submit)
|
||||||
|
|
||||||
|
def _set_up():
|
||||||
|
for doctype in ["Staffing Plan", "Staffing Plan Detail"]:
|
||||||
|
frappe.db.sql("delete from `tab{doctype}`".format(doctype=doctype))
|
||||||
|
|
||||||
|
def make_company():
|
||||||
|
if frappe.db.exists("Company", "_Test Company 3"):
|
||||||
|
return
|
||||||
|
company = frappe.new_doc("Company")
|
||||||
|
company.company_name = "_Test Company 3"
|
||||||
|
company.abbr = "_TC3"
|
||||||
|
company.parent_company = "_Test Company"
|
||||||
|
company.default_currency = "INR"
|
||||||
|
company.country = "India"
|
||||||
|
company.insert()
|
||||||
|
|
||||||
|
def set_employees():
|
||||||
|
frappe.db.set_value("Employee", "_T-Employee-00001", "designation", "Researcher")
|
||||||
|
frappe.db.set_value("Employee", "_T-Employee-00001", "company", "_Test Company")
|
||||||
|
frappe.db.set_value("Employee", "_T-Employee-00002", "designation", "Researcher")
|
||||||
|
frappe.db.set_value("Employee", "_T-Employee-00002", "company", "_Test Company 3")
|
||||||
|
Loading…
x
Reference in New Issue
Block a user