This is an automated email from the ASF dual-hosted git repository.

adamsaghy pushed a commit to branch develop
in repository https://gitbox.apache.org/repos/asf/fineract.git


The following commit(s) were added to refs/heads/develop by this push:
     new b08fd9b57 FINERACT-1992 Fixing consecutive pause periods
b08fd9b57 is described below

commit b08fd9b573a300bee7f1384776682665e678c9f6
Author: Peter Bagrij <[email protected]>
AuthorDate: Thu Nov 30 09:39:19 2023 +0100

    FINERACT-1992 Fixing consecutive pause periods
---
 .../DelinquencyActionParseAndValidator.java        | 37 +++++++++--
 .../DelinquencyActionParseAndValidatorTest.java    | 77 ++++++++++++++--------
 2 files changed, 83 insertions(+), 31 deletions(-)

diff --git 
a/fineract-provider/src/main/java/org/apache/fineract/portfolio/delinquency/validator/DelinquencyActionParseAndValidator.java
 
b/fineract-provider/src/main/java/org/apache/fineract/portfolio/delinquency/validator/DelinquencyActionParseAndValidator.java
index 163ee2730..56274956c 100644
--- 
a/fineract-provider/src/main/java/org/apache/fineract/portfolio/delinquency/validator/DelinquencyActionParseAndValidator.java
+++ 
b/fineract-provider/src/main/java/org/apache/fineract/portfolio/delinquency/validator/DelinquencyActionParseAndValidator.java
@@ -162,11 +162,38 @@ public class DelinquencyActionParseAndValidator extends 
ParseAndValidator {
         }
     }
 
-    private boolean isOverlapping(LoanDelinquencyAction 
parsedDelinquencyAction, LoanDelinquencyActionData ldad) {
-        return 
((!parsedDelinquencyAction.getStartDate().isAfter(ldad.getStartDate())
-                && 
!ldad.getStartDate().isAfter(parsedDelinquencyAction.getEndDate()))
-                || 
(!parsedDelinquencyAction.getStartDate().isAfter(ldad.getEndDate())
-                        && 
!ldad.getEndDate().isAfter(parsedDelinquencyAction.getEndDate())));
+    /**
+     * <pre>
+     *  we have an overlap when
+     *  (parsed.endDate &gt; existing.startDate AND parsed.endDate &lt; 
existing.endDate)
+     *
+     *  existing       |------------|
+     *  parsed               |----------------|
+     *
+     *  we also  have an overlap when
+     *  (parsed.startDate &gt; existing.startDate AND parsed.startDate &lt; 
existing.endDate)
+     *
+     *  existing            |------------|
+     *  parsed    |----------------|
+     *
+     *  There is no overlap like when they are right after each other:
+     *
+     *  existing  |------------|
+     *  parsed                 |----------------|
+     *
+     *  or
+     *
+     *  existing               |------------|
+     *  parsed   |-------------|
+     * </pre>
+     *
+     * @param parsed
+     * @param existing
+     * @return
+     */
+    private boolean isOverlapping(LoanDelinquencyAction parsed, 
LoanDelinquencyActionData existing) {
+        return (parsed.getEndDate().isAfter(existing.getStartDate()) && 
parsed.getEndDate().isBefore(existing.getEndDate()))
+                || (parsed.getStartDate().isAfter(existing.getStartDate()) && 
parsed.getStartDate().isBefore(existing.getEndDate()));
     }
 
     @org.jetbrains.annotations.NotNull
diff --git 
a/fineract-provider/src/test/java/org/apache/fineract/portfolio/delinquency/validator/DelinquencyActionParseAndValidatorTest.java
 
b/fineract-provider/src/test/java/org/apache/fineract/portfolio/delinquency/validator/DelinquencyActionParseAndValidatorTest.java
index cc8ee2117..34011234a 100644
--- 
a/fineract-provider/src/test/java/org/apache/fineract/portfolio/delinquency/validator/DelinquencyActionParseAndValidatorTest.java
+++ 
b/fineract-provider/src/test/java/org/apache/fineract/portfolio/delinquency/validator/DelinquencyActionParseAndValidatorTest.java
@@ -111,32 +111,6 @@ class DelinquencyActionParseAndValidatorTest {
                 () -> underTest.validateAndParseUpdate(command, loan, 
existing, localDate("09 September 2022")));
     }
 
