From 9b92e073a8bdeae6409937c0d15fafe80166ea77 Mon Sep 17 00:00:00 2001 From: vananiev Date: Wed, 21 Aug 2024 21:51:40 +0300 Subject: [PATCH 1/4] add tbank support --- README.md | 2 +- .../ru/investbook/parser/tinkoff/TinkoffBrokerReport.java | 7 +++++-- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index edc60cc9..7d923984 100644 --- a/README.md +++ b/README.md @@ -104,7 +104,7 @@ Investbook в сравнении с [Intelinvest](https://intelinvest.ru) и [Sn при необходимости позволит безболезненно перенести накопленные данные в другое приложение учета инвестиций. ### Брокеры -Приложение анализирует отчеты брокеров Тинькофф (xlsx), Сбербанк (xlsx), ВТБ (xls), Промсвязьбанк (xlsx, xml) +Приложение анализирует отчеты брокеров ТБанк / Тинькофф (xlsx), Сбербанк (xlsx), ВТБ (xls), Промсвязьбанк (xlsx, xml) и Твой Брокер / Уралсиб (zip с xls). Если ваш счет открыт у другого брокера, напишите [нам](https://t.me/investbook_support). Также вы можете уже на вашей версии приложения воспользоваться [формами](src/main/asciidoc/investbook-forms.adoc) ввода информации или diff --git a/src/main/java/ru/investbook/parser/tinkoff/TinkoffBrokerReport.java b/src/main/java/ru/investbook/parser/tinkoff/TinkoffBrokerReport.java index d7958dea..5079a47e 100644 --- a/src/main/java/ru/investbook/parser/tinkoff/TinkoffBrokerReport.java +++ b/src/main/java/ru/investbook/parser/tinkoff/TinkoffBrokerReport.java @@ -43,6 +43,8 @@ public class TinkoffBrokerReport extends AbstractExcelBrokerReport { private static final String PORTFOLIO_MARKER = "Инвестор:"; private static final Predicate tinkoffReportPredicate = cell -> (cell instanceof String) && ((String) cell).contains("Тинькофф"); + private static final Predicate tbankReportPredicate = cell -> + (cell instanceof String) && ((String) cell).contains("ТБанк"); private static final Predicate dateMarkerPredicate = cell -> (cell instanceof String) && ((String) cell).contains("за период"); @@ -61,8 +63,9 @@ public TinkoffBrokerReport(String excelFileName, InputStream is, SecurityRegistr } public static void checkReportFormat(String excelFileName, ReportPage reportPage) { - if (reportPage.find(0, 2, tinkoffReportPredicate) == TableCellAddress.NOT_FOUND) { - throw new RuntimeException("В файле " + excelFileName + " не содержится отчет брокера Тинькофф"); + if (reportPage.find(0, 2, tbankReportPredicate) == TableCellAddress.NOT_FOUND && + reportPage.find(0, 2, tinkoffReportPredicate) == TableCellAddress.NOT_FOUND) { + throw new RuntimeException("В файле " + excelFileName + " не содержится отчет брокера ТБанк (Тинькофф)"); } } From e103fd291d59dad9731d3bc467096084f0396887 Mon Sep 17 00:00:00 2001 From: vananiev Date: Wed, 21 Aug 2024 22:48:56 +0300 Subject: [PATCH 2/4] tbank transaction id can be a string --- .../parser/tinkoff/TinkoffSecurityTransactionTable.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/main/java/ru/investbook/parser/tinkoff/TinkoffSecurityTransactionTable.java b/src/main/java/ru/investbook/parser/tinkoff/TinkoffSecurityTransactionTable.java index 6ae0c4aa..1fa5880d 100644 --- a/src/main/java/ru/investbook/parser/tinkoff/TinkoffSecurityTransactionTable.java +++ b/src/main/java/ru/investbook/parser/tinkoff/TinkoffSecurityTransactionTable.java @@ -39,6 +39,7 @@ import java.math.BigDecimal; import java.time.Instant; +import static org.springframework.util.StringUtils.hasLength; import static ru.investbook.parser.tinkoff.TinkoffSecurityTransactionTable.TransactionTableHeader.*; @Slf4j @@ -77,9 +78,8 @@ private TinkoffSecurityTransactionTable(String tableNamePrefix, @Override protected AbstractTransaction parseRow(TableRow row) { - long _tradeId = row.getLongCellValueOrDefault(TRADE_ID, -1); - if (_tradeId == -1) return null; - String tradeId = String.valueOf(_tradeId); + String tradeId = row.getStringCellValueOrDefault(TRADE_ID, ""); + if (!hasLength(tradeId)) return null; int securityId = transactionTableHelper.getSecurityId(row, codeAndIsin, getReport().getSecurityRegistrar()); boolean isBuy = row.getStringCellValue(OPERATION).toLowerCase().contains("покупка"); From 041686d532ef663e9dbebf2dcfda56b6e129c800 Mon Sep 17 00:00:00 2001 From: vananiev Date: Thu, 22 Aug 2024 20:49:49 +0300 Subject: [PATCH 3/4] fix repo transaction storing --- .../tinkoff/TinkoffSecurityTransactionTable.java | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/src/main/java/ru/investbook/parser/tinkoff/TinkoffSecurityTransactionTable.java b/src/main/java/ru/investbook/parser/tinkoff/TinkoffSecurityTransactionTable.java index 1fa5880d..962b6d59 100644 --- a/src/main/java/ru/investbook/parser/tinkoff/TinkoffSecurityTransactionTable.java +++ b/src/main/java/ru/investbook/parser/tinkoff/TinkoffSecurityTransactionTable.java @@ -80,9 +80,18 @@ private TinkoffSecurityTransactionTable(String tableNamePrefix, protected AbstractTransaction parseRow(TableRow row) { String tradeId = row.getStringCellValueOrDefault(TRADE_ID, ""); if (!hasLength(tradeId)) return null; + String operation = row.getStringCellValue(OPERATION).toLowerCase(); + boolean isBuy = operation.contains("покупка"); + boolean isRepo = operation.contains("репо"); + if (isRepo) { + // Сделки переноса РЕПО "РЕПО 1 Покупка" и "РЕПО 2 Продажа" имеют одинаковый tradeId и timestamp. + // Это синтетические сделки, но эти сделки имеют комиссии, поэтому их нужно иметь возможность сохранить в БД. + // Требуется уникальный tradeId для обоих РЕПО сделок. + String tradeIdSuffix = isBuy ? "repobuy" : "reposell"; + tradeId += tradeIdSuffix; + } int securityId = transactionTableHelper.getSecurityId(row, codeAndIsin, getReport().getSecurityRegistrar()); - boolean isBuy = row.getStringCellValue(OPERATION).toLowerCase().contains("покупка"); int count = Math.abs(row.getIntCellValue(COUNT)); BigDecimal amount = row.getBigDecimalCellValue(AMOUNT).abs(); amount = isBuy ? amount.negate() : amount; From 17b942ae788aaa33b8e0c255a5b0dd6881c9f498 Mon Sep 17 00:00:00 2001 From: vananiev Date: Thu, 22 Aug 2024 20:52:36 +0300 Subject: [PATCH 4/4] version 2024.1.3 --- pom.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pom.xml b/pom.xml index 25c9d156..2061c18d 100644 --- a/pom.xml +++ b/pom.xml @@ -28,7 +28,7 @@ ru.investbook investbook - 2024.1.2 + 2024.1.3 investbook Investor Accounting Book @@ -62,7 +62,7 @@ - 24.1.2 + 24.1.3 21