From f3926d0fcbd57e7e3c59f33b2992a699ce3902a7 Mon Sep 17 00:00:00 2001 From: Mangesh-Khairnar Date: Sun, 26 May 2019 20:17:16 +0530 Subject: [PATCH] patch: leave ledger entries --- erpnext/patches.txt | 1 + .../v12_0/generate_leave_ledger_entries.py | 95 +++++++++++++++++++ 2 files changed, 96 insertions(+) create mode 100644 erpnext/patches/v12_0/generate_leave_ledger_entries.py diff --git a/erpnext/patches.txt b/erpnext/patches.txt index bdc1ed4f10..a7fb7a2bb5 100644 --- a/erpnext/patches.txt +++ b/erpnext/patches.txt @@ -602,3 +602,4 @@ erpnext.patches.v11_1.set_salary_details_submittable erpnext.patches.v11_1.rename_depends_on_lwp execute:frappe.delete_doc("Report", "Inactive Items") erpnext.patches.v11_1.delete_scheduling_tool +erpnext.patches.v12_0.generate_leave_ledger_entries \ No newline at end of file diff --git a/erpnext/patches/v12_0/generate_leave_ledger_entries.py b/erpnext/patches/v12_0/generate_leave_ledger_entries.py new file mode 100644 index 0000000000..9223bb2ebc --- /dev/null +++ b/erpnext/patches/v12_0/generate_leave_ledger_entries.py @@ -0,0 +1,95 @@ +# Copyright (c) 2018, Frappe and Contributors +# License: GNU General Public License v3. See license.txt + +from __future__ import unicode_literals +import frappe + +def execute(): + """ Generates leave ledger entries for leave allocation/application/encashment + for last allocation """ + if frappe.db.exists("DocType","Leave Ledger Entry"): + return + + allocation_list = get_allocation_records() + generate_allocation_ledger_entries(allocation_list) + generate_application_leave_ledger_entries(allocation_list) + generate_encashment_leave_ledger_entries(allocation_list) + +def generate_allocation_ledger_entries(allocation_list): + ''' fix ledger entries for missing leave allocation transaction ''' + from erpnext.hr.doctype.leave_allocation.leave_allocation import LeaveAllocation + + for allocation in allocation_list: + LeaveAllocation.create_leave_ledger_entry(allocation) + +def generate_application_leave_ledger_entries(allocation_list): + ''' fix ledger entries for missing leave application transaction ''' + from erpnext.hr.doctype.leave_application.leave_application import LeaveApplication + + leave_applications = get_leaves_application_records(allocation_list) + + for record in leave_applications: + LeaveApplication.create_leave_ledger_entry(record) + +def generate_encashment_leave_ledger_entries(allocation_list): + ''' fix ledger entries for missing leave encashment transaction ''' + from erpnext.hr.doctype.leave_encashment.leave_encashment import LeaveEncashment + + leave_encashments = get_leave_encashment_records(allocation_list) + + for record in leave_encashments: + LeaveEncashment.create_leave_ledger_entry(record) + +def get_allocation_records(): + return frappe.db.sql(""" + SELECT + DISTINCT name, + employee, + leave_type, + new_leaves_allocated, + carry_forwarded_leaves, + from_date, + to_date, + carry_forward, + RANK() OVER(PARTITION BY employee, leave_type ORDER BY to_date DESC) as allocation + FROM `tabLeave Allocation` + WHERE + allocation=1 + """, as_dict=1) + +def get_leaves_application_records(allocation_list): + leave_applications = [] + for allocation in allocation_list: + leave_applications.append(frappe.db.sql(""" + SELECT + name, + employee, + leave_type, + total_leave_days, + from_date, + to_date + FROM `tabLeave Application` + WHERE + from_date >= %s + leave_type = %s + employee = %s + """, (allocation.from_date, allocation.leave_type, allocation.employee))) + return leave_applications + +def get_leave_encashment_records(allocation_list): + leave_encashments = [] + for allocation in allocation_list: + leave_encashments.append(frappe.db.sql(""" + SELECT + DISTINCT name, + employee, + leave_type, + encashable_days, + from_date, + to_date + FROM `tabLeave Encashment` + WHERE + leave_type = %s + employee = %s + """, (allocation.leave_type, allocation.employee))) + return leave_encashments \ No newline at end of file