Add support for currency symbols

This commit is contained in:
2019-06-27 23:10:11 +02:00
parent bf3c6aa441
commit 53e46a418c
14 changed files with 78 additions and 36 deletions

View File

@@ -5,6 +5,8 @@ import org.slf4j.LoggerFactory;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Configuration;
import java.util.Currency;
@Configuration
@ConfigurationProperties(prefix = "financer")
public class FinancerConfig {
@@ -14,6 +16,8 @@ public class FinancerConfig {
private String dateFormat;
private String version;
private Integer monthPeriodStartDay;
private String currencyCode;
private Currency currency;
public String getServerUrl() {
return serverUrl;
@@ -66,4 +70,14 @@ public class FinancerConfig {
this.monthPeriodStartDay = monthPeriodStartDay;
}
public void setCurrencyCode(String currencyCode) {
this.currencyCode = currencyCode;
this.currency = Currency.getInstance(this.currencyCode);
}
public Currency getCurrency() {
return currency;
}
}

View File

@@ -49,6 +49,7 @@ public class AccountController {
model.addAttribute("periodEnd", expensePeriod.getEnd());
model.addAttribute("showClosed", showClosedBoolean);
ControllerUtils.addVersionAttribute(model, this.financerConfig);
ControllerUtils.addCurrencySymbol(model, this.financerConfig);
return "account/accountOverview";
}
@@ -62,6 +63,7 @@ public class AccountController {
model.addAttribute("accountTypes", AccountType.valueList());
model.addAttribute("form", new NewAccountForm());
ControllerUtils.addVersionAttribute(model, this.financerConfig);
ControllerUtils.addCurrencySymbol(model, this.financerConfig);
return "account/newAccount";
}
@@ -86,6 +88,7 @@ public class AccountController {
model.addAttribute("accountTypes", AccountType.valueList());
model.addAttribute("errorMessage", responseReason.name());
ControllerUtils.addVersionAttribute(model, this.financerConfig);
ControllerUtils.addCurrencySymbol(model, this.financerConfig);
return "account/newAccount";
}
@@ -109,6 +112,7 @@ public class AccountController {
model.addAttribute("transactions", transactions);
model.addAttribute("isClosed", AccountStatus.CLOSED.equals(account.getStatus()));
ControllerUtils.addVersionAttribute(model, this.financerConfig);
ControllerUtils.addCurrencySymbol(model, this.financerConfig);
return "account/accountDetails";
}
@@ -139,6 +143,7 @@ public class AccountController {
model.addAttribute("isClosed", AccountStatus.CLOSED.equals(account.getStatus()));
model.addAttribute("errorMessage", responseReason.name());
ControllerUtils.addVersionAttribute(model, this.financerConfig);
ControllerUtils.addCurrencySymbol(model, this.financerConfig);
return "account/accountDetails";
}
@@ -172,6 +177,7 @@ public class AccountController {
model.addAttribute("isClosed", AccountStatus.CLOSED.equals(account.getStatus()));
model.addAttribute("errorMessage", responseReason.name());
ControllerUtils.addVersionAttribute(model, this.financerConfig);
ControllerUtils.addCurrencySymbol(model, this.financerConfig);
return "account/accountDetails";
}

View File

@@ -39,6 +39,7 @@ public class AccountGroupController {
model.addAttribute("form", form);
model.addAttribute("errorMessage", responseReason.name());
ControllerUtils.addVersionAttribute(model, this.financerConfig);
ControllerUtils.addCurrencySymbol(model, this.financerConfig);
return "accountGroup/newAccountGroup";
}

View File

@@ -38,6 +38,7 @@ public class RecurringTransactionController {
model.addAttribute("holidayWeekendTypes", HolidayWeekendType.valueList());
model.addAttribute("form", form);
ControllerUtils.addVersionAttribute(model, this.financerConfig);
ControllerUtils.addCurrencySymbol(model, this.financerConfig);
return "recurringTransaction/newRecurringTransaction";
}
@@ -70,6 +71,7 @@ public class RecurringTransactionController {
model.addAttribute("form", form);
model.addAttribute("errorMessage", responseReason.name());
ControllerUtils.addVersionAttribute(model, this.financerConfig);
ControllerUtils.addCurrencySymbol(model, this.financerConfig);
return "recurringTransaction/newRecurringTransaction";
}
@@ -85,6 +87,7 @@ public class RecurringTransactionController {
model.addAttribute("recurringTransactions", response.getBody());
model.addAttribute("subTitle", "dueToday");
ControllerUtils.addVersionAttribute(model, this.financerConfig);
ControllerUtils.addCurrencySymbol(model, this.financerConfig);
return "recurringTransaction/recurringTransactionList";
}
@@ -97,6 +100,7 @@ public class RecurringTransactionController {
model.addAttribute("recurringTransactions", response.getBody());
model.addAttribute("subTitle", "active");
ControllerUtils.addVersionAttribute(model, this.financerConfig);
ControllerUtils.addCurrencySymbol(model, this.financerConfig);
return "recurringTransaction/recurringTransactionList";
}
@@ -109,6 +113,7 @@ public class RecurringTransactionController {
model.addAttribute("recurringTransactions", response.getBody());
model.addAttribute("subTitle", "all");
ControllerUtils.addVersionAttribute(model, this.financerConfig);
ControllerUtils.addCurrencySymbol(model, this.financerConfig);
return "recurringTransaction/recurringTransactionList";
}
@@ -127,6 +132,7 @@ public class RecurringTransactionController {
model.addAttribute("recurringTransactions", allResponse.getBody());
model.addAttribute("subTitle", "all");
ControllerUtils.addVersionAttribute(model, this.financerConfig);
ControllerUtils.addCurrencySymbol(model, this.financerConfig);
if (!ResponseReason.OK.equals(responseReason)) {
model.addAttribute("errorMessage", responseReason.name());
@@ -150,6 +156,7 @@ public class RecurringTransactionController {
model.addAttribute("errorMessage", responseReason.name());
model.addAttribute("subTitle", sub);
ControllerUtils.addVersionAttribute(model, this.financerConfig);
ControllerUtils.addCurrencySymbol(model, this.financerConfig);
Iterable<RecurringTransaction> recurringTransactions;
@@ -206,6 +213,7 @@ public class RecurringTransactionController {
model.addAttribute("errorMessage", responseReason.name());
model.addAttribute("subTitle", form.getSubTitle());
ControllerUtils.addVersionAttribute(model, this.financerConfig);
ControllerUtils.addCurrencySymbol(model, this.financerConfig);
Iterable<RecurringTransaction> recurringTransactions;

View File

@@ -37,6 +37,7 @@ public class TransactionController {
model.addAttribute("accounts", ControllerUtils.filterAndSortAccounts(response.getBody()));
model.addAttribute("form", new NewTransactionForm());
ControllerUtils.addVersionAttribute(model, this.financerConfig);
ControllerUtils.addCurrencySymbol(model, this.financerConfig);
return "transaction/newTransaction";
}
@@ -61,6 +62,7 @@ public class TransactionController {
model.addAttribute("form", form);
model.addAttribute("errorMessage", responseReason.name());
ControllerUtils.addVersionAttribute(model, this.financerConfig);
ControllerUtils.addCurrencySymbol(model, this.financerConfig);
return "transaction/newTransaction";
}
@@ -91,6 +93,7 @@ public class TransactionController {
model.addAttribute("transactions", transactions);
model.addAttribute("isClosed", AccountStatus.CLOSED.equals(account.getStatus()));
ControllerUtils.addVersionAttribute(model, this.financerConfig);
ControllerUtils.addCurrencySymbol(model, this.financerConfig);
if (!ResponseReason.OK.equals(responseReason)) {
model.addAttribute("errorMessage", responseReason.name());

View File

@@ -64,4 +64,9 @@ public class ControllerUtils {
public static void addVersionAttribute(Model model, FinancerConfig financerConfig) {
model.addAttribute("financerVersion", financerConfig.getVersion());
}
public static void addCurrencySymbol(Model model, FinancerConfig financerConfig) {
// Add a space right in front of the currency symbol, so it's not glued to the amount
model.addAttribute("currencySymbol", " " + financerConfig.getCurrency().getSymbol());
}
}

View File

@@ -30,4 +30,9 @@ financer.serverUrl=http://localhost:8080/financer-server/
spring.messages.basename=i18n/message
# The day of month indicating the start of an expense period. Valid values range from 1-28
financer.monthPeriodStartDay=15
financer.monthPeriodStartDay=15
# The currency code to use for displaying money values. Note that the currency is only used for
# displaying.
# Possible values are ISO-4271 currency codes.
financer.currencyCode=EUR

View File

@@ -11,7 +11,7 @@ financer.account-overview.status=Status\:
financer.account-overview.status.recurring-transaction-due-today=Recurring transactions due today\:
financer.account-overview.status.recurring-transaction-active=Active recurring transactions\:
financer.account-overview.status.current-assets=Current assets\:
financer.account-overview.status.current-expenses=Expenses of the current period\:
financer.account-overview.status.current-expenses=Expenses in the current period\:
financer.account-overview.table-header.id=ID
financer.account-overview.table-header.key=Account
financer.account-overview.table-header.group=Group
@@ -38,12 +38,12 @@ financer.transaction-new.label.amount=Amount\:
financer.transaction-new.label.date=Date\:
financer.transaction-new.label.description=Description\:
financer.transaction-new.submit=Create transaction
financer.transaction-new.account-type.BANK={0}|Bank|{1}
financer.transaction-new.account-type.CASH={0}|Cash|{1}
financer.transaction-new.account-type.INCOME={0}|Income|{1}
financer.transaction-new.account-type.LIABILITY={0}|Liability|{1}
financer.transaction-new.account-type.EXPENSE={0}|Expense|{1}
financer.transaction-new.account-type.START={0}|Start|{1}
financer.transaction-new.account-type.BANK={0}|Bank|{1}{2}
financer.transaction-new.account-type.CASH={0}|Cash|{1}{2}
financer.transaction-new.account-type.INCOME={0}|Income|{1}{2}
financer.transaction-new.account-type.LIABILITY={0}|Liability|{1}{2}
financer.transaction-new.account-type.EXPENSE={0}|Expense|{1}{2}
financer.transaction-new.account-type.START={0}|Start|{1}{2}
financer.recurring-transaction-new.title=financer\: create new recurring transaction
financer.recurring-transaction-new.label.from-account=From account\:
@@ -56,12 +56,12 @@ financer.recurring-transaction-new.label.holiday-weekend-type=Holiday/weekend ru
financer.recurring-transaction-new.label.description=Description\:
financer.recurring-transaction-new.label.remind=Remind if due\:
financer.recurring-transaction-new.submit=Create recurring transaction
financer.recurring-transaction-new.account-type.BANK={0}|Bank|{1}
financer.recurring-transaction-new.account-type.CASH={0}|Cash|{1}
financer.recurring-transaction-new.account-type.INCOME={0}|Income|{1}
financer.recurring-transaction-new.account-type.LIABILITY={0}|Liability|{1}
financer.recurring-transaction-new.account-type.EXPENSE={0}|Expense|{1}
financer.recurring-transaction-new.account-type.START={0}|Start|{1}
financer.recurring-transaction-new.account-type.BANK={0}|Bank|{1}{2}
financer.recurring-transaction-new.account-type.CASH={0}|Cash|{1}{2}
financer.recurring-transaction-new.account-type.INCOME={0}|Income|{1}{2}
financer.recurring-transaction-new.account-type.LIABILITY={0}|Liability|{1}{2}
financer.recurring-transaction-new.account-type.EXPENSE={0}|Expense|{1}{2}
financer.recurring-transaction-new.account-type.START={0}|Start|{1}{2}
financer.recurring-transaction-list.title.dueToday=financer\: recurring transactions due today
financer.recurring-transaction-list.title.active=financer\: active recurring transactions

View File

@@ -38,12 +38,12 @@ financer.transaction-new.label.amount=Betrag\:
financer.transaction-new.label.date=Datum\:
financer.transaction-new.label.description=Beschreibung\:
financer.transaction-new.submit=Buchung erstellen
financer.transaction-new.account-type.BANK={0}|Bank|{1}
financer.transaction-new.account-type.CASH={0}|Bar|{1}
financer.transaction-new.account-type.INCOME={0}|Einkommen|{1}
financer.transaction-new.account-type.LIABILITY={0}|Verbindlichkeit|{1}
financer.transaction-new.account-type.EXPENSE={0}|Aufwand|{1}
financer.transaction-new.account-type.START={0}|Anfangsbestand|{1}
financer.transaction-new.account-type.BANK={0}|Bank|{1}{2}
financer.transaction-new.account-type.CASH={0}|Bar|{1}{2}
financer.transaction-new.account-type.INCOME={0}|Einkommen|{1}{2}
financer.transaction-new.account-type.LIABILITY={0}|Verbindlichkeit|{1}{2}
financer.transaction-new.account-type.EXPENSE={0}|Aufwand|{1}{2}
financer.transaction-new.account-type.START={0}|Anfangsbestand|{1}{2}
financer.recurring-transaction-new.title=financer\: Neue wiederkehrende Buchung erstellen
financer.recurring-transaction-new.label.from-account=Von Konto\:
@@ -56,12 +56,12 @@ financer.recurring-transaction-new.label.holiday-weekend-type=Feiertag-/Wochenen
financer.recurring-transaction-new.label.description=Beschreibung\:
financer.recurring-transaction-new.label.remind=Erinnern wenn f\u00E4llig\:
financer.recurring-transaction-new.submit=Wiederkehrende Buchung erstellen
financer.recurring-transaction-new.account-type.BANK={0}|Bank|{1}
financer.recurring-transaction-new.account-type.CASH={0}|Bar|{1}
financer.recurring-transaction-new.account-type.INCOME={0}|Einkommen|{1}
financer.recurring-transaction-new.account-type.LIABILITY={0}|Verbindlichkeit|{1}
financer.recurring-transaction-new.account-type.EXPENSE={0}|Aufwand|{1}
financer.recurring-transaction-new.account-type.START={0}|Anfangsbestand|{1}
financer.recurring-transaction-new.account-type.BANK={0}|Bank|{1}{2}
financer.recurring-transaction-new.account-type.CASH={0}|Bar|{1}{2}
financer.recurring-transaction-new.account-type.INCOME={0}|Einkommen|{1}{2}
financer.recurring-transaction-new.account-type.LIABILITY={0}|Verbindlichkeit|{1}{2}
financer.recurring-transaction-new.account-type.EXPENSE={0}|Aufwand|{1}{2}
financer.recurring-transaction-new.account-type.START={0}|Anfangsbestand|{1}{2}
financer.recurring-transaction-list.title.dueToday=financer\: wiederkehrende Buchungen heute f\u00E4llig
financer.recurring-transaction-list.title.active=financer\: aktive wiederkehrende Buchungen

View File

@@ -16,7 +16,7 @@
</div>
<div id="balance-container">
<span th:text="#{financer.account-details.details.balance}"/>
<span th:text="${#numbers.formatDecimal(account.currentBalance/100D, 1, 'DEFAULT', 2, 'DEFAULT')}"/>
<span th:text="${#numbers.formatDecimal(account.currentBalance/100D, 1, 'DEFAULT', 2, 'DEFAULT') + currencySymbol}"/>
</div>
<div id="group-container">
<span th:text="#{financer.account-details.details.group}"/>
@@ -48,7 +48,7 @@
<td th:text="${transaction.fromAccount.key}" />
<td th:text="${transaction.toAccount.key}" />
<td th:text="${#temporals.format(transaction.date)}" />
<td th:text="${#numbers.formatDecimal(transaction.amount/100D, 1, 'DEFAULT', 2, 'DEFAULT')}"/>
<td th:text="${#numbers.formatDecimal(transaction.amount/100D, 1, 'DEFAULT', 2, 'DEFAULT') + currencySymbol}"/>
<td th:text="${transaction.description}" />
<td th:text="${transaction.recurringTransaction != null}" />
<td>

View File

@@ -12,11 +12,11 @@
<span th:text="#{financer.account-overview.status}"/>
<div th:title="#{financer.account-overview.tooltip.status.current-assets}">
<span th:text="#{financer.account-overview.status.current-assets}"/>
<span th:text="${#numbers.formatDecimal(currentAssets/100D, 1, 'DEFAULT', 2, 'DEFAULT')}"/>
<span th:text="${#numbers.formatDecimal(currentAssets/100D, 1, 'DEFAULT', 2, 'DEFAULT') + currencySymbol}"/>
</div>
<div th:title="#{'financer.account-overview.tooltip.status.current-expenses'(${#temporals.format(periodStart)}, ${#temporals.format(periodEnd)})}">
<span th:text="#{financer.account-overview.status.current-expenses}"/>
<span th:text="${#numbers.formatDecimal(currentExpenses/100D, 1, 'DEFAULT', 2, 'DEFAULT')}"/>
<span th:text="${#numbers.formatDecimal(currentExpenses/100D, 1, 'DEFAULT', 2, 'DEFAULT') + currencySymbol}"/>
</div>
<div>
<span th:text="#{financer.account-overview.status.recurring-transaction-due-today}"/>
@@ -61,7 +61,7 @@
<td>
<a th:href="@{/accountDetails(key=${acc.key})}" th:text="${acc.key}"/>
</td>
<td th:text="${#numbers.formatDecimal(acc.currentBalance/100D, 1, 'DEFAULT', 2, 'DEFAULT')}"/>
<td th:text="${#numbers.formatDecimal(acc.currentBalance/100D, 1, 'DEFAULT', 2, 'DEFAULT') + currencySymbol}"/>
<td class="hideable-column" th:text="${acc.accountGroup?.name}"/>
<td class="hideable-column" th:text="#{'financer.account-type.' + ${acc.type}}"/>
<td class="hideable-column" th:text="#{'financer.account-status.' + ${acc.status}}"/>

View File

@@ -15,12 +15,12 @@
<label for="selectFromAccount" th:text="#{financer.recurring-transaction-new.label.from-account}"/>
<select id="selectFromAccount" th:field="*{fromAccountKey}">
<option th:each="acc : ${accounts}" th:value="${acc.key}"
th:text="#{'financer.recurring-transaction-new.account-type.' + ${acc.type}(${acc.key},${#numbers.formatDecimal(acc.currentBalance/100D, 1, 'DEFAULT', 2, 'DEFAULT')})}"/>
th:text="#{'financer.recurring-transaction-new.account-type.' + ${acc.type}(${acc.key},${#numbers.formatDecimal(acc.currentBalance/100D, 1, 'DEFAULT', 2, 'DEFAULT')},${currencySymbol})}"/>
</select>
<label for="selectToAccount" th:text="#{financer.recurring-transaction-new.label.to-account}"/>
<select id="selectToAccount" th:field="*{toAccountKey}">
<option th:each="acc : ${accounts}" th:value="${acc.key}"
th:text="#{'financer.recurring-transaction-new.account-type.' + ${acc.type}(${acc.key},${#numbers.formatDecimal(acc.currentBalance/100D, 1, 'DEFAULT', 2, 'DEFAULT')})}"/>
th:text="#{'financer.recurring-transaction-new.account-type.' + ${acc.type}(${acc.key},${#numbers.formatDecimal(acc.currentBalance/100D, 1, 'DEFAULT', 2, 'DEFAULT')},${currencySymbol})}"/>
</select>
<label for="inputAmount" th:text="#{financer.recurring-transaction-new.label.amount}"/>
<input type="text" id="inputAmount" th:field="*{amount}"/>

View File

@@ -32,7 +32,7 @@
</td>
<td th:text="${#temporals.format(rt.firstOccurrence)}"/>
<td th:text="${#temporals.format(rt.lastOccurrence)}"/>
<td th:text="${#numbers.formatDecimal(rt.amount/100D, 1, 'DEFAULT', 2, 'DEFAULT')}"/>
<td th:text="${#numbers.formatDecimal(rt.amount/100D, 1, 'DEFAULT', 2, 'DEFAULT') + currencySymbol}"/>
<td th:text="${rt.description}"/>
<td th:text="#{'financer.interval-type.' + ${rt.intervalType}}"/>
<td th:text="#{'financer.holiday-weekend-type.' + ${rt.holidayWeekendType}}"/>

View File

@@ -15,12 +15,12 @@
<label for="selectFromAccount" th:text="#{financer.transaction-new.label.from-account}"/>
<select id="selectFromAccount" th:field="*{fromAccountKey}">
<option th:each="acc : ${accounts}" th:value="${acc.key}"
th:text="#{'financer.transaction-new.account-type.' + ${acc.type}(${acc.key},${#numbers.formatDecimal(acc.currentBalance/100D, 1, 'DEFAULT', 2, 'DEFAULT')})}"/>
th:text="#{'financer.transaction-new.account-type.' + ${acc.type}(${acc.key},${#numbers.formatDecimal(acc.currentBalance/100D, 1, 'DEFAULT', 2, 'DEFAULT')},${currencySymbol})}"/>
</select>
<label for="selectToAccount" th:text="#{financer.transaction-new.label.to-account}"/>
<select id="selectToAccount" th:field="*{toAccountKey}">
<option th:each="acc : ${accounts}" th:value="${acc.key}"
th:text="#{'financer.transaction-new.account-type.' + ${acc.type}(${acc.key},${#numbers.formatDecimal(acc.currentBalance/100D, 1, 'DEFAULT', 2, 'DEFAULT')})}"/>
th:text="#{'financer.transaction-new.account-type.' + ${acc.type}(${acc.key},${#numbers.formatDecimal(acc.currentBalance/100D, 1, 'DEFAULT', 2, 'DEFAULT')},${currencySymbol})}"/>
</select>
<label for="inputAmount" th:text="#{financer.transaction-new.label.amount}"/>
<input type="text" id="inputAmount" th:field="*{amount}"/>