From 1aecff3b6572c5c16a0da218f983d0b7395ef0ce Mon Sep 17 00:00:00 2001 From: Robert Goldmann <deadlocker@gmx.de> Date: Sat, 14 Jan 2023 18:19:16 +0100 Subject: [PATCH] #724 - added input to enter custom date parse pattern --- .../TransactionImportController.java | 6 +- .../csvimport/CsvColumnSettings.java | 75 ++++++++++++++++++- .../resources/languages/base_de.properties | 3 +- .../resources/languages/base_en.properties | 3 +- .../transactions/transactionImport.ftl | 10 +++ 5 files changed, 91 insertions(+), 6 deletions(-) diff --git a/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmaster/transactions/TransactionImportController.java b/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmaster/transactions/TransactionImportController.java index 5677e13ca..a86521866 100644 --- a/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmaster/transactions/TransactionImportController.java +++ b/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmaster/transactions/TransactionImportController.java @@ -185,10 +185,10 @@ public class TransactionImportController extends BaseController private CsvTransaction createCsvTransactionFromCsvRow(CsvRow csvRow, CsvColumnSettings csvColumnSettings, Integer index) throws CsvTransactionParseException { final String date = csvRow.getColumns().get(csvColumnSettings.columnDate() - 1); - final Optional<LocalDate> parsedDateOptional = DateParser.parse(date, DateFormatStyle.LONG.getKey(), settingsService.getSettings().getLanguage().getLocale()); + final Optional<LocalDate> parsedDateOptional = DateParser.parse(date, csvColumnSettings.getDatePattern(), settingsService.getSettings().getLanguage().getLocale()); if(parsedDateOptional.isEmpty()) { - throw new CsvTransactionParseException(Localization.getString("transactions.import.error.parse.date", index, csvRow)); + throw new CsvTransactionParseException(Localization.getString("transactions.import.error.parse.date", index + 1, date, csvColumnSettings.getDatePattern())); } final String name = csvRow.getColumns().get(csvColumnSettings.columnName() - 1); @@ -198,7 +198,7 @@ public class TransactionImportController extends BaseController final Optional<Integer> parsedAmountOptional = AmountParser.parse(amount); if(parsedAmountOptional.isEmpty()) { - throw new CsvTransactionParseException(Localization.getString("transactions.import.error.parse.amount", index, csvRow)); + throw new CsvTransactionParseException(Localization.getString("transactions.import.error.parse.amount", index + 1)); } return new CsvTransaction(parsedDateOptional.get(), name, parsedAmountOptional.get(), description, CsvTransactionStatus.PENDING); 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 4affb3e24..bae02c775 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 @@ -1,5 +1,78 @@ package de.deadlocker8.budgetmaster.transactions.csvimport; -public record CsvColumnSettings(int columnDate, int columnName, int columnAmount, int columnDescription) +import java.util.Objects; + +public final class CsvColumnSettings { + private final int columnDate; + private String datePattern; + private final int columnName; + private final int columnAmount; + private final int columnDescription; + + public CsvColumnSettings(int columnDate, String datePattern, int columnName, int columnAmount, int columnDescription) + { + this.columnDate = columnDate; + this.datePattern = datePattern; + this.columnName = columnName; + this.columnAmount = columnAmount; + this.columnDescription = columnDescription; + } + + public int columnDate() + { + return columnDate; + } + + public String getDatePattern() + { + return datePattern; + } + + public void setDatePattern(String datePattern) + { + this.datePattern = datePattern; + } + + public int columnName() + { + return columnName; + } + + public int columnAmount() + { + return columnAmount; + } + + public int columnDescription() + { + return columnDescription; + } + + @Override + public boolean equals(Object o) + { + 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); + } + + @Override + public int hashCode() + { + return Objects.hash(columnDate, datePattern, columnName, columnAmount, columnDescription); + } + + @Override + public String toString() + { + return "CsvColumnSettings{" + + "columnDate=" + columnDate + + ", datePattern='" + datePattern + '\'' + + ", columnName=" + columnName + + ", columnAmount=" + columnAmount + + ", columnDescription=" + columnDescription + + '}'; + } } diff --git a/BudgetMasterServer/src/main/resources/languages/base_de.properties b/BudgetMasterServer/src/main/resources/languages/base_de.properties index 9de718137..e95742ea5 100644 --- a/BudgetMasterServer/src/main/resources/languages/base_de.properties +++ b/BudgetMasterServer/src/main/resources/languages/base_de.properties @@ -375,6 +375,7 @@ transactions.import.column=Spalte transactions.import.separator=Trennzeichen transactions.import.encoding=Kodierung transactions.import.numberOfLinesToSkip=Zeilen überspringen +transactions.import.datePattern=Datumsformat transactions.import.status=Status transactions.import.status.pending=ausstehend transactions.import.status.imported=importiert @@ -382,7 +383,7 @@ transactions.import.status.skipped=übersprungen transactions.import.actions=Aktionen transactions.import.error.column=Zugeordnete Spalten in Zeile {0} (Zählung beginnt relativ zu Anzahl übersprungener Zeilen) nicht gefunden: {1} transactions.import.error.parse.amount=Fehler beim Parsen des Betrags in Zeile {0} (Zählung beginnt relativ zu Anzahl übersprungener Zeilen) -transactions.import.error.parse.date=Fehler beim Parsen des Datums in Zeile {0} (Zählung beginnt relativ zu Anzahl übersprungener Zeilen) +transactions.import.error.parse.date=Fehler beim Parsen des Datums in Zeile {0} (Zählung beginnt relativ zu Anzahl übersprungener Zeilen)<br>Wert "{1}" kann nicht mit Pattern "{2}" geparst werden. repeating.button.add=Wiederholung hinzufügen repeating.button.remove=Wiederholung entfernen diff --git a/BudgetMasterServer/src/main/resources/languages/base_en.properties b/BudgetMasterServer/src/main/resources/languages/base_en.properties index f54cefd95..d1a005c6a 100644 --- a/BudgetMasterServer/src/main/resources/languages/base_en.properties +++ b/BudgetMasterServer/src/main/resources/languages/base_en.properties @@ -374,6 +374,7 @@ transactions.import.column=Column transactions.import.separator=Separator transactions.import.encoding=Encoding transactions.import.numberOfLinesToSkip=Skip lines +transactions.import.datePattern=Date pattern transactions.import.status=Status transactions.import.status.pending=pending transactions.import.status.imported=imported @@ -381,7 +382,7 @@ transactions.import.status.skipped=skipped transactions.import.actions=Actions transactions.import.error.column=Associated columns not found in row {0} (counting starts relative to the number of skipped rows): {1} transactions.import.error.parse.amount=Error parsing the amount in line {0} (counting starts relative to number of skipped lines) -transactions.import.error.parse.date=Error parsing the date in line {0} (counting starts relative to number of skipped lines) +transactions.import.error.parse.date=Error parsing the date in line {0} (counting starts relative to number of skipped lines)<br>Value "{1}" could not be parsed with pattern "{2}". repeating.button.add=Add repetition repeating.button.remove=Remove repetition diff --git a/BudgetMasterServer/src/main/resources/templates/transactions/transactionImport.ftl b/BudgetMasterServer/src/main/resources/templates/transactions/transactionImport.ftl index 275b9afa8..e848d9ef3 100644 --- a/BudgetMasterServer/src/main/resources/templates/transactions/transactionImport.ftl +++ b/BudgetMasterServer/src/main/resources/templates/transactions/transactionImport.ftl @@ -129,6 +129,16 @@ <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"> + <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> + <div class="col s1 m1 l1"> + <@header.buttonFlat url='https://docs.oracle.com/javase/8/docs/api/java/time/format/DateTimeFormatter.html' icon='help_outline' localizationKey='' target='_blank' classes='text-default'/> + </div> + </div> + <div class="row"> <div class="col s6 m4 offset-m2 l3 offset-l3"> <div class="transaction-import-text-with-icon"> -- GitLab