fond/deposit registry builder

This commit is contained in:
ialbert 2023-06-05 12:05:08 +03:00
parent 46d87a046e
commit d26ee55b55
4 changed files with 25 additions and 10 deletions

View file

@ -10,5 +10,6 @@ public interface IRegistryBuilder {
IRegistryBuilder imdg(ImdgProvider imdgProvider);
IRegistryBuilder exec(ExecutionCommon exec);
IRegistryBuilder registryDesignation(RegistryDesignation registryDesignation);
IRegistryBuilder returnDeposit(boolean returnDeposit);
Registry build();
}

View file

@ -36,6 +36,7 @@ public class RegistryDepoBuilder implements IRegistryBuilder {
private Imdg<Currency> currencyImdg;
private ExecutionCommon exec;
private RegistryDesignation regDsgn;
private boolean secondLeg;
private RegistryDepoBuilder() {
}

View file

@ -70,6 +70,14 @@ public class RegistryFondBuilder implements IRegistryBuilder {
return this;
}
@Override
public IRegistryBuilder returnDeposit(boolean returnDep) {
if (returnDep) {
throw new IllegalStateException("cannot create second leg registry for ExecutionFond");
}
return this;
}
@Override
public Registry build() {
ISide side = getSide(exec);

View file

@ -29,7 +29,6 @@ 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
@ -74,7 +73,7 @@ public class RequirementsAndObligationCreation implements ISessionStage {
AtomicReference<BiFunction<ExecutionCommon, RegistryDesignation, Optional<Registry>>> regSearchMethod = new AtomicReference<>();
//обычный поиск
regSearchMethod.set(this::findReg);
BiConsumer<ExecutionCommon, RegistryDesignation> findAndUpdateOrCreate = (exec, regDsgn) ->
TriConsumer<ExecutionCommon, RegistryDesignation, Boolean> findAndUpdateOrCreate = (exec, regDsgn, returnedDep) ->
regSearchMethod.get().apply(exec, regDsgn)
.ifPresentOrElse(registry -> {
RegistryUpdater.updater()
@ -88,20 +87,21 @@ public class RequirementsAndObligationCreation implements ISessionStage {
.imdg(imdgProvider)
.exec(exec)
.registryDesignation(regDsgn)
.returnDeposit(returnedDep)
.build();
registryImdg.insert(newRegister);
});
findAndUpdateOrCreate.accept(partyExec, RegistryDesignation.O);
findAndUpdateOrCreate.accept(partyExec, RegistryDesignation.T);
findAndUpdateOrCreate.accept(counterExec, RegistryDesignation.O);
findAndUpdateOrCreate.accept(counterExec, RegistryDesignation.T);
findAndUpdateOrCreate.accept(partyExec, RegistryDesignation.O, false);
findAndUpdateOrCreate.accept(partyExec, RegistryDesignation.T, false);
findAndUpdateOrCreate.accept(counterExec, RegistryDesignation.O, false);
findAndUpdateOrCreate.accept(counterExec, RegistryDesignation.T, false);
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);
findAndUpdateOrCreate.accept(partyExec, RegistryDesignation.T, true);
findAndUpdateOrCreate.accept(partyExec, RegistryDesignation.O, true);
findAndUpdateOrCreate.accept(counterExec, RegistryDesignation.T, true);
findAndUpdateOrCreate.accept(counterExec, RegistryDesignation.O, true);
}
}
return new StageResult<>(null, true);
@ -234,4 +234,9 @@ public class RequirementsAndObligationCreation implements ISessionStage {
case ExecutionDeposit -> RegistryDepoBuilder.builder();
};
}
@FunctionalInterface
private static interface TriConsumer<T1, T2, T3> {
void accept(T1 t1, T2 t2, T3 t3);
}
}