diff --git a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/impl/FormingPaymentInstructionDepositReturn.java b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/impl/FormingPaymentInstructionDepositReturn.java index 4f366b653..9fa846bdf 100644 --- a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/impl/FormingPaymentInstructionDepositReturn.java +++ b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/impl/FormingPaymentInstructionDepositReturn.java @@ -13,12 +13,15 @@ import ru.clearing.classes.statics.data.registry.Registry; import ru.clearing.classes.statics.data.sdf.SDf03; import ru.clearing.classes.statics.data.sdf.SDf12; import ru.clearing.classes.statics.data.security.Security; +import ru.spcex.clearing.error.ClearingError; import ru.spcex.clearing.imdg.IMDGDistributedNames; import ru.spcex.clearing.platform.messaging.domain.Consts; import ru.spcex.clearing.platform.messaging.domain.cud.balance.ExportToFileRequest; import ru.spcex.clearing.platform.messaging.service.sender.KafkaSender; +import ru.spcex.clearing.service.Sdf03Creator; import ru.spcex.clearing.service.SpecifUtil; import ru.spcex.clearing.service.builder.PaymentInstructionBuilder; +import ru.spcex.clearing.service.builder.PaymentInstructionBuilderFinalMkrDeals; import ru.spcex.clearing.session.stage.ISessionStage; import ru.spcex.clearing.session.stage.StageResult; import ru.spcex.clearing.session.stage.Task; @@ -27,9 +30,9 @@ import ru.spcex.platform.enumeration.*; import ru.spcex.platform.imdg.api.Imdg; import ru.spcex.platform.imdg.api.ImdgId; import ru.spcex.platform.imdg.api.ImdgProvider; -import ru.spcex.platform.imdg.api.predicate.ImdgPredicate; -import ru.spcex.platform.imdg.api.predicate.ImdgPredicateBuilder; import ru.spcex.platform.imdg.api.predicate.specific.RegistryCodeSqlBuilder; +import ru.spcex.platform.utils.collection.Pair; +import ru.spcex.platform.utils.enumeration.EnumMessage; import ru.spcex.platform.utils.enumeration.IEnumKey; import ru.spcex.platform.utils.number.BigDecimalUtil; @@ -55,6 +58,7 @@ public class FormingPaymentInstructionDepositReturn implements ISessionStage { private final Imdg sDf03Imdg; private final Imdg sDf12Imdg; private final KafkaSender kafkaSender; + private final Sdf03Creator sdf03Creator; private final static RegistryTradingParams OS_T; private final static RegistryTradingParams OM_T; private final static RegistryTradingParams TS_T; @@ -123,7 +127,7 @@ public class FormingPaymentInstructionDepositReturn implements ISessionStage { @Autowired public FormingPaymentInstructionDepositReturn(ImdgProvider imdgProvider, - KafkaSender kafkaSender) { + KafkaSender kafkaSender, Sdf03Creator sdf03Creator) { this.kafkaSender = kafkaSender; this.imdgProvider = imdgProvider; this.idGenerator = imdgProvider.getImdgIdGenerator(); @@ -134,6 +138,7 @@ public class FormingPaymentInstructionDepositReturn implements ISessionStage { this.sDf03Imdg = imdgProvider.getImdg(IMDGDistributedNames.Map_SDf03, SDf03.class); this.sDf12Imdg = imdgProvider.getImdg(IMDGDistributedNames.Map_SDf12, SDf12.class); this.paymentInstructionImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_PaymentInstruction, PaymentInstruction.class); + this.sdf03Creator = sdf03Creator; } @Override @@ -164,6 +169,7 @@ public class FormingPaymentInstructionDepositReturn implements ISessionStage { collect(Collectors.groupingBy(Registry::getGroupId)); log.info("registry groups found {}", registriesByGroup.size()); + ArrayList pmtCreated = new ArrayList<>(); for (Map.Entry> entry : registriesByGroup.entrySet()) { List groupRgs = entry.getValue(); Optional lmtO = groupRgs.stream().filter(rgs -> equalByRgs(LM_T, rgs)).findFirst(); @@ -193,15 +199,33 @@ public class FormingPaymentInstructionDepositReturn implements ISessionStage { Optional dmtClnr = searchDmtClrn(lmt); if (dmtClnr.isPresent()) { - //todo 1.1; 1.3; 2; 3; 4 + Account tranAcc = accountImdg.getSingleObjectBySQL("accountType = '%s' and status = '%s' and processingSign = '%s'" + .formatted(AccountType.Tran.getKey(), AccountStatus.ACTIVE.getKey(), Allowed.ALLOWED.getKey())); + if (tranAcc == null) { + return new StageResult<>( + new EnumMessage(ClearingError.AccountNotPresent, "accountType = " + AccountType.Tran.getKey()), + false); + } + Pair pmts = PaymentInstructionBuilderFinalMkrDeals.builder(imdgProvider) + .lm_t(lmt) + .cm_t(cmt) + .tranAcc(tranAcc) + .sessionId(sessionId) + .paymentPurpose("Размещение депозита " + lmt.getContract() + " по ТКР " + lmt.getTradingClearingRegistry()) + .build(); + paymentInstructionImdg.insert(pmts.getFirst()); + paymentInstructionImdg.insert(pmts.getSecond()); + log.debug("LM*T#id={}, CM*T#id={} found, PaymentInstruction id={} and id={} created", + lmt.getId(), cmt.getId(), pmts.getFirst().getId(), pmts.getSecond().getId()); + pmtCreated.add(pmts.getFirst()); + pmtCreated.add(pmts.getSecond()); } - } - + sendSdfs(pmtCreated); //todo fill result StageResult> stageResult = new StageResult(null, true); - stageResult.setStageResult(new ArrayList<>()); + stageResult.setStageResult(pmtCreated); return stageResult; } @@ -249,16 +273,12 @@ public class FormingPaymentInstructionDepositReturn implements ISessionStage { private void sendSdfs(List formedPaymentInstructions) { List sDf03Created = new ArrayList<>(); - List sDf12Created = new ArrayList<>(); for (PaymentInstruction paymentInstruction : formedPaymentInstructions) { - Security security = securityImdg.getSingleObjectByID(paymentInstruction.getCreditLeg_securityId()); Account account = accountImdg.getSingleObjectByID(paymentInstruction.getCreditLeg_accountId()); - if (InstrumentType.CRNC.equalsByKey(security.getInstrumentType()) && - List.of(AccountType.Corr, AccountType.Clrn).contains(IEnumKey.getEnumByKey(AccountType.class, account.getAccountType()))) { - sDf03Created.add(newSDf03(paymentInstruction)); - } else if (!InstrumentType.CRNC.equalsByKey(security.getInstrumentType()) && - AccountType.Depo.equalsByKey(account.getAccountType())) { - sDf12Created.add(newSDf12(paymentInstruction)); + if (List.of(AccountType.Corr, AccountType.Clrn, AccountType.Tran, AccountType.Anlt, AccountType.Info) + .contains(IEnumKey.getEnumByKey(AccountType.class, account.getAccountType()))) { + //если info подставить anlt (единственный счет в системе) + sDf03Created.add(sdf03Creator.create(paymentInstruction)); } } @@ -274,32 +294,6 @@ public class FormingPaymentInstructionDepositReturn implements ISessionStage { exportToFileRequest.setSdfGroupId(sdf03GroupId); kafkaSender.sendRequestToQueue(Consts.EXPORT_PROCESS, exportToFileRequest); } - - Long sdf12GroupId = null; - Long maxTxNumber = 1L; - if (!sDf12Created.isEmpty()) { - sdf12GroupId = !sDf12Created.isEmpty() ? imdgProvider.getImdgIdGenerator().nextId() : null; - ImdgPredicateBuilder predicateBuilder = sDf12Imdg.predicateBuilder(); - ImdgPredicate notEmptyTransactionNum = predicateBuilder.not(predicateBuilder.equals("transaction_number", "")); - Long maxId = sDf12Imdg.aggregateLongMax("id", notEmptyTransactionNum); - if (maxId != null) { - SDf12 sDf12 = sDf12Imdg.getSingleObjectByID(maxId); - maxTxNumber = Long.parseLong(sDf12.getTransactionNumber()) + 1; - } - } - for (SDf12 sDf12 : sDf12Created) { - sDf12.setGenerationId(sdf03GroupId); - sDf12.setTransactionNumber(maxTxNumber.toString()); - sDf12.setTransactionQuantity(String.valueOf(sDf12Created.size())); - sDf12Imdg.insert(sDf12); - } - - if (sdf12GroupId != null) { - ExportToFileRequest exportToFileRequest = new ExportToFileRequest(); - exportToFileRequest.setNameOfTable("DF-12"); - exportToFileRequest.setSdfGroupId(sdf12GroupId); - kafkaSender.sendRequestToQueue(Consts.EXPORT_PROCESS, exportToFileRequest); - } } private PaymentInstruction createPaymentInstruction(List registries, BigDecimal balance, Long sessionId) {