From 170b8dded8cd5c9bb7309193d1260bbcb5435b3d Mon Sep 17 00:00:00 2001 From: Mangesh-Khairnar Date: Mon, 13 May 2019 19:17:44 +0530 Subject: [PATCH] fix: expiry logic for carry forwarded allocation --- .../leave_ledger_entry.json | 8 +++- .../leave_ledger_entry/leave_ledger_entry.py | 45 ++++++++++++++----- 2 files changed, 41 insertions(+), 12 deletions(-) diff --git a/erpnext/hr/doctype/leave_ledger_entry/leave_ledger_entry.json b/erpnext/hr/doctype/leave_ledger_entry/leave_ledger_entry.json index c7e6b709bd..89c703db65 100644 --- a/erpnext/hr/doctype/leave_ledger_entry/leave_ledger_entry.json +++ b/erpnext/hr/doctype/leave_ledger_entry/leave_ledger_entry.json @@ -12,6 +12,7 @@ "from_date", "to_date", "is_carry_forward", + "is_expired", "amended_from" ], "fields": [ @@ -72,10 +73,15 @@ "fieldname": "is_carry_forward", "fieldtype": "Check", "label": "Is Carry Forward" + }, + { + "fieldname": "is_expired", + "fieldtype": "Check", + "label": "Is Expired" } ], "is_submittable": 1, - "modified": "2019-05-09 18:36:07.383714", + "modified": "2019-05-13 12:56:45.542495", "modified_by": "Administrator", "module": "HR", "name": "Leave Ledger Entry", diff --git a/erpnext/hr/doctype/leave_ledger_entry/leave_ledger_entry.py b/erpnext/hr/doctype/leave_ledger_entry/leave_ledger_entry.py index 585e1079f7..526a91e976 100644 --- a/erpnext/hr/doctype/leave_ledger_entry/leave_ledger_entry.py +++ b/erpnext/hr/doctype/leave_ledger_entry/leave_ledger_entry.py @@ -9,7 +9,10 @@ from frappe import _ from frappe.utils import add_days, today class LeaveLedgerEntry(Document): - pass + def validate_entries(self): + leave_records = frappe.get_all('Leave Ledger Entry', ['leaves']) + if sum(record.get("leaves") for record in leave_records) <0: + frappe.throw(_("Invalid Ledger Entry")) def create_leave_ledger_entry(ref_doc, args, submit=True): ledger = frappe._dict( @@ -19,7 +22,7 @@ def create_leave_ledger_entry(ref_doc, args, submit=True): leave_type=ref_doc.leave_type, from_date=ref_doc.from_date, transaction_type=ref_doc.doctype, - transaction_name=ref_doc.name + transaction_name=ref_doc.name, ) ledger.update(args) @@ -52,22 +55,42 @@ def delete_ledger_entry(ledger): def check_expired_allocation(): ''' Checks for expired allocation by comparing to_date with current_date and based on that creates an expiry ledger entry ''' - expired_allocation = frappe.db.get_all("Leave Ledger Allocation", + expired_allocation = frappe.get_all("Leave Ledger Allocation", filters={ 'to_date': today(), 'transaction_type': 'Leave Allocation' }, - fields=['name', 'transaction_name']) + fields=['*']) if expired_allocation: create_expiry_ledger_entry(expired_allocation) def create_expiry_ledger_entry(expired_allocation): for allocation in expired_allocation: - ledger_entry = frappe.get_doc('Leave Ledger Entry', allocation.name) - args = { - 'leaves': -ledger_entry.leaves, - 'to_date': '', - 'is_carry_forward': ledger_entry.is_carry_forward - } - create_leave_ledger_entry(ledger_entry, args) \ No newline at end of file + filters = { + 'employee': allocation.employee, + 'leave_type': allocation.leave_type, + 'from_date': ('>=', allocation.from_date), + } + # get only application ledger entries in case of carry forward + if allocation.is_carry_forward: + filters.update(dict(transaction_type='Leave Application')) + + leave_records = frappe.get_all("Leave Ledger Entry", + filters=filters, + fields=['leaves']) + + leaves = sum(record.get("leaves") for record in leave_records) + + if allocation.is_carry_forward: + leaves = allocation.leaves + leaves + + if leaves > 0: + args = frappe._dict( + leaves=allocation.leaves * -1, + to_date='', + is_carry_forward=allocation.is_carry_forward, + is_expired=1, + from_date=allocation.to_date + ) + create_leave_ledger_entry(allocation, args) \ No newline at end of file