feat: get carry forwarded leaves via ledger entries
diff --git a/erpnext/hr/doctype/leave_allocation/leave_allocation.js b/erpnext/hr/doctype/leave_allocation/leave_allocation.js
index 0014c07..228b552 100755
--- a/erpnext/hr/doctype/leave_allocation/leave_allocation.js
+++ b/erpnext/hr/doctype/leave_allocation/leave_allocation.js
@@ -34,33 +34,36 @@
 	},
 
 	carry_forwarded_leaves: function(frm) {
-		frm.set_value("total_leaves_allocated", flt(frm.doc.carry_forwarded_leaves));
+		frm.set_value("total_leaves_allocated",
+			flt(frm.doc.carry_forwarded_leaves) + flt(frm.doc.new_leaves_allocated));
 	},
 
 	new_leaves_allocated: function(frm) {
-		frm.set_value("total_leaves_allocated", flt(frm.doc.new_leaves_allocated));
+		frm.set_value("total_leaves_allocated",
+			flt(frm.doc.carry_forwarded_leaves) + flt(frm.doc.new_leaves_allocated));
 	},
 
 	calculate_total_leaves_allocated: function(frm) {
-		if (cint(frm.doc.carry_forward) === 1 && frm.doc.leave_type && frm.doc.employee) {
+		if (cint(frm.doc.carry_forward) == 1 && frm.doc.leave_type && frm.doc.employee) {
 			return frappe.call({
 				method: "erpnext.hr.doctype.leave_allocation.leave_allocation.get_carry_forwarded_leaves",
 				args: {
 					"employee": frm.doc.employee,
-					"leave_type": frm.doc.leave_type,
 					"date": frm.doc.from_date,
+					"leave_type": frm.doc.leave_type,
+					"carry_forward": frm.doc.carry_forward
 				},
 				callback: function(r) {
 					if (!r.exc && r.message) {
-						frm.set_value("new_leaves_allocated", 0);
 						frm.set_value('carry_forwarded_leaves', r.message);
-						frm.set_value("total_leaves_allocated", flt(r.message));
+						frm.set_value("total_leaves_allocated",
+							flt(r.message) + flt(frm.doc.new_leaves_allocated));
 					}
 				}
 			})
-		} else if (cint(frm.doc.carry_forward) === 0) {
+		} else if (cint(frm.doc.carry_forward) == 0) {
 			frm.set_value("carry_forwarded_leaves", 0);
 			frm.set_value("total_leaves_allocated", flt(frm.doc.new_leaves_allocated));
 		}
 	}
-})
+})
\ No newline at end of file
diff --git a/erpnext/hr/doctype/leave_allocation/leave_allocation.json b/erpnext/hr/doctype/leave_allocation/leave_allocation.json
index 12c74de..bb851c6 100644
--- a/erpnext/hr/doctype/leave_allocation/leave_allocation.json
+++ b/erpnext/hr/doctype/leave_allocation/leave_allocation.json
@@ -1,736 +1,231 @@
 {
-    "allow_copy": 0,
-    "allow_events_in_timeline": 0,
-    "allow_guest_to_view": 0,
-    "allow_import": 1,
-    "allow_rename": 0,
-    "autoname": "naming_series:",
-    "beta": 0,
-    "creation": "2013-02-20 19:10:38",
-    "custom": 0,
-    "docstatus": 0,
-    "doctype": "DocType",
-    "document_type": "Setup",
-    "editable_grid": 0,
-    "engine": "InnoDB",
-    "fields": [
-      {
-        "allow_bulk_edit": 0,
-        "allow_in_quick_entry": 0,
-        "allow_on_submit": 0,
-        "bold": 0,
-        "collapsible": 0,
-        "columns": 0,
-        "default": "",
-        "fieldname": "naming_series",
-        "fieldtype": "Select",
-        "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": "Series",
-        "length": 0,
-        "no_copy": 1,
-        "options": "HR-LAL-.YYYY.-",
-        "permlevel": 0,
-        "precision": "",
-        "print_hide": 1,
-        "print_hide_if_no_value": 0,
-        "read_only": 0,
-        "remember_last_selected_value": 0,
-        "report_hide": 0,
-        "reqd": 1,
-        "search_index": 0,
-        "set_only_once": 1,
-        "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": 1,
-        "in_list_view": 1,
-        "in_standard_filter": 1,
-        "label": "Employee",
-        "length": 0,
-        "no_copy": 0,
-        "oldfieldname": "employee",
-        "oldfieldtype": "Link",
-        "options": "Employee",
-        "permlevel": 0,
-        "print_hide": 0,
-        "print_hide_if_no_value": 0,
-        "read_only": 0,
-        "remember_last_selected_value": 0,
-        "report_hide": 0,
-        "reqd": 1,
-        "search_index": 1,
-        "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,
-        "fetch_from": "employee.employee_name",
-        "fieldname": "employee_name",
-        "fieldtype": "Data",
-        "hidden": 0,
-        "ignore_user_permissions": 0,
-        "ignore_xss_filter": 0,
-        "in_filter": 0,
-        "in_global_search": 1,
-        "in_list_view": 1,
-        "in_standard_filter": 0,
-        "label": "Employee Name",
-        "length": 0,
-        "no_copy": 0,
-        "permlevel": 0,
-        "print_hide": 0,
-        "print_hide_if_no_value": 0,
-        "read_only": 1,
-        "remember_last_selected_value": 0,
-        "report_hide": 0,
-        "reqd": 0,
-        "search_index": 1,
-        "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,
-        "fetch_from": "employee.department",
-        "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": 1,
-        "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_break1",
-        "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,
-        "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,
-        "width": "50%"
-      },
-      {
-        "allow_bulk_edit": 0,
-        "allow_in_quick_entry": 0,
-        "allow_on_submit": 0,
-        "bold": 0,
-        "collapsible": 0,
-        "columns": 0,
-        "fieldname": "leave_type",
-        "fieldtype": "Link",
-        "hidden": 0,
-        "ignore_user_permissions": 0,
-        "ignore_xss_filter": 0,
-        "in_filter": 0,
-        "in_global_search": 0,
-        "in_list_view": 1,
-        "in_standard_filter": 1,
-        "label": "Leave Type",
-        "length": 0,
-        "no_copy": 0,
-        "oldfieldname": "leave_type",
-        "oldfieldtype": "Link",
-        "options": "Leave Type",
-        "permlevel": 0,
-        "print_hide": 0,
-        "print_hide_if_no_value": 0,
-        "read_only": 0,
-        "remember_last_selected_value": 0,
-        "report_hide": 0,
-        "reqd": 1,
-        "search_index": 1,
-        "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": "from_date",
-        "fieldtype": "Date",
-        "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": "From Date",
-        "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": 1,
-        "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": "to_date",
-        "fieldtype": "Date",
-        "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": "To Date",
-        "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": 1,
-        "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": "section_break_6",
-        "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": "Allocation",
-        "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": 1,
-        "bold": 1,
-        "collapsible": 0,
-        "columns": 0,
-        "fieldname": "new_leaves_allocated",
-        "fieldtype": "Float",
-        "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": "New Leaves Allocated",
-        "length": 0,
-        "no_copy": 0,
-        "permlevel": 0,
-        "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,
-        "description": "",
-        "fieldname": "carry_forward",
-        "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": "Add unused leaves from previous allocations",
-        "length": 0,
-        "no_copy": 0,
-        "permlevel": 0,
-        "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,
-        "depends_on": "carry_forward",
-        "fieldname": "carry_forwarded_leaves",
-        "fieldtype": "Float",
-        "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": "Unused leaves",
-        "length": 0,
-        "no_copy": 0,
-        "permlevel": 0,
-        "print_hide": 0,
-        "print_hide_if_no_value": 0,
-        "read_only": 1,
-        "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": 1,
-        "bold": 0,
-        "collapsible": 0,
-        "columns": 0,
-        "fieldname": "total_leaves_allocated",
-        "fieldtype": "Float",
-        "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": "Total Leaves Allocated",
-        "length": 0,
-        "no_copy": 0,
-        "permlevel": 0,
-        "print_hide": 0,
-        "print_hide_if_no_value": 0,
-        "read_only": 1,
-        "remember_last_selected_value": 0,
-        "report_hide": 0,
-        "reqd": 1,
-        "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,
-        "depends_on": "eval:doc.total_leaves_encashed>0",
-        "fieldname": "total_leaves_encashed",
-        "fieldtype": "Float",
-        "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": "Total Leaves Encashed",
-        "length": 0,
-        "no_copy": 0,
-        "permlevel": 0,
-        "precision": "",
-        "print_hide": 0,
-        "print_hide_if_no_value": 0,
-        "read_only": 1,
-        "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_10",
-        "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": "compensatory_request",
-        "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": "Compensatory Leave Request",
-        "length": 0,
-        "no_copy": 0,
-        "options": "Compensatory Leave Request",
-        "permlevel": 0,
-        "precision": "",
-        "print_hide": 0,
-        "print_hide_if_no_value": 0,
-        "read_only": 1,
-        "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": "leave_period",
-        "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": 1,
-        "label": "Leave Period",
-        "length": 0,
-        "no_copy": 0,
-        "options": "Leave Period",
-        "permlevel": 0,
-        "precision": "",
-        "print_hide": 0,
-        "print_hide_if_no_value": 0,
-        "read_only": 1,
-        "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": "amended_from",
-        "fieldtype": "Link",
-        "hidden": 0,
-        "ignore_user_permissions": 1,
-        "ignore_xss_filter": 0,
-        "in_filter": 0,
-        "in_global_search": 0,
-        "in_list_view": 0,
-        "in_standard_filter": 0,
-        "label": "Amended From",
-        "length": 0,
-        "no_copy": 1,
-        "oldfieldname": "amended_from",
-        "oldfieldtype": "Data",
-        "options": "Leave Allocation",
-        "permlevel": 0,
-        "print_hide": 1,
-        "print_hide_if_no_value": 0,
-        "read_only": 1,
-        "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": 1,
-        "columns": 0,
-        "fieldname": "notes",
-        "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": "Notes",
-        "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": "description",
-        "fieldtype": "Small Text",
-        "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": "Description",
-        "length": 0,
-        "no_copy": 0,
-        "oldfieldname": "reason",
-        "oldfieldtype": "Small Text",
-        "permlevel": 0,
-        "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,
-        "width": "300px"
-      }
-    ],
-    "has_web_view": 0,
-    "hide_heading": 0,
-    "hide_toolbar": 0,
-    "icon": "fa fa-ok",
-    "idx": 1,
-    "image_view": 0,
-    "in_create": 0,
-    "is_submittable": 1,
-    "issingle": 0,
-    "istable": 0,
-    "max_attachments": 0,
-    "modified": "2019-01-30 11:28:09.360525",
-    "modified_by": "Administrator",
-    "module": "HR",
-    "name": "Leave Allocation",
-    "owner": "Administrator",
-    "permissions": [
-      {
-        "amend": 1,
-        "cancel": 1,
-        "create": 1,
-        "delete": 1,
-        "email": 1,
-        "export": 0,
-        "if_owner": 0,
-        "import": 0,
-        "permlevel": 0,
-        "print": 1,
-        "read": 1,
-        "report": 1,
-        "role": "HR User",
-        "set_user_permissions": 0,
-        "share": 1,
-        "submit": 1,
-        "write": 1
-      },
-      {
-        "amend": 1,
-        "cancel": 1,
-        "create": 1,
-        "delete": 1,
-        "email": 1,
-        "export": 1,
-        "if_owner": 0,
-        "import": 1,
-        "permlevel": 0,
-        "print": 1,
-        "read": 1,
-        "report": 1,
-        "role": "HR Manager",
-        "set_user_permissions": 0,
-        "share": 1,
-        "submit": 1,
-        "write": 1
-      }
-    ],
-    "quick_entry": 0,
-    "read_only": 0,
-    "read_only_onload": 0,
-    "search_fields": "employee,employee_name,leave_type,total_leaves_allocated",
-    "show_name_in_global_search": 1,
-    "sort_field": "modified",
-    "sort_order": "DESC",
-    "timeline_field": "employee",
-    "track_changes": 0,
-    "track_seen": 0,
-    "track_views": 0
-  }
\ No newline at end of file
+ "allow_import": 1,
+ "autoname": "naming_series:",
+ "creation": "2013-02-20 19:10:38",
+ "doctype": "DocType",
+ "document_type": "Setup",
+ "engine": "InnoDB",
+ "field_order": [
+  "naming_series",
+  "employee",
+  "employee_name",
+  "department",
+  "column_break1",
+  "leave_type",
+  "from_date",
+  "to_date",
+  "section_break_6",
+  "new_leaves_allocated",
+  "carry_forward",
+  "carry_forwarded_leaves",
+  "total_leaves_allocated",
+  "total_leaves_encashed",
+  "column_break_10",
+  "compensatory_request",
+  "leave_period",
+  "amended_from",
+  "notes",
+  "description"
+ ],
+ "fields": [
+  {
+   "fieldname": "naming_series",
+   "fieldtype": "Select",
+   "label": "Series",
+   "no_copy": 1,
+   "options": "HR-LAL-.YYYY.-",
+   "print_hide": 1,
+   "reqd": 1,
+   "set_only_once": 1
+  },
+  {
+   "fieldname": "employee",
+   "fieldtype": "Link",
+   "in_global_search": 1,
+   "in_list_view": 1,
+   "in_standard_filter": 1,
+   "label": "Employee",
+   "oldfieldname": "employee",
+   "oldfieldtype": "Link",
+   "options": "Employee",
+   "reqd": 1,
+   "search_index": 1
+  },
+  {
+   "fetch_from": "employee.employee_name",
+   "fieldname": "employee_name",
+   "fieldtype": "Data",
+   "in_global_search": 1,
+   "in_list_view": 1,
+   "label": "Employee Name",
+   "read_only": 1,
+   "search_index": 1
+  },
+  {
+   "fetch_from": "employee.department",
+   "fieldname": "department",
+   "fieldtype": "Link",
+   "label": "Department",
+   "options": "Department",
+   "read_only": 1
+  },
+  {
+   "fieldname": "column_break1",
+   "fieldtype": "Column Break",
+   "width": "50%"
+  },
+  {
+   "fieldname": "leave_type",
+   "fieldtype": "Link",
+   "in_list_view": 1,
+   "in_standard_filter": 1,
+   "label": "Leave Type",
+   "oldfieldname": "leave_type",
+   "oldfieldtype": "Link",
+   "options": "Leave Type",
+   "reqd": 1,
+   "search_index": 1
+  },
+  {
+   "fieldname": "from_date",
+   "fieldtype": "Date",
+   "label": "From Date",
+   "reqd": 1
+  },
+  {
+   "fieldname": "to_date",
+   "fieldtype": "Date",
+   "label": "To Date",
+   "reqd": 1
+  },
+  {
+   "fieldname": "section_break_6",
+   "fieldtype": "Section Break",
+   "label": "Allocation"
+  },
+  {
+   "allow_on_submit": 1,
+   "bold": 1,
+   "fieldname": "new_leaves_allocated",
+   "fieldtype": "Float",
+   "label": "New Leaves Allocated"
+  },
+  {
+   "fieldname": "carry_forward",
+   "fieldtype": "Check",
+   "label": "Add unused leaves from previous allocations"
+  },
+  {
+   "depends_on": "carry_forward",
+   "fieldname": "carry_forwarded_leaves",
+   "fieldtype": "Float",
+   "label": "Unused leaves",
+   "read_only": 1
+  },
+  {
+   "allow_on_submit": 1,
+   "fieldname": "total_leaves_allocated",
+   "fieldtype": "Float",
+   "label": "Total Leaves Allocated",
+   "read_only": 1,
+   "reqd": 1
+  },
+  {
+   "depends_on": "eval:doc.total_leaves_encashed>0",
+   "fieldname": "total_leaves_encashed",
+   "fieldtype": "Float",
+   "label": "Total Leaves Encashed",
+   "read_only": 1
+  },
+  {
+   "fieldname": "column_break_10",
+   "fieldtype": "Column Break"
+  },
+  {
+   "fieldname": "compensatory_request",
+   "fieldtype": "Link",
+   "label": "Compensatory Leave Request",
+   "options": "Compensatory Leave Request",
+   "read_only": 1
+  },
+  {
+   "fieldname": "leave_period",
+   "fieldtype": "Link",
+   "in_standard_filter": 1,
+   "label": "Leave Period",
+   "options": "Leave Period",
+   "read_only": 1
+  },
+  {
+   "fieldname": "amended_from",
+   "fieldtype": "Link",
+   "ignore_user_permissions": 1,
+   "label": "Amended From",
+   "no_copy": 1,
+   "oldfieldname": "amended_from",
+   "oldfieldtype": "Data",
+   "options": "Leave Allocation",
+   "print_hide": 1,
+   "read_only": 1
+  },
+  {
+   "collapsible": 1,
+   "fieldname": "notes",
+   "fieldtype": "Section Break",
+   "label": "Notes"
+  },
+  {
+   "fieldname": "description",
+   "fieldtype": "Small Text",
+   "label": "Description",
+   "oldfieldname": "reason",
+   "oldfieldtype": "Small Text",
+   "width": "300px"
+  }
+ ],
+ "icon": "fa fa-ok",
+ "idx": 1,
+ "is_submittable": 1,
+ "modified": "2019-05-09 19:06:33.659196",
+ "modified_by": "Administrator",
+ "module": "HR",
+ "name": "Leave Allocation",
+ "owner": "Administrator",
+ "permissions": [
+  {
+   "amend": 1,
+   "cancel": 1,
+   "create": 1,
+   "delete": 1,
+   "email": 1,
+   "print": 1,
+   "read": 1,
+   "report": 1,
+   "role": "HR User",
+   "share": 1,
+   "submit": 1,
+   "write": 1
+  },
+  {
+   "amend": 1,
+   "cancel": 1,
+   "create": 1,
+   "delete": 1,
+   "email": 1,
+   "export": 1,
+   "import": 1,
+   "print": 1,
+   "read": 1,
+   "report": 1,
+   "role": "HR Manager",
+   "share": 1,
+   "submit": 1,
+   "write": 1
+  }
+ ],
+ "search_fields": "employee,employee_name,leave_type,total_leaves_allocated",
+ "show_name_in_global_search": 1,
+ "sort_field": "modified",
+ "sort_order": "DESC",
+ "timeline_field": "employee"
+}
\ No newline at end of file
diff --git a/erpnext/hr/doctype/leave_allocation/leave_allocation.py b/erpnext/hr/doctype/leave_allocation/leave_allocation.py
index f7db7de..aa1cc9e 100755
--- a/erpnext/hr/doctype/leave_allocation/leave_allocation.py
+++ b/erpnext/hr/doctype/leave_allocation/leave_allocation.py
@@ -8,6 +8,7 @@
 from frappe.model.document import Document
 from erpnext.hr.utils import set_employee_name, get_leave_period
 from erpnext.hr.doctype.leave_application.leave_application import get_approved_leaves_for_period
