This commit is contained in:
akulikov 2023-12-29 15:49:28 +03:00
parent ed3c08cdeb
commit 227e76a5ce
7 changed files with 444 additions and 13 deletions

View file

@ -0,0 +1,211 @@
package ru.spcex.clearing.registry.reports.bean;
import com.opencsv.bean.CsvBindByName;
import com.opencsv.bean.CsvBindByPosition;
import com.opencsv.bean.CsvDate;
import com.opencsv.bean.CsvNumber;
import java.math.BigDecimal;
import java.time.LocalDate;
import java.time.LocalTime;
public class ExecutionRegisterReport implements CSVReport {
@CsvBindByName(column = "Наименование биржи")
@CsvBindByPosition(position = 0)
private String clearingOrganization;
@CsvBindByName(column = "Дата заключения сделки")
@CsvBindByPosition(position = 1)
@CsvDate(value = "dd.MM.yyyy")
private LocalDate tradingDate;
@CsvBindByName(column = "Дата исполнения")
@CsvBindByPosition(position = 2)
@CsvDate(value = "dd.MM.yyyy")
private LocalDate settlementDate;
@CsvBindByName(column = "Идентификационный номер сделки в Торговой системе")
@CsvBindByPosition(position = 3)
private Long exchangeExecutionId;
@CsvBindByName(column = "Время заключения сделки в Торговой системе")
@CsvBindByPosition(position = 4)
@CsvDate(value = "HH:mm:ss")
private LocalTime exchangeExecutionTime;
@CsvBindByName(column = "Код БИ")
@CsvBindByPosition(position = 5)
private String security;
@CsvBindByName(column = "Дата возврата")
@CsvBindByPosition(position = 6)
@CsvDate(value = "dd.MM.yyyy")
private LocalDate refundDate;
@CsvBindByName(column = "Код УК - продавца")
@CsvBindByPosition(position = 7)
private String sellerCode;
@CsvBindByName(column = "Наименование УК - продавца")
@CsvBindByPosition(position = 8)
private String seller;
@CsvBindByName(column = "ТКР продавца")
@CsvBindByPosition(position = 9)
private String sellerTkr;
@CsvBindByName(column = "Клиринговый код покупателя")
@CsvBindByPosition(position = 10)
private String buyerCode;
@CsvBindByName(column = "Наименование компании-покупателя")
@CsvBindByPosition(position = 11)
private String buyer;
@CsvBindByName(column = "Торгово-клиринговый регистр покупателя")
@CsvBindByPosition(position = 12)
private String buyerTkr;
@CsvBindByName(column = "Сумма сделки")
@CsvBindByPosition(position = 13)
@CsvNumber(value = "#0.00", writeFormat = "#0.00")
private BigDecimal amount;
@CsvBindByName(column = "Количество ценных бумаг")
@CsvBindByPosition(position = 14)
@CsvNumber(value = "#0.00", writeFormat = "#0.00")
private BigDecimal quantity;
@CsvBindByName(column = "Статус")
@CsvBindByPosition(position = 15)
private String status;
public String getClearingOrganization() {
return clearingOrganization;
}
public void setClearingOrganization(String clearingOrganization) {
this.clearingOrganization = clearingOrganization;
}
public LocalDate getTradingDate() {
return tradingDate;
}
public void setTradingDate(LocalDate tradingDate) {
this.tradingDate = tradingDate;
}
public LocalDate getSettlementDate() {
return settlementDate;
}
public void setSettlementDate(LocalDate settlementDate) {
this.settlementDate = settlementDate;
}
public Long getExchangeExecutionId() {
return exchangeExecutionId;
}
public void setExchangeExecutionId(Long exchangeExecutionId) {
this.exchangeExecutionId = exchangeExecutionId;
}
public LocalTime getExchangeExecutionTime() {
return exchangeExecutionTime;
}
public void setExchangeExecutionTime(LocalTime exchangeExecutionTime) {
this.exchangeExecutionTime = exchangeExecutionTime;
}
public String getSecurity() {
return security;
}
public void setSecurity(String security) {
this.security = security;
}
public LocalDate getRefundDate() {
return refundDate;
}
public void setRefundDate(LocalDate refundDate) {
this.refundDate = refundDate;
}
public String getSellerCode() {
return sellerCode;
}
public void setSellerCode(String sellerCode) {
this.sellerCode = sellerCode;
}
public String getSeller() {
return seller;
}
public void setSeller(String seller) {
this.seller = seller;
}
public String getSellerTkr() {
return sellerTkr;
}
public void setSellerTkr(String sellerTkr) {
this.sellerTkr = sellerTkr;
}
public String getBuyerCode() {
return buyerCode;
}
public void setBuyerCode(String buyerCode) {
this.buyerCode = buyerCode;
}
public String getBuyer() {
return buyer;
}
public void setBuyer(String buyer) {
this.buyer = buyer;
}
public String getBuyerTkr() {
return buyerTkr;
}
public void setBuyerTkr(String buyerTkr) {
this.buyerTkr = buyerTkr;
}
public BigDecimal getAmount() {
return amount;
}
public void setAmount(BigDecimal amount) {
this.amount = amount;
}
public BigDecimal getQuantity() {
return quantity;
}
public void setQuantity(BigDecimal quantity) {
this.quantity = quantity;
}
public String getStatus() {
return status;
}
public void setStatus(String status) {
this.status = status;
}
}