-    @Test
-    public void testNewPauseEndIsTheSameAsExistingPauseStart() throws 
JsonProcessingException {
-        Loan loan = Mockito.mock(Loan.class);
-        Mockito.when(loan.getStatus()).thenReturn(LoanStatus.ACTIVE);
-
-        List<LoanDelinquencyAction> existing = 
List.of(loanDelinquencyAction(PAUSE, "15 September 2022", "22 September 2022"));
-        JsonCommand command = delinquencyAction("pause", "09 September 2022", 
"15 September 2022");
-
-        assertPlatformValidationException("Delinquency pause period cannot 
overlap with another pause period",
-                "loan-delinquency-action-overlapping",
-                () -> underTest.validateAndParseUpdate(command, loan, 
existing, localDate("09 September 2022")));
-    }
-
-    @Test
-    public void testNewPauseEndIsTheSameAsExistingPauseEnd() throws 
JsonProcessingException {
-        Loan loan = Mockito.mock(Loan.class);
-        Mockito.when(loan.getStatus()).thenReturn(LoanStatus.ACTIVE);
-
-        List<LoanDelinquencyAction> existing = 
List.of(loanDelinquencyAction(PAUSE, "15 September 2022", "22 September 2022"));
-        JsonCommand command = delinquencyAction("pause", "22 September 2022", 
"25 September 2022");
-
-        assertPlatformValidationException("Delinquency pause period cannot 
overlap with another pause period",
-                "loan-delinquency-action-overlapping",
-                () -> underTest.validateAndParseUpdate(command, loan, 
existing, localDate("09 September 2022")));
-    }
-
     @Test
     public void testNewPauseEndIsOverlappingWithExistingPause() throws 
JsonProcessingException {
         Loan loan = Mockito.mock(Loan.class);
@@ -276,6 +250,57 @@ class DelinquencyActionParseAndValidatorTest {
                         .validateAndParseUpdate(delinquencyAction("resume", 
null, null), loan, List.of(), localDate("09 September 2022")));
     }
 
+    @Test
+    public void testNewPausePeriodStartingOnExistingEndDate() throws 
JsonProcessingException {
+        Loan loan = Mockito.mock(Loan.class);
+        Mockito.when(loan.getStatus()).thenReturn(LoanStatus.ACTIVE);
+
+        JsonCommand command = delinquencyAction("pause", "18 September 2022", 
"20 September 2022");
+
+        List<LoanDelinquencyAction> existing = 
List.of(loanDelinquencyAction(PAUSE, "15 September 2022", "18 September 2022"));
+
+        LoanDelinquencyAction parsedDelinquencyAction = 
underTest.validateAndParseUpdate(command, loan, existing,
+                localDate("18 September 2022"));
+        Assertions.assertEquals(PAUSE, parsedDelinquencyAction.getAction());
+        Assertions.assertEquals(localDate("18 September 2022"), 
parsedDelinquencyAction.getStartDate());
+        Assertions.assertEquals(localDate("20 September 2022"), 
parsedDelinquencyAction.getEndDate());
+    }
+
+    @Test
+    public void testNewPauseEndingOnExistingStartDate() throws 
JsonProcessingException {
+        Loan loan = Mockito.mock(Loan.class);
+        Mockito.when(loan.getStatus()).thenReturn(LoanStatus.ACTIVE);
+
+        JsonCommand command = delinquencyAction("pause", "18 September 2022", 
"20 September 2022");
+
+        List<LoanDelinquencyAction> existing = 
List.of(loanDelinquencyAction(PAUSE, "20 September 2022", "25 September 2022"));
+
+        LoanDelinquencyAction parsedDelinquencyAction = 
underTest.validateAndParseUpdate(command, loan, existing,
+                localDate("18 September 2022"));
+        Assertions.assertEquals(PAUSE, parsedDelinquencyAction.getAction());
+        Assertions.assertEquals(localDate("18 September 2022"), 
parsedDelinquencyAction.getStartDate());
+        Assertions.assertEquals(localDate("20 September 2022"), 
parsedDelinquencyAction.getEndDate());
+    }
+
+    @Test
+    public void testNewPausePeriodStartingOnExistingEffectiveEndDate() throws 
JsonProcessingException {
+        Loan loan = Mockito.mock(Loan.class);
+        Mockito.when(loan.getStatus()).thenReturn(LoanStatus.ACTIVE);
+
+        JsonCommand command = delinquencyAction("pause", "18 September 2022", 
"20 September 2022");
+
+        List<LoanDelinquencyAction> existing = List.of(//
+                loanDelinquencyAction(PAUSE, "15 September 2022", "20 
September 2022"), //
+                loanDelinquencyAction(RESUME, "18 September 2022") //
+        );
+
+        LoanDelinquencyAction parsedDelinquencyAction = 
underTest.validateAndParseUpdate(command, loan, existing,
+                localDate("18 September 2022"));
+        Assertions.assertEquals(PAUSE, parsedDelinquencyAction.getAction());
+        Assertions.assertEquals(localDate("18 September 2022"), 
parsedDelinquencyAction.getStartDate());
+        Assertions.assertEquals(localDate("20 September 2022"), 
parsedDelinquencyAction.getEndDate());
+    }
+
     @NotNull
     private JsonCommand delinquencyAction(@Nullable String action, @Nullable 
String startDate, @Nullable String endDate)
             throws JsonProcessingException {

Reply via email to