Skip to content

Commit

Permalink
#724 - introduced TransactionImportService
Browse files Browse the repository at this point in the history
  • Loading branch information
deadlocker8 committed Jan 21, 2023
1 parent fafc9cd commit bb568bc
Show file tree
Hide file tree
Showing 2 changed files with 85 additions and 55 deletions.
Original file line number Diff line number Diff line change
@@ -1,12 +1,8 @@
package de.deadlocker8.budgetmaster.transactions;

import de.deadlocker8.budgetmaster.accounts.AccountService;
import de.deadlocker8.budgetmaster.categories.Category;
import de.deadlocker8.budgetmaster.categories.CategoryService;
import de.deadlocker8.budgetmaster.categories.CategoryType;
import de.deadlocker8.budgetmaster.controller.BaseController;
import de.deadlocker8.budgetmaster.services.HelpersService;
import de.deadlocker8.budgetmaster.settings.SettingsService;
import de.deadlocker8.budgetmaster.transactions.csvimport.*;
import de.deadlocker8.budgetmaster.utils.Mappings;
import de.deadlocker8.budgetmaster.utils.WebRequestUtils;
Expand All @@ -23,7 +19,6 @@
import org.springframework.web.context.request.WebRequest;

import java.nio.charset.StandardCharsets;
import java.time.LocalDate;
import java.util.ArrayList;
import java.util.List;
import java.util.Optional;
Expand Down Expand Up @@ -63,19 +58,17 @@ private RequestAttributeNames()
}

private final TransactionService transactionService;
private final HelpersService helpers;
private final CategoryService categoryService;
private final AccountService accountService;
private final SettingsService settingsService;
private final TransactionImportService transactionImportService;

@Autowired
public TransactionImportController(TransactionService transactionService, HelpersService helpers, CategoryService categoryService, AccountService accountService, SettingsService settingsService)
public TransactionImportController(TransactionService transactionService, CategoryService categoryService, AccountService accountService, TransactionImportService transactionImportService)
{
this.transactionService = transactionService;
this.helpers = helpers;
this.categoryService = categoryService;
this.accountService = accountService;
this.settingsService = settingsService;
this.transactionImportService = transactionImportService;
}

@GetMapping
Expand Down Expand Up @@ -141,7 +134,6 @@ public String upload(WebRequest request,
catch(Exception e)
{
LOGGER.error("CSV upload failed", e);

WebRequestUtils.putNotification(request, new Notification(Localization.getString("transactions.import.error.upload", e.getMessage()), NotificationType.ERROR));
}
return ReturnValues.REDIRECT_IMPORT;
Expand Down Expand Up @@ -172,7 +164,7 @@ public String columnSettings(WebRequest request,
final CsvRow csvRow = csvRows.get(i);
try
{
csvTransactions.add(createCsvTransactionFromCsvRow(csvRow, csvColumnSettings, i));
csvTransactions.add(transactionImportService.createCsvTransactionFromCsvRow(csvRow, csvColumnSettings, i));
}
catch(IndexOutOfBoundsException e)
{
Expand All @@ -191,29 +183,6 @@ public String columnSettings(WebRequest request,
return ReturnValues.REDIRECT_IMPORT;
}

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, csvColumnSettings.getDatePattern(), settingsService.getSettings().getLanguage().getLocale());
if(parsedDateOptional.isEmpty())
{
throw new CsvTransactionParseException(Localization.getString("transactions.import.error.parse.date", index + 1, date, csvColumnSettings.getDatePattern()));
}

final String name = csvRow.getColumns().get(csvColumnSettings.columnName() - 1);
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);
if(parsedAmountOptional.isEmpty())
{
throw new CsvTransactionParseException(Localization.getString("transactions.import.error.parse.amount", index + 1));
}

final Category categoryNone = categoryService.findByType(CategoryType.NONE);
return new CsvTransaction(parsedDateOptional.get(), name, parsedAmountOptional.get(), description, CsvTransactionStatus.PENDING, categoryNone);
}

