akulikov 2023-11-10 19:13:26 +03:00
parent fd25105fe8
commit a8386a9ed9
7 changed files with 147 additions and 22 deletions

View file

@ -43,13 +43,18 @@ public class KSCommissionTradesReport {
@CsvNumber(value = "#0.00", writeFormat = "#0.00") @CsvNumber(value = "#0.00", writeFormat = "#0.00")
private BigDecimal sum; private BigDecimal sum;
@CsvBindByName(column = "REPAYM_DATE") @CsvBindByName(column = "AGREEMENT_SETTLEMENT_DATE")
@CsvBindByPosition(position = 8) @CsvBindByPosition(position = 8)
@CsvDate(value = "dd.MM.yyyy") @CsvDate(value = "dd.MM.yyyy")
private LocalDate agreementSettlementDate;
@CsvBindByName(column = "REPAYM_DATE")
@CsvBindByPosition(position = 9)
@CsvDate(value = "dd.MM.yyyy")
private LocalDate repaymDate; private LocalDate repaymDate;
@CsvBindByName(column = "EXEC_STATUS") @CsvBindByName(column = "EXEC_STATUS")
@CsvBindByPosition(position = 9) @CsvBindByPosition(position = 10)
private String execStatus; private String execStatus;
@ -132,4 +137,12 @@ public class KSCommissionTradesReport {
public void setClassCode(String classCode) { public void setClassCode(String classCode) {
this.classCode = classCode; this.classCode = classCode;
} }
public LocalDate getAgreementSettlementDate() {
return agreementSettlementDate;
}
public void setAgreementSettlementDate(LocalDate agreementSettlementDate) {
this.agreementSettlementDate = agreementSettlementDate;
}
} }

View file

@ -23,39 +23,51 @@ public class KSRepTradesReport {
@CsvBindByPosition(position = 2) @CsvBindByPosition(position = 2)
private Long trId; private Long trId;
@CsvBindByName(column = "FIRM_ID") @CsvBindByName(column = "AGREEMENT_NUMBER")
@CsvBindByPosition(position = 3) @CsvBindByPosition(position = 3)
private String agreementNumber;
@CsvBindByName(column = "FIRM_ID")
@CsvBindByPosition(position = 4)
private String firmId; private String firmId;
@CsvBindByName(column = "TKR") @CsvBindByName(column = "TKR")
@CsvBindByPosition(position = 4) @CsvBindByPosition(position = 5)
private String tkr; private String tkr;
@CsvBindByName(column = "ACCOUNT")
@CsvBindByPosition(position = 6)
private String account;
@CsvBindByName(column = "DEPO_ACCOUNT")
@CsvBindByPosition(position = 7)
private String depoAccount;
@CsvBindByName(column = "CASH_LIABILITY") @CsvBindByName(column = "CASH_LIABILITY")
@CsvBindByPosition(position = 5) @CsvBindByPosition(position = 8)
@CsvNumber(value = "#0.00", writeFormat = "#0.00") @CsvNumber(value = "#0.00", writeFormat = "#0.00")
private BigDecimal cashLiability; private BigDecimal cashLiability;
@CsvBindByName(column = "DEPO_LIABILITY") @CsvBindByName(column = "DEPO_LIABILITY")
@CsvBindByPosition(position = 6) @CsvBindByPosition(position = 9)
@CsvNumber(value = "#0", writeFormat = "#0") @CsvNumber(value = "#0", writeFormat = "#0")
private BigDecimal depoLiability; private BigDecimal depoLiability;
@CsvBindByName(column = "TRADE_NUM") @CsvBindByName(column = "TRADE_NUM")
@CsvBindByPosition(position = 7) @CsvBindByPosition(position = 10)
private Long tradeNum; private Long tradeNum;
@CsvBindByName(column = "CLASS_CODE") @CsvBindByName(column = "CLASS_CODE")
@CsvBindByPosition(position = 8) @CsvBindByPosition(position = 11)
private String classCode; private String classCode;
@CsvBindByName(column = "TRADE_DATE") @CsvBindByName(column = "TRADE_DATE")
@CsvBindByPosition(position = 9) @CsvBindByPosition(position = 12)
@CsvDate(value = "dd.MM.yyyy'T'HH:mm:ss") @CsvDate(value = "dd.MM.yyyy'T'HH:mm:ss")
private LocalDateTime tradeDate; private LocalDateTime tradeDate;
@CsvBindByName(column = "STATUS") @CsvBindByName(column = "STATUS")
@CsvBindByPosition(position = 10) @CsvBindByPosition(position = 13)
private String status; private String status;
@ -146,4 +158,28 @@ public class KSRepTradesReport {
public void setStatus(String status) { public void setStatus(String status) {
this.status = status; this.status = status;
} }
public String getAgreementNumber() {
return agreementNumber;
}
public void setAgreementNumber(String agreementNumber) {
this.agreementNumber = agreementNumber;
}
public String getAccount() {
return account;
}
public void setAccount(String account) {
this.account = account;
}
public String getDepoAccount() {
return depoAccount;
}
public void setDepoAccount(String depoAccount) {
this.depoAccount = depoAccount;
}
} }