View file

@ -0,0 +1,117 @@
package ru.spcex.clearing.registry.reports.builders;
import ru.clearing.classes.statics.data.company.Company;
import ru.clearing.classes.statics.data.company.CompanySymbols;
import ru.clearing.classes.statics.data.execution.ExecutionCommon;
import ru.clearing.classes.statics.data.execution.ExecutionDeposit;
import ru.clearing.classes.statics.data.execution.ExecutionFond;
import ru.clearing.platform.dictionary.AllowedDictionary;
import ru.spcex.clearing.imdg.IMDGDistributedNames;
import ru.spcex.clearing.registry.reports.bean.ExecutionRegisterReport;
import ru.spcex.platform.enumeration.CompanySymbol;
import ru.spcex.platform.enumeration.MoneyFlowSide;
import ru.spcex.platform.enumeration.Side;
import ru.spcex.platform.imdg.api.Imdg;
import ru.spcex.platform.imdg.api.ImdgProvider;
import java.time.LocalTime;
import java.time.ZoneId;
import java.time.format.DateTimeFormatter;
import java.util.Arrays;
import java.util.Map;
public class ExecutionRegisterReportBuilder extends CSVReportBuilder<ExecutionRegisterReport, ExecutionCommon> {
private final static DateTimeFormatter yyyyMMddFormat = DateTimeFormatter.ofPattern("yyyyMMdd");
private final Imdg<Company> companyImdg;
private final Imdg<CompanySymbols> companySymbolsImdg;
private final Imdg<AllowedDictionary> allowedDictionaryImdg;
public ExecutionRegisterReportBuilder(ImdgProvider imdgProvider) {
companyImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Company, Company.class);
companySymbolsImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_CompanySymbols, CompanySymbols.class);
allowedDictionaryImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_AllowedDictionary, AllowedDictionary.class);
}
@Override
protected String reportName() {
return "Реестр договоров";
}
@Override
protected Class<ExecutionRegisterReport> getReportClass() {
return ExecutionRegisterReport.class;
}
@Override
protected ExecutionRegisterReport toRow(ExecutionCommon input) {
ExecutionRegisterReport entity = new ExecutionRegisterReport();
entity.setClearingOrganization("СПВБ");
entity.setTradingDate(input.getTradingDate());
entity.setExchangeExecutionId(input.getExchangeExecutionId());
if (input.getSide() != null && input.getCompanyId() != null && input.getCounterPartyId() != null) {
CompanySymbols companySymbolsByCompanyId = companySymbolsImdg.getFirstObjectByFieldValues(
Map.of(
"companySymbol", CompanySymbol.CLRC.getKey(),
"companyId", input.getCompanyId()
)
);
CompanySymbols companySymbolsByCounterPartyId = companySymbolsImdg.getFirstObjectByFieldValues(
Map.of(
"companySymbol", CompanySymbol.CLRC.getKey(),
"companyId", input.getCounterPartyId()
)
);
Company companyByCounterPartyId = companyImdg.getSingleObjectByID(input.getCounterPartyId());
Company companyByCompanyId = companyImdg.getSingleObjectByID(input.getCompanyId());
if (Arrays.asList(Side.BUY.getKey(), MoneyFlowSide.BUY.getKey()).contains(input.getSide().toUpperCase())) {
if (companyByCounterPartyId != null) {
entity.setSeller(companyByCounterPartyId.getShortName());
entity.setBuyer(companyByCounterPartyId.getShortName());
}
entity.setSellerCode(companySymbolsByCounterPartyId.getCompanySymbolValue());
entity.setSellerTkr(input.getCounterPartyTradingClearingRegistry());
entity.setBuyerCode(companySymbolsByCompanyId.getCompanySymbolValue());
entity.setBuyerTkr(input.getPartyTradingClearingRegistry());
}
if (Arrays.asList(Side.SELL.getKey(), MoneyFlowSide.SELL.getKey()).contains(input.getSide().toUpperCase())) {
if (companyByCompanyId != null) {
entity.setSeller(companyByCompanyId.getShortName());
entity.setBuyer(companyByCompanyId.getShortName());
}
entity.setSellerCode(companySymbolsByCompanyId.getCompanySymbolValue());
entity.setSeller(input.getPartyTradingClearingRegistry());
entity.setBuyerCode(companySymbolsByCounterPartyId.getCompanySymbolValue());
entity.setBuyerTkr(input.getCounterPartyTradingClearingRegistry());
}
}
if (input.getExchangeExecutionTime() != null)
entity.setExchangeExecutionTime(LocalTime.from(input.getExchangeExecutionTime().atZone(ZoneId.systemDefault())));
if (input instanceof ExecutionDeposit deposit) {
entity.setSettlementDate(deposit.getFirstLegSettlementDate());
entity.setSecurity(deposit.getContract());
entity.setRefundDate(deposit.getSecondLegSettlementDate());
entity.setAmount(deposit.getFirstLegAmount());
} else if (input instanceof ExecutionFond fond) {
entity.setSettlementDate(fond.getSettlementDate());
entity.setSecurity(fond.getSecuritySymbol());
entity.setAmount(fond.getSettlementAmount());
entity.setQuantity(fond.getQuantity());
}
if (input.getCoverageStatus() != null) {
AllowedDictionary allowed = allowedDictionaryImdg.getFirstObjectByFieldValues(
Map.of("code", input.getCoverageStatus())
);
if (allowed != null) entity.setStatus(allowed.getName());
}
return entity;
}
}