@GetMapping("/cancel")
public String cancel(WebRequest request)
{
Expand Down Expand Up @@ -249,7 +218,7 @@ public String newTransaction(WebRequest request,
final CsvTransaction csvTransaction = transactionOptional.get();
request.setAttribute(RequestAttributeNames.CURRENT_CSV_TRANSACTION, csvTransaction, RequestAttributes.SCOPE_SESSION);

final Transaction newTransaction = createTransactionFromCsvTransaction(csvTransaction);
final Transaction newTransaction = transactionImportService.createTransactionFromCsvTransaction(csvTransaction);

transactionService.prepareModelNewOrEdit(model, false, csvTransaction.getDate(), false, newTransaction, accountService.getAllActivatedAccountsAsc());

Expand Down Expand Up @@ -290,31 +259,14 @@ public String newTransactionInPlace(WebRequest request,
final CsvTransaction csvTransaction = transactionOptional.get();
csvTransaction.setStatus(CsvTransactionStatus.IMPORTED);

// update original CsvTransaction attributes with values from user (from newCsvTransaction)
csvTransaction.setName(newCsvTransaction.getName());
csvTransaction.setDescription(newCsvTransaction.getDescription());
csvTransaction.setCategory(newCsvTransaction.getCategory());
transactionImportService.updateCsvTransaction(csvTransaction, newCsvTransaction);

final Transaction newTransaction = createTransactionFromCsvTransaction(csvTransaction);
final Transaction newTransaction = transactionImportService.createTransactionFromCsvTransaction(csvTransaction);
transactionService.getRepository().save(newTransaction);

return ReturnValues.REDIRECT_IMPORT;
}

private Transaction createTransactionFromCsvTransaction(CsvTransaction csvTransaction)
{
final Transaction newTransaction = new Transaction();
newTransaction.setDate(csvTransaction.getDate());
newTransaction.setName(csvTransaction.getName());
newTransaction.setDescription(csvTransaction.getDescription());
newTransaction.setAmount(csvTransaction.getAmount());
newTransaction.setIsExpenditure(csvTransaction.getAmount() <= 0);
newTransaction.setAccount(helpers.getCurrentAccountOrDefault());
newTransaction.setCategory(csvTransaction.getCategory());

return newTransaction;
}

private void removeAllAttributes(WebRequest request)
{
request.removeAttribute(RequestAttributeNames.CSV_IMPORT, RequestAttributes.SCOPE_SESSION);
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,78 @@
package de.deadlocker8.budgetmaster.transactions;

import de.deadlocker8.budgetmaster.categories.Category;
import de.deadlocker8.budgetmaster.categories.CategoryService;
import de.deadlocker8.budgetmaster.categories.CategoryType;
import de.deadlocker8.budgetmaster.services.HelpersService;
import de.deadlocker8.budgetmaster.settings.SettingsService;
import de.deadlocker8.budgetmaster.transactions.csvimport.*;
import de.thecodelabs.utils.util.Localization;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.time.LocalDate;
import java.util.Optional;

@Service
public class TransactionImportService
{
private static final Logger LOGGER = LoggerFactory.getLogger(TransactionImportService.class);

private final HelpersService helpersService;
private final SettingsService settingsService;
private final CategoryService categoryService;

@Autowired
public TransactionImportService(HelpersService helpersService, SettingsService settingsService, CategoryService categoryService)
{
this.helpersService = helpersService;
this.settingsService = settingsService;
this.categoryService = categoryService;
}

public 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, csvColumnSettings.getDatePattern(), settingsService.getSettings().getLanguage().getLocale());
if(parsedDateOptional.isEmpty())
{
throw new CsvTransactionParseException(Localization.getString("transactions.import.error.parse.date", index + 1, date, csvColumnSettings.getDatePattern()));
}

final String name = csvRow.getColumns().get(csvColumnSettings.columnName() - 1);
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);
if(parsedAmountOptional.isEmpty())
{
throw new CsvTransactionParseException(Localization.getString("transactions.import.error.parse.amount", index + 1));
}

final Category categoryNone = categoryService.findByType(CategoryType.NONE);
return new CsvTransaction(parsedDateOptional.get(), name, parsedAmountOptional.get(), description, CsvTransactionStatus.PENDING, categoryNone);
}

public Transaction createTransactionFromCsvTransaction(CsvTransaction csvTransaction)
{
final Transaction newTransaction = new Transaction();
newTransaction.setDate(csvTransaction.getDate());
newTransaction.setName(csvTransaction.getName());
newTransaction.setDescription(csvTransaction.getDescription());
newTransaction.setAmount(csvTransaction.getAmount());
newTransaction.setIsExpenditure(csvTransaction.getAmount() <= 0);
newTransaction.setAccount(helpersService.getCurrentAccountOrDefault());
newTransaction.setCategory(csvTransaction.getCategory());

return newTransaction;
}

public void updateCsvTransaction(CsvTransaction existingCsvTransaction, CsvTransaction csvTransactionWithNewAttributes)
{
existingCsvTransaction.setName(csvTransactionWithNewAttributes.getName());
existingCsvTransaction.setDescription(csvTransactionWithNewAttributes.getDescription());
existingCsvTransaction.setCategory(csvTransactionWithNewAttributes.getCategory());
}
}

0 comments on commit bb568bc

Please sign in to comment.