Реализовал формирование уведомлений newInfoAccount и newTradingClearingRegistry.
This commit is contained in:
psemenkov 2023-06-07 16:02:13 +03:00
parent c8f7f5212e
commit e049752508
12 changed files with 633 additions and 6 deletions

View file

@ -204,7 +204,13 @@ public class DOCXService {
* Сбор ключей из параграфа
*/
private void collectKeysFromParagraph(XWPFParagraph paragraph) {
for (XWPFRun run : paragraph.getRuns()) {
XWPFRun runForConcat = null;
int first = 0;
String concatText = "";
boolean needConcat = false;
List<XWPFRun> runs = paragraph.getRuns();
for (XWPFRun run : runs) {
boolean finded = false;
try {
int MAX_POSITION = 128;
for (int currPos = 0; currPos < MAX_POSITION; currPos++) {
@ -212,9 +218,53 @@ public class DOCXService {
if (currText == null) break;
Matcher matcher = keyPattern.matcher(currText);
while (matcher.find()) {
finded = true;
String key = matcher.group();
keyPositions.add(new KeyPositionInDoc(key, run, currPos));
}
/**
* если ключ не нашли регуляркой но есть начало ключа "${" соберем ключ из фрагментов и отделим от текста
* например из фрагментов XWPFRun(учитывается только текст):
* [test , someText${, some, Key}/${ano, ther, Key}someText, test]
* получим [test , someText, ${someKey}, /, ${anotherKey}, someText, test]
*/
if (needConcat) {
concatText = concatText + currText;
if (currText.contains("}")) {
String[] strAr = new String[3];
int start = concatText.indexOf("${");
int end = concatText.indexOf("}") + 1;
strAr[0] = concatText.substring(0, start);
strAr[1] = concatText.substring(start, end);
strAr[2] = concatText.substring(end, concatText.length());
int last = runs.indexOf(run);
for (int i = first; i <= last; i++) {
if (i - first < 3) {
runs.get(i).setText(strAr[i - first], 0);
if (i - first == 1) {
keyPositions.add(new KeyPositionInDoc(runs.get(i).getText(0), runs.get(i), 0));
}
} else {
runs.get(i).setText("", 0);
}
}
currText = strAr[2];
if (currText.contains("${")) {
needConcat = true;
concatText = currText;
first = runs.indexOf(run);
} else {
needConcat = false;
concatText = "";
first = 0;
}
}
} else if (currText.contains("${") && !finded) {
needConcat = true;
concatText = currText;
first = runs.indexOf(run);
}
}
} catch (IndexOutOfBoundsException ignored) {
// can't get all max text position for XWPFRun

View file

@ -0,0 +1,105 @@
package ru.spcex.clearing.reports.notifications;
import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;
import ru.clearing.classes.statics.data.account.Account;
import ru.clearing.classes.statics.data.company.Company;
import ru.clearing.classes.statics.data.company.CompanySymbols;
import ru.clearing.classes.statics.data.profile.ProfileDocument;
import ru.spcex.clearing.imdg.IMDGDistributedNames;
import ru.spcex.platform.imdg.api.Imdg;
import ru.spcex.platform.imdg.api.ImdgProvider;
import java.io.File;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.util.Collection;
import java.util.HashMap;
import java.util.Map;
@Component
public class NCMPNotificationBuilder extends NotificationBuilder {
private final Logger log = LoggerFactory.getLogger(getClass());
private final Imdg<Company> companyImdg;
private final Imdg<ProfileDocument> profileDocumentImdg;
private final Imdg<Account> accountImdg;
private final Imdg<CompanySymbols> companySymbolsImdg;
public NCMPNotificationBuilder(ImdgProvider imdgProvider) {
super(null);
this.companyImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Company, Company.class);
this.profileDocumentImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_ProfileDocument, ProfileDocument.class);
this.accountImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Account, Account.class);
this.companySymbolsImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_CompanySymbols, CompanySymbols.class);
}
@Override
public File buildNotification(Long consumerId) {
Company company = companyImdg.getSingleObjectByID(consumerId);
if (company == null) {
log.error("Company for companyId={} is null", consumerId);
return null;
}
String companyClearingCode = company.getClearingCode();
if (StringUtils.isBlank(companyClearingCode)) {
log.error("Company.clearing_code for companyId={} is null", consumerId);
return null;
}
String profileDocumentSql = "companyId = %d AND documentType = CLRN".formatted(consumerId);
ProfileDocument profileDocument = null;
Collection<ProfileDocument> profileDocuments = profileDocumentImdg.getCollectionObjectsBySQL(profileDocumentSql);
if (profileDocuments.size() >= 1) {
profileDocument = profileDocuments.iterator().next();
} else {
log.warn("ProfileDocument with sql {} not found", profileDocumentSql);
return null;
}
String companySymbolsValueINN = getCompanySymbolValue("companyId = %d AND companySymbol = INN".formatted(consumerId), companySymbolsImdg);
String companySymbolValueCLRC = getCompanySymbolValue("companyId = %d AND companySymbol = CLRC".formatted(consumerId), companySymbolsImdg);
String companySymbolValueRGRC = getCompanySymbolValue("companyId = %d AND companySymbol = RGRC".formatted(consumerId), companySymbolsImdg);
String accountSql = "companyId = %d AND accountType = INFO".formatted(consumerId);
Account account = null;
Collection<Account> accounts = accountImdg.getCollectionObjectsBySQL(accountSql);
if (profileDocuments.size() >= 1) {
account = accounts.iterator().next();
} else {
log.warn("Account with sql {} not found", accountSql);
return null;
}
Map<String, String> valuesForTemplate = new HashMap<>();
valuesForTemplate.put("${issDate}", profileDocument.getIssueDate().format(dateFormatter));
valuesForTemplate.put("${date}", LocalDate.now().format(dateFormatterYYMMDD));
valuesForTemplate.put("${profileDocumentNumber}", getNotNull(profileDocument.getNumber()));
valuesForTemplate.put("${companyFullName}", getNotNull(company.getFullName()));
valuesForTemplate.put("${companyShortName}", getNotNull(company.getShortName()));
valuesForTemplate.put("${companySymbolsValueINN}", companySymbolsValueINN);
valuesForTemplate.put("${companySymbolValueCLRC}", companySymbolValueCLRC);
valuesForTemplate.put("${companySymbolValueRGRC}", companySymbolValueRGRC);
valuesForTemplate.put("${accountINFO}", getNotNull(account.getAccount()));
String outputFilename = "NCMP.%s.%s.docx".formatted(companyClearingCode, filenameDateTimeFormatter.format(LocalDateTime.now()));
File outputFile = createOutFile(outputFilename);
try {
docxService.insertValues(outputFile, valuesForTemplate, true);
} catch (Exception e) {
log.error("Can't insert values into template.", e);
return null;
}
return outputFile;
}
@Override
protected String getTemplateResourceName() {
return "templates/NCMP_TEMPLATE.docx";
}
}

View file

@ -0,0 +1,96 @@
package ru.spcex.clearing.reports.notifications;
import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;
import ru.clearing.classes.statics.data.company.Company;
import ru.clearing.classes.statics.data.company.CompanySymbols;
import ru.clearing.classes.statics.data.registry.TradingClearingRegistry;
import ru.spcex.clearing.imdg.IMDGDistributedNames;
import ru.spcex.platform.imdg.api.Imdg;
import ru.spcex.platform.imdg.api.ImdgProvider;
import java.io.File;
import java.time.Instant;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.ZoneId;
import java.util.HashMap;
import java.util.Map;
@Component
public class NTCRNotificationBuilder extends NotificationBuilder {
private final Logger log = LoggerFactory.getLogger(getClass());
private final Imdg<Company> companyImdg;
private final Imdg<TradingClearingRegistry> tradingClearingRegistryImdg;
private final Imdg<CompanySymbols> companySymbolsImdg;
public NTCRNotificationBuilder(ImdgProvider imdgProvider) {
super(null);
imdgProvider.waitAvailable();
this.companyImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Company, Company.class);
this.tradingClearingRegistryImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_TradingClearingRegistry, TradingClearingRegistry.class);
this.companySymbolsImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_CompanySymbols, CompanySymbols.class);
}
@Override
public File buildNotification(Long consumerId) {
TradingClearingRegistry tradingClearingRegistry = tradingClearingRegistryImdg.getSingleObjectByID(consumerId);
if (tradingClearingRegistry == null) {
log.error("TradingClearingRegistry for Id={} is null", consumerId);
return null;
}
Instant createdAt = tradingClearingRegistry.getCreated();
if (createdAt == null) {
log.error("TradingClearingRegistry.created for id={} is null", consumerId);
return null;
}
Company company = companyImdg.getSingleObjectByID(tradingClearingRegistry.getCompanyId());
if (company == null) {
log.error("Company for companyId={} is null", consumerId);
return null;
}
String companyClearingCode = company.getClearingCode();
if (StringUtils.isBlank(companyClearingCode)) {
log.error("Company.clearing_code for companyId={} is null", consumerId);
return null;
}
String companySymbolValueCLRC = getCompanySymbolValue("companyId = %d AND companySymbol = CLRC".formatted(consumerId), companySymbolsImdg);
Map<String, String> valuesForTemplate = new HashMap<>();
valuesForTemplate.put("${createdAt}", dateFormatter.format(createdAt.atZone(ZoneId.systemDefault()).toLocalDate()));
valuesForTemplate.put("${date}", LocalDate.now().format(dateFormatterYYMMDD));
valuesForTemplate.put("${TCRCode}", getNotNull(tradingClearingRegistry.getCode()));
valuesForTemplate.put("${companyFullName}", getNotNull(company.getFullName()));
valuesForTemplate.put("${companyShortName}", getNotNull(company.getShortName()));
valuesForTemplate.put("${companySymbolValueCLRC}", companySymbolValueCLRC);
valuesForTemplate.put("${TCRPurpose}", getNotNull(tradingClearingRegistry.getTradingClearingRegistryPurpose()));
valuesForTemplate.put("${TCRMoneyAccountId}", getNotNull(tradingClearingRegistry.getMoneyAccountId()));
valuesForTemplate.put("${TCRDepoAccountId}", getNotNull(tradingClearingRegistry.getDepoAccountId()));
String outputFilename = "NTCR.%s.%s.docx".formatted(companyClearingCode, filenameDateTimeFormatter.format(LocalDateTime.now()));
outputFilename = normalizeFilenameForOS(outputFilename);
File outputFile = createOutFile(outputFilename);
try {
docxService.insertValues(outputFile, valuesForTemplate, true);
} catch (Exception e) {
log.error("Can't insert values into template.", e);
return null;
}
return outputFile;
}
@Override
protected String getTemplateResourceName() {
return "templates/NTCR_TEMPLATE.docx";
}
}

