2323import java .util .HashMap ;
2424import java .util .List ;
2525import java .util .Map ;
26+ import java .util .Objects ;
2627import java .util .Optional ;
2728import lombok .RequiredArgsConstructor ;
2829import lombok .extern .slf4j .Slf4j ;
3132import org .apache .fineract .infrastructure .core .data .CommandProcessingResultBuilder ;
3233import org .apache .fineract .infrastructure .core .exception .PlatformDataIntegrityException ;
3334import org .apache .fineract .infrastructure .core .service .DateUtils ;
35+ import org .apache .fineract .infrastructure .core .service .MathUtil ;
3436import org .apache .fineract .infrastructure .event .business .domain .loan .LoanAccountDelinquencyPauseChangedBusinessEvent ;
3537import org .apache .fineract .infrastructure .event .business .domain .loan .LoanDelinquencyRangeChangeBusinessEvent ;
3638import org .apache .fineract .infrastructure .event .business .service .BusinessEventNotifierService ;
@@ -172,11 +174,8 @@ public CommandProcessingResult deleteDelinquencyBucket(Long delinquencyBucketId,
172174 "Data integrity issue with resource: " + delinquencyBucket .getId ());
173175 }
174176
175- // Explicitly handle the minimum payment period and rule relationship
176- if (delinquencyBucket .getMinimumPaymentPeriodAndRule () != null ) {
177- DelinquencyMinimumPaymentPeriodAndRule minimumPaymentPeriodAndRule = delinquencyBucket .getMinimumPaymentPeriodAndRule ();
178- delinquencyMinimumPaymentPeriodAndRuleRepository .delete (minimumPaymentPeriodAndRule );
179- }
177+ delinquencyMinimumPaymentPeriodAndRuleRepository .findByBucketId (delinquencyBucket .getId ())
178+ .ifPresent (delinquencyMinimumPaymentPeriodAndRuleRepository ::delete );
180179
181180 repositoryBucket .delete (delinquencyBucket );
182181 } else {
@@ -375,18 +374,16 @@ private DelinquencyBucket createDelinquencyBucket(DelinquencyBucketData data, Ma
375374 if (delinquencyBucket .isEmpty ()) {
376375 DelinquencyBucket newDelinquencyBucket = new DelinquencyBucket (data .getName ());
377376 newDelinquencyBucket .setBucketType (data .getBucketType () != null ? data .getBucketType () : DelinquencyBucketType .REGULAR );
377+ repositoryBucket .saveAndFlush (newDelinquencyBucket );
378378 if (DelinquencyBucketType .WORKING_CAPITAL .equals (newDelinquencyBucket .getBucketType ())) {
379- newDelinquencyBucket .setMinimumPaymentPeriodAndRule (new DelinquencyMinimumPaymentPeriodAndRule ());
380- newDelinquencyBucket .getMinimumPaymentPeriodAndRule ().setBucket (newDelinquencyBucket );
381- newDelinquencyBucket .getMinimumPaymentPeriodAndRule ().setFrequency (data .getMinimumPaymentPeriodAndRule ().getFrequency ());
382- newDelinquencyBucket .getMinimumPaymentPeriodAndRule ()
383- .setMinimumPaymentType (data .getMinimumPaymentPeriodAndRule ().getMinimumPaymentType ());
384- newDelinquencyBucket .getMinimumPaymentPeriodAndRule ()
385- .setFrequencyType (data .getMinimumPaymentPeriodAndRule ().getFrequencyType ());
386- newDelinquencyBucket .getMinimumPaymentPeriodAndRule ()
387- .setMinimumPayment (data .getMinimumPaymentPeriodAndRule ().getMinimumPayment ());
379+ final DelinquencyMinimumPaymentPeriodAndRule minimumPaymentPeriodAndRule = new DelinquencyMinimumPaymentPeriodAndRule ();
380+ minimumPaymentPeriodAndRule .setBucket (newDelinquencyBucket );
381+ minimumPaymentPeriodAndRule .setFrequency (data .getMinimumPaymentPeriodAndRule ().getFrequency ());
382+ minimumPaymentPeriodAndRule .setMinimumPaymentType (data .getMinimumPaymentPeriodAndRule ().getMinimumPaymentType ());
383+ minimumPaymentPeriodAndRule .setFrequencyType (data .getMinimumPaymentPeriodAndRule ().getFrequencyType ());
384+ minimumPaymentPeriodAndRule .setMinimumPayment (data .getMinimumPaymentPeriodAndRule ().getMinimumPayment ());
385+ delinquencyMinimumPaymentPeriodAndRuleRepository .save (minimumPaymentPeriodAndRule );
388386 }
389- repositoryBucket .save (newDelinquencyBucket );
390387
391388 setDelinquencyBucketMappings (newDelinquencyBucket , data );
392389 return newDelinquencyBucket ;
@@ -411,46 +408,37 @@ private DelinquencyBucket updateDelinquencyBucket(DelinquencyBucket delinquencyB
411408 changes .put (DelinquencyApiConstants .BUCKET_TYPE_PARAM_NAME , data .getBucketType ());
412409 delinquencyBucket .setBucketType (data .getBucketType ());
413410 }
411+ final Optional <DelinquencyMinimumPaymentPeriodAndRule > existingRule = delinquencyMinimumPaymentPeriodAndRuleRepository
412+ .findByBucketId (delinquencyBucket .getId ());
414413 if (delinquencyBucket .getBucketType ().equals (DelinquencyBucketType .WORKING_CAPITAL )) {
415- if (delinquencyBucket .getMinimumPaymentPeriodAndRule () == null ) {
416- delinquencyBucket .setMinimumPaymentPeriodAndRule (new DelinquencyMinimumPaymentPeriodAndRule ());
417- delinquencyBucket .getMinimumPaymentPeriodAndRule ().setBucket (delinquencyBucket );
414+ DelinquencyMinimumPaymentPeriodAndRule minimumPaymentPeriodAndRule = existingRule .orElse (null );
415+ if (minimumPaymentPeriodAndRule == null ) {
416+ minimumPaymentPeriodAndRule = new DelinquencyMinimumPaymentPeriodAndRule ();
417+ minimumPaymentPeriodAndRule .setBucket (delinquencyBucket );
418418 }
419- if (!data .getMinimumPaymentPeriodAndRule ().getFrequency ()
420- .equals (delinquencyBucket .getMinimumPaymentPeriodAndRule ().getFrequency ())) {
421- delinquencyBucket .getMinimumPaymentPeriodAndRule ().setFrequency (data .getMinimumPaymentPeriodAndRule ().getFrequency ());
422- changes .put (DelinquencyApiConstants .FREQUENCY_PARAM_NAME ,
423- delinquencyBucket .getMinimumPaymentPeriodAndRule ().getFrequency ());
419+ if (!Objects .equals (data .getMinimumPaymentPeriodAndRule ().getFrequency (), minimumPaymentPeriodAndRule .getFrequency ())) {
420+ minimumPaymentPeriodAndRule .setFrequency (data .getMinimumPaymentPeriodAndRule ().getFrequency ());
421+ changes .put (DelinquencyApiConstants .FREQUENCY_PARAM_NAME , minimumPaymentPeriodAndRule .getFrequency ());
424422 }
425- if (!data .getMinimumPaymentPeriodAndRule ().getFrequencyType ()
426- .equals (delinquencyBucket .getMinimumPaymentPeriodAndRule ().getFrequencyType ())) {
427- delinquencyBucket .getMinimumPaymentPeriodAndRule ()
428- .setFrequencyType (data .getMinimumPaymentPeriodAndRule ().getFrequencyType ());
429- changes .put (DelinquencyApiConstants .FREQUENCY_TYPE_PARAM_NAME ,
430- delinquencyBucket .getMinimumPaymentPeriodAndRule ().getFrequencyType ());
423+ if (!Objects .equals (data .getMinimumPaymentPeriodAndRule ().getFrequencyType (), minimumPaymentPeriodAndRule .getFrequencyType ())) {
424+ minimumPaymentPeriodAndRule .setFrequencyType (data .getMinimumPaymentPeriodAndRule ().getFrequencyType ());
425+ changes .put (DelinquencyApiConstants .FREQUENCY_TYPE_PARAM_NAME , minimumPaymentPeriodAndRule .getFrequencyType ());
431426 }
432- if (!data .getMinimumPaymentPeriodAndRule ().getMinimumPaymentType ()
433- .equals (delinquencyBucket .getMinimumPaymentPeriodAndRule ().getMinimumPaymentType ())) {
434- changes .put (DelinquencyApiConstants .MINIMUM_PAYMENT_TYPE_PARAM_NAME ,
435- delinquencyBucket .getMinimumPaymentPeriodAndRule ().getMinimumPaymentType ());
436- delinquencyBucket .getMinimumPaymentPeriodAndRule ()
437- .setMinimumPaymentType (data .getMinimumPaymentPeriodAndRule ().getMinimumPaymentType ());
427+ if (!Objects .equals (data .getMinimumPaymentPeriodAndRule ().getMinimumPaymentType (),
428+ minimumPaymentPeriodAndRule .getMinimumPaymentType ())) {
429+ changes .put (DelinquencyApiConstants .MINIMUM_PAYMENT_TYPE_PARAM_NAME , minimumPaymentPeriodAndRule .getMinimumPaymentType ());
430+ minimumPaymentPeriodAndRule .setMinimumPaymentType (data .getMinimumPaymentPeriodAndRule ().getMinimumPaymentType ());
438431 }
439- if (data .getMinimumPaymentPeriodAndRule ().getMinimumPayment ()
440- .compareTo (delinquencyBucket .getMinimumPaymentPeriodAndRule ().getMinimumPayment ()) != 0 ) {
441- changes .put (DelinquencyApiConstants .MINIMUM_PAYMENT_PARAM_NAME ,
442- delinquencyBucket .getMinimumPaymentPeriodAndRule ().getMinimumPayment ());
443- delinquencyBucket .getMinimumPaymentPeriodAndRule ()
444- .setMinimumPayment (data .getMinimumPaymentPeriodAndRule ().getMinimumPayment ());
432+ if (!MathUtil .isEqualTo (data .getMinimumPaymentPeriodAndRule ().getMinimumPayment (),
433+ minimumPaymentPeriodAndRule .getMinimumPayment ())) {
434+ changes .put (DelinquencyApiConstants .MINIMUM_PAYMENT_PARAM_NAME , minimumPaymentPeriodAndRule .getMinimumPayment ());
435+ minimumPaymentPeriodAndRule .setMinimumPayment (data .getMinimumPaymentPeriodAndRule ().getMinimumPayment ());
445436 }
437+ delinquencyMinimumPaymentPeriodAndRuleRepository .save (minimumPaymentPeriodAndRule );
446438 } else {
447- if (delinquencyBucket . getMinimumPaymentPeriodAndRule () != null ) {
439+ if (existingRule . isPresent () ) {
448440 changes .put (DelinquencyApiConstants .MINIMUM_PAYMENT_PERIOD_AND_RULE_PARAM_NAME , null );
449- DelinquencyMinimumPaymentPeriodAndRule minimumPaymentPeriodAndRule = delinquencyBucket .getMinimumPaymentPeriodAndRule ();
450- minimumPaymentPeriodAndRule .setBucket (null );
451- delinquencyBucket .setMinimumPaymentPeriodAndRule (null );
452- delinquencyMinimumPaymentPeriodAndRuleRepository .save (minimumPaymentPeriodAndRule );
453- delinquencyMinimumPaymentPeriodAndRuleRepository .delete (minimumPaymentPeriodAndRule );
441+ delinquencyMinimumPaymentPeriodAndRuleRepository .delete (existingRule .get ());
454442 }
455443 }
456444 if (!changes .isEmpty ()) {
0 commit comments