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
This commit is contained in:
		
							parent
							
								
									fbc1330ab0
								
							
						
					
					
						commit
						f6fbcc99a3
					
				| @ -104,7 +104,7 @@ class BankClearance(Document): | ||||
| 
 | ||||
| 		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 @@ class BankClearance(Document): | ||||
| 			) | ||||
| 			.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: | ||||
|  | ||||
| @ -467,11 +467,13 @@ def get_lr_matching_query(bank_account, amount_condition, filters): | ||||
| 			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: | ||||
|  | ||||
| @ -198,12 +198,10 @@ def get_loan_entries(filters): | ||||
| 			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 @@ def get_loan_entries(filters): | ||||
| 				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 @@ def get_loan_amount(filters): | ||||
| 			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 @@ def get_loan_amount(filters): | ||||
| 			.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 | ||||
|  | ||||
| @ -16,7 +16,6 @@ | ||||
|   "company", | ||||
|   "posting_date", | ||||
|   "status", | ||||
|   "repay_from_salary", | ||||
|   "section_break_8", | ||||
|   "loan_type", | ||||
|   "loan_amount", | ||||
| @ -124,13 +123,6 @@ | ||||
|    "options": "Sanctioned\nPartially Disbursed\nDisbursed\nLoan Closure Requested\nClosed", | ||||
|    "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", | ||||
| @ -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", | ||||
|  | ||||
| @ -20,15 +20,12 @@ from erpnext.loan_management.doctype.loan_security_unpledge.loan_security_unpled | ||||
| 
 | ||||
| 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 @@ class Loan(AccountsController): | ||||
| 				) | ||||
| 			) | ||||
| 
 | ||||
| 	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 @@ def create_loan_security_unpledge(unpledge_map, loan, company, applicant_type, a | ||||
| 	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") | ||||
|  | ||||
| @ -29,11 +29,8 @@ from erpnext.loan_management.doctype.process_loan_interest_accrual.process_loan_ | ||||
| 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 @@ class TestLoan(unittest.TestCase): | ||||
| 		) | ||||
| 
 | ||||
| 		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) | ||||
| 
 | ||||
|  | ||||
| @ -6,10 +6,7 @@ import unittest | ||||
| 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 @@ class TestLoanApplication(unittest.TestCase): | ||||
| 			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): | ||||
|  | ||||
| @ -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", | ||||
| @ -252,21 +250,6 @@ | ||||
|    "options": "Company:company:default_currency", | ||||
|    "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", | ||||
| @ -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", | ||||
|  | ||||
| @ -396,7 +396,7 @@ class LoanRepayment(AccountsController): | ||||
| 		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 @@ def get_amounts(amounts, against_loan, posting_date): | ||||
| 
 | ||||
| 		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 += ( | ||||
|  | ||||
| @ -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 | ||||
| } | ||||
| @ -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 | ||||
| @ -36,9 +36,6 @@ def before_tests(): | ||||
| 			} | ||||
| 		) | ||||
| 
 | ||||
| 	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() | ||||
|  | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user