def create_test_interest(**kwargs): args = frappe._dict(kwargs) if not args.skip_dependencies: create_test_loan( loan_no=args.loan or "_Test Loan 1", loan_principal=args.loan_principal or 100000.0, loan_plan=args.loan_plan or "_Test Loan Plan Eco", ) create_test_disbursement( loan=args.loan or "_Test Loan 1", amount=args.loan_principal or 100000.0, skip_dependencies=True, ) doc = frappe.new_doc("Microfinance Loan Interest") doc.update({ "loan": args.loan or "_Test Loan 1", "posting_date": args.posting_date or "2017-09-17", "start_date": args.start_date or "2017-08-19", "end_date": args.start_date or "2017-08-31", "billed_amount": args.billed_amount, }) if not args.do_not_insert: doc.insert(ignore_if_duplicate=True) if not args.do_not_submit: doc.submit() return doc
def create_test_disbursement(**kwargs): args = frappe._dict(kwargs) if not args.skip_dependencies: create_test_loan( loan_no=args.loan or '_Test Loan 1', loan_principal=args.loan_principal or 100000.0, ) doc = frappe.new_doc('Microfinance Disbursement') doc.update({ 'loan': args.loan or '_Test Loan 1', 'posting_date': args.posting_date or '2017-08-20', 'amount': args.amount or 100000.0, 'mode_of_payment': args.mode_of_payment or 'Cash', }) if args.is_opening: doc.update({ 'is_opening': 'Yes', 'recovered_amount': args.recovered_amount or 20000.0, }) if args.charges: for item in args.charges: doc.append('charges', item) if args.mode_of_payment == 'Cheque': doc.update({ 'cheque_no': args.cheque_no or 'ABCABC', 'cheque_date': args.cheque_date or '2017-08-20', }) if not args.do_not_insert: doc.insert(ignore_if_duplicate=True) if not args.do_not_submit: doc.submit() return doc
def create_test_recovery(**kwargs): args = frappe._dict(kwargs) if not args.skip_dependencies: create_test_loan( loan_no=args.loan or '_Test Loan 1', loan_plan=args.loan_plan or '_Test Loan Plan Basic', loan_principal=args.loan_principal or 100000.0, ) create_test_disbursement( loan=args.loan or '_Test Loan 1', amount=args.amount or args.loan_principal or 100000.0, skip_dependencies=True, ) doc = frappe.new_doc('Microfinance Recovery') doc.update({ 'loan': args.loan or '_Test Loan 1', 'posting_date': args.posting_date or '2017-09-17', 'total_interests': args.total_interests or 0.0, 'principal_amount': args.principal_amount or 0.0, 'mode_of_payment': args.mode_of_payment or 'Cash', }) if args.charges: for item in args.charges: doc.append('charges', item) if args.mode_of_payment == 'Cheque': doc.update({ 'cheque_no': args.cheque_no or 'ABCABC', 'cheque_date': args.cheque_date or '2017-08-20', }) if not args.do_not_insert: doc.insert(ignore_if_duplicate=True) if not args.do_not_submit: doc.submit() return doc
def create_test_write_off(**kwargs): args = frappe._dict(kwargs) if not args.skip_dependencies: create_test_loan( loan_no=args.loan or "_Test Loan 1", loan_principal=args.loan_principal or 100000.0, loan_plan=args.loan_plan or "_Test Loan Plan Eco", ) create_test_disbursement( loan=args.loan or "_Test Loan 1", amount=args.loan_principal or 100000.0, skip_dependencies=True, ) doc = frappe.new_doc("Microfinance Write Off") doc.update({ "loan": args.loan or "_Test Loan 1", "posting_date": args.posting_date or "2017-09-17", "amount": args.amount or 25000.0, "reason": args.reason or "_Test Write Off Reason", }) if not args.do_not_insert: doc.insert(ignore_if_duplicate=True) if not args.do_not_submit: doc.submit() return doc
def create_test_recovery(**kwargs): args = frappe._dict(kwargs) if not args.skip_dependencies: create_test_loan( loan_no=args.loan or "_Test Loan 1", loan_plan=args.loan_plan or "_Test Loan Plan Basic", loan_principal=args.loan_principal or 100000.0, ) create_test_disbursement( loan=args.loan or "_Test Loan 1", amount=args.amount or args.loan_principal or 100000.0, skip_dependencies=True, ) doc = frappe.new_doc("Microfinance Recovery") doc.update({ "loan": args.loan or "_Test Loan 1", "posting_date": args.posting_date or "2017-09-17", "total_interests": args.total_interests or 0.0, "principal_amount": args.principal_amount or 0.0, "mode_of_payment": args.mode_of_payment or "Cash", }) if args.charges: for item in args.charges: doc.append("charges", item) if args.mode_of_payment == "Cheque": doc.update({ "cheque_no": args.cheque_no or "ABCABC", "cheque_date": args.cheque_date or "2017-08-20", }) if not args.do_not_insert: doc.insert(ignore_if_duplicate=True) if not args.do_not_submit: doc.submit() return doc
def test_update_amounts_raises_when_less_than_disbursed(self): create_test_loan(loan_no="_Test Loan 1", loan_principal=50000.0, recovery_amount=5000.0) create_test_disbursement(skip_dependencies=True, loan="_Test Loan 1", amount=40000.0) with self.assertRaises(frappe.exceptions.ValidationError): update_amounts(name="_Test Loan 1", principal_amount=39000.0) remove_test_disbursement("_Test Loan 1", keep_dependencies=True)
def test_raises_when_posting_date_is_before_loan_posting_date(self): create_test_loan( loan_no='_Test Loan 1', posting_date='2017-12-12', ) with self.assertRaises(frappe.exceptions.ValidationError): create_test_disbursement( skip_dependencies=True, posting_date='2017-11-11', do_not_submit=True, )
def test_raises_when_total_disbursed_exceeds_outstanding(self): create_test_loan( loan_no='_Test Loan 1', loan_principal=50000.0, ) with self.assertRaises(frappe.exceptions.ValidationError): create_test_disbursement( skip_dependencies=True, amount=60000.0, do_not_submit=True, )
def test_update_amounts(self): create_test_loan(loan_no="_Test Loan 1", loan_principal=50000.0, recovery_amount=5000.0) update_amounts(name="_Test Loan 1", principal_amount=60000.0, recovery_amount=6000.0) principal, recovery = frappe.get_value( "Microfinance Loan", "_Test Loan 1", ["loan_principal", "recovery_amount"]) self.assertEqual(principal, 60000) self.assertEqual(recovery, 6000)
def test_updates_loan_status_for_partial(self): create_test_loan( loan_no='_Test Loan 1', loan_principal=100000.0, ) disbursement = create_test_disbursement( skip_dependencies=True, amount=50000.0, ) disbursement_status = frappe.get_value( 'Microfinance Loan', disbursement.loan, 'disbursement_status' ) self.assertEqual(disbursement_status, 'Partially Disbursed')
def test_update_amounts(self): create_test_loan( loan_no='_Test Loan 1', loan_principal=50000.0, recovery_amount=5000.0, ) update_amounts(name='_Test Loan 1', principal_amount=60000.0, recovery_amount=6000.0) principal, recovery = frappe.get_value( 'Microfinance Loan', '_Test Loan 1', ['loan_principal', 'recovery_amount'], ) self.assertEqual(principal, 60000) self.assertEqual(recovery, 6000)
def create_test_write_off(**kwargs): args = frappe._dict(kwargs) if not args.skip_dependencies: create_test_loan(loan_no=args.loan or '_Test Loan 1', loan_principal=args.loan_principal or 100000.0, loan_plan=args.loan_plan or '_Test Loan Plan Eco') create_test_disbursement( loan=args.loan or '_Test Loan 1', amount=args.loan_principal or 100000.0, skip_dependencies=True, ) doc = frappe.new_doc('Microfinance Write Off') doc.update({ 'loan': args.loan or '_Test Loan 1', 'posting_date': args.posting_date or '2017-09-17', 'amount': args.amount or 25000.0, 'reason': args.reason or '_Test Write Off Reason', }) if not args.do_not_insert: doc.insert(ignore_if_duplicate=True) if not args.do_not_submit: doc.submit() return doc
def create_test_interest(**kwargs): args = frappe._dict(kwargs) if not args.skip_dependencies: create_test_loan(loan_no=args.loan or '_Test Loan 1', loan_principal=args.loan_principal or 100000.0, loan_plan=args.loan_plan or '_Test Loan Plan Eco') create_test_disbursement( loan=args.loan or '_Test Loan 1', amount=args.loan_principal or 100000.0, skip_dependencies=True, ) doc = frappe.new_doc('Microfinance Loan Interest') doc.update({ 'loan': args.loan or '_Test Loan 1', 'posting_date': args.posting_date or '2017-09-17', 'start_date': args.start_date or '2017-08-19', 'end_date': args.start_date or '2017-08-31', 'billed_amount': args.billed_amount, }) if not args.do_not_insert: doc.insert(ignore_if_duplicate=True) if not args.do_not_submit: doc.submit() return doc
def test_on_existing_interest(self): loan = create_test_loan( loan_no='_Test Loan 1', posting_date='2017-08-19' ) create_test_disbursement( skip_dependencies=True, loan=loan.loan_no, amount=50000.0, posting_date='2017-08-20', ) interests = [ { 'posting_date': '2017-09-01', 'start_date': '2017-08-19', 'end_date': '2017-08-31', 'period': 'Aug 2017', }, { 'posting_date': '2017-10-01', 'start_date': '2017-09-01', 'end_date': '2017-09-30', 'period': 'Sep 2017', } ] interest_docs = [] for interest in interests: interest.update({ 'doctype': 'Microfinance Loan Interest', 'loan': loan.loan_no, }) doc = frappe.get_doc(interest) doc.save() doc.submit() interest_docs.append(doc.name) self.assertEqual( frappe.get_value( 'Microfinance Loan Interest', '_Test Loan 1/2017-09', 'billed_amount', ), 6000, ) create_test_disbursement( skip_dependencies=True, loan=loan.loan_no, amount=50000.0, posting_date='2017-09-20', ) billed_amount = frappe.get_value( 'Microfinance Loan Interest', '_Test Loan 1/2017-09', 'billed_amount', ) self.assertEqual(billed_amount, 11000) for docname in interest_docs: doc = frappe.get_doc('Microfinance Loan Interest', docname) doc.cancel() frappe.delete_doc( doctype='Microfinance Loan Interest', name=docname, force=True )