+from erpnext.hr.doctype.leave_ledger_entry.leave_ledger_entry import create_leave_ledger_entry
 
 class OverlapError(frappe.ValidationError): pass
 class BackDatedAllocationError(frappe.ValidationError): pass
@@ -18,66 +19,62 @@
 class LeaveAllocation(Document):
 	def validate(self):
 		self.validate_period()
-		self.validate_lwp()
-		set_employee_name(self)
-		self.set_total_leaves_allocated()
+		self.validate_new_leaves_allocated_value()
 		self.validate_allocation_overlap()
 		self.validate_back_dated_allocation()
+		self.set_total_leaves_allocated()
 		self.validate_total_leaves_allocated()
-		self.validate_leaves_allocated_value()
+		self.validate_lwp()
+		set_employee_name(self)
 		self.validate_leave_allocation_days()
 
 	def validate_leave_allocation_days(self):
-		new_leaves = self.new_leaves_allocated if not self.carry_forward else self.carry_forwarded_leaves
-		max_leaves, leaves_allocated = self.get_max_leaves_with_leaves_allocated_for_leave_type(flt(new_leaves))
+		company = frappe.db.get_value("Employee", self.employee, "company")
+		leave_period = get_leave_period(self.from_date, self.to_date, company)
+		max_leaves_allowed = frappe.db.get_value("Leave Type", self.leave_type, "max_leaves_allowed")
+		if max_leaves_allowed > 0:
+			leave_allocated = 0
+			if leave_period:
+				leave_allocated = get_leave_allocation_for_period(self.employee, self.leave_type, leave_period[0].from_date, leave_period[0].to_date)
+			leave_allocated += self.new_leaves_allocated
+			if leave_allocated > max_leaves_allowed:
+				frappe.throw(_("Total allocated leaves are more days than maximum allocation of {0} leave type for employee {1} in the period")\
+				.format(self.leave_type, self.employee))
 
