From b42e4f70df05464d2827cab3aed58bf998e47910 Mon Sep 17 00:00:00 2001 From: Mikhail Trofimov Date: Thu, 25 Sep 2025 15:46:04 +0300 Subject: [PATCH] Added finding flags for RU_PASTDUEARREAR; Updated tests --- .../CreditTrackerApplication.java | 14 +- .../mapper/indic/FlagsMapper.java | 2 - .../service/indic/FlagsService.java | 117 +++++++------ .../service/FlagsServiceTest.java | 164 +++++++----------- 4 files changed, 140 insertions(+), 157 deletions(-) diff --git a/src/main/java/ru/nbch/credit_tracker/CreditTrackerApplication.java b/src/main/java/ru/nbch/credit_tracker/CreditTrackerApplication.java index b30948b..fa2c9f9 100644 --- a/src/main/java/ru/nbch/credit_tracker/CreditTrackerApplication.java +++ b/src/main/java/ru/nbch/credit_tracker/CreditTrackerApplication.java @@ -7,6 +7,7 @@ import ru.nbch.credit_tracker.service.indic.FlagsService; import java.util.ArrayList; import java.util.List; +import java.util.Map; @SpringBootApplication public class CreditTrackerApplication { @@ -21,7 +22,18 @@ public class CreditTrackerApplication { fids.add(16442929); fids.add(114429070); fids.add(108696892); - ctx.getBean(FlagsService.class).test(fids); + FlagsService flagService = ctx.getBean(FlagsService.class); + Map oldMap = flagService.findFlags(fids); + Map newMap = flagService.findFlags2(fids); + System.out.println(oldMap); + System.out.println(newMap); + for (Integer fid : fids) { + FlagsService.FlagsData oldValue = oldMap.get(fid); + FlagsService.FlagsData newValue = newMap.get(fid); + System.out.println("OLD: " + oldValue.getFlagDebt5000() +"|" +oldValue.getFlag90days()); + System.out.println("NEW: " + newValue.getFlagDebt5000() +"|" +newValue.getFlag90days()); + System.out.println("_________________________________"); + } // UpdateProcessingPackagesService updateProcessingPackagesService = ctx.getBean(UpdateProcessingPackagesService.class); // MonitoringService monitoringService = ctx.getBean(MonitoringService.class); // UpdatingFlagsService updatingFlagsService = ctx.getBean(UpdatingFlagsService.class); diff --git a/src/main/java/ru/nbch/credit_tracker/mapper/indic/FlagsMapper.java b/src/main/java/ru/nbch/credit_tracker/mapper/indic/FlagsMapper.java index 1a162a7..1aa12be 100644 --- a/src/main/java/ru/nbch/credit_tracker/mapper/indic/FlagsMapper.java +++ b/src/main/java/ru/nbch/credit_tracker/mapper/indic/FlagsMapper.java @@ -18,6 +18,4 @@ public interface FlagsMapper { List findRuPastDuarearData(@Param("fids") List fids); - - List findFlag90ByRuPaymtNewWithOrderBy(@Param("fids") List fids); } diff --git a/src/main/java/ru/nbch/credit_tracker/service/indic/FlagsService.java b/src/main/java/ru/nbch/credit_tracker/service/indic/FlagsService.java index bb5d848..209cce3 100644 --- a/src/main/java/ru/nbch/credit_tracker/service/indic/FlagsService.java +++ b/src/main/java/ru/nbch/credit_tracker/service/indic/FlagsService.java @@ -24,45 +24,85 @@ public class FlagsService { this.mapper = mapper; } - public void test(List fids) { - Map oldFlags5000 = calcFlag5000(fids); - Map oldFlags90 = calcFlag90DaysByPastDueArrear(fids); - - fids.sort(Comparator.naturalOrder()); - - Map flag5000Map = new HashMap<>(); - Map flag90Days = new HashMap<>(); - findFlags5000(fids, flag5000Map, flag90Days); - - for (Map.Entry flag : flag5000Map.entrySet()) { - if(!flag.getValue().equals(oldFlags5000.get(flag.getKey()))) { - String error = "New: "+flag.getKey() + " = " + flag.getValue() + "\n" +"Old: " + flag.getKey() + " = " + oldFlags5000.get(flag.getKey()); - throw new AssertionError(error); - } + public Map findFlags(List fids) { + if (fids.isEmpty()) { + return new HashMap<>(); } + List distinctFids = fids.stream().distinct().toList(); + log.debug("Fids count: {}", distinctFids.size()); + Map flags5000 = calcFlag5000(distinctFids); + Map flags90DaysByPastDueArrear = calcFlag90DaysByPastDueArrear(distinctFids); + Map flags90DaysByRuPaymt = calcFlag90DaysByRuPaymt(distinctFids); - for (Map.Entry flag : flag90Days.entrySet()) { - if(!flag.getValue().equals(oldFlags90.get(flag.getKey()))) { - String error = "New: "+flag.getKey() + " = " + flag.getValue() + "\n" +"Old: " + flag.getKey() + " = " + oldFlags90.get(flag.getKey()); - throw new AssertionError(error); + Map result = new HashMap<>(); + fids.forEach(fid -> { + Integer flagDebt5000 = flags5000.get(fid); + if (flagDebt5000 == null) { + flagDebt5000 = 0; } - } + Integer flag90days = flags90DaysByPastDueArrear.get(fid); + if (flag90days == null || flag90days == 0) { + flag90days = flags90DaysByRuPaymt.get(fid); + if (flag90days == null) { + flag90days = 0; + } + } + result.put(fid, new FlagsData(flagDebt5000, flag90days)); + }); + + return result; } - private void findFlags5000(List fids, Map flag5000Map, Map flag90Days) { + public Map findFlags2(List fids) { + if (fids.isEmpty()) { + return new HashMap<>(); + } + List distinctFids = fids.stream() + .distinct() + .sorted(Comparator.naturalOrder()) + .toList(); + + log.debug("Fids count: {}", distinctFids.size()); + Map flags5000 = new HashMap<>(); + Map flags90DaysByPastDueArrear = new HashMap<>(); + findFlagsRuPastDueArrear(distinctFids, flags5000, flags90DaysByPastDueArrear); + Map flags90DaysByRuPaymt = calcFlag90DaysByRuPaymt(distinctFids); + + Map result = new HashMap<>(); + fids.forEach(fid -> { + Integer flagDebt5000 = flags5000.get(fid); + if (flagDebt5000 == null) { + flagDebt5000 = 0; + } + + Integer flag90days = flags90DaysByPastDueArrear.get(fid); + if (flag90days == null || flag90days == 0) { + flag90days = flags90DaysByRuPaymt.get(fid); + if (flag90days == null) { + flag90days = 0; + } + } + result.put(fid, new FlagsData(flagDebt5000, flag90days)); + }); + + return result; + } + + private void findFlagsRuPastDueArrear(List fids, Map flag5000Map, Map flag90Days) { + log.debug("Start calculating flag 5000 and 90 days by RU_PASTDUEARREAR"); List ruPastDuarearDataList = mapper.findRuPastDuarearData(fids); + ruPastDuarearDataList.sort(Comparator.comparing(FlagsService.RuPastDuarearData::getFid) // сортируем сначала по фиду .thenComparing(FlagsService.RuPastDuarearData::getReportedDate, Comparator.reverseOrder())); // Затем сортируем по REPORTED_DT по убыванию - LocalDate yearAgo = LocalDate.parse("2024-09-09"); + LocalDate yearAgo = LocalDate.now().minusYears(1); for (Integer fid : fids) { Iterator iterator = ruPastDuarearDataList.iterator(); BigInteger prevAccSerialNum = null; while (iterator.hasNext()) { FlagsService.RuPastDuarearData data = iterator.next(); - if (fid.equals(data.getFid())) { if (flag5000Map.get(fid) == null) { // Первая запись в списке с макс REPORTED_DT. Нас интересует только она для флага 5000 if (prevAccSerialNum == null || !prevAccSerialNum.equals(data.getAccSerialNum())) { @@ -104,36 +144,7 @@ public class FlagsService { flag90Days.put(fid, 0); } } - } - - public Map findFlags(List fids) { - if (fids.isEmpty()) { - return new HashMap<>(); - } - List distinctFids = fids.stream().distinct().toList(); - log.debug("Fids count: {}", distinctFids.size()); - Map flags5000 = calcFlag5000(distinctFids); - Map flags90DaysByPastDueArrear = calcFlag90DaysByPastDueArrear(distinctFids); - Map flags90DaysByRuPaymt = calcFlag90DaysByRuPaymt(distinctFids); - - Map result = new HashMap<>(); - fids.forEach(fid -> { - Integer flagDebt5000 = flags5000.get(fid); - if (flagDebt5000 == null) { - flagDebt5000 = 0; - } - - Integer flag90days = flags90DaysByPastDueArrear.get(fid); - if (flag90days == null) { - flag90days = flags90DaysByRuPaymt.get(fid); - if (flag90days == null) { - flag90days = 0; - } - } - result.put(fid, new FlagsData(flagDebt5000, flag90days)); - }); - - return result; + log.debug("Complete calculating flag 5000 and 90 days by RU_PASTDUEARREAR"); } /** diff --git a/src/test/java/ru/nbch/credit_tracker/service/FlagsServiceTest.java b/src/test/java/ru/nbch/credit_tracker/service/FlagsServiceTest.java index 41fb346..3191a7c 100644 --- a/src/test/java/ru/nbch/credit_tracker/service/FlagsServiceTest.java +++ b/src/test/java/ru/nbch/credit_tracker/service/FlagsServiceTest.java @@ -4,6 +4,7 @@ import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; import org.mockito.Mock; +import org.mockito.Mockito; import org.mockito.junit.jupiter.MockitoExtension; import ru.nbch.credit_tracker.mapper.indic.FlagsMapper; import ru.nbch.credit_tracker.service.indic.FlagsService; @@ -11,16 +12,30 @@ import ru.nbch.credit_tracker.service.indic.FlagsService; import java.math.BigDecimal; import java.math.BigInteger; import java.time.LocalDate; -import java.util.*; +import java.time.LocalDateTime; +import java.time.temporal.ChronoUnit; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +import static org.mockito.Mockito.when; @ExtendWith(MockitoExtension.class) public class FlagsServiceTest { + private static final LocalDate INITIAL_DATE = LocalDate.parse("2025-09-25"); + @Mock FlagsMapper flagsMapper; @Test - public void test() { + public void testfindFlagsWithoutRuPaymt() { + + FlagsService flagsService = new FlagsService(flagsMapper); + + when(flagsMapper.findRuPastDuarearData(Mockito.anyList())).thenReturn(ruPastDuarearDataList); + when(flagsMapper.findFlag90ByRuPaymt(Mockito.anyList(), Mockito.any())).thenReturn(new ArrayList<>()); + List fids = new ArrayList<>(List.of( 1, // есть просрочка 5000, есть просрочка 90_days в RU_PASTDUEARREAR 2, // есть просрочка 5000, нет просрочки 90_days в RU_PASTDUEARREAR. Нет просрочки 90_days в RU_PAYMT @@ -33,120 +48,67 @@ public class FlagsServiceTest { 9) // нету в RU_PASTDUEARREAR, нету в RU_PAYMT ); - fids.sort(Comparator.naturalOrder()); + Map resultMap = flagsService.findFlags2(fids); - Map flag5000Map = new HashMap<>(); - Map flag90Days = new HashMap<>(); - findFlags5000(fids, flag5000Map, flag90Days); + Assertions.assertEquals(9, resultMap.size()); + Assertions.assertEquals(1, resultMap.get(1).getFlagDebt5000()); + Assertions.assertEquals(1, resultMap.get(2).getFlagDebt5000()); + Assertions.assertEquals(1, resultMap.get(3).getFlagDebt5000()); + Assertions.assertEquals(0, resultMap.get(4).getFlagDebt5000()); + Assertions.assertEquals(1, resultMap.get(5).getFlagDebt5000()); + Assertions.assertEquals(0, resultMap.get(6).getFlagDebt5000()); + Assertions.assertEquals(0, resultMap.get(7).getFlagDebt5000()); + Assertions.assertEquals(0, resultMap.get(8).getFlagDebt5000()); + Assertions.assertEquals(0, resultMap.get(9).getFlagDebt5000()); - Assertions.assertEquals(9, flag5000Map.size()); - Assertions.assertEquals(true, flag5000Map.get(1)); - Assertions.assertEquals(true, flag5000Map.get(2)); - Assertions.assertEquals(true, flag5000Map.get(3)); - Assertions.assertEquals(false, flag5000Map.get(4)); - Assertions.assertEquals(true, flag5000Map.get(5)); - Assertions.assertEquals(false, flag5000Map.get(6)); - Assertions.assertEquals(false, flag5000Map.get(7)); - Assertions.assertEquals(false, flag5000Map.get(8)); - Assertions.assertEquals(false, flag5000Map.get(9)); - - Assertions.assertEquals(9, flag90Days.size()); - Assertions.assertEquals(true, flag90Days.get(1)); - Assertions.assertEquals(false, flag90Days.get(2)); - Assertions.assertEquals(false, flag90Days.get(3)); - Assertions.assertEquals(false, flag90Days.get(4)); - Assertions.assertEquals(true, flag90Days.get(5)); - Assertions.assertEquals(false, flag90Days.get(6)); - Assertions.assertEquals(true, flag90Days.get(7)); - Assertions.assertEquals(false, flag90Days.get(8)); - Assertions.assertEquals(false, flag90Days.get(9)); + Assertions.assertEquals(1, resultMap.get(1).getFlag90days()); + Assertions.assertEquals(0, resultMap.get(2).getFlag90days()); + Assertions.assertEquals(0, resultMap.get(3).getFlag90days()); + Assertions.assertEquals(0, resultMap.get(4).getFlag90days()); + Assertions.assertEquals(1, resultMap.get(5).getFlag90days()); + Assertions.assertEquals(0, resultMap.get(6).getFlag90days()); + Assertions.assertEquals(1, resultMap.get(7).getFlag90days()); + Assertions.assertEquals(0, resultMap.get(8).getFlag90days()); + Assertions.assertEquals(0, resultMap.get(9).getFlag90days()); } - private void findFlags5000(List fids, Map flag5000Map, Map flag90Days) { - ruPastDuarearDataList.sort(Comparator.comparing(FlagsService.RuPastDuarearData::getFid) // сортируем сначала по фиду - .thenComparing(FlagsService.RuPastDuarearData::getReportedDate, Comparator.reverseOrder())); // Затем сортируем по REPORTED_DT по убыванию - - LocalDate yearAgo = LocalDate.parse("2024-09-09"); - - for (Integer fid : fids) { - Iterator iterator = ruPastDuarearDataList.iterator(); - BigInteger prevAccSerialNum = null; - while (iterator.hasNext()) { - FlagsService.RuPastDuarearData data = iterator.next(); - - if (fid.equals(data.getFid())) { - if (flag5000Map.get(fid) == null) { // Первая запись в списке с макс REPORTED_DT. Нас интересует только она для флага 5000 - if (prevAccSerialNum == null || !prevAccSerialNum.equals(data.getAccSerialNum())) { - if (data.getAmtPastDue() != null && data.getAmtPastDue().compareTo(BigDecimal.valueOf(5000)) >= 0) { - flag5000Map.put(fid, true); - } else { - flag5000Map.put(fid, false); - } - prevAccSerialNum = data.getAccSerialNum(); - } - } - - if (flag90Days.get(fid) != null && flag90Days.get(fid).equals(Boolean.TRUE)) { - iterator.remove(); - break; - } - - if (flag90Days.get(fid) == null || flag90Days.get(fid).equals(Boolean.FALSE)) { - if (data.getDaysPastDue() != null) { - boolean has90daysFlag = data.getDaysPastDue().compareTo(BigInteger.valueOf(90)) >= 0 && !data.getReportedDate().isBefore(yearAgo); - if (has90daysFlag) { - flag90Days.put(fid, true); - iterator.remove(); - break; - } else { - flag90Days.put(fid, false); - iterator.remove(); - } - } else { - iterator.remove(); - } - } - } - } - if (flag5000Map.get(fid) == null) { - flag5000Map.put(fid, false); - } - if (flag90Days.get(fid) == null) { - flag90Days.put(fid, false); - } - } - } private final List ruPastDuarearDataList = new ArrayList<>( List.of( - new FlagsService.RuPastDuarearData(1, BigInteger.valueOf(1), LocalDate.parse("2025-12-31"), BigDecimal.valueOf(36000.00), BigInteger.valueOf(159)), // просрочка 5000 и 90_days по этой записи + new FlagsService.RuPastDuarearData(1, BigInteger.valueOf(1), calcLocalDateFromInitialDate("2025-05-31"), BigDecimal.valueOf(36000.00), BigInteger.valueOf(159)), // просрочка 5000 и 90_days по этой записи - new FlagsService.RuPastDuarearData(2, BigInteger.valueOf(2), LocalDate.parse("2021-12-29"), BigDecimal.valueOf(3200.00), null), // не макс reported_date для того же acc_serial_num - new FlagsService.RuPastDuarearData(2, BigInteger.valueOf(2), LocalDate.parse("2022-01-28"), BigDecimal.valueOf(6700.00), null), // не макс reported_date для того же acc_serial_num - new FlagsService.RuPastDuarearData(2, BigInteger.valueOf(2), LocalDate.parse("2025-04-06"), BigDecimal.valueOf(5700.00), null), // просрочка 5000 по этой записи + new FlagsService.RuPastDuarearData(2, BigInteger.valueOf(2), calcLocalDateFromInitialDate("2021-12-29"), BigDecimal.valueOf(3200.00), null), // не макс reported_date для того же acc_serial_num + new FlagsService.RuPastDuarearData(2, BigInteger.valueOf(2), calcLocalDateFromInitialDate("2022-01-28"), BigDecimal.valueOf(6700.00), null), // не макс reported_date для того же acc_serial_num + new FlagsService.RuPastDuarearData(2, BigInteger.valueOf(2), calcLocalDateFromInitialDate("2025-04-06"), BigDecimal.valueOf(5700.00), null), // просрочка 5000 по этой записи - new FlagsService.RuPastDuarearData(3, BigInteger.valueOf(3), LocalDate.parse("2025-01-14"), BigDecimal.valueOf(300000000000.00), null), + new FlagsService.RuPastDuarearData(3, BigInteger.valueOf(3), calcLocalDateFromInitialDate("2025-01-14"), BigDecimal.valueOf(300000000000.00), null), - new FlagsService.RuPastDuarearData(2, BigInteger.valueOf(2), LocalDate.parse("2021-11-29"), BigDecimal.valueOf(0.00), null), // не макс reported_date для того же acc_serial_num + new FlagsService.RuPastDuarearData(2, BigInteger.valueOf(2), calcLocalDateFromInitialDate("2021-11-29"), BigDecimal.valueOf(0.00), null), // не макс reported_date для того же acc_serial_num - new FlagsService.RuPastDuarearData(4, BigInteger.valueOf(4), LocalDate.parse("2025-12-06"), BigDecimal.valueOf(4000.00), null), // нет просрочек + new FlagsService.RuPastDuarearData(4, BigInteger.valueOf(4), calcLocalDateFromInitialDate("2025-12-06"), BigDecimal.valueOf(4000.00), null), // нет просрочек - new FlagsService.RuPastDuarearData(5, BigInteger.valueOf(5), LocalDate.parse("2021-04-01"), BigDecimal.valueOf(2000.31), BigInteger.valueOf(182)), // не макс reported_date для того же acc_serial_num - new FlagsService.RuPastDuarearData(5, BigInteger.valueOf(5), LocalDate.parse("2021-05-01"), BigDecimal.valueOf(2000.31), BigInteger.valueOf(212)), // не макс reported_date для того же acc_serial_num - new FlagsService.RuPastDuarearData(5, BigInteger.valueOf(5), LocalDate.parse("2021-05-31"), BigDecimal.valueOf(2000.31), null), // не макс reported_date для того же acc_serial_num - new FlagsService.RuPastDuarearData(5, BigInteger.valueOf(5), LocalDate.parse("2021-07-01"), BigDecimal.valueOf(2000.31), BigInteger.valueOf(273)), // не макс reported_date для того же acc_serial_num - new FlagsService.RuPastDuarearData(5, BigInteger.valueOf(5), LocalDate.parse("2021-07-31"), BigDecimal.valueOf(2000.31), null), // не макс reported_date для того же acc_serial_num - new FlagsService.RuPastDuarearData(5, BigInteger.valueOf(5), LocalDate.parse("2021-08-04"), BigDecimal.valueOf(7000.31), BigInteger.valueOf(307)), // не макс reported_date для того же acc_serial_num - new FlagsService.RuPastDuarearData(5, BigInteger.valueOf(5), LocalDate.parse("2025-09-08"), BigDecimal.valueOf(2000.31), BigInteger.valueOf(338)), // не макс reported_date для того же acc_serial_num, просрочка 90_days будет взята у этой записи - new FlagsService.RuPastDuarearData(5, BigInteger.valueOf(51), LocalDate.parse("2025-09-09"), BigDecimal.valueOf(7000.31), BigInteger.valueOf(368)), // Просрочка 5000 будет взята у этой записи. Уникальный acc_serial_num с макс reported_dt - new FlagsService.RuPastDuarearData(5, BigInteger.valueOf(5), LocalDate.parse("2021-11-04"), BigDecimal.valueOf(2000.31), BigInteger.valueOf(399)), // не макс reported_date для того же acc_serial_num - new FlagsService.RuPastDuarearData(5, BigInteger.valueOf(5), LocalDate.parse("2022-01-04"), BigDecimal.valueOf(5000.31), BigInteger.valueOf(5)), // не макс reported_date для того же acc_serial_num + new FlagsService.RuPastDuarearData(5, BigInteger.valueOf(5), calcLocalDateFromInitialDate("2021-04-01"), BigDecimal.valueOf(2000.31), BigInteger.valueOf(182)), // не макс reported_date для того же acc_serial_num + new FlagsService.RuPastDuarearData(5, BigInteger.valueOf(5), calcLocalDateFromInitialDate("2021-05-01"), BigDecimal.valueOf(2000.31), BigInteger.valueOf(212)), // не макс reported_date для того же acc_serial_num + new FlagsService.RuPastDuarearData(5, BigInteger.valueOf(5), calcLocalDateFromInitialDate("2021-05-31"), BigDecimal.valueOf(2000.31), null), // не макс reported_date для того же acc_serial_num + new FlagsService.RuPastDuarearData(5, BigInteger.valueOf(5), calcLocalDateFromInitialDate("2021-07-01"), BigDecimal.valueOf(2000.31), BigInteger.valueOf(273)), // не макс reported_date для того же acc_serial_num + new FlagsService.RuPastDuarearData(5, BigInteger.valueOf(5), calcLocalDateFromInitialDate("2021-07-31"), BigDecimal.valueOf(2000.31), null), // не макс reported_date для того же acc_serial_num + new FlagsService.RuPastDuarearData(5, BigInteger.valueOf(5), calcLocalDateFromInitialDate("2021-08-04"), BigDecimal.valueOf(7000.31), BigInteger.valueOf(307)), // не макс reported_date для того же acc_serial_num + new FlagsService.RuPastDuarearData(5, BigInteger.valueOf(5), calcLocalDateFromInitialDate("2025-09-08"), BigDecimal.valueOf(2000.31), BigInteger.valueOf(338)), // не макс reported_date для того же acc_serial_num, просрочка 90_days будет взята у этой записи + new FlagsService.RuPastDuarearData(5, BigInteger.valueOf(51), calcLocalDateFromInitialDate("2025-09-09"), BigDecimal.valueOf(7000.31), BigInteger.valueOf(368)), // Просрочка 5000 будет взята у этой записи. Уникальный acc_serial_num с макс reported_dt + new FlagsService.RuPastDuarearData(5, BigInteger.valueOf(5), calcLocalDateFromInitialDate("2021-11-04"), BigDecimal.valueOf(2000.31), BigInteger.valueOf(399)), // не макс reported_date для того же acc_serial_num + new FlagsService.RuPastDuarearData(5, BigInteger.valueOf(5), calcLocalDateFromInitialDate("2022-01-04"), BigDecimal.valueOf(5000.31), BigInteger.valueOf(5)), // не макс reported_date для того же acc_serial_num - new FlagsService.RuPastDuarearData(6, BigInteger.valueOf(6), LocalDate.parse("2025-09-09"), BigDecimal.valueOf(3000), null), // Нет просрочки 5000, нет просрочки 90_days (90_days будет в RU_PAYMT) + new FlagsService.RuPastDuarearData(6, BigInteger.valueOf(6), calcLocalDateFromInitialDate("2025-09-09"), BigDecimal.valueOf(3000), null), // Нет просрочки 5000, нет просрочки 90_days (90_days будет в RU_PAYMT) - new FlagsService.RuPastDuarearData(7, BigInteger.valueOf(7), LocalDate.parse("2025-09-09"), BigDecimal.valueOf(5500), BigInteger.valueOf(90)), // не макс reported_date для того же acc_serial_num. 90_days будет взята отсюда - new FlagsService.RuPastDuarearData(7, BigInteger.valueOf(7), LocalDate.parse("2025-09-10"), BigDecimal.valueOf(3000), null) // Нет просрочки 5000. Уникальный acc_serial_num с макс reported_dt + new FlagsService.RuPastDuarearData(7, BigInteger.valueOf(7), calcLocalDateFromInitialDate("2025-09-09"), BigDecimal.valueOf(5500), BigInteger.valueOf(90)), // не макс reported_date для того же acc_serial_num. 90_days будет взята отсюда + new FlagsService.RuPastDuarearData(7, BigInteger.valueOf(7), calcLocalDateFromInitialDate("2025-09-10"), BigDecimal.valueOf(3000), null) // Нет просрочки 5000. Уникальный acc_serial_num с макс reported_dt ) ); + + private LocalDate calcLocalDateFromInitialDate(String date) { + LocalDateTime now = LocalDateTime.now(); + long daysPassed = ChronoUnit.DAYS.between(INITIAL_DATE, now); + return LocalDate.parse(date).plusDays(daysPassed); + } }