View file

@ -163,6 +163,7 @@ public class KSCommissionTradesReportBuilder extends CSVReportBuilder<EmptyParam
ksCommissionTradesReport.setSum(registry.getBalance() != null ? registry.getBalance().negate() : BigDecimal.ZERO); ksCommissionTradesReport.setSum(registry.getBalance() != null ? registry.getBalance().negate() : BigDecimal.ZERO);
ksCommissionTradesReport.setRepaymDate(registry.getRefundDate()); ksCommissionTradesReport.setRepaymDate(registry.getRefundDate());
ksCommissionTradesReport.setExecStatus(execStatus); ksCommissionTradesReport.setExecStatus(execStatus);
ksCommissionTradesReport.setAgreementSettlementDate(registry.getSettlementDate());
rows.add(ksCommissionTradesReport); rows.add(ksCommissionTradesReport);
} catch (Throwable e) { } catch (Throwable e) {

View file

@ -1,11 +1,11 @@
package ru.spcex.clearing.reports.builders.ks; package ru.spcex.clearing.reports.builders.ks;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
import ru.clearing.classes.statics.data.account.Account;
import ru.clearing.classes.statics.data.company.Company; import ru.clearing.classes.statics.data.company.Company;
import ru.clearing.classes.statics.data.execution.ExecutionCommon; import ru.clearing.classes.statics.data.execution.ExecutionCommon;
import ru.clearing.classes.statics.data.execution.ExecutionDeposit; import ru.clearing.classes.statics.data.execution.ExecutionDeposit;
import ru.clearing.classes.statics.data.execution.ExecutionFond; import ru.clearing.classes.statics.data.execution.ExecutionFond;
import ru.clearing.classes.statics.data.misc.Market;
import ru.clearing.classes.statics.data.misc.Session; import ru.clearing.classes.statics.data.misc.Session;
import ru.clearing.classes.statics.data.registry.Registry; import ru.clearing.classes.statics.data.registry.Registry;
import ru.clearing.classes.statics.data.registry.TradingClearingRegistry; import ru.clearing.classes.statics.data.registry.TradingClearingRegistry;
@ -24,20 +24,20 @@ import ru.spcex.platform.utils.enumeration.IEnumKey;
import java.math.BigDecimal; import java.math.BigDecimal;
import java.time.LocalDate; import java.time.LocalDate;
import java.time.LocalDateTime; import java.time.LocalDateTime;
import java.util.ArrayList; import java.time.format.DateTimeFormatter;
import java.util.Arrays; import java.util.*;
import java.util.Collection;
import java.util.List;
@Component @Component
public class KSRepTradesReportBuilder extends CSVReportBuilder<EmptyParams, KSRepTradesReport> { public class KSRepTradesReportBuilder extends CSVReportBuilder<EmptyParams, KSRepTradesReport> {
private final DateTimeFormatter ddMMyyyyFormatter = DateTimeFormatter.ofPattern("ddMMyyyy");
private final Imdg<ExecutionDeposit> executionDepositImdg; private final Imdg<ExecutionDeposit> executionDepositImdg;
private final Imdg<ExecutionFond> executionFondImdg; private final Imdg<ExecutionFond> executionFondImdg;
private final Imdg<Session> sessionImdg; private final Imdg<Session> sessionImdg;
private final Imdg<Registry> registryImdg; private final Imdg<Registry> registryImdg;
private final Imdg<Market> marketImdg;
private final Imdg<Company> companyImdg; private final Imdg<Company> companyImdg;
private final Imdg<TradingClearingRegistry> tradingClearingRegistryImdg; private final Imdg<TradingClearingRegistry> tradingClearingRegistryImdg;
private final Imdg<Account> accountImdg;
private List<KSRepTradesReport> rows = null; private List<KSRepTradesReport> rows = null;
@ -47,8 +47,8 @@ public class KSRepTradesReportBuilder extends CSVReportBuilder<EmptyParams, KSRe
sessionImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Session, Session.class); sessionImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Session, Session.class);
registryImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Registry, Registry.class); registryImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Registry, Registry.class);
companyImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Company, Company.class); companyImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Company, Company.class);
marketImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Market, Market.class);
tradingClearingRegistryImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_TradingClearingRegistry, TradingClearingRegistry.class); tradingClearingRegistryImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_TradingClearingRegistry, TradingClearingRegistry.class);
accountImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Account, Account.class);
} }
@Override @Override
@ -111,6 +111,28 @@ public class KSRepTradesReportBuilder extends CSVReportBuilder<EmptyParams, KSRe
ksRepTradesReport.setTkr(tkr.getCode()); ksRepTradesReport.setTkr(tkr.getCode());
String account = "";
if (tkr.getMoneyAccountId() != null) {
Account moneyAccountFromImdg = accountImdg.getSingleObjectByID(tkr.getMoneyAccountId());
if (moneyAccountFromImdg != null) {
if (AccountType.Info.equalsByKey(moneyAccountFromImdg.getAccountType())) {
moneyAccountFromImdg = accountImdg.getFirstObjectByFieldValues(Map.of(
"companyId", 1L,
"accountType", AccountType.Anlt.getKey()
));
}
account = moneyAccountFromImdg.getAccount();
}
}
ksRepTradesReport.setAccount(account);
String depoAccount = "";
if (tkr.getDepoAccountId() != null) {
Account depoAccountFromImdg = accountImdg.getSingleObjectByID(tkr.getDepoAccountId());
if (depoAccountFromImdg != null) depoAccount = depoAccountFromImdg.getAccount();
}
ksRepTradesReport.setDepoAccount(depoAccount);
if (execution.getCompanyId() != null) { if (execution.getCompanyId() != null) {
Company company = companyImdg.getSingleObjectByID(execution.getCompanyId()); Company company = companyImdg.getSingleObjectByID(execution.getCompanyId());
ksRepTradesReport.setFirmId(company != null ? company.getTradingCode() : null); ksRepTradesReport.setFirmId(company != null ? company.getTradingCode() : null);
@ -128,7 +150,9 @@ public class KSRepTradesReportBuilder extends CSVReportBuilder<EmptyParams, KSRe
continue; continue;
} }
String agreementNumber = "";
if (execution instanceof ExecutionDeposit executionDeposit) { if (execution instanceof ExecutionDeposit executionDeposit) {
agreementNumber = executionDeposit.getContract();
BigDecimal firstLegAmount = executionDeposit.getFirstLegAmount() != null ? executionDeposit.getFirstLegAmount() : BigDecimal.ZERO; BigDecimal firstLegAmount = executionDeposit.getFirstLegAmount() != null ? executionDeposit.getFirstLegAmount() : BigDecimal.ZERO;
String sideStr = executionDeposit.getSide(); String sideStr = executionDeposit.getSide();
Side side = IEnumKey.getEnumByKey(Side.class, sideStr); Side side = IEnumKey.getEnumByKey(Side.class, sideStr);
@ -145,22 +169,51 @@ public class KSRepTradesReportBuilder extends CSVReportBuilder<EmptyParams, KSRe
ksRepTradesReport.setCashLiability(firstLegAmount); ksRepTradesReport.setCashLiability(firstLegAmount);
ksRepTradesReport.setDepoLiability(BigDecimal.ZERO); ksRepTradesReport.setDepoLiability(BigDecimal.ZERO);
} else if (execution instanceof ExecutionFond executionFond) { } else if (execution instanceof ExecutionFond executionFond) {
Company company = null;
BigDecimal settlementAmount = executionFond.getSettlementAmount() != null ? executionFond.getSettlementAmount() : BigDecimal.ZERO; BigDecimal settlementAmount = executionFond.getSettlementAmount() != null ? executionFond.getSettlementAmount() : BigDecimal.ZERO;
if (Arrays.asList(Side.BUY.getKey(), "B","BUY").contains(executionFond.getSide())) { if (Arrays.asList(Side.BUY.getKey(), "B","BUY").contains(executionFond.getSide())) {
settlementAmount = settlementAmount.negate(); settlementAmount = settlementAmount.negate();
ksRepTradesReport.setCashLiability(settlementAmount); ksRepTradesReport.setCashLiability(settlementAmount);
if (executionFond.getCompanyId() != null)
company = companyImdg.getSingleObjectByID(executionFond.getCompanyId());
} else if (Arrays.asList(Side.SELL.getKey(), "S","SELL").contains(executionFond.getSide())) { } else if (Arrays.asList(Side.SELL.getKey(), "S","SELL").contains(executionFond.getSide())) {
ksRepTradesReport.setCashLiability(settlementAmount); ksRepTradesReport.setCashLiability(settlementAmount);
if (executionFond.getCounterPartyId() != null)
company = companyImdg.getSingleObjectByID(executionFond.getCounterPartyId());
} else { } else {
log.warn("Execution id={} has unknown side={}", executionFond.getId(), executionFond.getSide()); log.warn("Execution id={} has unknown side={}", executionFond.getId(), executionFond.getSide());
continue; continue;
} }
if (
executionFond.getSecuritySymbol() == null || company == null ||
company.getTradingCode() == null || executionFond.getExchangeExecutionId() == null
) {
log.warn("Can't format agreement number for execution id={}, security_symbol={}, " +
"executionFond.trading_date={}, company.trading_code={}, " +
"executionFond.exchange_execution_id={}",
execution.getId(),
executionFond.getSecuritySymbol(),
ddMMyyyyFormatter.format(executionFond.getTradingDate()),
company != null ? company.getTradingCode() : null,
executionFond.getExchangeExecutionId());
continue;
}
agreementNumber = "%s/%s/%s/%s".formatted(
executionFond.getSecuritySymbol(),
ddMMyyyyFormatter.format(executionFond.getTradingDate()),
company.getTradingCode(),
executionFond.getExchangeExecutionId()
);
BigDecimal quantity = executionFond.getQuantity() != null ? executionFond.getQuantity() : BigDecimal.ZERO; BigDecimal quantity = executionFond.getQuantity() != null ? executionFond.getQuantity() : BigDecimal.ZERO;
if (Arrays.asList(Side.SELL.getKey(), "S", "SELL").contains((executionFond.getSide()))) if (Arrays.asList(Side.SELL.getKey(), "S", "SELL").contains((executionFond.getSide())))
quantity = quantity.negate(); quantity = quantity.negate();
ksRepTradesReport.setDepoLiability(quantity); ksRepTradesReport.setDepoLiability(quantity);
} }
ksRepTradesReport.setAgreementNumber(agreementNumber);
ksRepTradesReport.setTradeNum(execution.getExchangeExecutionId()); ksRepTradesReport.setTradeNum(execution.getExchangeExecutionId());
ksRepTradesReport.setClassCode(execution.getMarket()); ksRepTradesReport.setClassCode(execution.getMarket());

