Обновил выгрузку ценных бумаг DEPO
This commit is contained in:
psemenkov 2023-08-22 13:44:32 +03:00
parent bc101f6cb4
commit 8e57cd810e
6 changed files with 125 additions and 115 deletions

View file

@ -31,10 +31,7 @@ import static ru.spcex.clearing.platform.messaging.domain.Consts.LIM_EXPORTED;
public abstract class AbstractExporterService {
private final Logger log = LoggerFactory.getLogger(getClass());
protected final Imdg<Registry> registryImdg;
private final List<String> validStatus = List.of(
ServiceStatus.Active.getKey(), ServiceStatus.Reopened.getKey()
// "ACTV", "ROPN"
);
private final List<String> validStatus = List.of(ServiceStatus.Active.getKey(), ServiceStatus.Reopened.getKey());
private final Imdg<TradingClearingRegistry> tradingClearingRegistryImdg;
private final DateTimeFormatter dtFormatter = DateTimeFormatter.ofPattern("yyyyMMddHHmmss");
private final SFTPConfig.LimGateway gateway;

View file

@ -10,12 +10,15 @@ import ru.spcex.clearing.lim.exporter.config.SFTPConfig;
import ru.spcex.clearing.platform.messaging.service.sender.KafkaSender;
import ru.spcex.platform.enumeration.Section;
import ru.spcex.platform.imdg.api.ImdgProvider;
import ru.spcex.platform.imdg.api.predicate.specific.RegistryCodeSqlBuilder;
import java.math.BigDecimal;
import java.time.LocalDate;
import java.util.*;
import java.util.stream.Collectors;
import static ru.spcex.platform.enumeration.RegistryTradingParams.AM_F;
import static ru.spcex.platform.enumeration.RegistryTradingParams.DM_T;
@Service
public class MoneyExporterService extends AbstractExporterService {
private final Logger log = LoggerFactory.getLogger(getClass());
@ -39,18 +42,10 @@ public class MoneyExporterService extends AbstractExporterService {
@Override
public Collection<String> getLimFileRows() {
log.debug("Started loading and formation of money file lines");
LocalDate currentDate = LocalDate.now();
List<String> limFileRows = new ArrayList<>();
Collection<Registry> registriesA = registryImdg.getCollectionObjectsByFieldValues(Map.of(
"registryDesignation", "A",
"registryInstrumentType", "M",
"registryUnit", "F"
));
Collection<Registry> registriesD = registryImdg.getCollectionObjectsByFieldValues(Map.of(
"registryDesignation", "D",
"registryInstrumentType", "M",
"registryUnit", "T"
));
Collection<Registry> registriesA = registryImdg.getCollectionObjectsBySQL(RegistryCodeSqlBuilder.getInstance(AM_F).build());
Collection<Registry> registriesD = registryImdg.getCollectionObjectsBySQL(RegistryCodeSqlBuilder.getInstance(DM_T).build());
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()))

View file

@ -7,14 +7,21 @@ 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.time.LocalDate;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import java.util.Map;
import java.util.function.Function;
import static ru.spcex.platform.enumeration.RegistryTradingParams.AS_F;
import static ru.spcex.platform.enumeration.RegistryTradingParams.DS_T;
@Service
public class SecurityExporterService extends AbstractExporterService {
@ -40,26 +47,35 @@ public class SecurityExporterService extends AbstractExporterService {
@Override
public Collection<String> getLimFileRows() {
log.debug("Started loading and formation of DEPO file lines");
LocalDate currentDate = LocalDate.now();
List<String> limFileRows = new ArrayList<>();
Collection<Registry> registries = registryImdg.getCollectionObjectsByFieldValues(Map.of(
"registryDesignation", "A",
"registryInstrumentType", "S",
"registryUnit", "T"
));
log.debug("Selected {} registriesA.",
registries.size());
for (Registry registry : registries) {
ImdgPredicateBuilder pb = registryImdg.predicateBuilder();
Function<Registry, ImdgPredicate> prdct = registry -> pb.and(
pb.sql(RegistryCodeSqlBuilder.getInstance(DS_T).build()),
pb.equals("registryStatus", RegistryStatus.PROC.getKey()),
pb.equals("companyId", registry.getCompanyId()),
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());
for (Registry registry : registriesA) {
if (checkNotBlocked(registry)) {
limFileRows.add(getRow(registry));
BigDecimal sumPositive = BigDecimal.ZERO;
if(registry.getCompanyId() != null && registry.getTradingClearingRegistry() != null && registry.getSecurityId() != null){
sumPositive = sumPositive(registryImdg.getCollectionObjectsByPredicate(prdct.apply(registry)));
}
limFileRows.add(getRow(registry, sumPositive));
}
}
log.debug("Successfully completed the formation of rows: {} for export DEPO", limFileRows.size());
return limFileRows;
}
public String getRow(Registry registry) {
public String getRow(Registry registry, BigDecimal sumPositive) {
StringBuilder row = new StringBuilder();
row.append("DEPO: FIRM_ID = ");
@ -72,7 +88,8 @@ public class SecurityExporterService extends AbstractExporterService {
row.append(registry.getTradingClearingRegistry());
row.append("; OPEN_BALANCE = ");
row.append(LimFormat.toStringD2(registry.getBalance()));
BigDecimal balance = registry.getBalance() != null ? registry.getBalance().subtract(sumPositive) : BigDecimal.ZERO;
row.append(LimFormat.toStringD2(balance));
row.append("; OPEN_LIMIT = 0");
@ -83,4 +100,15 @@ 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

@ -6,15 +6,20 @@ import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit.jupiter.SpringExtension;
import org.springframework.util.StringUtils;
import ru.clearing.classes.statics.data.registry.Registry;
import ru.clearing.classes.statics.data.registry.TradingClearingRegistry;
import ru.spcex.clearing.imdg.IMDGDistributedNames;
import ru.spcex.clearing.platform.messaging.service.sender.KafkaSender;
import ru.spcex.clearing.test.config.ImdgTestConfig;
import ru.spcex.clearing.test.config.KafkaTestConfig;
import ru.spcex.platform.enumeration.RegistryDesignation;
import ru.spcex.platform.enumeration.RegistryStatus;
import ru.spcex.platform.enumeration.RegistryUnit;
import ru.spcex.platform.imdg.api.Imdg;
import ru.spcex.platform.imdg.api.ImdgProvider;
import java.math.BigDecimal;
import java.time.LocalDate;
import static ru.spcex.clearing.test.config.ImdgTestConfig.currentID;
@ -50,4 +55,53 @@ public abstract class AbstractServiceTest {
this.registryImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Registry, Registry.class);
this.tradingClearingRegistryImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_TradingClearingRegistry, TradingClearingRegistry.class);
}
protected Registry getRegistryA(String tradingClearingRegistry, Long securityId, String registryInstrumentType) {
Registry registry = new Registry();
registry.setTradingCode("1A12323");
registry.setBalance(new BigDecimal("10.00"));
registry.setTradingClearingRegistry(tradingClearingRegistry);
registry.setRegistryDesignation(RegistryDesignation.A.getKey());
registry.setRegistryInstrumentType(registryInstrumentType);
registry.setRegistryUnit(RegistryUnit.F.getKey());
registry.setClearingCode(clearingCode(registry));
registry.setClearingDate(currentDate);
registry.setSecuritySymbol("RUB");
registry.setSecurityId(securityId);
registry.setTradingClearingRegistryId(securityId);
registry.setCompanyId(securityId);
return registry;
}
protected Registry getRegistryD(String tradingClearingRegistry, Long securityId, String registryInstrumentType) {
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.setClearingCode(clearingCode(registry));
registry.setClearingDate(currentDate);
registry.setSecuritySymbol("RUB");
registry.setSecurityId(securityId);
registry.setTradingClearingRegistryId(securityId);
registry.setCompanyId(securityId);
registry.setRegistryStatus(RegistryStatus.PROC.getKey());
return registry;
}
// see clearing-service RegistryUtil:
public static String clearingCode(Registry ofRegistry) {
return clearingCode(ofRegistry.getRegistryDesignation(), ofRegistry.getRegistryInstrumentType(), ofRegistry.getRegistryCapacity(), ofRegistry.getRegistryUnit());
}
public static String clearingCode(String registryDesignation, String registryInstrumentType, String registryCapacity, String registryUnit) {
if (!StringUtils.hasLength(registryDesignation)) registryDesignation = "-";
if (!StringUtils.hasLength(registryInstrumentType)) registryInstrumentType = "-";
if (!StringUtils.hasLength(registryCapacity)) registryCapacity = "-";
if (!StringUtils.hasLength(registryUnit)) registryUnit = "-";
return registryDesignation + registryInstrumentType + registryCapacity + registryUnit;
}
}

View file

@ -1,13 +1,13 @@
package ru.spcex.clearing.lim.exporter.services;
import org.junit.jupiter.api.Test;
import org.springframework.util.StringUtils;
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.ServiceStatus;
import javax.annotation.PostConstruct;
import java.math.BigDecimal;
import java.util.Collection;
import static org.junit.jupiter.api.Assertions.assertEquals;
@ -27,12 +27,12 @@ class MoneyExporterServiceTest extends AbstractServiceTest {
@Test
void getLimFileRows() {
clearAllInImdg(tradingClearingRegistryImdg);
Registry registryA = getRegistryA(tcrA, securityIdFirst);
Registry registryD = getRegistryD(tcrA, securityIdFirst);
Registry registryA = getRegistryA(tcrA, securityIdFirst, RegistryInstrumentType.M.getKey());
Registry registryD = getRegistryD(tcrA, securityIdFirst, RegistryInstrumentType.M.getKey());
registryImdg.insert(registryA);
registryImdg.insert(registryD);
registryA = getRegistryA(tcrD, securityIdSecond);
registryD = getRegistryD(tcrD, securityIdSecond);
registryA = getRegistryA(tcrD, securityIdSecond, RegistryInstrumentType.M.getKey());
registryD = getRegistryD(tcrD, securityIdSecond, RegistryInstrumentType.M.getKey());
registryImdg.insert(registryA);
registryImdg.insert(registryD);
@ -42,7 +42,7 @@ class MoneyExporterServiceTest extends AbstractServiceTest {
TradingClearingRegistry tradingClearingRegistry = new TradingClearingRegistry();
tradingClearingRegistry.setId(securityIdFirst);
tradingClearingRegistry.setStatus("ACTV");
tradingClearingRegistry.setStatus(ServiceStatus.Active.getKey());
tradingClearingRegistryImdg.insert(tradingClearingRegistry);
tradingClearingRegistry.setId(securityIdSecond);
tradingClearingRegistryImdg.insert(tradingClearingRegistry);
@ -51,51 +51,4 @@ class MoneyExporterServiceTest extends AbstractServiceTest {
assertEquals(2, limFileRows.size());
assertTrue(limFileRows.contains(moneyExporterService.getRow(registryA, registryD)));
}
private Registry getRegistryA(String tradingClearingRegistry, Long securityId) {
Registry registry = new Registry();
registry.setTradingCode("1A12323");
registry.setBalance(new BigDecimal("10.00"));
registry.setTradingClearingRegistry(tradingClearingRegistry);
registry.setRegistryDesignation("A");
registry.setRegistryInstrumentType("M");
registry.setRegistryUnit("F");
registry.setClearingCode(clearingCode(registry));
registry.setClearingDate(currentDate);
registry.setSecuritySymbol("RUB");
registry.setSecurityId(securityId);
registry.setTradingClearingRegistryId(securityId);
return registry;
}
private Registry getRegistryD(String tradingClearingRegistry, Long securityId) {
Registry registry = new Registry();
registry.setTradingCode("1A12323");
registry.setBalance(new BigDecimal("5.00"));
registry.setTradingClearingRegistry(tradingClearingRegistry);
registry.setRegistryDesignation("D");
registry.setRegistryInstrumentType("M");
registry.setRegistryUnit("T");
registry.setClearingCode(clearingCode(registry));
registry.setClearingDate(currentDate);
registry.setSecuritySymbol("RUB");
registry.setSecurityId(securityId);
registry.setTradingClearingRegistryId(securityId);
return registry;
}
// see clearing-service ReistryUtil:
public static String clearingCode(Registry ofRegistry) {
return clearingCode(ofRegistry.getRegistryDesignation(), ofRegistry.getRegistryInstrumentType(), ofRegistry.getRegistryCapacity(), ofRegistry.getRegistryUnit());
}
public static String clearingCode(String registryDesignation, String registryInstrumentType, String registryCapacity, String registryUnit) {
if (StringUtils.isEmpty(registryDesignation)) registryDesignation = "-";
if (StringUtils.isEmpty(registryInstrumentType)) registryInstrumentType = "-";
if (StringUtils.isEmpty(registryCapacity)) registryCapacity = "-";
if (StringUtils.isEmpty(registryUnit)) registryUnit = "-";
return registryDesignation + registryInstrumentType + registryCapacity + registryUnit;
}
}

View file

@ -4,6 +4,8 @@ import org.junit.jupiter.api.Test;
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.ServiceStatus;
import javax.annotation.PostConstruct;
import java.math.BigDecimal;
@ -11,7 +13,6 @@ import java.util.Collection;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertTrue;
import static ru.spcex.clearing.lim.exporter.services.MoneyExporterServiceTest.clearingCode;
import static ru.spcex.clearing.test.TestUtils.clearAllInImdg;
class SecurityExporterServiceTest extends AbstractServiceTest {
@ -27,14 +28,14 @@ class SecurityExporterServiceTest extends AbstractServiceTest {
@Test
void getLimFileRows() {
clearAllInImdg(tradingClearingRegistryImdg);
Registry registry1 = getRegistry(tcrA, securityIdFirst);
Registry registry2 = getRegistry(tcrA, securityIdFirst);
registryImdg.insert(registry1);
registryImdg.insert(registry2);
registry1 = getRegistry(tcrD, securityIdSecond);
registry2 = getRegistry(tcrD, securityIdSecond);
registryImdg.insert(registry1);
registryImdg.insert(registry2);
Registry registryA = getRegistryA(tcrA, securityIdFirst, RegistryInstrumentType.S.getKey());
Registry registryD = getRegistryD(tcrA, securityIdFirst, RegistryInstrumentType.S.getKey());
registryImdg.insert(registryA);
registryImdg.insert(registryD);
registryA = getRegistryA(tcrD, securityIdSecond, RegistryInstrumentType.S.getKey());
registryD = getRegistryD(tcrD, securityIdSecond, RegistryInstrumentType.S.getKey());
registryImdg.insert(registryA);
registryImdg.insert(registryD);
SecurityExporterService securityExporterService = new SecurityExporterService(null, kafkaSender, imdgProvider);
Collection<String> limFileRows = securityExporterService.getLimFileRows();
@ -42,31 +43,13 @@ class SecurityExporterServiceTest extends AbstractServiceTest {
TradingClearingRegistry tradingClearingRegistry = new TradingClearingRegistry();
tradingClearingRegistry.setId(securityIdFirst);
tradingClearingRegistry.setStatus("ACTV");
tradingClearingRegistry.setStatus(ServiceStatus.Active.getKey());
tradingClearingRegistryImdg.insert(tradingClearingRegistry);
tradingClearingRegistry.setId(securityIdSecond);
tradingClearingRegistryImdg.insert(tradingClearingRegistry);
limFileRows = securityExporterService.getLimFileRows();
assertEquals(4, limFileRows.size());
assertTrue(limFileRows.contains(securityExporterService.getRow(registry1)));
assertTrue(limFileRows.contains(securityExporterService.getRow(registry2)));
}
private Registry getRegistry(String tradingClearingRegistry, Long securityId) {
Registry registry = new Registry();
registry.setTradingCode("1A12323");
registry.setBalance(new BigDecimal("10.00"));
registry.setTradingClearingRegistry(tradingClearingRegistry);
registry.setRegistryDesignation("A");
registry.setRegistryInstrumentType("S");
registry.setRegistryUnit("T");
registry.setClearingCode(clearingCode(registry));
registry.setClearingDate(currentDate);
registry.setSecuritySymbol("RUB");
registry.setSecurityId(securityId);
registry.setTradingClearingRegistryId(securityId);
return registry;
assertEquals(2, limFileRows.size());
assertTrue(limFileRows.contains(securityExporterService.getRow(registryA, new BigDecimal("5.00"))));
}
}