Make Expense Claim from Employee Advance #13053 (#13074)

* allow to make expense claim from employee advance

* make expense claim only if claimed amount < paid_amount

* expense claim made from employee advance is paid
diff --git a/erpnext/hr/doctype/employee_advance/employee_advance.js b/erpnext/hr/doctype/employee_advance/employee_advance.js
index 3f57939..b6dd7ee 100644
--- a/erpnext/hr/doctype/employee_advance/employee_advance.js
+++ b/erpnext/hr/doctype/employee_advance/employee_advance.js
@@ -32,6 +32,19 @@
 			frm.add_custom_button(__('Payment'),
 				function() { frm.events.make_payment_entry(frm); }, __("Make"));
 		}
+		else if (
+			frm.doc.docstatus === 1
+			&& flt(frm.doc.claimed_amount) < flt(frm.doc.paid_amount)
+			&& frappe.model.can_create("Expense Claim")
+		) {
+			frm.add_custom_button(
+				__("Expense Claim"),
+				function() {
+					frm.events.make_expense_claim(frm);
+				},
+				__("Make")
+			);
+		}
 	},
 
 	make_payment_entry: function(frm) {
@@ -51,4 +64,22 @@
 			}
 		});
 	},
+
+	make_expense_claim: function(frm) {
+		return frappe.call({
+			method: "erpnext.hr.doctype.expense_claim.expense_claim.get_expense_claim",
+			args: {
+				"employee_name": frm.doc.employee,
+				"company": frm.doc.company,
+				"employee_advance_name": frm.doc.name,
+				"posting_date": frm.doc.posting_date,
+				"paid_amount": frm.doc.paid_amount,
+				"claimed_amount": frm.doc.claimed_amount
+			},
+			callback: function(r) {
+				const doclist = frappe.model.sync(r.message);
+				frappe.set_route("Form", doclist[0].doctype, doclist[0].name);
+			}
+		});
+	}
 });
diff --git a/erpnext/hr/doctype/expense_claim/expense_claim.py b/erpnext/hr/doctype/expense_claim/expense_claim.py
index 1c87475..f6b5cc3 100644
--- a/erpnext/hr/doctype/expense_claim/expense_claim.py
+++ b/erpnext/hr/doctype/expense_claim/expense_claim.py
@@ -297,4 +297,30 @@
 		from 
 			`tabEmployee Advance`
 		where {0}
-	""".format(condition), as_dict=1)
\ No newline at end of file
+	""".format(condition), as_dict=1)
+
+
+@frappe.whitelist()
+def get_expense_claim(
+	employee_name, company, employee_advance_name, posting_date, paid_amount, claimed_amount):
+	default_payable_account = frappe.db.get_value("Company", company, "default_payable_account")
+	default_cost_center = frappe.db.get_value('Company', company, 'cost_center')
+
+	expense_claim = frappe.new_doc('Expense Claim')
+	expense_claim.company = company
+	expense_claim.employee = employee_name
+	expense_claim.payable_account = default_payable_account
+	expense_claim.cost_center = default_cost_center
+	expense_claim.is_paid = 1 if flt(paid_amount) else 0
+	expense_claim.append(
+		'advances',
+		{
+			'employee_advance': employee_advance_name,
+			'posting_date': posting_date,
+			'advance_paid': flt(paid_amount),
+			'unclaimed_amount': flt(paid_amount) - flt(claimed_amount),
+			'allocated_amount': flt(paid_amount) - flt(claimed_amount)
+		}
+	)
+
+	return expense_claim