[Tests] Staffing Plan (#14585)

* Add test case for Staffing Plan

* Fix codacy
This commit is contained in:
Shreya Shah 2018-06-20 10:50:54 +05:30 committed by Nabin Hait
parent f972e7b259
commit 0cb0c0b642
2 changed files with 109 additions and 15 deletions

View File

@ -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):

View File

@ -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")