View file

@ -596,9 +596,28 @@ public class ReportServiceTest_KS {
session_2.setCreated(Instant.ofEpochMilli(LocalDateTime.of(2022, 6, 30, 0, 0, 0).toEpochSecond(ZoneOffset.UTC))); session_2.setCreated(Instant.ofEpochMilli(LocalDateTime.of(2022, 6, 30, 0, 0, 0).toEpochSecond(ZoneOffset.UTC)));
Long sessionId_2 = sessionImdg.insert(session_2); Long sessionId_2 = sessionImdg.insert(session_2);
ExecutionFond executionFond_2 = new ExecutionFond();
executionFond_2.setSecuritySymbol("SEC_SYM");
executionFond_2.setExchangeExecutionId(666L);
executionFond_2.setMarket("3333");
executionFond_2.setCompanyId(COMPANY_ID);
executionFond_2.setTradingDate(LocalDate.now());
executionFond_2.setSide(MoneyFlowSide.BUY.getKey());
executionFond_2.setSessionId(sessionId_1);
executionFond_2.setTradingClearingRegistryId(tkrId);
executionFond_2.setSettlementAmount(BigDecimal.valueOf(8888.888888));
executionFond_2.setQuantity(BigDecimal.valueOf(123.456789));
executionFond_2.setExchangeExecutionId(222L);
executionFond_2.setExchangeExecutionTime(Instant.ofEpochMilli(LocalDateTime.of(2022, 1, 1, 1, 1, 1).toEpochSecond(ZoneOffset.UTC)));
executionFond_2.setCoverageStatus(CoverageStatus.ALWD.getKey());
executionFondImdg.insert(executionFond_2);
ExecutionFond executionFond = new ExecutionFond(); ExecutionFond executionFond = new ExecutionFond();
executionFond.setExchangeExecutionId(888L);
executionFond.setSecuritySymbol("SEC_SYM");
executionFond.setMarket("3333"); executionFond.setMarket("3333");
executionFond.setCompanyId(COMPANY_ID); executionFond.setCompanyId(COMPANY_ID);
executionFond.setCounterPartyId(COMPANY_ID);
executionFond.setTradingDate(LocalDate.now()); executionFond.setTradingDate(LocalDate.now());
executionFond.setSide(MoneyFlowSide.SELL.getKey()); executionFond.setSide(MoneyFlowSide.SELL.getKey());
executionFond.setSessionId(sessionId_1); executionFond.setSessionId(sessionId_1);
@ -628,6 +647,7 @@ public class ReportServiceTest_KS {
ExecutionDeposit executionDeposit = new ExecutionDeposit(); ExecutionDeposit executionDeposit = new ExecutionDeposit();
executionDeposit.setMarket("3333"); executionDeposit.setMarket("3333");
executionDeposit.setCompanyId(COMPANY_ID); executionDeposit.setCompanyId(COMPANY_ID);
executionDeposit.setContract("CONTRACT");
executionDeposit.setTradingDate(LocalDate.now()); executionDeposit.setTradingDate(LocalDate.now());
executionDeposit.setSide(Side.BUY.getKey()); executionDeposit.setSide(Side.BUY.getKey());
executionDeposit.setSessionId(sessionId_2); executionDeposit.setSessionId(sessionId_2);
@ -979,6 +999,7 @@ public class ReportServiceTest_KS {
registry.setGroupId(23071812300L); registry.setGroupId(23071812300L);
registry.setSessionType(SessionType.XDEP.getKey()); registry.setSessionType(SessionType.XDEP.getKey());
registry.setValueDate(LocalDate.now().minusDays(10)); registry.setValueDate(LocalDate.now().minusDays(10));
registry.setSettlementDate(LocalDate.of(2022, 1, 2));
registryImdg.insert(registry); registryImdg.insert(registry);
Registry omtRegistry = new Registry(); Registry omtRegistry = new Registry();

View file

@ -1,2 +1,2 @@
"FIRM_ID","FIRM_ID_INITIATOR","SECCODE","CLASS_CODE","AGREEMENT_NUMBER","AGREEMENT_NUMBER_POSTFIX","AGREEMENT_DATE","SUM","REPAYM_DATE","EXEC_STATUS" "FIRM_ID","FIRM_ID_INITIATOR","SECCODE","CLASS_CODE","AGREEMENT_NUMBER","AGREEMENT_NUMBER_POSTFIX","AGREEMENT_DATE","SUM","AGREEMENT_SETTLEMENT_DATE","REPAYM_DATE","EXEC_STATUS"
"CLEARING_CODE","TRADING_CODE","CONT~RACT","market","CONT","CONT~RACT","01.01.1991","-77.78","05.09.2023","Исполнен" "CLEARING_CODE","TRADING_CODE","CONT~RACT","market","CONT","CONT~RACT","01.01.1991","-77.78","02.01.2022","10.11.2023","Исполнен"

1 FIRM_ID FIRM_ID_INITIATOR SECCODE CLASS_CODE AGREEMENT_NUMBER AGREEMENT_NUMBER_POSTFIX AGREEMENT_DATE SUM AGREEMENT_SETTLEMENT_DATE REPAYM_DATE EXEC_STATUS
2 CLEARING_CODE TRADING_CODE CONT~RACT market CONT CONT~RACT 01.01.1991 -77.78 02.01.2022 05.09.2023 10.11.2023 Исполнен

View file

@ -1,3 +1,4 @@
"SESSION_ID","SESSION_DATE","TR_ID","FIRM_ID","TKR","CASH_LIABILITY","DEPO_LIABILITY","TRADE_NUM","CLASS_CODE","TRADE_DATE","STATUS" "SESSION_ID","SESSION_DATE","TR_ID","AGREEMENT_NUMBER","FIRM_ID","TKR","ACCOUNT","DEPO_ACCOUNT","CASH_LIABILITY","DEPO_LIABILITY","TRADE_NUM","CLASS_CODE","TRADE_DATE","STATUS"
"4","20.01.1970T07:09:07","8","TRADING_CODE","TKR","8888.89","0","222",3333,"20.01.1970T02:49:58","0" "4","20.01.1970T07:09:07","222","CONTRACT","TRADING_CODE","TKR","","","8888.89","0","222","3333","20.01.1970T02:49:58","0"
"3","20.01.1970T15:54:43","5","TRADING_CODE","TKR","8888.89","-123","222",3333,"20.01.1970T02:49:58","1" "3","20.01.1970T15:54:43","222","SEC_SYM/10112023/TRADING_CODE/222","TRADING_CODE","TKR","","","-8888.89","123","222","3333","20.01.1970T02:49:58","1"
"3","20.01.1970T15:54:43","222","SEC_SYM/10112023/TRADING_CODE/222","TRADING_CODE","TKR","","","8888.89","-123","222","3333","20.01.1970T02:49:58","1"

1 SESSION_ID SESSION_DATE TR_ID AGREEMENT_NUMBER FIRM_ID TKR ACCOUNT DEPO_ACCOUNT CASH_LIABILITY DEPO_LIABILITY TRADE_NUM CLASS_CODE TRADE_DATE STATUS
2 4 20.01.1970T07:09:07 8 222 CONTRACT TRADING_CODE TKR 8888.89 0 222 3333 20.01.1970T02:49:58 0
3 3 20.01.1970T15:54:43 5 222 SEC_SYM/10112023/TRADING_CODE/222 TRADING_CODE TKR 8888.89 -8888.89 -123 123 222 3333 20.01.1970T02:49:58 1
4 3 20.01.1970T15:54:43 222 SEC_SYM/10112023/TRADING_CODE/222 TRADING_CODE TKR 8888.89 -123 222 3333 20.01.1970T02:49:58 1