-		if leaves_allocated > max_leaves:
-			frappe.throw(_("Total allocated leaves are more days than maximum allocation of {0} leave type for employee {1} in the period")\
-			.format(self.leave_type, self.employee))
+	def on_submit(self):
+		create_leave_ledger_entry(self)
+
+	def on_cancel(self):
+		create_leave_ledger_entry(self)
 
 	def on_update_after_submit(self):
 		self.validate_new_leaves_allocated_value()
 		self.set_total_leaves_allocated()
 
-		frappe.db.set(self,'total_leaves_allocated', flt(self.total_leaves_allocated))
+		frappe.db.set(self,'carry_forwarded_leaves', flt(self.carry_forwarded_leaves))
+		frappe.db.set(self,'total_leaves_allocated',flt(self.total_leaves_allocated))
 
 		self.validate_against_leave_applications()
 
 	def validate_period(self):
-		allocation_period = date_diff(self.to_date, self.from_date)
-
-		if allocation_period <= 0:
+		if date_diff(self.to_date, self.from_date) <= 0:
 			frappe.throw(_("To date cannot be before from date"))
 
-		# check if the allocation period is more than the expiry allows for carry forwarded allocation
-		if self.carry_forward:
-			expiry_days = get_days_to_expiry_for_leave_type(self.leave_type)
-
-			if allocation_period > flt(expiry_days) and expiry_days:
-				frappe.throw(_("Leave allocation period cannot exceed carry forward expiry limit"))
-
 	def validate_lwp(self):
 		if frappe.db.get_value("Leave Type", self.leave_type, "is_lwp"):
 			frappe.throw(_("Leave Type {0} cannot be allocated since it is leave without pay").format(self.leave_type))
 
