Merge pull request #7909 from KanchanChauhan/employee-loan-jv
JV on submitting Employee Loan
This commit is contained in:
commit
c5204f56e2
@ -10,6 +10,7 @@ from erpnext.accounts.utils import get_balance_on, get_account_currency
|
|||||||
from erpnext.setup.utils import get_company_currency
|
from erpnext.setup.utils import get_company_currency
|
||||||
from erpnext.accounts.party import get_party_account
|
from erpnext.accounts.party import get_party_account
|
||||||
from erpnext.hr.doctype.expense_claim.expense_claim import update_reimbursed_amount
|
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):
|
class JournalEntry(AccountsController):
|
||||||
def __init__(self, arg1, arg2=None):
|
def __init__(self, arg1, arg2=None):
|
||||||
@ -46,6 +47,7 @@ class JournalEntry(AccountsController):
|
|||||||
self.make_gl_entries()
|
self.make_gl_entries()
|
||||||
self.update_advance_paid()
|
self.update_advance_paid()
|
||||||
self.update_expense_claim()
|
self.update_expense_claim()
|
||||||
|
self.update_employee_loan()
|
||||||
|
|
||||||
def get_title(self):
|
def get_title(self):
|
||||||
return self.pay_to_recd_from or self.accounts[0].account
|
return self.pay_to_recd_from or self.accounts[0].account
|
||||||
@ -69,6 +71,7 @@ class JournalEntry(AccountsController):
|
|||||||
self.make_gl_entries(1)
|
self.make_gl_entries(1)
|
||||||
self.update_advance_paid()
|
self.update_advance_paid()
|
||||||
self.update_expense_claim()
|
self.update_expense_claim()
|
||||||
|
self.update_employee_loan()
|
||||||
self.unlink_advance_entry_reference()
|
self.unlink_advance_entry_reference()
|
||||||
|
|
||||||
def unlink_advance_entry_reference(self):
|
def unlink_advance_entry_reference(self):
|
||||||
@ -503,6 +506,12 @@ class JournalEntry(AccountsController):
|
|||||||
doc = frappe.get_doc("Expense Claim", d.reference_name)
|
doc = frappe.get_doc("Expense Claim", d.reference_name)
|
||||||
update_reimbursed_amount(doc)
|
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):
|
def validate_expense_claim(self):
|
||||||
for d in self.accounts:
|
for d in self.accounts:
|
||||||
if d.reference_type=="Expense Claim":
|
if d.reference_type=="Expense Claim":
|
||||||
|
@ -8,6 +8,7 @@
|
|||||||
"custom": 0,
|
"custom": 0,
|
||||||
"docstatus": 0,
|
"docstatus": 0,
|
||||||
"doctype": "DocType",
|
"doctype": "DocType",
|
||||||
|
"document_type": "Document",
|
||||||
"editable_grid": 1,
|
"editable_grid": 1,
|
||||||
"engine": "InnoDB",
|
"engine": "InnoDB",
|
||||||
"fields": [
|
"fields": [
|
||||||
@ -596,7 +597,7 @@
|
|||||||
"label": "Reference Type",
|
"label": "Reference Type",
|
||||||
"length": 0,
|
"length": 0,
|
||||||
"no_copy": 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,
|
"permlevel": 0,
|
||||||
"precision": "",
|
"precision": "",
|
||||||
"print_hide": 0,
|
"print_hide": 0,
|
||||||
@ -768,7 +769,7 @@
|
|||||||
"issingle": 0,
|
"issingle": 0,
|
||||||
"istable": 1,
|
"istable": 1,
|
||||||
"max_attachments": 0,
|
"max_attachments": 0,
|
||||||
"modified": "2017-02-17 16:28:35.118357",
|
"modified": "2017-03-02 05:02:10.102039",
|
||||||
"modified_by": "Administrator",
|
"modified_by": "Administrator",
|
||||||
"module": "Accounts",
|
"module": "Accounts",
|
||||||
"name": "Journal Entry Account",
|
"name": "Journal Entry Account",
|
||||||
|
@ -36,7 +36,34 @@ frappe.ui.form.on('Employee Loan', {
|
|||||||
})
|
})
|
||||||
},
|
},
|
||||||
|
|
||||||
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({
|
frappe.call({
|
||||||
method: "erpnext.accounts.doctype.sales_invoice.sales_invoice.get_bank_cash_account",
|
method: "erpnext.accounts.doctype.sales_invoice.sales_invoice.get_bank_cash_account",
|
||||||
args: {
|
args: {
|
||||||
@ -51,23 +78,6 @@ frappe.ui.form.on('Employee Loan', {
|
|||||||
});
|
});
|
||||||
},
|
},
|
||||||
|
|
||||||
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) {
|
employee_loan_application: function(frm) {
|
||||||
return frm.call({
|
return frm.call({
|
||||||
method: "erpnext.hr.doctype.employee_loan.employee_loan.get_employee_loan_application",
|
method: "erpnext.hr.doctype.employee_loan.employee_loan.get_employee_loan_application",
|
||||||
|
@ -1,5 +1,6 @@
|
|||||||
{
|
{
|
||||||
"allow_copy": 0,
|
"allow_copy": 0,
|
||||||
|
"allow_guest_to_view": 0,
|
||||||
"allow_import": 1,
|
"allow_import": 1,
|
||||||
"allow_rename": 0,
|
"allow_rename": 0,
|
||||||
"autoname": "ELN.####",
|
"autoname": "ELN.####",
|
||||||
@ -237,7 +238,7 @@
|
|||||||
"label": "Status",
|
"label": "Status",
|
||||||
"length": 0,
|
"length": 0,
|
||||||
"no_copy": 0,
|
"no_copy": 0,
|
||||||
"options": "Loan Unpaid\nLoan Paid\nEMI in progress\nLoan Repaid",
|
"options": "Sanctioned\nPartially Disbursed\nFully Disbursed\nRepaid/Closed",
|
||||||
"permlevel": 0,
|
"permlevel": 0,
|
||||||
"precision": "",
|
"precision": "",
|
||||||
"print_hide": 0,
|
"print_hide": 0,
|
||||||
@ -325,6 +326,7 @@
|
|||||||
"label": "Loan Amount",
|
"label": "Loan Amount",
|
||||||
"length": 0,
|
"length": 0,
|
||||||
"no_copy": 0,
|
"no_copy": 0,
|
||||||
|
"options": "Company:company:default_currency",
|
||||||
"permlevel": 0,
|
"permlevel": 0,
|
||||||
"precision": "",
|
"precision": "",
|
||||||
"print_hide": 0,
|
"print_hide": 0,
|
||||||
@ -506,6 +508,7 @@
|
|||||||
"label": "Monthly Repayment Amount",
|
"label": "Monthly Repayment Amount",
|
||||||
"length": 0,
|
"length": 0,
|
||||||
"no_copy": 0,
|
"no_copy": 0,
|
||||||
|
"options": "Company:company:default_currency",
|
||||||
"permlevel": 0,
|
"permlevel": 0,
|
||||||
"precision": "",
|
"precision": "",
|
||||||
"print_hide": 0,
|
"print_hide": 0,
|
||||||
@ -690,7 +693,7 @@
|
|||||||
"read_only": 0,
|
"read_only": 0,
|
||||||
"remember_last_selected_value": 0,
|
"remember_last_selected_value": 0,
|
||||||
"report_hide": 0,
|
"report_hide": 0,
|
||||||
"reqd": 0,
|
"reqd": 1,
|
||||||
"search_index": 0,
|
"search_index": 0,
|
||||||
"set_only_once": 0,
|
"set_only_once": 0,
|
||||||
"unique": 0
|
"unique": 0
|
||||||
@ -801,6 +804,7 @@
|
|||||||
"label": "Total Payment",
|
"label": "Total Payment",
|
||||||
"length": 0,
|
"length": 0,
|
||||||
"no_copy": 0,
|
"no_copy": 0,
|
||||||
|
"options": "Company:company:default_currency",
|
||||||
"permlevel": 0,
|
"permlevel": 0,
|
||||||
"precision": "",
|
"precision": "",
|
||||||
"print_hide": 0,
|
"print_hide": 0,
|
||||||
@ -859,6 +863,7 @@
|
|||||||
"label": "Total Interest Payable",
|
"label": "Total Interest Payable",
|
||||||
"length": 0,
|
"length": 0,
|
||||||
"no_copy": 0,
|
"no_copy": 0,
|
||||||
|
"options": "Company:company:default_currency",
|
||||||
"permlevel": 0,
|
"permlevel": 0,
|
||||||
"precision": "",
|
"precision": "",
|
||||||
"print_hide": 0,
|
"print_hide": 0,
|
||||||
@ -901,17 +906,17 @@
|
|||||||
"unique": 0
|
"unique": 0
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
|
"has_web_view": 0,
|
||||||
"hide_heading": 0,
|
"hide_heading": 0,
|
||||||
"hide_toolbar": 0,
|
"hide_toolbar": 0,
|
||||||
"idx": 0,
|
"idx": 0,
|
||||||
"image_view": 0,
|
"image_view": 0,
|
||||||
"in_create": 0,
|
"in_create": 0,
|
||||||
"in_dialog": 0,
|
|
||||||
"is_submittable": 1,
|
"is_submittable": 1,
|
||||||
"issingle": 0,
|
"issingle": 0,
|
||||||
"istable": 0,
|
"istable": 0,
|
||||||
"max_attachments": 0,
|
"max_attachments": 0,
|
||||||
"modified": "2017-02-22 04:27:13.174800",
|
"modified": "2017-03-09 01:30:19.231918",
|
||||||
"modified_by": "Administrator",
|
"modified_by": "Administrator",
|
||||||
"module": "HR",
|
"module": "HR",
|
||||||
"name": "Employee Loan",
|
"name": "Employee Loan",
|
||||||
|
@ -8,7 +8,6 @@ import erpnext
|
|||||||
from frappe import _
|
from frappe import _
|
||||||
from frappe.utils import flt, rounded, add_months, nowdate
|
from frappe.utils import flt, rounded, add_months, nowdate
|
||||||
from erpnext.controllers.accounts_controller import AccountsController
|
from erpnext.controllers.accounts_controller import AccountsController
|
||||||
from erpnext.accounts.general_ledger import make_gl_entries
|
|
||||||
|
|
||||||
class EmployeeLoan(AccountsController):
|
class EmployeeLoan(AccountsController):
|
||||||
def validate(self):
|
def validate(self):
|
||||||
@ -26,33 +25,32 @@ class EmployeeLoan(AccountsController):
|
|||||||
self.set_repayment_period()
|
self.set_repayment_period()
|
||||||
self.calculate_totals()
|
self.calculate_totals()
|
||||||
|
|
||||||
def on_submit(self):
|
def make_jv_entry(self):
|
||||||
self.make_gl_entries()
|
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):
|
account_amt_list = []
|
||||||
self.make_gl_entries()
|
|
||||||
|
|
||||||
def make_gl_entries(self):
|
account_amt_list.append({
|
||||||
gl_entries = []
|
"account": self.employee_loan_account,
|
||||||
# Gl entries for employee loan account
|
"party_type": "Employee",
|
||||||
gl_entries.append(
|
"party": self.employee,
|
||||||
self.get_gl_dict({
|
"debit_in_account_currency": self.loan_amount,
|
||||||
"account": self.employee_loan_account,
|
"reference_type": "Employee Loan",
|
||||||
"party_type": "Employee",
|
"reference_name": self.name,
|
||||||
"party": self.employee,
|
|
||||||
"debit": self.loan_amount,
|
|
||||||
"debit_in_account_currency": self.loan_amount
|
|
||||||
})
|
})
|
||||||
)
|
account_amt_list.append({
|
||||||
# Gl entries for payment account
|
"account": self.payment_account,
|
||||||
gl_entries.append(
|
"credit_in_account_currency": self.loan_amount,
|
||||||
self.get_gl_dict({
|
"reference_type": "Employee Loan",
|
||||||
"account": self.payment_account,
|
"reference_name": self.name,
|
||||||
"credit": self.loan_amount,
|
|
||||||
"credit_in_account_currency": self.loan_amount
|
|
||||||
})
|
})
|
||||||
)
|
journal_entry.set("accounts", account_amt_list)
|
||||||
make_gl_entries(gl_entries, cancel=(self.docstatus == 2))
|
return journal_entry.as_dict()
|
||||||
|
|
||||||
def make_repayment_schedule(self):
|
def make_repayment_schedule(self):
|
||||||
self.repayment_schedule = []
|
self.repayment_schedule = []
|
||||||
@ -94,11 +92,19 @@ class EmployeeLoan(AccountsController):
|
|||||||
self.total_payment += data.total_payment
|
self.total_payment += data.total_payment
|
||||||
self.total_interest_payable +=data.interest_amount
|
self.total_interest_payable +=data.interest_amount
|
||||||
|
|
||||||
def update_status(self):
|
|
||||||
if self.disbursement_date:
|
def update_disbursement_status(doc):
|
||||||
self.status = "Loan Paid"
|
disbursed_amount = frappe.db.sql("""select ifnull(sum(debit_in_account_currency), 0) as disbursed_amount
|
||||||
if len(self.repayment_schedule)>0:
|
from `tabGL Entry` where against_voucher_type = 'Employee Loan' and against_voucher = %s""",
|
||||||
self.status = "repayment in progress"
|
(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):
|
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:
|
if repayment_method == "Repay Over Number of Periods" and not repayment_periods:
|
||||||
@ -124,4 +130,29 @@ def get_monthly_repayment_amount(repayment_method, loan_amount, rate_of_interest
|
|||||||
def get_employee_loan_application(employee_loan_application):
|
def get_employee_loan_application(employee_loan_application):
|
||||||
employee_loan = frappe.get_doc("Employee Loan Application", employee_loan_application)
|
employee_loan = frappe.get_doc("Employee Loan Application", employee_loan_application)
|
||||||
if employee_loan:
|
if employee_loan:
|
||||||
return employee_loan
|
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()
|
@ -60,7 +60,8 @@ def create_employee_loan(employee, loan_type, loan_amount, repayment_method, rep
|
|||||||
"disbursement_date": nowdate(),
|
"disbursement_date": nowdate(),
|
||||||
"mode_of_payment": frappe.db.get_value('Mode of Payment', {'type': 'Cash'}, 'name'),
|
"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"),
|
"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()
|
employee_loan.insert()
|
||||||
return employee_loan
|
return employee_loan
|
||||||
|
@ -266,6 +266,7 @@
|
|||||||
"label": "Loan Amount",
|
"label": "Loan Amount",
|
||||||
"length": 0,
|
"length": 0,
|
||||||
"no_copy": 0,
|
"no_copy": 0,
|
||||||
|
"options": "Company:company:default_currency",
|
||||||
"permlevel": 0,
|
"permlevel": 0,
|
||||||
"precision": "",
|
"precision": "",
|
||||||
"print_hide": 0,
|
"print_hide": 0,
|
||||||
@ -470,6 +471,7 @@
|
|||||||
"label": "Total Payable Interest",
|
"label": "Total Payable Interest",
|
||||||
"length": 0,
|
"length": 0,
|
||||||
"no_copy": 0,
|
"no_copy": 0,
|
||||||
|
"options": "Company:company:default_currency",
|
||||||
"permlevel": 0,
|
"permlevel": 0,
|
||||||
"precision": "",
|
"precision": "",
|
||||||
"print_hide": 0,
|
"print_hide": 0,
|
||||||
@ -528,6 +530,7 @@
|
|||||||
"label": "Monthly Repayment Amount",
|
"label": "Monthly Repayment Amount",
|
||||||
"length": 0,
|
"length": 0,
|
||||||
"no_copy": 0,
|
"no_copy": 0,
|
||||||
|
"options": "Company:company:default_currency",
|
||||||
"permlevel": 0,
|
"permlevel": 0,
|
||||||
"precision": "",
|
"precision": "",
|
||||||
"print_hide": 0,
|
"print_hide": 0,
|
||||||
@ -587,6 +590,7 @@
|
|||||||
"label": "Total Payable Amount",
|
"label": "Total Payable Amount",
|
||||||
"length": 0,
|
"length": 0,
|
||||||
"no_copy": 0,
|
"no_copy": 0,
|
||||||
|
"options": "Company:company:default_currency",
|
||||||
"permlevel": 0,
|
"permlevel": 0,
|
||||||
"precision": "",
|
"precision": "",
|
||||||
"print_hide": 0,
|
"print_hide": 0,
|
||||||
@ -639,7 +643,7 @@
|
|||||||
"issingle": 0,
|
"issingle": 0,
|
||||||
"istable": 0,
|
"istable": 0,
|
||||||
"max_attachments": 0,
|
"max_attachments": 0,
|
||||||
"modified": "2017-02-27 04:52:39.344524",
|
"modified": "2017-03-02 04:25:43.397934",
|
||||||
"modified_by": "Administrator",
|
"modified_by": "Administrator",
|
||||||
"module": "HR",
|
"module": "HR",
|
||||||
"name": "Employee Loan Application",
|
"name": "Employee Loan Application",
|
||||||
|
@ -58,6 +58,7 @@
|
|||||||
"label": "Maximum Loan Amount",
|
"label": "Maximum Loan Amount",
|
||||||
"length": 0,
|
"length": 0,
|
||||||
"no_copy": 0,
|
"no_copy": 0,
|
||||||
|
"options": "Company:company:default_currency",
|
||||||
"permlevel": 0,
|
"permlevel": 0,
|
||||||
"precision": "",
|
"precision": "",
|
||||||
"print_hide": 0,
|
"print_hide": 0,
|
||||||
@ -198,7 +199,7 @@
|
|||||||
"issingle": 0,
|
"issingle": 0,
|
||||||
"istable": 0,
|
"istable": 0,
|
||||||
"max_attachments": 0,
|
"max_attachments": 0,
|
||||||
"modified": "2017-02-27 04:53:51.949600",
|
"modified": "2017-03-02 04:26:05.375693",
|
||||||
"modified_by": "Administrator",
|
"modified_by": "Administrator",
|
||||||
"module": "HR",
|
"module": "HR",
|
||||||
"name": "Loan Type",
|
"name": "Loan Type",
|
||||||
|
Loading…
Reference in New Issue
Block a user