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