diff --git a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bt_17_4/ReportBR_0420314_P2.java b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bt_17_4/ReportBR_0420314_P2.java index 10bfcfb72..c52189434 100644 --- a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bt_17_4/ReportBR_0420314_P2.java +++ b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bt_17_4/ReportBR_0420314_P2.java @@ -45,10 +45,6 @@ public class ReportBR_0420314_P2 extends ReportWithPeriod { @XStreamAlias("company_clearingCode") protected String companyClearingCode; - @XStreamAsAttribute - @XStreamAlias("paymentInstruction_senderId") - private String paymentInstructionSenderId; - @XStreamAsAttribute @XStreamAlias("profileDocument_id") private String profileDocumentId; @@ -70,14 +66,12 @@ public class ReportBR_0420314_P2 extends ReportWithPeriod { private String accountBalanceCloseBalanceAmount; public Info_0420314_P2(String companyClearingCode, - String paymentInstructionSenderId, String profileDocumentId, String accountBalanceOpenBalanceAmount, String paymentInstructionCreditLegAmount, String paymentInstructionDebitLegAmount, String accountBalanceCloseBalanceAmount) { this.companyClearingCode = companyClearingCode; - this.paymentInstructionSenderId = paymentInstructionSenderId; this.profileDocumentId = profileDocumentId; this.accountBalanceOpenBalanceAmount = accountBalanceOpenBalanceAmount; this.paymentInstructionCreditLegAmount = paymentInstructionCreditLegAmount; diff --git a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/ReportDataCollector.java b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/ReportDataCollector.java index 1ad87fff6..bb99d1d68 100644 --- a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/ReportDataCollector.java +++ b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/ReportDataCollector.java @@ -48,11 +48,16 @@ public abstract class ReportDataCollector { protected String toString(BigDecimal val) { if (val == null) return null; - return val.toString(); // todo есть ли требования на точность знаков? + return val.toString(); } protected String toString(Instant val) { if (val == null) return null; return DATE_TIME_FORMATTER.format(val.atZone(ZoneId.systemDefault())); } + + protected String toString(LocalDate date) { + if (date == null) return null; + return DATE_TIME_FORMATTER.format(date); + } } diff --git a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/ReportsService.java b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/ReportsService.java index 8217775a1..f0ba2a4a7 100644 --- a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/ReportsService.java +++ b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/ReportsService.java @@ -133,7 +133,6 @@ public class ReportsService { ReportBR_0420314_P2 reportBR_0420314P2 = new ReportBR_0420314_P2(LocalDate.now(), LocalDate.now(), "transactionStatus", "BR"); ReportBR_0420314_P2.Info_0420314_P2 info_0420314P2 = new ReportBR_0420314_P2.Info_0420314_P2("companyClearingCode", - "paymentInstructionSenderId", "profileDocumentId", "accountBalanceOpenBalanceAmt", "paymentInstructionCreditLegAmount", diff --git a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/collector/Repbr0420314_P2_bt_17_4_collector.java b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/collector/Repbr0420314_P2_bt_17_4_collector.java new file mode 100644 index 000000000..b19c54de5 --- /dev/null +++ b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/collector/Repbr0420314_P2_bt_17_4_collector.java @@ -0,0 +1,114 @@ +package ru.spcex.clearing.reports.services.collector; + +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; +import ru.clearing.classes.statics.data.account.AccountBalance; +import ru.clearing.classes.statics.data.company.Company; +import ru.clearing.classes.statics.data.payment.PaymentInstruction; +import ru.clearing.classes.statics.data.profile.ProfileDocument; +import ru.spcex.clearing.imdg.IMDGDistributedNames; +import ru.spcex.clearing.reports.reports.bt_17_4.ReportBR_0420314_P2; +import ru.spcex.clearing.reports.services.ReportDataCollector; +import ru.spcex.platform.enumeration.AccountType; +import ru.spcex.platform.enumeration.DocumentTypes; +import ru.spcex.platform.imdg.api.Imdg; +import ru.spcex.platform.imdg.api.ImdgProvider; + +import java.time.LocalDate; +import java.util.Collection; +import java.util.List; +import java.util.Map; +import java.util.Objects; + +/** + * accountTransactionLiabilities + */ +@Component +public class Repbr0420314_P2_bt_17_4_collector extends ReportDataCollector { + private Imdg companyImdg; + private Imdg paymentInstructionImdg; + private Imdg accountBalanceImdg; + private Imdg profileDocumentImdg; + + @Autowired + public Repbr0420314_P2_bt_17_4_collector(ImdgProvider imdgProvider) { + companyImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Company, Company.class); + paymentInstructionImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_PaymentInstruction, PaymentInstruction.class); + accountBalanceImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_AccountBalance, AccountBalance.class); + profileDocumentImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_ProfileDocument, ProfileDocument.class); + } + + @Override + public ReportBR_0420314_P2 collectReportWithPeriod(LocalDate startDate, LocalDate endDate) { + validateDateRange(startDate, endDate); + + ReportBR_0420314_P2 reportBR_0420312P2 = new ReportBR_0420314_P2(startDate, endDate, + "", "BR" + ); + + String ql = String.format("'%s' <= created and created <= '%s'", + startDate, endDate); + Collection paymentInstructionsAll = paymentInstructionImdg.getCollectionObjectsBySQL(ql); + + Map> companyIdPyPaymtInstruction = + MapUtil.indexList(paymentInstructionsAll, PaymentInstruction::getSenderId); + + for (Map.Entry> entry : companyIdPyPaymtInstruction.entrySet()) { + final Long companyId = entry.getKey(); + List paymentInstructionsByCompany = entry.getValue(); + Company company = companyImdg.getSingleObjectByID(companyId); + ProfileDocument profileDocumentCntr = profileDocumentImdg.getSingleObjectByFieldValues(Map.of( + "companyId", companyId, + "documentType", DocumentTypes.cntr.getKey() + )); + AccountBalance accountBalance = accountBalanceImdg.getSingleObjectByFieldValues(Map.of( + "accountType", AccountType.Clrn.getKey(), + "companyId", companyId + )); + + String documentTypeStr = null; + if (profileDocumentCntr != null) { + documentTypeStr = profileDocumentCntr.getNumber(); + if (profileDocumentCntr.getValidFromDate() != null) { + if (StringUtils.isEmpty(documentTypeStr)) { + documentTypeStr = ""; + } else { + documentTypeStr += " "; + } + documentTypeStr += toString(profileDocumentCntr.getValidFromDate()); + } + } + + Long paymentInstruction_creditLeg_amount = paymentInstructionsByCompany.stream() + .map(PaymentInstruction::getCreditLegAmount) + .filter(Objects::nonNull) + .reduce(Long::sum) + .orElse(0L); + Long paymentInstructiont_debitLeg_amount = paymentInstructionsByCompany.stream() + .map(PaymentInstruction::getDebitLegAmount) + .filter(Objects::nonNull) + .reduce(Long::sum) + .orElse(0L); + + + ReportBR_0420314_P2.Info_0420314_P2 info_0420314P2 = new ReportBR_0420314_P2.Info_0420314_P2( + company.getClearingCode(), + documentTypeStr, + accountBalance == null ? null : toString(accountBalance.getOpenBalanceAmount()), + toString(paymentInstruction_creditLeg_amount), + toString(paymentInstructiont_debitLeg_amount), + accountBalance == null ? null : toString(accountBalance.getCloseBalanceAmount()) + ); + + reportBR_0420312P2.getRows().add(info_0420314P2); + } + + return reportBR_0420312P2; + } + + @Override + public Class getReportClass() { + return ReportBR_0420314_P2.class; + } +} diff --git a/clearing-parent/reports-service/src/test/java/ru/spcex/clearing/reports/services/ReportDataCollectorTest.java b/clearing-parent/reports-service/src/test/java/ru/spcex/clearing/reports/services/ReportDataCollectorTest.java index 0e730578b..7c16b767c 100644 --- a/clearing-parent/reports-service/src/test/java/ru/spcex/clearing/reports/services/ReportDataCollectorTest.java +++ b/clearing-parent/reports-service/src/test/java/ru/spcex/clearing/reports/services/ReportDataCollectorTest.java @@ -14,20 +14,27 @@ class ReportDataCollectorTest extends ReportDataCollector { @Test void testToString() { ReportDataCollectorTest instance = new ReportDataCollectorTest(); - assertEquals(null, instance.toString((Long)null)); - assertEquals("1", instance.toString((Long)1L)); - assertEquals("1230", instance.toString((Long)1230L)); + assertEquals(null, instance.toString((Long) null)); + assertEquals("1", instance.toString((Long) 1L)); + assertEquals("1230", instance.toString((Long) 1230L)); } @Test void testToString1() { ReportDataCollectorTest instance = new ReportDataCollectorTest(); - assertEquals(null, instance.toString((Instant)null)); + assertEquals(null, instance.toString((Instant) null)); Instant val = Instant.ofEpochMilli(1672058774338L); assertEquals("26.12.2022T15:46:14", instance.toString(val)); // msk timezone } + @Test + void testToString2() { + ReportDataCollectorTest instance = new ReportDataCollectorTest(); + LocalDate val = LocalDate.of(2022, 12, 26); + assertEquals("26.12.2022", instance.toString(val)); + } + @Override public AbstractReport collectReportWithPeriod(LocalDate startDate, LocalDate endDate) { throw new IllegalStateException("test");