From 0eadc49ab6c767d3a566b7100a55f9d46d7a30eb Mon Sep 17 00:00:00 2001 From: ialbert Date: Mon, 22 May 2023 12:50:56 +0300 Subject: [PATCH] http://jira.mfd.msk:8088/browse/CLS-290 --- .../RequirmentsAndObligationCreation.java | 81 ++++++++++++++----- 1 file changed, 63 insertions(+), 18 deletions(-) diff --git a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/impl/RequirmentsAndObligationCreation.java b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/impl/RequirmentsAndObligationCreation.java index d6ad3bc9e..c10e29938 100644 --- a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/impl/RequirmentsAndObligationCreation.java +++ b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/impl/RequirmentsAndObligationCreation.java @@ -27,7 +27,9 @@ import java.time.LocalDate; import java.util.List; import java.util.Objects; import java.util.Optional; +import java.util.concurrent.atomic.AtomicReference; import java.util.function.BiConsumer; +import java.util.function.BiFunction; @Service public class RequirmentsAndObligationCreation implements ISessionStage { @@ -66,26 +68,38 @@ public class RequirmentsAndObligationCreation implements ISessionStage { i += 2; ExecutionCommon partyExec = matched.getFirst(); ExecutionCommon counterExec = matched.getSecond(); - + //бывает поиск обычный, бывает по ExecutionDeposit.secondLegSettlementDt + AtomicReference>> regSearchMethod = new AtomicReference<>(); + //обычный поиск + regSearchMethod.set(this::findReg); BiConsumer findAndUpdateOrCreate = (exec, regDsgn) -> - findReg(exec, regDsgn).ifPresentOrElse(registry -> { - RegistryUpdater.updater() - .exec(partyExec) - .registry(registry) - .update(); - registryImdg.update(registry); - }, () -> { - Registry newRegister = RegistryBuilder.builder() - .imdg(imdgProvider) - .exec(partyExec) - .registryDesignation(regDsgn) - .build(); - registryImdg.insert(newRegister); - }); + regSearchMethod.get().apply(exec, regDsgn) + .ifPresentOrElse(registry -> { + RegistryUpdater.updater() + .exec(partyExec) + .registry(registry) + .update(); + registryImdg.update(registry); + }, () -> { + Registry newRegister = RegistryBuilder.builder() + .imdg(imdgProvider) + .exec(partyExec) + .registryDesignation(regDsgn) + .build(); + registryImdg.insert(newRegister); + }); findAndUpdateOrCreate.accept(partyExec, RegistryDesignation.O); findAndUpdateOrCreate.accept(partyExec, RegistryDesignation.T); findAndUpdateOrCreate.accept(counterExec, RegistryDesignation.O); findAndUpdateOrCreate.accept(counterExec, RegistryDesignation.T); + if (partyExec.type().equals(ExecutionType.ExecutionDeposit) && ((ExecutionDeposit) partyExec).getSecondLegSettlementDate() != null) { + //поиск по дате расчетов ExecutionDeposit.secondLegSettlementDt + regSearchMethod.set(this::findRegBySettlementDt); + findAndUpdateOrCreate.accept(partyExec, RegistryDesignation.T); + findAndUpdateOrCreate.accept(partyExec, RegistryDesignation.O); + findAndUpdateOrCreate.accept(counterExec, RegistryDesignation.T); + findAndUpdateOrCreate.accept(counterExec, RegistryDesignation.O); + } } return new StageResult<>(null, true); } @@ -113,12 +127,43 @@ public class RequirmentsAndObligationCreation implements ISessionStage { } else { throw new IllegalStateException("cannot construct for " + des + " " + side); } + return imdgRegSearch(p, exec.getTradingClearingRegistryId(), exec.getCompanyId(), settlementDt(exec)); + } + + private Optional findRegBySettlementDt(ExecutionCommon exec, RegistryDesignation des) { + if (!exec.type().equals(ExecutionType.ExecutionDeposit) || ((ExecutionDeposit) exec).getSecondLegSettlementDate() == null) + throw new IllegalStateException("cannot searchSettlementDt for " + exec.type()); + ISide side = getSide(exec); + RegistryTradingParams p; + if (side.isBuy() && des.equals(RegistryDesignation.T)) { + p = new RegistryTradingParams( + RegistryDesignation.T, RegistryInstrumentType.M, RegistryCapacity.A, RegistryUnit.T + ); + } else if (side.isBuy() && des.equals(RegistryDesignation.O)) { + p = new RegistryTradingParams( + RegistryDesignation.O, RegistryInstrumentType.S, RegistryCapacity.A, RegistryUnit.T + ); + } else if (side.isSell() && des.equals(RegistryDesignation.O)) { + p = new RegistryTradingParams( + RegistryDesignation.O, RegistryInstrumentType.M, RegistryCapacity.A, RegistryUnit.T + ); + } else if (side.isSell() && des.equals(RegistryDesignation.T)) { + p = new RegistryTradingParams( + RegistryDesignation.T, RegistryInstrumentType.S, RegistryCapacity.A, RegistryUnit.T + ); + } else { + throw new IllegalStateException("cannot construct by settleDt for " + des + " " + side); + } + return imdgRegSearch(p, exec.getTradingClearingRegistryId(), exec.getCompanyId(), ((ExecutionDeposit) exec).getSecondLegSettlementDate()); + } + + public Optional imdgRegSearch(RegistryTradingParams p, Long tcrId, Long companyId, LocalDate settlementDt) { String sql = RegistryCodeSqlBuilder.getInstance(p).build(); ImdgPredicateBuilder pb = registryImdg.predicateBuilder(); ImdgPredicate rgstrPredicate = pb.and(pb.sql(sql), - pb.equals("tradingClearingRegistryId", exec.getTradingClearingRegistryId()), - pb.equals("companyId", exec.getCompanyId()), - pb.equals("settlementDate", settlementDt(exec)) + pb.equals("tradingClearingRegistryId", tcrId), + pb.equals("companyId", companyId), + pb.equals("settlementDate", settlementDt) ); return Optional.ofNullable(registryImdg.getSingleObjectByPredicate(rgstrPredicate)); }