parent
0933657ea3
commit
e9636e8723
7 changed files with 93 additions and 65 deletions
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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());
|
||||
|
|
|
|||
|
|
@ -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"))));
|
||||
}
|
||||
}
|
||||
|
|
@ -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"))));
|
||||
}
|
||||
}
|
||||
|
|
@ -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,
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue