Обновил выгрузку денег.
This commit is contained in:
psemenkov 2023-08-22 17:40:58 +03:00
parent 0933657ea3
commit e9636e8723
7 changed files with 93 additions and 65 deletions

View file

@ -19,6 +19,7 @@ import ru.spcex.platform.utils.log.ExceptionUtils;
import java.io.File;
import java.io.IOException;
import java.math.BigDecimal;
import java.nio.file.Files;
import java.nio.file.Path;
import java.time.LocalDateTime;
@ -109,4 +110,26 @@ public abstract class AbstractExporterService {
}
return false;
}
protected BigDecimal sumNegativeABS(Collection<Registry> registries) {
if (registries == null || registries.isEmpty()) return BigDecimal.ZERO;
BigDecimal result = BigDecimal.ZERO;
for (Registry registry : registries) {
if (registry.getBalance() != null && registry.getBalance().compareTo(BigDecimal.ZERO) < 0) {
result = result.add(registry.getBalance().abs());
}
}
return result;
}
protected BigDecimal sum(Collection<Registry> registries) {
if (registries == null || registries.isEmpty()) return BigDecimal.ZERO;
BigDecimal result = BigDecimal.ZERO;
for (Registry registry : registries) {
if (registry.getBalance() != null) {
result = result.add(registry.getBalance());
}
}
return result;
}
}

View file