View file

@ -2,21 +2,26 @@ package ru.spcex.clearing.reports.notifications;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import ru.clearing.classes.statics.data.company.CompanySymbols;
import ru.spcex.clearing.reports.exceptions.ConfigException;
import ru.spcex.platform.imdg.api.Imdg;
import java.io.File;
import java.net.URL;
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.time.format.TextStyle;
import java.util.Collection;
import java.util.Locale;
import java.util.Map;
public abstract class NotificationBuilder {
protected final Logger log = LoggerFactory.getLogger(getClass());
protected final DateTimeFormatter filenameDateTimeFormatter = DateTimeFormatter.ofPattern("dd.MM.yyyy'T'HH:mm:ss");
protected final DateTimeFormatter filenameDateTimeFormatter = DateTimeFormatter.ofPattern("YYMMDDHHmmssSSS");
protected final DateTimeFormatter dateFormatter = DateTimeFormatter.ofPattern("dd.MM.yyyy");
protected final DateTimeFormatter dateFormatterYYMMDD = DateTimeFormatter.ofPattern("YYMMDD");
protected final DOCXService docxService;
protected File outFolder;
protected NotificationBuilder(String keyPattern) {
this.docxService = new DOCXService();
@ -26,6 +31,12 @@ public abstract class NotificationBuilder {
abstract public File buildNotification(Long consumerId);
public File buildNotification(Long consumerId, File outFolder) {
assert outFolder != null && outFolder.isDirectory();
setOutFolder(outFolder);
return buildNotification(consumerId);
}
protected void fillHeaderValues(Map<String, String> valuesMap, Long notificationId) {
LocalDate notificationDate = LocalDate.now();
int day = notificationDate.getDayOfMonth();
@ -48,7 +59,7 @@ public abstract class NotificationBuilder {
resource = getClass().getClassLoader().getResource(templateResourceName);
if (resource == null) throw new Exception();
} catch (Exception e) {
throw new ConfigException("Can't read template resource " + templateResourceName +" (URL \""+resource+"\")", e);
throw new ConfigException("Can't read template resource " + templateResourceName + " (URL \"" + resource + "\")", e);
}
log.info("Use resource: {}", resource);
return resource;
@ -60,5 +71,31 @@ public abstract class NotificationBuilder {
return filename;
}
protected String getCompanySymbolValue(String companySymbolsSql, Imdg<CompanySymbols> companySymbolsImdg) {
CompanySymbols companySymbols;
Collection<CompanySymbols> companySymbolsCollection = companySymbolsImdg.getCollectionObjectsBySQL(companySymbolsSql);
if (companySymbolsCollection.size() >= 1) {
companySymbols = companySymbolsCollection.iterator().next();
} else {
// log.warn("CompanySymbols with sql {} not found", companySymbolsSql);
return "";
}
return companySymbols.getCompanySymbolValue();
}
protected String getNotNull(Object value) {
if (value == null) return "";
return value.toString();
}
abstract protected String getTemplateResourceName();
public File createOutFile(String outputFilename) {
if (outFolder != null && outFolder.isDirectory()) return new File(outFolder, outputFilename);
return new File(outputFilename);
}
public void setOutFolder(File outFolder) {
this.outFolder = outFolder;
}
}

View file

@ -0,0 +1,94 @@
package ru.spcex.clearing.reports.services;
import org.apache.kafka.clients.consumer.Consumer;
import org.apache.kafka.clients.producer.Producer;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.stereotype.Service;
import ru.spcex.clearing.platform.messaging.domain.BaseRequest;
import ru.spcex.clearing.platform.messaging.domain.Consts;
import ru.spcex.clearing.platform.messaging.domain.cud.reports.NotificationRequest;
import ru.spcex.clearing.platform.messaging.service.QueueConsumer;
import ru.spcex.clearing.platform.messaging.service.RequestInfoUpdate;
import ru.spcex.clearing.reports.config.element.ReportsServiceSettings;
import ru.spcex.clearing.reports.notifications.NCMPNotificationBuilder;
import ru.spcex.clearing.util.security.UserRoleVerification;
import java.io.File;
import java.util.Map;
@Service
public class NotificationService extends QueueConsumer implements InitializingBean {
private final Logger log = LoggerFactory.getLogger(getClass());
private final UserRoleVerification userRoleVerification;
private final NCMPNotificationBuilder ncmpNotificationBuilder;
private final File outFolder;
public NotificationService(Consumer<String, Object> kafkaQueue,
Producer<String, Object> kafkaResponseQueue,
UserRoleVerification userRoleVerification,
NCMPNotificationBuilder ncmpNotificationBuilder,
ReportsServiceSettings reportsServiceSettings) {
super(kafkaQueue, kafkaResponseQueue);
this.userRoleVerification = userRoleVerification;
this.ncmpNotificationBuilder = ncmpNotificationBuilder;
this.outFolder = new File(reportsServiceSettings.getReportModuleOut());
assert outFolder.isDirectory();
}
@Override
public void afterPropertiesSet() throws Exception {
callback(NotificationRequest.class)
.setFunction(this::createNotificationNCMP)
.forDestination(Consts.CREATE_NOTIFICATION_NCMP, callbacks::put);
callback(NotificationRequest.class)
.setFunction(this::createNotificationNTCR)
.forDestination(Consts.CREATE_NOTIFICATION_NTCR, callbacks::put);
init();
}
public RequestInfoUpdate createNotificationNCMP(BaseRequest<NotificationRequest> userRequest) {
log.debug("NotificationRequest NCMP received");
RequestInfoUpdate requestInfoUpdate = userRoleVerification.validateRoleAndGetResult(userRequest);
if (requestInfoUpdate != null) return null;
NotificationRequest req = userRequest.getRequestPayload();
logUnknownProperties(userRequest);
File outFile = ncmpNotificationBuilder.buildNotification(req.getConsumerId(), outFolder);
if (outFile == null) {
log.error("Create notification NCMP for id={} failed, see log", req.getConsumerId());
} else {
log.debug("Notification NCMP for id={} successfully created. Output files: {}", req.getConsumerId(), outFile);
}
return null;
}
public RequestInfoUpdate createNotificationNTCR(BaseRequest<NotificationRequest> userRequest) {
log.debug("NotificationRequest NTCR received");
RequestInfoUpdate requestInfoUpdate = userRoleVerification.validateRoleAndGetResult(userRequest);
if (requestInfoUpdate != null) return null;
NotificationRequest req = userRequest.getRequestPayload();
logUnknownProperties(userRequest);
File outFile = ncmpNotificationBuilder.buildNotification(req.getConsumerId(), outFolder);
if (outFile == null) {
log.error("Create notification NTCR for id={} failed, see log", req.getConsumerId());
} else {
log.debug("Notification NTCR for id={} successfully created. Output files: {}", req.getConsumerId(), outFile);
}
return null;
}
private void logUnknownProperties(BaseRequest<?> request) {
Map<String, Object> unknownProperties = request.getUnknownProperties();
for (Map.Entry<String, Object> unknownProperty : unknownProperties.entrySet()) {
log.warn("Unknown property in request {} = {}", unknownProperty.getKey(), unknownProperty.getValue());
}
}
}

View file

@ -0,0 +1,100 @@
package ru.spcex.clearing.reports.notifications;
import org.junit.jupiter.api.extension.ExtendWith;
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 ru.clearing.classes.statics.data.account.Account;
import ru.clearing.classes.statics.data.company.Company;
import ru.clearing.classes.statics.data.company.CompanySymbols;
import ru.clearing.classes.statics.data.profile.ProfileDocument;
import ru.spcex.clearing.imdg.IMDGDistributedNames;
import ru.spcex.clearing.test.config.ImdgTestConfig;
import ru.spcex.clearing.test.config.KafkaTestConfig;
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.nio.file.Files;
import java.time.LocalDate;
import static ru.spcex.clearing.test.config.ImdgTestConfig.currentID;
import static ru.spcex.clearing.test.config.ImdgTestConfig.waitAvailableImdgProviderAndAddAdminWithDefaultId;
@ExtendWith(SpringExtension.class)
@ContextConfiguration(classes = {
ImdgTestConfig.class,
KafkaTestConfig.class})
class NCMPNotificationBuilderTest {
private Long consumerId = 888L;
private Imdg<Company> companyImdg;
private Imdg<ProfileDocument> profileDocumentImdg;
private Imdg<Account> accountImdg;
private Imdg<CompanySymbols> companySymbolsImdg;
@Autowired
@Qualifier("hazelcastServiceTest")
protected ImdgProvider imdgProvider;
@PostConstruct
protected void init() {
waitAvailableImdgProviderAndAddAdminWithDefaultId();
companyImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Company, Company.class);
profileDocumentImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_ProfileDocument, ProfileDocument.class);
accountImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Account, Account.class);
companySymbolsImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_CompanySymbols, CompanySymbols.class);
Company company = new Company();
company.setId(consumerId);
company.setClearingCode("326546");
company.setShortName("ShortName");
company.setFullName("FullName");
companyImdg.insert(company);
ProfileDocument profileDocument = new ProfileDocument();
profileDocument.setCompanyId(consumerId);
profileDocument.setIssueDate(LocalDate.now());
profileDocument.setNumber("65446565");
profileDocument.setDocumentType("CLRN");
profileDocumentImdg.insert(profileDocument);
CompanySymbols companySymbols = new CompanySymbols();
companySymbols.setId(currentID.getAndIncrement());
companySymbols.setCompanyId(consumerId);
companySymbols.setCompanySymbol("INN");
companySymbols.setCompanySymbolValue("INN 65324654646446");
companySymbolsImdg.insert(companySymbols);
companySymbols.setId(currentID.getAndIncrement());
companySymbols.setCompanySymbol("CLRC");
companySymbols.setCompanySymbolValue("CLRC test");
companySymbolsImdg.insert(companySymbols);
companySymbols.setId(currentID.getAndIncrement());
companySymbols.setCompanySymbol("RGRC");
companySymbols.setCompanySymbolValue("RGRC test");
companySymbolsImdg.insert(companySymbols);
// clearAllInImdg(accountImdg);
Account account = new Account();
account.setId(consumerId);
account.setCompanyId(consumerId);
account.setAccountType("INFO");
account.setAccount("3548903459684");
accountImdg.insert(account);
}
// @Test//тест заполнения шаблона
void buildNotification() {
NCMPNotificationBuilder builder = new NCMPNotificationBuilder(imdgProvider);
File outputFile = builder.buildNotification(consumerId);
try {
Files.deleteIfExists(outputFile.toPath());
} catch (IOException e) {
throw new RuntimeException(e);
}
}
}

