From 32f9078151b1baf105a120bc6a20143a0511eb74 Mon Sep 17 00:00:00 2001 From: Robert Goldmann <deadlocker@gmx.de> Date: Mon, 13 Feb 2023 23:33:14 +0100 Subject: [PATCH] #731 - added new inputs for decimal and grouping delimiter --- .../TransactionImportService.java | 2 +- .../csvimport/CsvColumnSettings.java | 29 +++++++++++++------ .../resources/languages/base_de.properties | 2 ++ .../resources/languages/base_en.properties | 2 ++ .../transactions/transactionImport.ftl | 22 ++++++++++---- .../unit/TransactionImportServiceTest.java | 6 ++-- 6 files changed, 45 insertions(+), 18 deletions(-) diff --git a/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmaster/transactions/TransactionImportService.java b/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmaster/transactions/TransactionImportService.java index cc7ddc647..747cc5fcd 100644 --- a/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmaster/transactions/TransactionImportService.java +++ b/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmaster/transactions/TransactionImportService.java @@ -41,7 +41,7 @@ public class TransactionImportService final String description = csvRow.getColumns().get(csvColumnSettings.columnDescription() - 1); final String amount = csvRow.getColumns().get(csvColumnSettings.columnAmount() - 1); - final Optional<Integer> parsedAmountOptional = AmountParser.parse(amount, '.', ','); + final Optional<Integer> parsedAmountOptional = AmountParser.parse(amount, csvColumnSettings.getDecimalSeparator().charAt(0), csvColumnSettings.getGroupingSeparator().charAt(0)); if(parsedAmountOptional.isEmpty()) { throw new CsvTransactionParseException(Localization.getString("transactions.import.error.parse.amount", index + 1)); diff --git a/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmaster/transactions/csvimport/CsvColumnSettings.java b/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmaster/transactions/csvimport/CsvColumnSettings.java index bae02c775..7ecc044fa 100644 --- a/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmaster/transactions/csvimport/CsvColumnSettings.java +++ b/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmaster/transactions/csvimport/CsvColumnSettings.java @@ -5,17 +5,21 @@ import java.util.Objects; public final class CsvColumnSettings { private final int columnDate; - private String datePattern; + private final String datePattern; private final int columnName; private final int columnAmount; + private final String decimalSeparator; + private final String groupingSeparator; private final int columnDescription; - public CsvColumnSettings(int columnDate, String datePattern, int columnName, int columnAmount, int columnDescription) + public CsvColumnSettings(int columnDate, String datePattern, int columnName, int columnAmount, String decimalSeparator, String groupingSeparator, int columnDescription) { this.columnDate = columnDate; this.datePattern = datePattern; this.columnName = columnName; this.columnAmount = columnAmount; + this.decimalSeparator = decimalSeparator; + this.groupingSeparator = groupingSeparator; this.columnDescription = columnDescription; } @@ -29,11 +33,6 @@ public final class CsvColumnSettings return datePattern; } - public void setDatePattern(String datePattern) - { - this.datePattern = datePattern; - } - public int columnName() { return columnName; @@ -44,6 +43,16 @@ public final class CsvColumnSettings return columnAmount; } + public String getDecimalSeparator() + { + return decimalSeparator; + } + + public String getGroupingSeparator() + { + return groupingSeparator; + } + public int columnDescription() { return columnDescription; @@ -55,13 +64,13 @@ public final class CsvColumnSettings if(this == o) return true; if(o == null || getClass() != o.getClass()) return false; CsvColumnSettings that = (CsvColumnSettings) o; - return columnDate == that.columnDate && columnName == that.columnName && columnAmount == that.columnAmount && columnDescription == that.columnDescription && Objects.equals(datePattern, that.datePattern); + return columnDate == that.columnDate && columnName == that.columnName && columnAmount == that.columnAmount && columnDescription == that.columnDescription && Objects.equals(datePattern, that.datePattern) && Objects.equals(decimalSeparator, that.decimalSeparator) && Objects.equals(groupingSeparator, that.groupingSeparator); } @Override public int hashCode() { - return Objects.hash(columnDate, datePattern, columnName, columnAmount, columnDescription); + return Objects.hash(columnDate, datePattern, columnName, columnAmount, decimalSeparator, groupingSeparator, columnDescription); } @Override @@ -72,6 +81,8 @@ public final class CsvColumnSettings ", datePattern='" + datePattern + '\'' + ", columnName=" + columnName + ", columnAmount=" + columnAmount + + ", decimalSeparator='" + decimalSeparator + '\'' + + ", groupingSeparator='" + groupingSeparator + '\'' + ", columnDescription=" + columnDescription + '}'; } diff --git a/BudgetMasterServer/src/main/resources/languages/base_de.properties b/BudgetMasterServer/src/main/resources/languages/base_de.properties index 776663e5d..8ab8cc20b 100644 --- a/BudgetMasterServer/src/main/resources/languages/base_de.properties +++ b/BudgetMasterServer/src/main/resources/languages/base_de.properties @@ -376,6 +376,8 @@ transactions.import.separator=Trennzeichen transactions.import.encoding=Kodierung transactions.import.numberOfLinesToSkip=Zeilen überspringen transactions.import.datePattern=Datumsformat +transactions.import.decimalSeparator=Dezimaltrennzeichen +transactions.import.groupingSeparator=Gruppierungstrennzeichen transactions.import.status=Status transactions.import.status.pending=ausstehend transactions.import.status.imported=importiert diff --git a/BudgetMasterServer/src/main/resources/languages/base_en.properties b/BudgetMasterServer/src/main/resources/languages/base_en.properties index 00f35973b..7d36f341b 100644 --- a/BudgetMasterServer/src/main/resources/languages/base_en.properties +++ b/BudgetMasterServer/src/main/resources/languages/base_en.properties @@ -376,6 +376,8 @@ transactions.import.encoding=Encoding transactions.import.numberOfLinesToSkip=Skip lines transactions.import.datePattern=Date pattern transactions.import.status=Status +transactions.import.decimalSeparator=Decimal separator +transactions.import.groupingSeparator=Grouping separator transactions.import.status.pending=pending transactions.import.status.imported=imported transactions.import.status.skipped=skipped diff --git a/BudgetMasterServer/src/main/resources/templates/transactions/transactionImport.ftl b/BudgetMasterServer/src/main/resources/templates/transactions/transactionImport.ftl index 882c0b1fc..4e87a20dc 100644 --- a/BudgetMasterServer/src/main/resources/templates/transactions/transactionImport.ftl +++ b/BudgetMasterServer/src/main/resources/templates/transactions/transactionImport.ftl @@ -131,13 +131,13 @@ ${locale.getString("transaction.new.label.date")} </div> </div> - <div class="input-field col s6 m4 l3 no-margin-top no-margin-bottom"> + <div class="input-field col s6 m6 l4 no-margin-top no-margin-bottom"> <input id="columnDate" type="number" min="1" max="${csvRows?size}" name="columnDate" <@validation.validation "columnDate"/> value="<#if csvColumnSettings??>${csvColumnSettings.columnDate()}</#if>"> <label class="input-label" for="columnDate">${locale.getString("transactions.import.column")}</label> </div> </div> <div class="row"> - <div class="input-field col s5 offset-s6 m3 offset-m6 l3 offset-l6 no-margin-top no-margin-bottom"> + <div class="input-field col s5 offset-s6 m5 offset-m6 l4 offset-l6 no-margin-top no-margin-bottom"> <input id="datePattern" type="text" required name="datePattern" <@validation.validation "datePattern"/> value="<#if csvColumnSettings??>${csvColumnSettings.datePattern()}<#else>dd.MM.yyyy</#if>"> <label class="input-label" for="datePattern">${locale.getString("transactions.import.datePattern")}</label> </div> @@ -153,7 +153,7 @@ ${locale.getString("transaction.new.label.name")} </div> </div> - <div class="input-field col s6 m4 l3 no-margin-top no-margin-bottom"> + <div class="input-field col s6 m6 l4 no-margin-top no-margin-bottom"> <input id="columnName" type="number" min="1" max="${csvRows?size}" name="columnName" <@validation.validation "columnName"/> value="<#if csvColumnSettings??>${csvColumnSettings.columnName()}</#if>"> <label class="input-label" for="columnName">${locale.getString("transactions.import.column")}</label> </div> @@ -165,11 +165,23 @@ ${locale.getString("transaction.new.label.amount")} </div> </div> - <div class="input-field col s6 m4 l3 no-margin-top no-margin-bottom"> + <div class="input-field col s6 m6 l4 no-margin-top no-margin-bottom"> <input id="columnAmount" type="number" min="1" max="${csvRows?size}" name="columnAmount" <@validation.validation "columnAmount"/> value="<#if csvColumnSettings??>${csvColumnSettings.columnAmount()}</#if>"> <label class="input-label" for="columnAmount">${locale.getString("transactions.import.column")}</label> </div> </div> + <div class="row"> + <div class="input-field col s3 offset-s6 m3 offset-m6 l2 offset-l6 no-margin-top no-margin-bottom"> + <input id="decimalSeparator" type="text" required name="decimalSeparator" <@validation.validation "decimalSeparator"/> value="<#if csvColumnSettings??>${csvColumnSettings.decimalSeparator()}<#else>.</#if>"> + <label class="input-label" for="decimalSeparator">${locale.getString("transactions.import.decimalSeparator")}</label> + </div> + + <div class="input-field col s3 m3 l2 no-margin-top no-margin-bottom"> + <input id="groupingSeparator" type="text" required name="groupingSeparator" <@validation.validation "groupingSeparator"/> value="<#if csvColumnSettings??>${csvColumnSettings.groupingSeparator()}<#else>,</#if>"> + <label class="input-label" for="groupingSeparator">${locale.getString("transactions.import.groupingSeparator")}</label> + </div> + </div> + <div class="row"> <div class="col s6 m4 offset-m2 l3 offset-l3"> <div class="transaction-import-text-with-icon"> @@ -177,7 +189,7 @@ ${locale.getString("transaction.new.label.description")} </div> </div> - <div class="input-field col s6 m4 l3 no-margin-top no-margin-bottom"> + <div class="input-field col s6 m6 l4 no-margin-top no-margin-bottom"> <input id="columnDescription" type="number" min="1" max="${csvRows?size}" name="columnDescription" <@validation.validation "columnDescription"/> value="<#if csvColumnSettings??>${csvColumnSettings.columnDescription()}</#if>"> <label class="input-label" for="columnDescription">${locale.getString("transactions.import.column")}</label> </div> diff --git a/BudgetMasterServer/src/test/java/de/deadlocker8/budgetmaster/unit/TransactionImportServiceTest.java b/BudgetMasterServer/src/test/java/de/deadlocker8/budgetmaster/unit/TransactionImportServiceTest.java index 4bd90cea9..cbc2a34ee 100644 --- a/BudgetMasterServer/src/test/java/de/deadlocker8/budgetmaster/unit/TransactionImportServiceTest.java +++ b/BudgetMasterServer/src/test/java/de/deadlocker8/budgetmaster/unit/TransactionImportServiceTest.java @@ -110,7 +110,7 @@ class TransactionImportServiceTest final LocalDate date = LocalDate.of(2023, 1, 21); final CsvRow csvRow = new CsvRow("21.01.2023", "Groceries", "-12.00", "dolor sit amet"); - final CsvColumnSettings csvColumnSettings = new CsvColumnSettings(1, "dd.MM.yyyy", 2, 3, 4); + final CsvColumnSettings csvColumnSettings = new CsvColumnSettings(1, "dd.MM.yyyy", 2, 3, ".", ",", 4); final CsvTransaction expectedCsvTransaction = new CsvTransaction(date, "Groceries", -1200, "dolor sit amet", CsvTransactionStatus.PENDING, CATEGORY_NONE); @@ -129,7 +129,7 @@ class TransactionImportServiceTest void test_createCsvTransactionFromCsvRow_dateParseException() { final CsvRow csvRow = new CsvRow("21.01.2023", "Groceries", "-12.00", "dolor sit amet"); - final CsvColumnSettings csvColumnSettings = new CsvColumnSettings(1, "dd.MM.", 2, 3, 4); + final CsvColumnSettings csvColumnSettings = new CsvColumnSettings(1, "dd.MM.", 2, 3, ".", ",", 4); final Settings settings = new Settings(); settings.setLanguage(LanguageType.ENGLISH); @@ -145,7 +145,7 @@ class TransactionImportServiceTest void test_createCsvTransactionFromCsvRow_amountParseException() { final CsvRow csvRow = new CsvRow("21.01.2023", "Groceries", "non_amount", "dolor sit amet"); - final CsvColumnSettings csvColumnSettings = new CsvColumnSettings(1, "dd.MM.yyyy", 2, 3, 4); + final CsvColumnSettings csvColumnSettings = new CsvColumnSettings(1, "dd.MM.yyyy", 2, 3, ".", ",", 4); final Settings settings = new Settings(); settings.setLanguage(LanguageType.ENGLISH); -- GitLab