пересчет F = T-B при снятии блокировок

This commit is contained in:
etreschenkov 2023-07-31 11:06:45 +03:00
parent 6883496845
commit a9c9f1d47f
5 changed files with 50 additions and 28 deletions

View file

@ -90,6 +90,26 @@ public class RegistryManager {
IEnumKey.getEnumByKey(RegistryCapacity.class, rgs.getRegistryCapacity()), IEnumKey.getEnumByKey(RegistryCapacity.class, rgs.getRegistryCapacity()),
IEnumKey.getEnumByKey(RegistryUnit.class, rgs.getRegistryUnit()) IEnumKey.getEnumByKey(RegistryUnit.class, rgs.getRegistryUnit())
); );
}
public Optional<Registry> findRegByUnit(Long companyId, Long accountId, String contract, Registry registry, RegistryUnit unit) {
RegistryTradingParams p = new RegistryTradingParams(
IEnumKey.getEnumByKey(RegistryDesignation.class, registry.getRegistryDesignation()),
IEnumKey.getEnumByKey(RegistryInstrumentType.class, registry.getRegistryInstrumentType()),
IEnumKey.getEnumByKey(RegistryCapacity.class, registry.getRegistryCapacity()),
unit
);
String sql = RegistryCodeSqlBuilder.getInstance(p).build();
ImdgPredicateBuilder pb = rgsImdg.predicateBuilder();
ImdgPredicate rgstrPredicate = pb.and(pb.sql(sql),
pb.sql(sql),
pb.equals("companyId", companyId),
pb.equals("accountId", accountId)
);
if (RegistryDesignation.D.equalsByKey(registry.getRegistryDesignation()) && !TextUtil.isEmpty(contract)) {
rgstrPredicate = pb.and(rgstrPredicate, pb.equals("contract", contract));
}
return Optional.ofNullable(rgsImdg.getSingleObjectByPredicate(rgstrPredicate));
} }
} }

View file

@ -183,7 +183,6 @@ public class Sdf08Executor extends AbstractExecutor<SDf08> {
registryImdg.insert(registryB); registryImdg.insert(registryB);
registryImdg.insert(registryF); registryImdg.insert(registryF);
} }
//todo
//2. отправить notification на backend //2. отправить notification на backend
stmt.setOperationStatus(OperationStatus.Executed.getKey()); stmt.setOperationStatus(OperationStatus.Executed.getKey());
statementImdg.update(stmt); statementImdg.update(stmt);

View file

@ -35,7 +35,7 @@ public enum STradesValidationRule implements IValidationRule<ImdgValidationConte
context.obtainMap(IMDGDistributedNames.Map_MoneyMarketSecurity, Security.class), context.obtainMap(IMDGDistributedNames.Map_MoneyMarketSecurity, Security.class),
context.obtainMap(IMDGDistributedNames.Map_EquitySecurity, Security.class) context.obtainMap(IMDGDistributedNames.Map_EquitySecurity, Security.class)
); );
Security security = slctr.selectSecurityBySymbol(validatedObject.getSecCode()); Security security = slctr.selectSecurityBySymbol(validatedObject.getSecCode().trim());
if (security == null) { if (security == null) {
return of(ClearingError.SecurityNotFound, validatedObject.getSecCode()); return of(ClearingError.SecurityNotFound, validatedObject.getSecCode());
} }

View file