View file

@ -64,7 +64,7 @@ public class DepoPaymentInstructionRegisterService extends QueueConsumer impleme
Producer<String, Object> kafkaProducer,
ImdgProvider imdgProvider,
Function<Map<String, ?>, IValidator> fieldValuesValidator,
@Qualifier("reportOutDir") File outFolder,
@Qualifier("reportOutDir") File outFolder,
RegistryServiceSettings settings,
SFTPReportsConfig.ReportsGateway reportsSftpGateway) {
super(kafkaQueue, kafkaProducer);

View file

@ -6,6 +6,7 @@ import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Service;
import ru.clearing.classes.statics.data.account.Account;
import ru.clearing.classes.statics.data.company.CompanySymbols;
@ -17,6 +18,10 @@ import ru.clearing.classes.statics.data.registry.TradingClearingRegistry;
import ru.spcex.clearing.platform.messaging.domain.BaseRequest;
import ru.spcex.clearing.platform.messaging.domain.cud.schedule.LauncherCommandRequest;
import ru.spcex.clearing.platform.messaging.service.QueueConsumer;
import ru.spcex.clearing.registry.config.SFTPReportsConfig;
import ru.spcex.clearing.registry.config.settings.RegistryServiceSettings;
import ru.spcex.clearing.registry.reports.ReportUtils;
import ru.spcex.clearing.registry.reports.builders.ExecutionRegisterReportBuilder;
import ru.spcex.clearing.registry.util.PreClearMap;
import ru.spcex.platform.enumeration.CompanySymbol;
import ru.spcex.platform.enumeration.MoneyFlowSide;
@ -26,12 +31,11 @@ import ru.spcex.platform.imdg.api.ImdgProvider;
import ru.spcex.platform.utils.enumeration.IEnumKey;
import ru.spcex.platform.utils.validation.IValidator;
import java.io.File;
import java.math.BigDecimal;
import java.time.Instant;
import java.time.LocalDate;
import java.util.Collection;
import java.util.Map;
import java.util.Optional;
import java.util.*;
import java.util.function.Function;
import static ru.spcex.clearing.imdg.IMDGDistributedNames.*;
@ -50,11 +54,22 @@ public class ExecutionRegisterService extends QueueConsumer implements Initializ
private final Function<Map<String, ?>, IValidator> fieldValuesValidator;
private final PreClearMap<ExecutionRegister> preClearMap;
private final ExecutionRegisterReportBuilder reportBuilder;
private final File outFolder;
private final RegistryServiceSettings settings;
private final SFTPReportsConfig.ReportsGateway reportsSftpGateway;
private final boolean deleteAfterSend;
@Autowired
public ExecutionRegisterService(Consumer<String, Object> kafkaQueue,
Producer<String, Object> kafkaProducer,
ImdgProvider imdgProvider,
Function<Map<String, ?>, IValidator> fieldValuesValidator) {
Function<Map<String, ?>, IValidator> fieldValuesValidator,
@Qualifier("reportOutDir") File outFolder,
RegistryServiceSettings settings,
SFTPReportsConfig.ReportsGateway reportsSftpGateway) {
super(kafkaQueue, kafkaProducer);
this.executionRegisterMap = imdgProvider.getImdg(Map_ExecutionRegister, ExecutionRegister.class);
this.companySymbolsMap = imdgProvider.getImdg(Map_CompanySymbols, CompanySymbols.class);
@ -63,6 +78,11 @@ public class ExecutionRegisterService extends QueueConsumer implements Initializ
this.tradingClearingRegistryMap = imdgProvider.getImdg(Map_TradingClearingRegistry, TradingClearingRegistry.class);
this.accountImdg = imdgProvider.getImdg(Map_Account, Account.class);
this.fieldValuesValidator = fieldValuesValidator;
this.settings = settings;
this.reportsSftpGateway = reportsSftpGateway;
this.outFolder = outFolder;
reportBuilder = new ExecutionRegisterReportBuilder(imdgProvider);
deleteAfterSend = settings.getReportsStore().isDeleteAfterSend();
preClearMap = PreClearMap.instanceForInstantField(executionRegisterMap, "created");
}
@ -82,6 +102,7 @@ public class ExecutionRegisterService extends QueueConsumer implements Initializ
}
public void executionRegisterNew(BaseRequest<LauncherCommandRequest> userRequest) {
boolean csvMode = settings.isCsvMode();
LocalDate localDateNow = LocalDate.now();
log.debug("ExecutionRegisterNewRequest received");
Collection<ExecutionFond> collectionFond = executionFondMap.getCollectionObjectsByFieldValues(
@ -96,13 +117,21 @@ public class ExecutionRegisterService extends QueueConsumer implements Initializ
));
log.debug("Found {} ExecutionFond and {} ExecutionDeposit on clearingDate={}",
collectionFond.size(), collectionDeposit.size(), localDateNow);
preClearMap.preClearMap();
if (!csvMode) preClearMap.preClearMap();
List<ExecutionCommon> executionCommonForReport = new ArrayList<>();
collectionFond.forEach(x -> {
insertExecutionRegister(true, x);
if (!csvMode) insertExecutionRegister(true, x);
else executionCommonForReport.add(x);
});
collectionDeposit.forEach(x -> {
insertExecutionRegister(false, x);
if (!csvMode) insertExecutionRegister(false, x);
else executionCommonForReport.add(x);
});
if (csvMode) {
File reportFile = reportBuilder.buildReport(executionCommonForReport, outFolder);
ReportUtils.sendFilesToSftp(List.of(reportFile), reportsSftpGateway, deleteAfterSend);
}
log.debug("successfully processed...");
}