@ -3,21 +3,24 @@ package ru.spcex.clearing.lim.exporter.services;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils;
import ru.clearing.classes.statics.data.registry.Registry;
import ru.spcex.clearing.lim.exporter.config.LimFormat;
import ru.spcex.clearing.lim.exporter.config.SFTPConfig;
import ru.spcex.clearing.platform.messaging.service.sender.KafkaSender;
import ru.spcex.platform.enumeration.RegistryStatus;
import ru.spcex.platform.enumeration.Section;
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 java.math.BigDecimal;
import java.util.*;
import java.util.stream.Collectors;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import java.util.function.Function;
import static ru.spcex.platform.enumeration.RegistryTradingParams.AM_F;
import static ru.spcex.platform.enumeration.RegistryTradingParams.DM_T;
import static ru.spcex.platform.enumeration.RegistryTradingParams.*;
@Service
public class MoneyExporterService extends AbstractExporterService {
@ -44,30 +47,36 @@ public class MoneyExporterService extends AbstractExporterService {
log.debug("Started loading and formation of money file lines");
List<String> limFileRows = new ArrayList<>();
Collection<Registry> registriesA = registryImdg.getCollectionObjectsBySQL(RegistryCodeSqlBuilder.getInstance(AM_F).build());
Collection<Registry> registriesD = registryImdg.getCollectionObjectsBySQL(RegistryCodeSqlBuilder.getInstance(DM_T).build());
log.debug("Selected {} registriesA.", registriesA.size());
Map<String, List<Registry>> byTcrA = registriesA.stream().filter(r -> StringUtils.hasText(r.getTradingClearingRegistry()))
.collect(Collectors.groupingBy(Registry::getTradingClearingRegistry));
Map<String, List<Registry>> byTcrD = registriesD.stream().filter(r -> StringUtils.hasText(r.getTradingClearingRegistry()))
.collect(Collectors.groupingBy(Registry::getTradingClearingRegistry));
log.debug("Selected {} registriesA, {} registriesD. {} groups of A, {} groups of D.",
registriesA.size(), registriesD.size(), byTcrA.size(), byTcrD.size());
ImdgPredicateBuilder pb = registryImdg.predicateBuilder();
Function<Registry, ImdgPredicate> prdctDM_T = registry -> pb.and(
pb.sql(RegistryCodeSqlBuilder.getInstance(DM_T).build()),
pb.equals("registryStatus", RegistryStatus.PROC.getKey()),
pb.equals("tradingClearingRegistry", registry.getTradingClearingRegistry()),
pb.equals("securityId", registry.getSecurityId())
);
Function<Registry, ImdgPredicate> prdctDM_I = registry -> pb.and(
pb.sql(RegistryCodeSqlBuilder.getInstance(DM_I).build()),
pb.equals("tradingClearingRegistry", registry.getTradingClearingRegistry()),
pb.equals("securityId", registry.getSecurityId())
);
for (Map.Entry<String, List<Registry>> entryA : byTcrA.entrySet()) {
List<Registry> registriesListA = entryA.getValue();
List<Registry> registriesListB = byTcrD.getOrDefault(entryA.getKey(), Collections.emptyList());
for (Registry registryA : registriesListA) {
if (checkNotBlocked(registryA)) {
Registry registryD = findRegistryBySecurityId(registryA.getSecurityId(), registriesListB);
limFileRows.add(getRow(registryA, registryD));
for (Registry registry : registriesA) {
if (checkNotBlocked(registry)) {
BigDecimal sumPositive = BigDecimal.ZERO;
if (registry.getTradingClearingRegistry() != null && registry.getSecurityId() != null) {
sumPositive = sumNegativeABS(registryImdg.getCollectionObjectsByPredicate(prdctDM_I.apply(registry)));
sumPositive = sumPositive.add(sum(registryImdg.getCollectionObjectsByPredicate(prdctDM_T.apply(registry))));
}
limFileRows.add(getRow(registry, sumPositive));
}
}
log.debug("Successfully completed the formation of rows: {} for export money", limFileRows.size());
return limFileRows;
}
public String getRow(Registry registryA, Registry registryD) {
public String getRow(Registry registryA, BigDecimal sumPositive) {
StringBuilder row = new StringBuilder();
row.append("MONEY: FIRM_ID = ");
@ -82,9 +91,7 @@ public class MoneyExporterService extends AbstractExporterService {
row.append(registryA.getTradingClearingRegistry());
row.append("; OPEN_BALANCE = ");
BigDecimal balance = registryA.getBalance() != null ?
registryD != null && registryD.getBalance() != null ? registryA.getBalance().subtract(registryD.getBalance()) : registryA.getBalance() :
BigDecimal.ZERO;
BigDecimal balance = registryA.getBalance() != null ? registryA.getBalance().subtract(sumPositive) : BigDecimal.ZERO;
row.append(LimFormat.toStringD2(balance));
row.append("; OPEN_LIMIT = 0.00");
@ -92,13 +99,4 @@ public class MoneyExporterService extends AbstractExporterService {
row.append("; LIMIT_KIND = 0;");
return row.toString();
}
private Registry findRegistryBySecurityId(Long securityId, List<Registry> registries) {
for (Registry registry : registries) {
if (securityId.equals(registry.getSecurityId())) {
return registry;
}
}
return null;
}
}

View file

@ -56,19 +56,18 @@ public class SecurityExporterService extends AbstractExporterService {
pb.equals("tradingClearingRegistry", registry.getTradingClearingRegistry()),
pb.equals("securityId", registry.getSecurityId())
);
List<String> limFileRows = new ArrayList<>();
Collection<Registry> registriesA = registryImdg.getCollectionObjectsBySQL(RegistryCodeSqlBuilder.getInstance(AS_F).build());
log.debug("Selected {} registriesA.",
registriesA.size());
log.debug("Selected {} registriesA.", registriesA.size());
for (Registry registry : registriesA) {
if (checkNotBlocked(registry)) {
BigDecimal sumPositive = BigDecimal.ZERO;
if(registry.getCompanyId() != null && registry.getTradingClearingRegistry() != null && registry.getSecurityId() != null){
sumPositive = sumPositive(registryImdg.getCollectionObjectsByPredicate(prdct.apply(registry)));
BigDecimal sumNegative = BigDecimal.ZERO;
if (registry.getCompanyId() != null && registry.getTradingClearingRegistry() != null && registry.getSecurityId() != null) {
sumNegative = sumNegativeABS(registryImdg.getCollectionObjectsByPredicate(prdct.apply(registry)));
}
limFileRows.add(getRow(registry, sumPositive));
limFileRows.add(getRow(registry, sumNegative));
}
}
log.debug("Successfully completed the formation of rows: {} for export DEPO", limFileRows.size());
@ -100,15 +99,4 @@ public class SecurityExporterService extends AbstractExporterService {
return row.toString();
}
private BigDecimal sumPositive(Collection<Registry> registries) {
if (registries == null || registries.isEmpty()) return BigDecimal.ZERO;
BigDecimal result = BigDecimal.ZERO;
for (Registry registry : registries) {
if (registry.getBalance() != null && registry.getBalance().compareTo(BigDecimal.ZERO) > 0) {
result = result.add(registry.getBalance());
}
}
return result;
}
}

View file

@ -34,8 +34,8 @@ public abstract class AbstractServiceTest {
protected Imdg<Registry> registryImdg;
protected Imdg<TradingClearingRegistry> tradingClearingRegistryImdg;
protected LocalDate currentDate = LocalDate.now();
protected String tcrA = "1324A234";
protected String tcrD = "124324A234";
protected String tcrFirst = "1324A234";
protected String tcrSecond = "124324A234";
protected Long securityIdFirst = 12L;
protected Long securityIdSecond = 23L;
@ -60,7 +60,7 @@ public abstract class AbstractServiceTest {
protected Registry getRegistryA(String tradingClearingRegistry, Long securityId, String registryInstrumentType) {
Registry registry = new Registry();
registry.setTradingCode("1A12323");
registry.setBalance(new BigDecimal("10.00"));
registry.setBalance(new BigDecimal("15.00"));
registry.setTradingClearingRegistry(tradingClearingRegistry);
registry.setRegistryDesignation(RegistryDesignation.A.getKey());
registry.setRegistryInstrumentType(registryInstrumentType);
@ -74,14 +74,14 @@ public abstract class AbstractServiceTest {
return registry;
}
protected Registry getRegistryD(String tradingClearingRegistry, Long securityId, String registryInstrumentType) {
protected Registry getRegistryD(String tradingClearingRegistry, Long securityId, String registryInstrumentType, String registryUnit) {
Registry registry = new Registry();
registry.setTradingCode("1A12323");
registry.setBalance(new BigDecimal("5.00"));
registry.setTradingClearingRegistry(tradingClearingRegistry);
registry.setRegistryDesignation(RegistryDesignation.D.getKey());
registry.setRegistryInstrumentType(registryInstrumentType);
registry.setRegistryUnit(RegistryUnit.T.getKey());
registry.setRegistryUnit(registryUnit);
registry.setClearingCode(clearingCode(registry));
registry.setClearingDate(currentDate);
registry.setSecuritySymbol("RUB");
@ -92,6 +92,12 @@ public abstract class AbstractServiceTest {
return registry;
}
protected Registry getRegistryNegativeD(String tradingClearingRegistry, Long securityId, String registryInstrumentType, String registryUnit) {
Registry registry = getRegistryD(tradingClearingRegistry, securityId, registryInstrumentType, registryUnit);
registry.setBalance(registry.getBalance().negate());
return registry;
}
// see clearing-service RegistryUtil:
public static String clearingCode(Registry ofRegistry) {
return clearingCode(ofRegistry.getRegistryDesignation(), ofRegistry.getRegistryInstrumentType(), ofRegistry.getRegistryCapacity(), ofRegistry.getRegistryUnit());

View file

@ -5,9 +5,11 @@ import ru.clearing.classes.statics.data.registry.Registry;
import ru.clearing.classes.statics.data.registry.TradingClearingRegistry;
import ru.spcex.clearing.lim.exporter.AbstractServiceTest;
import ru.spcex.platform.enumeration.RegistryInstrumentType;
import ru.spcex.platform.enumeration.RegistryUnit;
import ru.spcex.platform.enumeration.ServiceStatus;
import javax.annotation.PostConstruct;
import java.math.BigDecimal;
import java.util.Collection;
import static org.junit.jupiter.api.Assertions.assertEquals;
@ -27,14 +29,19 @@ class MoneyExporterServiceTest extends AbstractServiceTest {
@Test
void getLimFileRows() {
clearAllInImdg(tradingClearingRegistryImdg);
Registry registryA = getRegistryA(tcrA, securityIdFirst, RegistryInstrumentType.M.getKey());
Registry registryD = getRegistryD(tcrA, securityIdFirst, RegistryInstrumentType.M.getKey());
Registry registryA = getRegistryA(tcrFirst, securityIdFirst, RegistryInstrumentType.M.getKey());
Registry registryD = getRegistryD(tcrFirst, securityIdFirst, RegistryInstrumentType.M.getKey(), RegistryUnit.T.getKey());
registryImdg.insert(registryA);
registryImdg.insert(registryD);
registryA = getRegistryA(tcrD, securityIdSecond, RegistryInstrumentType.M.getKey());
registryD = getRegistryD(tcrD, securityIdSecond, RegistryInstrumentType.M.getKey());
registryD = getRegistryNegativeD(tcrFirst, securityIdFirst, RegistryInstrumentType.M.getKey(), RegistryUnit.I.getKey());
registryImdg.insert(registryD);
registryA = getRegistryA(tcrSecond, securityIdSecond, RegistryInstrumentType.M.getKey());
registryD = getRegistryD(tcrSecond, securityIdSecond, RegistryInstrumentType.M.getKey(), RegistryUnit.T.getKey());
registryImdg.insert(registryA);
registryImdg.insert(registryD);
registryD = getRegistryNegativeD(tcrFirst, securityIdFirst, RegistryInstrumentType.M.getKey(), RegistryUnit.I.getKey());
registryImdg.insert(registryD);
MoneyExporterService moneyExporterService = new MoneyExporterService(null, kafkaSender, imdgProvider);
Collection<String> limFileRows = moneyExporterService.getLimFileRows();
@ -49,6 +56,6 @@ class MoneyExporterServiceTest extends AbstractServiceTest {
limFileRows = moneyExporterService.getLimFileRows();
assertEquals(2, limFileRows.size());
assertTrue(limFileRows.contains(moneyExporterService.getRow(registryA, registryD)));
assertTrue(limFileRows.contains(moneyExporterService.getRow(registryA, new BigDecimal("5.00"))));
}
}

View file

@ -5,6 +5,7 @@ import ru.clearing.classes.statics.data.registry.Registry;
import ru.clearing.classes.statics.data.registry.TradingClearingRegistry;
import ru.spcex.clearing.lim.exporter.AbstractServiceTest;
import ru.spcex.platform.enumeration.RegistryInstrumentType;
import ru.spcex.platform.enumeration.RegistryUnit;
import ru.spcex.platform.enumeration.ServiceStatus;
import javax.annotation.PostConstruct;
@ -28,12 +29,12 @@ class SecurityExporterServiceTest extends AbstractServiceTest {
@Test
void getLimFileRows() {
clearAllInImdg(tradingClearingRegistryImdg);
Registry registryA = getRegistryA(tcrA, securityIdFirst, RegistryInstrumentType.S.getKey());
Registry registryD = getRegistryD(tcrA, securityIdFirst, RegistryInstrumentType.S.getKey());
Registry registryA = getRegistryA(tcrFirst, securityIdFirst, RegistryInstrumentType.S.getKey());
Registry registryD = getRegistryNegativeD(tcrFirst, securityIdFirst, RegistryInstrumentType.S.getKey(), RegistryUnit.T.getKey());
registryImdg.insert(registryA);
registryImdg.insert(registryD);
registryA = getRegistryA(tcrD, securityIdSecond, RegistryInstrumentType.S.getKey());
registryD = getRegistryD(tcrD, securityIdSecond, RegistryInstrumentType.S.getKey());
registryA = getRegistryA(tcrSecond, securityIdSecond, RegistryInstrumentType.S.getKey());
registryD = getRegistryNegativeD(tcrSecond, securityIdSecond, RegistryInstrumentType.S.getKey(), RegistryUnit.T.getKey());
registryImdg.insert(registryA);
registryImdg.insert(registryD);
@ -50,6 +51,6 @@ class SecurityExporterServiceTest extends AbstractServiceTest {
limFileRows = securityExporterService.getLimFileRows();
assertEquals(2, limFileRows.size());
assertTrue(limFileRows.contains(securityExporterService.getRow(registryA, new BigDecimal("5.00"))));
assertTrue(limFileRows.contains(securityExporterService.getRow(registryA, new BigDecimal("10.00"))));
}
}

View file

@ -20,6 +20,7 @@ public record RegistryTradingParams(RegistryDesignation registryDesignation,
public final static RegistryTradingParams TM_T;
public final static RegistryTradingParams DM_X;
public final static RegistryTradingParams DM_T;
public final static RegistryTradingParams DM_I;
public final static RegistryTradingParams AM_F;
public final static RegistryTradingParams AM_T;
public final static RegistryTradingParams AM_B;
@ -66,6 +67,10 @@ public record RegistryTradingParams(RegistryDesignation registryDesignation,
RegistryInstrumentType.M,
null,
RegistryUnit.T);
DM_I = new RegistryTradingParams(RegistryDesignation.D,
RegistryInstrumentType.M,
null,
RegistryUnit.I);
AM_F = new RegistryTradingParams(RegistryDesignation.A,
RegistryInstrumentType.M,
null,