From 0cb0c0b642fae9fb30fbfd6142a8ce1e135beab5 Mon Sep 17 00:00:00 2001 From: Shreya Shah Date: Wed, 20 Jun 2018 10:50:54 +0530 Subject: [PATCH] [Tests] Staffing Plan (#14585) * Add test case for Staffing Plan * Fix codacy --- .../hr/doctype/staffing_plan/staffing_plan.py | 30 +++--- .../staffing_plan/test_staffing_plan.py | 94 ++++++++++++++++++- 2 files changed, 109 insertions(+), 15 deletions(-) diff --git a/erpnext/hr/doctype/staffing_plan/staffing_plan.py b/erpnext/hr/doctype/staffing_plan/staffing_plan.py index 9632956231..ac3f25fb62 100644 --- a/erpnext/hr/doctype/staffing_plan/staffing_plan.py +++ b/erpnext/hr/doctype/staffing_plan/staffing_plan.py @@ -8,6 +8,9 @@ from frappe.model.document import Document from frappe import _ from frappe.utils import getdate, nowdate, cint, flt +class SubsidiaryCompanyError(frappe.ValidationError): pass +class ParentCompanyError(frappe.ValidationError): pass + class StaffingPlan(Document): def validate(self): # Validate Dates @@ -55,23 +58,22 @@ class StaffingPlan(Document): # 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) 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 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 \ - staffing_plan_detail.total_estimated_cost > flt(parent_plan_details[0].total_estimated_cost): + if cint(staffing_plan_detail.vacancies) > cint(parent_plan_details[0].vacancies) or \ + 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} \ - 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), parent_plan_details[0].total_estimated_cost, frappe.bold(staffing_plan_detail.designation), 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"]) all_sibling_details = frappe.db.sql("""select sum(spd.vacancies) as vacancies, 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] 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) < \ - (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}. \ - 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), all_sibling_details.total_estimated_cost, 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] if children_details and \ - staffing_plan_detail.vacancies < cint(children_details.vacancies) or \ - staffing_plan_detail.total_estimated_cost < flt(children_details.total_estimated_cost): + cint(staffing_plan_detail.vacancies) < cint(children_details.vacancies) or \ + 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}. \ Staffing Plan for {0} should allocate more vacancies and budget for {3} than planned for its subsidiary companies" .format(self.company, cint(children_details.vacancies), children_details.total_estimated_cost, - frappe.bold(staffing_plan_detail.designation)))) + frappe.bold(staffing_plan_detail.designation))), SubsidiaryCompanyError) @frappe.whitelist() def get_designation_counts(designation, company): diff --git a/erpnext/hr/doctype/staffing_plan/test_staffing_plan.py b/erpnext/hr/doctype/staffing_plan/test_staffing_plan.py index 426ab3ab64..d95284caa9 100644 --- a/erpnext/hr/doctype/staffing_plan/test_staffing_plan.py +++ b/erpnext/hr/doctype/staffing_plan/test_staffing_plan.py @@ -5,6 +5,98 @@ from __future__ import unicode_literals import frappe 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): - 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")