View file

@ -1,5 +1,6 @@
package ru.spcex.clearing.registry.service;
import com.opencsv.exceptions.CsvValidationException;
import org.apache.kafka.clients.consumer.MockConsumer;
import org.apache.kafka.clients.producer.Producer;
import org.junit.jupiter.api.MethodOrderer;
@ -7,6 +8,7 @@ import org.junit.jupiter.api.Order;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.TestMethodOrder;
import org.junit.jupiter.api.extension.ExtendWith;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.test.context.ContextConfiguration;
@ -19,7 +21,10 @@ import ru.clearing.classes.statics.data.register.ExecutionRegister;
import ru.clearing.classes.statics.data.registry.TradingClearingRegistry;
import ru.spcex.clearing.imdg.IMDGDistributedNames;
import ru.spcex.clearing.platform.messaging.domain.cud.schedule.LauncherCommandRequest;
import ru.spcex.clearing.registry.config.SFTPTestConfig;
import ru.spcex.clearing.registry.config.TestConfig;
import ru.spcex.clearing.registry.config.ValidationConfig;
import ru.spcex.clearing.registry.config.settings.RegistryServiceSettings;
import ru.spcex.clearing.test.TestUtils;
import ru.spcex.clearing.test.config.ImdgTestConfig;
import ru.spcex.clearing.test.config.KafkaTestConfig;
@ -30,12 +35,14 @@ import ru.spcex.platform.enumeration.Task;
import ru.spcex.platform.imdg.api.Imdg;
import ru.spcex.platform.imdg.api.ImdgProvider;
import javax.annotation.PostConstruct;
import java.io.File;
import java.io.IOException;
import java.math.BigDecimal;
import java.time.Instant;
import java.time.LocalDate;
import java.time.ZoneOffset;
import java.util.Collection;
import java.util.List;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertNull;
@ -46,9 +53,11 @@ import static org.junit.jupiter.api.Assertions.assertNull;
ExecutionRegisterService.class,
ImdgTestConfig.class,
KafkaTestConfig.class,
TestConfig.class,
SFTPTestConfig.class
})
@TestMethodOrder(MethodOrderer.OrderAnnotation.class)
class ExecutionRegisterServiceTest {
class ExecutionRegisterServiceTest implements InitializingBean {
LocalDate TRADING_DATE = LocalDate.of(2020, 1, 1);
Instant EXCHANGE_EXECUTION_TIME = LocalDate.of(2020, 1, 1).atStartOfDay().toInstant(ZoneOffset.UTC);
Long COUNTER_PARTY_ID = 888L;
@ -89,6 +98,9 @@ class ExecutionRegisterServiceTest {
@Autowired
private ExecutionRegisterService executionRegisterService;
@Autowired
private RegistryServiceSettings settings;
@Autowired
@Qualifier("hazelcastServiceTest")
private ImdgProvider imdgProvider;
@ -97,8 +109,13 @@ class ExecutionRegisterServiceTest {
@Qualifier("mockProducer")
private Producer<String, Object> producer;
@PostConstruct
private void init() {
@Autowired
@Qualifier("reportOutDir")
private File outFolder;
@Override
public void afterPropertiesSet() throws Exception {
ImdgTestConfig.waitAvailableImdgProviderAndAddAdminWithDefaultId();
executionDepositImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_ExecutionDeposit, ExecutionDeposit.class);
@ -147,9 +164,56 @@ class ExecutionRegisterServiceTest {
companySymbolsImdg.insert(companySymbolsForCounterPartyId);
}
@Test
@Order(3)
void executionRegisterNewForClearingDate_CSV() throws IOException, CsvValidationException {
ReportTestUtils.resetDir(outFolder);
boolean oldCsvMode = settings.isCsvMode();
settings.setCsvMode(true);
ExecutionFond executionFond = new ExecutionFond();
executionFond.setClearingDate(LocalDate.now());
executionFond.setTradingDate(TRADING_DATE);
executionFond.setExchangeExecutionId(EXCHANGE_EXECUTION_ID);
executionFond.setExchangeExecutionTime(EXCHANGE_EXECUTION_TIME);
executionFond.setSecurityId(SECURITY_ID);
executionFond.setSettlementAmount(SETTLEMENT_AMOUNT);
executionFond.setQuantity(QUANTITY);
executionFond.setCounterPartyTradingClearingRegistryId(TKR_FOR_COUNTER_PARTY_TKR_ID);
executionFond.setTradingClearingRegistryId(TKR_FOR_TKR_ID);
executionFond.setCompanyId(COMPANY_ID);
executionFond.setCounterPartyId(COUNTER_PARTY_ID);
executionFond.setSide(Side.SELL.getKey());
executionFond.setCounterPartyTradingClearingRegistry(COUNTER_PARTY_TKR);
executionFond.setPartyTradingClearingRegistry(PARTY_TKR);
executionFondImdg.insert(executionFond);
LauncherCommandRequest launcherCommandRequest = new LauncherCommandRequest();
String jsonString = TestUtils.getJsonStringForSystem(launcherCommandRequest, 0L);
TestUtils.addRecordToKafka((MockConsumer) executionRegisterService.getConsumer(),
Task.createRegistry_ECNR.topic(),
requestCount++,
0,
jsonString);
TestUtils.waitingSendAndCheckRecord(0L, producer);
File outFile = outFolder.listFiles()[0];
File expectedFile = new File(getClass().getClassLoader().getResource("expected_reports/execution_register_expected.csv").getFile());
ReportTestUtils.compareCSVFiles(expectedFile, outFile, List.of());
executionFondImdg.delete(executionFond);
settings.setCsvMode(oldCsvMode);
ReportTestUtils.deleteDir(outFolder);
}
@Test
@Order(2)
void executionRegisterNewForClearingDate() {
boolean oldCsvMode = settings.isCsvMode();
settings.setCsvMode(false);
ExecutionFond executionFond = new ExecutionFond();
executionFond.setClearingDate(LocalDate.now());
@ -201,11 +265,16 @@ class ExecutionRegisterServiceTest {
assertEquals(executionRegister.getClearingDate(), LocalDate.now());
executionFondImdg.delete(executionFond);
settings.setCsvMode(oldCsvMode);
}
@Test
@Order(1)
void executionRegisterNewFromRequest() {
boolean oldCsvMode = settings.isCsvMode();
settings.setCsvMode(false);
ExecutionDeposit executionDeposit = new ExecutionDeposit();
executionDeposit.setClearingDate(LocalDate.now());
executionDeposit.setTradingDate(TRADING_DATE);
@ -256,5 +325,8 @@ class ExecutionRegisterServiceTest {
assertEquals(executionRegister.getClearingDate(), LocalDate.now());
executionDepositImdg.delete(executionDeposit);
settings.setCsvMode(oldCsvMode);
}
}

View file

@ -1,2 +1,2 @@
"Номер распоряжения","Дата распоряжения","Время формирования","Номер торгового банковского/клирингового счета списания","Наименование владельца счета списания","Код владельца счета списания","Номер торгового банковского/клирингового счета зачисления","Наименование владельца счета зачисления","Код владельца счета зачисления","Код ЦБ","Количество ЦБ"
"1","29.12.2023",,,,,,,,,"1.00"
"1","29.12.2023",,,,,,,,,"1"

1 Номер распоряжения Дата распоряжения Время формирования Номер торгового банковского/клирингового счета списания Наименование владельца счета списания Код владельца счета списания Номер торгового банковского/клирингового счета зачисления Наименование владельца счета зачисления Код владельца счета зачисления Код ЦБ Количество ЦБ
2 1 29.12.2023 1.00 1

View file

@ -0,0 +1,2 @@
"Наименование биржи","Дата заключения сделки","Дата исполнения","Идентификационный номер сделки в Торговой системе","Время заключения сделки в Торговой системе","Код БИ","Дата возврата","Код УК - продавца","Наименование УК - продавца","ТКР продавца","Клиринговый код покупателя","Наименование компании-покупателя","Торгово-клиринговый регистр покупателя","Сумма сделки","Количество ценных бумаг","Статус"
"СПВБ","01.01.2020",,"777","03:00:00",,,"COMPANY_SYMBOL_VALUE_FOR_COMPANY_ID","PARTY_TKR",,"COMPANY_SYMBOL_VALUE_FOR_COUNTER_PARTY_ID",,"COUNTER_PARTY_TKR","777.00","888.00",
1 Наименование биржи Дата заключения сделки Дата исполнения Идентификационный номер сделки в Торговой системе Время заключения сделки в Торговой системе Код БИ Дата возврата Код УК - продавца Наименование УК - продавца ТКР продавца Клиринговый код покупателя Наименование компании-покупателя Торгово-клиринговый регистр покупателя Сумма сделки Количество ценных бумаг Статус
2 СПВБ 01.01.2020 777 03:00:00 COMPANY_SYMBOL_VALUE_FOR_COMPANY_ID PARTY_TKR COMPANY_SYMBOL_VALUE_FOR_COUNTER_PARTY_ID COUNTER_PARTY_TKR 777.00 888.00