fix SDF57Executor and registryBuilder

This commit is contained in:
etreschenkov 2023-05-27 13:11:06 +03:00
parent 8ea3397e16
commit 56441c39cb
3 changed files with 53 additions and 13 deletions

View file

@ -7,6 +7,7 @@ import ru.clearing.classes.statics.data.payment.PaymentInstruction;
import ru.clearing.classes.statics.data.registry.Registry; import ru.clearing.classes.statics.data.registry.Registry;
import ru.spcex.clearing.imdg.IMDGDistributedNames; import ru.spcex.clearing.imdg.IMDGDistributedNames;
import ru.spcex.platform.enumeration.CompanySymbol; import ru.spcex.platform.enumeration.CompanySymbol;
import ru.spcex.platform.enumeration.InOutDirection;
import ru.spcex.platform.imdg.api.Imdg; import ru.spcex.platform.imdg.api.Imdg;
import ru.spcex.platform.imdg.api.ImdgProvider; import ru.spcex.platform.imdg.api.ImdgProvider;
@ -66,7 +67,7 @@ public class PaymentInstructionBuilder {
} }
paymentInstruction.setDebitLeg_accountId(registry.getAccountId()); paymentInstruction.setDebitLeg_accountId(registry.getAccountId());
paymentInstruction.setDebitLeg_direction(InOutDirection.in.getKey());
// Account account = accountImdg.getSingleObjectByID(registry.get()); // Account account = accountImdg.getSingleObjectByID(registry.get());
// paymentInstruction.setDebitLeg_account(); // paymentInstruction.setDebitLeg_account();
return paymentInstruction; return paymentInstruction;

View file

