4343import org .apache .fineract .client .models .PostWorkingCapitalLoanProductsRequest .AccountingRuleEnum ;
4444import org .apache .fineract .client .models .PostWorkingCapitalLoanTransactionsRequest ;
4545import org .apache .fineract .client .models .PutWorkingCapitalLoanProductsProductIdRequest ;
46+ import org .apache .fineract .client .models .WorkingCapitalBreachData ;
4647import org .apache .fineract .client .models .WorkingCapitalBreachRequest ;
48+ import org .apache .fineract .client .models .WorkingCapitalNearBreachData ;
49+ import org .apache .fineract .client .models .WorkingCapitalNearBreachRequest ;
4750import org .apache .fineract .test .data .accounttype .AccountTypeResolver ;
4851import org .apache .fineract .test .data .accounttype .DefaultAccountType ;
4952import org .apache .fineract .test .data .delinquency .DelinquencyBucketType ;
5053import org .apache .fineract .test .data .delinquency .DelinquencyFrequencyType ;
5154import org .apache .fineract .test .data .delinquency .DelinquencyMinimumPayment ;
55+ import org .apache .fineract .test .data .workingcapitalproduct .WorkingCapitalBreachCalculationType ;
56+ import org .apache .fineract .test .data .workingcapitalproduct .WorkingCapitalBreachFrequencyType ;
5257import org .apache .fineract .test .helper .Utils ;
5358import org .springframework .stereotype .Component ;
5459
@@ -63,14 +68,19 @@ public class WorkingCapitalRequestFactory {
6368 public static final String WCLP_NAME_PREFIX = "WCLP-" ;
6469 public static final String WCLP_DESCRIPTION = "Working Capital Loan Product" ;
6570 public static final String DEFAULT_WC_DELINQUENCY_BUCKET_NAME = "Default Working Capital delinquency bucket" ;
71+ public static final String DEFAULT_WC_BREACH_NAME = "Default Working Capital breach" ;
72+ public static final String DEFAULT_WC_NEAR_BREACH_NAME = "Default Working Capital near breach" ;
6673 public static final String PENALTY = "PENALTY" ;
6774 public static final String FEE = "FEE" ;
6875 public static final String PRINCIPAL = "PRINCIPAL" ;
6976 public static final Integer DEFAULT_WC_BREACH_FREQUENCY = 2 ;
70- public static final String DEFAULT_WC_BREACH_FREQUENCY_TYPE = " MONTHS" ;
71- public static final String DEFAULT_WC_BREACH_AMOUNT_CALCULATION_TYPE = " PERCENTAGE" ;
77+ public static final String DEFAULT_WC_BREACH_FREQUENCY_TYPE = WorkingCapitalBreachFrequencyType . MONTHS . getCode () ;
78+ public static final String DEFAULT_WC_BREACH_AMOUNT_CALCULATION_TYPE = WorkingCapitalBreachCalculationType . PERCENTAGE . getCode () ;
7279 public static final BigDecimal DEFAULT_WC_BREACH_AMOUNT = new BigDecimal ("1.23" );
7380 public static final String DEFAULT_WC_BREACH_NAME_PREFIX = "WCB-" ;
81+ public static final Integer DEFAULT_WC_NEAR_BREACH_FREQUENCY = 12 ;
82+ public static final String DEFAULT_WC_NEAR_BREACH_FREQUENCY_TYPE = WorkingCapitalBreachFrequencyType .DAYS .getCode ();
83+ public static final BigDecimal DEFAULT_WC_NEAR_BREACH_THRESHOLD = new BigDecimal ("70.23" );
7484
7585 public PostWorkingCapitalLoanProductsRequest defaultWorkingCapitalLoanProductRequestWithCashAccounting () {
7686 return defaultWorkingCapitalLoanProductRequest ()//
@@ -150,12 +160,34 @@ public PostWorkingCapitalLoanProductsRequest defaultWorkingCapitalLoanProductAll
150160 .allowAttributeOverrides (allowAttributeOverrides );
151161 }
152162
163+ public PostWorkingCapitalLoanProductsRequest defaultWorkingCapitalLoanProductBreachRequest () {
164+ String name = Utils .randomStringGenerator (WCLP_NAME_PREFIX , 10 );
165+ String shortName = loanProductsRequestFactory .generateShortNameSafely ();
166+
167+ Long breachId = getWCBreachIdByName (DEFAULT_WC_BREACH_NAME );
168+ return defaultWorkingCapitalLoanProductAllowAttributesOverrideRequest ().name (name )//
169+ .shortName (shortName )//
170+ .breachId (breachId );
171+ }
172+
173+ public PostWorkingCapitalLoanProductsRequest defaultWorkingCapitalLoanProductBreachNearBreachRequest () {
174+ String name = Utils .randomStringGenerator (WCLP_NAME_PREFIX , 10 );
175+ String shortName = loanProductsRequestFactory .generateShortNameSafely ();
176+
177+ Long breachId = getWCBreachIdByName (DEFAULT_WC_BREACH_NAME );
178+ Long nearBreachId = getWCNearBreachIdByName (DEFAULT_WC_NEAR_BREACH_NAME );
179+ return defaultWorkingCapitalLoanProductAllowAttributesOverrideRequest ().name (name )//
180+ .shortName (shortName )//
181+ .breachId (breachId ) //
182+ .nearBreachId (nearBreachId ); //
183+ }
184+
153185 public PutWorkingCapitalLoanProductsProductIdRequest defaultWorkingCapitalLoanProductRequestUpdate () {
154186 String name = Utils .randomStringGenerator (WCLP_NAME_PREFIX , 10 );
155187 String shortName = loanProductsRequestFactory .generateShortNameSafely ();
156188
157189 PostAllowAttributeOverrides allowAttributeOverrides = new PostAllowAttributeOverrides ().delinquencyBucketClassification (true )
158- .discountDefault (false ).periodPaymentFrequencyType (false ).periodPaymentFrequency (true );
190+ .breach ( true ). discountDefault (false ).periodPaymentFrequencyType (false ).periodPaymentFrequency (true );
159191
160192 return new PutWorkingCapitalLoanProductsProductIdRequest ()//
161193 .name (name )//
@@ -173,9 +205,10 @@ public PutWorkingCapitalLoanProductsProductIdRequest defaultWorkingCapitalLoanPr
173205 .principal (new BigDecimal (200 ))//
174206 .minPrincipal (new BigDecimal (15 ))//
175207 .maxPrincipal (new BigDecimal (300000 ))//
176- .discount (new BigDecimal (50 )).amortizationType (PutWorkingCapitalLoanProductsProductIdRequest .AmortizationTypeEnum .EIR )//
208+ .discount (new BigDecimal (50 )) //
209+ .amortizationType (PutWorkingCapitalLoanProductsProductIdRequest .AmortizationTypeEnum .EIR )//
177210 .npvDayCount (DAYS365 .value )//
178- .delinquencyBucketId (null )//
211+ .delinquencyBucketId (getWCDelinquencyBucketIdByName ( DEFAULT_WC_DELINQUENCY_BUCKET_NAME ) )//
179212 .dateFormat (DATE_FORMAT )//
180213 .locale (LOCALE_EN )//
181214 .allowAttributeOverrides (allowAttributeOverrides )//
@@ -246,6 +279,14 @@ public WorkingCapitalBreachRequest defaultWorkingCapitalBreachRequest() {
246279 .breachAmount (DEFAULT_WC_BREACH_AMOUNT );
247280 }
248281
282+ public WorkingCapitalNearBreachRequest defaultWorkingCapitalNearBreachRequest () {
283+ return new WorkingCapitalNearBreachRequest () //
284+ .nearBreachName ("NearBreach-WCL-" + Utils .randomStringGenerator (8 )) //
285+ .nearBreachFrequency (DEFAULT_WC_NEAR_BREACH_FREQUENCY ) //
286+ .nearBreachFrequencyType (DEFAULT_WC_NEAR_BREACH_FREQUENCY_TYPE ) //
287+ .nearBreachThreshold (DEFAULT_WC_NEAR_BREACH_THRESHOLD ); //
288+ }
289+
249290 public PostWorkingCapitalLoanTransactionsRequest defaultWorkingCapitalLoanRepaymentRequest () {
250291 return new PostWorkingCapitalLoanTransactionsRequest () //
251292 .dateFormat (DATE_FORMAT ) //
@@ -262,4 +303,25 @@ private Long getWCDelinquencyBucketIdByName(String bucketName) {
262303 }
263304 }
264305
306+ private Long getWCBreachIdByName (String breachName ) {
307+ try {
308+ List <WorkingCapitalBreachData > breaches = fineractClient .workingCapitalBreaches ().retrieveAllWorkingCapitalBreaches (Map .of ());
309+ return breaches .stream ().filter (b -> breachName .equals (b .getName ())).findFirst ().map (WorkingCapitalBreachData ::getId )
310+ .orElseThrow (() -> new RuntimeException ("Working Capital Breach not found with name: " + breachName ));
311+ } catch (Exception e ) {
312+ throw new RuntimeException ("Failed to fetch Working Capital Breacht by name: " + breachName , e );
313+ }
314+ }
315+
316+ private Long getWCNearBreachIdByName (String breachName ) {
317+ try {
318+ List <WorkingCapitalNearBreachData > breaches = fineractClient .workingCapitalNearBreaches ()
319+ .retrieveAllWorkingCapitalNearBreaches (Map .of ());
320+ return breaches .stream ().filter (b -> breachName .equals (b .getName ())).findFirst ().map (WorkingCapitalNearBreachData ::getId )
321+ .orElseThrow (() -> new RuntimeException ("Working Capital Breach not found with name: " + breachName ));
322+ } catch (Exception e ) {
323+ throw new RuntimeException ("Failed to fetch Working Capital Breacht by name: " + breachName , e );
324+ }
325+ }
326+
265327}
0 commit comments