This commit is contained in:
parent
fd25105fe8
commit
a8386a9ed9
7 changed files with 147 additions and 22 deletions
|
|
@ -43,13 +43,18 @@ public class KSCommissionTradesReport {
|
|||
@CsvNumber(value = "#0.00", writeFormat = "#0.00")
|
||||
private BigDecimal sum;
|
||||
|
||||
@CsvBindByName(column = "REPAYM_DATE")
|
||||
@CsvBindByName(column = "AGREEMENT_SETTLEMENT_DATE")
|
||||
@CsvBindByPosition(position = 8)
|
||||
@CsvDate(value = "dd.MM.yyyy")
|
||||
private LocalDate agreementSettlementDate;
|
||||
|
||||
@CsvBindByName(column = "REPAYM_DATE")
|
||||
@CsvBindByPosition(position = 9)
|
||||
@CsvDate(value = "dd.MM.yyyy")
|
||||
private LocalDate repaymDate;
|
||||
|
||||
@CsvBindByName(column = "EXEC_STATUS")
|
||||
@CsvBindByPosition(position = 9)
|
||||
@CsvBindByPosition(position = 10)
|
||||
private String execStatus;
|
||||
|
||||
|
||||
|
|
@ -132,4 +137,12 @@ public class KSCommissionTradesReport {
|
|||
public void setClassCode(String classCode) {
|
||||
this.classCode = classCode;
|
||||
}
|
||||
|
||||
public LocalDate getAgreementSettlementDate() {
|
||||
return agreementSettlementDate;
|
||||
}
|
||||
|
||||
public void setAgreementSettlementDate(LocalDate agreementSettlementDate) {
|
||||
this.agreementSettlementDate = agreementSettlementDate;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -23,39 +23,51 @@ public class KSRepTradesReport {
|
|||
@CsvBindByPosition(position = 2)
|
||||
private Long trId;
|
||||
|
||||
@CsvBindByName(column = "FIRM_ID")
|
||||
@CsvBindByName(column = "AGREEMENT_NUMBER")
|
||||
@CsvBindByPosition(position = 3)
|
||||
private String agreementNumber;
|
||||
|
||||
@CsvBindByName(column = "FIRM_ID")
|
||||
@CsvBindByPosition(position = 4)
|
||||
private String firmId;
|
||||
|
||||
@CsvBindByName(column = "TKR")
|
||||
@CsvBindByPosition(position = 4)
|
||||
@CsvBindByPosition(position = 5)
|
||||
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")
|
||||
@CsvBindByPosition(position = 5)
|
||||
@CsvBindByPosition(position = 8)
|
||||
@CsvNumber(value = "#0.00", writeFormat = "#0.00")
|
||||
private BigDecimal cashLiability;
|
||||
|
||||
@CsvBindByName(column = "DEPO_LIABILITY")
|
||||
@CsvBindByPosition(position = 6)
|
||||
@CsvBindByPosition(position = 9)
|
||||
@CsvNumber(value = "#0", writeFormat = "#0")
|
||||
private BigDecimal depoLiability;
|
||||
|
||||
@CsvBindByName(column = "TRADE_NUM")
|
||||
@CsvBindByPosition(position = 7)
|
||||
@CsvBindByPosition(position = 10)
|
||||
private Long tradeNum;
|
||||
|
||||
@CsvBindByName(column = "CLASS_CODE")
|
||||
@CsvBindByPosition(position = 8)
|
||||
@CsvBindByPosition(position = 11)
|
||||
private String classCode;
|
||||
|
||||
@CsvBindByName(column = "TRADE_DATE")
|
||||
@CsvBindByPosition(position = 9)
|
||||
@CsvBindByPosition(position = 12)
|
||||
@CsvDate(value = "dd.MM.yyyy'T'HH:mm:ss")
|
||||
private LocalDateTime tradeDate;
|
||||
|
||||
@CsvBindByName(column = "STATUS")
|
||||
@CsvBindByPosition(position = 10)
|
||||
@CsvBindByPosition(position = 13)
|
||||
private String status;
|
||||
|
||||
|
||||
|
|
@ -146,4 +158,28 @@ public class KSRepTradesReport {
|
|||
public void setStatus(String 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;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -163,6 +163,7 @@ public class KSCommissionTradesReportBuilder extends CSVReportBuilder<EmptyParam
|
|||
ksCommissionTradesReport.setSum(registry.getBalance() != null ? registry.getBalance().negate() : BigDecimal.ZERO);
|
||||
ksCommissionTradesReport.setRepaymDate(registry.getRefundDate());
|
||||
ksCommissionTradesReport.setExecStatus(execStatus);
|
||||
ksCommissionTradesReport.setAgreementSettlementDate(registry.getSettlementDate());
|
||||
|
||||
rows.add(ksCommissionTradesReport);
|
||||
} catch (Throwable e) {
|
||||
|
|
|
|||
|
|
@ -1,11 +1,11 @@
|
|||
package ru.spcex.clearing.reports.builders.ks;
|
||||
|
||||
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.execution.ExecutionCommon;
|
||||
import ru.clearing.classes.statics.data.execution.ExecutionDeposit;
|
||||
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.registry.Registry;
|
||||
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.time.LocalDate;
|
||||
import java.time.LocalDateTime;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Arrays;
|
||||
import java.util.Collection;
|
||||
import java.util.List;
|
||||
import java.time.format.DateTimeFormatter;
|
||||
import java.util.*;
|
||||
|
||||
@Component
|
||||
public class KSRepTradesReportBuilder extends CSVReportBuilder<EmptyParams, KSRepTradesReport> {
|
||||
private final DateTimeFormatter ddMMyyyyFormatter = DateTimeFormatter.ofPattern("ddMMyyyy");
|
||||
|
||||
private final Imdg<ExecutionDeposit> executionDepositImdg;
|
||||
private final Imdg<ExecutionFond> executionFondImdg;
|
||||
private final Imdg<Session> sessionImdg;
|
||||
private final Imdg<Registry> registryImdg;
|
||||
private final Imdg<Market> marketImdg;
|
||||
private final Imdg<Company> companyImdg;
|
||||
private final Imdg<TradingClearingRegistry> tradingClearingRegistryImdg;
|
||||
private final Imdg<Account> accountImdg;
|
||||
|
||||
private List<KSRepTradesReport> rows = null;
|
||||
|
||||
|
|
@ -47,8 +47,8 @@ public class KSRepTradesReportBuilder extends CSVReportBuilder<EmptyParams, KSRe
|
|||
sessionImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Session, Session.class);
|
||||
registryImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Registry, Registry.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);
|
||||
accountImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Account, Account.class);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
|
@ -111,6 +111,28 @@ public class KSRepTradesReportBuilder extends CSVReportBuilder<EmptyParams, KSRe
|
|||
|
||||
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) {
|
||||
Company company = companyImdg.getSingleObjectByID(execution.getCompanyId());
|
||||
ksRepTradesReport.setFirmId(company != null ? company.getTradingCode() : null);
|
||||
|
|
@ -128,7 +150,9 @@ public class KSRepTradesReportBuilder extends CSVReportBuilder<EmptyParams, KSRe
|
|||
continue;
|
||||
}
|
||||
|
||||
String agreementNumber = "";
|
||||
if (execution instanceof ExecutionDeposit executionDeposit) {
|
||||
agreementNumber = executionDeposit.getContract();
|
||||
BigDecimal firstLegAmount = executionDeposit.getFirstLegAmount() != null ? executionDeposit.getFirstLegAmount() : BigDecimal.ZERO;
|
||||
String sideStr = executionDeposit.getSide();
|
||||
Side side = IEnumKey.getEnumByKey(Side.class, sideStr);
|
||||
|
|
@ -145,22 +169,51 @@ public class KSRepTradesReportBuilder extends CSVReportBuilder<EmptyParams, KSRe
|
|||
ksRepTradesReport.setCashLiability(firstLegAmount);
|
||||
ksRepTradesReport.setDepoLiability(BigDecimal.ZERO);
|
||||
} else if (execution instanceof ExecutionFond executionFond) {
|
||||
|
||||
Company company = null;
|
||||
BigDecimal settlementAmount = executionFond.getSettlementAmount() != null ? executionFond.getSettlementAmount() : BigDecimal.ZERO;
|
||||
if (Arrays.asList(Side.BUY.getKey(), "B","BUY").contains(executionFond.getSide())) {
|
||||
settlementAmount = settlementAmount.negate();
|
||||
ksRepTradesReport.setCashLiability(settlementAmount);
|
||||
if (executionFond.getCompanyId() != null)
|
||||
company = companyImdg.getSingleObjectByID(executionFond.getCompanyId());
|
||||
} else if (Arrays.asList(Side.SELL.getKey(), "S","SELL").contains(executionFond.getSide())) {
|
||||
ksRepTradesReport.setCashLiability(settlementAmount);
|
||||
if (executionFond.getCounterPartyId() != null)
|
||||
company = companyImdg.getSingleObjectByID(executionFond.getCounterPartyId());
|
||||
} else {
|
||||
log.warn("Execution id={} has unknown side={}", executionFond.getId(), executionFond.getSide());
|
||||
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;
|
||||
if (Arrays.asList(Side.SELL.getKey(), "S", "SELL").contains((executionFond.getSide())))
|
||||
quantity = quantity.negate();
|
||||
ksRepTradesReport.setDepoLiability(quantity);
|
||||
}
|
||||
|
||||
ksRepTradesReport.setAgreementNumber(agreementNumber);
|
||||
ksRepTradesReport.setTradeNum(execution.getExchangeExecutionId());
|
||||
ksRepTradesReport.setClassCode(execution.getMarket());
|
||||
|
||||
|
|
|
|||
|
|
@ -596,9 +596,28 @@ public class ReportServiceTest_KS {
|
|||
session_2.setCreated(Instant.ofEpochMilli(LocalDateTime.of(2022, 6, 30, 0, 0, 0).toEpochSecond(ZoneOffset.UTC)));
|
||||
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.setExchangeExecutionId(888L);
|
||||
executionFond.setSecuritySymbol("SEC_SYM");
|
||||
executionFond.setMarket("3333");
|
||||
executionFond.setCompanyId(COMPANY_ID);
|
||||
executionFond.setCounterPartyId(COMPANY_ID);
|
||||
executionFond.setTradingDate(LocalDate.now());
|
||||
executionFond.setSide(MoneyFlowSide.SELL.getKey());
|
||||
executionFond.setSessionId(sessionId_1);
|
||||
|
|
@ -628,6 +647,7 @@ public class ReportServiceTest_KS {
|
|||
ExecutionDeposit executionDeposit = new ExecutionDeposit();
|
||||
executionDeposit.setMarket("3333");
|
||||
executionDeposit.setCompanyId(COMPANY_ID);
|
||||
executionDeposit.setContract("CONTRACT");
|
||||
executionDeposit.setTradingDate(LocalDate.now());
|
||||
executionDeposit.setSide(Side.BUY.getKey());
|
||||
executionDeposit.setSessionId(sessionId_2);
|
||||
|
|
@ -979,6 +999,7 @@ public class ReportServiceTest_KS {
|
|||
registry.setGroupId(23071812300L);
|
||||
registry.setSessionType(SessionType.XDEP.getKey());
|
||||
registry.setValueDate(LocalDate.now().minusDays(10));
|
||||
registry.setSettlementDate(LocalDate.of(2022, 1, 2));
|
||||
registryImdg.insert(registry);
|
||||
|
||||
Registry omtRegistry = new Registry();
|
||||
|
|
|
|||
|
|
@ -1,2 +1,2 @@
|
|||
"FIRM_ID","FIRM_ID_INITIATOR","SECCODE","CLASS_CODE","AGREEMENT_NUMBER","AGREEMENT_NUMBER_POSTFIX","AGREEMENT_DATE","SUM","REPAYM_DATE","EXEC_STATUS"
|
||||
"CLEARING_CODE","TRADING_CODE","CONT~RACT","market","CONT","CONT~RACT","01.01.1991","-77.78","05.09.2023","Исполнен"
|
||||
"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","02.01.2022","10.11.2023","Исполнен"
|
||||
|
|
|
|||
|
|
|
@ -1,3 +1,4 @@
|
|||
"SESSION_ID","SESSION_DATE","TR_ID","FIRM_ID","TKR","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"
|
||||
"3","20.01.1970T15:54:43","5","TRADING_CODE","TKR","8888.89","-123","222",3333,"20.01.1970T02:49:58","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"
|
||||
"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","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"
|
||||
|
|
|
|||
|
Loading…
Add table
Reference in a new issue