обработка sdf04 и изменения balance для регистров

This commit is contained in:
etreschenkov 2023-07-31 15:38:59 +03:00
parent a5bb906eea
commit 79b65e0023
5 changed files with 65 additions and 14 deletions

View file

@ -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));

View file

@ -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);
}

View file

@ -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);
});
}

View file

@ -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);
}

View file

@ -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;