Update boxes.

This commit is contained in:
James Cole
2022-06-06 17:39:50 +02:00
parent c916fbbee9
commit f13dd18b6f
33 changed files with 479 additions and 87 deletions

View File

@@ -0,0 +1,64 @@
<?php
/*
* NetWorthController.php
* Copyright (c) 2022 james@firefly-iii.org
*
* This file is part of Firefly III (https://github.com/firefly-iii).
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as
* published by the Free Software Foundation, either version 3 of the
* License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
namespace FireflyIII\Api\V2\Controllers;
use FireflyIII\Api\V2\Request\Generic\SingleDateRequest;
use FireflyIII\Helpers\Report\NetWorthInterface;
use FireflyIII\Repositories\Account\AccountRepositoryInterface;
use FireflyIII\Support\Http\Api\ConvertsExchangeRates;
use Illuminate\Http\JsonResponse;
/**
* Class NetWorthController
*/
class NetWorthController extends Controller
{
use ConvertsExchangeRates;
private NetWorthInterface $netWorth;
private AccountRepositoryInterface $repository;
/**
*
*/
public function __construct()
{
$this->middleware(
function ($request, $next) {
$this->repository = app(AccountRepositoryInterface::class);
$this->netWorth = app(NetWorthInterface::class);
$this->netWorth->setUser(auth()->user());
return $next($request);
}
);
}
public function get(SingleDateRequest $request): JsonResponse
{
$date = $request->getDate();
$result = $this->netWorth->sumNetWorthByCurrency($date);
$converted = $this->cerSum($result);
return response()->json($converted);
}
}

View File

@@ -24,7 +24,9 @@ declare(strict_types=1);
namespace FireflyIII\Helpers\Report;
use Carbon\Carbon;
use FireflyIII\Exceptions\FireflyException;
use FireflyIII\Models\Account;
use FireflyIII\Models\AccountType;
use FireflyIII\Repositories\Account\AccountRepositoryInterface;
use FireflyIII\Repositories\Currency\CurrencyRepositoryInterface;
use FireflyIII\Support\CacheProperties;
@@ -38,9 +40,7 @@ use JsonException;
*/
class NetWorth implements NetWorthInterface
{
/** @var AccountRepositoryInterface */
private $accountRepository;
private AccountRepositoryInterface $accountRepository;
/** @var CurrencyRepositoryInterface */
private $currencyRepos;
@@ -63,11 +63,10 @@ class NetWorth implements NetWorthInterface
*
* @return array
* @throws JsonException
* @throws \FireflyIII\Exceptions\FireflyException
* @throws FireflyException
*/
public function getNetWorthByCurrency(Collection $accounts, Carbon $date): array
{
// start in the past, end in the future? use $date
$cache = new CacheProperties;
$cache->addProperty($date);
@@ -144,4 +143,55 @@ class NetWorth implements NetWorthInterface
$this->currencyRepos = app(CurrencyRepositoryInterface::class);
$this->currencyRepos->setUser($this->user);
}
/**
* @inheritDoc
*/
public function sumNetWorthByCurrency(Carbon $date): array
{
/**
* Collect accounts
*/
$accounts = $this->getAccounts();
$return = [];
$balances = app('steam')->balancesByAccounts($accounts, $date);
foreach ($accounts as $account) {
$currency = $this->accountRepository->getAccountCurrency($account);
$balance = $balances[$account->id] ?? '0';
// always subtract virtual balance.
$virtualBalance = (string) $account->virtual_balance;
if ('' !== $virtualBalance) {
$balance = bcsub($balance, $virtualBalance);
}
$return[$currency->id] = $return[$currency->id] ?? [
'id' => (string) $currency->id,
'name' => $currency->name,
'symbol' => $currency->symbol,
'code' => $currency->code,
'decimal_places' => $currency->decimal_places,
'sum' => '0',
];
$return[$currency->id]['sum'] = bcadd($return[$currency->id]['sum'], $balance);
}
return $return;
}
/**
* @return Collection
*/
private function getAccounts(): Collection
{
$accounts = $this->accountRepository->getAccountsByType([AccountType::ASSET, AccountType::LOAN, AccountType::DEBT, AccountType::MORTGAGE, AccountType::DEFAULT, AccountType::CREDITCARD]);
$filtered = new Collection;
/** @var Account $account */
foreach ($accounts as $account) {
if (1 === (int) $this->accountRepository->getMetaValue($account, 'include_net_worth')) {
$filtered->push($account);
}
}
return $filtered;
}
}

View File

@@ -46,8 +46,8 @@ interface NetWorthInterface
*
* @param Collection $accounts
* @param Carbon $date
*
* @return array
* @deprecated
*/
public function getNetWorthByCurrency(Collection $accounts, Carbon $date): array;
@@ -56,4 +56,15 @@ interface NetWorthInterface
*/
public function setUser(User $user): void;
/**
* TODO move to repository
*
* Same as above but cleaner function with less dependencies.
*
* @param Carbon $date
*
* @return array
*/
public function sumNetWorthByCurrency(Carbon $date): array;
}

29
frontend/src/api/v2/net-worth/index.js vendored Normal file
View File

