This commit is contained in:
parent
bcbae31783
commit
0eadc49ab6
1 changed files with 63 additions and 18 deletions
|
|
@ -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));
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue