3636import java .util .ArrayList ;
3737import java .util .List ;
3838import java .util .Map ;
39+ import java .util .Optional ;
3940import lombok .RequiredArgsConstructor ;
4041import lombok .extern .slf4j .Slf4j ;
4142import org .apache .fineract .client .feign .FineractFeignClient ;
4445import org .apache .fineract .client .models .GetDisbursementDetail ;
4546import org .apache .fineract .client .models .GetWorkingCapitalLoansLoanIdResponse ;
4647import org .apache .fineract .client .models .PostClientsResponse ;
48+ import org .apache .fineract .client .models .PostWorkingCapitalLoanProductsRequest ;
49+ import org .apache .fineract .client .models .PostWorkingCapitalLoanProductsResponse ;
4750import org .apache .fineract .client .models .PostWorkingCapitalLoansLoanIdRequest ;
4851import org .apache .fineract .client .models .PostWorkingCapitalLoansLoanIdResponse ;
4952import org .apache .fineract .client .models .PostWorkingCapitalLoansRequest ;
5457import org .apache .fineract .test .data .workingcapitalproduct .DefaultWorkingCapitalLoanProduct ;
5558import org .apache .fineract .test .data .workingcapitalproduct .WorkingCapitalLoanProductResolver ;
5659import org .apache .fineract .test .factory .WorkingCapitalLoanRequestFactory ;
60+ import org .apache .fineract .test .factory .WorkingCapitalRequestFactory ;
5761import org .apache .fineract .test .helper .ErrorMessageHelper ;
5862import org .apache .fineract .test .helper .Utils ;
5963import org .apache .fineract .test .messaging .event .EventCheckHelper ;
@@ -71,6 +75,7 @@ public class WorkingCapitalProductLoanAccountStepDef extends AbstractStepDef {
7175 private final FineractFeignClient fineractClient ;
7276 private final WorkingCapitalLoanProductResolver workingCapitalLoanProductResolver ;
7377 private final WorkingCapitalLoanRequestFactory workingCapitalLoanRequestFactory ;
78+ private final WorkingCapitalRequestFactory workingCapitalProductRequestFactory ;
7479 private final EventCheckHelper eventCheckHelper ;
7580
7681 @ When ("Admin creates a working capital loan with the following data:" )
@@ -846,4 +851,125 @@ public void disburseWCLoanFailure(String actualDisbursementDate, String transact
846851 assertThat (exception .getDeveloperMessage ()).contains (errorMessage );
847852 }
848853
854+ @ When ("Admin creates a Working Capital Loan Product with delinquencyGraceDays {int} and delinquencyStartType {string} for loan test" )
855+ public void createProductWithGraceDaysForLoanTest (int graceDays , String startType ) {
856+ final String name = "WCLP-GD-" + Utils .randomStringGenerator ("" , 8 );
857+ final PostWorkingCapitalLoanProductsRequest request = workingCapitalProductRequestFactory .defaultWorkingCapitalLoanProductRequest () //
858+ .name (name ) //
859+ .delinquencyGraceDays (graceDays ) //
860+ .delinquencyStartType (startType );
861+ final PostWorkingCapitalLoanProductsResponse response = ok (
862+ () -> fineractClient .workingCapitalLoanProducts ().createWorkingCapitalLoanProduct (request , Map .of ()));
863+ testContext ().set (TestContextKey .WORKING_CAPITAL_LOAN_PRODUCT_CREATE_RESPONSE , response );
864+ testContext ().set (TestContextKey .WORKING_CAPITAL_LOAN_PRODUCT_FOR_LOAN_TEST , response .getResourceId ());
865+ log .info ("Created WC Loan Product with grace days for loan test, ID: {}" , response .getResourceId ());
866+ }
867+
868+ @ When ("Admin creates a working capital loan with the grace days product and the following data:" )
869+ public void createLoanWithGraceDaysProduct (final DataTable table ) {
870+ final Map <String , String > row = table .asMaps ().get (0 );
871+ submitLoanAndStore (buildGraceDaysLoanRequest (row ));
872+ }
873+
874+ @ When ("Admin creates a working capital loan with grace days override and the following data:" )
875+ public void createLoanWithGraceDaysOverride (final DataTable table ) {
876+ final Map <String , String > row = table .asMaps ().get (0 );
877+ final PostWorkingCapitalLoansRequest request = buildGraceDaysLoanRequest (row ) //
878+ .delinquencyGraceDays (
879+ Optional .ofNullable (row .get ("delinquencyGraceDays" )).filter (s -> !s .isEmpty ()).map (Integer ::valueOf ).orElse (null )) //
880+ .delinquencyStartType (row .get ("delinquencyStartType" ));
881+ submitLoanAndStore (request );
882+ }
883+
884+ private PostWorkingCapitalLoansRequest buildGraceDaysLoanRequest (final Map <String , String > row ) {
885+ final Long clientId = extractClientId ();
886+ final Long productId = testContext ().get (TestContextKey .WORKING_CAPITAL_LOAN_PRODUCT_FOR_LOAN_TEST );
887+ return workingCapitalLoanRequestFactory .defaultWorkingCapitalLoansRequest (clientId ) //
888+ .productId (productId ) //
889+ .submittedOnDate (row .get ("submittedOnDate" )) //
890+ .expectedDisbursementDate (row .get ("expectedDisbursementDate" )) //
891+ .principalAmount (new BigDecimal (row .get ("principalAmount" ))) //
892+ .totalPayment (new BigDecimal (row .get ("totalPayment" ))) //
893+ .periodPaymentRate (new BigDecimal (row .get ("periodPaymentRate" ))) //
894+ .discount (Optional .ofNullable (row .get ("discount" )).filter (s -> !s .isEmpty ()).map (BigDecimal ::new ).orElse (null ));
895+ }
896+
897+ private void submitLoanAndStore (final PostWorkingCapitalLoansRequest request ) {
898+ final PostWorkingCapitalLoansResponse response = ok (
899+ () -> fineractClient .workingCapitalLoans ().submitWorkingCapitalLoanApplication (request ));
900+ testContext ().set (TestContextKey .LOAN_CREATE_RESPONSE , response );
901+ log .info ("Working Capital Loan created, loan ID: {}" , response .getLoanId ());
902+ }
903+
904+ @ Then ("Working capital loan account has delinquencyGraceDays {int} and delinquencyStartType {string}" )
905+ public void verifyLoanGraceDays (int expectedGraceDays , String expectedStartType ) {
906+ final PostWorkingCapitalLoansResponse loanResponse = testContext ().get (TestContextKey .LOAN_CREATE_RESPONSE );
907+ final Long loanId = loanResponse .getLoanId ();
908+
909+ final GetWorkingCapitalLoansLoanIdResponse response = ok (
910+ () -> fineractClient .workingCapitalLoans ().retrieveWorkingCapitalLoanById (loanId ));
911+
912+ assertThat (response .getDelinquencyGraceDays ()).as ("delinquencyGraceDays" ).isEqualTo (expectedGraceDays );
913+ assertThat (response .getDelinquencyStartType ()).as ("delinquencyStartType" ).isNotNull ();
914+ assertThat (response .getDelinquencyStartType ().getCode ()).as ("delinquencyStartType code" ).isEqualTo (expectedStartType );
915+ }
916+
917+ @ When ("Admin modifies the working capital loan with grace days:" )
918+ public void modifyLoanWithGraceDays (final DataTable table ) {
919+ final Map <String , String > row = table .asMaps ().get (0 );
920+ final PostWorkingCapitalLoansResponse loanResponse = testContext ().get (TestContextKey .LOAN_CREATE_RESPONSE );
921+ final Long loanId = loanResponse .getLoanId ();
922+
923+ final PutWorkingCapitalLoansLoanIdRequest modifyRequest = workingCapitalLoanRequestFactory .defaultModifyWorkingCapitalLoansRequest () //
924+ .delinquencyGraceDays (
925+ Optional .ofNullable (row .get ("delinquencyGraceDays" )).filter (s -> !s .isEmpty ()).map (Integer ::valueOf ).orElse (null )) //
926+ .delinquencyStartType (row .get ("delinquencyStartType" ));
927+
928+ final PutWorkingCapitalLoansLoanIdResponse response = ok (
929+ () -> fineractClient .workingCapitalLoans ().modifyWorkingCapitalLoanApplicationById (loanId , modifyRequest , "" ));
930+ testContext ().set (TestContextKey .LOAN_MODIFY_RESPONSE , response );
931+ }
932+
933+ @ When ("Admin approves the working capital loan on {string}" )
934+ public void approveWorkingCapitalLoan (final String approvedOnDate ) {
935+ final PostWorkingCapitalLoansResponse loanResponse = testContext ().get (TestContextKey .LOAN_CREATE_RESPONSE );
936+ final Long loanId = loanResponse .getLoanId ();
937+
938+ final PostWorkingCapitalLoansLoanIdRequest approveRequest = new PostWorkingCapitalLoansLoanIdRequest () //
939+ .approvedOnDate (approvedOnDate ) //
940+ .expectedDisbursementDate (approvedOnDate ) //
941+ .dateFormat (DATE_FORMAT ) //
942+ .locale (WorkingCapitalLoanRequestFactory .DEFAULT_LOCALE );
943+
944+ ok (() -> fineractClient .workingCapitalLoans ().stateTransitionWorkingCapitalLoanById (loanId , "approve" , approveRequest ));
945+ log .info ("Approved working capital loan {}" , loanId );
946+ }
947+
948+ @ Then ("Creating a working capital loan with invalid delinquencyGraceDays {int} will result with status code {int}" )
949+ public void createLoanWithInvalidGraceDays (int graceDays , int expectedStatus ) {
950+ final Long clientId = extractClientId ();
951+ final Long productId = testContext ().get (TestContextKey .WORKING_CAPITAL_LOAN_PRODUCT_FOR_LOAN_TEST );
952+
953+ final PostWorkingCapitalLoansRequest request = workingCapitalLoanRequestFactory .defaultWorkingCapitalLoansRequest (clientId )
954+ .productId (productId ) //
955+ .delinquencyGraceDays (graceDays );
956+
957+ final CallFailedRuntimeException exception = fail (
958+ () -> fineractClient .workingCapitalLoans ().submitWorkingCapitalLoanApplication (request ));
959+ assertThat (exception .getStatus ()).as ("HTTP status" ).isEqualTo (expectedStatus );
960+ }
961+
962+ @ Then ("Creating a working capital loan with invalid delinquencyStartType {string} will result with status code {int}" )
963+ public void createLoanWithInvalidStartType (String startType , int expectedStatus ) {
964+ final Long clientId = extractClientId ();
965+ final Long productId = testContext ().get (TestContextKey .WORKING_CAPITAL_LOAN_PRODUCT_FOR_LOAN_TEST );
966+
967+ final PostWorkingCapitalLoansRequest request = workingCapitalLoanRequestFactory .defaultWorkingCapitalLoansRequest (clientId )
968+ .productId (productId ) //
969+ .delinquencyStartType (startType );
970+
971+ final CallFailedRuntimeException exception = fail (
972+ () -> fineractClient .workingCapitalLoans ().submitWorkingCapitalLoanApplication (request ));
973+ assertThat (exception .getStatus ()).as ("HTTP status" ).isEqualTo (expectedStatus );
974+ }
849975}
0 commit comments