@@ -0,0 +1,29 @@
/*
* basic.js
* Copyright (c) 2021 james@firefly-iii.org
*
* This file is part of Firefly III (https://github.com/firefly-iii).
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as
* published by the Free Software Foundation, either version 3 of the
* License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
import {api} from "boot/axios";
import {format} from "date-fns";
export default class NetWorth {
get(date) {
let dateStr = format(date, 'y-MM-dd');
return api.get('/api/v2/net-worth', {params: {date: dateStr}});
}
}

View File

@@ -36,25 +36,28 @@
:value="percentage"
size="50px"
:thickness="0.22"
color="green"
track-color="grey-3"
color="positive"
track-color="negative"
/>
</q-card-section>
<q-separator vertical/>
<q-card-section v-if="0 === unpaid.length && 0 === paid.length">
You have no bills
{{ $t('firefly.no_bill') }}
</q-card-section>
<q-card-section v-if="unpaid.length > 0 || paid.length > 0">
<span :title="formatAmount(this.currency, this.unpaidAmount)">{{ $t('firefly.bills_to_pay') }}</span>:
<span v-for="(bill, index) in unpaid">
<span v-if="bill.native">(</span>{{ formatAmount(bill.code, bill.sum) }}<span
v-if="bill.native">)</span><span v-if="index+1 !== unpaid.length">, </span></span>
<!-- loop bills to pay -->
<span v-for="(item, index) in unpaid">
<span :title="formatAmount(item.native_code, item.native_sum)">
{{ formatAmount(item.code, item.sum) }}<span v-if="index+1 !== unpaid.length"> + </span></span>
</span>
<br/>
<span :title="formatAmount(this.currency, this.paidAmount)">{{ $t('firefly.bills_paid') }}</span>:
<span v-for="(bill, index) in paid"><span v-if="bill.native">(</span>{{
formatAmount(bill.code, bill.sum)
}}<span v-if="bill.native">)</span><span
v-if="index+1 !== paid.length">, </span></span>
<span v-if="paid.length > 0" :title="formatAmount(this.currency, this.paidAmount)">{{ $t('firefly.bills_paid') }}:</span>
<span v-for="(item, index) in paid">
<span :title="formatAmount(item.native_code, item.native_sum)">
{{formatAmount(item.code, item.sum) }}
</span>
<span v-if="index+1 !== paid.length"> + </span></span>
</q-card-section>
</q-card-section>
</q-card>
@@ -74,10 +77,6 @@ export default {
currency: 'EUR',
unpaidAmount: 0.0,
paidAmount: 0.0,
range: {
start: null,
end: null,
},
}
},
name: "BillInsightBox",
@@ -99,19 +98,16 @@ export default {
mounted() {
this.store = useFireflyIIIStore();
// TODO this code snippet is recycled a lot.
if (null === this.range.start || null === this.range.end) {
// subscribe, then update:
this.store.$onAction(
({name, $store, args, after, onError,}) => {
after((result) => {
if (name === 'setRange') {
this.range = result;
this.triggerUpdate();
}
})
}
)
}
// subscribe, then update:
this.store.$onAction(
({name, $store, args, after, onError,}) => {
after((result) => {
if (name === 'setRange') {
this.triggerUpdate();
}
})
}
)
this.triggerUpdate();
},
methods: {
@@ -139,6 +135,8 @@ export default {
{
sum: current.sum,
code: current.code,
native_sum: current.native_sum,
native_code: current.native_code,
native: hasNative,
}
);
@@ -157,6 +155,8 @@ export default {
{
sum: current.sum,
code: current.code,
native_sum: current.native_sum,
native_code: current.native_code,
native: hasNative,
}
);

View File

@@ -0,0 +1,125 @@
<!--
- NetWorthInsightBox.vue
- Copyright (c) 2022 james@firefly-iii.org
-
- This file is part of Firefly III (https://github.com/firefly-iii).
-
- This program is free software: you can redistribute it and/or modify
- it under the terms of the GNU Affero General Public License as
- published by the Free Software Foundation, either version 3 of the
- License, or (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU Affero General Public License for more details.
-
- You should have received a copy of the GNU Affero General Public License
- along with this program. If not, see <https://www.gnu.org/licenses/>.
-->
<template>
<!-- TODO most left? q-mr-sm -->
<!-- TODO middle? dan q-mx-sm -->
<!-- TODO right? dan q-ml-sm -->
<div class="q-ml-sm">
<q-card bordered>
<q-item>
<q-item-section>
<q-item-label><strong>{{ $t('firefly.net_worth') }}</strong></q-item-label>
</q-item-section>
</q-item>
<q-separator/>
<q-card-section horizontal>
<q-card-section>
<q-icon name="fas fa-chart-line" size="50px" :color="primary > 0 ? 'positive' : 'negative'"/>
</q-card-section>
<q-separator vertical/>
<q-card-section>
<strong>{{ formatAmount(currency, primary) }}</strong><br/>
<small>
<span v-for="(item, index) in netWorth">
<span :title="formatAmount(item.native_code, item.native_sum)">{{ formatAmount(item.code, item.sum) }}</span>
<span v-if="index+1 !== netWorth.length"> + </span></span>
</small>
</q-card-section>
</q-card-section>
</q-card>
</div>
</template>
<script>
import {useFireflyIIIStore} from "../../stores/fireflyiii";
import NetWorth from "../../api/v2/net-worth";
export default {
name: "NetWorthInsightBox",
data() {
return {
netWorth: [],
primary: 0,
currency: 'EUR',
store: null,
}
},
mounted() {
this.store = useFireflyIIIStore();
// TODO this code snippet is recycled a lot.
// subscribe, then update:
this.store.$onAction(
({name, $store, args, after, onError,}) => {
after((result) => {
if (name === 'setRange') {
this.triggerUpdate();
}
})
}
)
this.triggerUpdate();
},
methods: {
triggerUpdate: function () {
if (null !== this.store.getRange.start && null !== this.store.getRange.end) {
this.unpaid = [];
const start = new Date(this.store.getRange.start);
const end = new Date(this.store.getRange.end);
const now = new Date;
let date = end;
if (now >= start && now <= end) {
date = now;
}
this.currency = this.store.getCurrencyCode;
(new NetWorth).get(date).then((response) => this.parseResponse(response.data));
}
},
parseResponse(data) {
for (let i in data) {
if (data.hasOwnProperty(i)) {
const current = data[i];
const hasNative = current.native_id !== current.id && current.native_sum !== '0';
if (hasNative || current.native_id === current.id) {
this.primary = this.primary + parseFloat(current.native_sum);
}
this.netWorth.push(
{
sum: current.sum,
code: current.code,
native_sum: current.native_sum,
native_code: current.native_code,
native: hasNative,
}
);
}
}
},
// TODO this method is recycled a lot.
formatAmount: function (currencyCode, amount) {
return Intl.NumberFormat(this.store?.getLocale ?? 'en-US', {style: 'currency', currency: currencyCode}).format(amount);
},
},
}
</script>
<style scoped>
</style>

View File

@@ -26,7 +26,7 @@
<q-card bordered>
<q-item>
<q-item-section>
<q-item-label><strong>To spend and left</strong></q-item-label>
<q-item-label><strong>{{ $t('firefly.left_to_spend') }}</strong></q-item-label>
</q-item-section>
</q-item>
<q-separator/>
@@ -36,22 +36,27 @@
:value="percentage"
size="50px"
:thickness="0.22"
color="green"
track-color="grey-3"
color="negative"
track-color="positive"
/>
</q-card-section>
<q-separator vertical/>
<q-card-section v-if="0 === budgeted.length && 0 === spent.length">
You have no budgets set
{{ $t('firefly.no_budget') }}
</q-card-section>
<q-card-section v-if="budgeted.length > 0 || spent.length > 0">
<span :title="formatAmount(this.currency, this.budgetedAmount)">Budgeted</span>:
<span v-for="(budget, index) in budgeted"><span v-if="budget.native">(</span>{{ formatAmount(budget.code, budget.sum) }}<span v-if="budget.native">)</span><span
v-if="index+1 !== budgeted.length">, </span></span>
<br>
<span :title="formatAmount(this.currency, this.spentAmount)">Spent</span>:
<span v-for="(budget, index) in spent"><span v-if="budget.native">(</span>{{ formatAmount(budget.code, budget.sum) }}<span v-if="budget.native">)</span><span
v-if="index+1 !== budgeted.length">, </span></span>
<span :title="formatAmount(this.currency, this.budgetedAmount)">{{ $t('firefly.budgeted') }}</span>:
<!-- list budgeted -->
<span v-for="(item, index) in budgeted">
<span :title="formatAmount(item.native_code, item.native_sum)">{{ formatAmount(item.code, item.sum) }}</span>
<span v-if="index+1 !== budgeted.length"> + </span>
</span>
<br />
<span v-if="spent.length > 0" :title="formatAmount(this.currency, this.spentAmount)">{{ $t('firefly.spent') }}: </span>
<!-- list spent -->
<span v-for="(item, index) in spent">
<span :title="formatAmount(item.native_code, item.native_sum)">{{ formatAmount(item.code, item.sum) }}</span>
<span v-if="index+1 !== spent.length"> + </span></span>
</q-card-section>
</q-card-section>
</q-card>
@@ -72,10 +77,6 @@ export default {
//percentage: 0,
budgetedAmount: 0.0,
spentAmount: 0.0,
range: {
start: null,
end: null,
},
}
},
name: "SpendInsightBox",
@@ -98,19 +99,16 @@ export default {
this.store = useFireflyIIIStore();
// TODO this code snippet is recycled a lot.
if (null === this.range.start || null === this.range.end) {
// subscribe, then update:
this.store.$onAction(
({name, $store, args, after, onError,}) => {
after((result) => {
if (name === 'setRange') {
this.range = result;
this.triggerUpdate();
}
})
}
)
}
// subscribe, then update:
this.store.$onAction(
({name, $store, args, after, onError,}) => {
after((result) => {
if (name === 'setRange') {
this.triggerUpdate();
}
})
}
)
this.triggerUpdate();
},
methods: {
@@ -138,6 +136,8 @@ export default {
{
sum: current.sum,
code: current.code,
native_sum: current.native_sum,
native_code: current.native_code,
native: hasNative
}
);
@@ -156,6 +156,8 @@ export default {
{
sum: current.sum,
code: current.code,
native_sum: current.native_sum,
native_code: current.native_code,
native: hasNative
}
);

View File

@@ -52,6 +52,11 @@ export default {
"newDeposit": "\u041d\u043e\u0432 \u0434\u0435\u043f\u043e\u0437\u0438\u0442",
"newWithdrawal": "\u041d\u043e\u0432 \u0440\u0430\u0437\u0445\u043e\u0434",
"bills_paid": "\u041f\u043b\u0430\u0442\u0435\u043d\u0438 \u0441\u043c\u0435\u0442\u043a\u0438",
"left_to_spend": "\u041e\u0441\u0442\u0430\u043d\u0430\u043b\u0438 \u0437\u0430 \u0445\u0430\u0440\u0447\u0435\u043d\u0435",
"no_budget": "(\u0431\u0435\u0437 \u0431\u044e\u0434\u0436\u0435\u0442)",
"budgeted": "\u0411\u044e\u0434\u0436\u0435\u0442\u0438\u0440\u0430\u043d\u0438",
"spent": "\u041f\u043e\u0445\u0430\u0440\u0447\u0435\u043d\u0438",
"no_bill": "(\u043d\u044f\u043c\u0430 \u0441\u043c\u0435\u0442\u043a\u0430)",
"rule_trigger_source_account_starts_choice": "\u0418\u043c\u0435\u0442\u043e \u043d\u0430 \u0440\u0430\u0437\u0445\u043e\u0434\u043d\u0430\u0442\u0430 \u0441\u043c\u0435\u0442\u043a\u0430 \u0437\u0430\u043f\u043e\u0447\u0432\u0430 \u0441..",
"rule_trigger_source_account_ends_choice": "\u0418\u043c\u0435\u0442\u043e \u043d\u0430 \u0440\u0430\u0437\u0445\u043e\u0434\u043d\u0430\u0442\u0430 \u0441\u043c\u0435\u0442\u043a\u0430 \u0437\u0430\u0432\u044a\u0440\u0448\u0432\u0430 \u0441..",
"rule_trigger_source_account_is_choice": "\u0418\u043c\u0435\u0442\u043e \u043d\u0430 \u0440\u0430\u0437\u0445\u043e\u0434\u043d\u0430\u0442\u0430 \u0441\u043c\u0435\u0442\u043a\u0430 \u0435..",
@@ -187,7 +192,6 @@ export default {
"subscriptions": "\u0410\u0431\u043e\u043d\u0430\u043c\u0435\u043d\u0442\u0438",
"welcome_back": "\u041a\u0430\u043a\u0432\u043e \u0441\u0435 \u0441\u043b\u0443\u0447\u0432\u0430?",
"bills_to_pay": "\u0421\u043c\u0435\u0442\u043a\u0438 \u0437\u0430 \u043f\u043b\u0430\u0449\u0430\u043d\u0435",
"left_to_spend": "\u041e\u0441\u0442\u0430\u043d\u0430\u043b\u0438 \u0437\u0430 \u0445\u0430\u0440\u0447\u0435\u043d\u0435",
"net_worth": "\u041d\u0435\u0442\u043d\u0430 \u0441\u0442\u043e\u0439\u043d\u043e\u0441\u0442",
"pref_last365": "Last year",
"pref_last90": "Last 90 days",

View File

@@ -52,6 +52,11 @@ export default {
"newDeposit": "Nov\u00fd vklad",
"newWithdrawal": "Nov\u00fd v\u00fddaj",
"bills_paid": "Zaplacen\u00e9 \u00fa\u010dty",
"left_to_spend": "Zb\u00fdv\u00e1 k utracen\u00ed",
"no_budget": "(\u017e\u00e1dn\u00fd rozpo\u010det)",
"budgeted": "Rozpo\u010det",
"spent": "Utraceno",
"no_bill": "(no bill)",
"rule_trigger_source_account_starts_choice": "Source account name starts with..",
"rule_trigger_source_account_ends_choice": "Source account name ends with..",
"rule_trigger_source_account_is_choice": "Source account name is..",
@@ -187,7 +192,6 @@ export default {
"subscriptions": "Subscriptions",
"welcome_back": "Jak to jde?",
"bills_to_pay": "Faktury k zaplacen\u00ed",
"left_to_spend": "Zb\u00fdv\u00e1 k utracen\u00ed",
"net_worth": "\u010cist\u00e9 jm\u011bn\u00ed",
"pref_last365": "Last year",
"pref_last90": "Last 90 days",

View File

@@ -52,6 +52,11 @@ export default {
"newDeposit": "Neue Einnahme",
"newWithdrawal": "Neue Ausgabe",
"bills_paid": "Rechnungen bezahlt",
"left_to_spend": "Verbleibend zum Ausgeben",
"no_budget": "(kein Budget)",
"budgeted": "Vorgesehen",
"spent": "Ausgegeben",
"no_bill": "(keine Belege)",
"rule_trigger_source_account_starts_choice": "Name des Quellkontos beginnt mit..",
"rule_trigger_source_account_ends_choice": "Quellkonto-Name endet mit..",
"rule_trigger_source_account_is_choice": "Quellkonto-Name lautet..",
@@ -187,7 +192,6 @@ export default {
"subscriptions": "Abonnements",
"welcome_back": "\u00dcberblick",
"bills_to_pay": "Unbezahlte Rechnungen",
"left_to_spend": "Verbleibend zum Ausgeben",
"net_worth": "Eigenkapital",
"pref_last365": "Letztes Jahr",
"pref_last90": "Letzte 90 Tage",

View File

@@ -52,6 +52,11 @@ export default {
"newDeposit": "\u039d\u03ad\u03b1 \u03ba\u03b1\u03c4\u03ac\u03b8\u03b5\u03c3\u03b7",
"newWithdrawal": "\u039d\u03ad\u03b1 \u03b4\u03b1\u03c0\u03ac\u03bd\u03b7",
"bills_paid": "\u03a0\u03bb\u03b7\u03c1\u03c9\u03bc\u03ad\u03bd\u03b1 \u03c0\u03ac\u03b3\u03b9\u03b1 \u03ad\u03be\u03bf\u03b4\u03b1",
"left_to_spend": "\u0394\u03b9\u03b1\u03b8\u03ad\u03c3\u03b9\u03bc\u03b1 \u03c0\u03c1\u03bf\u03cb\u03c0\u03bf\u03bb\u03bf\u03b3\u03b9\u03c3\u03bc\u03ce\u03bd",
"no_budget": "(\u03c7\u03c9\u03c1\u03af\u03c2 \u03c0\u03c1\u03bf\u03cb\u03c0\u03bf\u03bb\u03bf\u03b3\u03b9\u03c3\u03bc\u03cc)",
"budgeted": "\u03a0\u03c1\u03bf\u03cb\u03c0\u03bf\u03bb\u03bf\u03b3\u03b9\u03c3\u03bc\u03ad\u03bd\u03bf",
"spent": "\u0394\u03b1\u03c0\u03b1\u03bd\u03ae\u03b8\u03b7\u03ba\u03b1\u03bd",
"no_bill": "(\u03c7\u03c9\u03c1\u03af\u03c2 \u03c0\u03ac\u03b3\u03b9\u03bf \u03ad\u03be\u03bf\u03b4\u03bf)",
"rule_trigger_source_account_starts_choice": "\u03a4\u03bf \u03cc\u03bd\u03bf\u03bc\u03b1 \u03c4\u03bf\u03c5 \u03bb\u03bf\u03b3\u03b1\u03c1\u03b9\u03b1\u03c3\u03bc\u03bf\u03cd \u03c0\u03c1\u03bf\u03ad\u03bb\u03b5\u03c5\u03c3\u03b7\u03c2 \u03b1\u03c1\u03c7\u03af\u03b6\u03b5\u03b9 \u03bc\u03b5..",
"rule_trigger_source_account_ends_choice": "\u03a4\u03bf \u03cc\u03bd\u03bf\u03bc\u03b1 \u03c4\u03bf\u03c5 \u03bb\u03bf\u03b3\u03b1\u03c1\u03b9\u03b1\u03c3\u03bc\u03bf\u03cd \u03c0\u03c1\u03bf\u03ad\u03bb\u03b5\u03c5\u03c3\u03b7\u03c2 \u03c4\u03b5\u03bb\u03b5\u03b9\u03ce\u03bd\u03b5\u03b9 \u03bc\u03b5..",
"rule_trigger_source_account_is_choice": "\u03a4\u03bf \u03cc\u03bd\u03bf\u03bc\u03b1 \u03c4\u03bf\u03c5 \u03bb\u03bf\u03b3\u03b1\u03c1\u03b9\u03b1\u03c3\u03bc\u03bf\u03cd \u03c0\u03c1\u03bf\u03ad\u03bb\u03b5\u03c5\u03c3\u03b7\u03c2 \u03b5\u03af\u03bd\u03b1\u03b9..",
@@ -187,7 +192,6 @@ export default {
"subscriptions": "\u03a3\u03c5\u03bd\u03b4\u03c1\u03bf\u03bc\u03ad\u03c2",
"welcome_back": "\u03a4\u03b9 \u03c0\u03b1\u03af\u03b6\u03b5\u03b9;",
"bills_to_pay": "\u03a0\u03ac\u03b3\u03b9\u03b1 \u03ad\u03be\u03bf\u03b4\u03b1 \u03c0\u03c1\u03bf\u03c2 \u03c0\u03bb\u03b7\u03c1\u03c9\u03bc\u03ae",
"left_to_spend": "\u0394\u03b9\u03b1\u03b8\u03ad\u03c3\u03b9\u03bc\u03b1 \u03c0\u03c1\u03bf\u03cb\u03c0\u03bf\u03bb\u03bf\u03b3\u03b9\u03c3\u03bc\u03ce\u03bd",
"net_worth": "\u039a\u03b1\u03b8\u03b1\u03c1\u03ae \u03b1\u03be\u03af\u03b1",
"pref_last365": "\u03a0\u03c1\u03bf\u03b7\u03b3\u03bf\u03cd\u03bc\u03b5\u03bd\u03bf \u03ad\u03c4\u03bf\u03c2",
"pref_last90": "\u03a4\u03b5\u03bb\u03b5\u03c5\u03c4\u03b1\u03af\u03b5\u03c2 90 \u03b7\u03bc\u03ad\u03c1\u03b5\u03c2",

View File

@@ -52,6 +52,11 @@ export default {
"newDeposit": "New deposit",
"newWithdrawal": "New expense",
"bills_paid": "Bills paid",
"left_to_spend": "Left to spend",
"no_budget": "(no budget)",
"budgeted": "Budgeted",
"spent": "Spent",
"no_bill": "(no bill)",
"rule_trigger_source_account_starts_choice": "Source account name starts with..",
"rule_trigger_source_account_ends_choice": "Source account name ends with..",
"rule_trigger_source_account_is_choice": "Source account name is..",
@@ -187,7 +192,6 @@ export default {
"subscriptions": "Subscriptions",
"welcome_back": "What's playing?",
"bills_to_pay": "Bills to pay",
"left_to_spend": "Left to spend",
"net_worth": "Net worth",
"pref_last365": "Last year",
"pref_last90": "Last 90 days",

View File

@@ -52,6 +52,11 @@ export default {
"newDeposit": "New deposit",
"newWithdrawal": "New expense",
"bills_paid": "Bills paid",
"left_to_spend": "Left to spend",
"no_budget": "(no budget)",
"budgeted": "Budgeted",
"spent": "Spent",
"no_bill": "(no bill)",
"rule_trigger_source_account_starts_choice": "Source account name starts with..",
"rule_trigger_source_account_ends_choice": "Source account name ends with..",
"rule_trigger_source_account_is_choice": "Source account name is..",
@@ -187,7 +192,6 @@ export default {
"subscriptions": "Subscriptions",
"welcome_back": "What's playing?",
"bills_to_pay": "Bills to pay",
"left_to_spend": "Left to spend",
"net_worth": "Net worth",
"pref_last365": "Last year",
"pref_last90": "Last 90 days",

View File

@@ -52,6 +52,11 @@ export default {
"newDeposit": "Nuevo deposito",
"newWithdrawal": "Nuevo gasto",
"bills_paid": "Facturas pagadas",
"left_to_spend": "Disponible para gastar",
"no_budget": "(sin presupuesto)",
"budgeted": "Presupuestado",
"spent": "Gastado",
"no_bill": "(sin factura)",
"rule_trigger_source_account_starts_choice": "El nombre de la cuenta de origen comienza con..",
"rule_trigger_source_account_ends_choice": "El nombre de la cuenta de origen termina con..",
"rule_trigger_source_account_is_choice": "El nombre de la cuenta origen es..",
@@ -187,7 +192,6 @@ export default {
"subscriptions": "Suscripciones",
"welcome_back": "\u00bfQu\u00e9 est\u00e1 pasando?",
"bills_to_pay": "Facturas por pagar",
"left_to_spend": "Disponible para gastar",
"net_worth": "Valor Neto",
"pref_last365": "A\u00f1o pasado",
"pref_last90": "\u00daltimos 90 d\u00edas",

View File

@@ -52,6 +52,11 @@ export default {
"newDeposit": "Uusi talletus",
"newWithdrawal": "Uusi kustannus",
"bills_paid": "Maksetut laskut",
"left_to_spend": "K\u00e4ytett\u00e4viss\u00e4",
"no_budget": "(ei budjettia)",
"budgeted": "Budjetoitu",
"spent": "K\u00e4ytetty",
"no_bill": "(ei laskua)",
"rule_trigger_source_account_starts_choice": "L\u00e4hdetilin nimi alkaa ...",
"rule_trigger_source_account_ends_choice": "L\u00e4hdetilin nimi p\u00e4\u00e4ttyy..",
"rule_trigger_source_account_is_choice": "L\u00e4hdetilin nimi on..",
@@ -187,7 +192,6 @@ export default {
"subscriptions": "Tilaukset",
"welcome_back": "Mit\u00e4 kuuluu?",
"bills_to_pay": "Laskuja maksettavana",
"left_to_spend": "K\u00e4ytett\u00e4viss\u00e4",
"net_worth": "Varallisuus",
"pref_last365": "Edellinen vuosi",
"pref_last90": "Viimeiset 90 p\u00e4iv\u00e4\u00e4",

View File

@@ -52,6 +52,11 @@ export default {
"newDeposit": "Nouveau d\u00e9p\u00f4t",
"newWithdrawal": "Nouvelle d\u00e9pense",
"bills_paid": "Factures pay\u00e9es",
"left_to_spend": "Reste \u00e0 d\u00e9penser",
"no_budget": "(pas de budget)",
"budgeted": "Budg\u00e9tis\u00e9",
"spent": "D\u00e9pens\u00e9",
"no_bill": "(aucune facture)",
"rule_trigger_source_account_starts_choice": "Le nom du compte source commence par..",
"rule_trigger_source_account_ends_choice": "Le nom du compte source se termine par..",
"rule_trigger_source_account_is_choice": "Le nom du compte source est..",
@@ -187,7 +192,6 @@ export default {
"subscriptions": "Abonnements",
"welcome_back": "Quoi de neuf ?",
"bills_to_pay": "Factures \u00e0 payer",
"left_to_spend": "Reste \u00e0 d\u00e9penser",
"net_worth": "Avoir net",
"pref_last365": "L'ann\u00e9e derni\u00e8re",
"pref_last90": "Les 90 derniers jours",

View File

@@ -52,6 +52,11 @@ export default {
"newDeposit": "\u00daj bev\u00e9tel",
"newWithdrawal": "\u00daj k\u00f6lts\u00e9g",
"bills_paid": "Befizetett sz\u00e1ml\u00e1k",
"left_to_spend": "Elk\u00f6lthet\u0151",
"no_budget": "(nincs k\u00f6lts\u00e9gkeret)",
"budgeted": "Betervezett",
"spent": "Elk\u00f6lt\u00f6tt",
"no_bill": "(no bill)",
"rule_trigger_source_account_starts_choice": "Forr\u00e1ssz\u00e1mla nev\u00e9nek eleje..",
"rule_trigger_source_account_ends_choice": "Forr\u00e1ssz\u00e1mla nev\u00e9nek v\u00e9ge..",
"rule_trigger_source_account_is_choice": "A forr\u00e1ssz\u00e1mla neve..",
@@ -187,7 +192,6 @@ export default {
"subscriptions": "Subscriptions",
"welcome_back": "Mi a helyzet?",
"bills_to_pay": "Fizetend\u0151 sz\u00e1ml\u00e1k",
"left_to_spend": "Elk\u00f6lthet\u0151",
"net_worth": "Nett\u00f3 \u00e9rt\u00e9k",
"pref_last365": "Last year",
"pref_last90": "Last 90 days",

View File

@@ -52,6 +52,11 @@ export default {
"newDeposit": "Nuova entrata",
"newWithdrawal": "Nuova uscita",
"bills_paid": "Bollette pagate",
"left_to_spend": "Altro da spendere",
"no_budget": "(nessun budget)",
"budgeted": "Preventivato",
"spent": "Speso",
"no_bill": "(nessuna bolletta)",
"rule_trigger_source_account_starts_choice": "Il nome del conto di origine inizia con..",
"rule_trigger_source_account_ends_choice": "Il nome del conto di origine termina con..",
"rule_trigger_source_account_is_choice": "Il nome del conto di origine \u00e8..",
@@ -187,7 +192,6 @@ export default {
"subscriptions": "Abbonamenti",
"welcome_back": "La tua situazione finanziaria",
"bills_to_pay": "Bollette da pagare",
"left_to_spend": "Altro da spendere",
"net_worth": "Patrimonio",
"pref_last365": "Anno scorso",
"pref_last90": "Ultimi 90 giorni",

View File

@@ -52,6 +52,11 @@ export default {
"newDeposit": "\u65b0\u3057\u3044\u5165\u91d1",
"newWithdrawal": "\u65b0\u3057\u3044\u652f\u51fa",
"bills_paid": "\u652f\u6255\u3044\u6e08\u307f\u8acb\u6c42",
"left_to_spend": "\u652f\u51fa\u3067\u304d\u308b\u6b8b\u308a",
"no_budget": "(\u4e88\u7b97\u306a\u3057)",
"budgeted": "\u8a08\u4e0a\u4e88\u7b97",
"spent": "\u652f\u51fa",
"no_bill": "(\u8acb\u6c42\u306a\u3057)",
"rule_trigger_source_account_starts_choice": "\u51fa\u91d1\u5143\u53e3\u5ea7\u540d\u304c...\u3067\u59cb\u307e\u308b",
"rule_trigger_source_account_ends_choice": "\u51fa\u91d1\u5143\u53e3\u5ea7\u540d\u304c\u2026\u3067\u7d42\u308f\u308b",
"rule_trigger_source_account_is_choice": "\u51fa\u91d1\u5143\u53e3\u5ea7\u540d\u304c...",
@@ -187,7 +192,6 @@ export default {
"subscriptions": "\u8b1b\u8aad",
"welcome_back": "\u6982\u8981",
"bills_to_pay": "\u8acb\u6c42\u66f8",
"left_to_spend": "\u652f\u51fa\u3067\u304d\u308b\u6b8b\u308a",
"net_worth": "\u7d14\u8cc7\u7523",
"pref_last365": "\u6628\u5e74",
"pref_last90": "\u904e\u53bb 90 \u65e5\u9593",

View File

@@ -52,6 +52,11 @@ export default {
"newDeposit": "Nytt innskudd",
"newWithdrawal": "Ny utgift",
"bills_paid": "Regninger betalt",
"left_to_spend": "Igjen \u00e5 bruke",
"no_budget": "(ingen budsjett)",
"budgeted": "Budsjettert",
"spent": "Brukt",
"no_bill": "(no bill)",
"rule_trigger_source_account_starts_choice": "Source account name starts with..",
"rule_trigger_source_account_ends_choice": "Source account name ends with..",
"rule_trigger_source_account_is_choice": "Source account name is..",
@@ -187,7 +192,6 @@ export default {
"subscriptions": "Subscriptions",
"welcome_back": "What's playing?",
"bills_to_pay": "Regninger \u00e5 betale",
"left_to_spend": "Igjen \u00e5 bruke",
"net_worth": "Formue",
"pref_last365": "Last year",
"pref_last90": "Last 90 days",

View File

@@ -52,6 +52,11 @@ export default {
"newDeposit": "Nieuwe inkomsten",
"newWithdrawal": "Nieuwe uitgave",
"bills_paid": "Betaalde contracten",
"left_to_spend": "Over om uit te geven",
"no_budget": "(geen budget)",
"budgeted": "Gebudgetteerd",
"spent": "Uitgegeven",
"no_bill": "(geen contract)",
"rule_trigger_source_account_starts_choice": "Bronrekeningnaam begint met..",
"rule_trigger_source_account_ends_choice": "Bronrekeningnaam eindigt op..",
"rule_trigger_source_account_is_choice": "Bronrekeningnaam is..",
@@ -187,7 +192,6 @@ export default {
"subscriptions": "Abonnementen",
"welcome_back": "Hoe staat het er voor?",
"bills_to_pay": "Openstaande contracten",
"left_to_spend": "Over om uit te geven",
"net_worth": "Kapitaal",
"pref_last365": "Afgelopen jaar",
"pref_last90": "Afgelopen 90 dagen",

View File

@@ -52,6 +52,11 @@ export default {
"newDeposit": "Nowa wp\u0142ata",
"newWithdrawal": "Nowy wydatek",
"bills_paid": "Zap\u0142acone rachunki",
"left_to_spend": "Pozosta\u0142o do wydania",
"no_budget": "(brak bud\u017cetu)",
"budgeted": "Zabud\u017cetowano",
"spent": "Wydano",
"no_bill": "(brak rachunku)",
"rule_trigger_source_account_starts_choice": "Konto \u017ar\u00f3d\u0142owe si\u0119 zaczyna od..",
"rule_trigger_source_account_ends_choice": "Konto \u017ar\u00f3d\u0142owe ko\u0144czy si\u0119 na..",
"rule_trigger_source_account_is_choice": "Kontem \u017ar\u00f3d\u0142owym jest..",
@@ -187,7 +192,6 @@ export default {
"subscriptions": "Subskrypcje",
"welcome_back": "Co jest grane?",
"bills_to_pay": "Rachunki do zap\u0142acenia",
"left_to_spend": "Pozosta\u0142o do wydania",
"net_worth": "Warto\u015b\u0107 netto",
"pref_last365": "Ostatni rok",
"pref_last90": "Ostatnie 90 dni",

View File

@@ -52,6 +52,11 @@ export default {
"newDeposit": "Novo dep\u00f3sito",
"newWithdrawal": "Nova despesa",
"bills_paid": "Contas pagas",
"left_to_spend": "Restante para gastar",
"no_budget": "(sem or\u00e7amento)",
"budgeted": "Or\u00e7ado",
"spent": "Gasto",
"no_bill": "(sem conta)",
"rule_trigger_source_account_starts_choice": "Nome da conta de origem come\u00e7a com..",
"rule_trigger_source_account_ends_choice": "O nome da conta de origem termina com..",
"rule_trigger_source_account_is_choice": "Nome da conta de origem \u00e9..",
@@ -187,7 +192,6 @@ export default {
"subscriptions": "Assinaturas",
"welcome_back": "O que est\u00e1 acontecendo?",
"bills_to_pay": "Contas a pagar",
"left_to_spend": "Restante para gastar",
"net_worth": "Valor L\u00edquido",
"pref_last365": "Ano passado",
"pref_last90": "\u00daltimos 90 dias",

View File

@@ -52,6 +52,11 @@ export default {
"newDeposit": "Novo dep\u00f3sito",
"newWithdrawal": "Nova despesa",
"bills_paid": "Fatura pagas",
"left_to_spend": "Restante para gastar",
"no_budget": "(sem or\u00e7amento)",
"budgeted": "Or\u00e7amentado",
"spent": "Gasto",
"no_bill": "(sem fatura)",
"rule_trigger_source_account_starts_choice": "O nome da conta de origem come\u00e7a com..",
"rule_trigger_source_account_ends_choice": "O nome da conta de origem acaba com..",
"rule_trigger_source_account_is_choice": "O nome da conta de origem \u00e9..",
@@ -187,7 +192,6 @@ export default {
"subscriptions": "Subscri\u00e7\u00f5es",
"welcome_back": "Tudo bem?",
"bills_to_pay": "Faturas a pagar",
"left_to_spend": "Restante para gastar",
"net_worth": "Patrim\u00f3nio liquido",
"pref_last365": "Last year",
"pref_last90": "\u00daltimos 90 dias",

View File

@@ -52,6 +52,11 @@ export default {
"newDeposit": "Depozit nou",
"newWithdrawal": "Cheltuieli noi",
"bills_paid": "Facturile pl\u0103tite",
"left_to_spend": "Ramas de cheltuit",
"no_budget": "(nici un buget)",
"budgeted": "Bugetat",
"spent": "Cheltuit",
"no_bill": "(f\u0103r\u0103 factur\u0103)",
"rule_trigger_source_account_starts_choice": "Numele contului surs\u0103 \u00eencepe cu..",
"rule_trigger_source_account_ends_choice": "Numele contului surs\u0103 se termin\u0103 cu..",
"rule_trigger_source_account_is_choice": "Numele contului surs\u0103 este..",
@@ -187,7 +192,6 @@ export default {
"subscriptions": "Subscriptions",
"welcome_back": "Ce se red\u0103?",
"bills_to_pay": "Facturile de plat\u0103",
"left_to_spend": "Ramas de cheltuit",
"net_worth": "Valoarea net\u0103",
"pref_last365": "Last year",
"pref_last90": "Last 90 days",

View File

@@ -52,6 +52,11 @@ export default {
"newDeposit": "\u041d\u043e\u0432\u044b\u0439 \u0434\u043e\u0445\u043e\u0434",
"newWithdrawal": "\u041d\u043e\u0432\u044b\u0439 \u0440\u0430\u0441\u0445\u043e\u0434",
"bills_paid": "\u041e\u043f\u043b\u0430\u0447\u0435\u043d\u043d\u044b\u0435 \u0441\u0447\u0435\u0442\u0430",
"left_to_spend": "\u041e\u0441\u0442\u0430\u043b\u043e\u0441\u044c \u043f\u043e\u0442\u0440\u0430\u0442\u0438\u0442\u044c",
"no_budget": "(\u0432\u043d\u0435 \u0431\u044e\u0434\u0436\u0435\u0442\u0430)",
"budgeted": "\u0417\u0430\u043f\u043b\u0430\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u043e \u0432 \u0431\u044e\u0434\u0436\u0435\u0442\u0435",
"spent": "\u0420\u0430\u0441\u0445\u043e\u0434",
"no_bill": "(\u043d\u0435\u0442 \u0441\u0447\u0451\u0442\u0430 \u043d\u0430 \u043e\u043f\u043b\u0430\u0442\u0443)",
"rule_trigger_source_account_starts_choice": "\u041d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u0441\u0447\u0451\u0442\u0430-\u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a\u0430 \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u0442\u0441\u044f \u0441..",
"rule_trigger_source_account_ends_choice": "\u041d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u0441\u0447\u0451\u0442\u0430-\u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a\u0430 \u0437\u0430\u043a\u0430\u043d\u0447\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u043d\u0430..",
"rule_trigger_source_account_is_choice": "\u041d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u0441\u0447\u0451\u0442\u0430-\u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a\u0430..",
@@ -187,7 +192,6 @@ export default {
"subscriptions": "Subscriptions",
"welcome_back": "\u0427\u0442\u043e \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u0441 \u043c\u043e\u0438\u043c\u0438 \u0444\u0438\u043d\u0430\u043d\u0441\u0430\u043c\u0438?",
"bills_to_pay": "\u0421\u0447\u0435\u0442\u0430 \u043a \u043e\u043f\u043b\u0430\u0442\u0435",
"left_to_spend": "\u041e\u0441\u0442\u0430\u043b\u043e\u0441\u044c \u043f\u043e\u0442\u0440\u0430\u0442\u0438\u0442\u044c",
"net_worth": "\u041c\u043e\u0438 \u0441\u0431\u0435\u0440\u0435\u0436\u0435\u043d\u0438\u044f",
"pref_last365": "\u041f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0439 \u0433\u043e\u0434",
"pref_last90": "Last 90 days",

View File

@@ -52,6 +52,11 @@ export default {
"newDeposit": "Nov\u00fd vklad",
"newWithdrawal": "Nov\u00fd v\u00fddavok",
"bills_paid": "Zaplaten\u00e9 \u00fa\u010dty",
"left_to_spend": "Zost\u00e1va k \u00fatrate",
"no_budget": "(\u017eiadny rozpo\u010det)",
"budgeted": "Rozpo\u010dtovan\u00e9",
"spent": "Utraten\u00e9",
"no_bill": "(\u017eiadny \u00fa\u010det)",
"rule_trigger_source_account_starts_choice": "N\u00e1zov zdrojov\u00e9ho \u00fa\u010dtu za\u010d\u00edna..",
"rule_trigger_source_account_ends_choice": "N\u00e1zov zdrojov\u00e9ho \u00fa\u010dtu kon\u010d\u00ed..",
"rule_trigger_source_account_is_choice": "N\u00e1zov zdrojov\u00e9ho \u00fa\u010dtu je..",
@@ -187,7 +192,6 @@ export default {
"subscriptions": "Subscriptions",
"welcome_back": "Ako to ide?",
"bills_to_pay": "\u00da\u010dty na \u00fahradu",
"left_to_spend": "Zost\u00e1va k \u00fatrate",
"net_worth": "\u010cist\u00e9 imanie",
"pref_last365": "Last year",
"pref_last90": "Last 90 days",

View File

@@ -52,6 +52,11 @@ export default {
"newDeposit": "Ny ins\u00e4ttning",
"newWithdrawal": "Ny utgift",
"bills_paid": "Notor betalda",
"left_to_spend": "\u00c5terst\u00e5r att spendera",
"no_budget": "(ingen budget)",
"budgeted": "Budgeterat",
"spent": "Spenderat",
"no_bill": "(ingen r\u00e4kning)",
"rule_trigger_source_account_starts_choice": "K\u00e4llkontonamn b\u00f6rjar med..",
"rule_trigger_source_account_ends_choice": "K\u00e4llkontonamn slutar med..",
"rule_trigger_source_account_is_choice": "K\u00e4llkontonamn \u00e4r..",
@@ -187,7 +192,6 @@ export default {
"subscriptions": "Prenumerationer",
"welcome_back": "Vad spelas?",
"bills_to_pay": "Notor att betala",
"left_to_spend": "\u00c5terst\u00e5r att spendera",
"net_worth": "Nettof\u00f6rm\u00f6genhet",
"pref_last365": "F\u00f6reg\u00e5ende \u00e5r",
"pref_last90": "Senaste 90 dagarna",

View File

@@ -52,6 +52,11 @@ export default {
"newDeposit": "Ti\u1ec1n g\u1eedi m\u1edbi",
"newWithdrawal": "Chi ph\u00ed m\u1edbi",
"bills_paid": "H\u00f3a \u0111\u01a1n thanh to\u00e1n",
"left_to_spend": "C\u00f2n l\u1ea1i \u0111\u1ec3 chi ti\u00eau",
"no_budget": "(kh\u00f4ng c\u00f3 ng\u00e2n s\u00e1ch)",
"budgeted": "Ng\u00e2n s\u00e1ch",
"spent": "\u0110\u00e3 chi",
"no_bill": "(no bill)",
"rule_trigger_source_account_starts_choice": "Source account name starts with..",
"rule_trigger_source_account_ends_choice": "Source account name ends with..",
"rule_trigger_source_account_is_choice": "Source account name is..",
@@ -187,7 +192,6 @@ export default {
"subscriptions": "Subscriptions",
"welcome_back": "Ch\u00e0o m\u1eebng tr\u1edf l\u1ea1i?",
"bills_to_pay": "H\u00f3a \u0111\u01a1n ph\u1ea3i tr\u1ea3",
"left_to_spend": "C\u00f2n l\u1ea1i \u0111\u1ec3 chi ti\u00eau",
"net_worth": "T\u00e0i s\u1ea3n th\u1ef1c",
"pref_last365": "N\u0103m tr\u01b0\u1edbc",
"pref_last90": "90 ng\u00e0y cu\u1ed1i",

View File

@@ -52,6 +52,11 @@ export default {
"newDeposit": "\u65b0\u6536\u5165",
"newWithdrawal": "\u65b0\u652f\u51fa",
"bills_paid": "\u5df2\u4ed8\u8d26\u5355",
"left_to_spend": "\u5269\u4f59\u652f\u51fa",
"no_budget": "(\u65e0\u9884\u7b97)",
"budgeted": "\u9884\u7b97\u4e0a\u9650",
"spent": "\u652f\u51fa",
"no_bill": "(\u65e0\u8d26\u5355)",
"rule_trigger_source_account_starts_choice": "\u6765\u6e90\u8d26\u6237\u540d\u79f0\u5f00\u5934\u4e3a...",
"rule_trigger_source_account_ends_choice": "\u6765\u6e90\u8d26\u6237\u7ed3\u5c3e\u4e3a\u2026",
"rule_trigger_source_account_is_choice": "\u6765\u6e90\u8d26\u6237\u540d\u79f0\u4e3a...",
@@ -187,7 +192,6 @@ export default {
"subscriptions": "Subscriptions",
"welcome_back": "\u4eca\u5929\u7406\u8d22\u4e86\u5417\uff1f",
"bills_to_pay": "\u5f85\u4ed8\u8d26\u5355",
"left_to_spend": "\u5269\u4f59\u652f\u51fa",
"net_worth": "\u51c0\u8d44\u4ea7",
"pref_last365": "\u6700\u8fd1\u4e00\u5e74",
"pref_last90": "\u6700\u8fd190\u5929",

View File

@@ -52,6 +52,11 @@ export default {
"newDeposit": "\u65b0\u5b58\u6b3e",
"newWithdrawal": "\u65b0\u652f\u51fa",
"bills_paid": "\u5df2\u7e73\u5e33\u55ae",
"left_to_spend": "\u5269\u9918\u53ef\u82b1\u8cbb",
"no_budget": "(\u7121\u9810\u7b97)",
"budgeted": "\u5df2\u5217\u5165\u9810\u7b97",
"spent": "\u652f\u51fa",
"no_bill": "(no bill)",
"rule_trigger_source_account_starts_choice": "Source account name starts with..",
"rule_trigger_source_account_ends_choice": "Source account name ends with..",
"rule_trigger_source_account_is_choice": "Source account name is..",
@@ -187,7 +192,6 @@ export default {
"subscriptions": "Subscriptions",
"welcome_back": "What's playing?",
"bills_to_pay": "\u5f85\u4ed8\u5e33\u55ae",
"left_to_spend": "\u5269\u9918\u53ef\u82b1\u8cbb",
"net_worth": "\u6de8\u503c",
"pref_last365": "Last year",
"pref_last90": "Last 90 days",

View File

@@ -30,7 +30,7 @@
<SpendInsightBox />
</div>
<div class="col">
TODO net worth insight
<NetWorthInsightBox />
</div>
</div>
<div class="row q-mb-sm">
@@ -89,10 +89,12 @@
<script>
import {defineAsyncComponent} from "vue";
import NetWorthInsightBox from "../../components/dashboard/NetWorthInsightBox";
export default {
name: "Dashboard",
components: {
NetWorthInsightBox,
BillInsightBox: defineAsyncComponent(() => import('../../components/dashboard/BillInsightBox.vue')),
SpendInsightBox: defineAsyncComponent(() => import('../../components/dashboard/SpendInsightBox.vue')),
}

View File

@@ -33,6 +33,17 @@ Route::group(
}
);
/**
* V2 API route for net worth endpoint(s);
*/
Route::group(
['namespace' => 'FireflyIII\Api\V2\Controllers', 'prefix' => 'v2/net-worth',
'as' => 'api.v2.net-worth.',],
static function () {
Route::get('', ['uses' => 'NetWorthController@get', 'as' => 'index']);
}
);
/**
* V2 API route for bills.
*/
@@ -45,6 +56,8 @@ Route::group(
}
);
/**
* V2 API route for budgets.
*/