View file

@ -0,0 +1,84 @@
package ru.spcex.clearing.reports.notifications;
import org.junit.jupiter.api.extension.ExtendWith;
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 ru.clearing.classes.statics.data.company.Company;
import ru.clearing.classes.statics.data.company.CompanySymbols;
import ru.clearing.classes.statics.data.registry.TradingClearingRegistry;
import ru.spcex.clearing.imdg.IMDGDistributedNames;
import ru.spcex.clearing.test.config.ImdgTestConfig;
import ru.spcex.clearing.test.config.KafkaTestConfig;
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.nio.file.Files;
import java.time.Instant;
import static ru.spcex.clearing.test.config.ImdgTestConfig.currentID;
import static ru.spcex.clearing.test.config.ImdgTestConfig.waitAvailableImdgProviderAndAddAdminWithDefaultId;
@ExtendWith(SpringExtension.class)
@ContextConfiguration(classes = {
ImdgTestConfig.class,
KafkaTestConfig.class})
class NTCRNotificationBuilderTest {
private Long consumerId = 222L;
private Imdg<Company> companyImdg;
private Imdg<TradingClearingRegistry> tradingClearingRegistryImdg;
private Imdg<CompanySymbols> companySymbolsImdg;
@Autowired
@Qualifier("hazelcastServiceTest")
protected ImdgProvider imdgProvider;
@PostConstruct
protected void init() {
waitAvailableImdgProviderAndAddAdminWithDefaultId();
this.companyImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Company, Company.class);
this.tradingClearingRegistryImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_TradingClearingRegistry, TradingClearingRegistry.class);
this.companySymbolsImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_CompanySymbols, CompanySymbols.class);
Company company = new Company();
company.setId(consumerId);
company.setClearingCode("326546");
company.setShortName("ShortName test");
company.setFullName("FullName test");
companyImdg.insert(company);
CompanySymbols companySymbols = new CompanySymbols();
companySymbols.setId(currentID.getAndIncrement());
companySymbols.setCompanyId(consumerId);
companySymbols.setCompanySymbol("CLRC");
companySymbols.setCompanySymbolValue("Symbol test");
companySymbolsImdg.insert(companySymbols);
TradingClearingRegistry tradingClearingRegistry = new TradingClearingRegistry();
tradingClearingRegistry.setId(consumerId);
tradingClearingRegistry.setCreated(Instant.now());
tradingClearingRegistry.setCompanyId(consumerId);
tradingClearingRegistry.setCode("test code");
tradingClearingRegistry.setTradingClearingRegistryPurpose("test Purpose");
tradingClearingRegistry.setMoneyAccountId(consumerId);
tradingClearingRegistry.setDepoAccountId(consumerId);
tradingClearingRegistryImdg.insert(tradingClearingRegistry);
}
// @Test//тест заполнения шаблона
void buildNotification() {
NTCRNotificationBuilder builder = new NTCRNotificationBuilder(imdgProvider);
File outputFile = builder.buildNotification(consumerId);
try {
Files.deleteIfExists(outputFile.toPath());
} catch (IOException e) {
throw new RuntimeException(e);
}
}
}

