Grant leaves via modal and backgroud jobs (#15026)
This commit is contained in:
parent
89c87fd6a6
commit
9c735e43b0
File diff suppressed because it is too large
Load Diff
@ -88,15 +88,17 @@ class LeaveApplication(Document):
|
|||||||
self.validate_back_dated_application()
|
self.validate_back_dated_application()
|
||||||
|
|
||||||
def validate_dates_across_allocation(self):
|
def validate_dates_across_allocation(self):
|
||||||
def _get_leave_alloction_record(date):
|
if frappe.db.get_value("Leave Type", self.leave_type, "allow_negative"):
|
||||||
|
return
|
||||||
|
def _get_leave_allocation_record(date):
|
||||||
allocation = frappe.db.sql("""select name from `tabLeave Allocation`
|
allocation = frappe.db.sql("""select name from `tabLeave Allocation`
|
||||||
where employee=%s and leave_type=%s and docstatus=1
|
where employee=%s and leave_type=%s and docstatus=1
|
||||||
and %s between from_date and to_date""", (self.employee, self.leave_type, date))
|
and %s between from_date and to_date""", (self.employee, self.leave_type, date))
|
||||||
|
|
||||||
return allocation and allocation[0][0]
|
return allocation and allocation[0][0]
|
||||||
|
|
||||||
allocation_based_on_from_date = _get_leave_alloction_record(self.from_date)
|
allocation_based_on_from_date = _get_leave_allocation_record(self.from_date)
|
||||||
allocation_based_on_to_date = _get_leave_alloction_record(self.to_date)
|
allocation_based_on_to_date = _get_leave_allocation_record(self.to_date)
|
||||||
|
|
||||||
if not (allocation_based_on_from_date or allocation_based_on_to_date):
|
if not (allocation_based_on_from_date or allocation_based_on_to_date):
|
||||||
frappe.throw(_("Application period cannot be outside leave allocation period"))
|
frappe.throw(_("Application period cannot be outside leave allocation period"))
|
||||||
|
@ -4,6 +4,11 @@
|
|||||||
frappe.ui.form.on('Leave Period', {
|
frappe.ui.form.on('Leave Period', {
|
||||||
refresh: (frm)=>{
|
refresh: (frm)=>{
|
||||||
frm.set_df_property("grant_leaves", "hidden", frm.doc.__islocal ? 1:0);
|
frm.set_df_property("grant_leaves", "hidden", frm.doc.__islocal ? 1:0);
|
||||||
|
if(!frm.is_new()) {
|
||||||
|
frm.add_custom_button(__('Grant Leaves'), function () {
|
||||||
|
frm.trigger("grant_leaves");
|
||||||
|
});
|
||||||
|
}
|
||||||
},
|
},
|
||||||
from_date: (frm)=>{
|
from_date: (frm)=>{
|
||||||
if (frm.doc.from_date && !frm.doc.to_date) {
|
if (frm.doc.from_date && !frm.doc.to_date) {
|
||||||
@ -11,19 +16,6 @@ frappe.ui.form.on('Leave Period', {
|
|||||||
frm.set_value("to_date", frappe.datetime.add_days(a_year_from_start, -1));
|
frm.set_value("to_date", frappe.datetime.add_days(a_year_from_start, -1));
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
grant: (frm)=>{
|
|
||||||
frappe.call({
|
|
||||||
doc: frm.doc,
|
|
||||||
method: "grant_leave_allocation",
|
|
||||||
callback: function(r) {
|
|
||||||
if(!r.exc){
|
|
||||||
frm.reload_doc();
|
|
||||||
}
|
|
||||||
},
|
|
||||||
freeze: true,
|
|
||||||
freeze_message: __("Grant allocations......")
|
|
||||||
})
|
|
||||||
},
|
|
||||||
onload: (frm) => {
|
onload: (frm) => {
|
||||||
frm.set_query("department", function() {
|
frm.set_query("department", function() {
|
||||||
return {
|
return {
|
||||||
@ -32,5 +24,70 @@ frappe.ui.form.on('Leave Period', {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
},
|
||||||
|
grant_leaves: function(frm) {
|
||||||
|
var d = new frappe.ui.Dialog({
|
||||||
|
title: __('Grant Leaves'),
|
||||||
|
fields: [
|
||||||
|
{
|
||||||
|
"label": "Filter Employees By (Optional)",
|
||||||
|
"fieldname": "sec_break",
|
||||||
|
"fieldtype": "Section Break",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"label": "Employee Grade",
|
||||||
|
"fieldname": "grade",
|
||||||
|
"fieldtype": "Link",
|
||||||
|
"options": "Employee Grade"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"label": "Department",
|
||||||
|
"fieldname": "department",
|
||||||
|
"fieldtype": "Link",
|
||||||
|
"options": "Department"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"fieldname": "col_break",
|
||||||
|
"fieldtype": "Column Break",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"label": "Designation",
|
||||||
|
"fieldname": "designation",
|
||||||
|
"fieldtype": "Link",
|
||||||
|
"options": "Designation"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"label": "Employee",
|
||||||
|
"fieldname": "employee",
|
||||||
|
"fieldtype": "Link",
|
||||||
|
"options": "Employee"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"fieldname": "sec_break",
|
||||||
|
"fieldtype": "Section Break",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"label": "Add unused leaves from previous allocations",
|
||||||
|
"fieldname": "carry_forward_leaves",
|
||||||
|
"fieldtype": "Check"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
primary_action: function() {
|
||||||
|
var data = d.get_values();
|
||||||
|
|
||||||
|
frappe.call({
|
||||||
|
doc: frm.doc,
|
||||||
|
method: "grant_leave_allocation",
|
||||||
|
args: data,
|
||||||
|
callback: function(r) {
|
||||||
|
if(!r.exc) {
|
||||||
|
d.hide();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
},
|
||||||
|
primary_action_label: __('Grant')
|
||||||
|
});
|
||||||
|
d.show();
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
@ -1,585 +1,294 @@
|
|||||||
{
|
{
|
||||||
"allow_copy": 0,
|
"allow_copy": 0,
|
||||||
"allow_guest_to_view": 0,
|
"allow_guest_to_view": 0,
|
||||||
"allow_import": 1,
|
"allow_import": 1,
|
||||||
"allow_rename": 1,
|
"allow_rename": 1,
|
||||||
"autoname": "HR-LPR-.####",
|
"autoname": "HR-LPR-.####",
|
||||||
"beta": 0,
|
"beta": 0,
|
||||||
"creation": "2018-04-13 15:20:52.864288",
|
"creation": "2018-04-13 15:20:52.864288",
|
||||||
"custom": 0,
|
"custom": 0,
|
||||||
"docstatus": 0,
|
"docstatus": 0,
|
||||||
"doctype": "DocType",
|
"doctype": "DocType",
|
||||||
"document_type": "",
|
"document_type": "",
|
||||||
"editable_grid": 1,
|
"editable_grid": 1,
|
||||||
"engine": "InnoDB",
|
"engine": "InnoDB",
|
||||||
"fields": [
|
"fields": [
|
||||||
{
|
{
|
||||||
"allow_bulk_edit": 0,
|
"allow_bulk_edit": 0,
|
||||||
"allow_in_quick_entry": 0,
|
"allow_in_quick_entry": 0,
|
||||||
"allow_on_submit": 0,
|
"allow_on_submit": 0,
|
||||||
"bold": 0,
|
"bold": 0,
|
||||||
"collapsible": 0,
|
"collapsible": 0,
|
||||||
"columns": 0,
|
"columns": 0,
|
||||||
"fieldname": "from_date",
|
"fieldname": "from_date",
|
||||||
"fieldtype": "Date",
|
"fieldtype": "Date",
|
||||||
"hidden": 0,
|
"hidden": 0,
|
||||||
"ignore_user_permissions": 0,
|
"ignore_user_permissions": 0,
|
||||||
"ignore_xss_filter": 0,
|
"ignore_xss_filter": 0,
|
||||||
"in_filter": 0,
|
"in_filter": 0,
|
||||||
"in_global_search": 0,
|
"in_global_search": 0,
|
||||||
"in_list_view": 1,
|
"in_list_view": 1,
|
||||||
"in_standard_filter": 0,
|
"in_standard_filter": 0,
|
||||||
"label": "From Date",
|
"label": "From Date",
|
||||||
"length": 0,
|
"length": 0,
|
||||||
"no_copy": 0,
|
"no_copy": 0,
|
||||||
"permlevel": 0,
|
"permlevel": 0,
|
||||||
"precision": "",
|
"precision": "",
|
||||||
"print_hide": 0,
|
"print_hide": 0,
|
||||||
"print_hide_if_no_value": 0,
|
"print_hide_if_no_value": 0,
|
||||||
"read_only": 0,
|
"read_only": 0,
|
||||||
"remember_last_selected_value": 0,
|
"remember_last_selected_value": 0,
|
||||||
"report_hide": 0,
|
"report_hide": 0,
|
||||||
"reqd": 1,
|
"reqd": 1,
|
||||||
"search_index": 0,
|
"search_index": 0,
|
||||||
"set_only_once": 0,
|
"set_only_once": 0,
|
||||||
"translatable": 0,
|
"translatable": 0,
|
||||||
"unique": 0
|
"unique": 0
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"allow_bulk_edit": 0,
|
"allow_bulk_edit": 0,
|
||||||
"allow_in_quick_entry": 0,
|
"allow_in_quick_entry": 0,
|
||||||
"allow_on_submit": 0,
|
"allow_on_submit": 0,
|
||||||
"bold": 0,
|
"bold": 0,
|
||||||
"collapsible": 0,
|
"collapsible": 0,
|
||||||
"columns": 0,
|
"columns": 0,
|
||||||
"fieldname": "to_date",
|
"fieldname": "to_date",
|
||||||
"fieldtype": "Date",
|
"fieldtype": "Date",
|
||||||
"hidden": 0,
|
"hidden": 0,
|
||||||
"ignore_user_permissions": 0,
|
"ignore_user_permissions": 0,
|
||||||
"ignore_xss_filter": 0,
|
"ignore_xss_filter": 0,
|
||||||
"in_filter": 0,
|
"in_filter": 0,
|
||||||
"in_global_search": 0,
|
"in_global_search": 0,
|
||||||
"in_list_view": 1,
|
"in_list_view": 1,
|
||||||
"in_standard_filter": 0,
|
"in_standard_filter": 0,
|
||||||
"label": "To Date",
|
"label": "To Date",
|
||||||
"length": 0,
|
"length": 0,
|
||||||
"no_copy": 0,
|
"no_copy": 0,
|
||||||
"permlevel": 0,
|
"permlevel": 0,
|
||||||
"precision": "",
|
"precision": "",
|
||||||
"print_hide": 0,
|
"print_hide": 0,
|
||||||
"print_hide_if_no_value": 0,
|
"print_hide_if_no_value": 0,
|
||||||
"read_only": 0,
|
"read_only": 0,
|
||||||
"remember_last_selected_value": 0,
|
"remember_last_selected_value": 0,
|
||||||
"report_hide": 0,
|
"report_hide": 0,
|
||||||
"reqd": 1,
|
"reqd": 1,
|
||||||
"search_index": 0,
|
"search_index": 0,
|
||||||
"set_only_once": 0,
|
"set_only_once": 0,
|
||||||
"translatable": 0,
|
"translatable": 0,
|
||||||
"unique": 0
|
"unique": 0
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"allow_bulk_edit": 0,
|
"allow_bulk_edit": 0,
|
||||||
"allow_in_quick_entry": 0,
|
"allow_in_quick_entry": 0,
|
||||||
"allow_on_submit": 0,
|
"allow_on_submit": 0,
|
||||||
"bold": 0,
|
"bold": 0,
|
||||||
"collapsible": 0,
|
"collapsible": 0,
|
||||||
"columns": 0,
|
"columns": 0,
|
||||||
"fieldname": "column_break_3",
|
"fieldname": "column_break_3",
|
||||||
"fieldtype": "Column Break",
|
"fieldtype": "Column Break",
|
||||||
"hidden": 0,
|
"hidden": 0,
|
||||||
"ignore_user_permissions": 0,
|
"ignore_user_permissions": 0,
|
||||||
"ignore_xss_filter": 0,
|
"ignore_xss_filter": 0,
|
||||||
"in_filter": 0,
|
"in_filter": 0,
|
||||||
"in_global_search": 0,
|
"in_global_search": 0,
|
||||||
"in_list_view": 0,
|
"in_list_view": 0,
|
||||||
"in_standard_filter": 0,
|
"in_standard_filter": 0,
|
||||||
"length": 0,
|
"length": 0,
|
||||||
"no_copy": 0,
|
"no_copy": 0,
|
||||||
"permlevel": 0,
|
"permlevel": 0,
|
||||||
"precision": "",
|
"precision": "",
|
||||||
"print_hide": 0,
|
"print_hide": 0,
|
||||||
"print_hide_if_no_value": 0,
|
"print_hide_if_no_value": 0,
|
||||||
"read_only": 0,
|
"read_only": 0,
|
||||||
"remember_last_selected_value": 0,
|
"remember_last_selected_value": 0,
|
||||||
"report_hide": 0,
|
"report_hide": 0,
|
||||||
"reqd": 0,
|
"reqd": 0,
|
||||||
"search_index": 0,
|
"search_index": 0,
|
||||||
"set_only_once": 0,
|
"set_only_once": 0,
|
||||||
"translatable": 0,
|
"translatable": 0,
|
||||||
"unique": 0
|
"unique": 0
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"allow_bulk_edit": 0,
|
"allow_bulk_edit": 0,
|
||||||
"allow_in_quick_entry": 0,
|
"allow_in_quick_entry": 0,
|
||||||
"allow_on_submit": 0,
|
"allow_on_submit": 0,
|
||||||
"bold": 0,
|
"bold": 0,
|
||||||
"collapsible": 0,
|
"collapsible": 0,
|
||||||
"columns": 0,
|
"columns": 0,
|
||||||
"fieldname": "company",
|
"fieldname": "company",
|
||||||
"fieldtype": "Link",
|
"fieldtype": "Link",
|
||||||
"hidden": 0,
|
"hidden": 0,
|
||||||
"ignore_user_permissions": 0,
|
"ignore_user_permissions": 0,
|
||||||
"ignore_xss_filter": 0,
|
"ignore_xss_filter": 0,
|
||||||
"in_filter": 0,
|
"in_filter": 0,
|
||||||
"in_global_search": 0,
|
"in_global_search": 0,
|
||||||
"in_list_view": 1,
|
"in_list_view": 1,
|
||||||
"in_standard_filter": 0,
|
"in_standard_filter": 0,
|
||||||
"label": "Company",
|
"label": "Company",
|
||||||
"length": 0,
|
"length": 0,
|
||||||
"no_copy": 0,
|
"no_copy": 0,
|
||||||
"options": "Company",
|
"options": "Company",
|
||||||
"permlevel": 0,
|
"permlevel": 0,
|
||||||
"precision": "",
|
"precision": "",
|
||||||
"print_hide": 0,
|
"print_hide": 0,
|
||||||
"print_hide_if_no_value": 0,
|
"print_hide_if_no_value": 0,
|
||||||
"read_only": 0,
|
"read_only": 0,
|
||||||
"remember_last_selected_value": 0,
|
"remember_last_selected_value": 0,
|
||||||
"report_hide": 0,
|
"report_hide": 0,
|
||||||
"reqd": 1,
|
"reqd": 1,
|
||||||
"search_index": 0,
|
"search_index": 0,
|
||||||
"set_only_once": 0,
|
"set_only_once": 0,
|
||||||
"translatable": 0,
|
"translatable": 0,
|
||||||
"unique": 0
|
"unique": 0
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"allow_bulk_edit": 0,
|
"allow_bulk_edit": 0,
|
||||||
"allow_in_quick_entry": 0,
|
"allow_in_quick_entry": 0,
|
||||||
"allow_on_submit": 0,
|
"allow_on_submit": 0,
|
||||||
"bold": 0,
|
"bold": 0,
|
||||||
"collapsible": 0,
|
"collapsible": 0,
|
||||||
"columns": 0,
|
"columns": 0,
|
||||||
"fieldname": "is_active",
|
"fieldname": "is_active",
|
||||||
"fieldtype": "Check",
|
"fieldtype": "Check",
|
||||||
"hidden": 0,
|
"hidden": 0,
|
||||||
"ignore_user_permissions": 0,
|
"ignore_user_permissions": 0,
|
||||||
"ignore_xss_filter": 0,
|
"ignore_xss_filter": 0,
|
||||||
"in_filter": 0,
|
"in_filter": 0,
|
||||||
"in_global_search": 0,
|
"in_global_search": 0,
|
||||||
"in_list_view": 0,
|
"in_list_view": 0,
|
||||||
"in_standard_filter": 0,
|
"in_standard_filter": 0,
|
||||||
"label": "Is Active",
|
"label": "Is Active",
|
||||||
"length": 0,
|
"length": 0,
|
||||||
"no_copy": 0,
|
"no_copy": 0,
|
||||||
"permlevel": 0,
|
"permlevel": 0,
|
||||||
"precision": "",
|
"precision": "",
|
||||||
"print_hide": 0,
|
"print_hide": 0,
|
||||||
"print_hide_if_no_value": 0,
|
"print_hide_if_no_value": 0,
|
||||||
"read_only": 0,
|
"read_only": 0,
|
||||||
"remember_last_selected_value": 0,
|
"remember_last_selected_value": 0,
|
||||||
"report_hide": 0,
|
"report_hide": 0,
|
||||||
"reqd": 0,
|
"reqd": 0,
|
||||||
"search_index": 0,
|
"search_index": 0,
|
||||||
"set_only_once": 0,
|
"set_only_once": 0,
|
||||||
"translatable": 0,
|
"translatable": 0,
|
||||||
"unique": 0
|
"unique": 0
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"allow_bulk_edit": 0,
|
"allow_bulk_edit": 0,
|
||||||
"allow_in_quick_entry": 0,
|
"allow_in_quick_entry": 0,
|
||||||
"allow_on_submit": 0,
|
"allow_on_submit": 0,
|
||||||
"bold": 0,
|
"bold": 0,
|
||||||
"collapsible": 0,
|
"collapsible": 0,
|
||||||
"columns": 0,
|
"columns": 0,
|
||||||
"fieldname": "optional_holiday_list",
|
"fieldname": "optional_holiday_list",
|
||||||
"fieldtype": "Link",
|
"fieldtype": "Link",
|
||||||
"hidden": 0,
|
"hidden": 0,
|
||||||
"ignore_user_permissions": 0,
|
"ignore_user_permissions": 0,
|
||||||
"ignore_xss_filter": 0,
|
"ignore_xss_filter": 0,
|
||||||
"in_filter": 0,
|
"in_filter": 0,
|
||||||
"in_global_search": 0,
|
"in_global_search": 0,
|
||||||
"in_list_view": 0,
|
"in_list_view": 0,
|
||||||
"in_standard_filter": 0,
|
"in_standard_filter": 0,
|
||||||
"label": "Holiday List for Optional Leave",
|
"label": "Holiday List for Optional Leave",
|
||||||
"length": 0,
|
"length": 0,
|
||||||
"no_copy": 0,
|
"no_copy": 0,
|
||||||
"options": "Holiday List",
|
"options": "Holiday List",
|
||||||
"permlevel": 0,
|
"permlevel": 0,
|
||||||
"precision": "",
|
"precision": "",
|
||||||
"print_hide": 0,
|
"print_hide": 0,
|
||||||
"print_hide_if_no_value": 0,
|
"print_hide_if_no_value": 0,
|
||||||
"read_only": 0,
|
"read_only": 0,
|
||||||
"remember_last_selected_value": 0,
|
"remember_last_selected_value": 0,
|
||||||
"report_hide": 0,
|
"report_hide": 0,
|
||||||
"reqd": 0,
|
"reqd": 0,
|
||||||
"search_index": 0,
|
"search_index": 0,
|
||||||
"set_only_once": 0,
|
"set_only_once": 0,
|
||||||
"translatable": 0,
|
"translatable": 0,
|
||||||
"unique": 0
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"allow_bulk_edit": 0,
|
|
||||||
"allow_in_quick_entry": 0,
|
|
||||||
"allow_on_submit": 0,
|
|
||||||
"bold": 0,
|
|
||||||
"collapsible": 1,
|
|
||||||
"columns": 0,
|
|
||||||
"fieldname": "grant_leaves",
|
|
||||||
"fieldtype": "Section Break",
|
|
||||||
"hidden": 0,
|
|
||||||
"ignore_user_permissions": 0,
|
|
||||||
"ignore_xss_filter": 0,
|
|
||||||
"in_filter": 0,
|
|
||||||
"in_global_search": 0,
|
|
||||||
"in_list_view": 0,
|
|
||||||
"in_standard_filter": 0,
|
|
||||||
"label": "Grant Leaves Based on Leave Policy",
|
|
||||||
"length": 0,
|
|
||||||
"no_copy": 0,
|
|
||||||
"permlevel": 0,
|
|
||||||
"precision": "",
|
|
||||||
"print_hide": 0,
|
|
||||||
"print_hide_if_no_value": 0,
|
|
||||||
"read_only": 0,
|
|
||||||
"remember_last_selected_value": 0,
|
|
||||||
"report_hide": 0,
|
|
||||||
"reqd": 0,
|
|
||||||
"search_index": 0,
|
|
||||||
"set_only_once": 0,
|
|
||||||
"translatable": 0,
|
|
||||||
"unique": 0
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"allow_bulk_edit": 0,
|
|
||||||
"allow_in_quick_entry": 0,
|
|
||||||
"allow_on_submit": 0,
|
|
||||||
"bold": 0,
|
|
||||||
"collapsible": 0,
|
|
||||||
"columns": 0,
|
|
||||||
"fieldname": "filter_by",
|
|
||||||
"fieldtype": "Column Break",
|
|
||||||
"hidden": 0,
|
|
||||||
"ignore_user_permissions": 0,
|
|
||||||
"ignore_xss_filter": 0,
|
|
||||||
"in_filter": 0,
|
|
||||||
"in_global_search": 0,
|
|
||||||
"in_list_view": 0,
|
|
||||||
"in_standard_filter": 0,
|
|
||||||
"label": "Filter By",
|
|
||||||
"length": 0,
|
|
||||||
"no_copy": 0,
|
|
||||||
"permlevel": 0,
|
|
||||||
"precision": "",
|
|
||||||
"print_hide": 0,
|
|
||||||
"print_hide_if_no_value": 0,
|
|
||||||
"read_only": 0,
|
|
||||||
"remember_last_selected_value": 0,
|
|
||||||
"report_hide": 0,
|
|
||||||
"reqd": 0,
|
|
||||||
"search_index": 0,
|
|
||||||
"set_only_once": 0,
|
|
||||||
"translatable": 0,
|
|
||||||
"unique": 0
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"allow_bulk_edit": 0,
|
|
||||||
"allow_in_quick_entry": 0,
|
|
||||||
"allow_on_submit": 0,
|
|
||||||
"bold": 0,
|
|
||||||
"collapsible": 0,
|
|
||||||
"columns": 0,
|
|
||||||
"fieldname": "grade",
|
|
||||||
"fieldtype": "Link",
|
|
||||||
"hidden": 0,
|
|
||||||
"ignore_user_permissions": 0,
|
|
||||||
"ignore_xss_filter": 0,
|
|
||||||
"in_filter": 0,
|
|
||||||
"in_global_search": 0,
|
|
||||||
"in_list_view": 0,
|
|
||||||
"in_standard_filter": 0,
|
|
||||||
"label": "Employee Grade",
|
|
||||||
"length": 0,
|
|
||||||
"no_copy": 0,
|
|
||||||
"options": "Employee Grade",
|
|
||||||
"permlevel": 0,
|
|
||||||
"precision": "",
|
|
||||||
"print_hide": 0,
|
|
||||||
"print_hide_if_no_value": 0,
|
|
||||||
"read_only": 0,
|
|
||||||
"remember_last_selected_value": 0,
|
|
||||||
"report_hide": 0,
|
|
||||||
"reqd": 0,
|
|
||||||
"search_index": 0,
|
|
||||||
"set_only_once": 0,
|
|
||||||
"translatable": 0,
|
|
||||||
"unique": 0
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"allow_bulk_edit": 0,
|
|
||||||
"allow_in_quick_entry": 0,
|
|
||||||
"allow_on_submit": 0,
|
|
||||||
"bold": 0,
|
|
||||||
"collapsible": 0,
|
|
||||||
"columns": 0,
|
|
||||||
"fieldname": "department",
|
|
||||||
"fieldtype": "Link",
|
|
||||||
"hidden": 0,
|
|
||||||
"ignore_user_permissions": 0,
|
|
||||||
"ignore_xss_filter": 0,
|
|
||||||
"in_filter": 0,
|
|
||||||
"in_global_search": 0,
|
|
||||||
"in_list_view": 0,
|
|
||||||
"in_standard_filter": 0,
|
|
||||||
"label": "Department",
|
|
||||||
"length": 0,
|
|
||||||
"no_copy": 0,
|
|
||||||
"options": "Department",
|
|
||||||
"permlevel": 0,
|
|
||||||
"precision": "",
|
|
||||||
"print_hide": 0,
|
|
||||||
"print_hide_if_no_value": 0,
|
|
||||||
"read_only": 0,
|
|
||||||
"remember_last_selected_value": 0,
|
|
||||||
"report_hide": 0,
|
|
||||||
"reqd": 0,
|
|
||||||
"search_index": 0,
|
|
||||||
"set_only_once": 0,
|
|
||||||
"translatable": 0,
|
|
||||||
"unique": 0
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"allow_bulk_edit": 0,
|
|
||||||
"allow_in_quick_entry": 0,
|
|
||||||
"allow_on_submit": 0,
|
|
||||||
"bold": 0,
|
|
||||||
"collapsible": 0,
|
|
||||||
"columns": 0,
|
|
||||||
"fieldname": "designation",
|
|
||||||
"fieldtype": "Link",
|
|
||||||
"hidden": 0,
|
|
||||||
"ignore_user_permissions": 0,
|
|
||||||
"ignore_xss_filter": 0,
|
|
||||||
"in_filter": 0,
|
|
||||||
"in_global_search": 0,
|
|
||||||
"in_list_view": 0,
|
|
||||||
"in_standard_filter": 0,
|
|
||||||
"label": "Designation",
|
|
||||||
"length": 0,
|
|
||||||
"no_copy": 0,
|
|
||||||
"options": "Designation",
|
|
||||||
"permlevel": 0,
|
|
||||||
"precision": "",
|
|
||||||
"print_hide": 0,
|
|
||||||
"print_hide_if_no_value": 0,
|
|
||||||
"read_only": 0,
|
|
||||||
"remember_last_selected_value": 0,
|
|
||||||
"report_hide": 0,
|
|
||||||
"reqd": 0,
|
|
||||||
"search_index": 0,
|
|
||||||
"set_only_once": 0,
|
|
||||||
"translatable": 0,
|
|
||||||
"unique": 0
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"allow_bulk_edit": 0,
|
|
||||||
"allow_in_quick_entry": 0,
|
|
||||||
"allow_on_submit": 0,
|
|
||||||
"bold": 0,
|
|
||||||
"collapsible": 0,
|
|
||||||
"columns": 0,
|
|
||||||
"fieldname": "employee",
|
|
||||||
"fieldtype": "Link",
|
|
||||||
"hidden": 0,
|
|
||||||
"ignore_user_permissions": 0,
|
|
||||||
"ignore_xss_filter": 0,
|
|
||||||
"in_filter": 0,
|
|
||||||
"in_global_search": 0,
|
|
||||||
"in_list_view": 0,
|
|
||||||
"in_standard_filter": 0,
|
|
||||||
"label": "Employee",
|
|
||||||
"length": 0,
|
|
||||||
"no_copy": 0,
|
|
||||||
"options": "Employee",
|
|
||||||
"permlevel": 0,
|
|
||||||
"precision": "",
|
|
||||||
"print_hide": 0,
|
|
||||||
"print_hide_if_no_value": 0,
|
|
||||||
"read_only": 0,
|
|
||||||
"remember_last_selected_value": 0,
|
|
||||||
"report_hide": 0,
|
|
||||||
"reqd": 0,
|
|
||||||
"search_index": 0,
|
|
||||||
"set_only_once": 0,
|
|
||||||
"translatable": 0,
|
|
||||||
"unique": 0
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"allow_bulk_edit": 0,
|
|
||||||
"allow_in_quick_entry": 0,
|
|
||||||
"allow_on_submit": 0,
|
|
||||||
"bold": 0,
|
|
||||||
"collapsible": 0,
|
|
||||||
"columns": 0,
|
|
||||||
"fieldname": "grant",
|
|
||||||
"fieldtype": "Button",
|
|
||||||
"hidden": 0,
|
|
||||||
"ignore_user_permissions": 0,
|
|
||||||
"ignore_xss_filter": 0,
|
|
||||||
"in_filter": 0,
|
|
||||||
"in_global_search": 0,
|
|
||||||
"in_list_view": 0,
|
|
||||||
"in_standard_filter": 0,
|
|
||||||
"label": "Grant",
|
|
||||||
"length": 0,
|
|
||||||
"no_copy": 0,
|
|
||||||
"permlevel": 0,
|
|
||||||
"precision": "",
|
|
||||||
"print_hide": 0,
|
|
||||||
"print_hide_if_no_value": 0,
|
|
||||||
"read_only": 0,
|
|
||||||
"remember_last_selected_value": 0,
|
|
||||||
"report_hide": 0,
|
|
||||||
"reqd": 0,
|
|
||||||
"search_index": 0,
|
|
||||||
"set_only_once": 0,
|
|
||||||
"translatable": 0,
|
|
||||||
"unique": 0
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"allow_bulk_edit": 0,
|
|
||||||
"allow_in_quick_entry": 0,
|
|
||||||
"allow_on_submit": 0,
|
|
||||||
"bold": 0,
|
|
||||||
"collapsible": 0,
|
|
||||||
"columns": 0,
|
|
||||||
"fieldname": "column_break_12",
|
|
||||||
"fieldtype": "Column Break",
|
|
||||||
"hidden": 0,
|
|
||||||
"ignore_user_permissions": 0,
|
|
||||||
"ignore_xss_filter": 0,
|
|
||||||
"in_filter": 0,
|
|
||||||
"in_global_search": 0,
|
|
||||||
"in_list_view": 0,
|
|
||||||
"in_standard_filter": 0,
|
|
||||||
"length": 0,
|
|
||||||
"no_copy": 0,
|
|
||||||
"permlevel": 0,
|
|
||||||
"precision": "",
|
|
||||||
"print_hide": 0,
|
|
||||||
"print_hide_if_no_value": 0,
|
|
||||||
"read_only": 0,
|
|
||||||
"remember_last_selected_value": 0,
|
|
||||||
"report_hide": 0,
|
|
||||||
"reqd": 0,
|
|
||||||
"search_index": 0,
|
|
||||||
"set_only_once": 0,
|
|
||||||
"translatable": 0,
|
|
||||||
"unique": 0
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"allow_bulk_edit": 0,
|
|
||||||
"allow_in_quick_entry": 0,
|
|
||||||
"allow_on_submit": 0,
|
|
||||||
"bold": 0,
|
|
||||||
"collapsible": 0,
|
|
||||||
"columns": 0,
|
|
||||||
"fieldname": "carry_forward_leaves",
|
|
||||||
"fieldtype": "Check",
|
|
||||||
"hidden": 0,
|
|
||||||
"ignore_user_permissions": 0,
|
|
||||||
"ignore_xss_filter": 0,
|
|
||||||
"in_filter": 0,
|
|
||||||
"in_global_search": 0,
|
|
||||||
"in_list_view": 0,
|
|
||||||
"in_standard_filter": 0,
|
|
||||||
"label": "Carry Forward Leaves",
|
|
||||||
"length": 0,
|
|
||||||
"no_copy": 0,
|
|
||||||
"permlevel": 0,
|
|
||||||
"precision": "",
|
|
||||||
"print_hide": 0,
|
|
||||||
"print_hide_if_no_value": 0,
|
|
||||||
"read_only": 0,
|
|
||||||
"remember_last_selected_value": 0,
|
|
||||||
"report_hide": 0,
|
|
||||||
"reqd": 0,
|
|
||||||
"search_index": 0,
|
|
||||||
"set_only_once": 0,
|
|
||||||
"translatable": 0,
|
|
||||||
"unique": 0
|
"unique": 0
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"has_web_view": 0,
|
"has_web_view": 0,
|
||||||
"hide_heading": 0,
|
"hide_heading": 0,
|
||||||
"hide_toolbar": 0,
|
"hide_toolbar": 0,
|
||||||
"idx": 0,
|
"idx": 0,
|
||||||
"image_view": 0,
|
"image_view": 0,
|
||||||
"in_create": 0,
|
"in_create": 0,
|
||||||
"is_submittable": 0,
|
"is_submittable": 0,
|
||||||
"issingle": 0,
|
"issingle": 0,
|
||||||
"istable": 0,
|
"istable": 0,
|
||||||
"max_attachments": 0,
|
"max_attachments": 0,
|
||||||
"modified": "2018-07-02 08:15:51.853668",
|
"modified": "2018-07-27 13:36:08.458731",
|
||||||
"modified_by": "Administrator",
|
"modified_by": "Administrator",
|
||||||
"module": "HR",
|
"module": "HR",
|
||||||
"name": "Leave Period",
|
"name": "Leave Period",
|
||||||
"name_case": "",
|
"name_case": "",
|
||||||
"owner": "Administrator",
|
"owner": "Administrator",
|
||||||
"permissions": [
|
"permissions": [
|
||||||
{
|
{
|
||||||
"amend": 0,
|
"amend": 0,
|
||||||
"cancel": 0,
|
"cancel": 0,
|
||||||
"create": 1,
|
"create": 1,
|
||||||
"delete": 1,
|
"delete": 1,
|
||||||
"email": 1,
|
"email": 1,
|
||||||
"export": 1,
|
"export": 1,
|
||||||
"if_owner": 0,
|
"if_owner": 0,
|
||||||
"import": 0,
|
"import": 0,
|
||||||
"permlevel": 0,
|
"permlevel": 0,
|
||||||
"print": 1,
|
"print": 1,
|
||||||
"read": 1,
|
"read": 1,
|
||||||
"report": 1,
|
"report": 1,
|
||||||
"role": "System Manager",
|
"role": "System Manager",
|
||||||
"set_user_permissions": 0,
|
"set_user_permissions": 0,
|
||||||
"share": 1,
|
"share": 1,
|
||||||
"submit": 0,
|
"submit": 0,
|
||||||
"write": 1
|
"write": 1
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"amend": 0,
|
"amend": 0,
|
||||||
"cancel": 0,
|
"cancel": 0,
|
||||||
"create": 1,
|
"create": 1,
|
||||||
"delete": 1,
|
"delete": 1,
|
||||||
"email": 1,
|
"email": 1,
|
||||||
"export": 1,
|
"export": 1,
|
||||||
"if_owner": 0,
|
"if_owner": 0,
|
||||||
"import": 0,
|
"import": 0,
|
||||||
"permlevel": 0,
|
"permlevel": 0,
|
||||||
"print": 1,
|
"print": 1,
|
||||||
"read": 1,
|
"read": 1,
|
||||||
"report": 1,
|
"report": 1,
|
||||||
"role": "HR Manager",
|
"role": "HR Manager",
|
||||||
"set_user_permissions": 0,
|
"set_user_permissions": 0,
|
||||||
"share": 1,
|
"share": 1,
|
||||||
"submit": 0,
|
"submit": 0,
|
||||||
"write": 1
|
"write": 1
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"amend": 0,
|
"amend": 0,
|
||||||
"cancel": 0,
|
"cancel": 0,
|
||||||
"create": 1,
|
"create": 1,
|
||||||
"delete": 1,
|
"delete": 1,
|
||||||
"email": 1,
|
"email": 1,
|
||||||
"export": 1,
|
"export": 1,
|
||||||
"if_owner": 0,
|
"if_owner": 0,
|
||||||
"import": 0,
|
"import": 0,
|
||||||
"permlevel": 0,
|
"permlevel": 0,
|
||||||
"print": 1,
|
"print": 1,
|
||||||
"read": 1,
|
"read": 1,
|
||||||
"report": 1,
|
"report": 1,
|
||||||
"role": "HR User",
|
"role": "HR User",
|
||||||
"set_user_permissions": 0,
|
"set_user_permissions": 0,
|
||||||
"share": 1,
|
"share": 1,
|
||||||
"submit": 0,
|
"submit": 0,
|
||||||
"write": 1
|
"write": 1
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"quick_entry": 0,
|
"quick_entry": 0,
|
||||||
"read_only": 0,
|
"read_only": 0,
|
||||||
"read_only_onload": 0,
|
"read_only_onload": 0,
|
||||||
"show_name_in_global_search": 0,
|
"show_name_in_global_search": 0,
|
||||||
"sort_field": "modified",
|
"sort_field": "modified",
|
||||||
"sort_order": "DESC",
|
"sort_order": "DESC",
|
||||||
"track_changes": 1,
|
"track_changes": 1,
|
||||||
"track_seen": 0,
|
"track_seen": 0,
|
||||||
"track_views": 0
|
"track_views": 0
|
||||||
}
|
}
|
@ -8,91 +8,107 @@ from frappe import _
|
|||||||
from frappe.utils import getdate, cstr
|
from frappe.utils import getdate, cstr
|
||||||
from frappe.model.document import Document
|
from frappe.model.document import Document
|
||||||
from erpnext.hr.utils import validate_overlap, get_employee_leave_policy
|
from erpnext.hr.utils import validate_overlap, get_employee_leave_policy
|
||||||
|
from frappe.utils.background_jobs import enqueue
|
||||||
|
from six import iteritems
|
||||||
|
|
||||||
class LeavePeriod(Document):
|
class LeavePeriod(Document):
|
||||||
def get_employees(self):
|
def get_employees(self, args):
|
||||||
conditions, values = [], []
|
conditions, values = [], []
|
||||||
for field in ["grade", "designation", "department"]:
|
for field, value in iteritems(args):
|
||||||
if self.get(field):
|
if value:
|
||||||
conditions.append("{0}=%s".format(field))
|
conditions.append("{0}=%s".format(field))
|
||||||
values.append(self.get(field))
|
values.append(value)
|
||||||
|
|
||||||
condition_str = " and " + " and ".join(conditions) if len(conditions) else ""
|
condition_str = " and " + " and ".join(conditions) if len(conditions) else ""
|
||||||
|
|
||||||
e = frappe.db.sql("select name from tabEmployee where status='Active' {condition}"
|
employees = frappe.db.sql_list("select name from tabEmployee where status='Active' {condition}"
|
||||||
.format(condition=condition_str), tuple(values))
|
.format(condition=condition_str), tuple(values))
|
||||||
|
|
||||||
return e
|
return employees
|
||||||
|
|
||||||
def validate(self):
|
def validate(self):
|
||||||
self.validate_dates()
|
self.validate_dates()
|
||||||
validate_overlap(self, self.from_date, self.to_date, self.company)
|
validate_overlap(self, self.from_date, self.to_date, self.company)
|
||||||
|
|
||||||
def grant_leave_allocation(self):
|
|
||||||
if self.employee:
|
|
||||||
leave_allocation = []
|
|
||||||
leave_allocation = self.grant_leave_alloc(self.employee, leave_allocation)
|
|
||||||
if leave_allocation:
|
|
||||||
self.print_message(leave_allocation)
|
|
||||||
else:
|
|
||||||
self.grant_leave_alloc_for_employees()
|
|
||||||
|
|
||||||
def grant_leave_alloc_for_employees(self):
|
|
||||||
employees = self.get_employees()
|
|
||||||
if employees:
|
|
||||||
leave_allocations = []
|
|
||||||
for employee in employees:
|
|
||||||
leave_allocations = self.grant_leave_alloc(cstr(employee[0]), leave_allocations)
|
|
||||||
if leave_allocations:
|
|
||||||
self.print_message(leave_allocations)
|
|
||||||
else:
|
|
||||||
frappe.msgprint(_("No employee found"))
|
|
||||||
|
|
||||||
def grant_leave_alloc(self, employee, leave_allocations):
|
|
||||||
self.validate_allocation_exists(employee)
|
|
||||||
leave_policy = get_employee_leave_policy(employee)
|
|
||||||
if leave_policy:
|
|
||||||
for leave_policy_detail in leave_policy.leave_policy_details:
|
|
||||||
if not frappe.db.get_value("Leave Type", leave_policy_detail.leave_type, "is_lwp"):
|
|
||||||
leave_allocations.append(self.create_leave_allocation(employee, leave_policy_detail.leave_type, leave_policy_detail.annual_allocation))
|
|
||||||
return leave_allocations
|
|
||||||
|
|
||||||
def validate_allocation_exists(self, employee):
|
|
||||||
leave_alloc = frappe.db.exists({
|
|
||||||
"doctype": "Leave Allocation",
|
|
||||||
"employee": employee,
|
|
||||||
"leave_period": self.name,
|
|
||||||
"docstatus": 1})
|
|
||||||
if leave_alloc:
|
|
||||||
frappe.throw(_("Employee {0} already have Leave Allocation {1} for this period").format(employee, leave_alloc[0][0])\
|
|
||||||
+ """ <b><a href="#Form/Leave Allocation/{0}">{0}</a></b>""".format(leave_alloc[0][0]))
|
|
||||||
|
|
||||||
def validate_dates(self):
|
def validate_dates(self):
|
||||||
if getdate(self.from_date) >= getdate(self.to_date):
|
if getdate(self.from_date) >= getdate(self.to_date):
|
||||||
frappe.throw(_("To date can not be equal or less than from date"))
|
frappe.throw(_("To date can not be equal or less than from date"))
|
||||||
|
|
||||||
def create_leave_allocation(self, employee, leave_type, new_leaves_allocated):
|
|
||||||
allocation = frappe.new_doc("Leave Allocation")
|
def grant_leave_allocation(self, grade=None, department=None, designation=None,
|
||||||
allocation.employee = employee
|
employee=None, carry_forward_leaves=0):
|
||||||
allocation.employee_name = frappe.db.get_value("Employee", employee, "employee_name")
|
employees = self.get_employees({
|
||||||
allocation.leave_type = leave_type
|
"grade": grade,
|
||||||
allocation.from_date = self.from_date
|
"department": department,
|
||||||
allocation.to_date = self.to_date
|
"designation": designation,
|
||||||
# Earned Leaves and Compensatory Leaves are allocated by scheduler, initially allocate 0
|
"name": employee
|
||||||
is_earned_leave, is_compensatory = frappe.db.get_value("Leave Type", leave_type, ["is_earned_leave", "is_compensatory"])
|
})
|
||||||
if is_earned_leave == 1 or is_compensatory == 1:
|
|
||||||
new_leaves_allocated = 0
|
if employees:
|
||||||
allocation.new_leaves_allocated = new_leaves_allocated
|
if len(employees) > 20:
|
||||||
allocation.leave_period = self.name
|
frappe.enqueue(grant_leave_alloc_for_employees, timeout=600,
|
||||||
if self.carry_forward_leaves:
|
employees=employees, leave_period=self, carry_forward_leaves=carry_forward_leaves)
|
||||||
if frappe.db.get_value("Leave Type", leave_type, "is_carry_forward"):
|
else:
|
||||||
allocation.carry_forward = self.carry_forward_leaves
|
grant_leave_alloc_for_employees(employees, self, carry_forward_leaves)
|
||||||
allocation.save(ignore_permissions = True)
|
else:
|
||||||
allocation.submit()
|
frappe.msgprint(_("No Employee Found"))
|
||||||
return allocation.name
|
|
||||||
|
def grant_leave_alloc_for_employees(employees, leave_period, carry_forward_leaves=0):
|
||||||
|
leave_allocations = []
|
||||||
|
existing_allocations_for = get_existing_allocations(employees, leave_period.name)
|
||||||
|
leave_type_details = get_leave_type_details()
|
||||||
|
count=0
|
||||||
|
for employee in employees:
|
||||||
|
if employee in existing_allocations_for:
|
||||||
|
continue
|
||||||
|
count +=1
|
||||||
|
leave_policy = get_employee_leave_policy(employee)
|
||||||
|
if leave_policy:
|
||||||
|
for leave_policy_detail in leave_policy.leave_policy_details:
|
||||||
|
if not leave_type_details.get(leave_policy_detail.leave_type).is_lwp:
|
||||||
|
leave_allocation = create_leave_allocation(employee, leave_policy_detail.leave_type,
|
||||||
|
leave_policy_detail.annual_allocation, leave_type_details, leave_period, carry_forward_leaves)
|
||||||
|
leave_allocations.append(leave_allocation)
|
||||||
|
frappe.db.commit()
|
||||||
|
frappe.publish_progress(count*100/len(set(employees) - set(existing_allocations_for)), title = _("Allocating leaves..."))
|
||||||
|
|
||||||
|
if leave_allocations:
|
||||||
|
frappe.msgprint(_("Leaves has been granted sucessfully"))
|
||||||
|
|
||||||
|
def get_existing_allocations(employees, leave_period):
|
||||||
|
leave_allocations = frappe.db.sql_list("""
|
||||||
|
select distinct employee from `tabLeave Allocation`
|
||||||
|
where leave_period=%s and employee in (%s) and docstatus=1
|
||||||
|
""" % ('%s', ', '.join(['%s']*len(employees))), [leave_period] + employees)
|
||||||
|
if leave_allocations:
|
||||||
|
frappe.msgprint(_("Skipping Leave Allocation for the following employees, as Leave Allocation records already exists against them. {0}")
|
||||||
|
.format("\n".join(leave_allocations)))
|
||||||
|
return leave_allocations
|
||||||
|
|
||||||
|
def get_leave_type_details():
|
||||||
|
leave_type_details = frappe._dict()
|
||||||
|
leave_types = frappe.get_all("Leave Type", fields=["name", "is_lwp", "is_earned_leave", "is_compensatory", "is_carry_forward"])
|
||||||
|
for d in leave_types:
|
||||||
|
leave_type_details.setdefault(d.name, d)
|
||||||
|
return leave_type_details
|
||||||
|
|
||||||
|
def create_leave_allocation(employee, leave_type, new_leaves_allocated, leave_type_details, leave_period, carry_forward_leaves):
|
||||||
|
allocation = frappe.new_doc("Leave Allocation")
|
||||||
|
allocation.employee = employee
|
||||||
|
allocation.leave_type = leave_type
|
||||||
|
allocation.from_date = leave_period.from_date
|
||||||
|
allocation.to_date = leave_period.to_date
|
||||||
|
# Earned Leaves and Compensatory Leaves are allocated by scheduler, initially allocate 0
|
||||||
|
if leave_type_details.get(leave_type).is_earned_leave == 1 or leave_type_details.get(leave_type).is_compensatory == 1:
|
||||||
|
new_leaves_allocated = 0
|
||||||
|
|
||||||
|
allocation.new_leaves_allocated = new_leaves_allocated
|
||||||
|
allocation.leave_period = leave_period.name
|
||||||
|
if carry_forward_leaves:
|
||||||
|
if leave_type_details.get(leave_type).is_carry_forward:
|
||||||
|
allocation.carry_forward = carry_forward_leaves
|
||||||
|
allocation.save(ignore_permissions = True)
|
||||||
|
allocation.submit()
|
||||||
|
return allocation.name
|
||||||
|
|
||||||
|
|
||||||
def print_message(self, leave_allocations):
|
|
||||||
if leave_allocations:
|
|
||||||
frappe.msgprint(_("Leave Allocations {0} created").format(", "
|
|
||||||
.join(map(lambda x: """ <b><a href="#Form/Leave Allocation/{0}">{0}</a></b>""".format(x), leave_allocations))))
|
|
||||||
|
12
erpnext/hr/doctype/leave_period/leave_period_dashboard.py
Normal file
12
erpnext/hr/doctype/leave_period/leave_period_dashboard.py
Normal file
@ -0,0 +1,12 @@
|
|||||||
|
from frappe import _
|
||||||
|
|
||||||
|
def get_data():
|
||||||
|
return {
|
||||||
|
'fieldname': 'leave_period',
|
||||||
|
'transactions': [
|
||||||
|
{
|
||||||
|
'label': _('Transactions'),
|
||||||
|
'items': ['Leave Allocation']
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
@ -209,10 +209,10 @@ def get_employee_leave_policy(employee):
|
|||||||
leave_policy = frappe.db.get_value("Employee Grade", employee_grade, "default_leave_policy")
|
leave_policy = frappe.db.get_value("Employee Grade", employee_grade, "default_leave_policy")
|
||||||
if not leave_policy:
|
if not leave_policy:
|
||||||
frappe.throw(_("Employee {0} of grade {1} have no default leave policy").format(employee, employee_grade))
|
frappe.throw(_("Employee {0} of grade {1} have no default leave policy").format(employee, employee_grade))
|
||||||
else:
|
|
||||||
frappe.throw(_("Employee {0} has no grade to get default leave policy").format(employee))
|
|
||||||
if leave_policy:
|
if leave_policy:
|
||||||
return frappe.get_doc("Leave Policy", leave_policy)
|
return frappe.get_doc("Leave Policy", leave_policy)
|
||||||
|
else:
|
||||||
|
frappe.throw(_("Please set leave policy for employee {0} in Employee / Grade record").format(employee))
|
||||||
|
|
||||||
def validate_tax_declaration(declarations):
|
def validate_tax_declaration(declarations):
|
||||||
subcategories = []
|
subcategories = []
|
||||||
|
@ -6,6 +6,6 @@ def execute():
|
|||||||
if not company:
|
if not company:
|
||||||
return
|
return
|
||||||
|
|
||||||
frappe.reload_doc('hr', 'doctype', 'Employee Tax Exemption Declaration')
|
frappe.reload_doc('hr', 'doctype', 'employee_tax_exemption_declaration')
|
||||||
frappe.reload_doc('hr', 'doctype', 'Employee Tax Exemption Proof Submission')
|
frappe.reload_doc('hr', 'doctype', 'employee_tax_exemption_proof_submission')
|
||||||
make_custom_fields()
|
make_custom_fields()
|
Loading…
Reference in New Issue
Block a user