diff --git a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/builders/bean/KSRepLccValueReport.java b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/builders/bean/KSRepLccValueReport.java new file mode 100644 index 000000000..96d6018ef --- /dev/null +++ b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/builders/bean/KSRepLccValueReport.java @@ -0,0 +1,175 @@ +package ru.spcex.clearing.reports.builders.bean; + +import java.math.BigDecimal; +import java.time.LocalDateTime; +import com.opencsv.bean.CsvBindByName; +import com.opencsv.bean.CsvBindByPosition; +import com.opencsv.bean.CsvDate; +import com.opencsv.bean.CsvNumber; + +public class KSRepLccValueReport { + @CsvBindByName(column = "FIRM_ID") + @CsvBindByPosition(position = 0) + private String firmId; + + @CsvBindByName(column = "REPORT_DATE") + @CsvBindByPosition(position = 1) + @CsvDate(value = "dd.MM.yyyy'T'HH:mm:ss") + private LocalDateTime reportDate; + + @CsvBindByName(column = "TKR") + @CsvBindByPosition(position = 2) + private String tkr; + + @CsvBindByName(column = "SUM_VALUE") + @CsvBindByPosition(position = 3) + @CsvNumber(value = "#0.00", writeFormat = "#0.00") + private BigDecimal sumValue; + + @CsvBindByName(column = "LOCK_VALUE") + @CsvBindByPosition(position = 4) + @CsvNumber(value = "#0.00", writeFormat = "#0.00") + private BigDecimal lockValue; + + @CsvBindByName(column = "FREE_VALUE") + @CsvBindByPosition(position = 5) + @CsvNumber(value = "#0.00", writeFormat = "#0.00") + private BigDecimal freeValue; + + @CsvBindByName(column = "SINGLE_LIMIT") + @CsvBindByPosition(position = 6) + @CsvNumber(value = "#0.00", writeFormat = "#0.00") + private BigDecimal singleLimit; + + @CsvBindByName(column = "CURRENCY") + @CsvBindByPosition(position = 7) + private String currency; + + @CsvBindByName(column = "NCC_REAL_ACCOUNT") + @CsvBindByPosition(position = 8) + private String nccRealAccount; + + @CsvBindByName(column = "QUANTITY") + @CsvBindByPosition(position = 9) + @CsvNumber(value = "#0.00", writeFormat = "#0.00") + private BigDecimal quantity; + + @CsvBindByName(column = "LOCK_QUANTITY") + @CsvBindByPosition(position = 10) + @CsvNumber(value = "#0.00", writeFormat = "#0.00") + private BigDecimal lockQuantity; + + @CsvBindByName(column = "FREE_QUANTITY") + @CsvBindByPosition(position = 10) + @CsvNumber(value = "#0.00", writeFormat = "#0.00") + private BigDecimal freeQuantity; + + @CsvBindByName(column = "VALUE") + @CsvBindByPosition(position = 11) + private BigDecimal value; + + + public String getFirmId() { + return firmId; + } + + public void setFirmId(String firmId) { + this.firmId = firmId; + } + + public LocalDateTime getReportDate() { + return reportDate; + } + + public void setReportDate(LocalDateTime reportDate) { + this.reportDate = reportDate; + } + + public String getTkr() { + return tkr; + } + + public void setTkr(String tkr) { + this.tkr = tkr; + } + + public BigDecimal getSumValue() { + return sumValue; + } + + public void setSumValue(BigDecimal sumValue) { + this.sumValue = sumValue; + } + + public BigDecimal getLockValue() { + return lockValue; + } + + public void setLockValue(BigDecimal lockValue) { + this.lockValue = lockValue; + } + + public BigDecimal getFreeValue() { + return freeValue; + } + + public void setFreeValue(BigDecimal freeValue) { + this.freeValue = freeValue; + } + + public BigDecimal getSingleLimit() { + return singleLimit; + } + + public void setSingleLimit(BigDecimal singleLimit) { + this.singleLimit = singleLimit; + } + + public String getCurrency() { + return currency; + } + + public void setCurrency(String currency) { + this.currency = currency; + } + + public String getNccRealAccount() { + return nccRealAccount; + } + + public void setNccRealAccount(String nccRealAccount) { + this.nccRealAccount = nccRealAccount; + } + + public BigDecimal getQuantity() { + return quantity; + } + + public void setQuantity(BigDecimal quantity) { + this.quantity = quantity; + } + + public BigDecimal getLockQuantity() { + return lockQuantity; + } + + public void setLockQuantity(BigDecimal lockQuantity) { + this.lockQuantity = lockQuantity; + } + + public BigDecimal getFreeQuantity() { + return freeQuantity; + } + + public void setFreeQuantity(BigDecimal freeQuantity) { + this.freeQuantity = freeQuantity; + } + + public BigDecimal getValue() { + return value; + } + + public void setValue(BigDecimal value) { + this.value = value; + } +} diff --git a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/builders/ks/KSRepLccValueReportBuilder.java b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/builders/ks/KSRepLccValueReportBuilder.java new file mode 100644 index 000000000..d1d823702 --- /dev/null +++ b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/builders/ks/KSRepLccValueReportBuilder.java @@ -0,0 +1,157 @@ +package ru.spcex.clearing.reports.builders.ks; + +import java.util.ArrayList; +import java.util.List; +import org.springframework.stereotype.Component; +import ru.clearing.classes.statics.data.registry.Registry; +import ru.clearing.classes.statics.data.security.Rates; +import ru.spcex.clearing.imdg.IMDGDistributedNames; +import ru.spcex.clearing.reports.builders.CSVReportBuilder; +import ru.spcex.clearing.reports.builders.EmptyParams; +import ru.spcex.clearing.reports.builders.bean.KSRepLccValueReport; +import ru.spcex.platform.enumeration.ReportBuilderType; +import ru.spcex.platform.enumeration.ReportKeys; +import ru.spcex.platform.imdg.api.Imdg; +import ru.spcex.platform.imdg.api.ImdgProvider; + +@Component +public class KSRepLccValueReportBuilder extends CSVReportBuilder { + private final Imdg registryImdg; + private final Imdg ratesImdg; + + private List rows = null; + + public KSRepLccValueReportBuilder(ImdgProvider imdgProvider) { + registryImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Registry, Registry.class); + ratesImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Rates, Rates.class); + } + + @Override + protected List getRows() { + return rows; + } + + @Override + public ReportBuilderType getReportType() { + return ReportBuilderType.KS_REP_LCC_NETTO; + } + + @Override + public ReportKeys getReportKey() { + return ReportKeys.KS_REP_LCC_NETTO_REPORT; + } + + @Override + public Class getParamsClass() { + return EmptyParams.class; + } + + @Override + public Class getReportClass() { + return KSRepLccValueReport.class; + } + + @Override + protected void collect(EmptyParams params) { +// ImdgPredicateBuilder registryPB = registryImdg.predicateBuilder(); +// ImdgPredicate baseRegistriesPredicate = RegistryCodeSqlBuilder.getInstance( +// RegistryTradingParams.AM_F, +// RegistryTradingParams.OM_T, +// RegistryTradingParams.TM_T +// ).buildPredicate(registryPB); +// Collection baseRegistries = registryImdg.getCollectionObjectsByPredicate(baseRegistriesPredicate); +// +// Map> groupedByTKR = baseRegistries.stream() +// .filter(registry -> { +// if (registry.getTradingClearingRegistryId() == null) { +// log.warn("Skip registry (id = {}): empty trading_clearing_registry_id", registry.getId()); +// return false; +// } +// if (registry.getSecurityId() == null) { +// log.warn("Skip registry (id = {}): empty security_id", registry.getId()); +// return false; +// } +// return true; +// }) +// .collect(Collectors.groupingBy(Registry::getTradingClearingRegistryId)); +// +// Map currencyRates = new HashMap<>(); +// LocalDateTime nowTime = LocalDateTime.now(); +// LocalDate now = LocalDate.now(); +// for (Map.Entry> entryTKR : groupedByTKR.entrySet()) { +// Long tradingClearingRegistryId = entryTKR.getKey(); +// List registriesForTKR = entryTKR.getValue(); +// +// Registry sampleRegistry = registriesForTKR.iterator().next(); +// String firmId = sampleRegistry.getTradingCode(); +// String tkr = sampleRegistry.getTradingClearingRegistry(); +// BigDecimal sumValue = BigDecimal.ZERO; +// for (Registry registry : registriesForTKR) { +// if ( +// registry.getRegistryDesignation().equals(RegistryDesignation.A.getKey()) && +// registry.getRegistryInstrumentType().equals(RegistryInstrumentType.M.getKey()) && +// registry.getRegistryUnit().equals(RegistryUnit.F.getKey()) +// ) { +// if (registry.getBalance() == null) continue; +// Long securityId = registry.getSecurityId(); +// Rates currencyRate = currencyRates.get(securityId); +// if (currencyRate == null) { +// ImdgPredicateBuilder ratesPB = ratesImdg.predicateBuilder(); +// Collection rates = ratesImdg.getCollectionObjectsByPredicate( +// ratesPB.and( +// ratesPB.equals("currency_id", securityId), +// ratesPB.notNull("value"), +// ratesPB.equals("value_date", now) +// ) +// ); +// if (!rates.isEmpty()) { +// currencyRate = rates.iterator().next(); +// } else { +// currencyRate = new Rates(); +// currencyRate.setValue(BigDecimal.ONE); +// }; +// currencyRates.put(securityId, currencyRate); +// } +// sumValue = sumValue.add(registry.getBalance().multiply(currencyRate.getValue())); +// } +// } +// +// Map> registriesForSecurityId = registriesForTKR.stream().collect( +// Collectors.groupingBy(Registry::getSecurityId) +// ); +// +// List rowsForGroup = new ArrayList<>(); +// for (Map.Entry> entrySecurityId : registriesForSecurityId.entrySet()) { +// KSRepLccValueReport ksRepLccValueReport = new KSRepLccValueReport(); +// ksRepLccValueReport.setFirmId(firmId); +// ksRepLccValueReport.setReportDate(nowTime); +// ksRepLccValueReport.setTkr(tkr); +// ksRepLccValueReport.setSumValue(sumValue); +// +// Long securityId = entrySecurityId.getKey(); +// List registries = entrySecurityId.getValue(); +// BigDecimal demandMoney = BigDecimal.ZERO; +// BigDecimal obligMoney = BigDecimal.ZERO; +// BigDecimal posMoney = BigDecimal.ZERO; +// for (Registry registry : registries) { +// if ( +// List.of(RegistryStatus.PROC, RegistryStatus.MNG).contains( +// IEnumKey.getEnumByKey(RegistryStatus.class, registry.getRegistryStatus()) +// ) && +// registry.getRegistryInstrumentType().equals(RegistryInstrumentType.M.getKey()) && +// registry.getRegistryUnit().equals(RegistryUnit.T.getKey()) +// ) { +// } +// } +// +// rowsForGroup.add(ksRepLccValueReport); +// } +// +// } +// + + rows = new ArrayList<>(); + + } + +} diff --git a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/config/ReportBuildersConfig.java b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/config/ReportBuildersConfig.java index 8dce3dfeb..ee88158dd 100644 --- a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/config/ReportBuildersConfig.java +++ b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/config/ReportBuildersConfig.java @@ -23,6 +23,7 @@ import ru.spcex.clearing.reports.builders.ks.KSRepDepoRegisterQuantitiesReportBu import ru.spcex.clearing.reports.builders.ks.KSRepDepoRegistersReportBuilder; import ru.spcex.clearing.reports.builders.ks.KSRepLccNettoReportBuilder; import ru.spcex.clearing.reports.builders.ks.KSRepLccTradesReportBuilder; +import ru.spcex.clearing.reports.builders.ks.KSRepLccValueReportBuilder; import ru.spcex.clearing.reports.builders.ks.KSRepTradesReportBuilder; import ru.spcex.clearing.reports.builders.ks.KSSessionListReportBuilder; import ru.spcex.platform.enumeration.ReportBuilderType; @@ -40,7 +41,8 @@ public class ReportBuildersConfig { KSSessionListReportBuilder ksSessionListReportBuilder, KSCommissionTradesReportBuilder ksCommissionTradesReportBuilder, KSRepLccTradesReportBuilder ksRepLccTradesReportBuilder, - KSRepLccNettoReportBuilder ksRepLccNettoReportBuilder + KSRepLccNettoReportBuilder ksRepLccNettoReportBuilder, + KSRepLccValueReportBuilder ksRepLccValueReportBuilder ) { Map>> resultMap = new HashMap<>(); resultMap.put(ReportBuilderType.KS_REP_CASH_REGISTERS, List.of(ksRepCashRegistersReportBuilder)); @@ -52,6 +54,7 @@ public class ReportBuildersConfig { resultMap.put(ReportBuilderType.KS_COMMISSION_TRADES, List.of(ksCommissionTradesReportBuilder)); resultMap.put(ReportBuilderType.KS_REP_LCC_TRADES, List.of(ksRepLccTradesReportBuilder)); resultMap.put(ReportBuilderType.KS_REP_LCC_NETTO, List.of(ksRepLccNettoReportBuilder)); + resultMap.put(ReportBuilderType.KS_REP_LCC_VALUE, List.of(ksRepLccValueReportBuilder)); return resultMap; } @@ -162,4 +165,14 @@ public class ReportBuildersConfig { return resultMap; } + + @Bean("reportBuildersForCX84") + public Map>> reportBuildersForCX84( + KSRepLccValueReportBuilder ksRepLccValueReportBuilder + ) { + Map>> resultMap = new HashMap<>(); + resultMap.put(ReportBuilderType.KS_REP_LCC_VALUE, List.of(ksRepLccValueReportBuilder)); + return resultMap; + } + } diff --git a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/config/validation/ValidationConfig.java b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/config/validation/ValidationConfig.java index c9bf01d64..1e42cb2b3 100644 --- a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/config/validation/ValidationConfig.java +++ b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/config/validation/ValidationConfig.java @@ -173,6 +173,25 @@ public class ValidationConfig { ); }; } + + // todo оставил бин валидатора на будущее, если в дальнейшем придется проверять запрос. в текущей версии, по факту, + // запрос не проверяется: в случае если sessionId не указан отчеты не строятся + @Bean("reportRequestCX84Validator") + public Function reportRequestCX84Validator( + Map> imdgForValidation + ) { + return launcherCommandRequest -> { + ImdgValidationContext context = new ImdgValidationContext<>(); + context.setValidatedObject(launcherCommandRequest); + return new ValidatorImpl<>(context, + FieldRequiredRule.instance( + "sessionId", + LauncherCommandRequest::getSessionId, + ReportError.RequiredFieldEmpty, + false) + ); + }; + } } diff --git a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/ReportService.java b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/ReportService.java index d85de4675..4cca67443 100644 --- a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/ReportService.java +++ b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/ReportService.java @@ -55,6 +55,7 @@ public class ReportService extends QueueConsumerV2 implements InitializingBean { private final Function reportRequestGRETValidator; private final Function reportRequestGREFValidator; private final Function reportRequestGRECValidator; + private final Function reportRequestCX84Validator; private final Map>> reportBuildersWithoutParams; private final Map>> reportBuildersWithSessionIdParam; @@ -62,6 +63,7 @@ public class ReportService extends QueueConsumerV2 implements InitializingBean { private final Map>> reportBuildersForGREF; private final Map>> reportBuildersForGRET; private final Map>> reportBuildersForGREC; + private final Map>> reportBuildersForCX84; private final Imdg sessionImdg; @@ -88,6 +90,8 @@ public class ReportService extends QueueConsumerV2 implements InitializingBean { Map>> reportBuildersForGRET, @Qualifier("reportBuildersForGREC") Map>> reportBuildersForGREC, + @Qualifier("reportBuildersForCX84") + Map>> reportBuildersForCX84, @Qualifier("reportRequestValidator") Function reportRequestValidator, @@ -102,6 +106,9 @@ public class ReportService extends QueueConsumerV2 implements InitializingBean { Function reportRequestGREFValidator, @Qualifier("reportRequestGREFValidator") Function reportRequestGRECValidator, + @Qualifier("reportRequestCX84Validator") + Function reportRequestCX84Validator, + ImdgProvider imdgProvider, SFTPReportsConfig.ReportsGateway reportsSftpGateway @@ -117,10 +124,12 @@ public class ReportService extends QueueConsumerV2 implements InitializingBean { this.reportRequestGRETValidator = reportRequestGRETValidator; this.reportRequestGREFValidator = reportRequestGREFValidator; this.reportRequestGRECValidator = reportRequestGRECValidator; + this.reportRequestCX84Validator = reportRequestCX84Validator; this.reportBuildersForGREP = reportBuildersForGREP; this.reportBuildersForGREF = reportBuildersForGREF; this.reportBuildersForGRET = reportBuildersForGRET; this.reportBuildersForGREC = reportBuildersForGREC; + this.reportBuildersForCX84 = reportBuildersForCX84; this.reportsSftpGateway = reportsSftpGateway; this.sessionImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Session, Session.class); this.outFolder = new File(reportsServiceSettings.getReportsStore().getLocalTempDir()); @@ -154,6 +163,9 @@ public class ReportService extends QueueConsumerV2 implements InitializingBean { callback(LauncherCommandRequest.class) .setFunction(this::createReportForGREC) .forDestination(Task.createReport_GREC.topic(), callbacks::put); + callback(LauncherCommandRequest.class) + .setFunction(this::createReportForCX84) + .forDestination(Task.CX84.topic(), callbacks::put); init(); } @@ -342,6 +354,24 @@ public class ReportService extends QueueConsumerV2 implements InitializingBean { return null; } + public RequestInfoUpdate createReportForCX84(BaseRequest userRequest) { + log.debug("CX84 task received"); + + try { + RequestInfoUpdate requestInfoUpdate = validationHelper.validateTillFirstError(userRequest, reportRequestCX84Validator); + if (requestInfoUpdate != null) return null; + logUnknownProperties(userRequest); + + Map outFiles = createReportsForTask(List.of(), reportBuildersForCX84.values()); + + sendReportsToGateway(List.of(), outFiles, ReportType.REPORT_KS_LCC.getKey()); + sendFilesToSftp(outFiles.keySet()); + } catch (Exception e) { + log.error("Unexpected exception", e); + } + return null; + } + private Map createReportsForTask(List sessionIds, Collection>> buildersForTask) { Map outFiles = new HashMap<>(); int cntErrors = 0;