diff --git a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/executors/Sdf20Executor.java b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/executors/Sdf20Executor.java index fc05ffab4..ba6cf7025 100644 --- a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/executors/Sdf20Executor.java +++ b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/executors/Sdf20Executor.java @@ -1,5 +1,12 @@ package ru.spcex.clearing.service.executors; +import java.math.BigDecimal; +import java.time.Instant; +import java.time.LocalDate; +import java.util.ArrayList; +import java.util.Collection; +import java.util.Optional; +import java.util.function.Function; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; @@ -10,6 +17,7 @@ import ru.clearing.classes.statics.data.company.Company; import ru.clearing.classes.statics.data.registry.Registry; import ru.clearing.classes.statics.data.registry.TradingClearingRegistry; import ru.clearing.classes.statics.data.sdf.SDf20; +import ru.clearing.classes.statics.data.sdf.SDf21; import ru.clearing.classes.statics.data.security.Security; import ru.clearing.classes.statics.data.statement.Statement; import ru.spcex.clearing.imdg.IMDGDistributedNames; @@ -24,28 +32,29 @@ import ru.spcex.clearing.service.registry.AssetTBFProcessing; import ru.spcex.clearing.service.registry.RegistryManager; import ru.spcex.clearing.service.validation.ValidationStored; import ru.spcex.clearing.session.stage.util.RegistryUtil; -import ru.spcex.platform.enumeration.*; +import ru.spcex.platform.enumeration.InOutDirection; +import ru.spcex.platform.enumeration.InOutSDfType; +import ru.spcex.platform.enumeration.OperationCode; +import ru.spcex.platform.enumeration.OperationStatus; +import ru.spcex.platform.enumeration.RegistryDesignation; +import ru.spcex.platform.enumeration.RegistryStatus; +import ru.spcex.platform.enumeration.RegistryUnit; +import ru.spcex.platform.enumeration.Sender; +import ru.spcex.platform.enumeration.StatementType; import ru.spcex.platform.imdg.api.Imdg; import ru.spcex.platform.imdg.api.ImdgProvider; +import ru.spcex.platform.imdg.api.predicate.ImdgPredicateBuilder; import ru.spcex.platform.utils.enumeration.EnumMessage; import ru.spcex.platform.utils.enumeration.IMessageResolver; import ru.spcex.platform.utils.number.BigDecimalUtil; import ru.spcex.platform.utils.validation.IValidator; - -import java.math.BigDecimal; -import java.time.Instant; -import java.time.LocalDate; -import java.util.ArrayList; -import java.util.Collection; -import java.util.Optional; -import java.util.function.Function; - import static ru.spcex.platform.utils.number.BigDecimalUtil.safeBD; @Service public class Sdf20Executor { private final Logger log = LoggerFactory.getLogger(getClass()); private final Imdg sDf20Imdg; + private final Imdg sDf21Imdg; private final Imdg rgsImdg; private final Imdg stmtImdg; private final Function validation; @@ -62,6 +71,7 @@ public class Sdf20Executor { this.sDf20Imdg = imdgProvider.getImdg(IMDGDistributedNames.Map_SDf20, SDf20.class); this.rgsImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Registry, Registry.class); this.stmtImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Statement, Statement.class); + this.sDf21Imdg = imdgProvider.getImdg(IMDGDistributedNames.Map_SDf21, SDf21.class); this.validation = validation; this.msgRslv = msgRslv; this.kafka = kafka; @@ -134,27 +144,39 @@ public class Sdf20Executor { ds_i.setContract(sDf20.getInDocument()); ds_i.setRegistryStatus(RegistryStatus.OK.getKey()); ds_i.setUpdated(now); - as_t.setBalance(safeBD(as_t.getBalance()).add(quantity)); - if (direction.equals(InOutDirection.in)) { - as_t.setCredit(safeBD(as_t.getCredit()).add(quantity.abs())); - } else { - as_t.setDebit(safeBD(as_t.getDebit()).add(quantity.abs())); - } - as_t.setCheckBalance(BigDecimalUtil.parseLeadingZeroes(sDf20.getCloseBalance())); - as_t.setUpdated(now); - rgsImdg.update(as_t); rgsImdg.update(ds_i); - assetsMng.process(assets.a__b(), assets.a__t(), assets.a__f(), BigDecimal.ZERO); + ImdgPredicateBuilder pb = sDf21Imdg.predicateBuilder(); + SDf21 sdf21 = sDf21Imdg.getFirstObjectByPredicate( + pb.equals("transactionNumber", sDf20.getTransactionNumber()) + ); + if (sdf21 == null) { + as_t.setBalance(safeBD(as_t.getBalance()).add(quantity)); + if (direction.equals(InOutDirection.in)) { + as_t.setCredit(safeBD(as_t.getCredit()).add(quantity.abs())); + } else { + as_t.setDebit(safeBD(as_t.getDebit()).add(quantity.abs())); + } + as_t.setCheckBalance(BigDecimalUtil.parseLeadingZeroes(sDf20.getCloseBalance())); + as_t.setUpdated(now); + rgsImdg.update(as_t); + assetsMng.process(assets.a__b(), assets.a__t(), assets.a__f(), BigDecimal.ZERO); - //statement recfree in - //statement delfree out - Statement statement = createStatement(cmp.getId(), acc, quantity, sDf20.getId(), sDf20.getTransactionNumber(), security.getId()); - stmtImdg.insert(statement); - log.debug("sdf20.id={}, processing as_t.id={}, as_f.id={}, as_b.id={}, ds_t.id={}. statement.id={}", + //statement recfree in + //statement delfree out + Statement statement = createStatement(cmp.getId(), acc, quantity, sDf20.getId(), sDf20.getTransactionNumber(), security.getId()); + stmtImdg.insert(statement); + log.debug("sdf20.id={}, processing as_t.id={}, as_f.id={}, as_b.id={}, ds_t.id={}. statement.id={}", sDf20.getId(), assets.a__t().getId(), assets.a__f().getId(), assets.a__b().getId(), ds_i.getId(), statement.getId()); + } else { + log.debug("sdf20.id={}, found sdf21.id={} by transactionNumber={}. skipping to gateway request", + sDf20.getId(), + sdf21.getId(), + sDf20.getTransactionNumber()); + assetsMng.process(assets.a__b(), assets.a__t(), assets.a__f(), BigDecimal.ZERO); + } //только при зачислении на 20 и 21 идет запрос в gateway в Торговую систему if (InOutDirection.in.equals(direction)) { Collection requests = new ArrayList<>(); diff --git a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/validation/Sdf21ValidationRule.java b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/validation/Sdf21ValidationRule.java index 1faff477c..6b4011750 100644 --- a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/validation/Sdf21ValidationRule.java +++ b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/validation/Sdf21ValidationRule.java @@ -1,5 +1,8 @@ package ru.spcex.clearing.service.validation; +import java.math.BigDecimal; +import java.util.Collection; +import java.util.Optional; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import ru.clearing.classes.statics.data.account.Account; @@ -19,10 +22,6 @@ import ru.spcex.platform.utils.enumeration.EnumMessage; import ru.spcex.platform.utils.text.TextUtil; import ru.spcex.platform.utils.validation.IValidationRule; -import java.math.BigDecimal; -import java.util.Collection; -import java.util.Optional; - public enum Sdf21ValidationRule implements IValidationRule> { AccountPresent() { @@ -58,9 +57,9 @@ public enum Sdf21ValidationRule implements IValidationRule