JV on submitting Employee Loan
diff --git a/erpnext/accounts/doctype/journal_entry/journal_entry.py b/erpnext/accounts/doctype/journal_entry/journal_entry.py
index 9bb3fe4..06724b1 100644
--- a/erpnext/accounts/doctype/journal_entry/journal_entry.py
+++ b/erpnext/accounts/doctype/journal_entry/journal_entry.py
@@ -10,6 +10,7 @@
from erpnext.setup.utils import get_company_currency
from erpnext.accounts.party import get_party_account
from erpnext.hr.doctype.expense_claim.expense_claim import update_reimbursed_amount
+from erpnext.hr.doctype.employee_loan.employee_loan import update_disbursement_status
class JournalEntry(AccountsController):
def __init__(self, arg1, arg2=None):
@@ -46,6 +47,7 @@
self.make_gl_entries()
self.update_advance_paid()
self.update_expense_claim()
+ self.update_employee_loan()
def get_title(self):
return self.pay_to_recd_from or self.accounts[0].account
@@ -69,6 +71,7 @@
self.make_gl_entries(1)
self.update_advance_paid()
self.update_expense_claim()
+ self.update_employee_loan()
self.unlink_advance_entry_reference()
def unlink_advance_entry_reference(self):
@@ -503,6 +506,12 @@
doc = frappe.get_doc("Expense Claim", d.reference_name)
update_reimbursed_amount(doc)
+ def update_employee_loan(self):
+ for d in self.accounts:
+ if d.reference_type=="Employee Loan" and flt(d.debit) > 0:
+ doc = frappe.get_doc("Employee Loan", d.reference_name)
+ update_disbursement_status(doc)
+
def validate_expense_claim(self):
for d in self.accounts:
if d.reference_type=="Expense Claim":
diff --git a/erpnext/accounts/doctype/journal_entry_account/journal_entry_account.json b/erpnext/accounts/doctype/journal_entry_account/journal_entry_account.json
index 0bd6f86..54af579 100644
--- a/erpnext/accounts/doctype/journal_entry_account/journal_entry_account.json
+++ b/erpnext/accounts/doctype/journal_entry_account/journal_entry_account.json
@@ -8,6 +8,7 @@
"custom": 0,
"docstatus": 0,
"doctype": "DocType",
+ "document_type": "Document",
"editable_grid": 1,
"engine": "InnoDB",
"fields": [
@@ -596,7 +597,7 @@
"label": "Reference Type",
"length": 0,
"no_copy": 0,
- "options": "\nSales Invoice\nPurchase Invoice\nJournal Entry\nSales Order\nPurchase Order\nExpense Claim\nAsset",
+ "options": "\nSales Invoice\nPurchase Invoice\nJournal Entry\nSales Order\nPurchase Order\nExpense Claim\nAsset\nEmployee Loan",
"permlevel": 0,
"precision": "",
"print_hide": 0,
@@ -768,7 +769,7 @@
"issingle": 0,
"istable": 1,
"max_attachments": 0,
- "modified": "2017-02-17 16:28:35.118357",
+ "modified": "2017-03-02 05:02:10.102039",
"modified_by": "Administrator",
"module": "Accounts",
"name": "Journal Entry Account",
diff --git a/erpnext/hr/doctype/employee_loan/employee_loan.js b/erpnext/hr/doctype/employee_loan/employee_loan.js
index cb9216f..2f87acf 100644
--- a/erpnext/hr/doctype/employee_loan/employee_loan.js
+++ b/erpnext/hr/doctype/employee_loan/employee_loan.js
@@ -36,7 +36,34 @@
})
},
- mode_of_payment: function(frm){
+ refresh: function(frm) {
+ if (frm.doc.docstatus == 1 && (frm.doc.status == "Sanctioned" || frm.doc.status == "Partially Disbursed")) {
+ frm.add_custom_button(__('Make Disbursement Entry'), function() {
+ frm.trigger("make_jv");
+ })
+ }
+ frm.trigger("toggle_fields");
+ },
+
+ make_jv: function(frm) {
+ frappe.call({
+ args: {
+ "employee_loan": frm.doc.name,
+ "company": frm.doc.company,
+ "employee_loan_account": frm.doc.employee_loan_account,
+ "employee": frm.doc.employee,
+ "loan_amount": frm.doc.loan_amount,
+ "payment_account": frm.doc.payment_account
+ },
+ method: "erpnext.hr.doctype.employee_loan.employee_loan.make_jv_entry",
+ callback: function(r) {
+ if (r.message)
+ var doc = frappe.model.sync(r.message)[0];
+ frappe.set_route("Form", doc.doctype, doc.name);
+ }
+ })
+ },
+ mode_of_payment: function(frm) {
frappe.call({
method: "erpnext.accounts.doctype.sales_invoice.sales_invoice.get_bank_cash_account",
args: {
@@ -51,23 +78,6 @@
});
},
- refresh: function(frm) {
- frm.trigger("toggle_fields");
-
- if(frm.doc.docstatus==1) {
- frm.add_custom_button(__('Ledger'), function() {
- frappe.route_options = {
- "voucher_no": frm.doc.name,
- "from_date": frm.doc.posting_date,
- "to_date": frm.doc.posting_date,
- "company": frm.doc.company,
- group_by_voucher: 0
- };
- frappe.set_route("query-report", "General Ledger");
- }, "fa fa-table");
- }
- },
-
employee_loan_application: function(frm) {
return frm.call({
method: "erpnext.hr.doctype.employee_loan.employee_loan.get_employee_loan_application",
diff --git a/erpnext/hr/doctype/employee_loan/employee_loan.json b/erpnext/hr/doctype/employee_loan/employee_loan.json
index c052dc0..a14c1e0 100644
--- a/erpnext/hr/doctype/employee_loan/employee_loan.json
+++ b/erpnext/hr/doctype/employee_loan/employee_loan.json
@@ -1,5 +1,6 @@
{
"allow_copy": 0,
+ "allow_guest_to_view": 0,
"allow_import": 1,
"allow_rename": 0,
"autoname": "ELN.####",
@@ -237,7 +238,7 @@
"label": "Status",
"length": 0,
"no_copy": 0,
- "options": "Loan Unpaid\nLoan Paid\nEMI in progress\nLoan Repaid",
+ "options": "Sanctioned\nPartially Disbursed\nFully Disbursed\nRepaid/Closed",
"permlevel": 0,
"precision": "",
"print_hide": 0,
@@ -325,6 +326,7 @@
"label": "Loan Amount",
"length": 0,
"no_copy": 0,
+ "options": "Company:company:default_currency",
"permlevel": 0,
"precision": "",
"print_hide": 0,
@@ -506,6 +508,7 @@
"label": "Monthly Repayment Amount",
"length": 0,
"no_copy": 0,
+ "options": "Company:company:default_currency",
"permlevel": 0,
"precision": "",
"print_hide": 0,
@@ -690,7 +693,7 @@
"read_only": 0,
"remember_last_selected_value": 0,
"report_hide": 0,
- "reqd": 0,
+ "reqd": 1,
"search_index": 0,
"set_only_once": 0,
"unique": 0
@@ -801,6 +804,7 @@
"label": "Total Payment",
"length": 0,
"no_copy": 0,
+ "options": "Company:company:default_currency",
"permlevel": 0,
"precision": "",
"print_hide": 0,
@@ -859,6 +863,7 @@
"label": "Total Interest Payable",
"length": 0,
"no_copy": 0,
+ "options": "Company:company:default_currency",
"permlevel": 0,
"precision": "",
"print_hide": 0,
@@ -901,17 +906,17 @@
"unique": 0
}
],
+ "has_web_view": 0,
"hide_heading": 0,
"hide_toolbar": 0,
"idx": 0,
"image_view": 0,
"in_create": 0,
- "in_dialog": 0,
"is_submittable": 1,
"issingle": 0,
"istable": 0,
"max_attachments": 0,
- "modified": "2017-02-22 04:27:13.174800",
+ "modified": "2017-03-09 01:30:19.231918",
"modified_by": "Administrator",
"module": "HR",
"name": "Employee Loan",
diff --git a/erpnext/hr/doctype/employee_loan/employee_loan.py b/erpnext/hr/doctype/employee_loan/employee_loan.py
index 568596e..d4e9a20 100644
--- a/erpnext/hr/doctype/employee_loan/employee_loan.py
+++ b/erpnext/hr/doctype/employee_loan/employee_loan.py
@@ -8,7 +8,6 @@
from frappe import _
from frappe.utils import flt, rounded, add_months, nowdate
from erpnext.controllers.accounts_controller import AccountsController
-from erpnext.accounts.general_ledger import make_gl_entries
class EmployeeLoan(AccountsController):
def validate(self):
@@ -26,33 +25,32 @@
self.set_repayment_period()
self.calculate_totals()
- def on_submit(self):
- self.make_gl_entries()
+ def make_jv_entry(self):
+ self.check_permission('write')
+ journal_entry = frappe.new_doc('Journal Entry')
+ journal_entry.voucher_type = 'Bank Entry'
+ journal_entry.user_remark = _('Against Employee Loan: {0}').format(self.name)
+ journal_entry.company = self.company
+ journal_entry.posting_date = nowdate()
- def on_cancel(self):
- self.make_gl_entries()
+ account_amt_list = []
- def make_gl_entries(self):
- gl_entries = []
- # Gl entries for employee loan account
- gl_entries.append(
- self.get_gl_dict({
- "account": self.employee_loan_account,
- "party_type": "Employee",
- "party": self.employee,
- "debit": self.loan_amount,
- "debit_in_account_currency": self.loan_amount
+ account_amt_list.append({
+ "account": self.employee_loan_account,
+ "party_type": "Employee",
+ "party": self.employee,
+ "debit_in_account_currency": self.loan_amount,
+ "reference_type": "Employee Loan",
+ "reference_name": self.name,
})
- )
- # Gl entries for payment account
- gl_entries.append(
- self.get_gl_dict({
- "account": self.payment_account,
- "credit": self.loan_amount,
- "credit_in_account_currency": self.loan_amount
+ account_amt_list.append({
+ "account": self.payment_account,
+ "credit_in_account_currency": self.loan_amount,
+ "reference_type": "Employee Loan",
+ "reference_name": self.name,
})
- )
- make_gl_entries(gl_entries, cancel=(self.docstatus == 2))
+ journal_entry.set("accounts", account_amt_list)
+ return journal_entry.as_dict()
def make_repayment_schedule(self):
self.repayment_schedule = []
@@ -94,11 +92,19 @@
self.total_payment += data.total_payment
self.total_interest_payable +=data.interest_amount
- def update_status(self):
- if self.disbursement_date:
- self.status = "Loan Paid"
- if len(self.repayment_schedule)>0:
- self.status = "repayment in progress"
+
+def update_disbursement_status(doc):
+ disbursed_amount = frappe.db.sql("""select ifnull(sum(debit_in_account_currency), 0) as disbursed_amount
+ from `tabGL Entry` where against_voucher_type = 'Employee Loan' and against_voucher = %s""",
+ (doc.name), as_dict=1)[0].disbursed_amount
+ if disbursed_amount == doc.loan_amount:
+ frappe.db.set_value("Employee Loan", doc.name , "status", "Fully Disbursed")
+ if disbursed_amount < doc.loan_amount and disbursed_amount != 0:
+ frappe.db.set_value("Employee Loan", doc.name , "status", "Partially Disbursed")
+ if disbursed_amount == 0:
+ frappe.db.set_value("Employee Loan", doc.name , "status", "Sanctioned")
+ if disbursed_amount > doc.loan_amount:
+ frappe.throw(_("Disbursed Amount cannot be greater than Loan Amount {0}").format(doc.loan_amount))
def check_repayment_method(repayment_method, loan_amount, monthly_repayment_amount, repayment_periods):
if repayment_method == "Repay Over Number of Periods" and not repayment_periods:
@@ -124,4 +130,29 @@
def get_employee_loan_application(employee_loan_application):
employee_loan = frappe.get_doc("Employee Loan Application", employee_loan_application)
if employee_loan:
- return employee_loan
\ No newline at end of file
+ return employee_loan
+
+@frappe.whitelist()
+def make_jv_entry(employee_loan, company, employee_loan_account, employee, loan_amount, payment_account):
+ journal_entry = frappe.new_doc('Journal Entry')
+ journal_entry.voucher_type = 'Bank Entry'
+ journal_entry.user_remark = _('Against Employee Loan: {0}').format(employee_loan)
+ journal_entry.company = company
+ journal_entry.posting_date = nowdate()
+
+ account_amt_list = []
+
+ account_amt_list.append({
+ "account": employee_loan_account,
+ "debit_in_account_currency": loan_amount,
+ "reference_type": "Employee Loan",
+ "reference_name": employee_loan,
+ })
+ account_amt_list.append({
+ "account": payment_account,
+ "credit_in_account_currency": loan_amount,
+ "reference_type": "Employee Loan",
+ "reference_name": employee_loan,
+ })
+ journal_entry.set("accounts", account_amt_list)
+ return journal_entry.as_dict()
\ No newline at end of file
diff --git a/erpnext/hr/doctype/employee_loan/test_employee_loan.py b/erpnext/hr/doctype/employee_loan/test_employee_loan.py
index c1c6ba2..8671baa 100644
--- a/erpnext/hr/doctype/employee_loan/test_employee_loan.py
+++ b/erpnext/hr/doctype/employee_loan/test_employee_loan.py
@@ -60,7 +60,8 @@
"disbursement_date": nowdate(),
"mode_of_payment": frappe.db.get_value('Mode of Payment', {'type': 'Cash'}, 'name'),
"payment_account": frappe.db.get_value('Account', {'account_type': 'Cash', 'company': erpnext.get_default_company(),'is_group':0}, "name"),
- "employee_loan_account": frappe.db.get_value('Account', {'account_type': 'Cash', 'company': erpnext.get_default_company(),'is_group':0}, "name")
+ "employee_loan_account": frappe.db.get_value('Account', {'account_type': 'Cash', 'company': erpnext.get_default_company(),'is_group':0}, "name"),
+ "interest_income_account": frappe.db.get_value('Account', {'account_type': 'Cash', 'company': erpnext.get_default_company(),'is_group':0}, "name")
})
employee_loan.insert()
return employee_loan
diff --git a/erpnext/hr/doctype/employee_loan_application/employee_loan_application.json b/erpnext/hr/doctype/employee_loan_application/employee_loan_application.json
index 29617dd..4c673c3 100644
--- a/erpnext/hr/doctype/employee_loan_application/employee_loan_application.json
+++ b/erpnext/hr/doctype/employee_loan_application/employee_loan_application.json
@@ -266,6 +266,7 @@
"label": "Loan Amount",
"length": 0,
"no_copy": 0,
+ "options": "Company:company:default_currency",
"permlevel": 0,
"precision": "",
"print_hide": 0,
@@ -470,6 +471,7 @@
"label": "Total Payable Interest",
"length": 0,
"no_copy": 0,
+ "options": "Company:company:default_currency",
"permlevel": 0,
"precision": "",
"print_hide": 0,
@@ -528,6 +530,7 @@
"label": "Monthly Repayment Amount",
"length": 0,
"no_copy": 0,
+ "options": "Company:company:default_currency",
"permlevel": 0,
"precision": "",
"print_hide": 0,
@@ -587,6 +590,7 @@
"label": "Total Payable Amount",
"length": 0,
"no_copy": 0,
+ "options": "Company:company:default_currency",
"permlevel": 0,
"precision": "",
"print_hide": 0,
@@ -639,7 +643,7 @@
"issingle": 0,
"istable": 0,
"max_attachments": 0,
- "modified": "2017-02-27 04:52:39.344524",
+ "modified": "2017-03-02 04:25:43.397934",
"modified_by": "Administrator",
"module": "HR",
"name": "Employee Loan Application",
diff --git a/erpnext/hr/doctype/loan_type/loan_type.json b/erpnext/hr/doctype/loan_type/loan_type.json
index 3809fc1..ce93979 100644
--- a/erpnext/hr/doctype/loan_type/loan_type.json
+++ b/erpnext/hr/doctype/loan_type/loan_type.json
@@ -58,6 +58,7 @@
"label": "Maximum Loan Amount",
"length": 0,
"no_copy": 0,
+ "options": "Company:company:default_currency",
"permlevel": 0,
"precision": "",
"print_hide": 0,
@@ -198,7 +199,7 @@
"issingle": 0,
"istable": 0,
"max_attachments": 0,
- "modified": "2017-02-27 04:53:51.949600",
+ "modified": "2017-03-02 04:26:05.375693",
"modified_by": "Administrator",
"module": "HR",
"name": "Loan Type",