ialbert 2023-05-22 12:50:56 +03:00
parent bcbae31783
commit 0eadc49ab6

View file

@ -27,7 +27,9 @@ import java.time.LocalDate;
import java.util.List; import java.util.List;
import java.util.Objects; import java.util.Objects;
import java.util.Optional; import java.util.Optional;
import java.util.concurrent.atomic.AtomicReference;
import java.util.function.BiConsumer; import java.util.function.BiConsumer;
import java.util.function.BiFunction;
@Service @Service
public class RequirmentsAndObligationCreation implements ISessionStage { public class RequirmentsAndObligationCreation implements ISessionStage {
@ -66,26 +68,38 @@ public class RequirmentsAndObligationCreation implements ISessionStage {
i += 2; i += 2;
ExecutionCommon partyExec = matched.getFirst(); ExecutionCommon partyExec = matched.getFirst();
ExecutionCommon counterExec = matched.getSecond(); ExecutionCommon counterExec = matched.getSecond();
//бывает поиск обычный, бывает по ExecutionDeposit.secondLegSettlementDt
AtomicReference<BiFunction<ExecutionCommon, RegistryDesignation, Optional<Registry>>> regSearchMethod = new AtomicReference<>();
//обычный поиск
regSearchMethod.set(this::findReg);
BiConsumer<ExecutionCommon, RegistryDesignation> findAndUpdateOrCreate = (exec, regDsgn) -> BiConsumer<ExecutionCommon, RegistryDesignation> findAndUpdateOrCreate = (exec, regDsgn) ->
findReg(exec, regDsgn).ifPresentOrElse(registry -> { regSearchMethod.get().apply(exec, regDsgn)
RegistryUpdater.updater() .ifPresentOrElse(registry -> {
.exec(partyExec) RegistryUpdater.updater()
.registry(registry) .exec(partyExec)
.update(); .registry(registry)
registryImdg.update(registry); .update();
}, () -> { registryImdg.update(registry);
Registry newRegister = RegistryBuilder.builder() }, () -> {
.imdg(imdgProvider) Registry newRegister = RegistryBuilder.builder()
.exec(partyExec) .imdg(imdgProvider)
.registryDesignation(regDsgn) .exec(partyExec)
.build(); .registryDesignation(regDsgn)
registryImdg.insert(newRegister); .build();
}); registryImdg.insert(newRegister);
});
findAndUpdateOrCreate.accept(partyExec, RegistryDesignation.O); findAndUpdateOrCreate.accept(partyExec, RegistryDesignation.O);
findAndUpdateOrCreate.accept(partyExec, RegistryDesignation.T); findAndUpdateOrCreate.accept(partyExec, RegistryDesignation.T);
findAndUpdateOrCreate.accept(counterExec, RegistryDesignation.O); findAndUpdateOrCreate.accept(counterExec, RegistryDesignation.O);
findAndUpdateOrCreate.accept(counterExec, RegistryDesignation.T); 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); return new StageResult<>(null, true);
} }
@ -113,12 +127,43 @@ public class RequirmentsAndObligationCreation implements ISessionStage {
} else { } else {
throw new IllegalStateException("cannot construct for " + des + " " + side); throw new IllegalStateException("cannot construct for " + des + " " + side);
} }
return imdgRegSearch(p, exec.getTradingClearingRegistryId(), exec.getCompanyId(), settlementDt(exec));
}
private Optional<Registry> 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<Registry> imdgRegSearch(RegistryTradingParams p, Long tcrId, Long companyId, LocalDate settlementDt) {
String sql = RegistryCodeSqlBuilder.getInstance(p).build(); String sql = RegistryCodeSqlBuilder.getInstance(p).build();
ImdgPredicateBuilder pb = registryImdg.predicateBuilder(); ImdgPredicateBuilder pb = registryImdg.predicateBuilder();
ImdgPredicate rgstrPredicate = pb.and(pb.sql(sql), ImdgPredicate rgstrPredicate = pb.and(pb.sql(sql),
pb.equals("tradingClearingRegistryId", exec.getTradingClearingRegistryId()), pb.equals("tradingClearingRegistryId", tcrId),
pb.equals("companyId", exec.getCompanyId()), pb.equals("companyId", companyId),
pb.equals("settlementDate", settlementDt(exec)) pb.equals("settlementDate", settlementDt)
); );
return Optional.ofNullable(registryImdg.getSingleObjectByPredicate(rgstrPredicate)); return Optional.ofNullable(registryImdg.getSingleObjectByPredicate(rgstrPredicate));
} }