5353import org .apache .fineract .client .models .PostWorkingCapitalLoansLoanIdResponse ;
5454import org .apache .fineract .client .models .PostWorkingCapitalLoansRequest ;
5555import org .apache .fineract .client .models .PostWorkingCapitalLoansResponse ;
56+ import org .apache .fineract .client .models .PutWorkingCapitalLoansLoanIdDiscountRequest ;
5657import org .apache .fineract .client .models .PutWorkingCapitalLoansLoanIdRequest ;
5758import org .apache .fineract .client .models .PutWorkingCapitalLoansLoanIdResponse ;
5859import org .apache .fineract .test .data .LoanStatus ;
@@ -437,6 +438,7 @@ public void approveWorkingCapitalLoan(final String approveDate, final String app
437438 final PostWorkingCapitalLoansLoanIdRequest approveRequest = workingCapitalLoanRequestFactory
438439 .defaultWorkingCapitalLoanApproveRequest ().approvedOnDate (approveDate ).approvedLoanAmount (new BigDecimal (approvedAmount ))
439440 .expectedDisbursementDate (expectedDisbursementDate );
441+ testContext ().set (TestContextKey .LOAN_APPROVAL_REQUEST , approveRequest );
440442
441443 executeStateTransition ("approve" , approveRequest , TestContextKey .LOAN_APPROVAL_RESPONSE , false );
442444 }
@@ -447,10 +449,25 @@ public void approveWorkingCapitalLoanByExternalId(final String approveDate, fina
447449 final PostWorkingCapitalLoansLoanIdRequest approveRequest = workingCapitalLoanRequestFactory
448450 .defaultWorkingCapitalLoanApproveRequest ().approvedOnDate (approveDate ).approvedLoanAmount (new BigDecimal (approvedAmount ))
449451 .expectedDisbursementDate (expectedDisbursementDate );
452+ testContext ().set (TestContextKey .LOAN_APPROVAL_REQUEST , approveRequest );
450453
451454 executeStateTransition ("approve" , approveRequest , TestContextKey .LOAN_APPROVAL_RESPONSE , true );
452455 }
453456
457+ @ When ("Admin successfully approves the working capital loan on {string} with {string} amount and {string} discount amount and expected disbursement date on {string}" )
458+ public void approveWorkingCapitalLoanWithDiscount (final String approveDate , final String approvedAmount , final String discountAmount ,
459+ final String expectedDisbursementDate ) {
460+ final PostWorkingCapitalLoansLoanIdRequest approveRequest = workingCapitalLoanRequestFactory
461+ .defaultWorkingCapitalLoanApproveRequest ()//
462+ .approvedOnDate (approveDate )//
463+ .approvedLoanAmount (new BigDecimal (approvedAmount ))//
464+ .discountAmount (new BigDecimal (discountAmount ))//
465+ .expectedDisbursementDate (expectedDisbursementDate );
466+ testContext ().set (TestContextKey .LOAN_APPROVAL_REQUEST , approveRequest );
467+
468+ executeStateTransition ("approve" , approveRequest , TestContextKey .LOAN_APPROVAL_RESPONSE , false );
469+ }
470+
454471 @ Then ("Working capital loan approval was successful" )
455472 public void verifyWorkingCapitalLoanApprovalSuccess () {
456473 verifyStateTransitionSuccess (TestContextKey .LOAN_APPROVAL_RESPONSE , "approval" );
@@ -460,8 +477,10 @@ public void verifyWorkingCapitalLoanApprovalSuccess() {
460477 public void approvalOfWorkingCapitalLoanResultsAnError (final String approveDate , final String approvedAmount ,
461478 final String expectedDisbursementDate , final DataTable table ) {
462479 final PostWorkingCapitalLoansLoanIdRequest approveRequest = workingCapitalLoanRequestFactory
463- .defaultWorkingCapitalLoanApproveRequest ().approvedOnDate (approveDate ).approvedLoanAmount (new BigDecimal (approvedAmount ))
464- .expectedDisbursementDate (expectedDisbursementDate );
480+ .defaultWorkingCapitalLoanApproveRequest ()//
481+ .approvedOnDate (approveDate )//
482+ .approvedLoanAmount (new BigDecimal (approvedAmount ))//
483+ .expectedDisbursementDate (expectedDisbursementDate );//
465484
466485 final CallFailedRuntimeException exception = fail (() -> fineractClient .workingCapitalLoans ()
467486 .stateTransitionWorkingCapitalLoanById (getCreatedLoanId (), "approve" , approveRequest ));
@@ -470,6 +489,23 @@ public void approvalOfWorkingCapitalLoanResultsAnError(final String approveDate,
470489 log .info ("Verified working capital loan approval failed with expected error" );
471490 }
472491
492+ @ When ("Admin failed to approve the working capital loan on {string} with {string} amount and expected disbursement date on {string} with {string} exceeded discount amount" )
493+ public void approveWorkingCapitalLoanWithExceededDiscountFailure (final String approveDate , final String approvedAmount ,
494+ final String expectedDisbursementDate , final String discountAmount ) {
495+ final PostWorkingCapitalLoansLoanIdRequest approveRequest = workingCapitalLoanRequestFactory
496+ .defaultWorkingCapitalLoanApproveRequest ()//
497+ .approvedOnDate (approveDate )//
498+ .approvedLoanAmount (new BigDecimal (approvedAmount ))//
499+ .discountAmount (new BigDecimal (discountAmount ))//
500+ .expectedDisbursementDate (expectedDisbursementDate );//
501+
502+ final CallFailedRuntimeException exception = fail (() -> fineractClient .workingCapitalLoans ()
503+ .stateTransitionWorkingCapitalLoanById (getCreatedLoanId (), "approve" , approveRequest ));
504+
505+ assertThat (exception .getStatus ()).as (ErrorMessageHelper .discountAmountExceedFailure ()).isEqualTo (400 );
506+ assertThat (exception .getDeveloperMessage ()).contains (ErrorMessageHelper .discountAmountExceedFailure ());
507+ }
508+
473509 @ When ("Admin rejects the working capital loan on {string}" )
474510 public void rejectWorkingCapitalLoan (final String rejectDate ) {
475511 final PostWorkingCapitalLoansLoanIdRequest rejectRequest = workingCapitalLoanRequestFactory .defaultWorkingCapitalLoanRejectRequest ()
@@ -533,6 +569,7 @@ public void disburseWCLoan(String actualDisbursementDate, String transactionAmou
533569 PostWorkingCapitalLoansLoanIdRequest disburseRequest = workingCapitalLoanRequestFactory .defaultWorkingCapitalLoanDisburseRequest ()
534570 .actualDisbursementDate (actualDisbursementDate )//
535571 .transactionAmount (new BigDecimal (transactionAmount ));
572+ testContext ().set (TestContextKey .LOAN_DISBURSE_REQUEST , disburseRequest );
536573
537574 executeStateTransition ("disburse" , disburseRequest , TestContextKey .LOAN_DISBURSE_RESPONSE , false );
538575 verifyStateTransitionSuccess (TestContextKey .LOAN_DISBURSE_RESPONSE , "disbursement" );
@@ -544,6 +581,7 @@ public void disburseWCLoanByExternalId(String actualDisbursementDate, String tra
544581 PostWorkingCapitalLoansLoanIdRequest disburseRequest = workingCapitalLoanRequestFactory .defaultWorkingCapitalLoanDisburseRequest ()
545582 .actualDisbursementDate (actualDisbursementDate )//
546583 .transactionAmount (new BigDecimal (transactionAmount ));
584+ testContext ().set (TestContextKey .LOAN_DISBURSE_REQUEST , disburseRequest );
547585
548586 executeStateTransition ("disburse" , disburseRequest , TestContextKey .LOAN_DISBURSE_RESPONSE , true );
549587 verifyStateTransitionSuccess (TestContextKey .LOAN_DISBURSE_RESPONSE , "disbursement" );
@@ -567,6 +605,51 @@ public void checkDisbursementData(String actualDisbursementDate, String transact
567605 assertThat (disbursementDetails .getActualAmount ().compareTo (new BigDecimal (transactionAmount ))).isEqualTo (0 );
568606 }
569607
608+ @ And ("Admin successfully disburse the Working Capital loan on {string} with {string} EUR transaction amount and {string} discount amount" )
609+ public void disburseWCLoanWithDiscount (String actualDisbursementDate , String transactionAmount , String discountAmount ) {
610+ PostWorkingCapitalLoansLoanIdRequest disburseRequest = workingCapitalLoanRequestFactory .defaultWorkingCapitalLoanDisburseRequest ()
611+ .actualDisbursementDate (actualDisbursementDate )//
612+ .discountAmount (new BigDecimal (discountAmount )).transactionAmount (new BigDecimal (transactionAmount ));
613+ testContext ().set (TestContextKey .LOAN_DISBURSE_REQUEST , disburseRequest );
614+
615+ executeStateTransition ("disburse" , disburseRequest , TestContextKey .LOAN_DISBURSE_RESPONSE , false );
616+ verifyStateTransitionSuccess (TestContextKey .LOAN_DISBURSE_RESPONSE , "disbursement" );
617+ checkChangesExpectedStatus (TestContextKey .LOAN_DISBURSE_RESPONSE , ACTIVE );
618+ }
619+
620+ @ When ("Admin failed to disburse the working capital loan on {string} with {string} amount with {string} exceeded discount amount" )
621+ public void disburseWorkingCapitalLoanWithExceededDiscountFailure (String actualDisbursementDate , String transactionAmount ,
622+ String discountAmount ) {
623+ PostWorkingCapitalLoansLoanIdRequest disburseRequest = workingCapitalLoanRequestFactory .defaultWorkingCapitalLoanDisburseRequest ()
624+ .actualDisbursementDate (actualDisbursementDate )//
625+ .discountAmount (new BigDecimal (discountAmount )).transactionAmount (new BigDecimal (transactionAmount ));
626+
627+ final CallFailedRuntimeException exception = fail (() -> fineractClient .workingCapitalLoans ()
628+ .stateTransitionWorkingCapitalLoanById (getCreatedLoanId (), "disburse" , disburseRequest ));
629+
630+ assertThat (exception .getStatus ()).as (ErrorMessageHelper .discountAmountExceedFailure ()).isEqualTo (400 );
631+ assertThat (exception .getDeveloperMessage ()).contains (ErrorMessageHelper .discountAmountExceedFailure ());
632+ }
633+
634+ @ Then ("Verify Working Capital loan disbursement was successful" )
635+ public void checkDisbursementData () {
636+ final PostWorkingCapitalLoansResponse loanResponse = testContext ().get (TestContextKey .LOAN_CREATE_RESPONSE );
637+ long loanId = loanResponse .getLoanId ();
638+
639+ GetWorkingCapitalLoansLoanIdResponse loanDetailsResponse = ok (
640+ () -> fineractClient .workingCapitalLoans ().retrieveWorkingCapitalLoanById (loanId ));
641+ String getLoanStatus = loanDetailsResponse .getStatus ().getValue ();
642+ assertThat (getLoanStatus .toUpperCase ()).isEqualTo (ACTIVE .name ());
643+
644+ PostWorkingCapitalLoansLoanIdRequest disburseLoanRequest = testContext ().get (TestContextKey .LOAN_DISBURSE_REQUEST );
645+
646+ GetDisbursementDetail disbursementDetails = loanDetailsResponse .getDisbursementDetails ().stream ().findFirst ()
647+ .orElseThrow (() -> new RuntimeException ("" ));
648+ String formattedDate = disbursementDetails .getActualDisbursementDate ().format (FORMATTER );
649+ assertThat (formattedDate ).isEqualTo (disburseLoanRequest .getActualDisbursementDate ());
650+ assertThat (disbursementDetails .getActualAmount ().compareTo (disburseLoanRequest .getTransactionAmount ())).isEqualTo (0 );
651+ }
652+
570653 @ Then ("Admin successfully undo Working Capital disbursal" )
571654 public void undoDisbursalWCLoan () {
572655 PostWorkingCapitalLoansLoanIdRequest undoDisbursalRequest = workingCapitalLoanRequestFactory
@@ -627,6 +710,38 @@ public void undoDisbursalWCLoanFailure(String actualLoanStatus) {
627710 assertThat (exception .getDeveloperMessage ()).contains (ErrorMessageHelper .undoDisbursalDisallowedFailure (actualLoanStatus ));
628711 }
629712
713+ @ And ("Admin successfully update discount with {string} amount on Working Capital loan account" )
714+ public void updateDiscountWCLoan (String discountAmount ) {
715+ final PostWorkingCapitalLoansResponse loanResponse = testContext ().get (TestContextKey .LOAN_CREATE_RESPONSE );
716+ long loanId = loanResponse .getLoanId ();
717+
718+ PutWorkingCapitalLoansLoanIdDiscountRequest updateDiscountRequest = workingCapitalLoanRequestFactory
719+ .defaultWorkingCapitalLoanUpdateDiscountRequest ().discountAmount (new BigDecimal (discountAmount ));
720+
721+ PutWorkingCapitalLoansLoanIdResponse updateDiscountResponse = ok (
722+ () -> fineractClient .workingCapitalLoans ().updateWorkingCapitalLoanDiscountById (loanId , updateDiscountRequest ));
723+
724+ log .info ("Working Capital Loan discount updated with ID: {}" , updateDiscountResponse .getResourceId ());
725+ }
726+
727+ @ And ("Update discount with {string} amount on Working Capital loan account failed due to already added discount before disbursement" )
728+ public void updateDiscountWCLoanAlreadyAddedFailure (String discountAmount ) {
729+ String errorMessage = ErrorMessageHelper .discountAlreadySetBeforeDisburseFailure ();
730+ updateDiscountFailedCheck (discountAmount , errorMessage );
731+ }
732+
733+ @ And ("Update discount with {string} amount on Working Capital loan account failed due to date diff from disbursement date" )
734+ public void updateDiscountWCLoanDiffFromDisburseDateFailure (String discountAmount ) {
735+ String errorMessage = ErrorMessageHelper .discountDiffDateFromDisburseFailure ();
736+ updateDiscountFailedCheck (discountAmount , errorMessage );
737+ }
738+
739+ @ And ("Update discount with {string} amount on Working Capital loan account failed due to override disallowed by product" )
740+ public void updateDiscountWCLoanOverrideDisallowedByProductFailure (String discountAmount ) {
741+ String errorMessage = ErrorMessageHelper .discountOverrideDisallowedByProductFailure ();
742+ updateDiscountFailedCheck (discountAmount , errorMessage );
743+ }
744+
630745 // ====================================
631746 // Private Helper Methods
632747 // ====================================
@@ -637,6 +752,7 @@ private void createWorkingCapitalLoanAccount(final List<String> loanData) {
637752 final Long clientId = extractClientId ();
638753 final Long loanProductId = resolveLoanProductId (loanProduct );
639754 final PostWorkingCapitalLoansRequest loansRequest = buildCreateLoanRequest (clientId , loanProductId , loanData );
755+ testContext ().set (TestContextKey .LOAN_CREATE_REQUEST , loansRequest );
640756
641757 final PostWorkingCapitalLoansResponse response = ok (
642758 () -> fineractClient .workingCapitalLoans ().submitWorkingCapitalLoanApplication (loansRequest ));
@@ -698,6 +814,19 @@ private void executeStateTransition(final String command, final PostWorkingCapit
698814 testContext ().set (responseKey , response );
699815 }
700816
817+ public void updateDiscountFailedCheck (String discountAmount , String errorMessage ) {
818+ final PostWorkingCapitalLoansResponse loanResponse = testContext ().get (TestContextKey .LOAN_CREATE_RESPONSE );
819+ long loanId = loanResponse .getLoanId ();
820+
821+ PutWorkingCapitalLoansLoanIdDiscountRequest updateDiscountRequest = workingCapitalLoanRequestFactory
822+ .defaultWorkingCapitalLoanUpdateDiscountRequest ().discountAmount (new BigDecimal (discountAmount ));
823+
824+ CallFailedRuntimeException exception = fail (
825+ () -> fineractClient .workingCapitalLoans ().updateWorkingCapitalLoanDiscountById (loanId , updateDiscountRequest ));
826+ assertThat (exception .getStatus ()).as (errorMessage ).isEqualTo (400 );
827+ assertThat (exception .getDeveloperMessage ()).contains (errorMessage );
828+ }
829+
701830 // Data Extraction Helpers
702831 private Long getCreatedLoanId () {
703832 final PostWorkingCapitalLoansResponse loanResponse = testContext ().get (TestContextKey .LOAN_CREATE_RESPONSE );
0 commit comments