ialbert 2023-11-09 14:42:38 +03:00
parent cc2f20de3c
commit 8079ec1fb3
3 changed files with 60 additions and 4 deletions

View file

@ -22,7 +22,9 @@ import ru.spcex.clearing.platform.messaging.domain.cud.clearing.AssetOperationRe
import ru.spcex.clearing.platform.messaging.domain.cud.gateway.AssetOperationApprovalRequest;
import ru.spcex.clearing.platform.messaging.domain.cud.gateway.SingleAssetResponse;
import ru.spcex.clearing.platform.messaging.service.sender.KafkaSender;
import ru.spcex.clearing.service.AssetTrio;
import ru.spcex.clearing.service.integration.GatewayRequestCreator;
import ru.spcex.clearing.service.registry.AssetTBFProcessing;
import ru.spcex.clearing.service.registry.DmiService;
import ru.spcex.clearing.service.schedule.TradingTimeService;
import ru.spcex.clearing.service.validation.Sdf06NewValidationRule;
@ -66,6 +68,7 @@ public class Sdf06Executor {
private final KafkaSender kafkaSender;
private final FilenameObtainer filenameObtainer;
private final DmiService dmiService;
private final AssetTBFProcessing assets;
private final static BigDecimal successResult = BigDecimal.ZERO;
//идет сессия (не возвращаем такую ошибку)
@ -87,7 +90,7 @@ public class Sdf06Executor {
public Sdf06Executor(ImdgProvider imdgProvider,
IMessageResolver messageResolver,
@Qualifier("sdf06ValidatorNew") Function<SDf06, IValidator> sDf06Validator,
TradingTimeService tradingTimeService, KafkaSender kafkaSender, FilenameObtainer filenameObtainer, DmiService dmiService) {
TradingTimeService tradingTimeService, KafkaSender kafkaSender, FilenameObtainer filenameObtainer, DmiService dmiService, AssetTBFProcessing assets) {
this.imdgProvider = imdgProvider;
this.statementImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Statement, Statement.class);
this.tradingTimeService = tradingTimeService;
@ -102,6 +105,7 @@ public class Sdf06Executor {
this.sdf07Imdg = imdgProvider.getImdg(IMDGDistributedNames.Map_SDf07, SDf07.class);
this.filenameObtainer = filenameObtainer;
this.dmiService = dmiService;
this.assets = assets;
}
public void execute(BaseRequest<StatementRequest> systemRequest) {
@ -160,6 +164,8 @@ public class Sdf06Executor {
CurrencyCode.RUB.getKey(),
safeBD(sDf06.getSum()),
sDf06.getNumber().toString());
Optional<AssetTrio> asts = assets.searchMoneyByAccAndCompany(company.getId(), tcr.getMoneyAccountId());
asts.ifPresent(ast -> assets.process(ast.a__b(), ast.a__t(), ast.a__f(), BigDecimal.ZERO));
}
sdf07WasCreated = true;
}
@ -266,11 +272,16 @@ public class Sdf06Executor {
Instant updatedTime = Instant.now();
if (gatewayMsg.isApproved()) {
processedApproved(stmt, sdf06, updatedTime);
dmiService.setProcContract(searchTcrOnGatewayResponse(sdf06).map(SpcexObjectBase::getId).orElse(null),
Optional<TradingClearingRegistry> tcr = searchTcrOnGatewayResponse(sdf06);
dmiService.setProcContract(tcr.map(SpcexObjectBase::getId).orElse(null),
CurrencyCode.RUB.getKey(),
safeBD(sdf06.getSum()),
sdf06.getNumber().toString()
);
if (tcr.isPresent()) {
Optional<AssetTrio> asts = assets.searchMoneyByAccAndCompany(tcr.get().getCompanyId(), tcr.get().getMoneyAccountId());
asts.ifPresent(a -> assets.process(a.a__b(), a.a__t(), a.a__f(), BigDecimal.ZERO));
}
} else {
log.trace("statement.id={}, sdf07.id={}, sdf06.id={} rejected (by gateway answer)",
statementId,

View file

@ -25,6 +25,7 @@ import ru.spcex.clearing.platform.messaging.domain.cud.gateway.AssetOperationApp
import ru.spcex.clearing.platform.messaging.domain.cud.gateway.SingleAssetResponse;
import ru.spcex.clearing.platform.messaging.domain.cud.importexport.SwtExporterRequest;
import ru.spcex.clearing.platform.messaging.service.sender.KafkaSender;
import ru.spcex.clearing.service.registry.AssetTBFProcessing;
import ru.spcex.clearing.service.registry.RegistryManager;
import ru.spcex.clearing.service.schedule.TradingTimeService;
import ru.spcex.clearing.service.validation.ValidationStored;
@ -68,6 +69,7 @@ public class Sdf10Executor {
private final TradingTimeService tradingTimeService;
private final KafkaSender kafkaSender;
private final SecuritySelector<Security> scrtSlct;
private final AssetTBFProcessing assets;
private final static String OK = "OK";
private final static String SYNTAX_ERROR = "Синтаксическая ошибка (файл сформирован неверно)";
@ -88,7 +90,7 @@ public class Sdf10Executor {
public Sdf10Executor(ImdgProvider imdgProvider,
RegistryManager rgsMng, IMessageResolver messageResolver,
@Qualifier("sdf10Validator") Function<SDf10, IValidator> sDf10Validator,
TradingTimeService tradingTimeService, KafkaSender kafkaSender) {
TradingTimeService tradingTimeService, KafkaSender kafkaSender, AssetTBFProcessing assets) {
this.imdgProvider = imdgProvider;
this.statementImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Statement, Statement.class);
this.registryImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Registry, Registry.class);
@ -102,6 +104,7 @@ public class Sdf10Executor {
this.sdf11Imdg = imdgProvider.getImdg(IMDGDistributedNames.Map_SDf11, SDf11.class);
this.plannerAllTodayImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_PlannerAllToday, PlannerAllToday.class);
this.scrtSlct = new SecuritySelector<>(imdgProvider, Security.class);
this.assets = assets;
}
public void execute(BaseRequest<StatementRequest> systemRequest) {
@ -166,7 +169,11 @@ public class Sdf10Executor {
SDf11 sDf11 = processedApproved(stmt, sDf10, now, sdf11GroupId);
BigDecimal amount = InOutDirection.in.equalsByKey(stmt.getInOutDirection()) ?
stmt.getAmount() : safeBD(stmt.getAmount()).negate();
createDs_iWithoutGateway(tcr.getId(), company.getId(), security.getSecuritySymbol(), amount, sDf10.getOutDocument());
createDs_iWithoutGateway(tcr.getId(),
company.getId(),
security.getSecuritySymbol(),
amount,
sDf10.getOutDocument());
sdf11WasCreated = true;
}
}
@ -190,6 +197,7 @@ public class Sdf10Executor {
return;
}
createDs_i(as_t.get(), summ, outDocument);
assets.processByA__t(as_t.get(), BigDecimal.ZERO);
}
private void createDs_iWithoutGateway(Long tcrId, Long companyId, String securitySymobl, BigDecimal summ, String outDocument) {
@ -203,6 +211,7 @@ public class Sdf10Executor {
return;
}
createDs_i(as_t.get(), summ, outDocument);
assets.processByA__t(as_t.get(), BigDecimal.ZERO);
}
private void createDs_i(Registry as_t, BigDecimal summ, String outDocument) {

View file

@ -134,6 +134,25 @@ public class AssetTBFProcessing {
}
}
public Optional<AssetTrio> processByA__t(Registry a__t, BigDecimal sum) {
Optional<Registry> a__b = rgsMng.findRegByUnit(a__t.getCompanyId(),
a__t.getAccountId(),
a__t.getContract(),
a__t,
RegistryUnit.B);
Optional<Registry> a__f = rgsMng.findRegByUnit(a__t.getCompanyId(),
a__t.getAccountId(),
a__t.getContract(),
a__t,
RegistryUnit.F);
if (a__b.isPresent() && a__f.isPresent()) {
process(a__b.get(), a__t, a__f.get(), sum);
return Optional.of(new AssetTrio(a__t, a__b.get(), a__f.get()));
} else {
return Optional.empty();
}
}
public AssetTrio createSAssets(Account acc,
String securitySymbol,
Long securityId,
@ -244,6 +263,23 @@ public class AssetTBFProcessing {
return Optional.empty();
}
public Optional<AssetTrio> searchSecurityByAccAndCompany(Long companyId, Long accountId, String securitySymbol) {
ImdgPredicateBuilder pb = rgsImdg.predicateBuilder();
Function<RegistryTradingParams, ImdgPredicate> prdct = rgsCode -> pb.and(
pb.sql(RegistryCodeSqlBuilder.getInstance(rgsCode).build()),
pb.equals("companyId", companyId),
pb.equals("accountId", accountId),
pb.equals("securitySymbol", securitySymbol)
);
Registry amf = rgsImdg.getFirstObjectByPredicate(prdct.apply(AS_F));
Registry amb = rgsImdg.getFirstObjectByPredicate(prdct.apply(AS_B));
Registry amt = rgsImdg.getFirstObjectByPredicate(prdct.apply(AS_T));
if (amf != null && amb != null && amt != null) {
return Optional.of(new AssetTrio(amf, amb, amt));
}
return Optional.empty();
}
public boolean insufficientBalance(Registry registry, BigDecimal amount) {
return safeBD(registry.getBalance()).compareTo(safeBD(amount)) < 0;
}