@ -171,11 +171,12 @@ public class Sdf57Executor extends AbstractExecutor<SDf57> {
Registry registry = createRegistryByStatement(stmt, company, account, dsgn); Registry registry = createRegistryByStatement(stmt, company, account, dsgn);
Registry registryB = registry.clone(); Registry registryB = registry.clone();
registryB.setId(imdgProvider.getImdgIdGenerator().nextId());
registryB.setRegistryUnit(RegistryUnit.B.getKey()); registryB.setRegistryUnit(RegistryUnit.B.getKey());
registryB.setRegistryCode(RegistryUtil.clearingCode(registryB)); registryB.setRegistryCode(RegistryUtil.clearingCode(registryB));
registryB.setId(imdgProvider.getImdgIdGenerator().nextId());
registryB.setBalance(BigDecimal.ZERO); registryB.setBalance(BigDecimal.ZERO);
registryB.setDebit(BigDecimal.ZERO); registryB.setDebit(BigDecimal.ZERO);
registryB.setCredit(BigDecimal.ZERO);
Registry registryF = registry.clone(); Registry registryF = registry.clone();
registryF.setRegistryUnit(RegistryUnit.F.getKey()); registryF.setRegistryUnit(RegistryUnit.F.getKey());
@ -291,10 +292,13 @@ public class Sdf57Executor extends AbstractExecutor<SDf57> {
//Если значение statement.inOutDirection=OUT, то: //Если значение statement.inOutDirection=OUT, то:
//= текущее значение registry.balance - statement.amount //= текущее значение registry.balance - statement.amount
switch (inOutDirection) { switch (inOutDirection) {
case in -> rgs.setBalance(statement.getAmount()); case in -> {
rgs.setBalance(statement.getAmount());
rgs.setCredit(statement.getAmount());
}
case out -> { case out -> {
rgs.setBalance(statement.getAmount().negate()); rgs.setBalance(statement.getAmount().negate());
rgs.setDebit(statement.getAmount()); rgs.setDebit(statement.getAmount().negate());
} }
} }
rgs.setBalanceDimension(BalanceDimension.MONY.getKey()); //fixme ! смотри описание и ссылка на начало html'ки rgs.setBalanceDimension(BalanceDimension.MONY.getKey()); //fixme ! смотри описание и ссылка на начало html'ки

View file

@ -2,10 +2,13 @@ package ru.spcex.clearing.session.stage.impl;
import ru.clearing.classes.statics.data.account.Account; import ru.clearing.classes.statics.data.account.Account;
import ru.clearing.classes.statics.data.account.ClearingAccount; import ru.clearing.classes.statics.data.account.ClearingAccount;
import ru.clearing.classes.statics.data.account.DepoAccount;
import ru.clearing.classes.statics.data.account.InformationAccount;
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.Currency;
import ru.clearing.classes.statics.data.misc.Market; 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;
@ -20,6 +23,7 @@ import ru.spcex.platform.imdg.api.ImdgProvider;
import java.time.Instant; import java.time.Instant;
import java.time.LocalDate; import java.time.LocalDate;
import java.time.format.DateTimeFormatter; import java.time.format.DateTimeFormatter;
import java.util.Map;
public class RegistryBuilder { public class RegistryBuilder {
private Imdg<Company> companyImdg; private Imdg<Company> companyImdg;
@ -28,6 +32,9 @@ public class RegistryBuilder {
private Imdg<Market> marketImdg; private Imdg<Market> marketImdg;
private Imdg<Session> sessionImdg; private Imdg<Session> sessionImdg;
private Imdg<ClearingAccount> clearingAccountImdg; private Imdg<ClearingAccount> clearingAccountImdg;
private Imdg<InformationAccount> informationAccountImdg;
private Imdg<DepoAccount> depoAccountImdg;
private Imdg<Currency> currencyImdg;
private ExecutionCommon exec; private ExecutionCommon exec;
private RegistryDesignation regDsgn; private RegistryDesignation regDsgn;
@ -45,6 +52,9 @@ public class RegistryBuilder {
this.marketImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Market, Market.class); this.marketImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Market, Market.class);
this.sessionImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Session, Session.class); this.sessionImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Session, Session.class);
this.clearingAccountImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_ClearingAccount, ClearingAccount.class); this.clearingAccountImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_ClearingAccount, ClearingAccount.class);
this.depoAccountImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_DepoAccount, DepoAccount.class);
this.informationAccountImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_InformationAccount, InformationAccount.class);
this.currencyImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Currency, Currency.class);
return this; return this;
} }
@ -69,32 +79,51 @@ public class RegistryBuilder {
reg.setShortName(company.getShortName()); reg.setShortName(company.getShortName());
reg.setFullName(company.getFullName()); reg.setFullName(company.getFullName());
TradingClearingRegistry tcr = searchTradingClearingRegistry(); TradingClearingRegistry tcr = searchTradingClearingRegistry();
ClearingAccount accountForStatement = null; String capacityByAccount = null;
boolean isMoney = false;
Account account = accountImdg.getSingleObjectByID(reg.getAccountId());
if ((regDsgn.equals(RegistryDesignation.O) && side.isBuy()) || (regDsgn.equals(RegistryDesignation.T) && side.isSell())) { if ((regDsgn.equals(RegistryDesignation.O) && side.isBuy()) || (regDsgn.equals(RegistryDesignation.T) && side.isSell())) {
isMoney = true;
reg.setAccountId(tcr.getMoneyAccountId()); reg.setAccountId(tcr.getMoneyAccountId());
reg.setRegistryInstrumentType(RegistryInstrumentType.M.getKey()); reg.setRegistryInstrumentType(RegistryInstrumentType.M.getKey());
reg.setBalanceDimension(BalanceDimension.MONY.getKey()); //fixme add second leg code branch reg.setBalanceDimension(BalanceDimension.MONY.getKey()); //fixme add second leg code branch
accountForStatement = clearingAccountImdg.getSingleObjectByID(tcr.getMoneyAccountId()); Currency currency = currencyImdg.getSingleObjectByFieldValues(Map.of("currencyCode", exec.getSettlementCurrency()));
reg.setSecurityId(currency.getId());
reg.setSecuritySymbol(currency.getCurrencyCode());
if (AccountType.Clrn.equalsByKey(account.getAccountType())) {
ClearingAccount clearingAccount = clearingAccountImdg.getSingleObjectByID(tcr.getMoneyAccountId());
if (clearingAccount != null) {
capacityByAccount = clearingAccount.getClearingAccountType();
}
} else if (AccountType.Info.equalsByKey(account.getAccountType())){
InformationAccount informationAccount = informationAccountImdg.getSingleObjectByID(tcr.getMoneyAccountId());
if (informationAccount != null) {
capacityByAccount = "A"; //todo сделать enum
}
}
} else if ((regDsgn.equals(RegistryDesignation.T) && side.isBuy()) || (regDsgn.equals(RegistryDesignation.O) && side.isSell())) { } else if ((regDsgn.equals(RegistryDesignation.T) && side.isBuy()) || (regDsgn.equals(RegistryDesignation.O) && side.isSell())) {
isMoney = false;
reg.setAccountId(tcr.getDepoAccountId()); reg.setAccountId(tcr.getDepoAccountId());
reg.setRegistryInstrumentType(RegistryInstrumentType.S.getKey()); reg.setRegistryInstrumentType(RegistryInstrumentType.S.getKey());
reg.setBalanceDimension(BalanceDimension.PICS.getKey()); //fixme add second leg code branch reg.setBalanceDimension(BalanceDimension.PICS.getKey()); //fixme add second leg code branch
accountForStatement = clearingAccountImdg.getSingleObjectByID(tcr.getDepoAccountId()); reg.setSecurityId(exec.getSecurityId());
reg.setSecuritySymbol(exec.getSecuritySymbol());
DepoAccount depoAccount = depoAccountImdg.getSingleObjectByID(tcr.getDepoAccountId());
if (depoAccount != null) {
capacityByAccount = depoAccount.getDepoAccountType();
}
} }
Account account = accountImdg.getSingleObjectByID(reg.getAccountId());
reg.setAccountType(account.getAccountType()); reg.setAccountType(account.getAccountType());
reg.setAccount(account.getAccount()); reg.setAccount(account.getAccount());
reg.setRegistryDesignation(regDsgn.getKey()); reg.setRegistryDesignation(regDsgn.getKey());
if (accountForStatement != null) { if (capacityByAccount != null) {
reg.setRegistryCapacity(accountForStatement.getClearingAccountType()); reg.setRegistryCapacity(capacityByAccount);
} }
reg.setRegistryUnit(RegistryUnit.T.getKey()); reg.setRegistryUnit(RegistryUnit.T.getKey());
reg.setRegistryCode(RegistryUtil.clearingCode(reg)); reg.setRegistryCode(RegistryUtil.clearingCode(reg));
reg.setTradingClearingRegistryId(exec.getTradingClearingRegistryId()); reg.setTradingClearingRegistryId(exec.getTradingClearingRegistryId());
reg.setTradingClearingRegistry(tcr.getCode()); reg.setTradingClearingRegistry(tcr.getCode());
reg.setRegistryStatus(RegistryStatus.PROC.getKey()); reg.setRegistryStatus(RegistryStatus.PROC.getKey());
reg.setSecurityId(exec.getSecurityId());
reg.setSecuritySymbol(exec.getSecuritySymbol());
switch (exec.type()) { switch (exec.type()) {
case ExecutionDeposit -> { case ExecutionDeposit -> {
ExecutionDeposit execDep = (ExecutionDeposit) this.exec; ExecutionDeposit execDep = (ExecutionDeposit) this.exec;
@ -112,7 +141,13 @@ public class RegistryBuilder {
} }
case ExecutionFond -> { case ExecutionFond -> {
ExecutionFond execFond = (ExecutionFond) this.exec; ExecutionFond execFond = (ExecutionFond) this.exec;
reg.setBalance(execFond.getSettlementAmount()); if (isMoney) {
//todo ОКРУГЛЕНИЕ(fixedIncomeSecurity.nominalValue * quantity * price/100) + ОКРУГЛЕНИЕ (executionFond.interestAmount)
reg.setBalance(execFond.getSettlementAmount());
} else {
reg.setBalance(execFond.getQuantity());
}
reg.setSettlementDate(execFond.getSettlementDate()); reg.setSettlementDate(execFond.getSettlementDate());
reg.setSettlementCode(execFond.getSettlementCode()); reg.setSettlementCode(execFond.getSettlementCode());
} }