View file

@ -4,7 +4,9 @@ import org.junit.jupiter.api.Test;
import ru.spcex.clearing.reports.notifications.DOCXService;
import java.io.File;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
class DOCXServiceTest {
@ -30,4 +32,61 @@ class DOCXServiceTest {
file.delete();
}
// @Test//для отладки алгоритма объединения ключей
void normalize() {
List<String> data = Arrays.asList(new String[]{"test ", "someText${", "some", "Key}/${ano", "ther", "Key}someText", "test"});
String concatText = "";
boolean needConcat = false;
int first = 0;
for (String run : data) {
boolean finded = false;
try {
String currText = run;
if (currText == null) break;
if (needConcat) {
concatText = concatText + currText;
if (currText.contains("}")) {
String[] strAr = new String[3];
int start = concatText.indexOf("${");
int end = concatText.indexOf("}") + 1;
strAr[0] = concatText.substring(0, start);
strAr[1] = concatText.substring(start, end);
strAr[2] = concatText.substring(end, concatText.length());
System.out.println(strAr);
int last = data.indexOf(currText);
for (int i = first; i <= last; i++){
if (i - first < 3){
data.set(i, strAr[i - first]);
}
else {
data.set(i, "");
}
}
currText = strAr[2];
if (currText.contains("${")){
needConcat = true;
concatText = currText;
first = data.indexOf(currText);
} else {
needConcat = false;
concatText = "";
first = 0;
}
}
} else if (currText.contains("${") && !finded) {
needConcat = true;
concatText = currText;
first = data.indexOf(currText);
}
} catch (IndexOutOfBoundsException ignored) {
// can't get all max text position for XWPFRun
}
}
System.out.println(data.toString());
}
}

View file

@ -77,6 +77,8 @@ public interface Consts {
String DESTINATION_BANK_ACCOUNT_NEW = "bank-account-new";
String CREATE_REPORT = "create-report";
String CREATE_NOTIFICATION_NTCR = "create-notification-ntcr";
String CREATE_NOTIFICATION_NCMP = "create-notification-ncmp";
String CREATE_REPORT_FOR_SESSION_ID = "create-report-for-session-id";
String CREATE_REPORT_FOR_SESSION_ID_LIST = "create-report-for-session-id-list";
String CREATE_REPORT_FOR_PERIOD = "create-report-for-period";

View file

@ -10,14 +10,14 @@ public class NotificationRequest {
* Идентификатор участника клиринга
*/
@JsonProperty
protected String consumerId;
protected Long consumerId;
public String getConsumerId() {
public Long getConsumerId() {
return consumerId;
}
public void setConsumerId(String consumerId) {
public void setConsumerId(Long consumerId) {
this.consumerId = consumerId;
}
}