обработка sdf04 и изменения balance для регистров
This commit is contained in:
parent
a5bb906eea
commit
79b65e0023
5 changed files with 65 additions and 14 deletions
|
|
@ -4,6 +4,7 @@ import org.slf4j.Logger;
|
|||
import org.slf4j.LoggerFactory;
|
||||
import org.springframework.stereotype.Service;
|
||||
import ru.clearing.classes.statics.data.account.Account;
|
||||
import ru.clearing.classes.statics.data.misc.Session;
|
||||
import ru.clearing.classes.statics.data.registry.Registry;
|
||||
import ru.clearing.classes.statics.data.sdf.SDf04;
|
||||
import ru.spcex.clearing.imdg.IMDGDistributedNames;
|
||||
|
|
@ -11,10 +12,7 @@ import ru.spcex.clearing.platform.messaging.domain.cud.balance.StatementRequest;
|
|||
import ru.spcex.clearing.platform.messaging.service.sender.KafkaSender;
|
||||
import ru.spcex.clearing.service.AnltSearcher;
|
||||
import ru.spcex.clearing.service.model.Result;
|
||||
import ru.spcex.platform.enumeration.AccountType;
|
||||
import ru.spcex.platform.enumeration.RegistryDesignation;
|
||||
import ru.spcex.platform.enumeration.RegistryInstrumentType;
|
||||
import ru.spcex.platform.enumeration.RegistryUnit;
|
||||
import ru.spcex.platform.enumeration.*;
|
||||
import ru.spcex.platform.imdg.api.Imdg;
|
||||
import ru.spcex.platform.imdg.api.ImdgProvider;
|
||||
import ru.spcex.platform.imdg.api.predicate.ImdgPredicate;
|
||||
|
|
@ -26,6 +24,7 @@ import java.math.BigDecimal;
|
|||
import java.time.Instant;
|
||||
import java.util.Collection;
|
||||
import java.util.Collections;
|
||||
import java.util.Map;
|
||||
|
||||
@Service
|
||||
public class Sdf04Executor extends AbstractExecutor<SDf04> {
|
||||
|
|
@ -36,11 +35,13 @@ public class Sdf04Executor extends AbstractExecutor<SDf04> {
|
|||
private final Imdg<Account> accountImdg;
|
||||
private final AnltSearcher anltSearcher;
|
||||
private final IMessageResolver msgRslv;
|
||||
protected final Imdg<Session> sessionImdg;
|
||||
|
||||
public Sdf04Executor(ImdgProvider imdgProvider, AnltSearcher anltSearcher, IMessageResolver msgRslv) {
|
||||
this.imdgProvider = imdgProvider;
|
||||
this.registryImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Registry, Registry.class);
|
||||
this.accountImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Account, Account.class);
|
||||
this.sessionImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Session, Session.class);
|
||||
this.anltSearcher = anltSearcher;
|
||||
this.msgRslv = msgRslv;
|
||||
}
|
||||
|
|
@ -69,11 +70,20 @@ public class Sdf04Executor extends AbstractExecutor<SDf04> {
|
|||
Collection<Registry> registries;
|
||||
Account anltAcc = accountImdg.getFirstObjectBySQL("account = '%s' and accountType = '%s'"
|
||||
.formatted(sdf04.getC_acc_deb(), AccountType.Anlt.getKey()));
|
||||
//если сдф04 не по аналитическому счету, выбираем по тому c_acc_deb что пришло
|
||||
// Account tranAcc = accountImdg.getFirstObjectBySQL("account = '%s' and accountType = '%s'"
|
||||
// .formatted(sdf04.getC_acc_cred(), AccountType.Tran.getKey()));
|
||||
// //если сдф04 не по аналитическому счету ни по tran счету, выбираем по тому c_acc_deb/c_acc_cred что пришло
|
||||
// boolean isAnltAcc = anltAcc != null;
|
||||
// boolean isTranAcc = tranAcc != null;
|
||||
// if (isAnltAcc && isTranAcc) {
|
||||
// log.warn("Found ANLT and TRAN acc by sdf04.id: {}", sdf04.getId());
|
||||
// }
|
||||
if (anltAcc == null) {
|
||||
registries = selectRegistryForSDF04(sdf04.getC_acc_deb());
|
||||
// String acc = anltAcc == null ? sdf04.getC_acc_deb() : sdf04.getC_acc_cred();
|
||||
// registries = selectRegistryForSDF04(acc);
|
||||
} else {
|
||||
//в сдф04 указан ANLT счет, ищем по контракту
|
||||
//в сдф04 указан ANLT или TRAN счет, ищем по контракту
|
||||
AnltSearcher.AnltSearch anltSearch = anltSearcher.loadByAnlt(sdf04.getSpecif_1());
|
||||
if (!anltSearch.isFound()) {
|
||||
log.error("sdf04.id={} search by specif1 failed {}", sdf04.getId(), msgRslv.resolve(anltSearch.getError()));
|
||||
|
|
@ -84,6 +94,18 @@ public class Sdf04Executor extends AbstractExecutor<SDf04> {
|
|||
}
|
||||
registries.forEach(registry -> unlockRegistry(registry, parseString(sdf04.getSum_deb())));
|
||||
}
|
||||
//todo переписать логику поиска на аналогичную по счетам(TRAN)
|
||||
Session activeSession = sessionImdg.getSingleObjectByFieldValues(Map.of("workflowStatus", Status.Active.getKey()));
|
||||
if (activeSession != null) {
|
||||
Collection<Registry> registriesByActiveSessionId = selectABRegistryBySessionId(activeSession.getId());
|
||||
registriesByActiveSessionId.stream().filter(registry -> registry.getBalance().compareTo(BigDecimal.ZERO) < 0)
|
||||
.forEach(registry -> {
|
||||
registry.setBalance(BigDecimal.ZERO);
|
||||
registry.setUpdated(Instant.now());
|
||||
registryImdg.update(registry);
|
||||
});
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
|
|
@ -103,6 +125,21 @@ public class Sdf04Executor extends AbstractExecutor<SDf04> {
|
|||
return result;
|
||||
}
|
||||
|
||||
protected Collection<Registry> selectABRegistryBySessionId(Long sessionId) {
|
||||
ImdgPredicateBuilder pb = registryImdg.predicateBuilder();
|
||||
ImdgPredicate query = pb.and(
|
||||
pb.and(
|
||||
pb.equals("registryDesignation", RegistryDesignation.A.getKey()),
|
||||
pb.equals("registryUnit", RegistryUnit.B.getKey())
|
||||
),
|
||||
pb.equals("sessionId", sessionId)
|
||||
);
|
||||
|
||||
Collection<Registry> result = registryImdg.getCollectionObjectsByPredicate(query);
|
||||
log.trace("Selected {} registry's by sql: {}", result.size(), query);
|
||||
return result;
|
||||
}
|
||||
|
||||
boolean unlockRegistry(Registry registry, BigDecimal value) {
|
||||
if (registry.getBalance() == null) registry.setBalance(BigDecimal.ZERO);
|
||||
registry.setBalance(registry.getBalance().subtract(value));
|
||||
|
|
|
|||
|
|
@ -146,6 +146,7 @@ public class SecondaryAuctionT0Session extends AbstractSession implements Initia
|
|||
//stage 5
|
||||
{
|
||||
InspectionPoolPayload companyIdPayload = new InspectionPoolPayload();
|
||||
companyIdPayload.setSessionId(currSession.getId());
|
||||
companyIdPayload.setProcessedCompanyId(currSession.getCompanyId());
|
||||
runStage(TaskType.InspectionObligations, companyIdPayload, inspectionObligations);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -165,7 +165,7 @@ public class FormingPaymentInstructionAssets implements ISessionStage {
|
|||
amount = registry.getBalance() == null ? null : registry.getBalance().abs();
|
||||
Optional<Registry> payerAmtO = rgsMng.findRelatedAsset(registry.getTradingClearingRegistryId(), registry.getCompanyId(), AM_T);
|
||||
payerAmtO.ifPresent(amt -> {
|
||||
amt.setSettledDebit(safeBD(amt.getSettledDebit()).subtract(safeBD(registry.getBalance())));
|
||||
amt.setSettledDebit(safeBD(amt.getSettledDebit()).add(safeBD(registry.getBalance().abs())));
|
||||
setUpdatedStoreInImdg(amt, now);
|
||||
});
|
||||
} else {
|
||||
|
|
@ -173,10 +173,10 @@ public class FormingPaymentInstructionAssets implements ISessionStage {
|
|||
addresseeId = registry.getCompanyId();
|
||||
debitLegAccount = counterAcc;
|
||||
creditLegAccount = tranAcc;
|
||||
amount = registry.getBalance() == null ? null : registry.getBalance().abs().negate();
|
||||
amount = registry.getBalance() == null ? null : registry.getBalance().abs();
|
||||
Optional<Registry> payerAmtO = rgsMng.findRelatedAsset(registry.getTradingClearingRegistryId(), registry.getCompanyId(), AM_T);
|
||||
payerAmtO.ifPresent(amt -> {
|
||||
amt.setSettledCredit(safeBD(amt.getSettledCredit()).add(safeBD(registry.getBalance())));
|
||||
amt.setSettledCredit(safeBD(amt.getSettledCredit()).add(safeBD(registry.getBalance().abs())));
|
||||
setUpdatedStoreInImdg(amt, now);
|
||||
});
|
||||
}
|
||||
|
|
@ -225,7 +225,7 @@ public class FormingPaymentInstructionAssets implements ISessionStage {
|
|||
amount = registry.getBalance() == null ? null : registry.getBalance().abs();
|
||||
Optional<Registry> payerAstO = rgsMng.findRelatedAsset(registry.getTradingClearingRegistryId(), registry.getCompanyId(), AS_T);
|
||||
payerAstO.ifPresent(amt -> {
|
||||
amt.setSettledDebit(safeBD(amt.getSettledDebit()).subtract(safeBD(registry.getBalance())));
|
||||
amt.setSettledDebit(safeBD(amt.getSettledDebit()).add(safeBD(registry.getBalance().abs())));
|
||||
setUpdatedStoreInImdg(amt, now);
|
||||
});
|
||||
} else {
|
||||
|
|
@ -233,10 +233,10 @@ public class FormingPaymentInstructionAssets implements ISessionStage {
|
|||
addresseeId = registry.getCompanyId();
|
||||
debitLegAccount = counterAcc;
|
||||
creditLegAccount = dtrnAcc;
|
||||
amount = registry.getBalance() == null ? null : registry.getBalance().abs().negate();
|
||||
amount = registry.getBalance() == null ? null : registry.getBalance().abs();
|
||||
Optional<Registry> payerAstO = rgsMng.findRelatedAsset(registry.getTradingClearingRegistryId(), registry.getCompanyId(), AS_T);
|
||||
payerAstO.ifPresent(amt -> {
|
||||
amt.setSettledCredit(safeBD(amt.getSettledCredit()).add(safeBD(registry.getBalance())));
|
||||
amt.setSettledCredit(safeBD(amt.getSettledCredit()).add(safeBD(registry.getBalance().abs())));
|
||||
setUpdatedStoreInImdg(amt, now);
|
||||
});
|
||||
}
|
||||
|
|
|
|||
|
|
@ -13,6 +13,7 @@ import ru.spcex.clearing.service.RegistryManager;
|
|||
import ru.spcex.clearing.session.stage.ISessionStage;
|
||||
import ru.spcex.clearing.session.stage.StageResult;
|
||||
import ru.spcex.clearing.session.stage.Task;
|
||||
import ru.spcex.clearing.session.stage.task.InspectionPoolPayload;
|
||||
import ru.spcex.platform.enumeration.*;
|
||||
import ru.spcex.platform.imdg.api.Imdg;
|
||||
import ru.spcex.platform.imdg.api.ImdgProvider;
|
||||
|
|
@ -58,15 +59,16 @@ public class InspectionObligations implements ISessionStage {
|
|||
|
||||
@Override
|
||||
public StageResult submit(Task<?> task) {
|
||||
InspectionPoolPayload payload = (InspectionPoolPayload) task.getData();
|
||||
switch (task.getTaskType()) {
|
||||
case InspectionObligations -> {
|
||||
return inspectionObligations();
|
||||
return inspectionObligations(payload.getSessionId());
|
||||
}
|
||||
default -> throw new IllegalStateException("Unknown task type: " + task.getTaskType());
|
||||
}
|
||||
}
|
||||
|
||||
private StageResult inspectionObligations() {
|
||||
private StageResult inspectionObligations(Long sessionId) {
|
||||
String sqlCondition = String.format("(%s) and registryStatus = '%s'",
|
||||
RegistryCodeSqlBuilder.getInstance(OS_T, OM_T, TS_T, TM_T).build(),
|
||||
RegistryStatus.POOL.getKey());
|
||||
|
|
@ -124,6 +126,7 @@ public class InspectionObligations implements ISessionStage {
|
|||
} else if (IEnumKey.getEnumByKey(RegistryDesignation.class, registry.getRegistryDesignation()) == RegistryDesignation.T) {
|
||||
blockedRegistry.setBalance(blockedRegistry.getBalance().subtract(registry.getBalance()));
|
||||
}
|
||||
blockedRegistry.setSessionId(sessionId);
|
||||
blockedRegistry.setUpdated(now);
|
||||
registryImdg.update(blockedRegistry);
|
||||
} else if (section != null && section == Section.FOND &&
|
||||
|
|
@ -136,6 +139,7 @@ public class InspectionObligations implements ISessionStage {
|
|||
} else if (IEnumKey.getEnumByKey(RegistryDesignation.class, registry.getRegistryDesignation()) == RegistryDesignation.T) {
|
||||
blockedRegistry.setBalance(blockedRegistry.getBalance().subtract(registry.getBalance()));
|
||||
}
|
||||
blockedRegistry.setSessionId(sessionId);
|
||||
blockedRegistry.setUpdated(now);
|
||||
registryImdg.update(blockedRegistry);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -2,6 +2,15 @@ package ru.spcex.clearing.session.stage.task;
|
|||
|
||||
public class InspectionPoolPayload {
|
||||
private Long processedCompanyId;
|
||||
private Long sessionId;
|
||||
|
||||
public Long getSessionId() {
|
||||
return sessionId;
|
||||
}
|
||||
|
||||
public void setSessionId(Long sessionId) {
|
||||
this.sessionId = sessionId;
|
||||
}
|
||||
|
||||
public Long getProcessedCompanyId() {
|
||||
return processedCompanyId;
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue