From d70b537364a942f3e74b127a6218645a24fda432 Mon Sep 17 00:00:00 2001 From: akulikov Date: Tue, 10 Jan 2023 12:55:04 +0300 Subject: [PATCH] . --- .../clearing/reports/reports/Destination.java | 23 ++ .../reports/reports/ReportINACCNT.java | 76 +++++ .../reports/bt_17_1/ReportBR_0420315_P1.java | 62 ++-- .../reports/bt_17_1/ReportBR_0420315_P2.java | 53 +--- .../reports/bt_17_3/ReportBR_0420318.java | 7 +- .../reports/services/ReportsService.java | 7 +- ...r.java => ReportBR_0420315_Collector.java} | 288 +++++++++--------- .../collector/ReportBR_0420318_Collector.java | 20 ++ .../collector/ReportINACCNT_Collector.java | 56 ++++ .../collector/ReportPA_BT2_B_Collector.java | 5 - 10 files changed, 352 insertions(+), 245 deletions(-) create mode 100644 clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/Destination.java create mode 100644 clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/ReportINACCNT.java rename clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/collector/{Bt17_1_P1_collector.java => ReportBR_0420315_Collector.java} (94%) create mode 100644 clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/collector/ReportBR_0420318_Collector.java create mode 100644 clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/collector/ReportINACCNT_Collector.java diff --git a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/Destination.java b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/Destination.java new file mode 100644 index 000000000..da4f82002 --- /dev/null +++ b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/Destination.java @@ -0,0 +1,23 @@ +package ru.spcex.clearing.reports.reports; + +import ru.spcex.platform.utils.enumeration.IEnumKey; + +public enum Destination implements IEnumKey { + BR("BR"), _1C("1C"); + + private final String key; + + Destination(String key) { + this.key = key; + } + + @Override + public String getKey() { + return this.key; + } + + @Override + public boolean equalsByKey(String key) { + return IEnumKey.super.equalsByKey(key); + } +} diff --git a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/ReportINACCNT.java b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/ReportINACCNT.java new file mode 100644 index 000000000..3c32daac7 --- /dev/null +++ b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/ReportINACCNT.java @@ -0,0 +1,76 @@ +package ru.spcex.clearing.reports.reports; + +import com.thoughtworks.xstream.annotations.XStreamAlias; +import com.thoughtworks.xstream.annotations.XStreamAsAttribute; +import com.thoughtworks.xstream.annotations.XStreamConverter; +import ru.spcex.clearing.reports.xml_test.FormattedLocalDateConverter; +import ru.spcex.clearing.reports.xml_test.FormattedLocalTimeConverter; + +import java.time.LocalDate; +import java.time.LocalDateTime; +import java.time.LocalTime; +import java.util.List; + +@XStreamAlias("accountBalanceInfo") +public class ReportINACCNT extends AbstractReport { + @XStreamAsAttribute + @XStreamAlias("clearingMemberCategory") + private final String companyClearingCode; + + /** + * Дата в формате: dd.MM.yyyy + */ + @XStreamAsAttribute + @XStreamAlias("date") + @XStreamConverter(value = FormattedLocalDateConverter.class, strings = {"dd.MM.yyyy"}) + private final LocalDate date; + + /** + * Время в формате: hh:mm:ss + */ + @XStreamAsAttribute + @XStreamAlias("time") + @XStreamConverter(value = FormattedLocalTimeConverter.class, strings = {"HH:mm:ss"}) + private final LocalTime time; + + @XStreamAlias("rows") + private List rows; + + public ReportINACCNT(String companyClearingCode, LocalDate date, LocalTime time) { + super(ReportId.BT16_5, + "0.0.1", + "BT16.5", + "Отчет о денежных средствах на счете внутреннего учета (клиринговом регистре) Участника клиринга"); + this.companyClearingCode = companyClearingCode; + this.date = date; + this.time = time; + } + + @Override + public String getReportName(LocalDateTime reportDateTime) { + return "INACCNT.%s.%s".formatted( + companyClearingCode, + DATE_TIME_FORMATTER.format(reportDateTime) + ); + } + + public List getRows() { + return rows; + } + + public void setRows(List rows) { + this.rows = rows; + } + + @XStreamAlias("row") + public record Row(@XStreamAsAttribute @XStreamAlias("id") Long id, + @XStreamAsAttribute @XStreamAlias("clearingHouse") String clearingHouse, + @XStreamAsAttribute @XStreamAlias("company_clearingCode") String companyClearingCode, + @XStreamAsAttribute @XStreamAlias("company_fullName") String companyFullName, + @XStreamAsAttribute @XStreamAlias("accountBalance_account") String accountBalanceAccount, + @XStreamAsAttribute @XStreamAlias("accountBalance_openAccount") String accountBalanceOpenAccount, + @XStreamAsAttribute @XStreamAlias("accountBalance_debitAccount") String accountBalanceDebitAccount, + @XStreamAsAttribute @XStreamAlias("accountBalance_creditAccount") String accountBalanceCreditAccount, + @XStreamAsAttribute @XStreamAlias("accountBalance_closeAccount") String accountBalanceCloseAccount) { + } +} diff --git a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bt_17_1/ReportBR_0420315_P1.java b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bt_17_1/ReportBR_0420315_P1.java index 4e39e10ff..766cff4a1 100644 --- a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bt_17_1/ReportBR_0420315_P1.java +++ b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bt_17_1/ReportBR_0420315_P1.java @@ -2,8 +2,11 @@ package ru.spcex.clearing.reports.reports.bt_17_1; import com.thoughtworks.xstream.annotations.XStreamAlias; import com.thoughtworks.xstream.annotations.XStreamAsAttribute; +import ru.spcex.clearing.reports.reports.Destination; import ru.spcex.clearing.reports.reports.ReportId; import ru.spcex.clearing.reports.reports.ReportWithClearingStatus; +import ru.spcex.platform.enumeration.ClearingMemberCategoryD; +import ru.spcex.platform.enumeration.ClearingStatus; import java.time.LocalDate; import java.time.LocalDateTime; @@ -12,7 +15,6 @@ import java.util.List; @XStreamAlias("clearedLiabilities") public class ReportBR_0420315_P1 extends ReportWithClearingStatus { - @XStreamAsAttribute @XStreamAlias("destination") private String destination; @@ -25,61 +27,25 @@ public class ReportBR_0420315_P1 extends ReportWithClearingStatus { private final List rows = new ArrayList<>(); public ReportBR_0420315_P1(LocalDate startDate, - LocalDate endDate, - String destination, - String clearingMemberCategory, - String clearingStatus) { + LocalDate endDate) { super(ReportId.BR_0420315_P1, "0.0.1", "0420315", "Сведения об исполненных обязательствах, допущенных к клирингу, за отчетный период, часть 1", startDate, endDate, - clearingStatus); - this.destination = destination; - this.clearingMemberCategory = clearingMemberCategory; + ClearingStatus.OK.getKey()); + this.destination = Destination.BR.getKey(); + this.clearingMemberCategory = "%s,%s".formatted( + ClearingMemberCategoryD.I.getKey(), + "V" + ); } public List getRows() { return rows; } - @XStreamAlias("row") - public static class Info_0420315_P1 { - @XStreamAlias("company_id") - @XStreamAsAttribute - private String companyId; - - @XStreamAlias("company_fullName") - @XStreamAsAttribute - private String companyFullName; - - @XStreamAlias("listing_market") - @XStreamAsAttribute - private String listingMarket; - - @XStreamAlias("contract_qty") - @XStreamAsAttribute - private String contractQty; - - @XStreamAlias("liabilities_amount") - @XStreamAsAttribute - private String liabilitiesAmount; - - public Info_0420315_P1(String companyId, - String companyFullName, - String listingMarket, - String contractQty, - String liabilitiesAmount) { - this.companyId = companyId; - this.companyFullName = companyFullName; - this.listingMarket = listingMarket; - this.contractQty = contractQty; - this.liabilitiesAmount = liabilitiesAmount; - } - - } - @Override public String getReportName(LocalDateTime reportDateTime) { return "REPBR.0420315.P1.%s-%s.%s".formatted( @@ -88,4 +54,12 @@ public class ReportBR_0420315_P1 extends ReportWithClearingStatus { DATE_TIME_FORMATTER.format(reportDateTime) ); } + + @XStreamAlias("row") + public record Info_0420315_P1(@XStreamAlias("company_id") @XStreamAsAttribute String companyId, + @XStreamAlias("company_fullName") @XStreamAsAttribute String companyFullName, + @XStreamAlias("listing_market") @XStreamAsAttribute String listingMarket, + @XStreamAlias("contract_qty") @XStreamAsAttribute String contractQty, + @XStreamAlias("liabilities_amount") @XStreamAsAttribute String liabilitiesAmount) { + } } diff --git a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bt_17_1/ReportBR_0420315_P2.java b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bt_17_1/ReportBR_0420315_P2.java index 8fe84ff00..fe9112dff 100644 --- a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bt_17_1/ReportBR_0420315_P2.java +++ b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bt_17_1/ReportBR_0420315_P2.java @@ -2,6 +2,7 @@ package ru.spcex.clearing.reports.reports.bt_17_1; import com.thoughtworks.xstream.annotations.XStreamAlias; import com.thoughtworks.xstream.annotations.XStreamAsAttribute; +import ru.spcex.clearing.reports.reports.Destination; import ru.spcex.clearing.reports.reports.ReportId; import ru.spcex.clearing.reports.reports.ReportWithPeriod; @@ -10,13 +11,12 @@ import java.time.LocalDateTime; @XStreamAlias("clearedLiabilitiesTotal") public class ReportBR_0420315_P2 extends ReportWithPeriod { + @XStreamAlias("rows") + private final Info_0420315_P2 rows; @XStreamAsAttribute @XStreamAlias("destination") private String destination; - @XStreamAlias("total") - private final Info_0420315_P2 total; - public ReportBR_0420315_P2(LocalDate startDate, LocalDate endDate, String destination, @@ -28,49 +28,14 @@ public class ReportBR_0420315_P2 extends ReportWithPeriod { "Сведения об исполненных обязательствах, допущенных к клирингу, за отчетный период, часть 2", startDate, endDate); - this.destination = destination; - total = new Info_0420315_P2(contractQty, liabilitiesAmount); + this.destination = Destination.BR.getKey(); + rows = new Info_0420315_P2(contractQty, liabilitiesAmount); } - public Info_0420315_P2 getTotal() { - return total; + public Info_0420315_P2 getRows() { + return rows; } - - public static class Info_0420315_P2 { - @XStreamAlias("contract_qty") - @XStreamAsAttribute - private String contractQty; - - @XStreamAlias("liabilities_amount") - @XStreamAsAttribute - private String liabilitiesAmount; - - - public Info_0420315_P2(String contractQty, String liabilitiesAmount) { - this.contractQty = contractQty; - this.liabilitiesAmount = liabilitiesAmount; - } - - public String getContractQty() { - return contractQty; - } - - public void setContractQty(String contractQty) { - this.contractQty = contractQty; - } - - public String getLiabilitiesAmount() { - return liabilitiesAmount; - } - - public void setLiabilitiesAmount(String liabilitiesAmount) { - this.liabilitiesAmount = liabilitiesAmount; - } - - } - - @Override public String getReportName(LocalDateTime reportDateTime) { return "REPBR.0420315.P2.%s-%s.%s".formatted( @@ -80,4 +45,8 @@ public class ReportBR_0420315_P2 extends ReportWithPeriod { ); } + public record Info_0420315_P2(@XStreamAlias("contract_qty") @XStreamAsAttribute String contractQty, + @XStreamAlias("liabilities_amount") @XStreamAsAttribute String liabilitiesAmount) { + } + } diff --git a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bt_17_3/ReportBR_0420318.java b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bt_17_3/ReportBR_0420318.java index 507b07940..01380a443 100644 --- a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bt_17_3/ReportBR_0420318.java +++ b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bt_17_3/ReportBR_0420318.java @@ -4,6 +4,7 @@ import com.thoughtworks.xstream.annotations.XStreamAlias; import com.thoughtworks.xstream.annotations.XStreamAsAttribute; import ru.spcex.clearing.reports.reports.ReportId; import ru.spcex.clearing.reports.reports.ReportWithClearingStatus; +import ru.spcex.platform.enumeration.ClearingStatus; import java.time.LocalDate; import java.time.LocalDateTime; @@ -19,15 +20,15 @@ public class ReportBR_0420318 extends ReportWithClearingStatus { @XStreamAlias("rows") private final List rows = new ArrayList<>(); - public ReportBR_0420318(LocalDate startDate, LocalDate endDate, String clearingStatus, String destination) { + public ReportBR_0420318(LocalDate startDate, LocalDate endDate) { super(ReportId.BR_0420318, "0.0.1", "0420318", "Сведения о неисполненных обязательствах", startDate, endDate, - clearingStatus); - this.destination = destination; + ClearingStatus.FAIL.getKey()); + this.destination = "BR"; } public List getRows() { 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 999a08190..af76e94ba 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 @@ -55,10 +55,7 @@ public class ReportsService { /* ========= БТ 17.1 ========== */ // todo see ReportDataCollector ReportBR_0420315_P1 reportBR_0420315_p1 = new ReportBR_0420315_P1(LocalDate.now(), - LocalDate.now(), - "BR", - "clearingMemberCategory", - "clearingStatus"); + LocalDate.now()); ReportBR_0420315_P1.Info_0420315_P1 info_0420315_p1 = new ReportBR_0420315_P1.Info_0420315_P1("companyId", "companyFullName", "listingMarket", @@ -95,7 +92,7 @@ public class ReportsService { /* ========= БТ 17.3 ========== */ - ReportBR_0420318 reportBR_0420318 = new ReportBR_0420318(LocalDate.now(), LocalDate.now(), "clearingStatus", "BR"); + ReportBR_0420318 reportBR_0420318 = new ReportBR_0420318(LocalDate.now(), LocalDate.now()); ReportBR_0420318.Info_0420318 info_0420318 = new ReportBR_0420318.Info_0420318( "liabilitiesClaimsAssetsFullName", "companySymbolsCode", diff --git a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/collector/Bt17_1_P1_collector.java b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/collector/ReportBR_0420315_Collector.java similarity index 94% rename from clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/collector/Bt17_1_P1_collector.java rename to clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/collector/ReportBR_0420315_Collector.java index 51ff529d6..bfca1159b 100644 --- a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/collector/Bt17_1_P1_collector.java +++ b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/collector/ReportBR_0420315_Collector.java @@ -1,146 +1,142 @@ -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.company.Company; -import ru.clearing.classes.statics.data.generated.ClearingMemberCategory; -import ru.clearing.classes.statics.data.misc.Listing; -import ru.clearing.classes.transaction.data.execution.LiabilitiesClaimsAssets; -import ru.clearing.platform.dictionary.ClearingStatusDictionary; -import ru.spcex.clearing.imdg.IMDGDistributedNames; -import ru.spcex.clearing.reports.reports.bt_17_1.ReportBR_0420315_P1; -import ru.spcex.clearing.reports.services.ReportDataCollector; -import ru.spcex.platform.enumeration.ClearingCategory; -import ru.spcex.platform.enumeration.ClearingStatus; -import ru.spcex.platform.enumeration.Market; -import ru.spcex.platform.imdg.api.Imdg; -import ru.spcex.platform.imdg.api.ImdgProvider; -import ru.spcex.platform.imdg.api.predicate.ImdgPredicate; -import ru.spcex.platform.imdg.api.predicate.ImdgPredicateBuilder; -import ru.spcex.platform.utils.time.TimeUtil; - -import java.time.Instant; -import java.time.LocalDate; -import java.util.*; - -@Component -public class Bt17_1_P1_collector extends ReportDataCollector { - protected static final List ALLOW_CLEARING_MEMBER_CATEGORY = Arrays.asList(ClearingCategory.I.getKey(), ClearingCategory.V.getKey()); - protected static final String ALLOW_CLEARING_STATUS = ClearingStatus.OK.getKey(); - - private Imdg companyImdg; - private Imdg liabilitiesClaimsAssetsImdg; - private Imdg clearingMemberCategoryImdg; - private Imdg clearingStatusDictionaryImdg; - private Imdg listingImdg; - - @Autowired - public Bt17_1_P1_collector(ImdgProvider imdgProvider) { - companyImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Company, Company.class); - liabilitiesClaimsAssetsImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_LiabilitiesClaimsAssets, LiabilitiesClaimsAssets.class); - clearingMemberCategoryImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_ClearingMemberCategory, ClearingMemberCategory.class); - clearingStatusDictionaryImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_ClearingStatusDictionary, ClearingStatusDictionary.class); - listingImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Listing, Listing.class); - } - - /** - * @param onMarket Market.mkrs.getKey() - * @param securityId liability.getSecurityId() - * @return - */ - protected Listing findListing(Market onMarket, Long securityId) { - Map qParam = new HashMap<>(); - qParam.put("market", onMarket.getKey()); - qParam.put("securityId", securityId); - return listingImdg.getSingleObjectByFieldValues(qParam); - } - - Collection searchLiabilitiesClaimsAssets(LocalDate startDate, LocalDate endDate, Long allowClearingStatusId) { - // String ql = String.format("'%s' <= refundDate and refundDate <= '%s' and clearingStatus=%s", -// formatToIMDGInstant(startDate), formatToIMDGInstant(endDate), allowClearingStatusId); -// Collection liabilities = liabilitiesClaimsAssetsImdg.getCollectionObjectsBySQL(ql); - - ImdgPredicateBuilder pb = liabilitiesClaimsAssetsImdg.predicateBuilder(); - Instant dateTimeLo = toInstantStartDay(startDate); - Instant dateTimeHi = toInstantStartDay(endDate); - ImdgPredicate p = pb.and(pb.greatEqual("refundDate", dateTimeLo), pb.lessEqual("refundDate", dateTimeHi), - pb.equals("clearingStatus", allowClearingStatusId)); - Collection liabilities = liabilitiesClaimsAssetsImdg.getCollectionObjectsByPredicate(p); - return liabilities; - } - - @Override - public ReportBR_0420315_P1 collectReportWithPeriod(LocalDate startDate, LocalDate endDate) { - validateDateRange(startDate, endDate); - ReportBR_0420315_P1 reportBR_0420315_p1 = new ReportBR_0420315_P1(startDate, endDate, - "BR", - "I,V", // cmc.getClearingMemberCategory() - ALLOW_CLEARING_STATUS //clearingStatus.getCode() "OK" - ); - - final Long allowClearingStatusId = MapUtil.getDictionaryIdByCode(clearingStatusDictionaryImdg, ALLOW_CLEARING_STATUS); // "OK" - - Collection liabilities = searchLiabilitiesClaimsAssets(startDate, endDate, allowClearingStatusId); - - Map> indexByCompany = MapUtil.indexList(liabilities, LiabilitiesClaimsAssets::getCompanyId); - company_for: - for (Map.Entry> companyEntry : indexByCompany.entrySet()) { - final Long companyId = companyEntry.getKey(); - List liabilitiesOfCompany = companyEntry.getValue(); - Company company = companyImdg.getSingleObjectByID(companyId); - if (company != null) { - Collection cmcLst = clearingMemberCategoryImdg.getCollectionObjectsByFieldValues(Map.of("companyId", companyId)); - boolean checkCategory = cmcLst.stream() - .anyMatch(cmc -> ALLOW_CLEARING_MEMBER_CATEGORY.contains(cmc.getClearingMemberCategory())); - if (!checkCategory) { - // фильтруются <> I, V - log.trace("Filtered company[{}] ClearingMemberCategory no match: {}", - companyId, cmcLst); - continue company_for; - } - - HashSet onMarket = new HashSet<>(); - - long contractorQty; - double liabilitiesAmount = 0; - { - HashSet collectedToSumm = new HashSet<>(); // чтобы дважды не посчитать 1 и тот же контракт - HashSet onMarketSecurity=new HashSet<>(); - for (LiabilitiesClaimsAssets lContract : liabilitiesOfCompany) { - if (!onMarketSecurity.contains(lContract.getSecurityId())) { - Listing listing = findListing(Market.mkrs, lContract.getSecurityId()); - if (listing!= null) { - onMarket.add(listing.getMarket()); - } - onMarketSecurity.add(lContract.getSecurityId()); - } - if (lContract.getLiabilitiesQuantity() != null && StringUtils.isNotEmpty(lContract.getContract()) - && !collectedToSumm.contains(lContract.getContract())) { - collectedToSumm.add(lContract.getContract()); - liabilitiesAmount += lContract.getLiabilitiesQuantity().doubleValue(); - } - } - contractorQty = collectedToSumm.size(); - } - String onMarketString = StringUtils.join(onMarket, ","); - if (onMarket.size() != 1) { // Сейчас по коду ожидается один listing.market="MKRS" но потом могут быть несколько - log.warn("Market for companyId[{}]: {}", companyId, onMarketString); - } - ReportBR_0420315_P1.Info_0420315_P1 info_0420315_p1 = new ReportBR_0420315_P1.Info_0420315_P1(company.getId().toString(), - company.getFullName(), - onMarketString, - toString(contractorQty), - toString(liabilitiesAmount)); - reportBR_0420315_p1.getRows().add(info_0420315_p1); - } - } - - return reportBR_0420315_p1; - } - - @Override - public Class getReportClass() { - return ReportBR_0420315_P1.class; - } -} +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.company.Company; +import ru.clearing.classes.statics.data.generated.ClearingMemberCategory; +import ru.clearing.classes.statics.data.misc.Listing; +import ru.clearing.classes.transaction.data.execution.LiabilitiesClaimsAssets; +import ru.clearing.platform.dictionary.ClearingStatusDictionary; +import ru.spcex.clearing.imdg.IMDGDistributedNames; +import ru.spcex.clearing.reports.reports.bt_17_1.ReportBR_0420315_P1; +import ru.spcex.clearing.reports.services.ReportDataCollector; +import ru.spcex.platform.enumeration.ClearingCategory; +import ru.spcex.platform.enumeration.ClearingStatus; +import ru.spcex.platform.enumeration.Market; +import ru.spcex.platform.imdg.api.Imdg; +import ru.spcex.platform.imdg.api.ImdgProvider; +import ru.spcex.platform.imdg.api.predicate.ImdgPredicate; +import ru.spcex.platform.imdg.api.predicate.ImdgPredicateBuilder; +import ru.spcex.platform.utils.time.TimeUtil; + +import java.time.Instant; +import java.time.LocalDate; +import java.util.*; + +@Component +public class ReportBR_0420315_Collector extends ReportDataCollector { + protected static final List ALLOW_CLEARING_MEMBER_CATEGORY = Arrays.asList(ClearingCategory.I.getKey(), ClearingCategory.V.getKey()); + protected static final String ALLOW_CLEARING_STATUS = ClearingStatus.OK.getKey(); + + private Imdg companyImdg; + private Imdg liabilitiesClaimsAssetsImdg; + private Imdg clearingMemberCategoryImdg; + private Imdg clearingStatusDictionaryImdg; + private Imdg listingImdg; + + @Autowired + public ReportBR_0420315_Collector(ImdgProvider imdgProvider) { + companyImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Company, Company.class); + liabilitiesClaimsAssetsImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_LiabilitiesClaimsAssets, LiabilitiesClaimsAssets.class); + clearingMemberCategoryImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_ClearingMemberCategory, ClearingMemberCategory.class); + clearingStatusDictionaryImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_ClearingStatusDictionary, ClearingStatusDictionary.class); + listingImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Listing, Listing.class); + } + + /** + * @param onMarket Market.mkrs.getKey() + * @param securityId liability.getSecurityId() + * @return + */ + protected Listing findListing(Market onMarket, Long securityId) { + Map qParam = new HashMap<>(); + qParam.put("market", onMarket.getKey()); + qParam.put("securityId", securityId); + return listingImdg.getSingleObjectByFieldValues(qParam); + } + + Collection searchLiabilitiesClaimsAssets(LocalDate startDate, LocalDate endDate, Long allowClearingStatusId) { + // String ql = String.format("'%s' <= refundDate and refundDate <= '%s' and clearingStatus=%s", +// formatToIMDGInstant(startDate), formatToIMDGInstant(endDate), allowClearingStatusId); +// Collection liabilities = liabilitiesClaimsAssetsImdg.getCollectionObjectsBySQL(ql); + + ImdgPredicateBuilder pb = liabilitiesClaimsAssetsImdg.predicateBuilder(); + Instant dateTimeLo = toInstantStartDay(startDate); + Instant dateTimeHi = toInstantStartDay(endDate); + ImdgPredicate p = pb.and(pb.greatEqual("refundDate", dateTimeLo), pb.lessEqual("refundDate", dateTimeHi), + pb.equals("clearingStatus", allowClearingStatusId)); + Collection liabilities = liabilitiesClaimsAssetsImdg.getCollectionObjectsByPredicate(p); + return liabilities; + } + + @Override + public ReportBR_0420315_P1 collectReportWithPeriod(LocalDate startDate, LocalDate endDate) { + validateDateRange(startDate, endDate); + ReportBR_0420315_P1 reportBR_0420315_p1 = new ReportBR_0420315_P1(startDate, endDate); + + final Long allowClearingStatusId = MapUtil.getDictionaryIdByCode(clearingStatusDictionaryImdg, ALLOW_CLEARING_STATUS); // "OK" + + Collection liabilities = searchLiabilitiesClaimsAssets(startDate, endDate, allowClearingStatusId); + + Map> indexByCompany = MapUtil.indexList(liabilities, LiabilitiesClaimsAssets::getCompanyId); + company_for: + for (Map.Entry> companyEntry : indexByCompany.entrySet()) { + final Long companyId = companyEntry.getKey(); + List liabilitiesOfCompany = companyEntry.getValue(); + Company company = companyImdg.getSingleObjectByID(companyId); + if (company != null) { + Collection cmcLst = clearingMemberCategoryImdg.getCollectionObjectsByFieldValues(Map.of("companyId", companyId)); + boolean checkCategory = cmcLst.stream() + .anyMatch(cmc -> ALLOW_CLEARING_MEMBER_CATEGORY.contains(cmc.getClearingMemberCategory())); + if (!checkCategory) { + // фильтруются <> I, V + log.trace("Filtered company[{}] ClearingMemberCategory no match: {}", + companyId, cmcLst); + continue company_for; + } + + HashSet onMarket = new HashSet<>(); + + long contractorQty; + double liabilitiesAmount = 0; + { + HashSet collectedToSumm = new HashSet<>(); // чтобы дважды не посчитать 1 и тот же контракт + HashSet onMarketSecurity=new HashSet<>(); + for (LiabilitiesClaimsAssets lContract : liabilitiesOfCompany) { + if (!onMarketSecurity.contains(lContract.getSecurityId())) { + Listing listing = findListing(Market.mkrs, lContract.getSecurityId()); + if (listing!= null) { + onMarket.add(listing.getMarket()); + } + onMarketSecurity.add(lContract.getSecurityId()); + } + if (lContract.getLiabilitiesQuantity() != null && StringUtils.isNotEmpty(lContract.getContract()) + && !collectedToSumm.contains(lContract.getContract())) { + collectedToSumm.add(lContract.getContract()); + liabilitiesAmount += lContract.getLiabilitiesQuantity().doubleValue(); + } + } + contractorQty = collectedToSumm.size(); + } + String onMarketString = StringUtils.join(onMarket, ","); + if (onMarket.size() != 1) { // Сейчас по коду ожидается один listing.market="MKRS" но потом могут быть несколько + log.warn("Market for companyId[{}]: {}", companyId, onMarketString); + } + ReportBR_0420315_P1.Info_0420315_P1 info_0420315_p1 = new ReportBR_0420315_P1.Info_0420315_P1(company.getId().toString(), + company.getFullName(), + onMarketString, + toString(contractorQty), + toString(liabilitiesAmount)); + reportBR_0420315_p1.getRows().add(info_0420315_p1); + } + } + + return reportBR_0420315_p1; + } + + @Override + public Class getReportClass() { + return ReportBR_0420315_P1.class; + } +} diff --git a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/collector/ReportBR_0420318_Collector.java b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/collector/ReportBR_0420318_Collector.java new file mode 100644 index 000000000..f91682dd9 --- /dev/null +++ b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/collector/ReportBR_0420318_Collector.java @@ -0,0 +1,20 @@ +package ru.spcex.clearing.reports.services.collector; + +import ru.spcex.clearing.reports.reports.bt_17_3.ReportBR_0420318; +import ru.spcex.clearing.reports.services.ReportDataCollector; + +import java.time.LocalDate; + +public class ReportBR_0420318_Collector extends ReportDataCollector { + @Override + public ReportBR_0420318 collectReportWithPeriod(LocalDate startDate, LocalDate endDate) { + + + return null; + } + + @Override + public Class getReportClass() { + return ReportBR_0420318.class; + } +} diff --git a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/collector/ReportINACCNT_Collector.java b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/collector/ReportINACCNT_Collector.java new file mode 100644 index 000000000..daa92079c --- /dev/null +++ b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/collector/ReportINACCNT_Collector.java @@ -0,0 +1,56 @@ +package ru.spcex.clearing.reports.services.collector; + +import ru.clearing.classes.statics.data.account.AccountBalance; +import ru.clearing.classes.statics.data.company.Company; +import ru.spcex.clearing.imdg.IMDGDistributedNames; +import ru.spcex.clearing.reports.reports.ReportINACCNT; +import ru.spcex.clearing.reports.services.ReportDataCollector; +import ru.spcex.platform.imdg.api.Imdg; +import ru.spcex.platform.imdg.api.ImdgProvider; +import ru.spcex.platform.imdg.api.predicate.ImdgPredicate; +import ru.spcex.platform.imdg.api.predicate.ImdgPredicateBuilder; +import ru.spcex.platform.imdg.iml.hazelcast.adapter.predicate.ImdgPredicateBuilderHazelcast; + +import java.time.LocalDate; +import java.util.Collection; + +public class ReportINACCNT_Collector extends ReportDataCollector { + private final Imdg accountBalanceImdg; + private final Imdg companyImdg; + + public ReportINACCNT_Collector(ImdgProvider imdgProvider) { + accountBalanceImdg = imdgProvider.getImdg( + IMDGDistributedNames.Map_AccountBalance, + AccountBalance.class + ); + companyImdg = imdgProvider.getImdg( + IMDGDistributedNames.Map_Company, + Company.class + ); + } + + @Override + public ReportINACCNT collectReportWithPeriod(LocalDate startDate, LocalDate endDate) { + String companyClearingCode; + + validateDateRange(startDate, endDate); + ImdgPredicateBuilder builder = new ImdgPredicateBuilderHazelcast(); + + + + ImdgPredicate accountTypePredicate = builder.or( + builder.equals("accountType", "CLRN"), + builder.equals("accountType", "INFO") + ); + Collection accountBalances = accountBalanceImdg.getCollectionObjectsByPredicate(accountTypePredicate); + + + + return null; + } + + @Override + public Class getReportClass() { + return ReportINACCNT.class; + } +} diff --git a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/collector/ReportPA_BT2_B_Collector.java b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/collector/ReportPA_BT2_B_Collector.java index 6fca54da0..acd7ef124 100644 --- a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/collector/ReportPA_BT2_B_Collector.java +++ b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/collector/ReportPA_BT2_B_Collector.java @@ -22,7 +22,6 @@ import java.util.stream.Collectors; public class ReportPA_BT2_B_Collector extends ReportDataCollector { private final Imdg liabilitiesClaimsAssetsImdg; - private final Imdg clearingStatusDictionaryImdg; private final Imdg clearingMemberCategoryImdg; public ReportPA_BT2_B_Collector(ImdgProvider imdgProvider) { @@ -30,10 +29,6 @@ public class ReportPA_BT2_B_Collector extends ReportDataCollector