diff --git a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/config/ValidationConfig.java b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/config/ValidationConfig.java index 883481a8d..864f759a9 100644 --- a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/config/ValidationConfig.java +++ b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/config/ValidationConfig.java @@ -480,6 +480,7 @@ public class ValidationConfig { ctx.addImdg(IMDGDistributedNames.Map_SDf54, sDf54Imdg); ctx.addImdg(IMDGDistributedNames.Map_PaymentInstruction, pmtImdg); ctx.addImdg(IMDGDistributedNames.Map_TradingClearingRegistry, imdgTradingClearingRegistry); + ctx.addImdg(IMDGDistributedNames.Map_TradingClearingRegistryList, imdgTradingClearingRegistryList); return new ValidatorImpl<>(ctx, Sdf55ValidationRule.Fields, Sdf55ValidationRule.GenerationIdFound, diff --git a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/payment/PaymentInstructionOutboundService.java b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/payment/PaymentInstructionOutboundService.java index ee1e59243..fc181c258 100644 --- a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/payment/PaymentInstructionOutboundService.java +++ b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/payment/PaymentInstructionOutboundService.java @@ -187,13 +187,6 @@ public class PaymentInstructionOutboundService { SDf54 sDf54 = sdf54Creator.create(pmt); sDf54.setId(idGenerator.nextId()); sDf54.setGenerationId(pmt.getId()); - sdf54Imdg.insert(sDf54); - log.debug("new sdf54.id: {}", sDf54.getId()); - dmiService.setProcComment(tcr.getId(), - curr, - safeBD(amount).negate(), - sDf54.getDocnm_ref()); - assetsMng.process(assets.get().a__b(), assets.get().a__t(), assets.get().a__f(), BigDecimal.ZERO); if (time.isTradingTime()) { Supplier builder = () -> GatewayRequestCreator.from(pmt, assets.get().a__b().getTradingCode(), @@ -210,9 +203,16 @@ public class PaymentInstructionOutboundService { pmt.setTransactionStatus(TransactionStatus.fail.getKey()); pmt.setUpdated(now); pmtImdg.update(pmt); - return error(req.getId(), ClearingError.GeneralError); + return error(req.getId(), ClearingError.GatewayNotApproved); } } + sdf54Imdg.insert(sDf54); + log.debug("new sdf54.id: {}", sDf54.getId()); + dmiService.setProcComment(tcr.getId(), + curr, + safeBD(amount).negate(), + sDf54.getDocnm_ref()); + assetsMng.process(assets.get().a__b(), assets.get().a__t(), assets.get().a__f(), BigDecimal.ZERO); SdfClearingRequest exp = new SdfClearingRequest(); exp.setGroupId(sDf54.getGenerationId()); kafkaSender.sendRequestToQueue(Consts.SDF54_PROCESS, exp); diff --git a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/validation/Sdf55ValidationRule.java b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/validation/Sdf55ValidationRule.java index 55da2138e..58d8f2978 100644 --- a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/validation/Sdf55ValidationRule.java +++ b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/validation/Sdf55ValidationRule.java @@ -7,6 +7,7 @@ import ru.clearing.classes.statics.data.account.Account; import ru.clearing.classes.statics.data.payment.PaymentInstruction; import ru.clearing.classes.statics.data.registry.Registry; import ru.clearing.classes.statics.data.registry.TradingClearingRegistry; +import ru.clearing.classes.statics.data.registry.TradingClearingRegistryList; import ru.clearing.classes.statics.data.sdf.SDf54; import ru.clearing.classes.statics.data.sdf.SDf55; import ru.spcex.clearing.error.ClearingError; @@ -14,6 +15,7 @@ import ru.spcex.clearing.imdg.IMDGDistributedNames; import ru.spcex.clearing.platform.messaging.domain.cud.balance.StatementRequest; import ru.spcex.clearing.service.AssetTrio; import ru.spcex.clearing.service.registry.AssetTBFProcessing; +import ru.spcex.platform.enumeration.CurrencyCode; import ru.spcex.platform.imdg.api.Imdg; import ru.spcex.platform.imdg.validation.ImdgValidationContext; import ru.spcex.platform.utils.enumeration.EnumMessage; @@ -73,20 +75,36 @@ public enum Sdf55ValidationRule implements IValidationRule validate(ImdgValidationContext context) { + Imdg tcrListImdg = context.obtainMap(IMDGDistributedNames.Map_TradingClearingRegistryList, TradingClearingRegistryList.class); Imdg tcrImdg = context.obtainMap(IMDGDistributedNames.Map_TradingClearingRegistry, TradingClearingRegistry.class); PaymentInstruction pmt = context.getStoredObject(ValidationStored.Sdf55PaymentInstruction); Long accCredId = pmt.getCreditLeg_accountId(); + String creditCurrency = pmt.getCreditLeg_currencyCode(); Long addresseeId = pmt.getSenderId(); if (accCredId == null || addresseeId == null) { return of(ClearingError.RecordNotFound, "TCR - no PI(id=%d)#CreditLeg_accountId/SenderId" - .formatted(pmt.getId())); + .formatted(pmt.getId())); } - TradingClearingRegistry tcr = tcrImdg.getFirstObjectBySQL( - "moneyAccountId = '%d' and companyId = %d".formatted(accCredId, addresseeId) - ); + TradingClearingRegistry tcr = null; + TradingClearingRegistryList tcrList; + String errMsg; + if (CurrencyCode.RUB.equalsByKey(creditCurrency)) { + errMsg = "TCR moneyAccountId = '%d' and companyId = %d".formatted(accCredId, addresseeId); + tcr = tcrImdg.getFirstObjectBySQL( + "moneyAccountId = '%d' and companyId = %d".formatted(accCredId, addresseeId)); + } else { + errMsg = "TCR_LIST accountId = '%d' and companyId = %d".formatted(accCredId, addresseeId); + tcrList = tcrListImdg.getFirstObjectBySQL( + "accountId = '%d'".formatted(accCredId) + ); + if (tcrList != null) { + tcr = tcrImdg.getFirstObjectBySQL( + "id = '%d' and companyId = %d".formatted(tcrList.getTradingClearingRegistryId(), addresseeId)); + } + } + if (tcr == null) { - return of(ClearingError.RecordNotFound, "TCR moneyAccountId = '%d' and companyId = %d" - .formatted(accCredId, addresseeId)); + return of(ClearingError.RecordNotFound, errMsg); } context.storeObject(ValidationStored.Sdf55Tcr, tcr); return empty();