chore: Removed payroll dependencies from Loan Management, moved to hrms app
- Salary Slip Loan dt moved to hrms, removed from erpnext app
- Repay from Salary field removed from Loan and Loan Repayment, installed on hrms app setup
- fixed references to salary slip loan fields
diff --git a/erpnext/accounts/doctype/bank_clearance/bank_clearance.py b/erpnext/accounts/doctype/bank_clearance/bank_clearance.py
index 98ba399..1a572d9 100644
--- a/erpnext/accounts/doctype/bank_clearance/bank_clearance.py
+++ b/erpnext/accounts/doctype/bank_clearance/bank_clearance.py
@@ -104,7 +104,7 @@
loan_repayment = frappe.qb.DocType("Loan Repayment")
- loan_repayments = (
+ query = (
frappe.qb.from_(loan_repayment)
.select(
ConstantColumn("Loan Repayment").as_("payment_document"),
@@ -118,13 +118,17 @@
)
.where(loan_repayment.docstatus == 1)
.where(loan_repayment.clearance_date.isnull())
- .where(loan_repayment.repay_from_salary == 0)
.where(loan_repayment.posting_date >= self.from_date)
.where(loan_repayment.posting_date <= self.to_date)
.where(loan_repayment.payment_account.isin([self.bank_account, self.account]))
- .orderby(loan_repayment.posting_date)
- .orderby(loan_repayment.name, frappe.qb.desc)
- ).run(as_dict=1)
+ )
+
+ if frappe.db.has_column("Loan Repayment", "repay_from_salary"):
+ query = query.where((loan_repayment.repay_from_salary == 0))
+
+ query = query.orderby(loan_repayment.posting_date).orderby(loan_repayment.name, frappe.qb.desc)
+
+ loan_repayments = query.run(as_dict=True)
pos_sales_invoices, pos_purchase_invoices = [], []
if self.include_pos_transactions:
diff --git a/erpnext/accounts/doctype/bank_reconciliation_tool/bank_reconciliation_tool.py b/erpnext/accounts/doctype/bank_reconciliation_tool/bank_reconciliation_tool.py
index 0efe086..4cc6bf7 100644
--- a/erpnext/accounts/doctype/bank_reconciliation_tool/bank_reconciliation_tool.py
+++ b/erpnext/accounts/doctype/bank_reconciliation_tool/bank_reconciliation_tool.py
@@ -467,11 +467,13 @@
loan_repayment.posting_date,
)
.where(loan_repayment.docstatus == 1)
- .where(loan_repayment.repay_from_salary == 0)
.where(loan_repayment.clearance_date.isnull())
.where(loan_repayment.payment_account == bank_account)
)
+ if frappe.db.has_column("Loan Repayment", "repay_from_salary"):
+ query = query.where((loan_repayment.repay_from_salary == 0))
+
if amount_condition:
query.where(loan_repayment.amount_paid == filters.get("amount"))
else:
diff --git a/erpnext/accounts/report/bank_reconciliation_statement/bank_reconciliation_statement.py b/erpnext/accounts/report/bank_reconciliation_statement/bank_reconciliation_statement.py
index c41d0d1..c26edde 100644
--- a/erpnext/accounts/report/bank_reconciliation_statement/bank_reconciliation_statement.py
+++ b/erpnext/accounts/report/bank_reconciliation_statement/bank_reconciliation_statement.py
@@ -198,12 +198,10 @@
amount_field = (loan_doc.disbursed_amount).as_("credit")
posting_date = (loan_doc.disbursement_date).as_("posting_date")
account = loan_doc.disbursement_account
- salary_condition = loan_doc.docstatus == 1
else:
amount_field = (loan_doc.amount_paid).as_("debit")
posting_date = (loan_doc.posting_date).as_("posting_date")
account = loan_doc.payment_account
- salary_condition = loan_doc.repay_from_salary == 0
query = (
frappe.qb.from_(loan_doc)
@@ -216,12 +214,14 @@
posting_date,
)
.where(loan_doc.docstatus == 1)
- .where(salary_condition)
.where(account == filters.get("account"))
.where(posting_date <= getdate(filters.get("report_date")))
.where(ifnull(loan_doc.clearance_date, "4000-01-01") > getdate(filters.get("report_date")))
)
+ if doctype == "Loan Repayment" and frappe.db.has_column("Loan Repayment", "repay_from_salary"):
+ query = query.where((loan_doc.repay_from_salary == 0))
+
entries = query.run(as_dict=1)
loan_docs.extend(entries)
@@ -267,13 +267,12 @@
amount_field = Sum(loan_doc.disbursed_amount)
posting_date = (loan_doc.disbursement_date).as_("posting_date")
account = loan_doc.disbursement_account
- salary_condition = loan_doc.docstatus == 1
else:
amount_field = Sum(loan_doc.amount_paid)
posting_date = (loan_doc.posting_date).as_("posting_date")
account = loan_doc.payment_account
- salary_condition = loan_doc.repay_from_salary == 0
- amount = (
+
+ query = (
frappe.qb.from_(loan_doc)
.select(amount_field)
.where(loan_doc.docstatus == 1)
@@ -281,9 +280,12 @@
.where(account == filters.get("account"))
.where(posting_date > getdate(filters.get("report_date")))
.where(ifnull(loan_doc.clearance_date, "4000-01-01") <= getdate(filters.get("report_date")))
- .run()[0][0]
)
+ if doctype == "Loan Repayment" and frappe.db.has_column("Loan Repayment", "repay_from_salary"):
+ query = query.run((loan_doc.repay_from_salary == 0))
+
+ amount = query.run()[0][0]
total_amount += flt(amount)
return total_amount
diff --git a/erpnext/loan_management/doctype/loan/loan.json b/erpnext/loan_management/doctype/loan/loan.json
index ef78a64..ffcbbfe 100644
--- a/erpnext/loan_management/doctype/loan/loan.json
+++ b/erpnext/loan_management/doctype/loan/loan.json
@@ -16,7 +16,6 @@
"company",
"posting_date",
"status",
- "repay_from_salary",
"section_break_8",
"loan_type",
"loan_amount",
@@ -125,13 +124,6 @@
"read_only": 1
},
{
- "default": "0",
- "depends_on": "eval:doc.applicant_type==\"Employee\"",
- "fieldname": "repay_from_salary",
- "fieldtype": "Check",
- "label": "Repay From Salary"
- },
- {
"fieldname": "section_break_8",
"fieldtype": "Section Break",
"label": "Loan Details"
@@ -384,7 +376,7 @@
"index_web_pages_for_search": 1,
"is_submittable": 1,
"links": [],
- "modified": "2022-03-10 11:50:31.957360",
+ "modified": "2022-06-21 11:50:31.957360",
"modified_by": "Administrator",
"module": "Loan Management",
"name": "Loan",
diff --git a/erpnext/loan_management/doctype/loan/loan.py b/erpnext/loan_management/doctype/loan/loan.py
index ac8b362..a795668 100644
--- a/erpnext/loan_management/doctype/loan/loan.py
+++ b/erpnext/loan_management/doctype/loan/loan.py
@@ -20,15 +20,12 @@
class Loan(AccountsController):
def validate(self):
- if self.applicant_type == "Employee" and self.repay_from_salary:
- validate_employee_currency_with_company_currency(self.applicant, self.company)
self.set_loan_amount()
self.validate_loan_amount()
self.set_missing_fields()
self.validate_cost_center()
self.validate_accounts()
self.check_sanctioned_amount_limit()
- self.validate_repay_from_salary()
if self.is_term_loan:
validate_repayment_method(
@@ -106,10 +103,6 @@
)
)
- def validate_repay_from_salary(self):
- if not self.is_term_loan and self.repay_from_salary:
- frappe.throw(_("Repay From Salary can be selected only for term loans"))
-
def make_repayment_schedule(self):
if not self.repayment_start_date:
frappe.throw(_("Repayment Start Date is mandatory for term loans"))
@@ -491,25 +484,6 @@
return unpledge_request
-def validate_employee_currency_with_company_currency(applicant, company):
- from erpnext.payroll.doctype.salary_structure_assignment.salary_structure_assignment import (
- get_employee_currency,
- )
-
- if not applicant:
- frappe.throw(_("Please select Applicant"))
- if not company:
- frappe.throw(_("Please select Company"))
- employee_currency = get_employee_currency(applicant)
- company_currency = erpnext.get_company_currency(company)
- if employee_currency != company_currency:
- frappe.throw(
- _(
- "Loan cannot be repayed from salary for Employee {0} because salary is processed in currency {1}"
- ).format(applicant, employee_currency)
- )
-
-
@frappe.whitelist()
def get_shortfall_applicants():
loans = frappe.get_all("Loan Security Shortfall", {"status": "Pending"}, pluck="loan")
diff --git a/erpnext/loan_management/doctype/loan/test_loan.py b/erpnext/loan_management/doctype/loan/test_loan.py
index e2b0870..da05c8e 100644
--- a/erpnext/loan_management/doctype/loan/test_loan.py
+++ b/erpnext/loan_management/doctype/loan/test_loan.py
@@ -29,11 +29,8 @@
from erpnext.loan_management.doctype.process_loan_security_shortfall.process_loan_security_shortfall import (
create_process_loan_security_shortfall,
)
-from erpnext.payroll.doctype.salary_structure.test_salary_structure import (
- make_employee,
- make_salary_structure,
-)
from erpnext.selling.doctype.customer.test_customer import get_customer_dict
+from erpnext.setup.doctype.employee.test_employee import make_employee
class TestLoan(unittest.TestCase):
@@ -93,13 +90,6 @@
)
self.applicant1 = make_employee("robert_loan@loan.com")
- make_salary_structure(
- "Test Salary Structure Loan",
- "Monthly",
- employee=self.applicant1,
- currency="INR",
- company="_Test Company",
- )
if not frappe.db.exists("Customer", "_Test Loan Customer"):
frappe.get_doc(get_customer_dict("_Test Loan Customer")).insert(ignore_permissions=True)
diff --git a/erpnext/loan_management/doctype/loan_application/test_loan_application.py b/erpnext/loan_management/doctype/loan_application/test_loan_application.py
index 2a4bb88..7a44489 100644
--- a/erpnext/loan_management/doctype/loan_application/test_loan_application.py
+++ b/erpnext/loan_management/doctype/loan_application/test_loan_application.py
@@ -6,10 +6,7 @@
import frappe
from erpnext.loan_management.doctype.loan.test_loan import create_loan_accounts, create_loan_type
-from erpnext.payroll.doctype.salary_structure.test_salary_structure import (
- make_employee,
- make_salary_structure,
-)
+from erpnext.setup.doctype.employee.employee import make_employee
class TestLoanApplication(unittest.TestCase):
@@ -32,9 +29,6 @@
18,
)
self.applicant = make_employee("kate_loan@loan.com", "_Test Company")
- make_salary_structure(
- "Test Salary Structure Loan", "Monthly", employee=self.applicant, currency="INR"
- )
self.create_loan_application()
def create_loan_application(self):
diff --git a/erpnext/loan_management/doctype/loan_repayment/loan_repayment.json b/erpnext/loan_management/doctype/loan_repayment/loan_repayment.json
index 480e010..76dc8b4 100644
--- a/erpnext/loan_management/doctype/loan_repayment/loan_repayment.json
+++ b/erpnext/loan_management/doctype/loan_repayment/loan_repayment.json
@@ -15,9 +15,7 @@
"posting_date",
"clearance_date",
"rate_of_interest",
- "payroll_payable_account",
"is_term_loan",
- "repay_from_salary",
"payment_details_section",
"due_date",
"pending_principal_amount",
@@ -253,21 +251,6 @@
"read_only": 1
},
{
- "depends_on": "eval:doc.repay_from_salary",
- "fieldname": "payroll_payable_account",
- "fieldtype": "Link",
- "label": "Payroll Payable Account",
- "mandatory_depends_on": "eval:doc.repay_from_salary",
- "options": "Account"
- },
- {
- "default": "0",
- "fetch_from": "against_loan.repay_from_salary",
- "fieldname": "repay_from_salary",
- "fieldtype": "Check",
- "label": "Repay From Salary"
- },
- {
"fieldname": "clearance_date",
"fieldtype": "Date",
"label": "Clearance Date",
@@ -311,7 +294,7 @@
"index_web_pages_for_search": 1,
"is_submittable": 1,
"links": [],
- "modified": "2022-02-18 19:10:07.742298",
+ "modified": "2022-06-21 10:10:07.742298",
"modified_by": "Administrator",
"module": "Loan Management",
"name": "Loan Repayment",
diff --git a/erpnext/loan_management/doctype/loan_repayment/loan_repayment.py b/erpnext/loan_management/doctype/loan_repayment/loan_repayment.py
index dcbdf8a..262545b 100644
--- a/erpnext/loan_management/doctype/loan_repayment/loan_repayment.py
+++ b/erpnext/loan_management/doctype/loan_repayment/loan_repayment.py
@@ -396,7 +396,7 @@
else:
remarks = _("Repayment against Loan:") + " " + self.against_loan
- if self.repay_from_salary:
+ if hasattr(self, "repay_from_salary") and self.repay_from_salary:
payment_account = self.payroll_payable_account
else:
payment_account = self.payment_account
@@ -674,7 +674,9 @@
if (
no_of_late_days > 0
- and (not against_loan_doc.repay_from_salary)
+ and (
+ not (hasattr(against_loan_doc, "repay_from_salary") and against_loan_doc.repay_from_salary)
+ )
and entry.accrual_type == "Regular"
):
penalty_amount += (
diff --git a/erpnext/loan_management/doctype/salary_slip_loan/__init__.py b/erpnext/loan_management/doctype/salary_slip_loan/__init__.py
deleted file mode 100644
index e69de29..0000000
--- a/erpnext/loan_management/doctype/salary_slip_loan/__init__.py
+++ /dev/null
diff --git a/erpnext/loan_management/doctype/salary_slip_loan/salary_slip_loan.json b/erpnext/loan_management/doctype/salary_slip_loan/salary_slip_loan.json
deleted file mode 100644
index b7b20d9..0000000
--- a/erpnext/loan_management/doctype/salary_slip_loan/salary_slip_loan.json
+++ /dev/null
@@ -1,101 +0,0 @@
-{
- "actions": [],
- "creation": "2019-08-29 18:11:36.829526",
- "doctype": "DocType",
- "editable_grid": 1,
- "engine": "InnoDB",
- "field_order": [
- "loan",
- "loan_type",
- "loan_account",
- "interest_income_account",
- "column_break_4",
- "principal_amount",
- "interest_amount",
- "total_payment",
- "loan_repayment_entry"
- ],
- "fields": [
- {
- "fieldname": "loan",
- "fieldtype": "Link",
- "in_list_view": 1,
- "label": "Loan",
- "options": "Loan",
- "read_only": 1,
- "reqd": 1
- },
- {
- "fieldname": "loan_account",
- "fieldtype": "Link",
- "label": "Loan Account",
- "options": "Account",
- "read_only": 1
- },
- {
- "fieldname": "interest_income_account",
- "fieldtype": "Link",
- "in_list_view": 1,
- "label": "Interest Income Account",
- "options": "Account",
- "read_only": 1
- },
- {
- "fieldname": "column_break_4",
- "fieldtype": "Column Break"
- },
- {
- "fieldname": "principal_amount",
- "fieldtype": "Currency",
- "in_list_view": 1,
- "label": "Principal Amount",
- "options": "Company:company:default_currency",
- "read_only": 1
- },
- {
- "fieldname": "interest_amount",
- "fieldtype": "Currency",
- "in_list_view": 1,
- "label": "Interest Amount",
- "options": "Company:company:default_currency",
- "read_only": 1
- },
- {
- "fieldname": "total_payment",
- "fieldtype": "Currency",
- "in_list_view": 1,
- "label": "Total Payment",
- "options": "Company:company:default_currency"
- },
- {
- "fieldname": "loan_repayment_entry",
- "fieldtype": "Link",
- "label": "Loan Repayment Entry",
- "no_copy": 1,
- "options": "Loan Repayment",
- "read_only": 1
- },
- {
- "fetch_from": "loan.loan_type",
- "fieldname": "loan_type",
- "fieldtype": "Link",
- "label": "Loan Type",
- "options": "Loan Type",
- "read_only": 1
- }
- ],
- "index_web_pages_for_search": 1,
- "istable": 1,
- "links": [],
- "modified": "2022-01-31 14:50:14.823213",
- "modified_by": "Administrator",
- "module": "Loan Management",
- "name": "Salary Slip Loan",
- "owner": "Administrator",
- "permissions": [],
- "quick_entry": 1,
- "sort_field": "modified",
- "sort_order": "DESC",
- "states": [],
- "track_changes": 1
-}
\ No newline at end of file
diff --git a/erpnext/loan_management/doctype/salary_slip_loan/salary_slip_loan.py b/erpnext/loan_management/doctype/salary_slip_loan/salary_slip_loan.py
deleted file mode 100644
index 91267b8..0000000
--- a/erpnext/loan_management/doctype/salary_slip_loan/salary_slip_loan.py
+++ /dev/null
@@ -1,10 +0,0 @@
-# Copyright (c) 2019, Frappe Technologies Pvt. Ltd. and contributors
-# For license information, please see license.txt
-
-
-# import frappe
-from frappe.model.document import Document
-
-
-class SalarySlipLoan(Document):
- pass
diff --git a/erpnext/setup/utils.py b/erpnext/setup/utils.py
index b3ff439..54bd8c3 100644
--- a/erpnext/setup/utils.py
+++ b/erpnext/setup/utils.py
@@ -36,9 +36,6 @@
}
)
- frappe.db.sql("delete from `tabLeave Allocation`")
- frappe.db.sql("delete from `tabLeave Application`")
- frappe.db.sql("delete from `tabSalary Slip`")
frappe.db.sql("delete from `tabItem Price`")
_enable_all_roles_for_admin()