Merge branch 'vjFaLk-make-employee' into develop
This commit is contained in:
commit
65397f6de1
@ -11,7 +11,6 @@ erpnext.hr.EmployeeController = frappe.ui.form.Controller.extend({
|
|||||||
},
|
},
|
||||||
|
|
||||||
onload: function() {
|
onload: function() {
|
||||||
if(this.frm.doc.__islocal) this.frm.set_value("employee_name", "");
|
|
||||||
this.frm.set_query("leave_approver", "leave_approvers", function() {
|
this.frm.set_query("leave_approver", "leave_approvers", function() {
|
||||||
return {
|
return {
|
||||||
filters: [["UserRole", "role", "=", "Leave Approver"]]
|
filters: [["UserRole", "role", "=", "Leave Approver"]]
|
||||||
|
|||||||
27
erpnext/hr/doctype/employee/employee.py
Normal file → Executable file
27
erpnext/hr/doctype/employee/employee.py
Normal file → Executable file
@ -12,21 +12,24 @@ from frappe.model.document import Document
|
|||||||
from frappe.model.mapper import get_mapped_doc
|
from frappe.model.mapper import get_mapped_doc
|
||||||
from erpnext.utilities.transaction_base import delete_events
|
from erpnext.utilities.transaction_base import delete_events
|
||||||
|
|
||||||
class EmployeeUserDisabledError(frappe.ValidationError): pass
|
|
||||||
|
class EmployeeUserDisabledError(frappe.ValidationError):
|
||||||
|
pass
|
||||||
|
|
||||||
|
|
||||||
class Employee(Document):
|
class Employee(Document):
|
||||||
def onload(self):
|
def onload(self):
|
||||||
self.get("__onload").salary_structure_exists = frappe.db.get_value("Salary Structure",
|
self.get("__onload").salary_structure_exists = frappe.db.get_value("Salary Structure",
|
||||||
{"employee": self.name, "is_active": "Yes", "docstatus": ["!=", 2]})
|
{"employee": self.name, "is_active": "Yes", "docstatus": ["!=", 2]})
|
||||||
|
|
||||||
def autoname(self):
|
def autoname(self):
|
||||||
naming_method = frappe.db.get_value("HR Settings", None, "emp_created_by")
|
naming_method = frappe.db.get_value("HR Settings", None, "emp_created_by")
|
||||||
if not naming_method:
|
if not naming_method:
|
||||||
throw(_("Please setup Employee Naming System in Human Resource > HR Settings"))
|
throw(_("Please setup Employee Naming System in Human Resource > HR Settings"))
|
||||||
else:
|
else:
|
||||||
if naming_method=='Naming Series':
|
if naming_method == 'Naming Series':
|
||||||
self.name = make_autoname(self.naming_series + '.####')
|
self.name = make_autoname(self.naming_series + '.####')
|
||||||
elif naming_method=='Employee Number':
|
elif naming_method == 'Employee Number':
|
||||||
self.name = self.employee_number
|
self.name = self.employee_number
|
||||||
|
|
||||||
self.employee = self.name
|
self.employee = self.name
|
||||||
@ -48,7 +51,8 @@ class Employee(Document):
|
|||||||
else:
|
else:
|
||||||
existing_user_id = frappe.db.get_value("Employee", self.name, "user_id")
|
existing_user_id = frappe.db.get_value("Employee", self.name, "user_id")
|
||||||
if existing_user_id:
|
if existing_user_id:
|
||||||
frappe.permissions.remove_user_permission("Employee", self.name, existing_user_id)
|
frappe.permissions.remove_user_permission(
|
||||||
|
"Employee", self.name, existing_user_id)
|
||||||
|
|
||||||
def on_update(self):
|
def on_update(self):
|
||||||
if self.user_id:
|
if self.user_id:
|
||||||
@ -113,7 +117,7 @@ class Employee(Document):
|
|||||||
elif self.relieving_date and self.date_of_joining and (getdate(self.relieving_date) <= getdate(self.date_of_joining)):
|
elif self.relieving_date and self.date_of_joining and (getdate(self.relieving_date) <= getdate(self.date_of_joining)):
|
||||||
throw(_("Relieving Date must be greater than Date of Joining"))
|
throw(_("Relieving Date must be greater than Date of Joining"))
|
||||||
|
|
||||||
elif self.contract_end_date and self.date_of_joining and (getdate(self.contract_end_date)<=getdate(self.date_of_joining)):
|
elif self.contract_end_date and self.date_of_joining and (getdate(self.contract_end_date) <= getdate(self.date_of_joining)):
|
||||||
throw(_("Contract End Date must be greater than Date of Joining"))
|
throw(_("Contract End Date must be greater than Date of Joining"))
|
||||||
|
|
||||||
def validate_email(self):
|
def validate_email(self):
|
||||||
@ -132,20 +136,21 @@ class Employee(Document):
|
|||||||
enabled = frappe.db.sql("""select name from `tabUser` where
|
enabled = frappe.db.sql("""select name from `tabUser` where
|
||||||
name=%s and enabled=1""", self.user_id)
|
name=%s and enabled=1""", self.user_id)
|
||||||
if not enabled:
|
if not enabled:
|
||||||
throw(_("User {0} is disabled").format(self.user_id), EmployeeUserDisabledError)
|
throw(_("User {0} is disabled").format(
|
||||||
|
self.user_id), EmployeeUserDisabledError)
|
||||||
|
|
||||||
def validate_duplicate_user_id(self):
|
def validate_duplicate_user_id(self):
|
||||||
employee = frappe.db.sql_list("""select name from `tabEmployee` where
|
employee = frappe.db.sql_list("""select name from `tabEmployee` where
|
||||||
user_id=%s and status='Active' and name!=%s""", (self.user_id, self.name))
|
user_id=%s and status='Active' and name!=%s""", (self.user_id, self.name))
|
||||||
if employee:
|
if employee:
|
||||||
throw(_("User {0} is already assigned to Employee {1}").format(self.user_id, employee[0]), frappe.DuplicateEntryError)
|
throw(_("User {0} is already assigned to Employee {1}").format(
|
||||||
|
self.user_id, employee[0]), frappe.DuplicateEntryError)
|
||||||
|
|
||||||
def validate_employee_leave_approver(self):
|
def validate_employee_leave_approver(self):
|
||||||
for l in self.get("leave_approvers")[:]:
|
for l in self.get("leave_approvers")[:]:
|
||||||
if "Leave Approver" not in frappe.get_roles(l.leave_approver):
|
if "Leave Approver" not in frappe.get_roles(l.leave_approver):
|
||||||
frappe.get_doc("User", l.leave_approver).add_roles("Leave Approver")
|
frappe.get_doc("User", l.leave_approver).add_roles("Leave Approver")
|
||||||
|
|
||||||
|
|
||||||
def validate_reports_to(self):
|
def validate_reports_to(self):
|
||||||
if self.reports_to == self.name:
|
if self.reports_to == self.name:
|
||||||
throw(_("Employee cannot report to himself."))
|
throw(_("Employee cannot report to himself."))
|
||||||
@ -153,6 +158,7 @@ class Employee(Document):
|
|||||||
def on_trash(self):
|
def on_trash(self):
|
||||||
delete_events(self.doctype, self.name)
|
delete_events(self.doctype, self.name)
|
||||||
|
|
||||||
|
|
||||||
@frappe.whitelist()
|
@frappe.whitelist()
|
||||||
def get_retirement_date(date_of_birth=None):
|
def get_retirement_date(date_of_birth=None):
|
||||||
import datetime
|
import datetime
|
||||||
@ -167,13 +173,14 @@ def get_retirement_date(date_of_birth=None):
|
|||||||
|
|
||||||
return ret
|
return ret
|
||||||
|
|
||||||
|
|
||||||
@frappe.whitelist()
|
@frappe.whitelist()
|
||||||
def make_salary_structure(source_name, target=None):
|
def make_salary_structure(source_name, target=None):
|
||||||
target = get_mapped_doc("Employee", source_name, {
|
target = get_mapped_doc("Employee", source_name, {
|
||||||
"Employee": {
|
"Employee": {
|
||||||
"doctype": "Salary Structure",
|
"doctype": "Salary Structure",
|
||||||
"field_map": {
|
"field_map": {
|
||||||
"name": "employee"
|
"name": "employee",
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|||||||
@ -28,7 +28,7 @@
|
|||||||
"print_hide_if_no_value": 0,
|
"print_hide_if_no_value": 0,
|
||||||
"read_only": 0,
|
"read_only": 0,
|
||||||
"report_hide": 0,
|
"report_hide": 0,
|
||||||
"reqd": 0,
|
"reqd": 1,
|
||||||
"search_index": 0,
|
"search_index": 0,
|
||||||
"set_only_once": 0,
|
"set_only_once": 0,
|
||||||
"unique": 0
|
"unique": 0
|
||||||
@ -52,7 +52,7 @@
|
|||||||
"print_hide_if_no_value": 0,
|
"print_hide_if_no_value": 0,
|
||||||
"read_only": 0,
|
"read_only": 0,
|
||||||
"report_hide": 0,
|
"report_hide": 0,
|
||||||
"reqd": 0,
|
"reqd": 1,
|
||||||
"search_index": 0,
|
"search_index": 0,
|
||||||
"set_only_once": 0,
|
"set_only_once": 0,
|
||||||
"unique": 0
|
"unique": 0
|
||||||
@ -76,7 +76,7 @@
|
|||||||
"print_hide_if_no_value": 0,
|
"print_hide_if_no_value": 0,
|
||||||
"read_only": 0,
|
"read_only": 0,
|
||||||
"report_hide": 0,
|
"report_hide": 0,
|
||||||
"reqd": 0,
|
"reqd": 1,
|
||||||
"search_index": 0,
|
"search_index": 0,
|
||||||
"set_only_once": 0,
|
"set_only_once": 0,
|
||||||
"unique": 0
|
"unique": 0
|
||||||
@ -184,7 +184,7 @@
|
|||||||
"issingle": 0,
|
"issingle": 0,
|
||||||
"istable": 0,
|
"istable": 0,
|
||||||
"max_attachments": 0,
|
"max_attachments": 0,
|
||||||
"modified": "2016-01-06 02:36:13.556143",
|
"modified": "2016-02-12 00:38:31.773297",
|
||||||
"modified_by": "Administrator",
|
"modified_by": "Administrator",
|
||||||
"module": "HR",
|
"module": "HR",
|
||||||
"name": "Job Applicant",
|
"name": "Job Applicant",
|
||||||
@ -214,5 +214,6 @@
|
|||||||
"read_only": 0,
|
"read_only": 0,
|
||||||
"read_only_onload": 0,
|
"read_only_onload": 0,
|
||||||
"search_fields": "applicant_name",
|
"search_fields": "applicant_name",
|
||||||
|
"sort_order": "ASC",
|
||||||
"title_field": "applicant_name"
|
"title_field": "applicant_name"
|
||||||
}
|
}
|
||||||
20
erpnext/hr/doctype/offer_letter/offer_letter.js
Normal file → Executable file
20
erpnext/hr/doctype/offer_letter/offer_letter.js
Normal file → Executable file
@ -1,10 +1,30 @@
|
|||||||
// Copyright (c) 2015, Frappe Technologies Pvt. Ltd. and Contributors
|
// Copyright (c) 2015, Frappe Technologies Pvt. Ltd. and Contributors
|
||||||
// License: GNU General Public License v3. See license.txt
|
// License: GNU General Public License v3. See license.txt
|
||||||
|
|
||||||
|
frappe.provide("erpnext.offer_letter");
|
||||||
|
|
||||||
frappe.ui.form.on("Offer Letter", {
|
frappe.ui.form.on("Offer Letter", {
|
||||||
select_terms: function(frm) {
|
select_terms: function(frm) {
|
||||||
frappe.model.get_value("Terms and Conditions", frm.doc.select_terms, "terms", function(value) {
|
frappe.model.get_value("Terms and Conditions", frm.doc.select_terms, "terms", function(value) {
|
||||||
frm.set_value("terms", value.terms);
|
frm.set_value("terms", value.terms);
|
||||||
});
|
});
|
||||||
|
},
|
||||||
|
|
||||||
|
refresh:function(frm){
|
||||||
|
if((!frm.doc.__islocal) && (frm.doc.status=='Accepted') && (frm.doc.docstatus===1)){
|
||||||
|
frm.add_custom_button(__('Make Employee'),
|
||||||
|
function() {
|
||||||
|
erpnext.offer_letter.make_employee(frm)
|
||||||
|
}
|
||||||
|
);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
});
|
});
|
||||||
|
|
||||||
|
erpnext.offer_letter.make_employee = function(frm) {
|
||||||
|
frappe.model.open_mapped_doc({
|
||||||
|
method: "erpnext.hr.doctype.offer_letter.offer_letter.make_employee",
|
||||||
|
frm: frm
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|||||||
@ -27,6 +27,7 @@
|
|||||||
"permlevel": 0,
|
"permlevel": 0,
|
||||||
"precision": "",
|
"precision": "",
|
||||||
"print_hide": 1,
|
"print_hide": 1,
|
||||||
|
"print_hide_if_no_value": 0,
|
||||||
"read_only": 0,
|
"read_only": 0,
|
||||||
"report_hide": 0,
|
"report_hide": 0,
|
||||||
"reqd": 1,
|
"reqd": 1,
|
||||||
@ -51,6 +52,7 @@
|
|||||||
"permlevel": 0,
|
"permlevel": 0,
|
||||||
"precision": "",
|
"precision": "",
|
||||||
"print_hide": 0,
|
"print_hide": 0,
|
||||||
|
"print_hide_if_no_value": 0,
|
||||||
"read_only": 1,
|
"read_only": 1,
|
||||||
"report_hide": 0,
|
"report_hide": 0,
|
||||||
"reqd": 1,
|
"reqd": 1,
|
||||||
@ -73,6 +75,7 @@
|
|||||||
"permlevel": 0,
|
"permlevel": 0,
|
||||||
"precision": "",
|
"precision": "",
|
||||||
"print_hide": 0,
|
"print_hide": 0,
|
||||||
|
"print_hide_if_no_value": 0,
|
||||||
"read_only": 0,
|
"read_only": 0,
|
||||||
"report_hide": 0,
|
"report_hide": 0,
|
||||||
"reqd": 0,
|
"reqd": 0,
|
||||||
@ -92,11 +95,12 @@
|
|||||||
"in_list_view": 0,
|
"in_list_view": 0,
|
||||||
"label": "Status",
|
"label": "Status",
|
||||||
"length": 0,
|
"length": 0,
|
||||||
"no_copy": 0,
|
"no_copy": 1,
|
||||||
"options": "Awaiting Response\nAccepted\nRejected",
|
"options": "Awaiting Response\nAccepted\nRejected",
|
||||||
"permlevel": 0,
|
"permlevel": 0,
|
||||||
"precision": "",
|
"precision": "",
|
||||||
"print_hide": 1,
|
"print_hide": 1,
|
||||||
|
"print_hide_if_no_value": 0,
|
||||||
"read_only": 0,
|
"read_only": 0,
|
||||||
"report_hide": 0,
|
"report_hide": 0,
|
||||||
"reqd": 0,
|
"reqd": 0,
|
||||||
@ -121,6 +125,7 @@
|
|||||||
"permlevel": 0,
|
"permlevel": 0,
|
||||||
"precision": "",
|
"precision": "",
|
||||||
"print_hide": 0,
|
"print_hide": 0,
|
||||||
|
"print_hide_if_no_value": 0,
|
||||||
"read_only": 0,
|
"read_only": 0,
|
||||||
"report_hide": 0,
|
"report_hide": 0,
|
||||||
"reqd": 0,
|
"reqd": 0,
|
||||||
@ -145,6 +150,7 @@
|
|||||||
"permlevel": 0,
|
"permlevel": 0,
|
||||||
"precision": "",
|
"precision": "",
|
||||||
"print_hide": 0,
|
"print_hide": 0,
|
||||||
|
"print_hide_if_no_value": 0,
|
||||||
"read_only": 0,
|
"read_only": 0,
|
||||||
"report_hide": 0,
|
"report_hide": 0,
|
||||||
"reqd": 1,
|
"reqd": 1,
|
||||||
@ -169,6 +175,7 @@
|
|||||||
"permlevel": 0,
|
"permlevel": 0,
|
||||||
"precision": "",
|
"precision": "",
|
||||||
"print_hide": 1,
|
"print_hide": 1,
|
||||||
|
"print_hide_if_no_value": 0,
|
||||||
"read_only": 0,
|
"read_only": 0,
|
||||||
"report_hide": 0,
|
"report_hide": 0,
|
||||||
"reqd": 1,
|
"reqd": 1,
|
||||||
@ -191,6 +198,7 @@
|
|||||||
"permlevel": 0,
|
"permlevel": 0,
|
||||||
"precision": "",
|
"precision": "",
|
||||||
"print_hide": 0,
|
"print_hide": 0,
|
||||||
|
"print_hide_if_no_value": 0,
|
||||||
"read_only": 0,
|
"read_only": 0,
|
||||||
"report_hide": 0,
|
"report_hide": 0,
|
||||||
"reqd": 0,
|
"reqd": 0,
|
||||||
@ -215,6 +223,7 @@
|
|||||||
"permlevel": 0,
|
"permlevel": 0,
|
||||||
"precision": "",
|
"precision": "",
|
||||||
"print_hide": 0,
|
"print_hide": 0,
|
||||||
|
"print_hide_if_no_value": 0,
|
||||||
"read_only": 0,
|
"read_only": 0,
|
||||||
"report_hide": 0,
|
"report_hide": 0,
|
||||||
"reqd": 0,
|
"reqd": 0,
|
||||||
@ -237,6 +246,7 @@
|
|||||||
"permlevel": 0,
|
"permlevel": 0,
|
||||||
"precision": "",
|
"precision": "",
|
||||||
"print_hide": 0,
|
"print_hide": 0,
|
||||||
|
"print_hide_if_no_value": 0,
|
||||||
"read_only": 0,
|
"read_only": 0,
|
||||||
"report_hide": 0,
|
"report_hide": 0,
|
||||||
"reqd": 0,
|
"reqd": 0,
|
||||||
@ -261,6 +271,7 @@
|
|||||||
"permlevel": 0,
|
"permlevel": 0,
|
||||||
"precision": "",
|
"precision": "",
|
||||||
"print_hide": 1,
|
"print_hide": 1,
|
||||||
|
"print_hide_if_no_value": 0,
|
||||||
"read_only": 0,
|
"read_only": 0,
|
||||||
"report_hide": 0,
|
"report_hide": 0,
|
||||||
"reqd": 0,
|
"reqd": 0,
|
||||||
@ -285,6 +296,7 @@
|
|||||||
"permlevel": 0,
|
"permlevel": 0,
|
||||||
"precision": "",
|
"precision": "",
|
||||||
"print_hide": 0,
|
"print_hide": 0,
|
||||||
|
"print_hide_if_no_value": 0,
|
||||||
"read_only": 0,
|
"read_only": 0,
|
||||||
"report_hide": 0,
|
"report_hide": 0,
|
||||||
"reqd": 0,
|
"reqd": 0,
|
||||||
@ -308,6 +320,7 @@
|
|||||||
"options": "Offer Letter",
|
"options": "Offer Letter",
|
||||||
"permlevel": 0,
|
"permlevel": 0,
|
||||||
"print_hide": 1,
|
"print_hide": 1,
|
||||||
|
"print_hide_if_no_value": 0,
|
||||||
"read_only": 1,
|
"read_only": 1,
|
||||||
"report_hide": 0,
|
"report_hide": 0,
|
||||||
"reqd": 0,
|
"reqd": 0,
|
||||||
@ -318,13 +331,14 @@
|
|||||||
],
|
],
|
||||||
"hide_heading": 0,
|
"hide_heading": 0,
|
||||||
"hide_toolbar": 0,
|
"hide_toolbar": 0,
|
||||||
|
"idx": 0,
|
||||||
"in_create": 0,
|
"in_create": 0,
|
||||||
"in_dialog": 0,
|
"in_dialog": 0,
|
||||||
"is_submittable": 1,
|
"is_submittable": 1,
|
||||||
"issingle": 0,
|
"issingle": 0,
|
||||||
"istable": 0,
|
"istable": 0,
|
||||||
"max_attachments": 0,
|
"max_attachments": 0,
|
||||||
"modified": "2015-11-16 06:29:50.746594",
|
"modified": "2016-02-12 00:33:04.068380",
|
||||||
"modified_by": "Administrator",
|
"modified_by": "Administrator",
|
||||||
"module": "HR",
|
"module": "HR",
|
||||||
"name": "Offer Letter",
|
"name": "Offer Letter",
|
||||||
|
|||||||
@ -4,6 +4,21 @@
|
|||||||
from __future__ import unicode_literals
|
from __future__ import unicode_literals
|
||||||
import frappe
|
import frappe
|
||||||
from frappe.model.document import Document
|
from frappe.model.document import Document
|
||||||
|
from frappe.model.mapper import get_mapped_doc
|
||||||
|
|
||||||
class OfferLetter(Document):
|
class OfferLetter(Document):
|
||||||
pass
|
pass
|
||||||
|
|
||||||
|
@frappe.whitelist()
|
||||||
|
def make_employee(source_name, target_doc=None):
|
||||||
|
def set_missing_values(source, target):
|
||||||
|
target.personal_email = frappe.db.get_value("Job Applicant", source.job_applicant, "email_id")
|
||||||
|
doc = get_mapped_doc("Offer Letter", source_name, {
|
||||||
|
"Offer Letter": {
|
||||||
|
"doctype": "Employee",
|
||||||
|
"field_map": {
|
||||||
|
"applicant_name": "employee_name",
|
||||||
|
}}
|
||||||
|
}, target_doc, set_missing_values)
|
||||||
|
return doc
|
||||||
|
|
||||||
|
|||||||
0
erpnext/hr/doctype/salary_structure/salary_structure.js
Normal file → Executable file
0
erpnext/hr/doctype/salary_structure/salary_structure.js
Normal file → Executable file
Loading…
x
Reference in New Issue
Block a user