@ -149,7 +149,6 @@ public class SecondaryAuctionT0Session extends AbstractSession implements Initia
} }
//stage 5 //stage 5
{ {
//todo здесь
InspectionPoolPayload companyIdPayload = new InspectionPoolPayload(); InspectionPoolPayload companyIdPayload = new InspectionPoolPayload();
companyIdPayload.setProcessedCompanyId(currSession.getCompanyId()); companyIdPayload.setProcessedCompanyId(currSession.getCompanyId());
runStage(TaskType.InspectionObligations, companyIdPayload, inspectionObligations); runStage(TaskType.InspectionObligations, companyIdPayload, inspectionObligations);
@ -162,7 +161,6 @@ public class SecondaryAuctionT0Session extends AbstractSession implements Initia
} }
StageResult<Collection<PaymentInstruction>> returnsPayment = null; StageResult<Collection<PaymentInstruction>> returnsPayment = null;
{ {
//todo здесь
FormingPaymentInstructionDealsMkrPayload payload = new FormingPaymentInstructionDealsMkrPayload(); FormingPaymentInstructionDealsMkrPayload payload = new FormingPaymentInstructionDealsMkrPayload();
payload.setSessionId(currSession.getId()); payload.setSessionId(currSession.getId());
payload.setSendSdfs(false); payload.setSendSdfs(false);

View file

@ -9,6 +9,7 @@ import org.springframework.stereotype.Service;
import ru.clearing.classes.statics.data.registry.Registry; import ru.clearing.classes.statics.data.registry.Registry;
import ru.spcex.clearing.error.ClearingError; import ru.spcex.clearing.error.ClearingError;
import ru.spcex.clearing.imdg.IMDGDistributedNames; import ru.spcex.clearing.imdg.IMDGDistributedNames;
import ru.spcex.clearing.service.RegistryManager;
import ru.spcex.clearing.session.stage.ISessionStage; import ru.spcex.clearing.session.stage.ISessionStage;
import ru.spcex.clearing.session.stage.StageResult; import ru.spcex.clearing.session.stage.StageResult;
import ru.spcex.clearing.session.stage.Task; import ru.spcex.clearing.session.stage.Task;
@ -36,13 +37,15 @@ import static ru.spcex.platform.enumeration.RegistryTradingParams.*;
public class InspectionObligations implements ISessionStage { public class InspectionObligations implements ISessionStage {
private final Logger log = LoggerFactory.getLogger(getClass()); private final Logger log = LoggerFactory.getLogger(getClass());
private final Imdg<Registry> registryImdg; private final Imdg<Registry> registryImdg;
private final RegistryManager registryManager;
private final IMessageResolver msgResolver = new SimpleMessageResolver(); private final IMessageResolver msgResolver = new SimpleMessageResolver();
private SessionType sessionType; private SessionType sessionType;
private Section section; private Section section;
@Autowired @Autowired
public InspectionObligations(ImdgProvider imdgProvider) { public InspectionObligations(ImdgProvider imdgProvider, RegistryManager registryManager) {
this.registryImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Registry, Registry.class); this.registryImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Registry, Registry.class);
this.registryManager = registryManager;
} }
public void setSessionType(SessionType sessionType) { public void setSessionType(SessionType sessionType) {
@ -107,40 +110,42 @@ public class InspectionObligations implements ISessionStage {
isUncovered = false; isUncovered = false;
} }
defineStatusAndUpdateRegistry(checkResults, group); defineStatusAndUpdateRegistry(checkResults, group);
if (checkResults.stream().allMatch(checkResult -> checkResult.isUncovered)) { if (checkResults.stream().noneMatch(checkResult -> checkResult.isUncovered)) {
Instant now = Instant.now();
//по каждому регистру OM*T, TM*T, OS*T, TS*T из одной группы //по каждому регистру OM*T, TM*T, OS*T, TS*T из одной группы
Optional<Registry> omt_registryOpt = group.stream().filter(registry ->
IEnumKey.getEnumByKey(RegistryDesignation.class, registry.getRegistryDesignation()) == RegistryDesignation.O
&& IEnumKey.getEnumByKey(RegistryInstrumentType.class, registry.getRegistryInstrumentType()) == RegistryInstrumentType.M)
.findFirst();
for (Registry registry : group) { for (Registry registry : group) {
String securityBAssetSql = searchSecurityBAssetsSql(registry); Registry blockedRegistry = null;
log.debug("search security asset by registry.id={} sql {}", registry.getId(), securityBAssetSql);
Registry securityBAsset = registryImdg.getFirstObjectBySQL(securityBAssetSql);
if (IEnumKey.getEnumByKey(RegistryInstrumentType.class, registry.getRegistryInstrumentType()) == RegistryInstrumentType.M) { if (IEnumKey.getEnumByKey(RegistryInstrumentType.class, registry.getRegistryInstrumentType()) == RegistryInstrumentType.M) {
String moneyBAssetSql = searchMoneyBAssetsSql(registry); String moneyBAssetSql = searchMoneyBAssetsSql(registry);
log.debug("search money asset by registry.id={} sql {}", registry.getId(), moneyBAssetSql); log.debug("search money asset by registry.id={} sql {}", registry.getId(), moneyBAssetSql);
Registry moneyBAsset = registryImdg.getFirstObjectBySQL(moneyBAssetSql); blockedRegistry = registryImdg.getFirstObjectBySQL(moneyBAssetSql);
if (IEnumKey.getEnumByKey(RegistryDesignation.class, registry.getRegistryDesignation()) == RegistryDesignation.O) { if (IEnumKey.getEnumByKey(RegistryDesignation.class, registry.getRegistryDesignation()) == RegistryDesignation.O) {
moneyBAsset.setBalance(securityBAsset.getBalance().add(registry.getBalance())); blockedRegistry.setBalance(blockedRegistry.getBalance().add(registry.getBalance()));
} else if (IEnumKey.getEnumByKey(RegistryDesignation.class, registry.getRegistryDesignation()) == RegistryDesignation.T) { } else if (IEnumKey.getEnumByKey(RegistryDesignation.class, registry.getRegistryDesignation()) == RegistryDesignation.T) {
moneyBAsset.setBalance(securityBAsset.getBalance().subtract(registry.getBalance())); blockedRegistry.setBalance(blockedRegistry.getBalance().subtract(registry.getBalance()));
} }
registryImdg.update(moneyBAsset); blockedRegistry.setUpdated(now);
registryImdg.update(blockedRegistry);
} else if (section != null && section == Section.FOND && } else if (section != null && section == Section.FOND &&
IEnumKey.getEnumByKey(RegistryInstrumentType.class, registry.getRegistryInstrumentType()) == RegistryInstrumentType.S) { IEnumKey.getEnumByKey(RegistryInstrumentType.class, registry.getRegistryInstrumentType()) == RegistryInstrumentType.S) {
String securityBAssetSql = searchSecurityBAssetsSql(registry);
log.debug("search security asset by registry.id={} sql {}", registry.getId(), securityBAssetSql);
blockedRegistry = registryImdg.getFirstObjectBySQL(securityBAssetSql);
if (IEnumKey.getEnumByKey(RegistryDesignation.class, registry.getRegistryDesignation()) == RegistryDesignation.O) { if (IEnumKey.getEnumByKey(RegistryDesignation.class, registry.getRegistryDesignation()) == RegistryDesignation.O) {
securityBAsset.setBalance(securityBAsset.getBalance().add(registry.getBalance())); blockedRegistry.setBalance(blockedRegistry.getBalance().add(registry.getBalance()));
registryImdg.update(securityBAsset);
} else if (IEnumKey.getEnumByKey(RegistryDesignation.class, registry.getRegistryDesignation()) == RegistryDesignation.T) { } else if (IEnumKey.getEnumByKey(RegistryDesignation.class, registry.getRegistryDesignation()) == RegistryDesignation.T) {
if (omt_registryOpt.isPresent()) { blockedRegistry.setBalance(blockedRegistry.getBalance().subtract(registry.getBalance()));
Registry omtRegistry = omt_registryOpt.get(); }
String moneyBAssetSql = searchMoneyBAssetsSql(omtRegistry); blockedRegistry.setUpdated(now);
log.debug("search money asset by registry.id={} sql {}", registry.getId(), moneyBAssetSql); registryImdg.update(blockedRegistry);
Registry moneyBAsset = registryImdg.getFirstObjectBySQL(moneyBAssetSql); }
moneyBAsset.setBalance(securityBAsset.getBalance().subtract(registry.getBalance())); if (blockedRegistry != null) {
registryImdg.update(moneyBAsset); Optional<Registry> registryUnitF = registryManager.findRegByUnit(registry.getCompanyId(), registry.getAccountId(), registry.getContract(), blockedRegistry, RegistryUnit.F);
} Optional<Registry> registryUnitT = registryManager.findRegByUnit(registry.getCompanyId(), registry.getAccountId(), registry.getContract(), blockedRegistry, RegistryUnit.T);
if (registryUnitF.isPresent() && registryUnitT.isPresent()) {
registryUnitF.get().setBalance(registryUnitT.get().getBalance().subtract(blockedRegistry.getBalance()));
registryUnitF.get().setUpdated(now);
registryImdg.update(registryUnitF.get());
} }
} }
} }
@ -156,7 +161,7 @@ public class InspectionObligations implements ISessionStage {
counterRegistryTradingParams = new RegistryTradingParams(RegistryDesignation.A, counterRegistryTradingParams = new RegistryTradingParams(RegistryDesignation.A,
RegistryInstrumentType.S, RegistryInstrumentType.S,
null, null,
RegistryUnit.T); RegistryUnit.F);
} else if (IEnumKey.getEnumByKey(RegistryInstrumentType.class, obligation.getRegistryInstrumentType()) == RegistryInstrumentType.M) { } else if (IEnumKey.getEnumByKey(RegistryInstrumentType.class, obligation.getRegistryInstrumentType()) == RegistryInstrumentType.M) {
counterRegistryTradingParams = new RegistryTradingParams(RegistryDesignation.A, counterRegistryTradingParams = new RegistryTradingParams(RegistryDesignation.A,
RegistryInstrumentType.M, RegistryInstrumentType.M,