blob: 8ab053719d852c5db77cfd61b12dd0528d528352 [file] [log] [blame]
Anand Doshi885e0742015-03-03 14:55:30 +05301# Copyright (c) 2015, Frappe Technologies Pvt. Ltd. and Contributors
Rushabh Mehtae67d1fb2013-08-05 14:59:54 +05302# License: GNU General Public License v3. See license.txt
Anand Doshi60666a22013-04-12 20:19:53 +05303
4from __future__ import unicode_literals
Rushabh Mehta793ba6b2014-02-14 15:47:51 +05305import frappe
6from frappe import _
Ranjithfddfffd2018-05-05 13:27:26 +05307from frappe.utils import formatdate, format_datetime
8from frappe.utils import getdate, get_datetime
Manas Solankib6988462018-05-10 18:07:20 +05309from frappe.model.document import Document
10from frappe.desk.form import assign_to
11
12class EmployeeBoardingController(Document):
13 '''
14 Create the project and the task for the boarding process
15 Assign to the concerned person and roles as per the onboarding/separation template
16 '''
17 def validate(self):
18 # remove the task if linked before submitting the form
19 if self.amended_from:
20 for activity in self.activities:
21 activity.task = ''
22
23 def on_submit(self):
24 # create the project for the given employee onboarding
Manas Solanki094e1842018-05-14 20:33:28 +053025 project_name = _(self.doctype) + " : " + self.employee_name
Manas Solankib6988462018-05-10 18:07:20 +053026 if self.doctype == "Employee Onboarding":
27 project_name += " (" + self.job_applicant + ")"
28 else:
29 project_name += " (" + self.employee + ")"
30 project = frappe.get_doc({
31 "doctype": "Project",
32 "project_name": project_name,
33 "expected_start_date": self.date_of_joining if self.doctype == "Employee Onboarding" else self.resignation_letter_date,
34 "department": self.department,
35 "company": self.company
36 }).insert(ignore_permissions=True)
37 self.db_set("project", project.name)
38
39 # create the task for the given project and assign to the concerned person
40 for activity in self.activities:
41 task = frappe.get_doc({
42 "doctype": "Task",
43 "project": project.name,
Manas Solanki094e1842018-05-14 20:33:28 +053044 "subject": activity.activity_name + " : " + self.employee_name,
Manas Solankib6988462018-05-10 18:07:20 +053045 "description": activity.description,
46 "department": self.department,
47 "company": self.company
48 }).insert(ignore_permissions=True)
49 activity.db_set("task", task.name)
50 users = [activity.user] if activity.user else []
51 if activity.role:
52 user_list = frappe.db.sql_list('''select distinct(parent) from `tabHas Role`
53 where parenttype='User' and role=%s''', activity.role)
54 users = users + user_list
55
56 # assign the task the users
57 if users:
58 self.assign_task_to_users(task, set(users))
59
60 def assign_task_to_users(self, task, users):
61 for user in users:
62 args = {
63 'assign_to' : user,
64 'doctype' : task.doctype,
65 'name' : task.name,
66 'description' : task.description or task.subject,
67 }
68 assign_to.add(args)
69
70 def on_cancel(self):
71 # delete task project
72 for task in frappe.get_all("Task", filters={"project": self.project}):
73 frappe.delete_doc("Task", task.name)
74 frappe.delete_doc("Project", self.project)
75 self.db_set('project', '')
76 for activity in self.activities:
77 activity.db_set("task", "")
78
79
80@frappe.whitelist()
81def get_onboarding_details(parent, parenttype):
82 return frappe.get_list("Employee Boarding Activity",
83 fields=["activity_name", "role", "user", "required_for_employee_creation", "description"],
84 filters={"parent": parent, "parenttype": parenttype},
85 order_by= "idx")
86
Anand Doshi60666a22013-04-12 20:19:53 +053087
Anand Doshic280d062014-05-30 14:43:36 +053088def set_employee_name(doc):
89 if doc.employee and not doc.employee_name:
90 doc.employee_name = frappe.db.get_value("Employee", doc.employee, "employee_name")
Ranjithfddfffd2018-05-05 13:27:26 +053091
Manas Solankib6988462018-05-10 18:07:20 +053092def update_employee(employee, details, cancel=False):
93 for item in details:
94 fieldtype = frappe.get_meta("Employee").get_field(item.fieldname).fieldtype
95 new_data = item.new if not cancel else item.current
96 if fieldtype == "Date" and new_data:
97 new_data = getdate(new_data)
98 elif fieldtype =="Datetime" and new_data:
99 new_data = get_datetime(new_data)
100 setattr(employee, item.fieldname, new_data)
101 return employee
102
Ranjithfddfffd2018-05-05 13:27:26 +0530103@frappe.whitelist()
104def get_employee_fields_label():
105 fields = []
106 for df in frappe.get_meta("Employee").get("fields"):
107 if df.fieldtype in ["Data", "Date", "Datetime", "Float", "Int",
108 "Link", "Percent", "Select", "Small Text"] and df.fieldname not in ["lft", "rgt", "old_parent"]:
109 fields.append({"value": df.fieldname, "label": df.label})
110 return fields
111
112@frappe.whitelist()
113def get_employee_field_property(employee, fieldname):
114 if employee and fieldname:
115 field = frappe.get_meta("Employee").get_field(fieldname)
116 value = frappe.db.get_value("Employee", employee, fieldname)
117 options = field.options
118 if field.fieldtype == "Date":
119 value = formatdate(value)
120 elif field.fieldtype == "Datetime":
121 value = format_datetime(value)
122 return {
123 "value" : value,
124 "datatype" : field.fieldtype,
125 "label" : field.label,
126 "options" : options
127 }
128 else:
129 return False
130
131def update_employee(employee, details, cancel=False):
132 for item in details:
133 fieldtype = frappe.get_meta("Employee").get_field(item.fieldname).fieldtype
134 new_data = item.new if not cancel else item.current
135 if fieldtype == "Date" and new_data:
136 new_data = getdate(new_data)
137 elif fieldtype =="Datetime" and new_data:
138 new_data = get_datetime(new_data)
139 setattr(employee, item.fieldname, new_data)
140 return employee
Ranjith5a8e6422018-05-10 15:06:49 +0530141
142def validate_tax_declaration(declarations):
143 subcategories = []
144 for declaration in declarations:
145 if declaration.exemption_sub_category in subcategories:
146 frappe.throw(_("More than one selection for {0} not \
147 allowed").format(declaration.exemption_sub_category), frappe.ValidationError)
148 subcategories.append(declaration.exemption_sub_category)
149 max_amount = frappe.db.get_value("Employee Tax Exemption Sub Category", \
150 declaration.exemption_sub_category, "max_amount")
151 if declaration.amount > max_amount:
152 frappe.throw(_("Max exemption amount for {0} is {1}").format(\
153 declaration.exemption_sub_category, max_amount), frappe.ValidationError)
rohitwaghchaure3f0c7352018-05-14 20:47:35 +0530154
Saurabha35dad72018-05-10 19:47:41 +0530155def get_leave_period(from_date, to_date, company):
Saurabhc1acbdf2018-05-12 17:45:22 +0530156 leave_period = frappe.db.sql("""
157 select name, from_date, to_date
158 from `tabLeave Period`
159 where company=%(company)s and is_active=1
160 and (from_date between %(from_date)s and %(to_date)s
161 or to_date between %(from_date)s and %(to_date)s
162 or (from_date < %(from_date)s and to_date > %(to_date)s))
163 """, {
164 "from_date": from_date,
165 "to_date": to_date,
166 "company": company
167 }, as_dict=1)
168
169 if leave_period:
170 return leave_period
rohitwaghchaure3f0c7352018-05-14 20:47:35 +0530171