-	def validate_leaves_allocated_value(self):
+	def validate_new_leaves_allocated_value(self):
 		"""validate that leave allocation is in multiples of 0.5"""
 		if flt(self.new_leaves_allocated) % 0.5:
 			frappe.throw(_("Leaves must be allocated in multiples of 0.5"), ValueMultiplierError)
 
 	def validate_allocation_overlap(self):
 		leave_allocation = frappe.db.sql("""
-			SELECT
-				name
-			FROM `tabLeave Allocation`
-			WHERE
-				employee=%s
-				AND leave_type=%s
-				AND docstatus=1
-				AND carry_forward={0}
-				AND to_date >= %s
-				AND from_date <= %s""" #nosec
-				.format(self.carry_forward), (self.employee, self.leave_type, self.from_date, self.to_date))
+			select name from `tabLeave Allocation`
+			where employee=%s and leave_type=%s and docstatus=1
+			and to_date >= %s and from_date <= %s""",
+			(self.employee, self.leave_type, self.from_date, self.to_date))
 
 		if leave_allocation:
 			frappe.msgprint(_("{0} already allocated for Employee {1} for period {2} to {3}")
@@ -97,20 +94,18 @@
 					BackDatedAllocationError)
 
 	def set_total_leaves_allocated(self):
-		if self.carry_forward:
-			self.set_carry_forwarded_leaves()
-			self.total_leaves_allocated = flt(self.carry_forwarded_leaves)
-		else:
-			self.total_leaves_allocated = flt(self.new_leaves_allocated)
+		self.carry_forwarded_leaves = get_carry_forwarded_leaves(self.employee,
+			self.leave_type, self.from_date, self.carry_forward)
 
-		if not self.total_leaves_allocated and not frappe.db.get_value("Leave Type", self.leave_type, "is_earned_leave")\
-			and not frappe.db.get_value("Leave Type", self.leave_type, "is_compensatory"):
+		self.total_leaves_allocated = flt(self.carry_forwarded_leaves) + flt(self.new_leaves_allocated)
+
+		if not self.total_leaves_allocated and not frappe.db.get_value("Leave Type", self.leave_type, "is_earned_leave") and not frappe.db.get_value("Leave Type", self.leave_type, "is_compensatory"):
 			frappe.throw(_("Total leaves allocated is mandatory for Leave Type {0}".format(self.leave_type)))
 
 	def validate_total_leaves_allocated(self):
 		# Adding a day to include To Date in the difference
 		date_difference = date_diff(self.to_date, self.from_date) + 1
-		if date_difference < flt(self.total_leaves_allocated):
+		if date_difference < self.total_leaves_allocated:
 			frappe.throw(_("Total allocated leaves are more than days in the period"), OverAllocationError)
 
 	def validate_against_leave_applications(self):
@@ -123,43 +118,16 @@
 			else:
 				frappe.throw(_("Total allocated leaves {0} cannot be less than already approved leaves {1} for the period").format(self.total_leaves_allocated, leaves_taken), LessAllocationError)
 
-	def set_carry_forwarded_leaves(self):
-		self.carry_forwarded_leaves = get_carry_forwarded_leaves(self.employee, self.leave_type, self.from_date)
-
-		max_leaves, leaves_allocated = self.get_max_leaves_with_leaves_allocated_for_leave_type(self.carry_forwarded_leaves)
-
-		if leaves_allocated > max_leaves:
-			self.carry_forwarded_leaves = max_leaves - (leaves_allocated - self.carry_forwarded_leaves)
-
-	def get_max_leaves_with_leaves_allocated_for_leave_type(self, new_leaves):
-		''' compare new leaves allocated with max leaves '''
-		company = frappe.db.get_value("Employee", self.employee, "company")
-		leaves_allocated = 0
-		leave_period = get_leave_period(self.from_date, self.to_date, company)
-		max_leaves_allowed = frappe.db.get_value("Leave Type", self.leave_type, "max_leaves_allowed")
-		if max_leaves_allowed > 0:
-			if leave_period:
-				leaves_allocated = get_leave_allocation_for_period(self.employee, self.leave_type, leave_period[0].from_date, leave_period[0].to_date)
-			leaves_allocated += new_leaves
-		return max_leaves_allowed, leaves_allocated
-
 def get_leave_allocation_for_period(employee, leave_type, from_date, to_date):
 	leave_allocated = 0
 	leave_allocations = frappe.db.sql("""
-		SELECT
-			employee,
-			leave_type,
-			from_date,
-			to_date,
-			total_leaves_allocated
-		FROM `tabLeave Allocation`
-		WHERE
-			employee=%(employee)s
-			AND leave_type=%(leave_type)s
-			AND docstatus=1
-			AND (from_date BETWEEN %(from_date)s AND %(to_date)s
-				OR to_date BETWEEN %(from_date)s AND %(to_date)s
-				OR (from_date < %(from_date)s AND to_date > %(to_date)s))
+		select employee, leave_type, from_date, to_date, total_leaves_allocated
+		from `tabLeave Allocation`
+		where employee=%(employee)s and leave_type=%(leave_type)s
+			and docstatus=1
+			and (from_date between %(from_date)s and %(to_date)s
+				or to_date between %(from_date)s and %(to_date)s
+				or (from_date < %(from_date)s and to_date > %(to_date)s))
 	""", {
 		"from_date": from_date,
 		"to_date": to_date,
@@ -174,43 +142,14 @@
 	return leave_allocated
 
 @frappe.whitelist()
-def get_carry_forwarded_leaves(employee, leave_type, date):
-	''' Calculates carry forwarded days based on previous unused leave allocations '''
-	carry_forwarded_leaves = 0
-	expiry_days = get_days_to_expiry_for_leave_type(leave_type)
-	validate_carry_forward(leave_type)
-	filters = {
-		"employee": employee,
-		"leave_type": leave_type,
-		"docstatus": 1,
-		"to_date": ("<", date)
-	}
-	limit = 2
+def get_carry_forwarded_leaves(employee, leave_type, date, carry_forward=None):
+	leave_records = frappe.get_all("Leave Ledger Entry",
+		filters={'Employee':employee,
+		'leave_type':leave_type,
+		'to_date':("<=", date)},
+		fields=['leaves'])
 
-	# check number of days to expire, ignore expiry for default value 0
-	if expiry_days:
-		filters.update(carry_forward=0)
-		limit = 1
-
-	previous_allocation = frappe.get_all("Leave Allocation",
-		filters=filters,
-		fields=["name","from_date","to_date","total_leaves_allocated"],
-		order_by="to_date desc",
-		limit=limit)
-
-	if previous_allocation:
-		leaves_taken = get_approved_leaves_for_period(employee, leave_type,
-			previous_allocation[0].from_date, previous_allocation[0].to_date)
-
-		carry_forwarded_leaves = flt(previous_allocation[0].total_leaves_allocated) - flt(leaves_taken)
-
-	return carry_forwarded_leaves
-
-def get_days_to_expiry_for_leave_type(leave_type):
-	''' returns days to expiry for a provided leave type '''
-	return frappe.db.get_value("Leave Type",
-		filters={"leave_type_name": leave_type, "is_carry_forward": 1},
-		fieldname="carry_forward_leave_expiry")
+	return sum(record.get("leaves") for record in leave_records)
 
 def validate_carry_forward(leave_type):
 	if not frappe.db.get_value("Leave Type", leave_type, "is_carry_forward"):
diff --git a/erpnext/hr/doctype/leave_period/leave_period.py b/erpnext/hr/doctype/leave_period/leave_period.py
index a6198a8..91cc9b8 100644
--- a/erpnext/hr/doctype/leave_period/leave_period.py
+++ b/erpnext/hr/doctype/leave_period/leave_period.py
@@ -114,22 +114,7 @@
 	allocation.leave_period = leave_period.name
 	if carry_forward_leaves:
 		if leave_type_details.get(leave_type).is_carry_forward:
-			create_carry_forward_leaves_allocation(employee, leave_type, leave_type_details, leave_period, carry_forward_leaves)
-	allocation.save(ignore_permissions=True)
+			allocation.carry_forward = carry_forward_leaves
+	allocation.save(ignore_permissions = True)
 	allocation.submit()
-	return allocation.name
-
-def create_carry_forward_leaves_allocation(employee, leave_type, leave_type_details, leave_period, carry_forward_leaves):
-	carry_forwarded_leaves = get_carry_forwarded_leaves(employee, leave_type, leave_period.from_date)
-	if not carry_forwarded_leaves:
-		return
-	allocation = frappe.new_doc("Leave Allocation")
-	allocation.employee = employee
-	allocation.leave_type = leave_type
-	allocation.from_date = leave_period.from_date
-	allocation.to_date = add_days(leave_period.from_date, leave_type_details.carry_forward_leave_expiry) if not leave_type_details.carry_forward_leave_expiry else leave_period.to_date
-	allocation.leave_period = leave_period.name
-	allocation.carry_forward = carry_forward_leaves
-	allocation.carry_forwarded_leaves = carry_forwarded_leaves
-	allocation.save(ignore_permissions=True)
-	allocation.submit()
\ No newline at end of file
+	return allocation.name
\ No newline at end of file